@fnet/cli 0.132.0 → 0.133.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"yargs";import t from"chalk";import{promisify as o}from"node:util";import n from"tree-kill";import i,{delimiter as s,join as r}from"node:path";import{fileURLToPath as a}from"node:url";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 I from"bpmn-moddle";import O from"dagre";import A from"@fnet/expression";import B from"@fnet/list-files";import R from"@fnet/key-value-transformer";import K from"@flownet/lib-parse-npm-path";import M from"@fnet/prompt";const L=o(n);let J=!1;async function W(e,t){if(J)return;if(J=!0,!e.killed&&e.pid)try{await L(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await L(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 z(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((t=>{process.once(t,(async()=>{await W(e,t)}))})),process.on("uncaughtException",(async t=>{await W(e)})),process.on("unhandledRejection",(async t=>{await W(e)})),e.on("close",(e=>{J||process.exit(e)}))}function G(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 U(e),{projectDir:s}=t,r=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,a=process.argv.slice(3).map(r),l={...process.env},p=i.join(s,"node_modules");l.NODE_PATH=p;const d=l.NODE_OPTIONS||"";l.NODE_OPTIONS=`${d} --preserve-symlinks`.trim();z(c(o,[...n,...a],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:l}))}catch(e){console.error(e.message),process.exit(1)}}))}async function U(e){try{const t=process.argv[1].split("/").pop().split(".")[0];if("fnode"===t){const{createContext:t}=await import("./index.DOYkqsYT.js");return t(e)}if("fnet"===t){const{createContext:t}=await Promise.resolve().then((function(){return Z}));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 V=e=>{const t=process.env.PATH||"",o="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],n=t.split(s);for(const t of n)for(const n of o){const o=r(t,"win32"===process.platform?e+n:e);if(p(o))return o}return null};const q=i.dirname(a(import.meta.url)),X=process.cwd();function H(e){const t=i.resolve(X,e);if(l.existsSync(t))return t;const o=i.resolve(q,"../..",e);if(l.existsSync(o))return o;throw new Error(`Template path not found: ${e}`)}const Y={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 e=>{try{const t=process.cwd(),o=H("./template/fnet/project"),n=i.resolve(t,e.name);l.existsSync(n)||l.mkdirSync(n),await m({dir:o,outDir:n,context:e,copyUnmatchedAlso:!0,platform:f.platform()});let s=await u("fnet build",{cwd:n});if(0!==s.code)throw new Error("Failed to build project.");if(V("git")&&(s=await u("git init --initial-branch=main",{cwd:n}),0!==s.code))throw new Error("Failed to initialize git.");if(V("code")&&e.vscode&&(s=await u(`cd ${n} && 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 Q(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:H("./template/fnet/node"),coreDir:H("./template/fnet/core"),projectDir:i.resolve(process.cwd(),`./.output/${e.id}`),tags:e.ftag,dev:e.dev};try{const t=await async function({tags:e}){let t=(o=process.cwd(),i.resolve(o,"fnet.yaml"));var o;if(!l.existsSync(t))throw new Error("fnet.yaml file not found in current directory.");const{raw:n,parsed:s}=await y({file:t,tags:e}),r=i.dirname(t);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 t="flow.main.yaml";l.existsSync(i.join(r,"fnet","flows.yaml"))&&(t=i.join("fnet","flows.yaml"));const o=s.main||t;let n=i.resolve(r,o);if(l.existsSync(n)){const{parsed:t}=await y({file:n,tags:e});c=t}else c={main:{steps:[]}}}const p={workflowAtom:{doc:{...s,content:c}},projectDir:r,projectFilePath:t,projectFileContent:n,projectFileParsed:s,runtime:a.runtime};let d=i.resolve(r,"fnet/targets.yaml");if(l.existsSync(d)){const{raw:t,parsed:o}=await y({file:d,tags:e}),n=h.parseDocument(t);p.devops={filePath:d,fileContent:t,yamlDocument:n,doc:{...o},type:"workflow.deploy",save:async()=>{l.writeFileSync(p.devops.filePath,n.toString())}}}const f=i.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:e.ftag});return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:H("./template/fnet/node"),coreDir:H("./template/fnet/core"),projectDir:i.resolve(t.projectDir,"./.workspace"),projectSrcDir:i.resolve(t.projectDir,"./src"),project:t,tags:e.ftag,dev:e.dev}}catch(t){return console.warn(`Warning: Could not load project: ${t.message}`),{projectDir:process.cwd(),tags:e.ftag}}}var Z=Object.freeze({__proto__:null,createContext:Q});const ee={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=H("./template/fnet/project"),o=process.cwd(),n=await Q(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 te{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 oe({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 ne({dir:e,name:t="index"}){let o=i.resolve(e,`./${t}.tsx`);if(l.existsSync(o)||(o=i.resolve(e,`./${t}.ts`)),l.existsSync(o)||(o=i.resolve(e,`./${t}.jsx`)),l.existsSync(o)||(o=i.resolve(e,`./${t}.js`)),!l.existsSync(o))return{};const n=o,s=i.extname(o);return{file:n,ext:s,ts:".ts"===s||".tsx"===s,name:t}}async function ie(e){const{atom:t,context:o,setProgress:n}=e;n("Initializing features..."),t.doc.features=t.doc.features||{};const s=t.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=i.resolve(o.project.projectDir),a=ne({dir:i.resolve(r,"./app")});if(a.file){n("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=ne({dir:i.resolve(r,"./cli")});if(c.file){n("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"===t.type){const e=ne({dir:i.resolve(r,"./src")});if(e.file){n("Parsing src entry imports...");let t=await S({file:e.file,recursive:!0}),o=t.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.src_uses_jsx=o,s.src_has_entry=!0,t=await S({file:e.file}),o=t.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.src_entry_uses_jsx=o,s.src_entry_is_ts=e.ts,s.src_entry_ext=e.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===t.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===t.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||t.doc.name,s.cli.installable=!0===s.cli.installable,s.cli.enabled&&(t.doc["npm::bin"]=s.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}`,s.app.output={file:`./dist/app/${s.app.folder}/index.js`,dir:`./dist/app/${s.app.folder}/`,...s.app.output||{}},s.app.input={file:"./src/app/index.js",dir:"./src/app/",...s.app.input||{}},d.app={format:s.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:s.app.input.file,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}`,s.cli.output={file:`./dist/cli/${s.cli.folder}/index.js`,dir:`./dist/cli/${s.cli.folder}/`,...s.cli.output||{}},s.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...s.cli.input||{}},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:s.cli.input.file,output_dir:s.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===s.cli.export?"none":"auto"});const f={server:".",startPath:`${i.normalize(s.app.dir||".")}`,files:[i.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"])}})));oe({feature:{name:"css",packages:s},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features;if("bun"===n.runtime.type)return;const 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)),oe({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:i},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features;"bun"!==n.runtime.type&&oe({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({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})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;oe({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:o})}(e)}async function se({projectDir:e,name:t,setProgress:o,count:n=1}){let s;const r=P(["npm-pick-versions",t,n]),a=i.join(e,".cache"),c=i.join(a,r+".json");return l.existsSync(c)?(o&&o(`Picking npm version of ${t} from cache ...`),s=JSON.parse(l.readFileSync(c,"utf8"))):(o&&o(`Picking npm version of ${t} ...`),s=await $({name:t,count:n}),l.mkdirSync(a,{recursive:!0}),l.writeFileSync(c,JSON.stringify(s),"utf8")),s}var re=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.C0YpfQ5j.js")).default({...e});else if("gcs"===c)await(await import("./index.Bft2w7m3.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.D3p7pncT.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}},ae={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 ce(e,t){return e.filter(((e,o,n)=>n.map((e=>e[t])).indexOf(e[t])===o))}function le(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=pe({...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=pe({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=pe({...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=pe({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"}),n=pe({...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=pe({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:i.to});i.to=o.indexKey}}else{const n=pe({...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=pe({...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=pe({...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=[]}))}le({...e,targetNodes:t.childs})}))}function pe(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 de(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 O.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)})),O.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,de({...e,targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:r})}))}(e)}async function fe(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=ce(i,"to"),e.bpmn.outside=ce(s,"to"),e.bpmn.starts=ce(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}),le({nodes:n,nodeIndex:o,root:t});const i=new I({atom:ae}),s={},r=i.create("bpmn:Definitions",{id:"definitions_0"});s[r.id]=r;for await(const e of t.childs){const t=r.get("rootElements"),a=r.get("diagrams"),c=i.create("bpmn:Process",{id:`process_${e.pathKey}`,name:e.name,documentation:[i.create("bpmn:Documentation",{text:`Workflow - ${e.name}`})]});s[c.id]=c,c.isExecutable=!0,t.push(c);const l=i.create("bpmndi:BPMNDiagram",{id:`diagram_${e.pathKey}`});s[l.id]=l,a.push(l);const p=i.create("bpmndi:BPMNPlane",{id:`plane_${e.pathKey}`});s[p.id]=p,l.plane=p,p.bpmnElement=c;de({targetNode:e,targetFlowElementsContainer:c,targetPlaneElement:p,moddle:i,elementIndex:s,nodeIndex:o,nodes:n,diagrams:a})}return{diagramXML:(await i.toXML(r,{format:!0})).xml}}async function me(e={}){return await fe(w(e))}async function ue({node:e,initNode:t,extra:o=!0}){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]};"boolean"==typeof n.export?n.export=!0===n.export&&o:"string"==typeof n.export?n.export=n.export:delete n.export,e.definition.modules.push({[o]:n})}))}if(o){const t=[],o=await R({data:e.definition,callback:(e,o,n)=>{const i=A({expression:e});if("m"===i?.processor){const e=n.slice(0,-1);e.push(i.statement);const s=e.join("_");return t.push({[s]:o}),[i.statement,`m::${s}`]}return[e,o]}});t.length>0&&(e.definition=o,e.definition.modules=e.definition.modules||[],e.definition.modules=e.definition.modules.concat(t))}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 ye({node:e,transformExpression:t}){const o=e.context.transform;if(Reflect.has(o,"export")&&(o.export=await t(o.export)),Reflect.has(o,"return")&&(e.hasReturn=!0,o.return=await t(o.return)),Reflect.has(o,"output")&&(o.output=await t(o.output)),Reflect.has(o,"assign"))for(let e=0;e<o.assign?.length;e++){let n=o.assign[e],i=Object.keys(n)[0],s=n[i],r={key:await t(i),value:await t(s)};o.assign[e]=r}}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 ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var ge={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 ue({node:e,initNode:t,extra:!1}),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 we={hits:async function({node:e}){return 1===Object.keys(e.definition).map((e=>A({expression:e}))).filter((e=>"if"===e?.processor)).length||!(!e.definition.if||"object"!=typeof e.definition.if)},init:async function(e){const{node:t}=e,o=Object.keys(t.definition).map((e=>A({expression:e}))),n=[],i=o.find((e=>"if"===e?.processor));if(i){const e=t.definition[i.expression];n.push({name:`${t.name}_if`,definition:e,processor:i}),delete t.definition[i.expression]}else if(t.definition.if){const{condition:e,...o}=t.definition.if;n.push({name:`${t.name}_if`,definition:o,processor:{expression:`if::${e}`,statement:e}}),delete t.definition.if}const s=o.filter((e=>"elseif"===e?.processor));let r=0;for(const e of s){const o=t.definition[e.expression];n.push({name:`${t.name}_elseif_${r++}`,definition:o,processor:e}),delete t.definition[e.expression]}if(t.definition.elseif){const{condition:e,...o}=t.definition.elseif;n.push({name:`${t.name}_elseif_${r++}`,definition:o,processor:{expression:`elseif::${e}`,statement:e}}),delete t.definition.elseif}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 ge.init(e)}};async function be({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 ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var xe={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 ue({node:e,initNode:t,extra:!1}),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=be},resolve:be};async function ve({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var je={hits:async function({node:e}){return e.definition.hasOwnProperty("assign")},init:async function({node:e,initNode:t}){e.type="assign",await ue({node:e,initNode:t}),e.resolve=ve},resolve:ve};async function ke({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 ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var De={hits:async function({node:e}){return e.definition.hasOwnProperty("for")},init:async function({node:e,initNode:t}){if(e.type="for",await ue({node:e,initNode:t,extra:!1}),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=ke},resolve:ke};var _e={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 Se({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 Ee={hits:async function({node:e}){return e.definition.hasOwnProperty("raise")},init:async function({node:e,initNode:t}){e.type="raise",e.resolve=Se},resolve:Se};async function $e({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 Pe={hits:async function({node:e}){return e.definition.hasOwnProperty("return")},init:async function({node:e,initNode:t}){e.type="return",e.resolve=$e},resolve:$e};async function Ne({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;let s=i.from||i.import||i.call;if("function"===e.target?.atom?.doc?.type)Reflect.has(i,"from")?(s=i.from,i.from=await n(e.target.atom.name)):Reflect.has(i,"import")?(s=i.import,i.import=await n(e.target.atom.name)):Reflect.has(i,"call")&&(i.call=await n(e.target.atom.name),s=i.call);else if((Reflect.has(i,"from")||Reflect.has(i,"import"))&&i.call.startsWith("use:e::")){const e=i.call.substring(7);i.libExp=await n(`e::LIBRARY.${e}`)}if(i.args&&(i.args=await n(i.args)),i.new&&(i.new=await n(i.new)),i.context&&(i.context=await n(i.context)),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 r=e.workflow.parent;e.context.lib=r.context.libs.find((e=>e.name===s)),await ye({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 ue({node:e,initNode:t}),e.resolve=Ne},resolve:Ne};async function Ce({node:e,transformExpression:t}){e.context.next=e.childs[0],e.context.transform=e.context.transform||w(e.definition),await ye({node:e,transformExpression:t})}var Fe={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=Ce},resolve:Ce};async function Ie({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 ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Oe={hits:async function({node:e}){return e.definition.hasOwnProperty("form")},init:async function({node:e,initNode:t}){e.type="form",await ue({node:e,initNode:t}),e.resolve=Ie},resolve:Ie};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}),o({node:e})}var Be={hits:async function({node:e}){return e.definition.hasOwnProperty("signal")},init:async function({node:e,initNode:t}){e.type="signal",e.resolve=Ae},resolve:Ae};async function Re({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){e.context.transform=e.context.transform||w(e.definition),await t({node:e}),o({node:e})}var Ke={hits:async function({node:e}){return e.definition.hasOwnProperty("wait")},init:async function({node:e,initNode:t}){e.type="wait",e.resolve=Re},resolve:Re};async function Me({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 ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Le={hits:async function({node:e}){return e.definition.hasOwnProperty("next")},init:async function({node:e,initNode:t}){e.type="next",e.resolve=Me},resolve:Me};async function Je({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var We={hits:async function({node:e}){return e.definition.hasOwnProperty("modules")},init:async function({node:e,initNode:t}){e.type="modules",await ue({node:e,initNode:t}),e.resolve=Je},resolve:Je};function ze({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 Ge{#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 Ue(e){return new Ge(e)}async function Ve({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;let s=i.from||i.import;if("function"===e.target?.atom?.doc?.type&&(Reflect.has(i,"from")?(s=i.from,i.from=await n(e.target.atom.name)):Reflect.has(i,"import")&&(s=i.import,i.import=await n(e.target.atom.name))),i.args&&(i.args=await n(i.args)),i.new&&(i.new=await n(i.new)),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 r=e.workflow.parent;e.context.lib=r.context.libs.find((e=>e.name===s)),await ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var qe={hits:async function({node:e}){return e.definition.hasOwnProperty("new")},init:async function({node:e,initNode:t}){e.type="new",await ue({node:e,initNode:t}),e.resolve=Ve},resolve:Ve};async function Xe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),await ye({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var He={hits:async function({node:e}){return e.definition.hasOwnProperty("output")},init:async function({node:e,initNode:t}){e.type="output",await ue({node:e,initNode:t}),e.resolve=Xe},resolve:Xe};class Ye{#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 te,this.#s=e,this.#l=[],this.#p=[],this.#d={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#_.push(Ue({key:"config",npm:"@fnet/config",master:"name"})),this.#_.push(Ue({key:"yaml",npm:"@fnet/yaml",master:"file"})),this.#_.push(Ue({key:"prompt",npm:"@fnet/prompt",master:"message"})),this.#_.push(Ue({key:"html-link",npm:"@flownet/lib-load-browser-link-url",master:"src"})),this.#_.push(Ue({key:"html-script",npm:"@flownet/lib-load-browser-script-url",master:"src"})),this.#_.push(Ue({key:"http-server",npm:"@fnet/node-express",master:"server_port"})),this.#_.push(Ue({key:"shell",npm:"@fnet/shell-flow",master:"commands"})),this.#_.push(Ue({key:"list-files",npm:"@fnet/list-files",master:"pattern"})),this.#_.push(Ue({key:"up-list-files",npm:"@fnet/up-list-files",master:"pattern"})),this.#_.push(Ue({key:"auto-conda-env",npm:"@fnet/auto-conda-env",master:"envDir"})),this.#_.push(Ue({key:"ollama-chat",npm:"@fnet/ollama-chat",master:"model"})),this.#_.push(Ue({key:"ai",npm:"@fnet/ai",master:"prompt",extras:{subtype:"flow"}})),this.#_.push(Ue({key:"invoke",npm:"@fnet/invoke",master:"method",extras:{}})),this.#_.push(Ue({key:"fetch",npm:"@fnet/fetch",master:"url",extras:{}})),this.#_.push(Ue({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:ze,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."});const e=this.#k.context.project;await this.initAuth(),await this.initWorkflow(),this.transformWorkflow({workflow:this.#a});const t=await this.initNodeTree({workflow:this.#a});await this.initNodeTreeIndex({root:t}),await this.initNodeCalls({root:t}),await this.initNodeCallLibs({root:t}),await this.initNodeForms({root:t}),await this.initNodeFormLibs({root:t}),await this.initEntryFiles({root:t,features:this.#r.doc.features}),await this.initFeaturesFromNodes({childs:t.childs,features:this.#r.doc.features}),await ie(this.#k),"bun"===e.runtime.type?await async function({atom:e,packageDependencies:t,packageDevDependencies:o,setProgress:n}){n("Initializing dependencies for Bun");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"}),t.push({package:"yargs-parser",version:"^22.0"}),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"})}(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"}),t.push({package:"yargs-parser",version:"^22.0"}),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:t.context.libs,packageDependencies:this.#l}),await this.resolveNodeTree({root:t}),this.#m=t}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(e){console.log("filePath",e),l.statSync(e).isDirectory()?(l.readdirSync(e).forEach((t=>{const o=i.join(e,t);this.#S(o)})),l.rmSync(e)):l.unlinkSync(e)}#E(e,t){const o=l.existsSync(e),n=o&&l.statSync(e);o&&n.isDirectory()?(l.mkdirSync(t,{recursive:!0}),l.readdirSync(e).forEach((o=>{this.#E(i.join(e,o),i.join(t,o))}))):l.copyFileSync(e,t)}async initWorkflowDir(){this.setProgress({message:"Initializing library directory."});const e=this.#s.projectDir,t=this.#s.coreDir;this.setProgress({message:"Cleaning project directory."});const o=B({dir:e,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const e of o)l.rmSync(e,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."}),l.existsSync(e)||l.mkdirSync(e,{recursive:!0});const n=i.join(e,"src");l.existsSync(n)||l.mkdirSync(n,{recursive:!0});const s=i.join(n,"core");this.#E(t,s);const r=i.join(n,"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 xe.hits(t))await xe.init(t);else if(await De.hits(t))await De.init(t);else if(await ge.hits(t))await ge.init(t);else if(await we.hits(t))await we.init(t);else if(await _e.hits(t))await _e.init(t);else if(await Te.hits(t))await Te.init(t);else if(await qe.hits(t))await qe.init(t);else if(await Ee.hits(t))await Ee.init(t);else if(await Oe.hits(t))await Oe.init(t);else if(await Be.hits(t))await Be.init(t);else if(await Ke.hits(t))await Ke.init(t);else if(await Fe.hits(t))await Fe.init(t);else if(await Le.hits(t))await Le.init(t);else if(await We.hits(t))await We.init(t);else if(await Pe.hits(t))await Pe.init(t);else if(this.#_.find((e=>e.hits(t))))await this.#_.find((e=>e.hits(t))).init(t);else if(await je.hits(t))await je.init(t);else{if(!await He.hits(t))throw new Error("Undefined step type.");await He.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:e,index:t}){const o=i.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const n=[];let s=e;for(;s?.parent;)n.push(s.index),s=s.parent;n.reverse(),e.codeKey=`B_${n.join("_")}_${e.type}`,e.pathKey=`${n.join(".")}`,e.typeId=j();for await(const o of e.childs)await this.initNodeIndex({node:o,index:t})}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&&"new"!==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.from||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.from||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:e,libRef:t}){const o=F({url:e});if(!o)throw new Error(`Invalid package name: ${e}`);if(o.protocol||(o.protocol=this.#h),"ac:"===o.protocol){const t=o.pathname.split("/");if(1===t.length)return await D.first({where:{name:e,parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===t.length){const e=await D.first({where:{name:t[0],parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"folder"}});return await D.first({where:{name:t[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===o.protocol){const e=i.resolve(this.#s.projectSrcDir,`${o.pathname}.js`),t=[],n=(await S({file:e,recursive:!0})).all;for await(const e of n){if("npm"!==e.type)continue;if(t.find((t=>t.package===e.package)))continue;const o=await se({name:e.package,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});t.push({package:e.package,subpath:e.subpath,version:o.minorRange,type:"npm"})}return{name:o.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:t},protocol:o.protocol}}if("npm:"===o.protocol){const e=K({path:o.pathname}),n=await se({name:e.package,subpath:e.subpath,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});return{name:o.pathname,doc:{type:"workflow.lib",subtype:"flow"===t?.definition?.subtype?"workflow":null,"content-type":"javascript",language:"js",dependencies:[{package:e.package,version:n.minorRange,type:"npm"}]},protocol:o.protocol}}if("node:"===o.protocol){return{name:o.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:[]},protocol:o.protocol}}if("use:"===o.protocol){return{name:o.pathname,doc:{type:"function",dependencies:[]},protocol:o.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("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:e}){await this.setProgress({message:"Creating external lib files."}),this.#r.typesDir="./types";const t=e.context.libs.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,n=this.#s.projectDir;if("local:"===o.protocol){const e=i.resolve(this.#s.projectSrcDir,`${o.fileName||o.name}.js`),t=i.relative(`${this.#s.projectDir}/src/default/blocks`,e);if(!l.existsSync(e)){l.mkdirSync(i.dirname(e),{recursive:!0});let t="export default async (input)=>{\n";t+="}",l.writeFileSync(e,t,"utf8")}o.relativePath=t.split(i.sep).join("/"),this.#r.typesDir=`./types/${i.basename(n)}/src`}else if("npm:"===o.protocol)o.relativePath=o.name;else if("node:"===o.protocol)o.relativePath=o.name;else if("use:"===o.protocol)console.log("USE:",o.name);else{const e=`${n}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;l.writeFileSync(i.normalize(e),t.content,"utf8")}}}async createEngine({root:e}){await this.setProgress({message:"Creating engine file."});const t=this.#s.templateDir,o=g.compile(l.readFileSync(i.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#c);for(let t=0;t<e.childs.length;t++){const n=e.childs[t];if(!n.entryFile)continue;const s=o.render({flow:n,ui:{package:"@fnet/react-app"}}),r=this.#s.projectDir,a=i.resolve(r,`src/default/${n.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:e}){const t=this.#s.templateDir,o=g.compile(l.readFileSync(i.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#c).render(e),n=this.#s.projectDir,s=i.resolve(n,`src/default/${e.codeKey}.js`);l.writeFileSync(s,o,"utf8");for await(const t of e.childs)await this.createType({node:t})}async createType({node:e}){switch(e.type){case"assign":case"steps":case"return":case"call":case"new":case"form":case"raise":case"switch":case"next":case"tryexcept":case"for":case"signal":case"wait":case"modules":case"output":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:e}){let t=this.#d[e.type];if(t)return t;const o=this.#s.templateDir;return t=g.compile(l.readFileSync(i.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#c),this.#d[e.type]=t,t}createStepFile({node:e}){const t=this.#s.projectDir,o=`${e.codeKey}.js`,n=i.resolve(t,`src/default/blocks/${o}`);l.writeFileSync(n,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=n}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=A({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=A({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}||flow.module?.${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 e="fnet.yaml",t=`Creating ${e}`;await this.setProgress({message:t});const{content:o,...n}=this.#r.doc,s=this.#s.projectDir,r=i.resolve(s,`${e}`);l.writeFileSync(r,h.stringify(n),"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setProgress({message:t});const o={content:h.stringify(this.#a)},n=this.#s.templateDir,s=g.compile(l.readFileSync(i.resolve(n,`${e}.njk`),"utf8"),this.#c).render(o),r=this.#s.projectDir,a=i.resolve(r,`${e}`);l.writeFileSync(a,s,"utf8")}async runPrettifier(){const e=this.#s.projectDir;if(V("bun")){const t=await u("prettier --write .",{cwd:i.resolve(e,"src")});if(0!==t.code)throw new Error(t.stderr)}else{const t=await u("prettier --write .",{cwd:i.resolve(e,"src")});if(0!==t.code)throw new Error(t.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 re({...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 o="string"==typeof e?e:e?.message;console.log(t.blue(o)),await this._cache_set(this.#y,{status:"IN_PROGRESS",message:o})}async build(){if(this.#j&&!this.#b)return await this.createNetwork();try{const e=this.#j?await me({root:this.#m}):void 0;if(this.#b){const t=this.#k.context.project;if(await this.initWorkflowDir(),await this.initNunjucks(),this.#j){let t=this.#s.project?.projectDir||this.#s.projectDir;t=i.resolve(t,"fnet"),l.existsSync(t)&&(l.existsSync(i.resolve(t,"flow.bpmn"))&&l.unlinkSync(i.resolve(t,"flow.bpmn")),l.writeFileSync(i.resolve(t,"flows.bpmn"),e.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:e,context:t,setProgress:o,Atom:n}){const s="readme.md",r=`Creating ${s}`;if(await o({message:r}),t.project?.readme){const e=t.projectDir,o={content:t.project.readme.doc.content},n=i.resolve(t.project.projectDir,"fnet/how-to.md");if(l.existsSync(n)){const e=l.readFileSync(n,"utf8");o.howto=e}const r=i.resolve(t.project.projectDir,"fnet/input.yaml");if(l.existsSync(r)){const e=await y({file:r,tags:t.tags});o.input=e.content}const a=i.resolve(t.project.projectDir,"fnet/output.yaml");if(l.existsSync(a)){const e=await y({file:a,tags:t.tags});o.output=e.content}const c=t.templateDir,p=g.compile(l.readFileSync(i.resolve(c,`${s}.njk`),"utf8"),g.configure(c)).render(o),d=i.resolve(e,`${s}`);l.writeFileSync(d,p,"utf8")}else if(e.id){const o=await n.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:r,...a}=o.doc,c={content:r},p=t.templateDir,d=g.compile(l.readFileSync(i.resolve(p,`${s}.njk`),"utf8"),g.configure(p)).render(c),f=t.projectDir,m=i.resolve(f,`${s}`);l.writeFileSync(m,d,"utf8")}}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating tsconfig.json."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,"tsconfig.json.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,"tsconfig.json");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating .gitignore"});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,".gitignore.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,".gitignore");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,njEnv:n}){if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating input args."});let s={};if(s=e.doc.input?e.doc.input:{type:"object",properties:{},required:[]},e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled){const t=e.doc.features.cli.fargs;Reflect.has(t,"default")&&t.default}const r={imports:[],atom:e},a=o.templateDir,c=g.compile(l.readFileSync(i.resolve(a,"src/default/input.args.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=i.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(i.resolve(p,"src/default/validate_input.js"),u,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=i.resolve(o.projectDir,"src/cli");l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),await m({pattern:["index.js.njk"],dir:i.resolve(r,"src/cli"),outDir:a,context:s})}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating app folder"});const s={atom:e,packageDependencies:n,ts:Date.now()},r=o.templateDir,a=i.resolve(o.projectDir,"src/app");l.existsSync(a)||l.mkdirSync(a,{recursive:!0});let c=["index.js.njk"];!1!==e.doc.features.app.html&&c.push("index.html.njk"),await m({pattern:c,dir:i.resolve(r,"src/app"),outDir:a,context:s})}(this.#k),"bun"===t.runtime.type?await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating build.js file."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,"build.js.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,"build.js");l.writeFileSync(p,a,"utf8"),l.chmodSync(p,"755")}(this.#k):await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating rollup file."});const s={atom:e,packageDependencies:n},r=i.resolve(o.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=e.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=o.templateDir;let f=g.compile(l.readFileSync(i.resolve(d,"rollup.config.mjs.njk"),"utf8"),g.configure(d)).render(s);const m=o.projectDir;let u=i.resolve(m,"rollup.config.mjs");l.writeFileSync(u,f,"utf8")}(this.#k),await async function({atom:e,context:t,packageDependencies:o,packageDevDependencies:n,setProgress:s}){await s({message:"Creating package.json."}),o.filter((e=>!0===e.dev)).forEach((e=>{n.find((t=>t.package===e.package))||n.push(e);const t=o.findIndex((t=>t.package===e.package));o.splice(t,1)}));const r=o.find((e=>"react"===e.package)),a=o.find((e=>"react-dom"===e.package));r&&!a?o.push({package:"react-dom",version:r.version}):r&&a&&(a.version=r.version),r&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.app.enabled&&c.push({file:i.resolve(t.projectDir,"src/app/index.js"),dev:!1!==e.doc.features.app.dev}),!0===e.doc.features.cli.enabled&&c.push({file:i.resolve(t.projectDir,"src/cli/index.js"),dev:!1!==e.doc.features.cli.dev});for await(const e of c){const i=e.file;if(!l.existsSync(i))throw new Error(`App file not found: ${i}`);const r=(await S({file:i,recursive:!0,verbose:!1})).all;for await(const i of r){if("npm"!==i.type)continue;if(o.find((e=>e.package===i.package)))continue;if(n.find((e=>e.package===i.package)))continue;const r=await se({name:i.package,projectDir:t.projectDir,setProgress:s});(!0===e.dev?n:o).push({package:i.package,subpath:i.subpath,version:r.minorRange,type:"npm"})}}const p={atom:e,packageDependencies:o,packageDevDependencies:n},d=t.templateDir,f=g.compile(l.readFileSync(i.resolve(d,"package.json.njk"),"utf8"),g.configure(d)).render(p),m=t.projectDir,u=i.resolve(m,"package.json");l.writeFileSync(u,f,"utf8");const y=i.resolve(t.project.projectDir,"fnet");if(l.existsSync(y)){const e=i.resolve(t.projectDir,"fnet");l.existsSync(e)||l.mkdirSync(e);const o=l.readdirSync(y);for(const t of o){const o=i.resolve(y,t);if(!l.lstatSync(o).isFile())continue;const n=i.resolve(e,t);l.copyFileSync(o,n)}}}(this.#k),await async function({setProgress:e,context:t}){const o=t.projectDir;await e({message:"Prettifiying source files."});let n=i.join("src","**","*");if(V("bun")){const e=await u(`prettier --write ${n} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:o});if(0!==e.code)throw new Error(e.stderr)}else{const e=await u(`prettier --write ${n} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:o});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."}),V("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."}),V("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:e}})}catch(e){throw await this._cache_set(this.#y,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await me({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 Qe={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 Q(e),o=new Ye(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)}}},Ze={command:"build:dev",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{e.dev=!0;const t=await Q(e),o=new Ye(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)}}},et={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 Q({...e,mode:"all"}),o=new Ye(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)}}},tt={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 Q({...e,mode:"file"}),o=new Ye(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)}}},ot={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 e=>{try{const t=await Q(e),{project:o}=t,{projectDir:n,projectFileParsed:s}=o,r=s.input;if(!r)throw new Error("Config schema not found in project file.");if(!Reflect.has(e,"name")){const{inputName:t}=await M({type:"input",name:"inputName",message:"Input name:",initial:"dev"});e.name=t}const a=i.resolve(n,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=i.resolve(a,`${e.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 nt={promptForSelection:async function(e){const{items:o,message:n,nameField:i="name",valueField:s="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[s];return console.log(t.blue(`Only one option available: ${"string"==typeof e?e:e[i]}`)),n}let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[s],value:e[s],message:e[i]||e[s]}));a&&c.push({name:"cancel",value:null,message:t.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 M({type:"select",name:p,message:n,choices:c,initial:l});return"cancel"===d?null:d},promptForMultipleSelection:async function(e){const{items:o,message:n,nameField:i="name",valueField:s="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[s],value:e[s],message:e[i]||e[s]})),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 M({type:"multiselect",name:p,message:n,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 it=i.join(f.homedir(),".fnet","express");async function st(e){e.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 e=>{await async function(e){try{l.existsSync(it)||l.mkdirSync(it,{recursive:!0});const o=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=i.join(it,o);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let s,r=e.projectName,a=e.runtime;if(e.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(s=i.join(n,r),l.existsSync(s)){let e=1;for(;l.existsSync(i.join(n,`${r}-${e}`));)e++;r=`${r}-${e}`,s=i.join(n,r)}if(!e.yes){if(!(await M([{type:"confirm",name:"proceed",message:`Create express project "${r}" in ${s}?`,default:!0}])).proceed)return void console.log(t.yellow("Project creation cancelled."))}console.log(t.blue(`Creating express project "${r}" in ${s}...`));const p=i.dirname(s),d=["create","--name",i.basename(s)];d.push("--runtime",a),e.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(((o,n)=>{f.on("close",(i=>{0===i?(console.log(t.green(`\nExpress project "${r}" created successfully!`)),console.log(t.blue(`\nProject location: ${s}`)),e.yes?o():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 lt(e)}catch(e){console.error(t.red(`Error opening IDE: ${e.message}`))}}(s)):(console.error(t.red(`\nFailed to create express project "${r}".`)),n(new Error(`Process exited with code ${i}`)))}))}))}catch(e){console.error(t.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(it))return void console.log(t.yellow("No express projects found."));const o=l.readdirSync(it).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(e.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=o.indexOf(e);if(-1===n)return void console.log(t.yellow("No express projects found for today."));o.splice(0,n),o.splice(1)}const n=[];e.type||e.all||(e.type="fnet");for(const t of o){const o=i.join(it,t),s=l.readdirSync(o);for(const r of s){const s=i.join(o,r),a=l.statSync(s);let c="unknown";if(r.startsWith("fnode-")||l.existsSync(i.join(s,"fnode.yaml"))?c="fnode":(r.startsWith("fnet-")||l.existsSync(i.join(s,"fnet.yaml")))&&(c="fnet"),e.type&&c!==e.type)continue;if(e.name&&!r.includes(e.name))continue;const p=`${t.slice(0,4)}-${t.slice(4,6)}-${t.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(t.yellow("No express projects found matching the criteria."));console.log(t.blue("\nExpress Projects:"));const s=(await import("./index.-SGbq2cI.js")).default,r=["NAME","TYPE","DATE","PATH"],a=s.createTable(r,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let o=e.path;o.startsWith(f.homedir())&&(o="~"+o.substring(f.homedir().length)),a.push([t.white(e.name),"fnet"===e.type?t.cyan(e.type):"fnode"===e.type?t.green(e.type):e.type,e.date,o])}console.log(a.toString()),console.log(t.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(t.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(it))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await rt(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await at(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await ct();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(it,e)}await lt(o)}catch(e){console.error(t.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{const o=process.cwd();let n;if(o.includes(it))n=o,console.log(t.blue(`Using current express project: ${i.basename(n)}`));else if(e.latest){if(n=await rt(),!n)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(n=await at(e.projectName),!n)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await ct();if(!e)return void console.log(t.yellow("No project selected."));n=i.join(it,e)}let s=e.destination;if(!s){s=(await M({type:"input",name:"destination",message:"Enter destination directory:",initial:i.join(process.cwd(),i.basename(n))})).destination}if(s.startsWith("~")&&(s=i.join(f.homedir(),s.slice(1))),s=i.resolve(s),s.startsWith(n+i.sep)||s===n)return void console.log(t.red("Destination cannot be inside the source directory."));if(l.existsSync(s)){if(!l.statSync(s).isDirectory())return void console.log(t.red(`Destination "${s}" is not a directory.`));if(l.readdirSync(s).length>0){if(!(await M({type:"confirm",name:"overwrite",message:`Destination "${s}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(t.yellow("Project move cancelled."))}}else l.mkdirSync(s,{recursive:!0});console.log(t.blue(`Moving project from ${n} to ${s}...`)),dt(n,s),console.log(t.green(`\nProject moved successfully to ${s}`));(await M({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(t.green("Original project deleted."))),await lt(s)}catch(e){console.error(t.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(it))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await rt(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await at(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await ct();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(it,e)}const n=i.basename(o);if(!e.yes){if(!(await M({type:"confirm",name:"confirm",message:`Are you sure you want to remove project "${n}"?`,initial:!1})).confirm)return void console.log(t.yellow("Project removal cancelled."))}console.log(t.blue(`Removing project "${n}"...`)),l.rmSync(o,{recursive:!0,force:!0}),console.log(t.green(`Project "${n}" removed successfully.`))}catch(e){console.error(t.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(it))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await rt(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await at(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await ct();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(it,e)}console.log(t.blue(`Entering project directory: ${o}`)),console.log(t.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",s=c(n,[],{stdio:"inherit",cwd:o,shell:!0});return new Promise((e=>{s.on("close",(()=>{console.log(t.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(t.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(e)})).demandCommand(1,"You need to specify a command").help()}async function rt(){const e=l.readdirSync(it).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(0===e.length)return null;const t=e[0],o=i.join(it,t),n=l.readdirSync(o);if(0===n.length)return null;let s=null,r=0;for(const e of n){const t=i.join(o,e),n=l.statSync(t);n.birthtimeMs>r&&(r=n.birthtimeMs,s=t)}return s}async function at(e){const o=l.readdirSync(it).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=i.join(it,n),s=l.readdirSync(o);if(s.includes(e))return i.join(o,e);const r=s.filter((t=>t.includes(e)));if(r.length>0){if(1===r.length)return i.join(o,r[0]);{const s=r.map((e=>({name:i.join(o,e),value:i.join(o,e),message:`${e} (${n})`}))),a=await nt.promptForSelection({items:s,message:`Multiple projects match "${e}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(t.yellow("Operation cancelled.")),null):a}}}return null}async function ct(){const e=[],o=l.readdirSync(it).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const t of o){const o=i.join(it,t),n=l.readdirSync(o);for(const s of n){const n=i.join(o,s),r=l.statSync(n),a=`${t}/${s}`;e.push({name:a,value:a,created:r.birthtime})}}if(e.sort(((e,t)=>t.created-e.created)),0===e.length)return null;const n=await nt.promptForSelection({items:e,message:"Select a project:",nameField:"value",valueField:"value",allowAbort:!0});return null===n?(console.log(t.yellow("Operation cancelled.")),null):n}async function lt(e){const o=await pt("code --version"),n=await pt("code-insiders --version");let i=null;if(o&&n){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"}]});i=e.ide}else if(o)i="code";else{if(!n)return console.log(t.yellow("No supported IDE found. Please open the project manually.")),void console.log(t.blue(`Project path: ${e}`));i="code-insiders"}console.log(t.blue(`Opening project in ${i}...`)),console.log(t.blue(`Project path: ${e}`));const s=c(i,[e],{stdio:"inherit",shell:!0});return new Promise(((e,o)=>{s.on("close",(n=>{0===n?(console.log(t.green(`Project opened in ${i}.`)),e()):(console.error(t.red(`Failed to open project in ${i}.`)),o(new Error(`Process exited with code ${n}`)))}))}))}async function pt(e){return new Promise((t=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{t(0===e)}))}))}function dt(e,t){l.existsSync(t)||l.mkdirSync(t,{recursive:!0});const o=l.readdirSync(e,{withFileTypes:!0});for(const n of o){const o=i.join(e,n.name),s=i.join(t,n.name);if(n.isDirectory()){if(".git"===n.name||".workspace"===n.name)continue;dt(o,s)}else l.copyFileSync(o,s)}}const ft=i.dirname(a(import.meta.url));const mt=i.dirname(a(import.meta.url)),ut=process.cwd();process.on("uncaughtException",(e=>{J||(J=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{J||(J=!0,setTimeout((()=>process.exit(1)),500))})),function(){d({name:["redis"],dir:ut,optional:!0});const e=function({baseDir:e}){let t=e=e||ft;for(;t!==i.parse(t).root;){const e=i.join(t,"node_modules");if(l.existsSync(e))return e;t=i.dirname(t)}return null}({baseDir:mt}),t="win32"===process.platform?";":":";e&&(process.env.PATH=`${i.join(e,"/.bin")}${t}${process.env.PATH}`)}(),async function(){try{let o=e(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(Y).command(ee).command(Qe).command(Ze).command(et).command(tt).command(ot).command("express","Create and manage express projects",st);o=G(o,{bin:"npm"}),o=G(o,{bin:"node"}),o=G(o,{bin:"bun"}),o=G(o,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),o=G(o,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),o=G(o,{name:"app",bin:"bun",preArgs:["run","app","--"]}),o=G(o,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),o=G(o,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"]}),o=G(o,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"]}),o=G(o,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"]}),o=G(o,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"]}),o=G(o,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),o=function(e,{name:o}){return e.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 e=>{try{const o=await U(e),{projectDir:n}=o;console.log(t.blue("Compiling project..."));const s=i.join(n,".bin");l.existsSync(s)||l.mkdirSync(s,{recursive:!0});const r=i.basename(i.dirname(n)),a=o.project?.projectFileParsed?.features?.cli?.bin,c=e.name||a||r;console.log(t.blue(`Using binary name: ${c}`));const p=i.join(s,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(t.green(`Binary compiled successfully: ${p}`)),console.log(t.blue("Installing binary..."));const m=["install",p];e.name&&m.push("--name",e.name),e.force&&m.push("--force"),e.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(t.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(o,{name:"install"}),o=G(o,{bin:"npx"}),o=G(o,{bin:"cdk"}),o=G(o,{bin:"aws"}),o=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 U(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);z(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)}}))}(o,{name:"with"}),o=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)}}))}(o,{name:"run",projectType:"fnet"}),o.demandCommand(1,"You need at least one command before moving on").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)}));export{H as r,V as w};
2
+ import e from"yargs";import t from"chalk";import{promisify as o}from"node:util";import n from"tree-kill";import i,{delimiter as s,join as r}from"node:path";import{fileURLToPath as a}from"node:url";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"redis";import"@flownet/lib-is-redis-online";import{randomUUID as x}from"node:crypto";import{Api as v,Atom as j}from"@flownet/lib-atom-api-js";import k from"lodash.merge";import D from"@flownet/lib-parse-imports-js";import _ from"@fnet/npm-list-versions";import S from"@fnet/npm-pick-versions";import E from"object-hash";import $ from"ajv/dist/2020.js";import P from"ajv/dist/standalone/index.js";import N from"ajv-formats";import T from"@flownet/lib-parse-node-url";import C from"bpmn-moddle";import F from"dagre";import I from"@fnet/expression";import A from"@fnet/list-files";import O from"@fnet/key-value-transformer";import B from"@flownet/lib-parse-npm-path";import R from"@fnet/prompt";const K=o(n);let M=!1;async function L(e,t){if(M)return;if(M=!0,!e.killed&&e.pid)try{await K(e.pid,"SIGTERM").catch((()=>{})),await new Promise((e=>setTimeout(e,500))),e.killed||await K(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 J(e){["SIGINT","SIGTERM","SIGQUIT"].forEach((t=>{process.once(t,(async()=>{await L(e,t)}))})),process.on("uncaughtException",(async t=>{await L(e)})),process.on("unhandledRejection",(async t=>{await L(e)})),e.on("close",(e=>{M||process.exit(e)}))}function W(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 z(e),{projectDir:s}=t,r=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,a=process.argv.slice(3).map(r),l={...process.env},p=i.join(s,"node_modules");l.NODE_PATH=p;const d=l.NODE_OPTIONS||"";l.NODE_OPTIONS=`${d} --preserve-symlinks`.trim();J(c(o,[...n,...a],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:l}))}catch(e){console.error(e.message),process.exit(1)}}))}async function z(e){try{const t=process.argv[1].split("/").pop().split(".")[0];if("fnode"===t){const{createContext:t}=await import("./index.DOYkqsYT.js");return t(e)}if("fnet"===t){const{createContext:t}=await Promise.resolve().then((function(){return Y}));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 G=e=>{const t=process.env.PATH||"",o="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],n=t.split(s);for(const t of n)for(const n of o){const o=r(t,"win32"===process.platform?e+n:e);if(p(o))return o}return null};const U=i.dirname(a(import.meta.url)),V=process.cwd();function q(e){const t=i.resolve(V,e);if(l.existsSync(t))return t;const o=i.resolve(U,"../..",e);if(l.existsSync(o))return o;throw new Error(`Template path not found: ${e}`)}const X={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 e=>{try{const t=process.cwd(),o=q("./template/fnet/project"),n=i.resolve(t,e.name);l.existsSync(n)||l.mkdirSync(n),await m({dir:o,outDir:n,context:e,copyUnmatchedAlso:!0,platform:f.platform()});let s=await u("fnet build",{cwd:n});if(0!==s.code)throw new Error("Failed to build project.");if(G("git")&&(s=await u("git init --initial-branch=main",{cwd:n}),0!==s.code))throw new Error("Failed to initialize git.");if(G("code")&&e.vscode&&(s=await u(`cd ${n} && 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 H(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:q("./template/fnet/node"),coreDir:q("./template/fnet/core"),projectDir:i.resolve(process.cwd(),`./.output/${e.id}`),tags:e.ftag,dev:e.dev};try{const t=await async function({tags:e}){let t=(o=process.cwd(),i.resolve(o,"fnet.yaml"));var o;if(!l.existsSync(t))throw new Error("fnet.yaml file not found in current directory.");const{raw:n,parsed:s}=await y({file:t,tags:e}),r=i.dirname(t);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 t="flow.main.yaml";l.existsSync(i.join(r,"fnet","flows.yaml"))&&(t=i.join("fnet","flows.yaml"));const o=s.main||t;let n=i.resolve(r,o);if(l.existsSync(n)){const{parsed:t}=await y({file:n,tags:e});c=t}else c={main:{steps:[]}}}const p={workflowAtom:{doc:{...s,content:c}},projectDir:r,projectFilePath:t,projectFileContent:n,projectFileParsed:s,runtime:a.runtime};let d=i.resolve(r,"fnet/targets.yaml");if(l.existsSync(d)){const{raw:t,parsed:o}=await y({file:d,tags:e}),n=h.parseDocument(t);p.devops={filePath:d,fileContent:t,yamlDocument:n,doc:{...o},type:"workflow.deploy",save:async()=>{l.writeFileSync(p.devops.filePath,n.toString())}}}const f=i.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:e.ftag});return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:q("./template/fnet/node"),coreDir:q("./template/fnet/core"),projectDir:i.resolve(t.projectDir,"./.workspace"),projectSrcDir:i.resolve(t.projectDir,"./src"),project:t,tags:e.ftag,dev:e.dev}}catch(t){return console.warn(`Warning: Could not load project: ${t.message}`),{projectDir:process.cwd(),tags:e.ftag}}}var Y=Object.freeze({__proto__:null,createContext:H});const Q={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=q("./template/fnet/project"),o=process.cwd(),n=await H(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 Z{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(v.set_api_url(e.data.url),t)return v.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=>{v.set_req_token(e.access_token),o(e.access_token)})).catch((e=>{v.set_req_token(),n(e)}))}))}}function ee({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=k(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 te({dir:e,name:t="index"}){let o=i.resolve(e,`./${t}.tsx`);if(l.existsSync(o)||(o=i.resolve(e,`./${t}.ts`)),l.existsSync(o)||(o=i.resolve(e,`./${t}.jsx`)),l.existsSync(o)||(o=i.resolve(e,`./${t}.js`)),!l.existsSync(o))return{};const n=o,s=i.extname(o);return{file:n,ext:s,ts:".ts"===s||".tsx"===s,name:t}}async function oe(e){const{atom:t,context:o,setProgress:n}=e;n("Initializing features..."),t.doc.features=t.doc.features||{};const s=t.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=i.resolve(o.project.projectDir),a=te({dir:i.resolve(r,"./app")});if(a.file){n("Parsing app entry imports...");let e=await D({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 D({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=te({dir:i.resolve(r,"./cli")});if(c.file){n("Parsing cli entry imports...");let e=await D({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 D({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"===t.type){const e=te({dir:i.resolve(r,"./src")});if(e.file){n("Parsing src entry imports...");let t=await D({file:e.file,recursive:!0}),o=t.all.some((e=>!0===e.usesJSX&&"local"===e.type));s.src_uses_jsx=o,s.src_has_entry=!0,t=await D({file:e.file}),o=t.all.some((e=>!0===e.usesJSX&&"local"===e.type)),s.src_entry_uses_jsx=o,s.src_entry_is_ts=e.ts,s.src_entry_ext=e.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===t.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===t.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||t.doc.name,s.cli.installable=!0===s.cli.installable,s.cli.enabled&&(t.doc["npm::bin"]=s.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}`,s.app.output={file:`./dist/app/${s.app.folder}/index.js`,dir:`./dist/app/${s.app.folder}/`,...s.app.output||{}},s.app.input={file:"./src/app/index.js",dir:"./src/app/",...s.app.input||{}},d.app={format:s.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:s.app.input.file,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}`,s.cli.output={file:`./dist/cli/${s.cli.folder}/index.js`,dir:`./dist/cli/${s.cli.folder}/`,...s.cli.output||{}},s.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...s.cli.input||{}},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:s.cli.input.file,output_dir:s.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===s.cli.export?"none":"auto"});const f={server:".",startPath:`${i.normalize(s.app.dir||".")}`,files:[i.normalize("./dist/**/*")],cors:!0,open:!1};s.babel_options=k({targets:{browsers:"last 9 versions, not dead",node:"18"}},s.babel_options||s.babel?.options),s.browsersync_options=k(f,s.browsersync_options||s.browsersync?.options||{}),s.replace_options=k({},s.replace_options||s.replace?.options||{}),Reflect.has(s.browsersync_options,"proxy")&&delete s.browsersync_options.server,s.rollup=s.rollup||{},s.rollup_output=k(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=k(s.browsersync_options,t.browsersync_options),t.replace_options=k(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"])}})));ee({feature:{name:"css",packages:s},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features;if("bun"===n.runtime.type)return;const 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)),ee({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:i},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e,n=t.doc.features;"bun"!==n.runtime.type&&ee({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:n,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:o})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({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})}(e),function(e){const{atom:t,packageDevDependencies:o}=e;ee({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:o})}(e)}async function ne({projectDir:e,name:t,setProgress:o,count:n=1}){let s;const r=E(["npm-pick-versions",t,n]),a=i.join(e,".cache"),c=i.join(a,r+".json");return l.existsSync(c)?(o&&o(`Picking npm version of ${t} from cache ...`),s=JSON.parse(l.readFileSync(c,"utf8"))):(o&&o(`Picking npm version of ${t} ...`),s=await S({name:t,count:n}),l.mkdirSync(a,{recursive:!0}),l.writeFileSync(c,JSON.stringify(s),"utf8")),s}var ie=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.C0YpfQ5j.js")).default({...e});else if("gcs"===c)await(await import("./index.Bft2w7m3.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.D3p7pncT.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}},se={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 re(e,t){return e.filter(((e,o,n)=>n.map((e=>e[t])).indexOf(e[t])===o))}function ae(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=ce({...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=ce({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=ce({...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=ce({...e,parent:t,bpmnType:"bpmn:StartEvent",type:"start"}),n=ce({...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=ce({...e,parent:t,bpmnType:"bpmn:EndEvent",type:"end",name:i.to});i.to=o.indexKey}}else{const n=ce({...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=ce({...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=ce({...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=[]}))}ae({...e,targetNodes:t.childs})}))}function ce(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 le(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 F.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)})),F.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,le({...e,targetNode:t,targetFlowElementsContainer:o,targetPlaneElement:r})}))}(e)}async function pe(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=re(i,"to"),e.bpmn.outside=re(s,"to"),e.bpmn.starts=re(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}),ae({nodes:n,nodeIndex:o,root:t});const i=new C({atom:se}),s={},r=i.create("bpmn:Definitions",{id:"definitions_0"});s[r.id]=r;for await(const e of t.childs){const t=r.get("rootElements"),a=r.get("diagrams"),c=i.create("bpmn:Process",{id:`process_${e.pathKey}`,name:e.name,documentation:[i.create("bpmn:Documentation",{text:`Workflow - ${e.name}`})]});s[c.id]=c,c.isExecutable=!0,t.push(c);const l=i.create("bpmndi:BPMNDiagram",{id:`diagram_${e.pathKey}`});s[l.id]=l,a.push(l);const p=i.create("bpmndi:BPMNPlane",{id:`plane_${e.pathKey}`});s[p.id]=p,l.plane=p,p.bpmnElement=c;le({targetNode:e,targetFlowElementsContainer:c,targetPlaneElement:p,moddle:i,elementIndex:s,nodeIndex:o,nodes:n,diagrams:a})}return{diagramXML:(await i.toXML(r,{format:!0})).xml}}async function de(e={}){return await pe(w(e))}async function fe({node:e,initNode:t,extra:o=!0}){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]};"boolean"==typeof n.export?n.export=!0===n.export&&o:"string"==typeof n.export?n.export=n.export:delete n.export,e.definition.modules.push({[o]:n})}))}if(o){const t=[],o=await O({data:e.definition,callback:(e,o,n)=>{const i=I({expression:e});if("m"===i?.processor){const e=n.slice(0,-1);e.push(i.statement);const s=e.join("_");return t.push({[s]:o}),[i.statement,`m::${s}`]}return[e,o]}});t.length>0&&(e.definition=o,e.definition.modules=e.definition.modules||[],e.definition.modules=e.definition.modules.concat(t))}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 me({node:e,transformExpression:t}){const o=e.context.transform;if(Reflect.has(o,"export")&&(o.export=await t(o.export)),Reflect.has(o,"return")&&(e.hasReturn=!0,o.return=await t(o.return)),Reflect.has(o,"output")&&(o.output=await t(o.output)),Reflect.has(o,"assign"))for(let e=0;e<o.assign?.length;e++){let n=o.assign[e],i=Object.keys(n)[0],s=n[i],r={key:await t(i),value:await t(s)};o.assign[e]=r}}async function ue({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 me({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 fe({node:e,initNode:t,extra:!1}),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=ue},resolve:ue};var he={hits:async function({node:e}){return 1===Object.keys(e.definition).map((e=>I({expression:e}))).filter((e=>"if"===e?.processor)).length||!(!e.definition.if||"object"!=typeof e.definition.if)},init:async function(e){const{node:t}=e,o=Object.keys(t.definition).map((e=>I({expression:e}))),n=[],i=o.find((e=>"if"===e?.processor));if(i){const e=t.definition[i.expression];n.push({name:`${t.name}_if`,definition:e,processor:i}),delete t.definition[i.expression]}else if(t.definition.if){const{condition:e,...o}=t.definition.if;n.push({name:`${t.name}_if`,definition:o,processor:{expression:`if::${e}`,statement:e}}),delete t.definition.if}const s=o.filter((e=>"elseif"===e?.processor));let r=0;for(const e of s){const o=t.definition[e.expression];n.push({name:`${t.name}_elseif_${r++}`,definition:o,processor:e}),delete t.definition[e.expression]}if(t.definition.elseif){const{condition:e,...o}=t.definition.elseif;n.push({name:`${t.name}_elseif_${r++}`,definition:o,processor:{expression:`elseif::${e}`,statement:e}}),delete t.definition.elseif}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 ge({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 me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var we={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 fe({node:e,initNode:t,extra:!1}),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=ge},resolve:ge};async function be({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var xe={hits:async function({node:e}){return e.definition.hasOwnProperty("assign")},init:async function({node:e,initNode:t}){e.type="assign",await fe({node:e,initNode:t}),e.resolve=be},resolve:be};async function ve({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 me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var je={hits:async function({node:e}){return e.definition.hasOwnProperty("for")},init:async function({node:e,initNode:t}){if(e.type="for",await fe({node:e,initNode:t,extra:!1}),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=ve},resolve:ve};var ke={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 De({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 _e={hits:async function({node:e}){return e.definition.hasOwnProperty("raise")},init:async function({node:e,initNode:t}){e.type="raise",e.resolve=De},resolve:De};async function Se({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 Ee={hits:async function({node:e}){return e.definition.hasOwnProperty("return")},init:async function({node:e,initNode:t}){e.type="return",e.resolve=Se},resolve:Se};async function $e({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;let s=i.from||i.import||i.call;if("function"===e.target?.atom?.doc?.type)Reflect.has(i,"from")?(s=i.from,i.from=await n(e.target.atom.name)):Reflect.has(i,"import")?(s=i.import,i.import=await n(e.target.atom.name)):Reflect.has(i,"call")&&(i.call=await n(e.target.atom.name),s=i.call);else if((Reflect.has(i,"from")||Reflect.has(i,"import"))&&i.call.startsWith("use:e::")){const e=i.call.substring(7);i.libExp=await n(`e::LIBRARY.${e}`)}if(i.args&&(i.args=await n(i.args)),i.new&&(i.new=await n(i.new)),i.context&&(i.context=await n(i.context)),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 r=e.workflow.parent;e.context.lib=r.context.libs.find((e=>e.name===s)),await me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Pe={hits:async function({node:e}){return e.definition.hasOwnProperty("call")},init:async function({node:e,initNode:t}){e.type="call",await fe({node:e,initNode:t}),e.resolve=$e},resolve:$e};async function Ne({node:e,transformExpression:t}){e.context.next=e.childs[0],e.context.transform=e.context.transform||w(e.definition),await me({node:e,transformExpression:t})}var Te={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 Ce({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 me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Fe={hits:async function({node:e}){return e.definition.hasOwnProperty("form")},init:async function({node:e,initNode:t}){e.type="form",await fe({node:e,initNode:t}),e.resolve=Ce},resolve:Ce};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}),o({node:e})}var Ae={hits:async function({node:e}){return e.definition.hasOwnProperty("signal")},init:async function({node:e,initNode:t}){e.type="signal",e.resolve=Ie},resolve:Ie};async function Oe({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n,transformValue:i}){e.context.transform=e.context.transform||w(e.definition),await t({node:e}),o({node:e})}var Be={hits:async function({node:e}){return e.definition.hasOwnProperty("wait")},init:async function({node:e,initNode:t}){e.type="wait",e.resolve=Oe},resolve:Oe};async function Re({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 me({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="next",e.resolve=Re},resolve:Re};async function Me({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),e.context.transform,await me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Le={hits:async function({node:e}){return e.definition.hasOwnProperty("modules")},init:async function({node:e,initNode:t}){e.type="modules",await fe({node:e,initNode:t}),e.resolve=Me},resolve:Me};function Je({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 We{#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 Pe.init(e)}}function ze(e){return new We(e)}async function Ge({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition);const i=e.context.transform;let s=i.from||i.import;if("function"===e.target?.atom?.doc?.type&&(Reflect.has(i,"from")?(s=i.from,i.from=await n(e.target.atom.name)):Reflect.has(i,"import")&&(s=i.import,i.import=await n(e.target.atom.name))),i.args&&(i.args=await n(i.args)),i.new&&(i.new=await n(i.new)),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 r=e.workflow.parent;e.context.lib=r.context.libs.find((e=>e.name===s)),await me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var Ue={hits:async function({node:e}){return e.definition.hasOwnProperty("new")},init:async function({node:e,initNode:t}){e.type="new",await fe({node:e,initNode:t}),e.resolve=Ge},resolve:Ge};async function Ve({node:e,resolveTypeCommon:t,resolveNextBlock:o,transformExpression:n}){e.context.transform=e.context.transform||w(e.definition),await me({node:e,transformExpression:n}),await t({node:e}),o({node:e})}var qe={hits:async function({node:e}){return e.definition.hasOwnProperty("output")},init:async function({node:e,initNode:t}){e.type="output",await fe({node:e,initNode:t}),e.resolve=Ve},resolve:Ve};class Xe{#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 Z,this.#s=e,this.#l=[],this.#p=[],this.#d={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#_.push(ze({key:"config",npm:"@fnet/config",master:"name"})),this.#_.push(ze({key:"yaml",npm:"@fnet/yaml",master:"file"})),this.#_.push(ze({key:"prompt",npm:"@fnet/prompt",master:"message"})),this.#_.push(ze({key:"html-link",npm:"@flownet/lib-load-browser-link-url",master:"src"})),this.#_.push(ze({key:"html-script",npm:"@flownet/lib-load-browser-script-url",master:"src"})),this.#_.push(ze({key:"http-server",npm:"@fnet/node-express",master:"server_port"})),this.#_.push(ze({key:"shell",npm:"@fnet/shell-flow",master:"commands"})),this.#_.push(ze({key:"list-files",npm:"@fnet/list-files",master:"pattern"})),this.#_.push(ze({key:"up-list-files",npm:"@fnet/up-list-files",master:"pattern"})),this.#_.push(ze({key:"auto-conda-env",npm:"@fnet/auto-conda-env",master:"envDir"})),this.#_.push(ze({key:"ollama-chat",npm:"@fnet/ollama-chat",master:"model"})),this.#_.push(ze({key:"ai",npm:"@fnet/ai",master:"prompt",extras:{subtype:"flow"}})),this.#_.push(ze({key:"invoke",npm:"@fnet/invoke",master:"method",extras:{}})),this.#_.push(ze({key:"fetch",npm:"@fnet/fetch",master:"url",extras:{}})),this.#_.push(ze({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:j,registerToPackageManager:this.registerToPackageManager.bind(this)},this.#D={initNode:this.initNode.bind(this),cloneDeep:w,resolveTypeCommon:this.resolveTypeCommon.bind(this),resolveNextBlock:Je,transformExpression:this.transformExpression.bind(this),transformValue:this.transformValue.bind(this)}}async _cache_set(e,t,o){}async init(){this.#u=this.#s.buildId||x(),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."});const e=this.#k.context.project;await this.initAuth(),await this.initWorkflow(),this.transformWorkflow({workflow:this.#a});const t=await this.initNodeTree({workflow:this.#a});await this.initNodeTreeIndex({root:t}),await this.initNodeCalls({root:t}),await this.initNodeCallLibs({root:t}),await this.initNodeForms({root:t}),await this.initNodeFormLibs({root:t}),await this.initEntryFiles({root:t,features:this.#r.doc.features}),await this.initFeaturesFromNodes({childs:t.childs,features:this.#r.doc.features}),await oe(this.#k),"bun"===e.runtime.type?await async function({atom:e,packageDependencies:t,packageDevDependencies:o,setProgress:n}){n("Initializing dependencies for Bun");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 _({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"}),t.push({package:"yargs-parser",version:"^22.0"}),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"})}(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 _({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"}),t.push({package:"yargs-parser",version:"^22.0"}),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:t.context.libs,packageDependencies:this.#l}),await this.resolveNodeTree({root:t}),this.#m=t}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 j.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(e){console.log("filePath",e),l.statSync(e).isDirectory()?(l.readdirSync(e).forEach((t=>{const o=i.join(e,t);this.#S(o)})),l.rmSync(e)):l.unlinkSync(e)}#E(e,t){const o=l.existsSync(e),n=o&&l.statSync(e);o&&n.isDirectory()?(l.mkdirSync(t,{recursive:!0}),l.readdirSync(e).forEach((o=>{this.#E(i.join(e,o),i.join(t,o))}))):l.copyFileSync(e,t)}async initWorkflowDir(){this.setProgress({message:"Initializing library directory."});const e=this.#s.projectDir,t=this.#s.coreDir;this.setProgress({message:"Cleaning project directory."});const o=A({dir:e,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const e of o)l.rmSync(e,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."}),l.existsSync(e)||l.mkdirSync(e,{recursive:!0});const n=i.join(e,"src");l.existsSync(n)||l.mkdirSync(n,{recursive:!0});const s=i.join(n,"core");this.#E(t,s);const r=i.join(n,"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 we.hits(t))await we.init(t);else if(await je.hits(t))await je.init(t);else if(await ye.hits(t))await ye.init(t);else if(await he.hits(t))await he.init(t);else if(await ke.hits(t))await ke.init(t);else if(await Pe.hits(t))await Pe.init(t);else if(await Ue.hits(t))await Ue.init(t);else if(await _e.hits(t))await _e.init(t);else if(await Fe.hits(t))await Fe.init(t);else if(await Ae.hits(t))await Ae.init(t);else if(await Be.hits(t))await Be.init(t);else if(await Te.hits(t))await Te.init(t);else if(await Ke.hits(t))await Ke.init(t);else if(await Le.hits(t))await Le.init(t);else if(await Ee.hits(t))await Ee.init(t);else if(this.#_.find((e=>e.hits(t))))await this.#_.find((e=>e.hits(t))).init(t);else if(await xe.hits(t))await xe.init(t);else{if(!await qe.hits(t))throw new Error("Undefined step type.");await qe.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:e,index:t}){const o=i.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const n=[];let s=e;for(;s?.parent;)n.push(s.index),s=s.parent;n.reverse(),e.codeKey=`B_${n.join("_")}_${e.type}`,e.pathKey=`${n.join(".")}`,e.typeId=x();for await(const o of e.childs)await this.initNodeIndex({node:o,index:t})}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&&"new"!==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.from||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.from||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:e,libRef:t}){const o=T({url:e});if(!o)throw new Error(`Invalid package name: ${e}`);if(o.protocol||(o.protocol=this.#h),"ac:"===o.protocol){const t=o.pathname.split("/");if(1===t.length)return await j.first({where:{name:e,parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===t.length){const e=await j.first({where:{name:t[0],parent_id:this.#g.env.ATOM_LIBRARIES_ID,type:"folder"}});return await j.first({where:{name:t[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===o.protocol){const e=i.resolve(this.#s.projectSrcDir,`${o.pathname}.js`),t=[],n=(await D({file:e,recursive:!0})).all;for await(const e of n){if("npm"!==e.type)continue;if(t.find((t=>t.package===e.package)))continue;const o=await ne({name:e.package,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});t.push({package:e.package,subpath:e.subpath,version:o.minorRange,type:"npm"})}return{name:o.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:t},protocol:o.protocol}}if("npm:"===o.protocol){const e=B({path:o.pathname}),n=await ne({name:e.package,subpath:e.subpath,projectDir:this.#s.projectDir,setProgress:this.#k.setProgress});return{name:o.pathname,doc:{type:"workflow.lib",subtype:"flow"===t?.definition?.subtype?"workflow":null,"content-type":"javascript",language:"js",dependencies:[{package:e.package,version:n.minorRange,type:"npm"}]},protocol:o.protocol}}if("node:"===o.protocol){return{name:o.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:[]},protocol:o.protocol}}if("use:"===o.protocol){return{name:o.pathname,doc:{type:"function",dependencies:[]},protocol:o.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("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:e}){await this.setProgress({message:"Creating external lib files."}),this.#r.typesDir="./types";const t=e.context.libs.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,n=this.#s.projectDir;if("local:"===o.protocol){const e=i.resolve(this.#s.projectSrcDir,`${o.fileName||o.name}.js`),t=i.relative(`${this.#s.projectDir}/src/default/blocks`,e);if(!l.existsSync(e)){l.mkdirSync(i.dirname(e),{recursive:!0});let t="export default async (input)=>{\n";t+="}",l.writeFileSync(e,t,"utf8")}o.relativePath=t.split(i.sep).join("/"),this.#r.typesDir=`./types/${i.basename(n)}/src`}else if("npm:"===o.protocol)o.relativePath=o.name;else if("node:"===o.protocol)o.relativePath=o.name;else if("use:"===o.protocol)console.log("USE:",o.name);else{const e=`${n}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;l.writeFileSync(i.normalize(e),t.content,"utf8")}}}async createEngine({root:e}){await this.setProgress({message:"Creating engine file."});const t=this.#s.templateDir,o=g.compile(l.readFileSync(i.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#c);for(let t=0;t<e.childs.length;t++){const n=e.childs[t];if(!n.entryFile)continue;const s=o.render({flow:n,ui:{package:"@fnet/react-app"}}),r=this.#s.projectDir,a=i.resolve(r,`src/default/${n.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:e}){const t=this.#s.templateDir,o=g.compile(l.readFileSync(i.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#c).render(e),n=this.#s.projectDir,s=i.resolve(n,`src/default/${e.codeKey}.js`);l.writeFileSync(s,o,"utf8");for await(const t of e.childs)await this.createType({node:t})}async createType({node:e}){switch(e.type){case"assign":case"steps":case"return":case"call":case"new":case"form":case"raise":case"switch":case"next":case"tryexcept":case"for":case"signal":case"wait":case"modules":case"output":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:e}){let t=this.#d[e.type];if(t)return t;const o=this.#s.templateDir;return t=g.compile(l.readFileSync(i.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#c),this.#d[e.type]=t,t}createStepFile({node:e}){const t=this.#s.projectDir,o=`${e.codeKey}.js`,n=i.resolve(t,`src/default/blocks/${o}`);l.writeFileSync(n,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=n}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=I({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=I({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}||flow.module?.${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 e="fnet.yaml",t=`Creating ${e}`;await this.setProgress({message:t});const{content:o,...n}=this.#r.doc,s=this.#s.projectDir,r=i.resolve(s,`${e}`);l.writeFileSync(r,h.stringify(n),"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setProgress({message:t});const o={content:h.stringify(this.#a)},n=this.#s.templateDir,s=g.compile(l.readFileSync(i.resolve(n,`${e}.njk`),"utf8"),this.#c).render(o),r=this.#s.projectDir,a=i.resolve(r,`${e}`);l.writeFileSync(a,s,"utf8")}async runPrettifier(){const e=this.#s.projectDir;if(G("bun")){const t=await u("prettier --write .",{cwd:i.resolve(e,"src")});if(0!==t.code)throw new Error(t.stderr)}else{const t=await u("prettier --write .",{cwd:i.resolve(e,"src")});if(0!==t.code)throw new Error(t.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 j.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 j.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 ie({...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 j.first({name:t.params.name,parent_id:this.#g.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await j.update(n,{id:n.id})):n=await j.create({parent_id:this.#g.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:o.version}]}})}async setProgress(e){const o="string"==typeof e?e:e?.message;console.log(t.blue(o)),await this._cache_set(this.#y,{status:"IN_PROGRESS",message:o})}async build(){if(this.#j&&!this.#b)return await this.createNetwork();try{const e=this.#j?await de({root:this.#m}):void 0;if(this.#b){const t=this.#k.context.project;if(await this.initWorkflowDir(),await this.initNunjucks(),this.#j){let t=this.#s.project?.projectDir||this.#s.projectDir;t=i.resolve(t,"fnet"),l.existsSync(t)&&(l.existsSync(i.resolve(t,"flow.bpmn"))&&l.unlinkSync(i.resolve(t,"flow.bpmn")),l.writeFileSync(i.resolve(t,"flows.bpmn"),e.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:e,context:t,setProgress:o,Atom:n}){const s="readme.md",r=`Creating ${s}`;if(await o({message:r}),t.project?.readme){const e=t.projectDir,o={content:t.project.readme.doc.content},n=i.resolve(t.project.projectDir,"fnet/how-to.md");if(l.existsSync(n)){const e=l.readFileSync(n,"utf8");o.howto=e}const r=i.resolve(t.project.projectDir,"fnet/input.yaml");if(l.existsSync(r)){const e=await y({file:r,tags:t.tags});o.input=e.content}const a=i.resolve(t.project.projectDir,"fnet/output.yaml");if(l.existsSync(a)){const e=await y({file:a,tags:t.tags});o.output=e.content}const c=t.templateDir,p=g.compile(l.readFileSync(i.resolve(c,`${s}.njk`),"utf8"),g.configure(c)).render(o),d=i.resolve(e,`${s}`);l.writeFileSync(d,p,"utf8")}else if(e.id){const o=await n.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:r,...a}=o.doc,c={content:r},p=t.templateDir,d=g.compile(l.readFileSync(i.resolve(p,`${s}.njk`),"utf8"),g.configure(p)).render(c),f=t.projectDir,m=i.resolve(f,`${s}`);l.writeFileSync(m,d,"utf8")}}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating tsconfig.json."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,"tsconfig.json.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,"tsconfig.json");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating .gitignore"});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,".gitignore.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,".gitignore");l.writeFileSync(p,a,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,njEnv:n}){if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating input args."});let s={};if(s=e.doc.input?e.doc.input:{type:"object",properties:{},required:[]},e.doc.features.cli.fargs&&!1!==e.doc.features.cli.fargs?.enabled){const t=e.doc.features.cli.fargs;Reflect.has(t,"default")&&t.default}const r={imports:[],atom:e},a=o.templateDir,c=g.compile(l.readFileSync(i.resolve(a,"src/default/input.args.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=i.resolve(p,"src/default/input.args.js");l.writeFileSync(d,c,"utf8");const f=new $({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});N(f);const m=f.compile(s),u=P(f,m)+"\nexport { schema31 as schema };";l.writeFileSync(i.resolve(p,"src/default/validate_input.js"),u,"utf8")}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=i.resolve(o.projectDir,"src/cli");l.existsSync(a)||l.mkdirSync(a,{recursive:!0}),await m({pattern:["index.js.njk"],dir:i.resolve(r,"src/cli"),outDir:a,context:s})}(this.#k),await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating app folder"});const s={atom:e,packageDependencies:n,ts:Date.now()},r=o.templateDir,a=i.resolve(o.projectDir,"src/app");l.existsSync(a)||l.mkdirSync(a,{recursive:!0});let c=["index.js.njk"];!1!==e.doc.features.app.html&&c.push("index.html.njk"),await m({pattern:c,dir:i.resolve(r,"src/app"),outDir:a,context:s})}(this.#k),"bun"===t.runtime.type?await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating build.js file."});const s={atom:e,packageDependencies:n},r=o.templateDir,a=g.compile(l.readFileSync(i.resolve(r,"build.js.njk"),"utf8"),g.configure(r)).render(s),c=o.projectDir,p=i.resolve(c,"build.js");l.writeFileSync(p,a,"utf8"),l.chmodSync(p,"755")}(this.#k):await async function({atom:e,setProgress:t,context:o,packageDependencies:n}){await t({message:"Creating rollup file."});const s={atom:e,packageDependencies:n},r=i.resolve(o.projectDir,"src","default/index.js");if(!l.existsSync(r))throw new Error(`Entry file not found: ${r}`);const a=(await D({file:r,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),c=e.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=o.templateDir;let f=g.compile(l.readFileSync(i.resolve(d,"rollup.config.mjs.njk"),"utf8"),g.configure(d)).render(s);const m=o.projectDir;let u=i.resolve(m,"rollup.config.mjs");l.writeFileSync(u,f,"utf8")}(this.#k),await async function({atom:e,context:t,packageDependencies:o,packageDevDependencies:n,setProgress:s}){await s({message:"Creating package.json."}),o.filter((e=>!0===e.dev)).forEach((e=>{n.find((t=>t.package===e.package))||n.push(e);const t=o.findIndex((t=>t.package===e.package));o.splice(t,1)}));const r=o.find((e=>"react"===e.package)),a=o.find((e=>"react-dom"===e.package));r&&!a?o.push({package:"react-dom",version:r.version}):r&&a&&(a.version=r.version),r&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.app.enabled&&c.push({file:i.resolve(t.projectDir,"src/app/index.js"),dev:!1!==e.doc.features.app.dev}),!0===e.doc.features.cli.enabled&&c.push({file:i.resolve(t.projectDir,"src/cli/index.js"),dev:!1!==e.doc.features.cli.dev});for await(const e of c){const i=e.file;if(!l.existsSync(i))throw new Error(`App file not found: ${i}`);const r=(await D({file:i,recursive:!0,verbose:!1})).all;for await(const i of r){if("npm"!==i.type)continue;if(o.find((e=>e.package===i.package)))continue;if(n.find((e=>e.package===i.package)))continue;const r=await ne({name:i.package,projectDir:t.projectDir,setProgress:s});(!0===e.dev?n:o).push({package:i.package,subpath:i.subpath,version:r.minorRange,type:"npm"})}}const p={atom:e,packageDependencies:o,packageDevDependencies:n},d=t.templateDir,f=g.compile(l.readFileSync(i.resolve(d,"package.json.njk"),"utf8"),g.configure(d)).render(p),m=t.projectDir,u=i.resolve(m,"package.json");l.writeFileSync(u,f,"utf8");const y=i.resolve(t.project.projectDir,"fnet");if(l.existsSync(y)){const e=i.resolve(t.projectDir,"fnet");l.existsSync(e)||l.mkdirSync(e);const o=l.readdirSync(y);for(const t of o){const o=i.resolve(y,t);if(!l.lstatSync(o).isFile())continue;const n=i.resolve(e,t);l.copyFileSync(o,n)}}}(this.#k),await async function({setProgress:e,context:t}){const o=t.projectDir;await e({message:"Prettifiying source files."});let n=i.join("src","**","*");if(G("bun")){const e=await u(`prettier --write ${n} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:o});if(0!==e.code)throw new Error(e.stderr)}else{const e=await u(`prettier --write ${n} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:o});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."}),G("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."}),G("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:e}})}catch(e){throw await this._cache_set(this.#y,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await de({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 He={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 H(e),o=new Xe(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)}}},Ye={command:"build:dev",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{e.dev=!0;const t=await H(e),o=new Xe(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 H({...e,mode:"all"}),o=new Xe(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)}}},Ze={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 H({...e,mode:"file"}),o=new Xe(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)}}},et={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 e=>{try{const t=await H(e),{project:o}=t,{projectDir:n,projectFileParsed:s}=o,r=s.input;if(!r)throw new Error("Config schema not found in project file.");if(!Reflect.has(e,"name")){const{inputName:t}=await R({type:"input",name:"inputName",message:"Input name:",initial:"dev"});e.name=t}const a=i.resolve(n,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=i.resolve(a,`${e.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 tt={promptForSelection:async function(e){const{items:o,message:n,nameField:i="name",valueField:s="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[s];return console.log(t.blue(`Only one option available: ${"string"==typeof e?e:e[i]}`)),n}let c=o.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[s],value:e[s],message:e[i]||e[s]}));a&&c.push({name:"cancel",value:null,message:t.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:n,choices:c,initial:l});return"cancel"===d?null:d},promptForMultipleSelection:async function(e){const{items:o,message:n,nameField:i="name",valueField:s="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[s],value:e[s],message:e[i]||e[s]})),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:n,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 ot=i.join(f.homedir(),".fnet","express");async function nt(e){e.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 e=>{await async function(e){try{l.existsSync(ot)||l.mkdirSync(ot,{recursive:!0});const o=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=i.join(ot,o);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let s,r=e.projectName,a=e.runtime;if(e.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(s=i.join(n,r),l.existsSync(s)){let e=1;for(;l.existsSync(i.join(n,`${r}-${e}`));)e++;r=`${r}-${e}`,s=i.join(n,r)}if(!e.yes){if(!(await R([{type:"confirm",name:"proceed",message:`Create express project "${r}" in ${s}?`,default:!0}])).proceed)return void console.log(t.yellow("Project creation cancelled."))}console.log(t.blue(`Creating express project "${r}" in ${s}...`));const p=i.dirname(s),d=["create","--name",i.basename(s)];d.push("--runtime",a),e.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(((o,n)=>{f.on("close",(i=>{0===i?(console.log(t.green(`\nExpress project "${r}" created successfully!`)),console.log(t.blue(`\nProject location: ${s}`)),e.yes?o():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 at(e)}catch(e){console.error(t.red(`Error opening IDE: ${e.message}`))}}(s)):(console.error(t.red(`\nFailed to create express project "${r}".`)),n(new Error(`Process exited with code ${i}`)))}))}))}catch(e){console.error(t.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(ot))return void console.log(t.yellow("No express projects found."));const o=l.readdirSync(ot).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(e.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=o.indexOf(e);if(-1===n)return void console.log(t.yellow("No express projects found for today."));o.splice(0,n),o.splice(1)}const n=[];e.type||e.all||(e.type="fnet");for(const t of o){const o=i.join(ot,t),s=l.readdirSync(o);for(const r of s){const s=i.join(o,r),a=l.statSync(s);let c="unknown";if(r.startsWith("fnode-")||l.existsSync(i.join(s,"fnode.yaml"))?c="fnode":(r.startsWith("fnet-")||l.existsSync(i.join(s,"fnet.yaml")))&&(c="fnet"),e.type&&c!==e.type)continue;if(e.name&&!r.includes(e.name))continue;const p=`${t.slice(0,4)}-${t.slice(4,6)}-${t.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(t.yellow("No express projects found matching the criteria."));console.log(t.blue("\nExpress Projects:"));const s=(await import("./index.-SGbq2cI.js")).default,r=["NAME","TYPE","DATE","PATH"],a=s.createTable(r,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let o=e.path;o.startsWith(f.homedir())&&(o="~"+o.substring(f.homedir().length)),a.push([t.white(e.name),"fnet"===e.type?t.cyan(e.type):"fnode"===e.type?t.green(e.type):e.type,e.date,o])}console.log(a.toString()),console.log(t.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(t.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(ot))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await it(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await st(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await rt();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(ot,e)}await at(o)}catch(e){console.error(t.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{const o=process.cwd();let n;if(o.includes(ot))n=o,console.log(t.blue(`Using current express project: ${i.basename(n)}`));else if(e.latest){if(n=await it(),!n)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(n=await st(e.projectName),!n)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await rt();if(!e)return void console.log(t.yellow("No project selected."));n=i.join(ot,e)}let s=e.destination;if(!s){s=(await R({type:"input",name:"destination",message:"Enter destination directory:",initial:i.join(process.cwd(),i.basename(n))})).destination}if(s.startsWith("~")&&(s=i.join(f.homedir(),s.slice(1))),s=i.resolve(s),s.startsWith(n+i.sep)||s===n)return void console.log(t.red("Destination cannot be inside the source directory."));if(l.existsSync(s)){if(!l.statSync(s).isDirectory())return void console.log(t.red(`Destination "${s}" is not a directory.`));if(l.readdirSync(s).length>0){if(!(await R({type:"confirm",name:"overwrite",message:`Destination "${s}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(t.yellow("Project move cancelled."))}}else l.mkdirSync(s,{recursive:!0});console.log(t.blue(`Moving project from ${n} to ${s}...`)),lt(n,s),console.log(t.green(`\nProject moved successfully to ${s}`));(await R({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(t.green("Original project deleted."))),await at(s)}catch(e){console.error(t.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(ot))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await it(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await st(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await rt();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(ot,e)}const n=i.basename(o);if(!e.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(t.yellow("Project removal cancelled."))}console.log(t.blue(`Removing project "${n}"...`)),l.rmSync(o,{recursive:!0,force:!0}),console.log(t.green(`Project "${n}" removed successfully.`))}catch(e){console.error(t.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(ot))return void console.log(t.yellow("No express projects found."));let o;if(e.latest){if(o=await it(),!o)return void console.log(t.yellow("No express projects found."))}else if(e.projectName){if(o=await st(e.projectName),!o)return void console.log(t.yellow(`Project "${e.projectName}" not found.`))}else{const e=await rt();if(!e)return void console.log(t.yellow("No project selected."));o=i.join(ot,e)}console.log(t.blue(`Entering project directory: ${o}`)),console.log(t.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",s=c(n,[],{stdio:"inherit",cwd:o,shell:!0});return new Promise((e=>{s.on("close",(()=>{console.log(t.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(t.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(e)})).demandCommand(1,"You need to specify a command").help()}async function it(){const e=l.readdirSync(ot).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));if(0===e.length)return null;const t=e[0],o=i.join(ot,t),n=l.readdirSync(o);if(0===n.length)return null;let s=null,r=0;for(const e of n){const t=i.join(o,e),n=l.statSync(t);n.birthtimeMs>r&&(r=n.birthtimeMs,s=t)}return s}async function st(e){const o=l.readdirSync(ot).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const n of o){const o=i.join(ot,n),s=l.readdirSync(o);if(s.includes(e))return i.join(o,e);const r=s.filter((t=>t.includes(e)));if(r.length>0){if(1===r.length)return i.join(o,r[0]);{const s=r.map((e=>({name:i.join(o,e),value:i.join(o,e),message:`${e} (${n})`}))),a=await tt.promptForSelection({items:s,message:`Multiple projects match "${e}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(t.yellow("Operation cancelled.")),null):a}}}return null}async function rt(){const e=[],o=l.readdirSync(ot).filter((e=>/^\d{8}$/.test(e))).sort(((e,t)=>t.localeCompare(e)));for(const t of o){const o=i.join(ot,t),n=l.readdirSync(o);for(const s of n){const n=i.join(o,s),r=l.statSync(n),a=`${t}/${s}`;e.push({name:a,value:a,created:r.birthtime})}}if(e.sort(((e,t)=>t.created-e.created)),0===e.length)return null;const n=await tt.promptForSelection({items:e,message:"Select a project:",nameField:"value",valueField:"value",allowAbort:!0});return null===n?(console.log(t.yellow("Operation cancelled.")),null):n}async function at(e){const o=await ct("code --version"),n=await ct("code-insiders --version");let i=null;if(o&&n){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"}]});i=e.ide}else if(o)i="code";else{if(!n)return console.log(t.yellow("No supported IDE found. Please open the project manually.")),void console.log(t.blue(`Project path: ${e}`));i="code-insiders"}console.log(t.blue(`Opening project in ${i}...`)),console.log(t.blue(`Project path: ${e}`));const s=c(i,[e],{stdio:"inherit",shell:!0});return new Promise(((e,o)=>{s.on("close",(n=>{0===n?(console.log(t.green(`Project opened in ${i}.`)),e()):(console.error(t.red(`Failed to open project in ${i}.`)),o(new Error(`Process exited with code ${n}`)))}))}))}async function ct(e){return new Promise((t=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{t(0===e)}))}))}function lt(e,t){l.existsSync(t)||l.mkdirSync(t,{recursive:!0});const o=l.readdirSync(e,{withFileTypes:!0});for(const n of o){const o=i.join(e,n.name),s=i.join(t,n.name);if(n.isDirectory()){if(".git"===n.name||".workspace"===n.name)continue;lt(o,s)}else l.copyFileSync(o,s)}}const pt=i.dirname(a(import.meta.url));const dt=i.dirname(a(import.meta.url)),ft=process.cwd();process.on("uncaughtException",(e=>{M||(M=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{M||(M=!0,setTimeout((()=>process.exit(1)),500))})),function(){d({name:["redis"],dir:ft,optional:!0});const e=function({baseDir:e}){let t=e=e||pt;for(;t!==i.parse(t).root;){const e=i.join(t,"node_modules");if(l.existsSync(e))return e;t=i.dirname(t)}return null}({baseDir:dt}),t="win32"===process.platform?";":":";e&&(process.env.PATH=`${i.join(e,"/.bin")}${t}${process.env.PATH}`)}(),async function(){try{let o=e(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(X).command(Q).command(He).command(Ye).command(Qe).command(Ze).command(et).command("express","Create and manage express projects",nt);o=W(o,{bin:"npm"}),o=W(o,{bin:"node"}),o=W(o,{bin:"bun"}),o=W(o,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),o=W(o,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),o=W(o,{name:"app",bin:"bun",preArgs:["run","app","--"]}),o=W(o,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),o=W(o,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"]}),o=W(o,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"]}),o=W(o,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"]}),o=W(o,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"]}),o=W(o,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),o=function(e,{name:o}){return e.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 e=>{try{const o=await z(e),{projectDir:n}=o;console.log(t.blue("Compiling project..."));const s=i.join(n,".bin");l.existsSync(s)||l.mkdirSync(s,{recursive:!0});const r=i.basename(i.dirname(n)),a=o.project?.projectFileParsed?.features?.cli?.bin,c=e.name||a||r;console.log(t.blue(`Using binary name: ${c}`));const p=i.join(s,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(t.green(`Binary compiled successfully: ${p}`)),console.log(t.blue("Installing binary..."));const m=["install",p];e.name&&m.push("--name",e.name),e.force&&m.push("--force"),e.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(t.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(o,{name:"install"}),o=W(o,{bin:"npx"}),o=W(o,{bin:"cdk"}),o=W(o,{bin:"aws"}),o=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 z(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);J(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)}}))}(o,{name:"with"}),o=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)}}))}(o,{name:"run",projectType:"fnet"}),o.demandCommand(1,"You need at least one command before moving on").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)}));export{q as r,G as w};
@@ -1 +1 @@
1
- import e from"node:fs";import t from"node:path";import i from"node:os";import a from"@fnet/list-files";import{B as s,c as n,a as r}from"./index.BTXKZRR5.js";import o from"@flownet/lib-render-templates-dir";import c from"@fnet/auto-conda-env";import"node:crypto";import"yaml";import"nunjucks";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";class p extends s{async initRuntime(){await async function(e){const{atom:t,context:i,setProgress:a}=e;a("Initializing features..."),t.doc.features=t.doc.features||{};const s=t.doc.features;!1===s.cli?s.cli={enabled:!1}:(s.cli,s.cli={enabled:!0}),s.cli.enabled=!0===s.cli.enabled&&(!1===t.doc.features.form_enabled||!0===s.cli.extend||!0===s.cli.enabled)}(this.apiContext),await async function({atom:e,packageDependencies:t,packageDevDependencies:i,setProgress:a}){a("Initializing dependencies")}(this.apiContext),await this.initLibraryDirPython(),await this.initNunjucks(),await this.initLibsPython()}async initLibraryDirPython(){this.setProgress({message:"Initializing library directory."});const s=this.context.projectDir;this.setProgress({message:"Cleaning project directory."});const n=a({dir:s,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const t of n)e.rmSync(t,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."});let r=s;e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src"),e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src","default");const o=this.context.projectSrcDir;if(!e.existsSync(r))try{"win32"===i.platform()?e.symlinkSync(o,r,"junction"):e.symlinkSync(o,r,"dir")}catch(e){throw new Error(`Couldn't create symlink. Error: ${e.message}`)}}async initLibsPython(){this.setProgress({message:"Initializing external libs."});const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id,atom:e}];this.libs=t}async createAtomLibFilesPython({libs:i}){await this.setProgress({message:"Creating external lib files."});const a=i.filter((e=>"atom"===e.type));for(let i=0;i<a.length;i++){const s=a[i].atom;if("local:"===s.protocol){const i=t.resolve(this.context.projectSrcDir,`${s.fileName||s.name}.py`);if(!e.existsSync(i)){e.mkdirSync(t.dirname(i),{recursive:!0});let a="def default():\n";a+=' print("Hello world!")\n',e.writeFileSync(i,a,"utf8")}}}}async build(){try{this.fileMode&&(await this.createAtomLibFilesPython({libs:this.libs}),await this.createProjectYaml(),await n(this.apiContext),await r(this.apiContext),await async function({atom:i,setProgress:a,context:s,packageDependencies:n}){if(!0!==i.doc.features.cli.enabled)return;await a({message:"Creating cli."});const r={atom:i,packageDependencies:n},c=s.templateDir,p=t.join(s.projectDir,"src","cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await o({pattern:["index.py.njk","__init__.py.njk"],dir:t.join(c,"src","cli"),outDir:p,context:r})}(this.apiContext),this.buildMode&&(await async function(e){const{setProgress:i,atom:a,context:s}=e;i({message:"Installing Python packages"});const n=s.projectDir,r=await c({pythonVersion:"3.12",packages:[{package:"fnet-import-parser",version:"0.1.9"}]}),{errors:p,result:l}=await r.runBin("fnet_import_parser",["--entry_file",t.join(n,"src","default","index.py")],{captureName:"result"});if(p)throw new Error(p.format());const d=JSON.parse(l.items[0].stdout),m=d.required["third-party"]?.map((e=>({package:e.metadata?.package||e.path,version:e.metadata?.version||void 0,channel:e.metadata?.channel||void 0})))||[],y=a.doc.dependencies||[];for(const e of m)y.some((t=>t.package===e.package))||y.push(e);const f=t.join(n,".conda"),h=await c({envDir:f,pythonVersion:a.doc.features.runtime.version||"3.12",packages:y});s.pythonEnv=h,e.packageDependencies=y;const u=a.doc.features.render?.dirs||[];for(const e of u)e.dir=t.resolve(n,e.dir),e.outDir=t.resolve(n,e.outDir),await o(e);let g={params:{}};g.params.package_name=a.doc.name,g.params.version="0.1.0",g.params.bin_name=a.doc.name,g.params.python_requires=a.doc.features.runtime.version||">=3.12",g.params.dependencies=y,g.params.scripts=JSON.stringify({cli:`PYTHONPATH='${t.join("src")}' '${t.relative(s.projectDir,h.pythonBin)}' '${t.join("src","cli","index.py")}'`}),await o({pattern:["setup.py.njk","package.json.njk","pyproject.toml.njk"],dir:s.templateDir,outDir:s.projectDir,context:g})}(this.apiContext),this.deployMode&&await this.deploy())),await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{p as default};
1
+ import e from"node:fs";import t from"node:path";import i from"node:os";import a from"@fnet/list-files";import{B as s,c as n,a as r}from"./index.BcGYSPne.js";import o from"@flownet/lib-render-templates-dir";import c from"@fnet/auto-conda-env";import"node:crypto";import"yaml";import"nunjucks";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";class p extends s{async initRuntime(){await async function(e){const{atom:t,context:i,setProgress:a}=e;a("Initializing features..."),t.doc.features=t.doc.features||{};const s=t.doc.features;!1===s.cli?s.cli={enabled:!1}:(s.cli,s.cli={enabled:!0}),s.cli.enabled=!0===s.cli.enabled&&(!1===t.doc.features.form_enabled||!0===s.cli.extend||!0===s.cli.enabled)}(this.apiContext),await async function({atom:e,packageDependencies:t,packageDevDependencies:i,setProgress:a}){a("Initializing dependencies")}(this.apiContext),await this.initLibraryDirPython(),await this.initNunjucks(),await this.initLibsPython()}async initLibraryDirPython(){this.setProgress({message:"Initializing library directory."});const s=this.context.projectDir;this.setProgress({message:"Cleaning project directory."});const n=a({dir:s,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const t of n)e.rmSync(t,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."});let r=s;e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src"),e.existsSync(r)||e.mkdirSync(r,{recursive:!0}),r=t.join(s,"src","default");const o=this.context.projectSrcDir;if(!e.existsSync(r))try{"win32"===i.platform()?e.symlinkSync(o,r,"junction"):e.symlinkSync(o,r,"dir")}catch(e){throw new Error(`Couldn't create symlink. Error: ${e.message}`)}}async initLibsPython(){this.setProgress({message:"Initializing external libs."});const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id,atom:e}];this.libs=t}async createAtomLibFilesPython({libs:i}){await this.setProgress({message:"Creating external lib files."});const a=i.filter((e=>"atom"===e.type));for(let i=0;i<a.length;i++){const s=a[i].atom;if("local:"===s.protocol){const i=t.resolve(this.context.projectSrcDir,`${s.fileName||s.name}.py`);if(!e.existsSync(i)){e.mkdirSync(t.dirname(i),{recursive:!0});let a="def default():\n";a+=' print("Hello world!")\n',e.writeFileSync(i,a,"utf8")}}}}async build(){try{this.fileMode&&(await this.createAtomLibFilesPython({libs:this.libs}),await this.createProjectYaml(),await n(this.apiContext),await r(this.apiContext),await async function({atom:i,setProgress:a,context:s,packageDependencies:n}){if(!0!==i.doc.features.cli.enabled)return;await a({message:"Creating cli."});const r={atom:i,packageDependencies:n},c=s.templateDir,p=t.join(s.projectDir,"src","cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await o({pattern:["index.py.njk","__init__.py.njk"],dir:t.join(c,"src","cli"),outDir:p,context:r})}(this.apiContext),this.buildMode&&(await async function(e){const{setProgress:i,atom:a,context:s}=e;i({message:"Installing Python packages"});const n=s.projectDir,r=await c({pythonVersion:"3.12",packages:[{package:"fnet-import-parser",version:"0.1.9"}]}),{errors:p,result:l}=await r.runBin("fnet_import_parser",["--entry_file",t.join(n,"src","default","index.py")],{captureName:"result"});if(p)throw new Error(p.format());const d=JSON.parse(l.items[0].stdout),m=d.required["third-party"]?.map((e=>({package:e.metadata?.package||e.path,version:e.metadata?.version||void 0,channel:e.metadata?.channel||void 0})))||[],y=a.doc.dependencies||[];for(const e of m)y.some((t=>t.package===e.package))||y.push(e);const f=t.join(n,".conda"),h=await c({envDir:f,pythonVersion:a.doc.features.runtime.version||"3.12",packages:y});s.pythonEnv=h,e.packageDependencies=y;const u=a.doc.features.render?.dirs||[];for(const e of u)e.dir=t.resolve(n,e.dir),e.outDir=t.resolve(n,e.outDir),await o(e);let g={params:{}};g.params.package_name=a.doc.name,g.params.version="0.1.0",g.params.bin_name=a.doc.name,g.params.python_requires=a.doc.features.runtime.version||">=3.12",g.params.dependencies=y,g.params.scripts=JSON.stringify({cli:`PYTHONPATH='${t.join("src")}' '${t.relative(s.projectDir,h.pythonBin)}' '${t.join("src","cli","index.py")}'`}),await o({pattern:["setup.py.njk","package.json.njk","pyproject.toml.njk"],dir:s.templateDir,outDir:s.projectDir,context:g})}(this.apiContext),this.deployMode&&await this.deploy())),await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{p as default};
@@ -1 +1 @@
1
- import e from"node:fs";import t from"node:path";import a from"nunjucks";import s from"@flownet/lib-parse-imports-js";import o from"@flownet/lib-parse-node-url";import{B as n,c as r,a as i}from"./index.BTXKZRR5.js";import p from"lodash.merge";import c from"@fnet/npm-list-versions";import l from"@flownet/lib-render-templates-dir";import u from"@fnet/npm-pick-versions";import d from"object-hash";import f from"ajv/dist/2020.js";import m from"ajv/dist/standalone/index.js";import g from"ajv-formats";import b from"@fnet/shelljs";import{w as h}from"./index.js";import"node:crypto";import"yaml";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"@fnet/list-files";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";import"yargs";import"node:util";import"tree-kill";import"node:url";import"node:child_process";import"node:os";import"@fnet/prompt";function y({feature:e,features:t,packageDevDependencies:a}){const{name:s,packages:o,options:n,extraCheck:r,explicit:i}=e,c=`${s}_enabled`,l=t.rollup_output||{},u=Object.keys(l);let d=n||{};const f=t[s]?.options;f&&(d=p(d,f));const m=!t[s]||!1===t[s]?.enabled;u.forEach((e=>{const a=t.rollup_output[e];if(a){if(Reflect.has(a,s)){if(m||!a[s]||!1===a[s]?.enabled)return void delete a[s];!0===a[s]&&(a[s]={enabled:!0,options:d})}else{if(m||i||!1===t[c])return;a[s]={enabled:!0}}a[s]=a[s]||{},a[s].options={...d,...a[s].options}}}));let g=u.some((e=>!0===t.rollup_output[e][s]?.enabled));r&&(g=r()&&g),t[c]=g,g&&o.forEach((e=>a.push({package:e[0],version:e[1]})))}function w({dir:a,name:s="index"}){let o=t.resolve(a,`./${s}.tsx`);if(e.existsSync(o)||(o=t.resolve(a,`./${s}.ts`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.jsx`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.js`)),!e.existsSync(o))return{};const n=o,r=t.extname(o);return{file:n,ext:r,ts:".ts"===r||".tsx"===r,name:s}}async function k(e){const{atom:a,context:o,setProgress:n}=e;n("Initializing features..."),a.doc.features=a.doc.features||{};const r=a.doc.features;r.project=r.project||{},r.project.format=r.project.format||r.project_format||"esm",r.project_format=r.project.format,r.dts_enabled=!0===r.dts||void 0!==r.dts&&!1!==r.dts;const i=t.resolve(o.project.projectDir),c=w({dir:t.resolve(i,"./app")});if(c.file){n("Parsing app entry imports...");let e=await s({file:c.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.app_uses_jsx=t,r.app_has_entry=!0,e=await s({file:c.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.app_entry_uses_jsx=t,r.app_entry_is_ts=c.ts,r.app_entry_ext=c.ext}const l=w({dir:t.resolve(i,"./cli")});if(l.file){n("Parsing cli entry imports...");let e=await s({file:l.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.cli_uses_jsx=t,r.cli_has_entry=!0,e=await s({file:l.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.cli_entry_uses_jsx=t,r.cli_entry_is_ts=l.ts,r.cli_entry_ext=l.ext}if("workflow.lib"===a.type){const e=w({dir:t.resolve(i,"./src")});if(e.file){n("Parsing src entry imports...");let t=await s({file:e.file,recursive:!0}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.src_uses_jsx=a,r.src_has_entry=!0,t=await s({file:e.file}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.src_entry_uses_jsx=a,r.src_entry_is_ts=e.ts,r.src_entry_ext=e.ext}}const u=Reflect.has(r,"app_entry_uses_jsx")?!0===r.app_entry_uses_jsx:!0===r.src_entry_uses_jsx,d=Reflect.has(r,"cli_entry_uses_jsx")?!0===r.cli_entry_uses_jsx:!0===r.src_entry_uses_jsx;r.form_enabled=u||d||!0===r.form||!0===r.form?.enabled,r.multiple_enabled=r.multiple_enabled||!0===r.multiple||!0===r.multiple?.enabled,!1===r.app?r.app={enabled:!1}:!0===r.app?r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u}:r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u,...r.app||{}},r.app.enabled=!0===r.app.enabled&&(!0===a.doc.features.form_enabled||!0===r.app.extend||!0===r.app.enabled),r.app.format=r.app.format||"esm",r.app.folder=r.app.folder||r.app.format||"default",!1===r.cli?r.cli={enabled:!1}:!0===r.cli?r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d}:r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d,...r.cli||{}},r.cli.enabled=!0===r.cli.enabled&&(!1===a.doc.features.form_enabled||!0===r.cli.extend||!0===r.cli.enabled),r.cli.format=r.cli.format||"esm",r.cli.folder=r.cli.folder||r.cli.folder||"esm",r.cli.node_options=r.cli.node?.options||r.cli.node_options||"",r.cli.bin=r.cli.bin||a.doc.name,r.cli.installable=!0===r.cli.installable,r.cli.enabled&&(a.doc["npm::bin"]=r.cli.bin),r.json=r.cli.enabled||r.json;const f={cjs:{format:"cjs",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!0,enabled:!1!==r.cjs,copy:!1},esm:{format:"esm",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!1,enabled:!1!==r.esm,copy:!0},iife:{format:"iife",context:r.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0===r.iife,terser:!0,copy:!1}};!0===r.webos&&(f.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===r.electron&&(f.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===r.nextjs&&(f.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===r.ios&&(f.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===r.macos&&(f.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===r.app.enabled&&(r.app.dir=`./dist/app/${r.app.folder}`,r.app.output={file:`./dist/app/${r.app.folder}/index.js`,dir:`./dist/app/${r.app.folder}/`,...r.app.output||{}},r.app.input={file:"./src/app/index.js",dir:"./src/app/",...r.app.input||{}},f.app={format:r.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:r.app.input.file,output_dir:r.app.dir,terser:!0,output_exports:!1===r.app.export?"none":"auto",browsersync:!0}),!0===r.cli.enabled&&(r.cli.dir=`./dist/cli/${r.cli.folder}`,r.cli.output={file:`./dist/cli/${r.cli.folder}/index.js`,dir:`./dist/cli/${r.cli.folder}/`,...r.cli.output||{}},r.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...r.cli.input||{}},f.cli={format:r.cli.format,context:"global",babel:!0===r.src_uses_jsx||!0===r.cli_uses_jsx||!1,browser:!1,replace:!0,enabled:!0,input:r.cli.input.file,output_dir:r.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===r.cli.export?"none":"auto"});const m={server:".",startPath:`${t.normalize(r.app.dir||".")}`,files:[t.normalize("./dist/**/*")],cors:!0,open:!1};r.babel_options=p({targets:{browsers:"last 9 versions, not dead",node:"18"}},r.babel_options||r.babel?.options),r.browsersync_options=p(m,r.browsersync_options||r.browsersync?.options||{}),r.replace_options=p({},r.replace_options||r.replace?.options||{}),Reflect.has(r.browsersync_options,"proxy")&&delete r.browsersync_options.server,r.rollup=r.rollup||{},r.rollup_output=p(f,r.rollup_output||r.rollup?.output||{}),r.preact_enabled=!0===r.preact||r.preact&&!1!==r.preact?.enabled;let g=Object.keys(f);for(const e of g){const t=f[e];t&&(!1!==r.rollup[e]?(t.babel_options=t.babel_options||r.babel_options,t.browsersync_options=p(r.browsersync_options,t.browsersync_options),t.replace_options=p(r.replace_options,t.replace_options),r.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"),(r.form_enabled||r.babel)&&(t.babel=!0)):delete r.rollup_output[e])}g=Object.keys(r.rollup_output),r.babel_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browser_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browsersync_enabled=!1!==r.browsersync&&g.some((e=>!0===r.rollup_output[e].browsersync)),r.browsersync_enabled=r.browsersync_enabled&&r.app.enabled,r.dependency_auto_enabled=!1!==r.dependency_auto&&!1!==r.dependency_auto?.enabled,r.npm_install_flags=r.npm_install_flags||"",r.react_version=r.react_version||r.react?.version||18,function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features,o=s.css&&!1!==s.css.enabled;let n=[];o&&(n.push(["rollup-plugin-postcss","^4"]),n.push(["sass","^1.66"]),(s.css?.options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":n.push(["postcss-import","^15"]);break;case"postcss-url":n.push(["postcss-url","^10"]);break;case"postcss-preset-env":n.push(["postcss-preset-env","^9"]);break;case"autoprefixer":n.push(["autoprefixer","^10"]);break;case"cssnano":n.push(["cssnano","^6"])}})));y({feature:{name:"css",packages:n},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;if("bun"===s.runtime.type)return;const o={};!0===s.app?.enabled&&(o.targets=o.targets||[],o.targets.push({src:"./src/app/index.html",dest:s.app.dir}),Reflect.has(s.app,"copy")||Reflect.has(s,"copy")||(s.copy=!0)),y({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:o},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;"bun"!==s.runtime.type&&y({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({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:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e)}async function v({projectDir:a,name:s,setProgress:o,count:n=1}){let r;const i=d(["npm-pick-versions",s,n]),p=t.join(a,".cache"),c=t.join(p,i+".json");return e.existsSync(c)?(o&&o(`Picking npm version of ${s} from cache ...`),r=JSON.parse(e.readFileSync(c,"utf8"))):(o&&o(`Picking npm version of ${s} ...`),r=await u({name:s,count:n}),e.mkdirSync(p,{recursive:!0}),e.writeFileSync(c,JSON.stringify(r),"utf8")),r}class _ extends n{async initRuntime(){await k(this.apiContext);"bun"===this.apiContext.context.project.runtime.type?await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies for Bun");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.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 a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"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"}),t.push({package:"yargs-parser",version:"^22.0"}),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&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}(this.apiContext):await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.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 a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"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"}),t.push({package:"yargs-parser",version:"^22.0"}),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&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"}),a.push({package:"@babel/core",version:"^7"}),a.push({package:"@rollup/plugin-commonjs",version:"^28"}),a.push({package:"@rollup/plugin-node-resolve",version:"^16"}),a.push({package:"@rollup/plugin-replace",version:"^6"}),a.push({package:"rollup",version:"^4"}),e.doc.features.dts_enabled&&a.push({package:"rollup-plugin-dts",version:"^6"}),a.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),a.push({package:"@rollup/plugin-alias",version:"^5"}),a.push({package:"fs-extra",version:"^11"}),e.doc.features.babel_enabled&&(a.push({package:"@rollup/plugin-babel",version:"^6"}),a.push({package:"@babel/preset-env",version:"^7"}),a.push({package:"@babel/preset-react",version:"^7"}),e.doc.features.babel?.options?.plugins?.forEach((e=>{switch(e[0]){case"@babel/plugin-proposal-decorators":a.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":a.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":a.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":a.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":a.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"})}}))),a.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),e.doc.features.browsersync_enabled&&a.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}(this.apiContext),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}async initLibs(){this.setProgress({message:"Initializing external libs."});const e=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id}];this.libs=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.apiContext.packageDependencies})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const a=e.filter((e=>"atom"===e.type));for(let e=0;e<a.length;e++){const s=a[e],o=await this.findAtomLibrary({url:s.name});s.atom=o;const n=o.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));n?.forEach((e=>{const a=t.find((t=>t.package===e.package));a?"string"==typeof e.path?(a.path||[]).some((t=>t===e.path))||(a.path=a.path||[],a.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(a.path||[]).some((t=>t===e))||(a.path=a.path||[],a.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const a=o({url:e});if(!a)throw new Error(`Invalid package name: ${e}`);if(a.protocol||(a.protocol=this.context.protocol),"ac:"===a.protocol){const t=a.pathname.split("/");if(1===t.length)return await this.apiContext.Atom.first({where:{name:e,parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===t.length){const e=await this.apiContext.Atom.first({where:{name:t[0],parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"folder"}});return await this.apiContext.Atom.first({where:{name:t[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===a.protocol){const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const a=t.resolve(this.context.projectSrcDir,"index.js"),o=await s({file:a,recursive:!0}),n=e.doc.dependencies,r=o.all;for await(const e of r){if("npm"!==e.type)continue;if(n.find((t=>t.package===e.package)))continue;const t=await v({name:e.package,projectDir:this.context.projectDir,setProgress:this.apiContext.setProgress});n.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:a}){await this.setProgress({message:"Creating external lib files."}),this.atom.typesDir="./types";const s=a.filter((e=>"atom"===e.type));for(let a=0;a<s.length;a++){const o=s[a].atom,n=this.context.projectDir;if("local:"===o.protocol){const a=t.resolve(this.context.projectSrcDir,`${o.fileName||o.name}.js`),s=t.relative(t.join(this.context.projectDir,"src","default"),a);if(!e.existsSync(a)){e.mkdirSync(t.dirname(a),{recursive:!0});let s="export default async (input)=>{\n";s+="}",e.writeFileSync(a,s,"utf8")}o.relativePath=s.split(t.sep).join("/"),this.atom.typesDir=`./types/${t.basename(n)}/src`}else{const a=t.join(n,"src","libs",`${o.id}.js`),s=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;e.writeFileSync(a,s.content,"utf8")}}}async createEngine(){await this.setProgress({message:"Creating engine file."});const s={libs:this.libs.filter((e=>"atom"===e.type)),libraryAtom:this.atom,atom:this.atom},o=this.context.templateDir,n=a.compile(e.readFileSync(t.resolve(o,t.join("src","default","engine.js.njk")),"utf8"),this.apiContext.njEnv).render(s),r=this.context.projectDir,i=t.resolve(r,t.join("src","default","index.js"));e.writeFileSync(i,n,"utf8")}async build(){try{if(this.fileMode){const o=this.apiContext.context.project;await this.createAtomLibFiles({libs:this.libs}),await this.createEngine(),await this.createProjectYaml(),await r(this.apiContext),await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating tsconfig.json."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"tsconfig.json.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"tsconfig.json");e.writeFileSync(u,c,"utf8")}(this.apiContext),await i(this.apiContext),await async function({atom:s,setProgress:o,context:n,njEnv:r}){if(!0!==s.doc.features.cli.enabled)return;await o({message:"Creating input args."});let i={};if(i=s.doc.input?s.doc.input:{type:"object",properties:{},required:[]},s.doc.features.cli.fargs&&!1!==s.doc.features.cli.fargs?.enabled){const e=s.doc.features.cli.fargs;Reflect.has(e,"default")&&e.default}const p={imports:[],atom:s},c=n.templateDir,l=a.compile(e.readFileSync(t.resolve(c,"src/default/input.args.js.njk"),"utf8"),r).render(p),u=n.projectDir,d=t.resolve(u,"src/default/input.args.js");e.writeFileSync(d,l,"utf8");const b=new f({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});g(b);const h=b.compile(i),y=m(b,h)+"\nexport { schema31 as schema };";e.writeFileSync(t.resolve(u,"src/default/validate_input.js"),y,"utf8")}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.cli.enabled)return;await s({message:"Creating cli."});const r={atom:a,packageDependencies:n},i=o.templateDir,p=t.resolve(o.projectDir,"src/cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await l({pattern:["index.js.njk"],dir:t.resolve(i,"src/cli"),outDir:p,context:r})}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.app.enabled)return;await s({message:"Creating app folder"});const r={atom:a,packageDependencies:n,ts:Date.now()},i=o.templateDir,p=t.resolve(o.projectDir,"src/app");e.existsSync(p)||e.mkdirSync(p,{recursive:!0});let c=["index.js.njk"];!1!==a.doc.features.app.html&&c.push("index.html.njk"),await l({pattern:c,dir:t.resolve(i,"src/app"),outDir:p,context:r})}(this.apiContext),"bun"===o.runtime.type?await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating build.js file."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"build.js.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"build.js");e.writeFileSync(u,c,"utf8"),e.chmodSync(u,"755")}(this.apiContext):await async function({atom:o,setProgress:n,context:r,packageDependencies:i}){await n({message:"Creating rollup file."});const p={atom:o,packageDependencies:i},c=t.resolve(r.projectDir,"src","default/index.js");if(!e.existsSync(c))throw new Error(`Entry file not found: ${c}`);const l=(await s({file:c,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),u=o.doc.features.rollup_output,d=Object.keys(u);for(let e=0;e<d.length;e++){const t=u[d[e]];if(!0===t.browser&&l.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(l.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<l.length;e++){const a=l[e];t.alias.entries[a]=`node:${a}`,t.alias.entries[`node:${a}`]=a}t.external_enabled=!0,t.external=t.external||[],t.external=t.external.concat(l)}}const f=r.templateDir;let m=a.compile(e.readFileSync(t.resolve(f,"rollup.config.mjs.njk"),"utf8"),a.configure(f)).render(p);const g=r.projectDir;let b=t.resolve(g,"rollup.config.mjs");e.writeFileSync(b,m,"utf8")}(this.apiContext),await async function({atom:o,context:n,packageDependencies:r,packageDevDependencies:i,setProgress:p}){await p({message:"Creating package.json."}),r.filter((e=>!0===e.dev)).forEach((e=>{i.find((t=>t.package===e.package))||i.push(e);const t=r.findIndex((t=>t.package===e.package));r.splice(t,1)}));const c=r.find((e=>"react"===e.package)),l=r.find((e=>"react-dom"===e.package));c&&!l?r.push({package:"react-dom",version:c.version}):c&&l&&(l.version=c.version),c&&o.doc.features.react_version>=17&&(r.find((e=>"@emotion/react"===e.package))||r.push({package:"@emotion/react",version:"^11"}),r.find((e=>"@emotion/styled"===e.package))||r.push({package:"@emotion/styled",version:"^11"}));const u=[];!0===o.doc.features.app.enabled&&u.push({file:t.resolve(n.projectDir,"src/app/index.js"),dev:!1!==o.doc.features.app.dev}),!0===o.doc.features.cli.enabled&&u.push({file:t.resolve(n.projectDir,"src/cli/index.js"),dev:!1!==o.doc.features.cli.dev});for await(const t of u){const a=t.file;if(!e.existsSync(a))throw new Error(`App file not found: ${a}`);const o=(await s({file:a,recursive:!0,verbose:!1})).all;for await(const e of o){if("npm"!==e.type)continue;if(r.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const a=await v({name:e.package,projectDir:n.projectDir,setProgress:p});(!0===t.dev?i:r).push({package:e.package,subpath:e.subpath,version:a.minorRange,type:"npm"})}}const d={atom:o,packageDependencies:r,packageDevDependencies:i},f=n.templateDir,m=a.compile(e.readFileSync(t.resolve(f,"package.json.njk"),"utf8"),a.configure(f)).render(d),g=n.projectDir,b=t.resolve(g,"package.json");e.writeFileSync(b,m,"utf8");const h=t.resolve(n.project.projectDir,"fnet");if(e.existsSync(h)){const a=t.resolve(n.projectDir,"fnet");e.existsSync(a)||e.mkdirSync(a);const s=e.readdirSync(h);for(const o of s){const s=t.resolve(h,o);if(!e.lstatSync(s).isFile())continue;const n=t.resolve(a,o);e.copyFileSync(s,n)}}}(this.apiContext),await async function({setProgress:e,context:a}){const s=a.projectDir;await e({message:"Prettifiying source files."});let o=t.join("src","**","*");if(h("bun")){const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}else{const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}}(this.apiContext),await async function({atom:e,setProgress:t,context:a}){if(!e.doc.features.dts_enabled)return;const s=a.projectDir;if(await t({message:"Creating .d.ts"}),0!==(await b("tsc",{cwd:s})).code)throw new Error("Couldnt create .d.ts files.")}(this.apiContext),this.buildMode&&(await async function({setProgress:e,atom:t,context:a}){const s=a.projectDir;if(await e({message:"Installing npm packages."}),h("bun")){if(0!==(await b(`bun install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}else if(0!==(await b(`npm install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}(this.apiContext),await async function({setProgress:e,context:t}){const a=t.projectDir;if(await e({message:"Building main project."}),h("bun")){if(0!==(await b(t.dev?"bun run build:dev":"bun run build",{cwd:a})).code)throw new Error("Couldnt build project.")}else if(0!==(await b(t.dev?"npm run build:dev":"npm run build",{cwd:a})).code)throw new Error("Couldnt build project.")}(this.apiContext),this.deployMode&&await this.deploy())}await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{_ as default};
1
+ import e from"node:fs";import t from"node:path";import a from"nunjucks";import s from"@flownet/lib-parse-imports-js";import o from"@flownet/lib-parse-node-url";import{B as n,c as r,a as i}from"./index.BcGYSPne.js";import p from"lodash.merge";import c from"@fnet/npm-list-versions";import l from"@flownet/lib-render-templates-dir";import u from"@fnet/npm-pick-versions";import d from"object-hash";import f from"ajv/dist/2020.js";import m from"ajv/dist/standalone/index.js";import g from"ajv-formats";import b from"@fnet/shelljs";import{w as h}from"./index.js";import"node:crypto";import"yaml";import"chalk";import"@flownet/lib-atom-api-js";import"@fnet/config";import"@fnet/list-files";import"redis";import"@flownet/lib-is-redis-online";import"@fnet/yaml";import"yargs";import"node:util";import"tree-kill";import"node:url";import"node:child_process";import"node:os";import"@fnet/prompt";function y({feature:e,features:t,packageDevDependencies:a}){const{name:s,packages:o,options:n,extraCheck:r,explicit:i}=e,c=`${s}_enabled`,l=t.rollup_output||{},u=Object.keys(l);let d=n||{};const f=t[s]?.options;f&&(d=p(d,f));const m=!t[s]||!1===t[s]?.enabled;u.forEach((e=>{const a=t.rollup_output[e];if(a){if(Reflect.has(a,s)){if(m||!a[s]||!1===a[s]?.enabled)return void delete a[s];!0===a[s]&&(a[s]={enabled:!0,options:d})}else{if(m||i||!1===t[c])return;a[s]={enabled:!0}}a[s]=a[s]||{},a[s].options={...d,...a[s].options}}}));let g=u.some((e=>!0===t.rollup_output[e][s]?.enabled));r&&(g=r()&&g),t[c]=g,g&&o.forEach((e=>a.push({package:e[0],version:e[1]})))}function w({dir:a,name:s="index"}){let o=t.resolve(a,`./${s}.tsx`);if(e.existsSync(o)||(o=t.resolve(a,`./${s}.ts`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.jsx`)),e.existsSync(o)||(o=t.resolve(a,`./${s}.js`)),!e.existsSync(o))return{};const n=o,r=t.extname(o);return{file:n,ext:r,ts:".ts"===r||".tsx"===r,name:s}}async function k(e){const{atom:a,context:o,setProgress:n}=e;n("Initializing features..."),a.doc.features=a.doc.features||{};const r=a.doc.features;r.project=r.project||{},r.project.format=r.project.format||r.project_format||"esm",r.project_format=r.project.format,r.dts_enabled=!0===r.dts||void 0!==r.dts&&!1!==r.dts;const i=t.resolve(o.project.projectDir),c=w({dir:t.resolve(i,"./app")});if(c.file){n("Parsing app entry imports...");let e=await s({file:c.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.app_uses_jsx=t,r.app_has_entry=!0,e=await s({file:c.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.app_entry_uses_jsx=t,r.app_entry_is_ts=c.ts,r.app_entry_ext=c.ext}const l=w({dir:t.resolve(i,"./cli")});if(l.file){n("Parsing cli entry imports...");let e=await s({file:l.file,recursive:!0}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.cli_uses_jsx=t,r.cli_has_entry=!0,e=await s({file:l.file}),t=e.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.cli_entry_uses_jsx=t,r.cli_entry_is_ts=l.ts,r.cli_entry_ext=l.ext}if("workflow.lib"===a.type){const e=w({dir:t.resolve(i,"./src")});if(e.file){n("Parsing src entry imports...");let t=await s({file:e.file,recursive:!0}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type));r.src_uses_jsx=a,r.src_has_entry=!0,t=await s({file:e.file}),a=t.all.some((e=>!0===e.usesJSX&&"local"===e.type)),r.src_entry_uses_jsx=a,r.src_entry_is_ts=e.ts,r.src_entry_ext=e.ext}}const u=Reflect.has(r,"app_entry_uses_jsx")?!0===r.app_entry_uses_jsx:!0===r.src_entry_uses_jsx,d=Reflect.has(r,"cli_entry_uses_jsx")?!0===r.cli_entry_uses_jsx:!0===r.src_entry_uses_jsx;r.form_enabled=u||d||!0===r.form||!0===r.form?.enabled,r.multiple_enabled=r.multiple_enabled||!0===r.multiple||!0===r.multiple?.enabled,!1===r.app?r.app={enabled:!1}:!0===r.app?r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u}:r.app={enabled:!0,extend:!0===r.app_has_entry,export:!0,react:u,...r.app||{}},r.app.enabled=!0===r.app.enabled&&(!0===a.doc.features.form_enabled||!0===r.app.extend||!0===r.app.enabled),r.app.format=r.app.format||"esm",r.app.folder=r.app.folder||r.app.format||"default",!1===r.cli?r.cli={enabled:!1}:!0===r.cli?r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d}:r.cli={enabled:!0,extend:!0===r.cli_has_entry,export:!0,react:d,...r.cli||{}},r.cli.enabled=!0===r.cli.enabled&&(!1===a.doc.features.form_enabled||!0===r.cli.extend||!0===r.cli.enabled),r.cli.format=r.cli.format||"esm",r.cli.folder=r.cli.folder||r.cli.folder||"esm",r.cli.node_options=r.cli.node?.options||r.cli.node_options||"",r.cli.bin=r.cli.bin||a.doc.name,r.cli.installable=!0===r.cli.installable,r.cli.enabled&&(a.doc["npm::bin"]=r.cli.bin),r.json=r.cli.enabled||r.json;const f={cjs:{format:"cjs",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!0,enabled:!1!==r.cjs,copy:!1},esm:{format:"esm",context:r.form_enabled?"window":"global",babel:!0===r.src_uses_jsx||!1,browser:!1,replace:!0,terser:!1,enabled:!1!==r.esm,copy:!0},iife:{format:"iife",context:r.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0===r.iife,terser:!0,copy:!1}};!0===r.webos&&(f.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===r.electron&&(f.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===r.nextjs&&(f.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===r.ios&&(f.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===r.macos&&(f.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===r.app.enabled&&(r.app.dir=`./dist/app/${r.app.folder}`,r.app.output={file:`./dist/app/${r.app.folder}/index.js`,dir:`./dist/app/${r.app.folder}/`,...r.app.output||{}},r.app.input={file:"./src/app/index.js",dir:"./src/app/",...r.app.input||{}},f.app={format:r.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:r.app.input.file,output_dir:r.app.dir,terser:!0,output_exports:!1===r.app.export?"none":"auto",browsersync:!0}),!0===r.cli.enabled&&(r.cli.dir=`./dist/cli/${r.cli.folder}`,r.cli.output={file:`./dist/cli/${r.cli.folder}/index.js`,dir:`./dist/cli/${r.cli.folder}/`,...r.cli.output||{}},r.cli.input={file:"./src/cli/index.js",dir:"./src/cli/",...r.cli.input||{}},f.cli={format:r.cli.format,context:"global",babel:!0===r.src_uses_jsx||!0===r.cli_uses_jsx||!1,browser:!1,replace:!0,enabled:!0,input:r.cli.input.file,output_dir:r.cli.dir,banner:"#!/usr/bin/env node",terser:!0,output_exports:!1===r.cli.export?"none":"auto"});const m={server:".",startPath:`${t.normalize(r.app.dir||".")}`,files:[t.normalize("./dist/**/*")],cors:!0,open:!1};r.babel_options=p({targets:{browsers:"last 9 versions, not dead",node:"18"}},r.babel_options||r.babel?.options),r.browsersync_options=p(m,r.browsersync_options||r.browsersync?.options||{}),r.replace_options=p({},r.replace_options||r.replace?.options||{}),Reflect.has(r.browsersync_options,"proxy")&&delete r.browsersync_options.server,r.rollup=r.rollup||{},r.rollup_output=p(f,r.rollup_output||r.rollup?.output||{}),r.preact_enabled=!0===r.preact||r.preact&&!1!==r.preact?.enabled;let g=Object.keys(f);for(const e of g){const t=f[e];t&&(!1!==r.rollup[e]?(t.babel_options=t.babel_options||r.babel_options,t.browsersync_options=p(r.browsersync_options,t.browsersync_options),t.replace_options=p(r.replace_options,t.replace_options),r.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"),(r.form_enabled||r.babel)&&(t.babel=!0)):delete r.rollup_output[e])}g=Object.keys(r.rollup_output),r.babel_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browser_enabled=g.some((e=>!0===r.rollup_output[e].babel)),r.browsersync_enabled=!1!==r.browsersync&&g.some((e=>!0===r.rollup_output[e].browsersync)),r.browsersync_enabled=r.browsersync_enabled&&r.app.enabled,r.dependency_auto_enabled=!1!==r.dependency_auto&&!1!==r.dependency_auto?.enabled,r.npm_install_flags=r.npm_install_flags||"",r.react_version=r.react_version||r.react?.version||18,function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features,o=s.css&&!1!==s.css.enabled;let n=[];o&&(n.push(["rollup-plugin-postcss","^4"]),n.push(["sass","^1.66"]),(s.css?.options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":n.push(["postcss-import","^15"]);break;case"postcss-url":n.push(["postcss-url","^10"]);break;case"postcss-preset-env":n.push(["postcss-preset-env","^9"]);break;case"autoprefixer":n.push(["autoprefixer","^10"]);break;case"cssnano":n.push(["cssnano","^6"])}})));y({feature:{name:"css",packages:n},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;if("bun"===s.runtime.type)return;const o={};!0===s.app?.enabled&&(o.targets=o.targets||[],o.targets.push({src:"./src/app/index.html",dest:s.app.dir}),Reflect.has(s.app,"copy")||Reflect.has(s,"copy")||(s.copy=!0)),y({feature:{name:"copy",packages:[["rollup-plugin-copy","^3"],["chokidar","^3"]],options:o},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"wasm",packages:[["@rollup/plugin-wasm","^6"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"terser",packages:[["@rollup/plugin-terser","^0.4"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e,s=t.doc.features;"bun"!==s.runtime.type&&y({feature:{name:"json",packages:[["@rollup/plugin-json","^6"]]},features:s,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"string",packages:[["rollup-plugin-string","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"image",packages:[["@rollup/plugin-image","^3"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"analyzer",packages:[["rollup-plugin-analyzer","^3"]],options:{summaryOnly:!0,limit:12},explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"visualizer",packages:[["rollup-plugin-visualizer","^5"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"polyfill",packages:[["rollup-plugin-node-polyfills","^0.2"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"nunjucks",packages:[["@fnet/rollup-plugin-nunjucks","0.1.8"]]},features:t.doc.features,packageDevDependencies:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({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:a})}(e),function(e){const{atom:t,packageDevDependencies:a}=e;y({feature:{name:"gzip",packages:[["rollup-plugin-gzip","^4"]],explicit:!0},features:t.doc.features,packageDevDependencies:a})}(e)}async function v({projectDir:a,name:s,setProgress:o,count:n=1}){let r;const i=d(["npm-pick-versions",s,n]),p=t.join(a,".cache"),c=t.join(p,i+".json");return e.existsSync(c)?(o&&o(`Picking npm version of ${s} from cache ...`),r=JSON.parse(e.readFileSync(c,"utf8"))):(o&&o(`Picking npm version of ${s} ...`),r=await u({name:s,count:n}),e.mkdirSync(p,{recursive:!0}),e.writeFileSync(c,JSON.stringify(r),"utf8")),r}class _ extends n{async initRuntime(){await k(this.apiContext);"bun"===this.apiContext.context.project.runtime.type?await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies for Bun");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.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 a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"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"}),t.push({package:"yargs-parser",version:"^22.0"}),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&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"})}(this.apiContext):await async function({atom:e,packageDependencies:t,packageDevDependencies:a,setProgress:s}){s("Initializing dependencies");const o=e.doc.dependencies||[];if(o.filter((e=>!e.dev)).forEach((e=>t.push(e))),o.filter((e=>e.dev)).forEach((e=>a.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 a="^18.2";s("Fetching React versions"),a=`^${(await c({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:a}),t.push({package:"react-dom",version:a}),"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"}),t.push({package:"yargs-parser",version:"^22.0"}),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&&a.push({package:"@flownet/lib-render-templates-dir",version:"0.1.19"}),a.push({package:"@babel/core",version:"^7"}),a.push({package:"@rollup/plugin-commonjs",version:"^28"}),a.push({package:"@rollup/plugin-node-resolve",version:"^16"}),a.push({package:"@rollup/plugin-replace",version:"^6"}),a.push({package:"rollup",version:"^4"}),e.doc.features.dts_enabled&&a.push({package:"rollup-plugin-dts",version:"^6"}),a.push({package:"rollup-plugin-peer-deps-external",version:"^2"}),a.push({package:"@rollup/plugin-alias",version:"^5"}),a.push({package:"fs-extra",version:"^11"}),e.doc.features.babel_enabled&&(a.push({package:"@rollup/plugin-babel",version:"^6"}),a.push({package:"@babel/preset-env",version:"^7"}),a.push({package:"@babel/preset-react",version:"^7"}),e.doc.features.babel?.options?.plugins?.forEach((e=>{switch(e[0]){case"@babel/plugin-proposal-decorators":a.push({package:"@babel/plugin-proposal-decorators",version:"^7"});break;case"@babel/plugin-proposal-class-properties":a.push({package:"@babel/plugin-proposal-class-properties",version:"^7"});break;case"@babel/plugin-proposal-private-methods":a.push({package:"@babel/plugin-proposal-private-methods",version:"^7"});break;case"@babel/plugin-proposal-private-property-in-object":a.push({package:"@babel/plugin-proposal-private-property-in-object",version:"^7"});break;case"@babel/plugin-proposal-optional-chaining":a.push({package:"@babel/plugin-proposal-optional-chaining",version:"^7"})}}))),a.push({package:"@fnet/rollup-plugin-delete",version:"0.1.10"}),e.doc.features.browsersync_enabled&&a.push({package:"@fnet/rollup-plugin-browsersync",version:"0.1.11"})}(this.apiContext),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}async initLibs(){this.setProgress({message:"Initializing external libs."});const e=[{name:this.atom.doc.name,type:"atom",parent_id:this.atom.parent_id}];this.libs=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.apiContext.packageDependencies})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const a=e.filter((e=>"atom"===e.type));for(let e=0;e<a.length;e++){const s=a[e],o=await this.findAtomLibrary({url:s.name});s.atom=o;const n=o.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));n?.forEach((e=>{const a=t.find((t=>t.package===e.package));a?"string"==typeof e.path?(a.path||[]).some((t=>t===e.path))||(a.path=a.path||[],a.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(a.path||[]).some((t=>t===e))||(a.path=a.path||[],a.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const a=o({url:e});if(!a)throw new Error(`Invalid package name: ${e}`);if(a.protocol||(a.protocol=this.context.protocol),"ac:"===a.protocol){const t=a.pathname.split("/");if(1===t.length)return await this.apiContext.Atom.first({where:{name:e,parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===t.length){const e=await this.apiContext.Atom.first({where:{name:t[0],parent_id:this.atomConfig.env.ATOM_LIBRARIES_ID,type:"folder"}});return await this.apiContext.Atom.first({where:{name:t[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===a.protocol){const e=this.atom;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const a=t.resolve(this.context.projectSrcDir,"index.js"),o=await s({file:a,recursive:!0}),n=e.doc.dependencies,r=o.all;for await(const e of r){if("npm"!==e.type)continue;if(n.find((t=>t.package===e.package)))continue;const t=await v({name:e.package,projectDir:this.context.projectDir,setProgress:this.apiContext.setProgress});n.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:a}){await this.setProgress({message:"Creating external lib files."}),this.atom.typesDir="./types";const s=a.filter((e=>"atom"===e.type));for(let a=0;a<s.length;a++){const o=s[a].atom,n=this.context.projectDir;if("local:"===o.protocol){const a=t.resolve(this.context.projectSrcDir,`${o.fileName||o.name}.js`),s=t.relative(t.join(this.context.projectDir,"src","default"),a);if(!e.existsSync(a)){e.mkdirSync(t.dirname(a),{recursive:!0});let s="export default async (input)=>{\n";s+="}",e.writeFileSync(a,s,"utf8")}o.relativePath=s.split(t.sep).join("/"),this.atom.typesDir=`./types/${t.basename(n)}/src`}else{const a=t.join(n,"src","libs",`${o.id}.js`),s=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;e.writeFileSync(a,s.content,"utf8")}}}async createEngine(){await this.setProgress({message:"Creating engine file."});const s={libs:this.libs.filter((e=>"atom"===e.type)),libraryAtom:this.atom,atom:this.atom},o=this.context.templateDir,n=a.compile(e.readFileSync(t.resolve(o,t.join("src","default","engine.js.njk")),"utf8"),this.apiContext.njEnv).render(s),r=this.context.projectDir,i=t.resolve(r,t.join("src","default","index.js"));e.writeFileSync(i,n,"utf8")}async build(){try{if(this.fileMode){const o=this.apiContext.context.project;await this.createAtomLibFiles({libs:this.libs}),await this.createEngine(),await this.createProjectYaml(),await r(this.apiContext),await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating tsconfig.json."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"tsconfig.json.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"tsconfig.json");e.writeFileSync(u,c,"utf8")}(this.apiContext),await i(this.apiContext),await async function({atom:s,setProgress:o,context:n,njEnv:r}){if(!0!==s.doc.features.cli.enabled)return;await o({message:"Creating input args."});let i={};if(i=s.doc.input?s.doc.input:{type:"object",properties:{},required:[]},s.doc.features.cli.fargs&&!1!==s.doc.features.cli.fargs?.enabled){const e=s.doc.features.cli.fargs;Reflect.has(e,"default")&&e.default}const p={imports:[],atom:s},c=n.templateDir,l=a.compile(e.readFileSync(t.resolve(c,"src/default/input.args.js.njk"),"utf8"),r).render(p),u=n.projectDir,d=t.resolve(u,"src/default/input.args.js");e.writeFileSync(d,l,"utf8");const b=new f({allErrors:!0,useDefaults:!0,formats:{},strict:!1,code:{esm:!0,lines:!0,optimize:!1,source:!0}});g(b);const h=b.compile(i),y=m(b,h)+"\nexport { schema31 as schema };";e.writeFileSync(t.resolve(u,"src/default/validate_input.js"),y,"utf8")}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.cli.enabled)return;await s({message:"Creating cli."});const r={atom:a,packageDependencies:n},i=o.templateDir,p=t.resolve(o.projectDir,"src/cli");e.existsSync(p)||e.mkdirSync(p,{recursive:!0}),await l({pattern:["index.js.njk"],dir:t.resolve(i,"src/cli"),outDir:p,context:r})}(this.apiContext),await async function({atom:a,setProgress:s,context:o,packageDependencies:n}){if(!0!==a.doc.features.app.enabled)return;await s({message:"Creating app folder"});const r={atom:a,packageDependencies:n,ts:Date.now()},i=o.templateDir,p=t.resolve(o.projectDir,"src/app");e.existsSync(p)||e.mkdirSync(p,{recursive:!0});let c=["index.js.njk"];!1!==a.doc.features.app.html&&c.push("index.html.njk"),await l({pattern:c,dir:t.resolve(i,"src/app"),outDir:p,context:r})}(this.apiContext),"bun"===o.runtime.type?await async function({atom:s,setProgress:o,context:n,packageDependencies:r}){await o({message:"Creating build.js file."});const i={atom:s,packageDependencies:r},p=n.templateDir,c=a.compile(e.readFileSync(t.resolve(p,"build.js.njk"),"utf8"),a.configure(p)).render(i),l=n.projectDir,u=t.resolve(l,"build.js");e.writeFileSync(u,c,"utf8"),e.chmodSync(u,"755")}(this.apiContext):await async function({atom:o,setProgress:n,context:r,packageDependencies:i}){await n({message:"Creating rollup file."});const p={atom:o,packageDependencies:i},c=t.resolve(r.projectDir,"src","default/index.js");if(!e.existsSync(c))throw new Error(`Entry file not found: ${c}`);const l=(await s({file:c,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),u=o.doc.features.rollup_output,d=Object.keys(u);for(let e=0;e<d.length;e++){const t=u[d[e]];if(!0===t.browser&&l.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(l.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<l.length;e++){const a=l[e];t.alias.entries[a]=`node:${a}`,t.alias.entries[`node:${a}`]=a}t.external_enabled=!0,t.external=t.external||[],t.external=t.external.concat(l)}}const f=r.templateDir;let m=a.compile(e.readFileSync(t.resolve(f,"rollup.config.mjs.njk"),"utf8"),a.configure(f)).render(p);const g=r.projectDir;let b=t.resolve(g,"rollup.config.mjs");e.writeFileSync(b,m,"utf8")}(this.apiContext),await async function({atom:o,context:n,packageDependencies:r,packageDevDependencies:i,setProgress:p}){await p({message:"Creating package.json."}),r.filter((e=>!0===e.dev)).forEach((e=>{i.find((t=>t.package===e.package))||i.push(e);const t=r.findIndex((t=>t.package===e.package));r.splice(t,1)}));const c=r.find((e=>"react"===e.package)),l=r.find((e=>"react-dom"===e.package));c&&!l?r.push({package:"react-dom",version:c.version}):c&&l&&(l.version=c.version),c&&o.doc.features.react_version>=17&&(r.find((e=>"@emotion/react"===e.package))||r.push({package:"@emotion/react",version:"^11"}),r.find((e=>"@emotion/styled"===e.package))||r.push({package:"@emotion/styled",version:"^11"}));const u=[];!0===o.doc.features.app.enabled&&u.push({file:t.resolve(n.projectDir,"src/app/index.js"),dev:!1!==o.doc.features.app.dev}),!0===o.doc.features.cli.enabled&&u.push({file:t.resolve(n.projectDir,"src/cli/index.js"),dev:!1!==o.doc.features.cli.dev});for await(const t of u){const a=t.file;if(!e.existsSync(a))throw new Error(`App file not found: ${a}`);const o=(await s({file:a,recursive:!0,verbose:!1})).all;for await(const e of o){if("npm"!==e.type)continue;if(r.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const a=await v({name:e.package,projectDir:n.projectDir,setProgress:p});(!0===t.dev?i:r).push({package:e.package,subpath:e.subpath,version:a.minorRange,type:"npm"})}}const d={atom:o,packageDependencies:r,packageDevDependencies:i},f=n.templateDir,m=a.compile(e.readFileSync(t.resolve(f,"package.json.njk"),"utf8"),a.configure(f)).render(d),g=n.projectDir,b=t.resolve(g,"package.json");e.writeFileSync(b,m,"utf8");const h=t.resolve(n.project.projectDir,"fnet");if(e.existsSync(h)){const a=t.resolve(n.projectDir,"fnet");e.existsSync(a)||e.mkdirSync(a);const s=e.readdirSync(h);for(const o of s){const s=t.resolve(h,o);if(!e.lstatSync(s).isFile())continue;const n=t.resolve(a,o);e.copyFileSync(s,n)}}}(this.apiContext),await async function({setProgress:e,context:a}){const s=a.projectDir;await e({message:"Prettifiying source files."});let o=t.join("src","**","*");if(h("bun")){const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}else{const e=await b(`prettier --write ${o} *.{js,cjs,mjs,json,yaml,html} --no-error-on-unmatched-pattern`,{cwd:s});if(0!==e.code)throw new Error(e.stderr)}}(this.apiContext),await async function({atom:e,setProgress:t,context:a}){if(!e.doc.features.dts_enabled)return;const s=a.projectDir;if(await t({message:"Creating .d.ts"}),0!==(await b("tsc",{cwd:s})).code)throw new Error("Couldnt create .d.ts files.")}(this.apiContext),this.buildMode&&(await async function({setProgress:e,atom:t,context:a}){const s=a.projectDir;if(await e({message:"Installing npm packages."}),h("bun")){if(0!==(await b(`bun install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}else if(0!==(await b(`npm install ${t.doc.features.npm_install_flags}`,{cwd:s})).code)throw new Error("Couldnt install npm packages.")}(this.apiContext),await async function({setProgress:e,context:t}){const a=t.projectDir;if(await e({message:"Building main project."}),h("bun")){if(0!==(await b(t.dev?"bun run build:dev":"bun run build",{cwd:a})).code)throw new Error("Couldnt build project.")}else if(0!==(await b(t.dev?"npm run build:dev":"npm run build",{cwd:a})).code)throw new Error("Couldnt build project.")}(this.apiContext),this.deployMode&&await this.deploy())}await this._cache_set(this.buildKey,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.buildKey,{status:"FAILED",message:e.message||e}),console.log(e),e}}}export{_ as default};
@@ -0,0 +1 @@
1
+ import e from"node:fs";import t from"node:path";import{randomUUID as i}from"node:crypto";import o from"yaml";import s from"nunjucks";import a from"chalk";import{Api as r,Atom as n}from"@flownet/lib-atom-api-js";import c from"@fnet/config";import d from"@fnet/list-files";import"redis";import"@flownet/lib-is-redis-online";import l from"@fnet/yaml";class p{init({config:e,accessToken:t}){return new Promise(((i,o)=>{if(r.set_api_url(e.data.url),t)return r.set_req_token(t),void i(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=>{r.set_req_token(e.access_token),i(e.access_token)})).catch((e=>{r.set_req_token(),o(e)}))}))}}var m=async e=>{const{atom:t,packageDependencies:i,context:o,deploymentProjectTarget:s,setProgress:a,deploymentProject:r,yamlTarget:n}=e;if(!0!==s.enabled)return;const c=s.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.N_a5FdgA.js")).default({...e});else if("gcs"===c)await(await import("./index.Bft2w7m3.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.D3p7pncT.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:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("webos"===c)await(await import("./index.CMC8mlye.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("electron"===c)await(await import("./index.xd8c7XMr.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("docker"===c)await(await import("./index.D2N9YZmA.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("ios"===c)await(await import("./index.B5XE4ChJ.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("macos"===c)await(await import("./index.W6RYgypK.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("rust"===c)await(await import("./index.CzAV0S36.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),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:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0}}catch(e){throw console.error(`Error during deployment for type "${c}":`,e),e}};class g{#e;#t;#i;#o;#s;#a;#r;#n;#c;#d;#l;#p;#m;#g;#h;#f;#y;constructor(e){this.#e=new p,this.#t=e,this.#a=[],this.#r=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#y={packageDependencies:this.#a,packageDevDependencies:this.#r,setProgress:this.setProgress.bind(this),context:this.#t,Atom:n,registerToPackageManager:this.registerToPackageManager.bind(this)}}get apiContext(){return this.#y}get context(){return this.#t}get atom(){return this.#i}get libs(){return this.#s}set libs(e){this.#s=e}get fileMode(){return this.#g}get buildMode(){return this.#h}get deployMode(){return this.#f}async _cache_set(e,t,i){}async initAuth(){this.#t.id&&(this.#n=await this.#e.init({config:this.#p}),this.#y.atomAccessToken=this.#n)}async initLibrary(){const e=this.#t.id;this.#i=this.#t.project?.libraryAtom||await n.get({id:e});let t=this.#i.doc.bundleName;t=t||(this.#i.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#i.doc.bundleName=t,this.#i.type=this.#i.type||"workflow.lib",this.#y.atom=this.#i}async initLibraryDir(){this.setProgress({message:"Initializing library directory."});const i=this.#t.projectDir;this.setProgress({message:"Cleaning project directory."});const o=d({dir:i,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const t of o)e.rmSync(t,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."});let s=i;e.existsSync(s)||e.mkdirSync(s,{recursive:!0}),s=t.join(i,"src"),e.existsSync(s)||e.mkdirSync(s,{recursive:!0}),s=t.join(i,"src","default"),e.existsSync(s)||e.mkdirSync(s,{recursive:!0})}async initNunjucks(){this.setProgress({message:"Initializing nunjucks."});const e=this.#t.templateDir;this.#o=s.configure(e,{watch:!1,dev:!0}),this.#y.njEnv=this.#o}async createProjectYaml(){const i="fnode.yaml",s=`Creating ${i}`;await this.setProgress({message:s});const{content:a,...r}=this.#i.doc,n=this.#t.projectDir,c=t.resolve(n,`${i}`);e.writeFileSync(c,o.stringify(r),"utf8")}async deploy(){if(await this.setProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&await i.save()}}else if(this.#i.id){const e=await n.list({type:"library.deploy",parent_id:this.#i.id});for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&(i=await n.update(i,{id:i.id}))}}}async deployProject(e){const{deploymentProject:t}=e,{yamlDocument:i}=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 o=Object.keys(t.doc||{}),s=i||{};for(let e=0;e<o.length;e++){const i=t.doc[o[e]];i.name=o[e];const a=s.get(o[e]);await m({...this.#y,deploymentProject:t,deploymentProjectTarget:i,yamlTarget:a})}}async registerToPackageManager(e){const{target:t,packageJSON:i}=e;if(!this.#t.id)return;let o=await n.first({name:t.params.name,parent_id:this.#p.env.ATOM_PACKAGES_ID});o?(o.doc.versions.splice(0,0,{v:i.version}),await n.update(o,{id:o.id})):o=await n.create({parent_id:this.#p.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:i.version}]}})}async setProgress(e){const t="string"==typeof e?e:e?.message;console.log(a.blue(t)),await this._cache_set(this.#d,{status:"IN_PROGRESS",message:t})}async init(){this.#c=this.#t.buildId||i(),this.#y.buildId=this.#c,this.#m=this.#t.mode,this.#g=["all","deploy","build","file"].includes(this.#m),this.#h=["all","deploy","build"].includes(this.#m),this.#f=["all","deploy"].includes(this.#m),this.#l=this.#t.protocol,this.#d="BUILD:"+this.#c,this.#p=(await c({optional:!0,name:this.#t.atomConfig||"atom",dir:this.#t.projectDir,tags:this.#t.tags}))?.data;try{await this.setProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await this.initRuntime()}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initRuntime(){throw new Error("initRuntime method must be implemented by runtime-specific builder")}async build(){throw new Error("build method must be implemented by runtime-specific builder")}}async function h({atom:i,setProgress:o,context:a,packageDependencies:r}){await o({message:"Creating .gitignore"});const n={atom:i,packageDependencies:r},c=a.templateDir,d=s.compile(e.readFileSync(t.resolve(c,".gitignore.njk"),"utf8"),s.configure(c)).render(n),l=a.projectDir,p=t.resolve(l,".gitignore");e.writeFileSync(p,d,"utf8")}async function f({atom:i,context:o,setProgress:a,Atom:r}){const n="readme.md",c=`Creating ${n}`;if(await a({message:c}),o.project?.readme){const i=o.projectDir,a={content:o.project.readme.doc.content},r=t.resolve(o.project.projectDir,"fnet/how-to.md");if(e.existsSync(r)){const t=e.readFileSync(r,"utf8");a.howto=t}const c=t.resolve(o.project.projectDir,"fnet/input.yaml");if(e.existsSync(c)){const e=await l({file:c,tags:o.tags});a.input=e.content}const d=t.resolve(o.project.projectDir,"fnet/output.yaml");if(e.existsSync(d)){const e=await l({file:d,tags:o.tags});a.output=e.content}const p=o.templateDir,m=s.compile(e.readFileSync(t.resolve(p,`${n}.njk`),"utf8"),s.configure(p)).render(a),g=t.resolve(i,`${n}`);e.writeFileSync(g,m,"utf8")}else if(i.id){const a=await r.first({type:"wiki",parent_id:i.id});if(!a||"markdown"!==a.doc?.["content-type"])return;const{content:c,...d}=a.doc,l={content:c},p=o.templateDir,m=s.compile(e.readFileSync(t.resolve(p,`${n}.njk`),"utf8"),s.configure(p)).render(l),g=o.projectDir,h=t.resolve(g,`${n}`);e.writeFileSync(h,m,"utf8")}}export{g as B,h as a,f as c};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- import e from"yargs";import o from"chalk";import{promisify as t}from"node:util";import n from"tree-kill";import r,{delimiter as i,join as s}from"node:path";import{fileURLToPath as a}from"node:url";import{spawn as c}from"node:child_process";import l,{existsSync as d}from"node:fs";import p from"@fnet/config";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";const j=t(n);let h=!1;async function b(e,o){if(h)return;if(h=!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 b(e,o)}))})),process.on("uncaughtException",(async o=>{await b(e)})),process.on("unhandledRejection",(async o=>{await b(e)})),e.on("close",(e=>{h||process.exit(e)}))}function x(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 S(e),{projectDir:i}=o,s=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,a=process.argv.slice(3).map(s),l={...process.env},d=r.join(i,"node_modules");l.NODE_PATH=d;const p=l.NODE_OPTIONS||"";l.NODE_OPTIONS=`${p} --preserve-symlinks`.trim();v(c(t,[...n,...a],{cwd:i,stdio:"inherit",shell:!0,detached:!0,env:l}))}catch(e){console.error(e.message),process.exit(1)}}))}function $(e,{name:o,bin:t,preArgs:n=[]}){return e.command(`${o||t} [commands..]`,`${t} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const i=await S(e),{projectDir:s}=i,a=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,l=process.argv.slice(3).map(a);t=r.join(s,".conda","bin",t||o);v(c(t,[...n,...l],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:s}}))}catch(e){console.error(e.message),process.exit(1)}}))}async function S(e){try{const o=process.argv[1].split("/").pop().split(".")[0];if("fnode"===o){const{createContext:o}=await Promise.resolve().then((function(){return C}));return o(e)}if("fnet"===o){const{createContext:o}=await import("./index.UNoFg95r.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 N=e=>{const o=process.env.PATH||"",t="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],n=o.split(i);for(const o of n)for(const n of t){const t=s(o,"win32"===process.platform?e+n:e);if(d(t))return t}return null};const P=r.dirname(a(import.meta.url)),D=process.cwd();function E(e){const o=r.resolve(D,e);if(l.existsSync(o))return o;const t=r.resolve(P,"../..",e);if(l.existsSync(t))return t;throw new Error(`Template path not found: ${e}`)}const I={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 e=>{try{const o=process.cwd(),t=E("./template/fnode/project"),n=r.resolve(o,e.name);l.existsSync(n)||l.mkdirSync(n),await u({dir:t,outDir:n,context:{name:e.name,runtime:e.runtime,platform:m.platform()},copyUnmatchedAlso:!0});let i=await f("fnode build",{cwd:n});if(0!==i.code)throw new Error("Failed to build project.");if(N("git")&&(i=await f("git init --initial-branch=main",{cwd:n}),0!==i.code))throw new Error("Failed to initialize git.");if(N("code")&&e.vscode&&(i=await f(`cd ${n} && 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(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:E("./template/fnode/node"),projectDir:r.resolve(process.cwd(),`./.output/${e.id}`),tags:e.ftag,dev:e.dev};try{const o=await async function({tags:e}){let o=function(e){const o=r.resolve(e,"node.yaml"),t=r.resolve(e,"fnode.yaml");if(l.existsSync(t))return t;if(l.existsSync(o))try{const n=l.readFileSync(o,"utf8");return l.writeFileSync(t,n,"utf8"),l.unlinkSync(o),console.log(`Migrated node.yaml to fnode.yaml in ${e}`),t}catch(e){return console.error(`Error migrating node.yaml to fnode.yaml: ${e.message}`),o}return t}(process.cwd());if(!l.existsSync(o))throw new Error("fnode.yaml file not found in current directory.");const{raw:t,parsed:n}=await y({file:o,tags:e}),i=r.dirname(o);n.features=n.features||{};const s=n.features;s.runtime=s.runtime||{},s.runtime.type=s.runtime.type||"node","python"===s.runtime.type?s.runtime.template=s.runtime.template||"python":(s.runtime.type,s.runtime.template=s.runtime.template||"node");const a={libraryAtom:{doc:{...n},fileName:"index"},projectDir:i,projectFilePath:o,projectFileContent:t,projectFileParsed:n,runtime:s.runtime};let c=r.resolve(i,"fnet/targets.yaml");if(!l.existsSync(c)&&(c=r.resolve(i,"node.devops.yaml"),l.existsSync(c))){const e=r.resolve(i,"fnet");l.existsSync(e)||l.mkdirSync(e),l.copyFileSync(c,r.resolve(i,"fnet/targets.yaml")),l.unlinkSync(c)}if(l.existsSync(c)){const{raw:o,parsed:t}=await y({file:c,tags:e}),n=g.parseDocument(o);a.devops={filePath:c,fileContent:o,yamlDocument:n,doc:{...t},type:"library.deploy",save:async()=>{l.writeFileSync(a.devops.filePath,n.toString())}}}const d=r.resolve(i,"readme.md");if(l.existsSync(d)){const e=l.readFileSync(d,"utf8");a.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}({tags:e.ftag}),t="bun"===o.runtime.type?"node":o.runtime.type;return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:E(`./template/fnode/${t}`),projectDir:r.resolve(o.projectDir,"./.workspace"),projectSrcDir:r.resolve(o.projectDir,"./src"),project:o,tags:e.ftag,dev:e.dev}}catch(o){return console.warn(`Warning: Could not load project: ${o.message}`),{projectDir:process.cwd(),tags:e.ftag}}}var C=Object.freeze({__proto__:null,createContext:F});const T={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=E("./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.BpWyDwfw.js")).default)(e)}const o=e.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(o))(e)}catch(e){throw new Error(`Failed to create builder for runtime '${o}': ${e.message}`)}}static async loadBuilderClass(e){switch(e.toLowerCase()){case"node":case"bun":return(await import("./index.BpWyDwfw.js")).default;case"python":return(await import("./index.e2SSlEgE.js")).default;default:throw new Error(`Unsupported runtime type: ${e}`)}}}const k={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)}}},B={command:"build:dev",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{e.dev=!0;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 e=>{try{const o=await F(e),{project:t}=o,{projectDir:n,projectFileParsed:i}=t,s=i.input;if(!s)throw new Error("Config schema not found in project file.");if(!Reflect.has(e,"name")){const{inputName:o}=await w({type:"input",name:"inputName",message:"Input name:",initial:"dev"});e.name=o}const a=r.resolve(n,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=r.resolve(a,`${e.name}.fnet`),d=l.existsSync(c),p=(await import("@fnet/object-from-schema")).default,m=await p({schema:s,format:"yaml",ref:d?c:void 0});l.writeFileSync(c,m)}catch(e){console.error(e.message),process.exit(1)}}};var W={promptForSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:i="name",initialValue:s=null,allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(o.yellow("No items available for selection.")),null;if(1===t.length&&!a){const e=t[0],n="string"==typeof e?e:e[i];return console.log(o.blue(`Only one option available: ${"string"==typeof e?e:e[r]}`)),n}let c=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[i],value:e[i],message:e[r]||e[i]}));a&&c.push({name:"cancel",value:null,message:o.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:n,choices:c,initial:l});return"cancel"===p?null:p},promptForMultipleSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:i="name",initialValues:s=[],allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(o.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[r]||e[i]})),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:n,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 _=r.join(m.homedir(),".fnet","express");async function U(e){e.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 e=>{await async function(e){try{l.existsSync(_)||l.mkdirSync(_,{recursive:!0});const t=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=r.join(_,t);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let i,s=e.projectName,a=e.runtime;if(e.yes){if(!s){const e=l.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}`}a||(a="node")}else{if(!s){const e=l.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=a||"node";a=(await w({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:e})).runtime}if(i=r.join(n,s),l.existsSync(i)){let e=1;for(;l.existsSync(r.join(n,`${s}-${e}`));)e++;s=`${s}-${e}`,i=r.join(n,s)}if(!e.yes){if(!(await w([{type:"confirm",name:"proceed",message:`Create express project "${s}" in ${i}?`,default:!0}])).proceed)return void console.log(o.yellow("Project creation cancelled."))}console.log(o.blue(`Creating express project "${s}" in ${i}...`));const d=r.dirname(i),p=["create","--name",r.basename(i)];p.push("--runtime",a),e.yes&&p.push("--yes"),l.existsSync(d)||l.mkdirSync(d,{recursive:!0});const m=c("fnode",p,{stdio:"inherit",shell:!0,cwd:d});return new Promise(((t,n)=>{m.on("close",(r=>{0===r?(console.log(o.green(`\nExpress project "${s}" created successfully!`)),console.log(o.blue(`\nProject location: ${i}`)),e.yes?t():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(o.red(`Error opening IDE: ${e.message}`))}}(i)):(console.error(o.red(`\nFailed to create express project "${s}".`)),n(new Error(`Process exited with code ${r}`)))}))}))}catch(e){console.error(o.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));const t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(e.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=t.indexOf(e);if(-1===n)return void console.log(o.yellow("No express projects found for today."));t.splice(0,n),t.splice(1)}const n=[];e.type||e.all||(e.type="fnode");for(const o of t){const t=r.join(_,o),i=l.readdirSync(t);for(const s of i){const i=r.join(t,s),a=l.statSync(i);let c="unknown";if(s.startsWith("fnode-")||l.existsSync(r.join(i,"fnode.yaml"))?c="fnode":(s.startsWith("fnet-")||l.existsSync(r.join(i,"fnet.yaml")))&&(c="fnet"),e.type&&c!==e.type)continue;if(e.name&&!s.includes(e.name))continue;const d=`${o.slice(0,4)}-${o.slice(4,6)}-${o.slice(6,8)}`;n.push({name:s,type:c,date:d,path:i,created:a.birthtime})}}if(n.sort(((e,o)=>o.created-e.created)),0===n.length)return void console.log(o.yellow("No express projects found matching the criteria."));console.log(o.blue("\nExpress Projects:"));const i=(await import("./index.-SGbq2cI.js")).default,s=["NAME","TYPE","DATE","PATH"],a=i.createTable(s,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let t=e.path;t.startsWith(m.homedir())&&(t="~"+t.substring(m.homedir().length)),a.push([o.white(e.name),"fnet"===e.type?o.cyan(e.type):"fnode"===e.type?o.green(e.type):e.type,e.date,t])}console.log(a.toString()),console.log(o.green("Projects: ")+o.yellow(n.filter((e=>"fnode"===e.type)).length+" fnode, ")+o.cyan(n.filter((e=>"fnet"===e.type)).length+" fnet")),console.log(o.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(o.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}await V(t)}catch(e){console.error(o.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{const t=process.cwd();let n;if(t.includes(_))n=t,console.log(o.blue(`Using current express project: ${r.basename(n)}`));else if(e.latest){if(n=await H(),!n)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(n=await G(e.projectName),!n)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));n=r.join(_,e)}let i=e.destination;if(!i){i=(await w({type:"input",name:"destination",message:"Enter destination directory:",initial:r.join(process.cwd(),r.basename(n))})).destination}if(i.startsWith("~")&&(i=r.join(m.homedir(),i.slice(1))),i=r.resolve(i),i.startsWith(n+r.sep)||i===n)return void console.log(o.red("Destination cannot be inside the source directory."));if(l.existsSync(i)){if(!l.statSync(i).isDirectory())return void console.log(o.red(`Destination "${i}" is not a directory.`));if(l.readdirSync(i).length>0){if(!(await w({type:"confirm",name:"overwrite",message:`Destination "${i}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(o.yellow("Project move cancelled."))}}else l.mkdirSync(i,{recursive:!0});console.log(o.blue(`Moving project from ${n} to ${i}...`)),z(n,i),console.log(o.green(`\nProject moved successfully to ${i}`));(await w({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(o.green("Original project deleted."))),await V(i)}catch(e){console.error(o.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}const n=r.basename(t);if(!e.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(o.yellow("Project removal cancelled."))}console.log(o.blue(`Removing project "${n}"...`)),l.rmSync(t,{recursive:!0,force:!0}),console.log(o.green(`Project "${n}" removed successfully.`))}catch(e){console.error(o.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}console.log(o.blue(`Entering project directory: ${t}`)),console.log(o.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",i=c(n,[],{stdio:"inherit",cwd:t,shell:!0});return new Promise((e=>{i.on("close",(()=>{console.log(o.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(o.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(e)})).demandCommand(1,"You need to specify a command").help()}async function H(){const e=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(0===e.length)return null;const o=e[0],t=r.join(_,o),n=l.readdirSync(t);if(0===n.length)return null;let i=null,s=0;for(const e of n){const o=r.join(t,e),n=l.statSync(o);n.birthtimeMs>s&&(s=n.birthtimeMs,i=o)}return i}async function G(e){const t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=r.join(_,n),i=l.readdirSync(t);if(i.includes(e))return r.join(t,e);const s=i.filter((o=>o.includes(e)));if(s.length>0){if(1===s.length)return r.join(t,s[0]);{const i=s.map((e=>({name:r.join(t,e),value:r.join(t,e),message:`${e} (${n})`}))),a=await W.promptForSelection({items:i,message:`Multiple projects match "${e}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(o.yellow("Operation cancelled.")),null):a}}}return null}async function L(){const e=[],t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const o of t){const t=r.join(_,o),n=l.readdirSync(t);for(const i of n){const n=r.join(t,i),s=l.statSync(n),a=`${o}/${i}`;e.push({name:a,value:a,message:`${i} (${o})`,created:s.birthtime})}}if(e.sort(((e,o)=>o.created-e.created)),0===e.length)return null;const n=await W.promptForSelection({items:e,message:"Select a project:",nameField:"message",valueField:"value",allowAbort:!0});return null===n?(console.log(o.yellow("Operation cancelled.")),null):n}async function V(e){const t=await Y("code --version"),n=await Y("code-insiders --version");let r=null;if(t&&n){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"}]});r=e.ide}else if(t)r="code";else{if(!n)return console.log(o.yellow("No supported IDE found. Please open the project manually.")),void console.log(o.blue(`Project path: ${e}`));r="code-insiders"}console.log(o.blue(`Opening project in ${r}...`)),console.log(o.blue(`Project path: ${e}`));const i=c(r,[e],{stdio:"inherit",shell:!0});return new Promise(((e,t)=>{i.on("close",(n=>{0===n?(console.log(o.green(`Project opened in ${r}.`)),e()):(console.error(o.red(`Failed to open project in ${r}.`)),t(new Error(`Process exited with code ${n}`)))}))}))}async function Y(e){return new Promise((o=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{o(0===e)}))}))}function z(e,o){l.existsSync(o)||l.mkdirSync(o,{recursive:!0});const t=l.readdirSync(e,{withFileTypes:!0});for(const n of t){const t=r.join(e,n.name),i=r.join(o,n.name);if(n.isDirectory()){if(".git"===n.name||".workspace"===n.name)continue;z(t,i)}else l.copyFileSync(t,i)}}const X=r.dirname(a(import.meta.url));const J=r.dirname(a(import.meta.url)),K=process.cwd();process.on("uncaughtException",(e=>{h||(h=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{h||(h=!0,setTimeout((()=>process.exit(1)),500))})),function(){p({name:["redis"],dir:K,optional:!0});const e=function({baseDir:e}){let o=e=e||X;for(;o!==r.parse(o).root;){const e=r.join(o,"node_modules");if(l.existsSync(e))return e;o=r.dirname(o)}return null}({baseDir:J}),o="win32"===process.platform?";":":";e&&(process.env.PATH=`${r.join(e,"/.bin")}${o}${process.env.PATH}`)}(),async function(){try{let t=e(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(I).command(T).command(k).command(B).command(O).command(M).command(R).command("express","Create and manage express projects",U);t=x(t,{bin:"npm"}),t=x(t,{bin:"node"}),t=x(t,{bin:"bun"}),t=x(t,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),t=x(t,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),t=x(t,{name:"app",bin:"bun",preArgs:["run","app","--"]}),t=x(t,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),t=x(t,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"]}),t=x(t,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"]}),t=x(t,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"]}),t=x(t,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"]}),t=x(t,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),t=function(e,{name:t}){return e.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 e=>{try{const t=await S(e),{projectDir:n}=t;console.log(o.blue("Compiling project..."));const i=r.join(n,".bin");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const s=r.basename(r.dirname(n)),a=t.project?.projectFileParsed?.features?.cli?.bin,c=e.name||a||s;console.log(o.blue(`Using binary name: ${c}`));const d=r.join(i,c),{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&&l.chmodSync(d,493),console.log(o.green(`Binary compiled successfully: ${d}`)),console.log(o.blue("Installing binary..."));const u=["install",d];e.name&&u.push("--name",e.name),e.force&&u.push("--force"),e.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(o.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(t,{name:"install"}),t=x(t,{bin:"npx"}),t=x(t,{bin:"cdk"}),t=x(t,{bin:"aws"}),t=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 S(e),{projectDir:n}=o,r=e.config,i=await p({name:r,dir:n,transferEnv:!1,optional:!0,tags:o.tags}),s=i?.data?.env||void 0,a=e.command,d=process.argv.slice(5);v(c(a,[...t,...d],{cwd:l.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...s}}))}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"with"}),t=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)}}))}(t,{name:"run",projectType:"fnode"}),t=$(t,{name:"python"}),t=$(t,{name:"python3"}),t=$(t,{name:"pip"}),t=$(t,{name:"pip3"}),t.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(o.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(o.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{E as r,N as w};
2
+ import e from"yargs";import o from"chalk";import{promisify as t}from"node:util";import n from"tree-kill";import r,{delimiter as i,join as s}from"node:path";import{fileURLToPath as a}from"node:url";import{spawn as c}from"node:child_process";import l,{existsSync as d}from"node:fs";import p from"@fnet/config";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";const j=t(n);let h=!1;async function b(e,o){if(h)return;if(h=!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 b(e,o)}))})),process.on("uncaughtException",(async o=>{await b(e)})),process.on("unhandledRejection",(async o=>{await b(e)})),e.on("close",(e=>{h||process.exit(e)}))}function x(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 S(e),{projectDir:i}=o,s=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,a=process.argv.slice(3).map(s),l={...process.env},d=r.join(i,"node_modules");l.NODE_PATH=d;const p=l.NODE_OPTIONS||"";l.NODE_OPTIONS=`${p} --preserve-symlinks`.trim();v(c(t,[...n,...a],{cwd:i,stdio:"inherit",shell:!0,detached:!0,env:l}))}catch(e){console.error(e.message),process.exit(1)}}))}function $(e,{name:o,bin:t,preArgs:n=[]}){return e.command(`${o||t} [commands..]`,`${t} ${n.join(" ")}`,(e=>e.help(!1).version(!1)),(async e=>{try{const i=await S(e),{projectDir:s}=i,a=e=>e.includes(" ")?"win32"===process.platform?`"${e.replace(/(["^])/g,"^$1")}"`:`"${e.replace(/(["\\$`])/g,"\\$1")}"`:e,l=process.argv.slice(3).map(a);t=r.join(s,".conda","bin",t||o);v(c(t,[...n,...l],{cwd:s,stdio:"inherit",shell:!0,detached:!0,env:{PYTHONPATH:s}}))}catch(e){console.error(e.message),process.exit(1)}}))}async function S(e){try{const o=process.argv[1].split("/").pop().split(".")[0];if("fnode"===o){const{createContext:o}=await Promise.resolve().then((function(){return C}));return o(e)}if("fnet"===o){const{createContext:o}=await import("./index.UNoFg95r.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 N=e=>{const o=process.env.PATH||"",t="win32"===process.platform?(process.env.PATHEXT||".EXE;.CMD;.BAT;.COM").split(";"):[""],n=o.split(i);for(const o of n)for(const n of t){const t=s(o,"win32"===process.platform?e+n:e);if(d(t))return t}return null};const P=r.dirname(a(import.meta.url)),D=process.cwd();function E(e){const o=r.resolve(D,e);if(l.existsSync(o))return o;const t=r.resolve(P,"../..",e);if(l.existsSync(t))return t;throw new Error(`Template path not found: ${e}`)}const I={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 e=>{try{const o=process.cwd(),t=E("./template/fnode/project"),n=r.resolve(o,e.name);l.existsSync(n)||l.mkdirSync(n),await u({dir:t,outDir:n,context:{name:e.name,runtime:e.runtime,platform:m.platform()},copyUnmatchedAlso:!0});let i=await f("fnode build",{cwd:n});if(0!==i.code)throw new Error("Failed to build project.");if(N("git")&&(i=await f("git init --initial-branch=main",{cwd:n}),0!==i.code))throw new Error("Failed to initialize git.");if(N("code")&&e.vscode&&(i=await f(`cd ${n} && 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(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:E("./template/fnode/node"),projectDir:r.resolve(process.cwd(),`./.output/${e.id}`),tags:e.ftag,dev:e.dev};try{const o=await async function({tags:e}){let o=function(e){const o=r.resolve(e,"node.yaml"),t=r.resolve(e,"fnode.yaml");if(l.existsSync(t))return t;if(l.existsSync(o))try{const n=l.readFileSync(o,"utf8");return l.writeFileSync(t,n,"utf8"),l.unlinkSync(o),console.log(`Migrated node.yaml to fnode.yaml in ${e}`),t}catch(e){return console.error(`Error migrating node.yaml to fnode.yaml: ${e.message}`),o}return t}(process.cwd());if(!l.existsSync(o))throw new Error("fnode.yaml file not found in current directory.");const{raw:t,parsed:n}=await y({file:o,tags:e}),i=r.dirname(o);n.features=n.features||{};const s=n.features;s.runtime=s.runtime||{},s.runtime.type=s.runtime.type||"node","python"===s.runtime.type?s.runtime.template=s.runtime.template||"python":(s.runtime.type,s.runtime.template=s.runtime.template||"node");const a={libraryAtom:{doc:{...n},fileName:"index"},projectDir:i,projectFilePath:o,projectFileContent:t,projectFileParsed:n,runtime:s.runtime};let c=r.resolve(i,"fnet/targets.yaml");if(!l.existsSync(c)&&(c=r.resolve(i,"node.devops.yaml"),l.existsSync(c))){const e=r.resolve(i,"fnet");l.existsSync(e)||l.mkdirSync(e),l.copyFileSync(c,r.resolve(i,"fnet/targets.yaml")),l.unlinkSync(c)}if(l.existsSync(c)){const{raw:o,parsed:t}=await y({file:c,tags:e}),n=g.parseDocument(o);a.devops={filePath:c,fileContent:o,yamlDocument:n,doc:{...t},type:"library.deploy",save:async()=>{l.writeFileSync(a.devops.filePath,n.toString())}}}const d=r.resolve(i,"readme.md");if(l.existsSync(d)){const e=l.readFileSync(d,"utf8");a.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}({tags:e.ftag}),t="bun"===o.runtime.type?"node":o.runtime.type;return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:E(`./template/fnode/${t}`),projectDir:r.resolve(o.projectDir,"./.workspace"),projectSrcDir:r.resolve(o.projectDir,"./src"),project:o,tags:e.ftag,dev:e.dev}}catch(o){return console.warn(`Warning: Could not load project: ${o.message}`),{projectDir:process.cwd(),tags:e.ftag}}}var C=Object.freeze({__proto__:null,createContext:F});const T={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=E("./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.BU1440aO.js")).default)(e)}const o=e.project?.runtime?.type||"node";try{return new(await this.loadBuilderClass(o))(e)}catch(e){throw new Error(`Failed to create builder for runtime '${o}': ${e.message}`)}}static async loadBuilderClass(e){switch(e.toLowerCase()){case"node":case"bun":return(await import("./index.BU1440aO.js")).default;case"python":return(await import("./index.B8gal9up.js")).default;default:throw new Error(`Unsupported runtime type: ${e}`)}}}const k={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)}}},B={command:"build:dev",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{e.dev=!0;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 e=>{try{const o=await F(e),{project:t}=o,{projectDir:n,projectFileParsed:i}=t,s=i.input;if(!s)throw new Error("Config schema not found in project file.");if(!Reflect.has(e,"name")){const{inputName:o}=await w({type:"input",name:"inputName",message:"Input name:",initial:"dev"});e.name=o}const a=r.resolve(n,".fnet");l.existsSync(a)||l.mkdirSync(a);const c=r.resolve(a,`${e.name}.fnet`),d=l.existsSync(c),p=(await import("@fnet/object-from-schema")).default,m=await p({schema:s,format:"yaml",ref:d?c:void 0});l.writeFileSync(c,m)}catch(e){console.error(e.message),process.exit(1)}}};var W={promptForSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:i="name",initialValue:s=null,allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(o.yellow("No items available for selection.")),null;if(1===t.length&&!a){const e=t[0],n="string"==typeof e?e:e[i];return console.log(o.blue(`Only one option available: ${"string"==typeof e?e:e[r]}`)),n}let c=t.map((e=>"string"==typeof e?{name:e,value:e,message:e}:{name:e[i],value:e[i],message:e[r]||e[i]}));a&&c.push({name:"cancel",value:null,message:o.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:n,choices:c,initial:l});return"cancel"===p?null:p},promptForMultipleSelection:async function(e){const{items:t,message:n,nameField:r="name",valueField:i="name",initialValues:s=[],allowAbort:a=!0}=e;if(!t||0===t.length)return console.log(o.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[r]||e[i]})),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:n,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 _=r.join(m.homedir(),".fnet","express");async function U(e){e.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 e=>{await async function(e){try{l.existsSync(_)||l.mkdirSync(_,{recursive:!0});const t=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=r.join(_,t);l.existsSync(n)||l.mkdirSync(n,{recursive:!0});let i,s=e.projectName,a=e.runtime;if(e.yes){if(!s){const e=l.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}`}a||(a="node")}else{if(!s){const e=l.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=a||"node";a=(await w({type:"select",name:"runtime",message:"Select runtime:",choices:["node","python","bun"],initial:e})).runtime}if(i=r.join(n,s),l.existsSync(i)){let e=1;for(;l.existsSync(r.join(n,`${s}-${e}`));)e++;s=`${s}-${e}`,i=r.join(n,s)}if(!e.yes){if(!(await w([{type:"confirm",name:"proceed",message:`Create express project "${s}" in ${i}?`,default:!0}])).proceed)return void console.log(o.yellow("Project creation cancelled."))}console.log(o.blue(`Creating express project "${s}" in ${i}...`));const d=r.dirname(i),p=["create","--name",r.basename(i)];p.push("--runtime",a),e.yes&&p.push("--yes"),l.existsSync(d)||l.mkdirSync(d,{recursive:!0});const m=c("fnode",p,{stdio:"inherit",shell:!0,cwd:d});return new Promise(((t,n)=>{m.on("close",(r=>{0===r?(console.log(o.green(`\nExpress project "${s}" created successfully!`)),console.log(o.blue(`\nProject location: ${i}`)),e.yes?t():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(o.red(`Error opening IDE: ${e.message}`))}}(i)):(console.error(o.red(`\nFailed to create express project "${s}".`)),n(new Error(`Process exited with code ${r}`)))}))}))}catch(e){console.error(o.red(`Error creating express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));const t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(e.today){const e=(new Date).toISOString().slice(0,10).replace(/-/g,""),n=t.indexOf(e);if(-1===n)return void console.log(o.yellow("No express projects found for today."));t.splice(0,n),t.splice(1)}const n=[];e.type||e.all||(e.type="fnode");for(const o of t){const t=r.join(_,o),i=l.readdirSync(t);for(const s of i){const i=r.join(t,s),a=l.statSync(i);let c="unknown";if(s.startsWith("fnode-")||l.existsSync(r.join(i,"fnode.yaml"))?c="fnode":(s.startsWith("fnet-")||l.existsSync(r.join(i,"fnet.yaml")))&&(c="fnet"),e.type&&c!==e.type)continue;if(e.name&&!s.includes(e.name))continue;const d=`${o.slice(0,4)}-${o.slice(4,6)}-${o.slice(6,8)}`;n.push({name:s,type:c,date:d,path:i,created:a.birthtime})}}if(n.sort(((e,o)=>o.created-e.created)),0===n.length)return void console.log(o.yellow("No express projects found matching the criteria."));console.log(o.blue("\nExpress Projects:"));const i=(await import("./index.-SGbq2cI.js")).default,s=["NAME","TYPE","DATE","PATH"],a=i.createTable(s,{chars:{mid:"","mid-mid":"","left-mid":"","right-mid":""}});for(const e of n){let t=e.path;t.startsWith(m.homedir())&&(t="~"+t.substring(m.homedir().length)),a.push([o.white(e.name),"fnet"===e.type?o.cyan(e.type):"fnode"===e.type?o.green(e.type):e.type,e.date,t])}console.log(a.toString()),console.log(o.green("Projects: ")+o.yellow(n.filter((e=>"fnode"===e.type)).length+" fnode, ")+o.cyan(n.filter((e=>"fnet"===e.type)).length+" fnet")),console.log(o.blue(`\nTotal: ${n.length} projects`))}catch(e){console.error(o.red(`Error listing express projects: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}await V(t)}catch(e){console.error(o.red(`Error opening express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{const t=process.cwd();let n;if(t.includes(_))n=t,console.log(o.blue(`Using current express project: ${r.basename(n)}`));else if(e.latest){if(n=await H(),!n)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(n=await G(e.projectName),!n)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));n=r.join(_,e)}let i=e.destination;if(!i){i=(await w({type:"input",name:"destination",message:"Enter destination directory:",initial:r.join(process.cwd(),r.basename(n))})).destination}if(i.startsWith("~")&&(i=r.join(m.homedir(),i.slice(1))),i=r.resolve(i),i.startsWith(n+r.sep)||i===n)return void console.log(o.red("Destination cannot be inside the source directory."));if(l.existsSync(i)){if(!l.statSync(i).isDirectory())return void console.log(o.red(`Destination "${i}" is not a directory.`));if(l.readdirSync(i).length>0){if(!(await w({type:"confirm",name:"overwrite",message:`Destination "${i}" is not empty. Continue anyway?`,initial:!1})).overwrite)return void console.log(o.yellow("Project move cancelled."))}}else l.mkdirSync(i,{recursive:!0});console.log(o.blue(`Moving project from ${n} to ${i}...`)),z(n,i),console.log(o.green(`\nProject moved successfully to ${i}`));(await w({type:"confirm",name:"deleteOriginal",message:"Delete the original express project?",initial:!1})).deleteOriginal&&(l.rmSync(n,{recursive:!0,force:!0}),console.log(o.green("Original project deleted."))),await V(i)}catch(e){console.error(o.red(`Error moving express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}const n=r.basename(t);if(!e.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(o.yellow("Project removal cancelled."))}console.log(o.blue(`Removing project "${n}"...`)),l.rmSync(t,{recursive:!0,force:!0}),console.log(o.green(`Project "${n}" removed successfully.`))}catch(e){console.error(o.red(`Error removing express project: ${e.message}`)),process.exit(1)}}(e)})).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 e=>{await async function(e){try{if(!l.existsSync(_))return void console.log(o.yellow("No express projects found."));let t;if(e.latest){if(t=await H(),!t)return void console.log(o.yellow("No express projects found."))}else if(e.projectName){if(t=await G(e.projectName),!t)return void console.log(o.yellow(`Project "${e.projectName}" not found.`))}else{const e=await L();if(!e)return void console.log(o.yellow("No project selected."));t=r.join(_,e)}console.log(o.blue(`Entering project directory: ${t}`)),console.log(o.yellow("\nOpening a new shell in the project directory..."));const n=process.env.SHELL||"/bin/bash",i=c(n,[],{stdio:"inherit",cwd:t,shell:!0});return new Promise((e=>{i.on("close",(()=>{console.log(o.green("\nReturned from project directory.")),e()}))}))}catch(e){console.error(o.red(`Error entering express project directory: ${e.message}`)),process.exit(1)}}(e)})).demandCommand(1,"You need to specify a command").help()}async function H(){const e=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));if(0===e.length)return null;const o=e[0],t=r.join(_,o),n=l.readdirSync(t);if(0===n.length)return null;let i=null,s=0;for(const e of n){const o=r.join(t,e),n=l.statSync(o);n.birthtimeMs>s&&(s=n.birthtimeMs,i=o)}return i}async function G(e){const t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const n of t){const t=r.join(_,n),i=l.readdirSync(t);if(i.includes(e))return r.join(t,e);const s=i.filter((o=>o.includes(e)));if(s.length>0){if(1===s.length)return r.join(t,s[0]);{const i=s.map((e=>({name:r.join(t,e),value:r.join(t,e),message:`${e} (${n})`}))),a=await W.promptForSelection({items:i,message:`Multiple projects match "${e}". Please select one:`,nameField:"message",valueField:"value",allowAbort:!0});return null===a?(console.log(o.yellow("Operation cancelled.")),null):a}}}return null}async function L(){const e=[],t=l.readdirSync(_).filter((e=>/^\d{8}$/.test(e))).sort(((e,o)=>o.localeCompare(e)));for(const o of t){const t=r.join(_,o),n=l.readdirSync(t);for(const i of n){const n=r.join(t,i),s=l.statSync(n),a=`${o}/${i}`;e.push({name:a,value:a,message:`${i} (${o})`,created:s.birthtime})}}if(e.sort(((e,o)=>o.created-e.created)),0===e.length)return null;const n=await W.promptForSelection({items:e,message:"Select a project:",nameField:"message",valueField:"value",allowAbort:!0});return null===n?(console.log(o.yellow("Operation cancelled.")),null):n}async function V(e){const t=await Y("code --version"),n=await Y("code-insiders --version");let r=null;if(t&&n){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"}]});r=e.ide}else if(t)r="code";else{if(!n)return console.log(o.yellow("No supported IDE found. Please open the project manually.")),void console.log(o.blue(`Project path: ${e}`));r="code-insiders"}console.log(o.blue(`Opening project in ${r}...`)),console.log(o.blue(`Project path: ${e}`));const i=c(r,[e],{stdio:"inherit",shell:!0});return new Promise(((e,t)=>{i.on("close",(n=>{0===n?(console.log(o.green(`Project opened in ${r}.`)),e()):(console.error(o.red(`Failed to open project in ${r}.`)),t(new Error(`Process exited with code ${n}`)))}))}))}async function Y(e){return new Promise((o=>{c(e,{shell:!0,stdio:"ignore"}).on("close",(e=>{o(0===e)}))}))}function z(e,o){l.existsSync(o)||l.mkdirSync(o,{recursive:!0});const t=l.readdirSync(e,{withFileTypes:!0});for(const n of t){const t=r.join(e,n.name),i=r.join(o,n.name);if(n.isDirectory()){if(".git"===n.name||".workspace"===n.name)continue;z(t,i)}else l.copyFileSync(t,i)}}const X=r.dirname(a(import.meta.url));const J=r.dirname(a(import.meta.url)),K=process.cwd();process.on("uncaughtException",(e=>{h||(h=!0,setTimeout((()=>process.exit(1)),500))})),process.on("unhandledRejection",(e=>{h||(h=!0,setTimeout((()=>process.exit(1)),500))})),function(){p({name:["redis"],dir:K,optional:!0});const e=function({baseDir:e}){let o=e=e||X;for(;o!==r.parse(o).root;){const e=r.join(o,"node_modules");if(l.existsSync(e))return e;o=r.dirname(o)}return null}({baseDir:J}),o="win32"===process.platform?";":":";e&&(process.env.PATH=`${r.join(e,"/.bin")}${o}${process.env.PATH}`)}(),async function(){try{let t=e(process.argv.slice(2)).usage("Usage: $0 <command> [options]").command(I).command(T).command(k).command(B).command(O).command(M).command(R).command("express","Create and manage express projects",U);t=x(t,{bin:"npm"}),t=x(t,{bin:"node"}),t=x(t,{bin:"bun"}),t=x(t,{name:"serve",bin:"bun",preArgs:["run","serve","--"]}),t=x(t,{name:"watch",bin:"bun",preArgs:["run","watch","--"]}),t=x(t,{name:"app",bin:"bun",preArgs:["run","app","--"]}),t=x(t,{name:"cli",bin:"bun",preArgs:["run","cli","--"]}),t=x(t,{name:"cli:dev",bin:"bun",preArgs:["run","cli:dev","--"]}),t=x(t,{name:"cli:compile",bin:"bun",preArgs:["run","cli:compile","--"]}),t=x(t,{name:"cli:compile:dev",bin:"bun",preArgs:["run","cli:compile:dev","--"]}),t=x(t,{name:"cli:install",bin:"bun",preArgs:["run","cli:install","--"]}),t=x(t,{name:"compile",bin:"bun",preArgs:["run","compile","--"]}),t=function(e,{name:t}){return e.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 e=>{try{const t=await S(e),{projectDir:n}=t;console.log(o.blue("Compiling project..."));const i=r.join(n,".bin");l.existsSync(i)||l.mkdirSync(i,{recursive:!0});const s=r.basename(r.dirname(n)),a=t.project?.projectFileParsed?.features?.cli?.bin,c=e.name||a||s;console.log(o.blue(`Using binary name: ${c}`));const d=r.join(i,c),{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&&l.chmodSync(d,493),console.log(o.green(`Binary compiled successfully: ${d}`)),console.log(o.blue("Installing binary..."));const u=["install",d];e.name&&u.push("--name",e.name),e.force&&u.push("--force"),e.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(o.red(`Failed to install binary: ${e.message}`)),process.exit(1)}}))}(t,{name:"install"}),t=x(t,{bin:"npx"}),t=x(t,{bin:"cdk"}),t=x(t,{bin:"aws"}),t=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 S(e),{projectDir:n}=o,r=e.config,i=await p({name:r,dir:n,transferEnv:!1,optional:!0,tags:o.tags}),s=i?.data?.env||void 0,a=e.command,d=process.argv.slice(5);v(c(a,[...t,...d],{cwd:l.existsSync(n)?n:process.cwd(),stdio:"inherit",shell:!0,detached:!0,env:{...process.env,...s}}))}catch(e){console.error(e.message),process.exit(1)}}))}(t,{name:"with"}),t=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)}}))}(t,{name:"run",projectType:"fnode"}),t=$(t,{name:"python"}),t=$(t,{name:"python3"}),t=$(t,{name:"pip"}),t=$(t,{name:"pip3"}),t.demandCommand(1,"You need at least one command before moving on").help().version().argv}catch(e){console.error(o.red(`Fatal error: ${e.message}`)),process.exit(1)}}().catch((e=>{console.error(o.red(`Fatal error: ${e.message}`)),process.exit(1)}));export{E as r,N as w};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "0.132.0",
3
+ "version": "0.133.0",
4
4
  "files": [
5
5
  "dist",
6
6
  "template"
@@ -1 +0,0 @@
1
- import e from"node:fs";import t from"node:path";import{randomUUID as i}from"node:crypto";import o from"yaml";import s from"nunjucks";import a from"chalk";import{Api as r,Atom as n}from"@flownet/lib-atom-api-js";import c from"@fnet/config";import d from"@fnet/list-files";import l from"redis";import p from"@flownet/lib-is-redis-online";import m from"@fnet/yaml";class g{init({config:e,accessToken:t}){return new Promise(((i,o)=>{if(r.set_api_url(e.data.url),t)return r.set_req_token(t),void i(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=>{r.set_req_token(e.access_token),i(e.access_token)})).catch((e=>{r.set_req_token(),o(e)}))}))}}var h=async e=>{const{atom:t,packageDependencies:i,context:o,deploymentProjectTarget:s,setProgress:a,deploymentProject:r,yamlTarget:n}=e;if(!0!==s.enabled)return;const c=s.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.N_a5FdgA.js")).default({...e});else if("gcs"===c)await(await import("./index.Bft2w7m3.js")).default({...e});else if("gitlab"===c)await(await import("./index.DI3yyTtl.js")).default({...e});else if("fnet-package"===c)await(await import("./index.D3p7pncT.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:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("webos"===c)await(await import("./index.CMC8mlye.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("electron"===c)await(await import("./index.xd8c7XMr.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("docker"===c)await(await import("./index.D2N9YZmA.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("ios"===c)await(await import("./index.B5XE4ChJ.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("macos"===c)await(await import("./index.W6RYgypK.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0;else if("rust"===c)await(await import("./index.CzAV0S36.js")).default({atom:t,target:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),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:s,onProgress:a,projectDir:o.projectDir,dependencies:i,context:o,yamlTarget:n}),r.isDirty=!0}}catch(e){throw console.error(`Error during deployment for type "${c}":`,e),e}};class f{#e;#t;#i;#o;#s;#a;#r;#n;#c;#d;#l;#p;#m;#g;#h;#f;#y;constructor(e){this.#e=new g,this.#t=e,this.#a=[],this.#r=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#y={packageDependencies:this.#a,packageDevDependencies:this.#r,setProgress:this.setProgress.bind(this),context:this.#t,Atom:n,registerToPackageManager:this.registerToPackageManager.bind(this)}}get apiContext(){return this.#y}get context(){return this.#t}get atom(){return this.#i}get libs(){return this.#s}set libs(e){this.#s=e}get fileMode(){return this.#g}get buildMode(){return this.#h}get deployMode(){return this.#f}async _cache_set(e,t,i){this._redis_client&&await this._redis_client.SETEX(e,i||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async initAuth(){this.#t.id&&(this.#n=await this.#e.init({config:this.#p}),this.#y.atomAccessToken=this.#n)}async initLibrary(){const e=this.#t.id;this.#i=this.#t.project?.libraryAtom||await n.get({id:e});let t=this.#i.doc.bundleName;t=t||(this.#i.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#i.doc.bundleName=t,this.#i.type=this.#i.type||"workflow.lib",this.#y.atom=this.#i}async initLibraryDir(){this.setProgress({message:"Initializing library directory."});const i=this.#t.projectDir;this.setProgress({message:"Cleaning project directory."});const o=d({dir:i,ignore:[".cache","node_modules",".conda",".bin"],absolute:!0});for(const t of o)e.rmSync(t,{recursive:!0,force:!0});this.setProgress({message:"Creating project directory."});let s=i;e.existsSync(s)||e.mkdirSync(s,{recursive:!0}),s=t.join(i,"src"),e.existsSync(s)||e.mkdirSync(s,{recursive:!0}),s=t.join(i,"src","default"),e.existsSync(s)||e.mkdirSync(s,{recursive:!0})}async initNunjucks(){this.setProgress({message:"Initializing nunjucks."});const e=this.#t.templateDir;this.#o=s.configure(e,{watch:!1,dev:!0}),this.#y.njEnv=this.#o}async createProjectYaml(){const i="fnode.yaml",s=`Creating ${i}`;await this.setProgress({message:s});const{content:a,...r}=this.#i.doc,n=this.#t.projectDir,c=t.resolve(n,`${i}`);e.writeFileSync(c,o.stringify(r),"utf8")}async deploy(){if(await this.setProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&await i.save()}}else if(this.#i.id){const e=await n.list({type:"library.deploy",parent_id:this.#i.id});for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&(i=await n.update(i,{id:i.id}))}}}async deployProject(e){const{deploymentProject:t}=e,{yamlDocument:i}=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 o=Object.keys(t.doc||{}),s=i||{};for(let e=0;e<o.length;e++){const i=t.doc[o[e]];i.name=o[e];const a=s.get(o[e]);await h({...this.#y,deploymentProject:t,deploymentProjectTarget:i,yamlTarget:a})}}async registerToPackageManager(e){const{target:t,packageJSON:i}=e;if(!this.#t.id)return;let o=await n.first({name:t.params.name,parent_id:this.#p.env.ATOM_PACKAGES_ID});o?(o.doc.versions.splice(0,0,{v:i.version}),await n.update(o,{id:o.id})):o=await n.create({parent_id:this.#p.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:i.version}]}})}async setProgress(e){const t="string"==typeof e?e:e?.message;console.log(a.blue(t)),await this._cache_set(this.#d,{status:"IN_PROGRESS",message:t})}async init(){this._redis_client=await async function(){if(!await p({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=l.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}(),this.#c=this.#t.buildId||i(),this.#y.buildId=this.#c,this.#m=this.#t.mode,this.#g=["all","deploy","build","file"].includes(this.#m),this.#h=["all","deploy","build"].includes(this.#m),this.#f=["all","deploy"].includes(this.#m),this.#l=this.#t.protocol,this.#d="BUILD:"+this.#c,this.#p=(await c({optional:!0,name:this.#t.atomConfig||"atom",dir:this.#t.projectDir,tags:this.#t.tags}))?.data;try{await this.setProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await this.initRuntime()}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initRuntime(){throw new Error("initRuntime method must be implemented by runtime-specific builder")}async build(){throw new Error("build method must be implemented by runtime-specific builder")}}async function y({atom:i,setProgress:o,context:a,packageDependencies:r}){await o({message:"Creating .gitignore"});const n={atom:i,packageDependencies:r},c=a.templateDir,d=s.compile(e.readFileSync(t.resolve(c,".gitignore.njk"),"utf8"),s.configure(c)).render(n),l=a.projectDir,p=t.resolve(l,".gitignore");e.writeFileSync(p,d,"utf8")}async function u({atom:i,context:o,setProgress:a,Atom:r}){const n="readme.md",c=`Creating ${n}`;if(await a({message:c}),o.project?.readme){const i=o.projectDir,a={content:o.project.readme.doc.content},r=t.resolve(o.project.projectDir,"fnet/how-to.md");if(e.existsSync(r)){const t=e.readFileSync(r,"utf8");a.howto=t}const c=t.resolve(o.project.projectDir,"fnet/input.yaml");if(e.existsSync(c)){const e=await m({file:c,tags:o.tags});a.input=e.content}const d=t.resolve(o.project.projectDir,"fnet/output.yaml");if(e.existsSync(d)){const e=await m({file:d,tags:o.tags});a.output=e.content}const l=o.templateDir,p=s.compile(e.readFileSync(t.resolve(l,`${n}.njk`),"utf8"),s.configure(l)).render(a),g=t.resolve(i,`${n}`);e.writeFileSync(g,p,"utf8")}else if(i.id){const a=await r.first({type:"wiki",parent_id:i.id});if(!a||"markdown"!==a.doc?.["content-type"])return;const{content:c,...d}=a.doc,l={content:c},p=o.templateDir,m=s.compile(e.readFileSync(t.resolve(p,`${n}.njk`),"utf8"),s.configure(p)).render(l),g=o.projectDir,h=t.resolve(g,`${n}`);e.writeFileSync(h,m,"utf8")}}export{f as B,y as a,u as c};