@fnet/cli 0.13.1 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),a=require("yargs/yargs"),o=require("yargs/helpers"),i=require("fs"),n=require("yaml"),s=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("redis"),u=require("@flownet/lib-is-redis-online"),g=require("nanoid"),f=require("@flownet/lib-atom-api-js"),y=require("axios"),b=require("qs"),w=require("lodash.merge"),h=require("@flownet/lib-list-npm-versions"),j=require("@flownet/lib-parse-imports-js"),v=require("@fnet/shell"),_=require("semver"),x=require("node:os"),k=require("@node-red/util"),D=require("@flownet/lib-to-ios-app"),P=require("@flownet/lib-to-macos-app"),$=require("@flownet/lib-to-electron"),I=require("@flownet/lib-to-webos"),S=require("@flownet/lib-to-nextjs"),C=require("lodash.clonedeep"),E=require("@flownet/lib-parse-node-url"),A=require("@flownet/lib-pick-npm-versions"),F=require("chalk");const T=m,q=u;const{Api:O}=f,R=y.default,M=b;const L=w;const N=h;const B=c,J=l,K=r;const U=d,z=c,H=l,G=j,Y=h;const W=c,X=l,Z=r;const Q=c,V=l,ee=d,te=j;const ae=c,oe=l,ie=d;const ne=c,se=l,re=d;const ce=c,le=l,pe=d;const de=d,me=c,ue=l;const ge=s;const fe=s;const ye=s;const be=s;const we=v,he=e;const je=c,ve=l,_e=_,xe=v,ke=e;const De=c,Pe=l,$e=_,Ie=s,Se=e;const Ce=c,Ee=l,Ae=x,Fe=d,Te=k,qe=e;const Oe=i,Re=t,Me=e;const Le=D;const Ne=P;const Be=$;const Je=I;const Ke=S,Ue=C,ze=w,He=_,Ge=l;const Ye=async({setInProgress:e,context:t,deploymentProject:a,deploymentProjectTarget:o,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const n=t.projectDir;let s="fnet-to-gitlab";const r=o.params.config||"gitlab",c=he({name:r,dir:t.projectDir});if(!c)throw new Error(`Couldnt load config ${r}`);const{data:l}=c.data;s+=` --projectGroupId=${l.projectGroupId}`,s+=` --projectPath='${n}'`,s+=` --projectName='${o.params.name}'`,s+=` --projectBranch='${o.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==o.dryRun&&(await we({cmd:s}),a.isDirty=!0)},We=async({setInProgress:e,context:t,deploymentProject:a,deploymentProjectTarget:o,registerToPackageManager:i})=>{await e({message:"Deploying it as pm package."});const n=t.projectDir,s=ve.resolve(n,"package.json"),r=je.readFileSync(s),c=JSON.parse(r);c.name=o.params.name,c.version=_e.inc(o.params.version,"patch"),delete c.scripts,delete c.devDependencies,je.writeFileSync(s,JSON.stringify(c,null,"\t"));const{file:l,data:p}=await ke({name:o.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let d="fnet-upload-files-to-gcs";d+=` --projectId='${p.env.PM_PROJECT_ID}'`,d+=` --bucketName='${p.env.PM_BUCKET_NAME}'`,d+=` --keyFilename='${ve.resolve(ve.dirname(l),p.env.PM_UPLOADER_KEY_FILE)}'`,d+=` --dir='${n}'`,d+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",d+=` --destDir='${c.name}/${c.version}'`,d+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(d+=" --dryRun"),await xe({cmd:d}),je.writeFileSync(s,r),!0!==o.dryRun&&(a.isDirty=!0,o.params.version=c.version,await i({target:o,packageJSON:c}))},Xe=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const n=a.projectDir,s=Pe.resolve(n,"package.json"),r=De.readFileSync(s),c=JSON.parse(r);c.name=i.params.name,c.version=$e.inc(i.params.version,"patch");const l=i.params.bin?.name||i.params.bin;!1!==i.params.bin?.enabled&&l&&"string"==typeof l&&(c.bin={[l]:"dist/cli/cjs/index.js",[e.doc.name]:"dist/cli/cjs/index.js"}),delete c.scripts,delete c.devDependencies,c.scripts={serve:"npx serve ."},De.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Se({name:a.npmConfig||"npm",dir:a.projectDir})?.data);if(De.writeFileSync(Pe.resolve(n,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==Ie.exec("npm publish --access public",{cwd:n}).code)throw new Error("Couldnt publish to npm");De.writeFileSync(s,r),o.isDirty=!0,i.params.version=c.version},Ze=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n,packageDependencies:s,njEnv:r})=>{await t({message:"Deploying it as node-red flow."});const c=a.projectDir,l=a.templateDir,p="workflow"===e.type?"WF":"LIB";let d;if("simple"===i.deploy.template)d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Te.util.generateId(),...i.params?.inject,payload:"json"===i.params?.inject?.payloadType?`'${JSON.stringify(i.params?.inject?.payload)}'`:i.params?.inject?.payload},debug:{id:Te.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.params?.schedules?cloneDeep(i.params?.schedules):void 0;t?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Te.util.generateId(),schedules:t},debug:{id:Te.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Te.util.generateId(),method:i.params.method||"get",url:i.params.url},httpout:{id:Te.util.generateId()},debug:{id:Te.util.generateId()}}}}let m=Fe.compile(Ce.readFileSync(Ee.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Ce.writeFileSync(Ee.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;o.isDirty=!0;const u=await(qe({name:a.redConfig||"red",dir:a.projectDir})?.data),g=i.deploy.url||u.env.RED_URL,f={};if(!1!==i.deploy.auth&&(f.Authorization="Bearer "+atomAccessToken),i.deploy.id)!0===i.actions?.delete?(await axios({method:"DELETE",url:`${g}/flow/${i.deploy.id}`,headers:f}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${g}/flow/${i.deploy.id}`,data:m,headers:f});else{const e=await axios({method:"POST",url:`${g}/flow`,data:m,headers:f});i.deploy.id=e.data.id}},Qe=async({atom:e,Atom:t,setInProgress:a,context:o,packageDependencies:i,deploymentProject:n,deploymentProjectTarget:s})=>{await a({message:"Deploying it as workflow lib."});const r=await(Me({name:"atom",dir:o.projectDir})?.data);let c,l,p,d=s.deploy.name.split("/");if(1===d.length)l=r.env.ATOM_LIBRARIES_ID,p=s.deploy.name;else{if(2!==d.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:d[0],parent_id:r.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");l=e.id,p=d[1]}}if(!0===s.dryRun)return;if(n.isDirty=!0,s.deploy.id){if(c=await t.get({id:s.deploy.id}),!c)return}else{if(c=await t.create({parent_id:l,doc:{name:p,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!c)return;s.deploy.id=c.id}const m=o.projectDir;c.doc.contents=[{content:Oe.readFileSync(Re.resolve(m,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:Oe.readFileSync(Re.resolve(m,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:Oe.readFileSync(Re.resolve(m,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],c.doc.name=p,c.doc.dependencies=i,"workflow.lib"===e.type?c.doc.subtype="library":"workflow"===e.type&&(c.doc.subtype="workflow"),c=await t.update(c,{id:c.id})},Ve=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n,registerToPackageManager:s})=>{await t({message:"Deploying it as ios app package."});const r=a.projectDir;if(!0===i.dryRun)return;const c={projectDir:r,dest:r,atom:e,params:i.params};await Le(c),o.isDirty=!0},et=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n})=>{await t({message:"Deploying it as macos app package."});const s=a.projectDir;if(!0===i.dryRun)return;const r={projectDir:s,dest:s,atom:e,params:i.params};await Ne(r),o.isDirty=!0},tt=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n})=>{await t({message:"Deploying it as electron package."});const s=a.projectDir;if(!0===i.dryRun)return;const r={src:s,dest:s,atom:e,params:i.params};await Be(r),o.isDirty=!0},at=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const n=a.projectDir;if(!0===i.dryRun)return;const s={src:n,dest:n,atom:e,params:i.params};await Je(s),o.isDirty=!0},ot=async({atom:e,target:t,onProgress:a,projectDir:o,dependencies:i})=>{a&&await a({message:"Deploying it as nextjs package."});t.params=ze({name:"nextjs-app",version:"0.1.0"},t.params);const n=He.inc(t.params.version,"patch");t.params.version=n;const s=Ue(t);s.params.dependencies=Ue(i);const r={atom:e,target:s.params,projectDir:o,renderDir:Ge.resolve(o,"nextjs")};return{deployer:await Ke(r)}};const it=c,nt=l,st=p,rt=s,ct=d,lt=async()=>{if(!await q({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=T.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:pt}=g,dt=class{init({config:e,accessToken:t}){return new Promise(((a,o)=>{if(O.set_api_url(e.data.url),t)return O.set_req_token(t),void a(t);R({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:M.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{O.set_req_token(e.data.access_token),a(e.data.access_token)})).catch((e=>{O.set_req_token(),o(e)}))}))}},mt=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled;const a="workflow.lib"===e.type;!1===t.app?t.app={enabled:!1}:!0===t.app?t.app={enabled:!0,extend:!1,export:!0,react:a}:t.app={enabled:!0,extend:!1,export:!0,react:a,...t.app||{}},t.app.enabled=!0===t.app.enabled&&(!0===e.doc.features.form_enabled||!0===t.app.extend||!0===t.app.enabled),t.app.format=t.app.format||"esm",t.app.folder=t.app.folder||t.app.format||"default",!1===t.cli?t.cli={enabled:!1}:!0===t.cli?t.cli={enabled:!0,extend:!1,export:!0}:t.cli={enabled:!0,extend:!1,export:!0,...t.cli||{}},t.cli.enabled=!0===t.cli.enabled&&(!1===e.doc.features.form_enabled||!0===t.cli.extend||!0===t.cli.enabled),t.cli.format=t.cli.format||"cjs",t.cli.folder=t.cli.folder||t.cli.folder||"cjs";const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1,enabled:!0},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1,enabled:!0},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0,terser:!0},umd:{format:"umd",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!1}},i={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.app.enabled&&(t.app.dir=`./dist/app/${t.app.folder}`,o.app={format:t.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:t.app.dir,terser:!0,output_exports:!1===t.app.export?"none":"auto"},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:t.app.dir})),!0===t.cli.enabled&&(t.cli.dir=`./dist/cli/${t.cli.folder}`,o.cli={format:t.cli.format,context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:t.cli.dir,banner:"#!/usr/bin/env node",terser:!1,output_exports:!1===t.cli.export?"none":"auto"}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=L({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=L({},t.replace_options||t.replace?.options||{}),t.terser_options=L({},t.terser_options||t.terser?.options||{}),t.css_options=L({},t.css_options||t.css?.options||{}),t.wasm_options=L({},t.wasm_options||t.wasm?.options||{}),t.copy_options=L(i,t.copy_options||t.copy?.options||{}),t.json_options=L({},t.json_options||t.json?.options||{}),t.image_options=L({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=L(o,t.rollup_output||t.rollup?.output||{});const n=Object.keys(o);for(const e of n){const a=o[e];a&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(a.enabled=!0),a.babel_options=a.babel_options||t.babel_options,a.browsersync_options=L(t.browsersync_options,a.browsersync_options),a.replace_options=L(t.replace_options,a.replace_options),a.terser_options=L(t.terser_options,a.terser_options),a.css_options=L(t.css_options,a.css_options),a.wasm_options=L(t.wasm_options,a.wasm_options),a.copy_options=L(t.copy_options,a.copy_options),a.json_options=L(t.json_options,a.json_options),a.image_options=L(t.image_options,a.image_options),t.form_enabled&&(a.babel=!0)):a.enabled=!1)}t.babel_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=n.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&t.app.enabled,t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.app.enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},ut=async({atom:e,packageDependencies:t,packageDevDependencies:a})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let a="^18.2";a=`^${(await N({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:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(!0===e.doc.features.cli.enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),a.push({package:"@babel/core",version:"^7.23"}),a.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),a.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),a.push({package:"@rollup/plugin-replace",version:"^5.0"}),a.push({package:"rollup",version:"^3.26"}),a.push({package:"rollup-plugin-delete",version:"^2.0"}),a.push({package:"rollup-plugin-dts",version:"^6.0"}),a.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),a.push({package:"@rollup/plugin-alias",version:"^5.0"}),e.doc.features.babel_enabled&&(a.push({package:"@rollup/plugin-babel",version:"^6.0"}),a.push({package:"@babel/preset-env",version:"7.22"}),a.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&a.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&a.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&a.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&a.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&a.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){a.push({package:"rollup-plugin-postcss",version:"4.0"}),a.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":a.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":a.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":a.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":a.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":a.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&a.push({package:"rollup-plugin-copy",version:"^3.5"})},gt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,ts:Date.now()},n=a.templateDir,s=J.resolve(a.projectDir,"src/app");B.existsSync(s)||B.mkdirSync(s,{recursive:!0}),await K({pattern:["index.html.njk","index.js.njk"],dir:J.resolve(n,"src/app"),outDir:s,context:i})},ft=async({atom:e,context:t,packageDependencies:a,packageDevDependencies:o,setInProgress:i})=>{await i({message:"Creating package.json."});const n=a.find((e=>"react"===e.package)),s=a.find((e=>"react-dom"===e.package));n&&!s?a.push({package:"react-dom",version:n.version}):n&&s&&(s.version=n.version),n&&e.doc.features.react_version>=17&&(a.find((e=>"@emotion/react"===e.package))||a.push({package:"@emotion/react",version:"^11"}),a.find((e=>"@emotion/styled"===e.package))||a.push({package:"@emotion/styled",version:"^11"}));const r=[];!0===e.doc.features.app.enabled&&r.push(H.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.cli.enabled&&r.push(H.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!z.existsSync(i))throw new Error(`App file not found: ${i}`);const n=await G({file:i,recursive:!0}),s=!0===e.doc.features.all_parsed_imports?n.all:n.required;for await(const e of s){if("npm"!==e.type)continue;if(a.find((t=>t.package===e.package)))continue;if(o.find((t=>t.package===e.package)))continue;const t=(await Y({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:a,packageDevDependencies:o},l=t.templateCommonDir,p=U.compile(z.readFileSync(H.resolve(l,"package.json.njk"),"utf8"),U.configure(l)).render(c),d=t.projectDir,m=H.resolve(d,"package.json");z.writeFileSync(m,p,"utf8")},yt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o},n=a.templateDir,s=X.resolve(a.projectDir,"src/cli");W.existsSync(s)||W.mkdirSync(s,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(n,"src/cli"),outDir:s,context:i})},bt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:o},n=V.resolve(a.projectDir,"src","default/index.js");if(!Q.existsSync(n))throw new Error(`Entry file not found: ${n}`);const s=(await te({file:n,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),r=e.doc.features.rollup_output,c=Object.keys(r);for(let e=0;e<c.length;e++){const t=r[c[e]];if(!0===t.browser&&s.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(s.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<s.length;e++){const a=s[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(s)}}const l=a.templateCommonDir,p=ee.compile(Q.readFileSync(V.resolve(l,"rollup.config.js.njk"),"utf8"),ee.configure(l)).render(i),d=a.projectDir,m=V.resolve(d,"rollup.config.js");Q.writeFileSync(m,p,"utf8")},wt=async({atom:e,setInProgress:t,context:a,njEnv:o})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating yargs."});const i={},n=e.doc.inputs||[],s=[];n.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&s.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),i[e.name]=t}));const r={options:i,imports:s,atom:e},c=a.templateDir,l=ie.compile(ae.readFileSync(oe.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),o).render(r),p=a.projectDir,d=oe.resolve(p,"src/default/to.yargs.js");ae.writeFileSync(d,l,"utf8")},ht=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:o},n=a.templateCommonDir,s=re.compile(ne.readFileSync(se.resolve(n,".gitignore.njk"),"utf8"),re.configure(n)).render(i),r=a.projectDir,c=se.resolve(r,".gitignore");ne.writeFileSync(c,s,"utf8")},jt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:o},n=a.templateCommonDir,s=pe.compile(ce.readFileSync(le.resolve(n,"tsconfig.json.njk"),"utf8"),pe.configure(n)).render(i),r=a.projectDir,c=le.resolve(r,"tsconfig.json");ce.writeFileSync(c,s,"utf8")},vt=async({atom:e,context:t,setInProgress:a,Atom:o})=>{const i="readme.md",n=`Creating ${i}`;if(await a({message:n}),t.project?.readme){const e={content:t.project.readme.doc.content},a=t.templateCommonDir,o=de.compile(me.readFileSync(ue.resolve(a,`${i}.njk`),"utf8"),de.configure(a)).render(e),n=t.projectDir,s=ue.resolve(n,`${i}`);me.writeFileSync(s,o,"utf8")}else if(e.id){const a=await o.first({type:"wiki",parent_id:e.id});if(!a||"markdown"!==a.doc?.["content-type"])return;const{content:n,...s}=a.doc,r={content:n},c=t.templateCommonDir,l=de.compile(me.readFileSync(ue.resolve(c,`${i}.njk`),"utf8"),de.configure(c)).render(r),p=t.projectDir,d=ue.resolve(p,`${i}`);me.writeFileSync(d,l,"utf8")}},_t=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Prettifiying source files."});if(0!==ge.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:a}).code)throw new Error("Couldnt format files.")},xt=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Creating .d.ts"});if(0!==fe.exec("tsc",{cwd:a}).code)throw new Error("Couldnt create .d.ts files.")},kt=async({setInProgress:e,atom:t,context:a})=>{const o=a.projectDir;await e({message:"Installing npm packages."});if(0!==ye.exec(`npm install ${t.doc.features.npm_install_flags}`,{cwd:o}).code)throw new Error("Couldnt install npm packages.")},Dt=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Building main project."});if(0!==be.exec("npm run build",{cwd:a}).code)throw new Error("Couldnt build project.")},Pt=async e=>{const{atom:t,packageDependencies:a,context:o,deploymentProjectTarget:i,setInProgress:n}=e;if(!0===i.enabled)if("lib"===i.name)await Qe({...e});else if("red"===i.name)await Ze({...e});else if("npm"===i.name)await Xe({...e});else if("pm"===i.name)await We({...e});else if("gitlab"===i.name)await Ye({...e});else if("macos-app"===i.name)await et({...e});else if("ios-app"===i.name)await Ve({...e});else if("electron"===i.name)await tt({...e});else if("webos"===i.name)await at({...e});else{let e;if("nextjs"===i.name&&(e=ot),!e)return;await e({atom:t,target:i,onProgress:n,projectDir:o.projectDir,dependencies:a})}},{Atom:$t}=f,It=E,St=e,Ct=j,Et=A,At=F;var Ft=class{#e;#t;#a;#o;#i;#n;#s;#r;#c;#l;#p;#d;#m;#u;#g;#f;#y;constructor(e){this.#e=new dt,this.#t=e,this.#n=[],this.#s=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#y={packageDependencies:this.#n,packageDevDependencies:this.#s,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:$t,registerToPackageManager:this.registerToPackageManager.bind(this)}}async _cache_set(e,t,a){this._redis_client&&await this._redis_client.SETEX(e,a||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await lt(),this.#c=this.#t.buildId||pt(24),this.#y.buildId=this.#c,this.#m=this.#t.mode,this.#u=["all","deploy","build","file"].includes(this.#m),this.#g=["all","deploy","build"].includes(this.#m),this.#f=["all","deploy"].includes(this.#m),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(St({optional:!0,name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await mt(this.#y),await ut(this.#y),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#d}),this.#y.atomAccessToken=this.#r)}async initLibrary(){const e=this.#t.id;this.#a=this.#t.project?.libraryAtom||await $t.get({id:e});let t=this.#a.doc.bundleName;t=t||(this.#a.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#a.doc.bundleName=t,this.#a.type=this.#a.type||"workflow.lib",this.#y.atom=this.#a}async initLibraryDir(){const e=this.#t.projectDir;let t;const a=["node_modules"];if(it.existsSync(e)&&it.readdirSync(e).forEach((o=>{a.includes(o)||(t=rt.rm("-rf",nt.join(e,o)))})),t=rt.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=rt.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=rt.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#o=ct.configure(e,{watch:!1,dev:!0}),this.#y.njEnv=this.#o}async initLibs(){const e=[{name:this.#a.doc.name,type:"atom",parent_id:this.#a.parent_id}];this.#i=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#n})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const a=e.filter((e=>"atom"===e.type));for(let e=0;e<a.length;e++){const o=a[e],i=await this.findAtomLibrary({url:o.name});o.atom=i;const n=i.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 t=It({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#p),"ac:"===t.protocol){const a=t.pathname.split("/");if(1===a.length)return await $t.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===a.length){const e=await $t.first({where:{name:a[0],parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"folder"}});return await $t.first({where:{name:a[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#a;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=nt.resolve(this.#t.projectSrcDir,"index.js"),a=await Ct({file:t,recursive:!0}),o=e.doc.dependencies,i=!0===this.#a.doc.features.all_parsed_imports?a.all:a.required;for await(const e of i){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=await Et({name:e.package,count:1});o.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#a.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const a=t[e].atom,o=this.#t.projectDir;if("local:"===a.protocol){const e=nt.resolve(this.#t.projectSrcDir,`${a.fileName||a.name}.js`),t=nt.relative(`${this.#t.projectDir}/src/default/`,e);if(!it.existsSync(e)){it.mkdirSync(nt.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",it.writeFileSync(e,t,"utf8")}a.relativePath=t,this.#a.typesDir=`./types/${nt.basename(o)}/src`}else{const e=`${o}/src/libs/${a.id}.js`,t=a.doc.contents?.find((e=>"esm"===e.format))||a.doc;it.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#i.filter((e=>"atom"===e.type)),libraryAtom:this.#a,atom:this.#a},t=this.#t.templateDir,a=ct.compile(it.readFileSync(nt.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#o).render(e),o=this.#t.projectDir,i=nt.resolve(o,"src/default/index.js");it.writeFileSync(i,a,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:a,...o}=this.#a.doc,i={content:st.dump(o)},n=this.#t.templateDir,s=ct.compile(it.readFileSync(nt.resolve(n,`${e}.njk`),"utf8"),this.#o).render(i),r=this.#t.projectDir,c=nt.resolve(r,`${e}`);it.writeFileSync(c,s,"utf8")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let a=e[t];await this.deployProject({deploymentProject:a}),!0===a.isDirty&&await a.save()}}else if(this.#a.id){const e=await $t.list({type:"library.deploy",parent_id:this.#a.id});for(let t=0;t<e.length;t++){let a=e[t];await this.deployProject({deploymentProject:a}),!0===a.isDirty&&(a=await $t.update(a,{id:a.id}))}}}async deployProject(e){const{deploymentProject:t}=e,a=t.doc.targets||[];for(let e=0;e<a.length;e++){const o=a[e];await Pt({...this.#y,deploymentProject:t,deploymentProjectTarget:o})}}async registerToPackageManager(e){const{target:t,packageJSON:a}=e;if(!this.#t.id)return;let o=await $t.first({name:t.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});o?(o.doc.versions.splice(0,0,{v:a.version}),await $t.update(o,{id:o.id})):o=await $t.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:a.version}]}})}async setInProgress({message:e}){console.log(At.blue(e)),await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#u&&(await this.createAtomLibFiles({libs:this.#i}),await this.createEngine(),await this.createProjectYaml(),await vt(this.#y),await jt(this.#y),await ht(this.#y),await wt(this.#y),await yt(this.#y),await gt(this.#y),await bt(this.#y),await ft(this.#y),await _t(this.#y),await xt(this.#y),this.#g&&(await kt(this.#y),await Dt(this.#y),this.#f&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const Tt=c,qt=l;var Ot=function({baseDir:e=__dirname}){let t=e;for(;t!==qt.parse(t).root;){const e=qt.join(t,"node_modules");if(Tt.existsSync(e))return e;t=qt.dirname(t)}return null};const Rt=process.cwd();e({name:["redis"],dir:Rt,optional:!0});const Mt=t,Lt=a,{hideBin:Nt}=o,Bt=i,Jt=n,Kt=s,Ut=r,zt=Ft,Ht=Ot({baseDir:__dirname});async function Gt(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:Mt.resolve(Ht,"./@flownet/template-node-library/default"),templateCommonDir:Mt.resolve(Ht,"./@flownet/template-node-common/default"),projectDir:Mt.resolve(Rt,`./.output/${e.id}`),coreDir:Mt.resolve(Ht,"./@flownet/template-node-library/core")};{const t=await async function(){const e=Mt.resolve(Rt,"node.yaml");if(!Bt.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Bt.readFileSync(e,"utf8"),a=Jt.parse(t),o=Mt.dirname(e),i={libraryAtom:{doc:{...a,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:o,projectFilePath:e,projectFileContent:t,projectFileParsed:a},n=Mt.resolve(o,"node.devops.yaml");if(Bt.existsSync(n)){const e=Bt.readFileSync(n,"utf8"),t=Jt.parse(e);i.devops={filePath:n,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Bt.writeFileSync(i.devops.filePath,Jt.stringify(i.devops.doc))}}}const s=Mt.resolve(o,"node.readme.md");if(Bt.existsSync(s)){const e=Bt.readFileSync(s,"utf8");i.readme={filePath:s,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return i}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:Mt.resolve(Ht,"./@flownet/template-node-library/default"),templateCommonDir:Mt.resolve(Ht,"./@flownet/template-node-common/default"),coreDir:Mt.resolve(Ht,"./@flownet/template-node-library/core"),projectDir:Mt.resolve(t.projectDir,"./.workspace"),projectSrcDir:Mt.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Ht}/.bin:${process.env.PATH}`,Lt(Nt(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=Mt.resolve(Ht,"@flownet/template-node-library/project"),a=Mt.resolve(Rt,e.name);Bt.existsSync(a)||Bt.mkdirSync(a),await Ut({dir:t,outDir:a,context:e});let o=Kt.exec("fnode build",{cwd:a});if(0!==o.code)throw new Error("Failed to build project.");if(Kt.which("git")&&(o=Kt.exec("git init",{cwd:a}),0!==o.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await Gt(e),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("deploy","Build and deploy flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Gt({...e,mode:"all"}),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("file","Just create files",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Gt({...e,mode:"file"}),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`node ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run serve ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run watch ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("app [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run app ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("cli [commands..]","npm run cli - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Gt(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run cli ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
2
+ "use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),a=require("yargs/yargs"),o=require("yargs/helpers"),i=require("fs"),n=require("yaml"),s=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("redis"),u=require("@flownet/lib-is-redis-online"),g=require("nanoid"),f=require("@flownet/lib-atom-api-js"),y=require("axios"),b=require("qs"),w=require("lodash.merge"),h=require("@flownet/lib-list-npm-versions"),j=require("@flownet/lib-parse-imports-js"),v=require("@fnet/shell"),_=require("semver"),x=require("node:os"),k=require("@node-red/util"),D=require("@flownet/lib-to-ios-app"),$=require("@flownet/lib-to-macos-app"),I=require("@flownet/lib-to-electron"),P=require("@flownet/lib-to-webos"),S=require("@flownet/lib-to-nextjs"),C=require("lodash.clonedeep"),E=require("@flownet/lib-parse-node-url"),A=require("@flownet/lib-pick-npm-versions"),F=require("chalk");const T=m,q=u;const{Api:O}=f,R=y.default,L=b;const N=w;const M=h;const B=c,J=l,K=r;const U=d,z=c,G=l,H=j,Y=h;const W=c,X=l,Z=r;const Q=c,V=l,ee=d,te=j;const ae=c,oe=l,ie=d;const ne=c,se=l,re=d;const ce=c,le=l,pe=d;const de=d,me=c,ue=l;const ge=s;const fe=s;const ye=s;const be=s;const we=v,he=e;const je=c,ve=l,_e=_,xe=v,ke=e;const De=c,$e=l,Ie=_,Pe=s,Se=e;const Ce=c,Ee=l,Ae=x,Fe=d,Te=k,qe=e;const Oe=i,Re=t,Le=e;const Ne=D;const Me=$;const Be=I;const Je=P;const Ke=S,Ue=C,ze=w,Ge=_,He=l;const Ye=async({setInProgress:e,context:t,deploymentProject:a,deploymentProjectTarget:o,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const n=t.projectDir;let s="fnet-to-gitlab";const r=o.params.config||"gitlab",c=he({name:r,dir:t.projectDir});if(!c)throw new Error(`Couldnt load config ${r}`);const{data:l}=c.data;s+=` --projectGroupId=${l.projectGroupId}`,s+=` --projectPath='${n}'`,s+=` --projectName='${o.params.name}'`,s+=` --projectBranch='${o.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==o.dryRun&&(await we({cmd:s}),a.isDirty=!0)},We=async({setInProgress:e,context:t,deploymentProject:a,deploymentProjectTarget:o,registerToPackageManager:i})=>{await e({message:"Deploying it as gcs package."});const n=t.projectDir,s=ve.resolve(n,"package.json"),r=je.readFileSync(s),c=JSON.parse(r);c.name=o.params.name,c.version=_e.inc(o.params.version,"patch"),delete c.scripts,delete c.devDependencies,je.writeFileSync(s,JSON.stringify(c,null,"\t"));const{file:l,data:p}=await ke({name:o.params.config||t.gcsConfig||"gcs",dir:t.projectDir});let d="fnet-upload-files-to-gcs";d+=` --projectId='${p.env.GCS_PROJECT_ID}'`,d+=` --bucketName='${p.env.GCS_BUCKET_NAME}'`,d+=` --keyFilename='${ve.resolve(ve.dirname(l),p.env.GCS_UPLOADER_KEY_FILE)}'`,d+=` --dir='${n}'`,d+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",d+=` --destDir='${c.name}/${c.version}'`,d+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(d+=" --dryRun"),await xe({cmd:d}),je.writeFileSync(s,r),!0!==o.dryRun&&(a.isDirty=!0,o.params.version=c.version,await i({target:o,packageJSON:c}))},Xe=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const n=a.projectDir,s=$e.resolve(n,"package.json"),r=De.readFileSync(s),c=JSON.parse(r);c.name=i.params.name,c.version=Ie.inc(i.params.version,"patch");const l=i.params.bin?.name||i.params.bin;!1!==i.params.bin?.enabled&&l&&"string"==typeof l&&(c.bin={[l]:"dist/cli/cjs/index.js",[e.doc.name]:"dist/cli/cjs/index.js"}),delete c.scripts,delete c.devDependencies,c.scripts={serve:"npx serve ."},De.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Se({name:a.npmConfig||"npm",dir:a.projectDir})?.data);if(De.writeFileSync($e.resolve(n,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==Pe.exec("npm publish --access public",{cwd:n}).code)throw new Error("Couldnt publish to npm");De.writeFileSync(s,r),o.isDirty=!0,i.params.version=c.version},Ze=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n,packageDependencies:s,njEnv:r})=>{await t({message:"Deploying it as node-red flow."});const c=a.projectDir,l=a.templateDir,p="workflow"===e.type?"WF":"LIB";let d;if("simple"===i.deploy.template)d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Te.util.generateId(),...i.params?.inject,payload:"json"===i.params?.inject?.payloadType?`'${JSON.stringify(i.params?.inject?.payload)}'`:i.params?.inject?.payload},debug:{id:Te.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.params?.schedules?cloneDeep(i.params?.schedules):void 0;t?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Te.util.generateId(),schedules:t},debug:{id:Te.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Te.util.generateId(),label:`${p}/${e.id?e.id:Ae.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Te.util.generateId(),name:e.doc.name,initialize:{content:Ce.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Te.util.generateId(),method:i.params.method||"get",url:i.params.url},httpout:{id:Te.util.generateId()},debug:{id:Te.util.generateId()}}}}let m=Fe.compile(Ce.readFileSync(Ee.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Ce.writeFileSync(Ee.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;o.isDirty=!0;const u=await(qe({name:a.redConfig||"red",dir:a.projectDir})?.data),g=i.deploy.url||u.env.RED_URL,f={};if(!1!==i.deploy.auth&&(f.Authorization="Bearer "+atomAccessToken),i.deploy.id)!0===i.actions?.delete?(await axios({method:"DELETE",url:`${g}/flow/${i.deploy.id}`,headers:f}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${g}/flow/${i.deploy.id}`,data:m,headers:f});else{const e=await axios({method:"POST",url:`${g}/flow`,data:m,headers:f});i.deploy.id=e.data.id}},Qe=async({atom:e,Atom:t,setInProgress:a,context:o,packageDependencies:i,deploymentProject:n,deploymentProjectTarget:s})=>{await a({message:"Deploying it as workflow lib."});const r=await(Le({name:"atom",dir:o.projectDir})?.data);let c,l,p,d=s.deploy.name.split("/");if(1===d.length)l=r.env.ATOM_LIBRARIES_ID,p=s.deploy.name;else{if(2!==d.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:d[0],parent_id:r.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");l=e.id,p=d[1]}}if(!0===s.dryRun)return;if(n.isDirty=!0,s.deploy.id){if(c=await t.get({id:s.deploy.id}),!c)return}else{if(c=await t.create({parent_id:l,doc:{name:p,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!c)return;s.deploy.id=c.id}const m=o.projectDir;c.doc.contents=[{content:Oe.readFileSync(Re.resolve(m,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:Oe.readFileSync(Re.resolve(m,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:Oe.readFileSync(Re.resolve(m,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],c.doc.name=p,c.doc.dependencies=i,"workflow.lib"===e.type?c.doc.subtype="library":"workflow"===e.type&&(c.doc.subtype="workflow"),c=await t.update(c,{id:c.id})},Ve=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n,registerToPackageManager:s})=>{await t({message:"Deploying it as ios app package."});const r=a.projectDir;if(!0===i.dryRun)return;const c={projectDir:r,dest:r,atom:e,params:i.params};await Ne(c),o.isDirty=!0},et=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n})=>{await t({message:"Deploying it as macos app package."});const s=a.projectDir;if(!0===i.dryRun)return;const r={projectDir:s,dest:s,atom:e,params:i.params};await Me(r),o.isDirty=!0},tt=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i,buildId:n})=>{await t({message:"Deploying it as electron package."});const s=a.projectDir;if(!0===i.dryRun)return;const r={src:s,dest:s,atom:e,params:i.params};await Be(r),o.isDirty=!0},at=async({atom:e,setInProgress:t,context:a,deploymentProject:o,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const n=a.projectDir;if(!0===i.dryRun)return;const s={src:n,dest:n,atom:e,params:i.params};await Je(s),o.isDirty=!0},ot=async({atom:e,target:t,onProgress:a,projectDir:o,dependencies:i})=>{a&&await a({message:"Deploying it as nextjs package."});t.params=ze({name:"nextjs-app",version:"0.1.0"},t.params);const n=Ge.inc(t.params.version,"patch");t.params.version=n;const s=Ue(t);s.params.dependencies=Ue(i);const r={atom:e,target:s.params,projectDir:o,renderDir:He.resolve(o,"nextjs")};return{deployer:await Ke(r)}};const it=c,nt=l,st=p,rt=s,ct=d,lt=async()=>{if(!await q({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=T.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:pt}=g,dt=class{init({config:e,accessToken:t}){return new Promise(((a,o)=>{if(O.set_api_url(e.data.url),t)return O.set_req_token(t),void a(t);R({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:L.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{O.set_req_token(e.data.access_token),a(e.data.access_token)})).catch((e=>{O.set_req_token(),o(e)}))}))}},mt=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled;const a="workflow.lib"===e.type;!1===t.app?t.app={enabled:!1}:!0===t.app?t.app={enabled:!0,extend:!1,export:!0,react:a}:t.app={enabled:!0,extend:!1,export:!0,react:a,...t.app||{}},t.app.enabled=!0===t.app.enabled&&(!0===e.doc.features.form_enabled||!0===t.app.extend||!0===t.app.enabled),t.app.format=t.app.format||"esm",t.app.folder=t.app.folder||t.app.format||"default",!1===t.cli?t.cli={enabled:!1}:!0===t.cli?t.cli={enabled:!0,extend:!1,export:!0}:t.cli={enabled:!0,extend:!1,export:!0,...t.cli||{}},t.cli.enabled=!0===t.cli.enabled&&(!1===e.doc.features.form_enabled||!0===t.cli.extend||!0===t.cli.enabled),t.cli.format=t.cli.format||"cjs",t.cli.folder=t.cli.folder||t.cli.folder||"cjs";const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1,enabled:!0},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1,enabled:!0},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0,terser:!0},umd:{format:"umd",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!1}},i={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.app.enabled&&(t.app.dir=`./dist/app/${t.app.folder}`,o.app={format:t.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:t.app.dir,terser:!0,output_exports:!1===t.app.export?"none":"auto"},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:t.app.dir})),!0===t.cli.enabled&&(t.cli.dir=`./dist/cli/${t.cli.folder}`,o.cli={format:t.cli.format,context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:t.cli.dir,banner:"#!/usr/bin/env node",terser:!1,output_exports:!1===t.cli.export?"none":"auto"}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=N({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=N({},t.replace_options||t.replace?.options||{}),t.terser_options=N({},t.terser_options||t.terser?.options||{}),t.css_options=N({},t.css_options||t.css?.options||{}),t.wasm_options=N({},t.wasm_options||t.wasm?.options||{}),t.copy_options=N(i,t.copy_options||t.copy?.options||{}),t.json_options=N({},t.json_options||t.json?.options||{}),t.image_options=N({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=N(o,t.rollup_output||t.rollup?.output||{});const n=Object.keys(o);for(const e of n){const a=o[e];a&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(a.enabled=!0),a.babel_options=a.babel_options||t.babel_options,a.browsersync_options=N(t.browsersync_options,a.browsersync_options),a.replace_options=N(t.replace_options,a.replace_options),a.terser_options=N(t.terser_options,a.terser_options),a.css_options=N(t.css_options,a.css_options),a.wasm_options=N(t.wasm_options,a.wasm_options),a.copy_options=N(t.copy_options,a.copy_options),a.json_options=N(t.json_options,a.json_options),a.image_options=N(t.image_options,a.image_options),t.form_enabled&&(a.babel=!0)):a.enabled=!1)}t.babel_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=n.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&t.app.enabled,t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.app.enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},ut=async({atom:e,packageDependencies:t,packageDevDependencies:a})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let a="^18.2";a=`^${(await M({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:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(!0===e.doc.features.cli.enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),a.push({package:"@babel/core",version:"^7.23"}),a.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),a.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),a.push({package:"@rollup/plugin-replace",version:"^5.0"}),a.push({package:"rollup",version:"^3.26"}),a.push({package:"rollup-plugin-delete",version:"^2.0"}),a.push({package:"rollup-plugin-dts",version:"^6.0"}),a.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),a.push({package:"@rollup/plugin-alias",version:"^5.0"}),e.doc.features.babel_enabled&&(a.push({package:"@rollup/plugin-babel",version:"^6.0"}),a.push({package:"@babel/preset-env",version:"7.22"}),a.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&a.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&a.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&a.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&a.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&a.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){a.push({package:"rollup-plugin-postcss",version:"4.0"}),a.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":a.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":a.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":a.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":a.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":a.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&a.push({package:"rollup-plugin-copy",version:"^3.5"})},gt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,ts:Date.now()},n=a.templateDir,s=J.resolve(a.projectDir,"src/app");B.existsSync(s)||B.mkdirSync(s,{recursive:!0}),await K({pattern:["index.html.njk","index.js.njk"],dir:J.resolve(n,"src/app"),outDir:s,context:i})},ft=async({atom:e,context:t,packageDependencies:a,packageDevDependencies:o,setInProgress:i})=>{await i({message:"Creating package.json."});const n=a.find((e=>"react"===e.package)),s=a.find((e=>"react-dom"===e.package));n&&!s?a.push({package:"react-dom",version:n.version}):n&&s&&(s.version=n.version),n&&e.doc.features.react_version>=17&&(a.find((e=>"@emotion/react"===e.package))||a.push({package:"@emotion/react",version:"^11"}),a.find((e=>"@emotion/styled"===e.package))||a.push({package:"@emotion/styled",version:"^11"}));const r=[];!0===e.doc.features.app.enabled&&r.push(G.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.cli.enabled&&r.push(G.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!z.existsSync(i))throw new Error(`App file not found: ${i}`);const n=await H({file:i,recursive:!0}),s=!0===e.doc.features.all_parsed_imports?n.all:n.required;for await(const e of s){if("npm"!==e.type)continue;if(a.find((t=>t.package===e.package)))continue;if(o.find((t=>t.package===e.package)))continue;const t=(await Y({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:a,packageDevDependencies:o},l=t.templateCommonDir,p=U.compile(z.readFileSync(G.resolve(l,"package.json.njk"),"utf8"),U.configure(l)).render(c),d=t.projectDir,m=G.resolve(d,"package.json");z.writeFileSync(m,p,"utf8")},yt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o},n=a.templateDir,s=X.resolve(a.projectDir,"src/cli");W.existsSync(s)||W.mkdirSync(s,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(n,"src/cli"),outDir:s,context:i})},bt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:o},n=V.resolve(a.projectDir,"src","default/index.js");if(!Q.existsSync(n))throw new Error(`Entry file not found: ${n}`);const s=(await te({file:n,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),r=e.doc.features.rollup_output,c=Object.keys(r);for(let e=0;e<c.length;e++){const t=r[c[e]];if(!0===t.browser&&s.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(s.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<s.length;e++){const a=s[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(s)}}const l=a.templateCommonDir,p=ee.compile(Q.readFileSync(V.resolve(l,"rollup.config.js.njk"),"utf8"),ee.configure(l)).render(i),d=a.projectDir,m=V.resolve(d,"rollup.config.js");Q.writeFileSync(m,p,"utf8")},wt=async({atom:e,setInProgress:t,context:a,njEnv:o})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating yargs."});const i={},n=e.doc.inputs||[],s=[];n.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&s.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),i[e.name]=t}));const r={options:i,imports:s,atom:e},c=a.templateDir,l=ie.compile(ae.readFileSync(oe.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),o).render(r),p=a.projectDir,d=oe.resolve(p,"src/default/to.yargs.js");ae.writeFileSync(d,l,"utf8")},ht=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:o},n=a.templateCommonDir,s=re.compile(ne.readFileSync(se.resolve(n,".gitignore.njk"),"utf8"),re.configure(n)).render(i),r=a.projectDir,c=se.resolve(r,".gitignore");ne.writeFileSync(c,s,"utf8")},jt=async({atom:e,setInProgress:t,context:a,packageDependencies:o})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:o},n=a.templateCommonDir,s=pe.compile(ce.readFileSync(le.resolve(n,"tsconfig.json.njk"),"utf8"),pe.configure(n)).render(i),r=a.projectDir,c=le.resolve(r,"tsconfig.json");ce.writeFileSync(c,s,"utf8")},vt=async({atom:e,context:t,setInProgress:a,Atom:o})=>{const i="readme.md",n=`Creating ${i}`;if(await a({message:n}),t.project?.readme){const e={content:t.project.readme.doc.content},a=t.templateCommonDir,o=de.compile(me.readFileSync(ue.resolve(a,`${i}.njk`),"utf8"),de.configure(a)).render(e),n=t.projectDir,s=ue.resolve(n,`${i}`);me.writeFileSync(s,o,"utf8")}else if(e.id){const a=await o.first({type:"wiki",parent_id:e.id});if(!a||"markdown"!==a.doc?.["content-type"])return;const{content:n,...s}=a.doc,r={content:n},c=t.templateCommonDir,l=de.compile(me.readFileSync(ue.resolve(c,`${i}.njk`),"utf8"),de.configure(c)).render(r),p=t.projectDir,d=ue.resolve(p,`${i}`);me.writeFileSync(d,l,"utf8")}},_t=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Prettifiying source files."});if(0!==ge.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:a}).code)throw new Error("Couldnt format files.")},xt=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Creating .d.ts"});if(0!==fe.exec("tsc",{cwd:a}).code)throw new Error("Couldnt create .d.ts files.")},kt=async({setInProgress:e,atom:t,context:a})=>{const o=a.projectDir;await e({message:"Installing npm packages."});if(0!==ye.exec(`npm install ${t.doc.features.npm_install_flags}`,{cwd:o}).code)throw new Error("Couldnt install npm packages.")},Dt=async({setInProgress:e,context:t})=>{const a=t.projectDir;await e({message:"Building main project."});if(0!==be.exec("npm run build",{cwd:a}).code)throw new Error("Couldnt build project.")},$t=async e=>{const{atom:t,packageDependencies:a,context:o,deploymentProjectTarget:i,setInProgress:n}=e;if(!0===i.enabled)if("lib"===i.name)await Qe({...e});else if("red"===i.name)await Ze({...e});else if("npm"===i.name)await Xe({...e});else if("gcs"===i.name)await We({...e});else if("gitlab"===i.name)await Ye({...e});else if("macos-app"===i.name)await et({...e});else if("ios-app"===i.name)await Ve({...e});else if("electron"===i.name)await tt({...e});else if("webos"===i.name)await at({...e});else{let e;if("nextjs"===i.name&&(e=ot),!e)return;await e({atom:t,target:i,onProgress:n,projectDir:o.projectDir,dependencies:a})}},{Atom:It}=f,Pt=E,St=e,Ct=j,Et=A,At=F;var Ft=class{#e;#t;#a;#o;#i;#n;#s;#r;#c;#l;#p;#d;#m;#u;#g;#f;#y;constructor(e){this.#e=new dt,this.#t=e,this.#n=[],this.#s=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#y={packageDependencies:this.#n,packageDevDependencies:this.#s,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:It,registerToPackageManager:this.registerToPackageManager.bind(this)}}async _cache_set(e,t,a){this._redis_client&&await this._redis_client.SETEX(e,a||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await lt(),this.#c=this.#t.buildId||pt(24),this.#y.buildId=this.#c,this.#m=this.#t.mode,this.#u=["all","deploy","build","file"].includes(this.#m),this.#g=["all","deploy","build"].includes(this.#m),this.#f=["all","deploy"].includes(this.#m),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(St({optional:!0,name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await mt(this.#y),await ut(this.#y),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#d}),this.#y.atomAccessToken=this.#r)}async initLibrary(){const e=this.#t.id;this.#a=this.#t.project?.libraryAtom||await It.get({id:e});let t=this.#a.doc.bundleName;t=t||(this.#a.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#a.doc.bundleName=t,this.#a.type=this.#a.type||"workflow.lib",this.#y.atom=this.#a}async initLibraryDir(){const e=this.#t.projectDir;let t;const a=["node_modules"];if(it.existsSync(e)&&it.readdirSync(e).forEach((o=>{a.includes(o)||(t=rt.rm("-rf",nt.join(e,o)))})),t=rt.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=rt.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=rt.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#o=ct.configure(e,{watch:!1,dev:!0}),this.#y.njEnv=this.#o}async initLibs(){const e=[{name:this.#a.doc.name,type:"atom",parent_id:this.#a.parent_id}];this.#i=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#n})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const a=e.filter((e=>"atom"===e.type));for(let e=0;e<a.length;e++){const o=a[e],i=await this.findAtomLibrary({url:o.name});o.atom=i;const n=i.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 t=Pt({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#p),"ac:"===t.protocol){const a=t.pathname.split("/");if(1===a.length)return await It.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===a.length){const e=await It.first({where:{name:a[0],parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"folder"}});return await It.first({where:{name:a[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#a;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=nt.resolve(this.#t.projectSrcDir,"index.js"),a=await Ct({file:t,recursive:!0}),o=e.doc.dependencies,i=!0===this.#a.doc.features.all_parsed_imports?a.all:a.required;for await(const e of i){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=await Et({name:e.package,count:1});o.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#a.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const a=t[e].atom,o=this.#t.projectDir;if("local:"===a.protocol){const e=nt.resolve(this.#t.projectSrcDir,`${a.fileName||a.name}.js`),t=nt.relative(`${this.#t.projectDir}/src/default/`,e);if(!it.existsSync(e)){it.mkdirSync(nt.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",it.writeFileSync(e,t,"utf8")}a.relativePath=t,this.#a.typesDir=`./types/${nt.basename(o)}/src`}else{const e=`${o}/src/libs/${a.id}.js`,t=a.doc.contents?.find((e=>"esm"===e.format))||a.doc;it.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#i.filter((e=>"atom"===e.type)),libraryAtom:this.#a,atom:this.#a},t=this.#t.templateDir,a=ct.compile(it.readFileSync(nt.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#o).render(e),o=this.#t.projectDir,i=nt.resolve(o,"src/default/index.js");it.writeFileSync(i,a,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:a,...o}=this.#a.doc,i={content:st.dump(o)},n=this.#t.templateDir,s=ct.compile(it.readFileSync(nt.resolve(n,`${e}.njk`),"utf8"),this.#o).render(i),r=this.#t.projectDir,c=nt.resolve(r,`${e}`);it.writeFileSync(c,s,"utf8")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let a=e[t];await this.deployProject({deploymentProject:a}),!0===a.isDirty&&await a.save()}}else if(this.#a.id){const e=await It.list({type:"library.deploy",parent_id:this.#a.id});for(let t=0;t<e.length;t++){let a=e[t];await this.deployProject({deploymentProject:a}),!0===a.isDirty&&(a=await It.update(a,{id:a.id}))}}}async deployProject(e){const{deploymentProject:t}=e,a=t.doc.targets||[];for(let e=0;e<a.length;e++){const o=a[e];await $t({...this.#y,deploymentProject:t,deploymentProjectTarget:o})}}async registerToPackageManager(e){const{target:t,packageJSON:a}=e;if(!this.#t.id)return;let o=await It.first({name:t.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});o?(o.doc.versions.splice(0,0,{v:a.version}),await It.update(o,{id:o.id})):o=await It.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:a.version}]}})}async setInProgress({message:e}){console.log(At.blue(e)),await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#u&&(await this.createAtomLibFiles({libs:this.#i}),await this.createEngine(),await this.createProjectYaml(),await vt(this.#y),await jt(this.#y),await ht(this.#y),await wt(this.#y),await yt(this.#y),await gt(this.#y),await bt(this.#y),await ft(this.#y),await _t(this.#y),await xt(this.#y),this.#g&&(await kt(this.#y),await Dt(this.#y),this.#f&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const Tt=c,qt=l;var Ot=function({baseDir:e=__dirname}){let t=e;for(;t!==qt.parse(t).root;){const e=qt.join(t,"node_modules");if(Tt.existsSync(e))return e;t=qt.dirname(t)}return null};const Rt=process.cwd();e({name:["redis"],dir:Rt,optional:!0});const Lt=t,Nt=a,{hideBin:Mt}=o,Bt=i,Jt=n,Kt=s,Ut=r,zt=Ft,Gt=Ot({baseDir:__dirname});async function Ht(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:Lt.resolve(Gt,"./@flownet/template-node-library/default"),templateCommonDir:Lt.resolve(Gt,"./@flownet/template-node-common/default"),projectDir:Lt.resolve(Rt,`./.output/${e.id}`),coreDir:Lt.resolve(Gt,"./@flownet/template-node-library/core")};{const t=await async function(){const e=Lt.resolve(Rt,"node.yaml");if(!Bt.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Bt.readFileSync(e,"utf8"),a=Jt.parse(t),o=Lt.dirname(e),i={libraryAtom:{doc:{...a,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:o,projectFilePath:e,projectFileContent:t,projectFileParsed:a},n=Lt.resolve(o,"node.devops.yaml");if(Bt.existsSync(n)){const e=Bt.readFileSync(n,"utf8"),t=Jt.parse(e);i.devops={filePath:n,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Bt.writeFileSync(i.devops.filePath,Jt.stringify(i.devops.doc))}}}const s=Lt.resolve(o,"node.readme.md");if(Bt.existsSync(s)){const e=Bt.readFileSync(s,"utf8");i.readme={filePath:s,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return i}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:Lt.resolve(Gt,"./@flownet/template-node-library/default"),templateCommonDir:Lt.resolve(Gt,"./@flownet/template-node-common/default"),coreDir:Lt.resolve(Gt,"./@flownet/template-node-library/core"),projectDir:Lt.resolve(t.projectDir,"./.workspace"),projectSrcDir:Lt.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Gt}/.bin:${process.env.PATH}`,Nt(Mt(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=Lt.resolve(Gt,"@flownet/template-node-library/project"),a=Lt.resolve(Rt,e.name);Bt.existsSync(a)||Bt.mkdirSync(a),await Ut({dir:t,outDir:a,context:e});let o=Kt.exec("fnode build",{cwd:a});if(0!==o.code)throw new Error("Failed to build project.");if(Kt.which("git")&&(o=Kt.exec("git init",{cwd:a}),0!==o.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await Ht(e),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("deploy","Build and deploy flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Ht({...e,mode:"all"}),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("file","Just create files",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Ht({...e,mode:"file"}),a=new zt(t);await a.init(),await a.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`node ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run serve ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run watch ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("app [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run app ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("cli [commands..]","npm run cli - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ht(e),{projectDir:a}=t,o=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),n=`npm run cli ${o.join(" ")} ${i}`;Kt.exec(n,{cwd:a}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),n=require("yargs/helpers"),i=require("fs"),a=require("yaml"),s=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),f=require("isobject"),u=require("redis"),y=require("@flownet/lib-is-redis-online"),h=require("nanoid"),w=require("@flownet/lib-atom-api-js"),g=require("axios"),b=require("qs"),x=require("lodash.merge"),k=require("@flownet/lib-list-npm-versions"),v=require("@flownet/lib-parse-imports-js"),j=require("@fnet/shell"),_=require("semver"),D=require("node:os"),T=require("@node-red/util"),P=require("@flownet/lib-to-ios-app"),$=require("@flownet/lib-to-macos-app"),S=require("@flownet/lib-to-electron"),C=require("@flownet/lib-to-webos"),I=require("@flownet/lib-to-nextjs"),E=require("@flownet/lib-parse-node-url"),F=require("@flownet/lib-bpmn-from-flow"),N=require("@fnet/expression"),A=require("chalk");const O=u,B=y;const{Api:q}=w,M=g.default,R=b;const J=x;const L=k;const K=c,U=l,W=r;const z=d,H=c,Y=l,G=v,V=k;const X=c,Z=l,Q=r;const ee=c,te=l,oe=d,ne=v;const ie=c,ae=l,se=d;const re=c,ce=l,le=d;const pe=c,de=l,me=d;const fe=d,ue=c,ye=l;const he=s;const we=s;const ge=s;const be=s;const xe=j,ke=e;const ve=c,je=l,_e=_,De=j,Te=e;const Pe=c,$e=l,Se=_,Ce=s,Ie=e;const Ee=c,Fe=l,Ne=D,Ae=d,Oe=T,Be=e;const qe=i,Me=t,Re=e;const Je=P;const Le=$;const Ke=S;const Ue=C;const We=I,ze=m,He=x,Ye=_,Ge=l;const Ve=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const a=t.projectDir;let s="fnet-to-gitlab";const r=n.params.config||"gitlab",c=ke({name:r,dir:t.projectDir});if(!c)throw new Error(`Couldnt load config ${r}`);const{data:l}=c.data;s+=` --projectGroupId=${l.projectGroupId}`,s+=` --projectPath='${a}'`,s+=` --projectName='${n.params.name}'`,s+=` --projectBranch='${n.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==n.dryRun&&(await xe({cmd:s}),o.isDirty=!0)},Xe=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,registerToPackageManager:i})=>{await e({message:"Deploying it as pm package."});const a=t.projectDir,s=je.resolve(a,"package.json"),r=ve.readFileSync(s),c=JSON.parse(r);c.name=n.params.name,c.version=_e.inc(n.params.version,"patch"),delete c.scripts,delete c.devDependencies,ve.writeFileSync(s,JSON.stringify(c,null,"\t"));const{file:l,data:p}=await Te({name:n.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let d="fnet-upload-files-to-gcs";d+=` --projectId='${p.env.PM_PROJECT_ID}'`,d+=` --bucketName='${p.env.PM_BUCKET_NAME}'`,d+=` --keyFilename='${je.resolve(je.dirname(l),p.env.PM_UPLOADER_KEY_FILE)}'`,d+=` --dir='${a}'`,d+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",d+=` --destDir='${c.name}/${c.version}'`,d+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===n.dryRun&&(d+=" --dryRun"),await De({cmd:d}),ve.writeFileSync(s,r),!0!==n.dryRun&&(o.isDirty=!0,n.params.version=c.version,await i({target:n,packageJSON:c}))},Ze=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const a=o.projectDir,s=$e.resolve(a,"package.json"),r=Pe.readFileSync(s),c=JSON.parse(r);c.name=i.params.name,c.version=Se.inc(i.params.version,"patch");const l=i.params.bin?.name||i.params.bin;!1!==i.params.bin?.enabled&&l&&"string"==typeof l&&(c.bin={[l]:"dist/cli/cjs/index.js",[e.doc.name]:"dist/cli/cjs/index.js"}),delete c.scripts,delete c.devDependencies,c.scripts={serve:"npx serve ."},Pe.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Ie({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(Pe.writeFileSync($e.resolve(a,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==Ce.exec("npm publish --access public",{cwd:a}).code)throw new Error("Couldnt publish to npm");Pe.writeFileSync(s,r),n.isDirty=!0,i.params.version=c.version},Qe=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a,packageDependencies:s,njEnv:r})=>{await t({message:"Deploying it as node-red flow."});const c=o.projectDir,l=o.templateDir,p="workflow"===e.type?"WF":"LIB";let d;if("simple"===i.deploy.template)d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Oe.util.generateId(),...i.params?.inject,payload:"json"===i.params?.inject?.payloadType?`'${JSON.stringify(i.params?.inject?.payload)}'`:i.params?.inject?.payload},debug:{id:Oe.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.params?.schedules?cloneDeep(i.params?.schedules):void 0;t?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Oe.util.generateId(),schedules:t},debug:{id:Oe.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Oe.util.generateId(),method:i.params.method||"get",url:i.params.url},httpout:{id:Oe.util.generateId()},debug:{id:Oe.util.generateId()}}}}let m=Ae.compile(Ee.readFileSync(Fe.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Ee.writeFileSync(Fe.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;n.isDirty=!0;const f=await(Be({name:o.redConfig||"red",dir:o.projectDir})?.data),u=i.deploy.url||f.env.RED_URL,y={};if(!1!==i.deploy.auth&&(y.Authorization="Bearer "+atomAccessToken),i.deploy.id)!0===i.actions?.delete?(await axios({method:"DELETE",url:`${u}/flow/${i.deploy.id}`,headers:y}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${u}/flow/${i.deploy.id}`,data:m,headers:y});else{const e=await axios({method:"POST",url:`${u}/flow`,data:m,headers:y});i.deploy.id=e.data.id}},et=async({atom:e,Atom:t,setInProgress:o,context:n,packageDependencies:i,deploymentProject:a,deploymentProjectTarget:s})=>{await o({message:"Deploying it as workflow lib."});const r=await(Re({name:"atom",dir:n.projectDir})?.data);let c,l,p,d=s.deploy.name.split("/");if(1===d.length)l=r.env.ATOM_LIBRARIES_ID,p=s.deploy.name;else{if(2!==d.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:d[0],parent_id:r.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");l=e.id,p=d[1]}}if(!0===s.dryRun)return;if(a.isDirty=!0,s.deploy.id){if(c=await t.get({id:s.deploy.id}),!c)return}else{if(c=await t.create({parent_id:l,doc:{name:p,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!c)return;s.deploy.id=c.id}const m=n.projectDir;c.doc.contents=[{content:qe.readFileSync(Me.resolve(m,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:qe.readFileSync(Me.resolve(m,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:qe.readFileSync(Me.resolve(m,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],c.doc.name=p,c.doc.dependencies=i,"workflow.lib"===e.type?c.doc.subtype="library":"workflow"===e.type&&(c.doc.subtype="workflow"),c=await t.update(c,{id:c.id})},tt=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a,registerToPackageManager:s})=>{await t({message:"Deploying it as ios app package."});const r=o.projectDir;if(!0===i.dryRun)return;const c={projectDir:r,dest:r,atom:e,params:i.params};await Je(c),n.isDirty=!0},ot=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a})=>{await t({message:"Deploying it as macos app package."});const s=o.projectDir;if(!0===i.dryRun)return;const r={projectDir:s,dest:s,atom:e,params:i.params};await Le(r),n.isDirty=!0},nt=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a})=>{await t({message:"Deploying it as electron package."});const s=o.projectDir;if(!0===i.dryRun)return;const r={src:s,dest:s,atom:e,params:i.params};await Ke(r),n.isDirty=!0},it=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const a=o.projectDir;if(!0===i.dryRun)return;const s={src:a,dest:a,atom:e,params:i.params};await Ue(s),n.isDirty=!0},at=async({atom:e,target:t,onProgress:o,projectDir:n,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=He({name:"nextjs-app",version:"0.1.0"},t.params);const a=Ye.inc(t.params.version,"patch");t.params.version=a;const s=ze(t);s.params.dependencies=ze(i);const r={atom:e,target:s.params,projectDir:n,renderDir:Ge.resolve(n,"nextjs")};return{deployer:await We(r)}};const st=c,rt=l,ct=p,lt=s,pt=d,dt=m,mt=f,ft=async()=>{if(!await B({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=O.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:ut}=h,yt=class{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(q.set_api_url(e.data.url),t)return q.set_req_token(t),void o(t);M({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:R.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{q.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{q.set_req_token(),n(e)}))}))}},ht=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled;const o="workflow.lib"===e.type;!1===t.app?t.app={enabled:!1}:!0===t.app?t.app={enabled:!0,extend:!1,export:!0,react:o}:t.app={enabled:!0,extend:!1,export:!0,react:o,...t.app||{}},t.app.enabled=!0===t.app.enabled&&(!0===e.doc.features.form_enabled||!0===t.app.extend||!0===t.app.enabled),t.app.format=t.app.format||"esm",t.app.folder=t.app.folder||t.app.format||"default",!1===t.cli?t.cli={enabled:!1}:!0===t.cli?t.cli={enabled:!0,extend:!1,export:!0}:t.cli={enabled:!0,extend:!1,export:!0,...t.cli||{}},t.cli.enabled=!0===t.cli.enabled&&(!1===e.doc.features.form_enabled||!0===t.cli.extend||!0===t.cli.enabled),t.cli.format=t.cli.format||"cjs",t.cli.folder=t.cli.folder||t.cli.folder||"cjs";const n={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1,enabled:!0},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1,enabled:!0},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0,terser:!0},umd:{format:"umd",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!1}},i={};!0===t.webos&&(n.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.app.enabled&&(t.app.dir=`./dist/app/${t.app.folder}`,n.app={format:t.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:t.app.dir,terser:!0,output_exports:!1===t.app.export?"none":"auto"},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:t.app.dir})),!0===t.cli.enabled&&(t.cli.dir=`./dist/cli/${t.cli.folder}`,n.cli={format:t.cli.format,context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:t.cli.dir,banner:"#!/usr/bin/env node",terser:!1,output_exports:!1===t.cli.export?"none":"auto"}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=J({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=J({},t.replace_options||t.replace?.options||{}),t.terser_options=J({},t.terser_options||t.terser?.options||{}),t.css_options=J({},t.css_options||t.css?.options||{}),t.wasm_options=J({},t.wasm_options||t.wasm?.options||{}),t.copy_options=J(i,t.copy_options||t.copy?.options||{}),t.json_options=J({},t.json_options||t.json?.options||{}),t.image_options=J({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=J(n,t.rollup_output||t.rollup?.output||{});const a=Object.keys(n);for(const e of a){const o=n[e];o&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(o.enabled=!0),o.babel_options=o.babel_options||t.babel_options,o.browsersync_options=J(t.browsersync_options,o.browsersync_options),o.replace_options=J(t.replace_options,o.replace_options),o.terser_options=J(t.terser_options,o.terser_options),o.css_options=J(t.css_options,o.css_options),o.wasm_options=J(t.wasm_options,o.wasm_options),o.copy_options=J(t.copy_options,o.copy_options),o.json_options=J(t.json_options,o.json_options),o.image_options=J(t.image_options,o.image_options),t.form_enabled&&(o.babel=!0)):o.enabled=!1)}t.babel_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=a.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&t.app.enabled,t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.app.enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},wt=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await L({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:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(!0===e.doc.features.cli.enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),o.push({package:"@rollup/plugin-alias",version:"^5.0"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},gt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n,ts:Date.now()},a=o.templateDir,s=U.resolve(o.projectDir,"src/app");K.existsSync(s)||K.mkdirSync(s,{recursive:!0}),await W({pattern:["index.html.njk","index.js.njk"],dir:U.resolve(a,"src/app"),outDir:s,context:i})},bt=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:n,setInProgress:i})=>{await i({message:"Creating package.json."});const a=o.find((e=>"react"===e.package)),s=o.find((e=>"react-dom"===e.package));a&&!s?o.push({package:"react-dom",version:a.version}):a&&s&&(s.version=a.version),a&&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 r=[];!0===e.doc.features.app.enabled&&r.push(Y.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.cli.enabled&&r.push(Y.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!H.existsSync(i))throw new Error(`App file not found: ${i}`);const a=await G({file:i,recursive:!0}),s=!0===e.doc.features.all_parsed_imports?a.all:a.required;for await(const e of s){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(n.find((t=>t.package===e.package)))continue;const t=(await V({name:e.package,groupBy:{minor:!0}}))[0][0];n.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:o,packageDevDependencies:n},l=t.templateCommonDir,p=z.compile(H.readFileSync(Y.resolve(l,"package.json.njk"),"utf8"),z.configure(l)).render(c),d=t.projectDir,m=Y.resolve(d,"package.json");H.writeFileSync(m,p,"utf8")},xt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n},a=o.templateDir,s=Z.resolve(o.projectDir,"src/cli");X.existsSync(s)||X.mkdirSync(s,{recursive:!0}),await Q({pattern:["index.js.njk"],dir:Z.resolve(a,"src/cli"),outDir:s,context:i})},kt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:n},a=te.resolve(o.projectDir,"src","default/index.js");if(!ee.existsSync(a))throw new Error(`Entry file not found: ${a}`);const s=(await ne({file:a,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),r=e.doc.features.rollup_output,c=Object.keys(r);for(let e=0;e<c.length;e++){const t=r[c[e]];if(!0===t.browser&&s.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(s.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<s.length;e++){const o=s[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(s)}}const l=o.templateCommonDir,p=oe.compile(ee.readFileSync(te.resolve(l,"rollup.config.js.njk"),"utf8"),oe.configure(l)).render(i),d=o.projectDir,m=te.resolve(d,"rollup.config.js");ee.writeFileSync(m,p,"utf8")},vt=async({atom:e,setInProgress:t,context:o,njEnv:n})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating yargs."});const i={},a=e.doc.inputs||[],s=[];a.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&s.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),i[e.name]=t}));const r={options:i,imports:s,atom:e},c=o.templateDir,l=se.compile(ie.readFileSync(ae.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=ae.resolve(p,"src/default/to.yargs.js");ie.writeFileSync(d,l,"utf8")},jt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=le.compile(re.readFileSync(ce.resolve(a,".gitignore.njk"),"utf8"),le.configure(a)).render(i),r=o.projectDir,c=ce.resolve(r,".gitignore");re.writeFileSync(c,s,"utf8")},_t=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=me.compile(pe.readFileSync(de.resolve(a,"tsconfig.json.njk"),"utf8"),me.configure(a)).render(i),r=o.projectDir,c=de.resolve(r,"tsconfig.json");pe.writeFileSync(c,s,"utf8")},Dt=async({atom:e,context:t,setInProgress:o,Atom:n})=>{const i="readme.md",a=`Creating ${i}`;if(await o({message:a}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,n=fe.compile(ue.readFileSync(ye.resolve(o,`${i}.njk`),"utf8"),fe.configure(o)).render(e),a=t.projectDir,s=ye.resolve(a,`${i}`);ue.writeFileSync(s,n,"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:a,...s}=o.doc,r={content:a},c=t.templateCommonDir,l=fe.compile(ue.readFileSync(ye.resolve(c,`${i}.njk`),"utf8"),fe.configure(c)).render(r),p=t.projectDir,d=ye.resolve(p,`${i}`);ue.writeFileSync(d,l,"utf8")}},Tt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Prettifiying source files."});if(0!==he.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:o}).code)throw new Error("Couldnt format files.")},Pt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Creating .d.ts"});if(0!==we.exec("tsc",{cwd:o}).code)throw new Error("Couldnt create .d.ts files.")},$t=async({setInProgress:e,atom:t,context:o})=>{const n=o.projectDir;await e({message:"Installing npm packages."});if(0!==ge.exec(`npm install ${t.doc.features.npm_install_flags}`,{cwd:n}).code)throw new Error("Couldnt install npm packages.")},St=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Building main project."});if(0!==be.exec("npm run build",{cwd:o}).code)throw new Error("Couldnt build project.")},Ct=async e=>{const{atom:t,packageDependencies:o,context:n,deploymentProjectTarget:i,setInProgress:a}=e;if(!0===i.enabled)if("lib"===i.name)await et({...e});else if("red"===i.name)await Qe({...e});else if("npm"===i.name)await Ze({...e});else if("pm"===i.name)await Xe({...e});else if("gitlab"===i.name)await Ve({...e});else if("macos-app"===i.name)await ot({...e});else if("ios-app"===i.name)await tt({...e});else if("electron"===i.name)await nt({...e});else if("webos"===i.name)await it({...e});else{let e;if("nextjs"===i.name&&(e=at),!e)return;await e({atom:t,target:i,onProgress:a,projectDir:n.projectDir,dependencies:o})}},{Atom:It}=w,Et=E,Ft=k,Nt=F,At=e,Ot=v,Bt=N,qt=A;var Mt=class{#e;#t;#o;#n;#i;#a;#s;#r;#c;#l;#p;#d;#m;#f;#u;#y;#h;#w;#g;#b;constructor(e){this.#e=new yt,this.#t=e,this.#a=[],this.#s=[],this.#r={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#b={packageDependencies:this.#a,packageDevDependencies:this.#s,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:It,registerToPackageManager:this.registerToPackageManager.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 ft(),this.#p=this.#t.buildId||ut(24),this.#b.buildId=this.#p,this.#u=this.#t.mode,this.#y=["all","deploy","build","file"].includes(this.#u),this.#h=["all","deploy","build"].includes(this.#u),this.#w=["all","deploy"].includes(this.#u),this.#g=["all","deploy","build","file","bpmn"].includes(this.#u),this.#m=this.#t.protocol,this.#d="BUILD:"+this.#p,this.#f=await(At({optional:!0,name:"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await ht(this.#b),await wt(this.#b),await this.transformWorkflow({workflow:this.#n});const e=await this.initNodeTree({workflow:this.#n});await this.initNodeTreeIndex({root:e}),await this.initNodeCalls({root:e}),await this.initNodeCallLibs({root:e}),await this.initNodeForms({root:e}),await this.initNodeFormLibs({root:e}),await this.initAtomLibsAndDeps({libs:e.context.libs,packageDependencies:this.#a}),await this.resolveNodeTree({root:e}),this.#l=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#c=await this.#e.init({config:this.#f}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await It.get({id:e}),this.#n="string"==typeof this.#o.doc.content?ct.load(this.#o.doc.content):this.#o.doc.content;let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow",this.#b.atom=this.#o}async initDependencies(){this.#a.push({package:"eventemitter3",version:"^4.0"}),this.#a.push({package:"get-value",version:"^3.0"}),this.#a.push({package:"set-value",version:"^4.1"}),this.#o.doc.features.form_enabled?(this.#a.push({package:"react",version:"^18.2"}),this.#a.push({package:"react-dom",version:"^18.2"}),this.#a.push({package:"@flownet/react-app",version:"^0.1"}),this.#a.push({package:"@flownet/react-app-state",version:"^0.1"})):this.#a.push({package:"yargs",version:"^17"}),this.#a.push({package:"chalk",version:"^4"})}async initWorkflowDir(){const e=this.#t.projectDir,t=this.#t.coreDir;let o;const n=["node_modules"];if(st.existsSync(e)&&st.readdirSync(e).forEach((t=>{n.includes(t)||(o=lt.rm("-rf",rt.join(e,t)))})),o=lt.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=lt.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=lt.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=lt.exec(`mkdir -p ${e}/src/default/blocks`),0!==o.code)throw new Error("Couldnt create workflow/src/default/blocks dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#i=pt.configure(e,{watch:!1,dev:!0}),this.#b.njEnv=this.#i}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],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.#o}};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};o.childs.push(n)}));for await(const e of o.childs)await this.initNode({node:e});return o}async initNode({node:e}){if(e.workflow=e.parent.workflow||e,e.depth=e.parent.depth+1,e.definition.hasOwnProperty("try")&&e.definition.hasOwnProperty("except"))await this.initBlockTypeTryExcept({node:e});else if(e.definition.hasOwnProperty("for"))await this.initBlockTypeFor({node:e});else if(e.definition.hasOwnProperty("switch"))await this.initBlockTypeSwitch({node:e});else if(e.definition.hasOwnProperty("parallel"))await this.initBlockTypeParallel({node:e});else if(e.definition.hasOwnProperty("raise"))await this.initBlockTypeRaise({node:e});else if(e.definition.hasOwnProperty("return"))await this.initBlockTypeReturn({node:e});else if(e.definition.hasOwnProperty("assign"))await this.initBlockTypeAssign({node:e});else if(e.definition.hasOwnProperty("call"))await this.initBlockTypeCall({node:e});else if(e.definition.hasOwnProperty("form"))await this.initBlockTypeForm({node:e});else if(e.definition.hasOwnProperty("shell"))await this.initBlockTypeShell({node:e});else if(e.definition.hasOwnProperty("config"))await this.initBlockTypeConfig({node:e});else if(e.definition.hasOwnProperty("operation"))await this.initBlockTypeOperation({node:e});else if(e.definition.hasOwnProperty("steps"))await this.initBlockTypeSteps({node:e});else{if(!e.definition.hasOwnProperty("next"))throw new Error("Undefined step type.");await this.initBlockTypeJump({node:e})}}async initBlockTypeTryExcept({node:e}){if(e.type="tryexcept",e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!0,e.definition.try){const t="try",o={name:t,childs:[],parent:e,definition:e.definition[t],index:e.childs.length,context:{}};e.childs.push(o),await this.initNode({node:o})}if(e.definition.except){const t="except",o={name:t,childs:[],parent:e,definition:e.definition[t],index:e.childs.length,context:{}};e.childs.push(o),await this.initNode({node:o})}}async initBlockTypeSwitch({node:e}){e.type="switch",e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0;for(let t=0;t<e.definition.switch.length;t++){const o=e.definition.switch[t],n={name:`${t}`,childs:[],parent:e,definition:o,index:e.childs.length,context:{}};e.childs.push(n),o.hasOwnProperty("steps")?await this.initNode({node:n}):(n.depth=e.depth+1,n.type="jump")}}async initBlockTypeFor({node:e}){e.type="for",e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!1;for(let t=0;t<e.definition.for.steps.length;t++){const o=e.definition.for.steps[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeSteps({node:e}){e.type||(e.type="steps");const t=e.definition.steps||[];for await(const o of t){const t=Object.keys(o)[0],n={name:t,childs:[],parent:e,definition:o[t],index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}async initBlockTypeAssign({node:e}){e.type="assign"}async initBlockTypeCall({node:e}){e.type="call";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeForm({node:e}){e.type="form";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeReturn({node:e}){e.type="return"}async initBlockTypeRaise({node:e}){e.type="raise"}async initBlockTypeJump({node:e}){e.type="jump"}async initBlockTypeOperation({node:e}){e.type="operation"}async initBlockTypeParallel({node:e}){e.type="parallel"}async initBlockTypeShell({node:e}){const t="shell",o=e.definition,n=typeof o[t];if("string"!==n&&"object"!==n)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/shell",o.args="string"===n?{cmd:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}async initBlockTypeConfig({node:e}){const t="config",o=e.definition,n=typeof o[t];if("string"!==n&&"object"!==n)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/config",o.args="string"===n?{name:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}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=rt.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const n=[];let i=e;for(;i?.parent;)n.push(i.index),i=i.parent;n.reverse(),e.codeKey=`B_${n.join("_")}_${e.type}`,e.pathKey=`${n.join(".")}`,e.typeId=ut(24);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&&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.call,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.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.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 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});n.atom=i;const a=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));a?.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}){const t=Et({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#m),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await It.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await It.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await It.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=rt.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],n=await Ot({file:e,recursive:!0});for await(const e of n.required){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=(await Ft({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:t.protocol}}if("npm:"===t.protocol){const e=(await Ft({name:t.pathname,groupBy:{minor:!0}}))[0][0];return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:[{package:t.pathname,version:`^${e}`,type:"npm"}]},protocol:t.protocol}}}}resolveNextBlock({node:e}){const t=e.definition;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;){if(t.blockAutoJumpToParent&&!0===t.blockAutoJumpToSibling){if(!0===t.blockAutoJumpToParent)break;o=t.index+1,t=t.parent;continue}const n=t.childs.find((e=>e.index===o));if(n){e.context.next=n;break}if(!0===t.blockAutoJumpToParent)break;o=t.index+1,t=t.parent}}}async resolveNodeTree({root:e}){for await(const t of e.childs)await this.resolveTypeWorkflow({node:t})}async resolveTypeWorkflow({node:e}){e.context.transform=dt(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]}}}e.context.next=e.childs[0];for await(const t of e.childs)await this.resolveType({node:t})}async resolveType({node:e}){"assign"===e.type?await this.resolveTypeAssign({node:e}):"return"===e.type?await this.resolveTypeReturn({node:e}):"call"===e.type?await this.resolveTypeCall({node:e}):"form"===e.type?await this.resolveTypeForm({node:e}):"raise"===e.type?await this.resolveTypeRaise({node:e}):"switch"===e.type?await this.resolveTypeSwitch({node:e}):"jump"===e.type?await this.resolveTypeJump({node:e}):"tryexcept"===e.type?await this.resolveTypeTryExcept({node:e}):"for"===e.type?await this.resolveTypeFor({node:e}):"operation"===e.type?await this.resolveTypeOperation({node:e}):"steps"===e.type&&await this.resolveTypeSteps({node:e});for await(const t of e.childs)await this.resolveType({node:t})}async resolveTypeAssign({node:e}){e.context.transform=dt(e.definition);const t=e.context.transform;for(let e=0;e<t.assign?.length;e++){let o=t.assign[e],n=Object.keys(o)[0],i=o[n],a={key:await this.transformExpression(n),value:await this.transformExpression(i)};t.assign[e]=a}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeSteps({node:e}){e.context.next=e.childs[0]}async resolveTypeReturn({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.return=await this.transformExpression(t.return),await this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.args&&(t.args=await this.transformExpression(t.args)),t.result&&(t.result=await this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.props&&(t.props=await this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.raise=await this.transformExpression(t.raise),await this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||dt(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||dt(t.definition),t.context.transform.condition=await this.transformExpression(t.definition.condition);await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.next=await this.transformExpression(t.next),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||dt(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||dt(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||dt(e.definition);e.context.transform.for.in=await this.transformExpression(e.definition.for.in),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||dt(e.definition),await this.resolveTypeCommon({node:e})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.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.#t.projectDir;if("local:"===o.protocol){const e=rt.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=rt.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!st.existsSync(e)){st.mkdirSync(rt.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",st.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir=`./types/${rt.basename(n)}/src`}else if("npm:"===o.protocol)o.relativePath=o.name;else{const e=`${n}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;st.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=pt.compile(st.readFileSync(rt.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render({...e,ui:{package:"@flownet/react-app"}}),n=this.#t.projectDir,i=rt.resolve(n,"src/default/index.js");st.writeFileSync(i,o,"utf8")}async createNodeTree({root:e}){await this.setInProgress({message:"Creating block files."});for await(const t of e.childs)await this.createTypeWorkflow({node:t})}async createTypeWorkflow({node:e}){const t=this.#t.templateDir,o=pt.compile(st.readFileSync(rt.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=rt.resolve(n,`src/default/${e.codeKey}.js`);st.writeFileSync(i,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"form":case"raise":case"switch":case"jump":case"tryexcept":case"for":case"operation":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.#r[e.type];if(t)return t;const o=this.#t.templateDir;return t=pt.compile(st.readFileSync(rt.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#i),this.#r[e.type]=t,t}createStepFile({node:e}){const t=this.#t.projectDir,o=`${e.codeKey}.js`,n=rt.resolve(t,`src/default/blocks/${o}`);st.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(mt(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=await this.transformValue(e[t[o]])}else if("string"==typeof e){const t=await Bt({expression:e});if(t){const{processor:o,statement:n}=t;switch(o){case"var":case"vs":case"v":e=`$::v.${n}::`;break;case"exp":case"e":e=`$::${n}::`;break;case"mod":case"m":e=`$::closure.module['${n}']::`;break;case"form":case"f":e=`$::closure.form.${n}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...n}=this.#o.doc,i={content:ct.dump(n)},a=this.#t.templateDir,s=pt.compile(st.readFileSync(rt.resolve(a,`${e}.njk`),"utf8"),this.#i).render(i),r=this.#t.projectDir,c=rt.resolve(r,`${e}`);st.writeFileSync(c,s,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:ct.dump(this.#n)},n=this.#t.templateDir,i=pt.compile(st.readFileSync(rt.resolve(n,`${e}.njk`),"utf8"),this.#i).render(o),a=this.#t.projectDir,s=rt.resolve(a,`${e}`);st.writeFileSync(s,i,"utf8")}async runPrettifier(){const e=this.#t.projectDir,t=lt.exec("prettier --write .",{cwd:rt.resolve(e,"src")});if(0!==t.code)throw new Error(t.stderr)}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.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.#o.id){const e=await It.list({type:"workflow.deploy",parent_id:this.#o.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await It.update(o,{id:o.id}))}}}async deployProject(e){const{deploymentProject:t}=e,o=t.doc.targets;for(let e=0;e<o.length;e++){const n=o[e];await Ct({...this.#b,deploymentProject:t,deploymentProjectTarget:n})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;if(!this.#t.id)return;let n=await It.first({name:t.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await It.update(n,{id:n.id})):n=await It.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){console.log(qt.blue(e)),await this._cache_set(this.#d,{status:"IN_PROGRESS",message:e})}async build(){if(this.#g&&!this.#y)return await this.createNetwork();try{const e=this.#g?await Nt({root:this.#l}):void 0;this.#y&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#g&&st.writeFileSync(rt.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#l}),await this.createEngine({root:this.#l}),await this.createNodeTree({root:this.#l}),await this.createProjectYaml(),await this.createProjectMainYaml(),await Dt(this.#b),await _t(this.#b),await jt(this.#b),await vt(this.#b),await xt(this.#b),await gt(this.#b),await kt(this.#b),await bt(this.#b),await Tt(this.#b),await Pt(this.#b),this.#h&&(await $t(this.#b),await St(this.#b),this.#w&&await this.deploy())),await this._cache_set(this.#d,{status:"COMPLETED",data:{network:e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await Nt({root:this.#l});await this._cache_set(this.#d,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}};const Rt=c,Jt=l;var Lt=function({baseDir:e=__dirname}){let t=e;for(;t!==Jt.parse(t).root;){const e=Jt.join(t,"node_modules");if(Rt.existsSync(e))return e;t=Jt.dirname(t)}return null};const Kt=process.cwd();e({name:["redis"],dir:Kt,optional:!0});const Ut=t,Wt=o,{hideBin:zt}=n,Ht=i,Yt=a,Gt=s,Vt=r,Xt=Mt,Zt=Lt({baseDir:__dirname});async function Qt(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:Ut.resolve(Kt,`./.output/${e.id}`),templateDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/default"),templateCommonDir:Ut.resolve(Zt,"./@flownet/template-node-common/default"),coreDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=Ut.resolve(Kt,"flow.yaml");if(!Ht.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=Ht.readFileSync(t,"utf8"),n=Yt.parse(o),i=Ut.dirname(t),a=Ut.resolve(i,"flow.main.yaml");if(!Ht.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const s=Ht.readFileSync(a,"utf8"),r=Yt.parse(s),c={workflowAtom:{doc:{...n,"content-type":"yaml",content:s}},projectDir:i,projectFilePath:t,projectFileContent:o,projectFileParsed:n,projectMainFilePath:a,projectMainFileContent:s,projectMainFileParsed:r},l=Ut.resolve(i,"flow.devops.yaml");if(Ht.existsSync(l)){const e=Ht.readFileSync(l,"utf8"),t=Yt.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{Ht.writeFileSync(c.devops.filePath,Yt.stringify(c.devops.doc))}}}const p=Ut.resolve(i,"flow.readme.md");if(Ht.existsSync(p)){const e=Ht.readFileSync(p,"utf8");c.readme={filePath:p,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/default"),templateCommonDir:Ut.resolve(Zt,"./@flownet/template-node-common/default"),coreDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/core"),projectDir:Ut.resolve(t.projectDir,"./.workspace"),projectSrcDir:Ut.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Zt}/.bin:${process.env.PATH}`,Wt(zt(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=Ut.resolve(Zt,"./@flownet/template-node-workflow/project"),o=Ut.resolve(Kt,e.name);Ht.existsSync(o)||Ht.mkdirSync(o),await Vt({dir:t,outDir:o,context:e});let n=Gt.exec("fnet build",{cwd:o});if(0!==n.code)throw new Error("Failed to build project.");if(Gt.which("git")&&(n=Gt.exec("git init",{cwd:o}),0!==n.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await Qt(e),o=new Xt(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)}})).command("deploy","Build and deploy flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Qt({...e,mode:"all"}),o=new Xt(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)}})).command("file","Just create files",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Qt({...e,mode:"file"}),o=new Xt(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)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`node ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run serve ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run watch ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("app [commands..]","npm run app - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run app ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("cli [commands..]","npm run cli - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run cli ${n.join(" ")} ${i}`;Gt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
2
+ "use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),n=require("yargs/helpers"),i=require("fs"),a=require("yaml"),s=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),f=require("isobject"),u=require("redis"),y=require("@flownet/lib-is-redis-online"),h=require("nanoid"),w=require("@flownet/lib-atom-api-js"),g=require("axios"),b=require("qs"),x=require("lodash.merge"),k=require("@flownet/lib-list-npm-versions"),v=require("@flownet/lib-parse-imports-js"),j=require("@fnet/shell"),_=require("semver"),D=require("node:os"),T=require("@node-red/util"),P=require("@flownet/lib-to-ios-app"),$=require("@flownet/lib-to-macos-app"),S=require("@flownet/lib-to-electron"),C=require("@flownet/lib-to-webos"),I=require("@flownet/lib-to-nextjs"),E=require("@flownet/lib-parse-node-url"),F=require("@flownet/lib-bpmn-from-flow"),N=require("@fnet/expression"),A=require("chalk");const O=u,B=y;const{Api:q}=w,R=g.default,M=b;const J=x;const L=k;const K=c,U=l,W=r;const z=d,G=c,H=l,Y=v,V=k;const X=c,Z=l,Q=r;const ee=c,te=l,oe=d,ne=v;const ie=c,ae=l,se=d;const re=c,ce=l,le=d;const pe=c,de=l,me=d;const fe=d,ue=c,ye=l;const he=s;const we=s;const ge=s;const be=s;const xe=j,ke=e;const ve=c,je=l,_e=_,De=j,Te=e;const Pe=c,$e=l,Se=_,Ce=s,Ie=e;const Ee=c,Fe=l,Ne=D,Ae=d,Oe=T,Be=e;const qe=i,Re=t,Me=e;const Je=P;const Le=$;const Ke=S;const Ue=C;const We=I,ze=m,Ge=x,He=_,Ye=l;const Ve=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const a=t.projectDir;let s="fnet-to-gitlab";const r=n.params.config||"gitlab",c=ke({name:r,dir:t.projectDir});if(!c)throw new Error(`Couldnt load config ${r}`);const{data:l}=c.data;s+=` --projectGroupId=${l.projectGroupId}`,s+=` --projectPath='${a}'`,s+=` --projectName='${n.params.name}'`,s+=` --projectBranch='${n.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==n.dryRun&&(await xe({cmd:s}),o.isDirty=!0)},Xe=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,registerToPackageManager:i})=>{await e({message:"Deploying it as gcs package."});const a=t.projectDir,s=je.resolve(a,"package.json"),r=ve.readFileSync(s),c=JSON.parse(r);c.name=n.params.name,c.version=_e.inc(n.params.version,"patch"),delete c.scripts,delete c.devDependencies,ve.writeFileSync(s,JSON.stringify(c,null,"\t"));const{file:l,data:p}=await Te({name:n.params.config||t.gcsConfig||"gcs",dir:t.projectDir});let d="fnet-upload-files-to-gcs";d+=` --projectId='${p.env.GCS_PROJECT_ID}'`,d+=` --bucketName='${p.env.GCS_BUCKET_NAME}'`,d+=` --keyFilename='${je.resolve(je.dirname(l),p.env.GCS_UPLOADER_KEY_FILE)}'`,d+=` --dir='${a}'`,d+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",d+=` --destDir='${c.name}/${c.version}'`,d+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===n.dryRun&&(d+=" --dryRun"),await De({cmd:d}),ve.writeFileSync(s,r),!0!==n.dryRun&&(o.isDirty=!0,n.params.version=c.version,await i({target:n,packageJSON:c}))},Ze=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const a=o.projectDir,s=$e.resolve(a,"package.json"),r=Pe.readFileSync(s),c=JSON.parse(r);c.name=i.params.name,c.version=Se.inc(i.params.version,"patch");const l=i.params.bin?.name||i.params.bin;!1!==i.params.bin?.enabled&&l&&"string"==typeof l&&(c.bin={[l]:"dist/cli/cjs/index.js",[e.doc.name]:"dist/cli/cjs/index.js"}),delete c.scripts,delete c.devDependencies,c.scripts={serve:"npx serve ."},Pe.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Ie({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(Pe.writeFileSync($e.resolve(a,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==Ce.exec("npm publish --access public",{cwd:a}).code)throw new Error("Couldnt publish to npm");Pe.writeFileSync(s,r),n.isDirty=!0,i.params.version=c.version},Qe=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a,packageDependencies:s,njEnv:r})=>{await t({message:"Deploying it as node-red flow."});const c=o.projectDir,l=o.templateDir,p="workflow"===e.type?"WF":"LIB";let d;if("simple"===i.deploy.template)d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Oe.util.generateId(),...i.params?.inject,payload:"json"===i.params?.inject?.payloadType?`'${JSON.stringify(i.params?.inject?.payload)}'`:i.params?.inject?.payload},debug:{id:Oe.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.params?.schedules?cloneDeep(i.params?.schedules):void 0;t?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Oe.util.generateId(),schedules:t},debug:{id:Oe.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Oe.util.generateId(),label:`${p}/${e.id?e.id:Ne.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Oe.util.generateId(),name:e.doc.name,initialize:{content:Ee.readFileSync(Fe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Oe.util.generateId(),method:i.params.method||"get",url:i.params.url},httpout:{id:Oe.util.generateId()},debug:{id:Oe.util.generateId()}}}}let m=Ae.compile(Ee.readFileSync(Fe.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Ee.writeFileSync(Fe.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;n.isDirty=!0;const f=await(Be({name:o.redConfig||"red",dir:o.projectDir})?.data),u=i.deploy.url||f.env.RED_URL,y={};if(!1!==i.deploy.auth&&(y.Authorization="Bearer "+atomAccessToken),i.deploy.id)!0===i.actions?.delete?(await axios({method:"DELETE",url:`${u}/flow/${i.deploy.id}`,headers:y}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${u}/flow/${i.deploy.id}`,data:m,headers:y});else{const e=await axios({method:"POST",url:`${u}/flow`,data:m,headers:y});i.deploy.id=e.data.id}},et=async({atom:e,Atom:t,setInProgress:o,context:n,packageDependencies:i,deploymentProject:a,deploymentProjectTarget:s})=>{await o({message:"Deploying it as workflow lib."});const r=await(Me({name:"atom",dir:n.projectDir})?.data);let c,l,p,d=s.deploy.name.split("/");if(1===d.length)l=r.env.ATOM_LIBRARIES_ID,p=s.deploy.name;else{if(2!==d.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:d[0],parent_id:r.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");l=e.id,p=d[1]}}if(!0===s.dryRun)return;if(a.isDirty=!0,s.deploy.id){if(c=await t.get({id:s.deploy.id}),!c)return}else{if(c=await t.create({parent_id:l,doc:{name:p,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!c)return;s.deploy.id=c.id}const m=n.projectDir;c.doc.contents=[{content:qe.readFileSync(Re.resolve(m,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:qe.readFileSync(Re.resolve(m,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:qe.readFileSync(Re.resolve(m,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],c.doc.name=p,c.doc.dependencies=i,"workflow.lib"===e.type?c.doc.subtype="library":"workflow"===e.type&&(c.doc.subtype="workflow"),c=await t.update(c,{id:c.id})},tt=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a,registerToPackageManager:s})=>{await t({message:"Deploying it as ios app package."});const r=o.projectDir;if(!0===i.dryRun)return;const c={projectDir:r,dest:r,atom:e,params:i.params};await Je(c),n.isDirty=!0},ot=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a})=>{await t({message:"Deploying it as macos app package."});const s=o.projectDir;if(!0===i.dryRun)return;const r={projectDir:s,dest:s,atom:e,params:i.params};await Le(r),n.isDirty=!0},nt=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i,buildId:a})=>{await t({message:"Deploying it as electron package."});const s=o.projectDir;if(!0===i.dryRun)return;const r={src:s,dest:s,atom:e,params:i.params};await Ke(r),n.isDirty=!0},it=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const a=o.projectDir;if(!0===i.dryRun)return;const s={src:a,dest:a,atom:e,params:i.params};await Ue(s),n.isDirty=!0},at=async({atom:e,target:t,onProgress:o,projectDir:n,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=Ge({name:"nextjs-app",version:"0.1.0"},t.params);const a=He.inc(t.params.version,"patch");t.params.version=a;const s=ze(t);s.params.dependencies=ze(i);const r={atom:e,target:s.params,projectDir:n,renderDir:Ye.resolve(n,"nextjs")};return{deployer:await We(r)}};const st=c,rt=l,ct=p,lt=s,pt=d,dt=m,mt=f,ft=async()=>{if(!await B({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=O.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:ut}=h,yt=class{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(q.set_api_url(e.data.url),t)return q.set_req_token(t),void o(t);R({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:M.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{q.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{q.set_req_token(),n(e)}))}))}},ht=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled;const o="workflow.lib"===e.type;!1===t.app?t.app={enabled:!1}:!0===t.app?t.app={enabled:!0,extend:!1,export:!0,react:o}:t.app={enabled:!0,extend:!1,export:!0,react:o,...t.app||{}},t.app.enabled=!0===t.app.enabled&&(!0===e.doc.features.form_enabled||!0===t.app.extend||!0===t.app.enabled),t.app.format=t.app.format||"esm",t.app.folder=t.app.folder||t.app.format||"default",!1===t.cli?t.cli={enabled:!1}:!0===t.cli?t.cli={enabled:!0,extend:!1,export:!0}:t.cli={enabled:!0,extend:!1,export:!0,...t.cli||{}},t.cli.enabled=!0===t.cli.enabled&&(!1===e.doc.features.form_enabled||!0===t.cli.extend||!0===t.cli.enabled),t.cli.format=t.cli.format||"cjs",t.cli.folder=t.cli.folder||t.cli.folder||"cjs";const n={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1,enabled:!0},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1,enabled:!0},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!0,terser:!0},umd:{format:"umd",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!1}},i={};!0===t.webos&&(n.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.app.enabled&&(t.app.dir=`./dist/app/${t.app.folder}`,n.app={format:t.app.format,browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:t.app.dir,terser:!0,output_exports:!1===t.app.export?"none":"auto"},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:t.app.dir})),!0===t.cli.enabled&&(t.cli.dir=`./dist/cli/${t.cli.folder}`,n.cli={format:t.cli.format,context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:t.cli.dir,banner:"#!/usr/bin/env node",terser:!1,output_exports:!1===t.cli.export?"none":"auto"}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=J({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=J({},t.replace_options||t.replace?.options||{}),t.terser_options=J({},t.terser_options||t.terser?.options||{}),t.css_options=J({},t.css_options||t.css?.options||{}),t.wasm_options=J({},t.wasm_options||t.wasm?.options||{}),t.copy_options=J(i,t.copy_options||t.copy?.options||{}),t.json_options=J({},t.json_options||t.json?.options||{}),t.image_options=J({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=J(n,t.rollup_output||t.rollup?.output||{});const a=Object.keys(n);for(const e of a){const o=n[e];o&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(o.enabled=!0),o.babel_options=o.babel_options||t.babel_options,o.browsersync_options=J(t.browsersync_options,o.browsersync_options),o.replace_options=J(t.replace_options,o.replace_options),o.terser_options=J(t.terser_options,o.terser_options),o.css_options=J(t.css_options,o.css_options),o.wasm_options=J(t.wasm_options,o.wasm_options),o.copy_options=J(t.copy_options,o.copy_options),o.json_options=J(t.json_options,o.json_options),o.image_options=J(t.image_options,o.image_options),t.form_enabled&&(o.babel=!0)):o.enabled=!1)}t.babel_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=a.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&t.app.enabled,t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.app.enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},wt=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await L({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:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(!0===e.doc.features.cli.enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),o.push({package:"@rollup/plugin-alias",version:"^5.0"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},gt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.app.enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n,ts:Date.now()},a=o.templateDir,s=U.resolve(o.projectDir,"src/app");K.existsSync(s)||K.mkdirSync(s,{recursive:!0}),await W({pattern:["index.html.njk","index.js.njk"],dir:U.resolve(a,"src/app"),outDir:s,context:i})},bt=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:n,setInProgress:i})=>{await i({message:"Creating package.json."});const a=o.find((e=>"react"===e.package)),s=o.find((e=>"react-dom"===e.package));a&&!s?o.push({package:"react-dom",version:a.version}):a&&s&&(s.version=a.version),a&&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 r=[];!0===e.doc.features.app.enabled&&r.push(H.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.cli.enabled&&r.push(H.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!G.existsSync(i))throw new Error(`App file not found: ${i}`);const a=await Y({file:i,recursive:!0}),s=!0===e.doc.features.all_parsed_imports?a.all:a.required;for await(const e of s){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(n.find((t=>t.package===e.package)))continue;const t=(await V({name:e.package,groupBy:{minor:!0}}))[0][0];n.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:o,packageDevDependencies:n},l=t.templateCommonDir,p=z.compile(G.readFileSync(H.resolve(l,"package.json.njk"),"utf8"),z.configure(l)).render(c),d=t.projectDir,m=H.resolve(d,"package.json");G.writeFileSync(m,p,"utf8")},xt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n},a=o.templateDir,s=Z.resolve(o.projectDir,"src/cli");X.existsSync(s)||X.mkdirSync(s,{recursive:!0}),await Q({pattern:["index.js.njk"],dir:Z.resolve(a,"src/cli"),outDir:s,context:i})},kt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:n},a=te.resolve(o.projectDir,"src","default/index.js");if(!ee.existsSync(a))throw new Error(`Entry file not found: ${a}`);const s=(await ne({file:a,recursive:!0})).all.filter((e=>"node"===e.type)).map((e=>e.path)),r=e.doc.features.rollup_output,c=Object.keys(r);for(let e=0;e<c.length;e++){const t=r[c[e]];if(!0===t.browser&&s.length>0){t.globals_enabled=!0,t.globals=t.globals||[],t.globals=t.globals.concat(s.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<s.length;e++){const o=s[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(s)}}const l=o.templateCommonDir,p=oe.compile(ee.readFileSync(te.resolve(l,"rollup.config.js.njk"),"utf8"),oe.configure(l)).render(i),d=o.projectDir,m=te.resolve(d,"rollup.config.js");ee.writeFileSync(m,p,"utf8")},vt=async({atom:e,setInProgress:t,context:o,njEnv:n})=>{if(!0!==e.doc.features.cli.enabled)return;await t({message:"Creating yargs."});const i={},a=e.doc.inputs||[],s=[];a.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&s.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),i[e.name]=t}));const r={options:i,imports:s,atom:e},c=o.templateDir,l=se.compile(ie.readFileSync(ae.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=ae.resolve(p,"src/default/to.yargs.js");ie.writeFileSync(d,l,"utf8")},jt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=le.compile(re.readFileSync(ce.resolve(a,".gitignore.njk"),"utf8"),le.configure(a)).render(i),r=o.projectDir,c=ce.resolve(r,".gitignore");re.writeFileSync(c,s,"utf8")},_t=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=me.compile(pe.readFileSync(de.resolve(a,"tsconfig.json.njk"),"utf8"),me.configure(a)).render(i),r=o.projectDir,c=de.resolve(r,"tsconfig.json");pe.writeFileSync(c,s,"utf8")},Dt=async({atom:e,context:t,setInProgress:o,Atom:n})=>{const i="readme.md",a=`Creating ${i}`;if(await o({message:a}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,n=fe.compile(ue.readFileSync(ye.resolve(o,`${i}.njk`),"utf8"),fe.configure(o)).render(e),a=t.projectDir,s=ye.resolve(a,`${i}`);ue.writeFileSync(s,n,"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:a,...s}=o.doc,r={content:a},c=t.templateCommonDir,l=fe.compile(ue.readFileSync(ye.resolve(c,`${i}.njk`),"utf8"),fe.configure(c)).render(r),p=t.projectDir,d=ye.resolve(p,`${i}`);ue.writeFileSync(d,l,"utf8")}},Tt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Prettifiying source files."});if(0!==he.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:o}).code)throw new Error("Couldnt format files.")},Pt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Creating .d.ts"});if(0!==we.exec("tsc",{cwd:o}).code)throw new Error("Couldnt create .d.ts files.")},$t=async({setInProgress:e,atom:t,context:o})=>{const n=o.projectDir;await e({message:"Installing npm packages."});if(0!==ge.exec(`npm install ${t.doc.features.npm_install_flags}`,{cwd:n}).code)throw new Error("Couldnt install npm packages.")},St=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Building main project."});if(0!==be.exec("npm run build",{cwd:o}).code)throw new Error("Couldnt build project.")},Ct=async e=>{const{atom:t,packageDependencies:o,context:n,deploymentProjectTarget:i,setInProgress:a}=e;if(!0===i.enabled)if("lib"===i.name)await et({...e});else if("red"===i.name)await Qe({...e});else if("npm"===i.name)await Ze({...e});else if("gcs"===i.name)await Xe({...e});else if("gitlab"===i.name)await Ve({...e});else if("macos-app"===i.name)await ot({...e});else if("ios-app"===i.name)await tt({...e});else if("electron"===i.name)await nt({...e});else if("webos"===i.name)await it({...e});else{let e;if("nextjs"===i.name&&(e=at),!e)return;await e({atom:t,target:i,onProgress:a,projectDir:n.projectDir,dependencies:o})}},{Atom:It}=w,Et=E,Ft=k,Nt=F,At=e,Ot=v,Bt=N,qt=A;var Rt=class{#e;#t;#o;#n;#i;#a;#s;#r;#c;#l;#p;#d;#m;#f;#u;#y;#h;#w;#g;#b;constructor(e){this.#e=new yt,this.#t=e,this.#a=[],this.#s=[],this.#r={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#b={packageDependencies:this.#a,packageDevDependencies:this.#s,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:It,registerToPackageManager:this.registerToPackageManager.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 ft(),this.#p=this.#t.buildId||ut(24),this.#b.buildId=this.#p,this.#u=this.#t.mode,this.#y=["all","deploy","build","file"].includes(this.#u),this.#h=["all","deploy","build"].includes(this.#u),this.#w=["all","deploy"].includes(this.#u),this.#g=["all","deploy","build","file","bpmn"].includes(this.#u),this.#m=this.#t.protocol,this.#d="BUILD:"+this.#p,this.#f=await(At({optional:!0,name:"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await ht(this.#b),await wt(this.#b),await this.transformWorkflow({workflow:this.#n});const e=await this.initNodeTree({workflow:this.#n});await this.initNodeTreeIndex({root:e}),await this.initNodeCalls({root:e}),await this.initNodeCallLibs({root:e}),await this.initNodeForms({root:e}),await this.initNodeFormLibs({root:e}),await this.initAtomLibsAndDeps({libs:e.context.libs,packageDependencies:this.#a}),await this.resolveNodeTree({root:e}),this.#l=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#c=await this.#e.init({config:this.#f}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await It.get({id:e}),this.#n="string"==typeof this.#o.doc.content?ct.load(this.#o.doc.content):this.#o.doc.content;let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow",this.#b.atom=this.#o}async initDependencies(){this.#a.push({package:"eventemitter3",version:"^4.0"}),this.#a.push({package:"get-value",version:"^3.0"}),this.#a.push({package:"set-value",version:"^4.1"}),this.#o.doc.features.form_enabled?(this.#a.push({package:"react",version:"^18.2"}),this.#a.push({package:"react-dom",version:"^18.2"}),this.#a.push({package:"@flownet/react-app",version:"^0.1"}),this.#a.push({package:"@flownet/react-app-state",version:"^0.1"})):this.#a.push({package:"yargs",version:"^17"}),this.#a.push({package:"chalk",version:"^4"})}async initWorkflowDir(){const e=this.#t.projectDir,t=this.#t.coreDir;let o;const n=["node_modules"];if(st.existsSync(e)&&st.readdirSync(e).forEach((t=>{n.includes(t)||(o=lt.rm("-rf",rt.join(e,t)))})),o=lt.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=lt.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=lt.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=lt.exec(`mkdir -p ${e}/src/default/blocks`),0!==o.code)throw new Error("Couldnt create workflow/src/default/blocks dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#i=pt.configure(e,{watch:!1,dev:!0}),this.#b.njEnv=this.#i}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],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.#o}};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};o.childs.push(n)}));for await(const e of o.childs)await this.initNode({node:e});return o}async initNode({node:e}){if(e.workflow=e.parent.workflow||e,e.depth=e.parent.depth+1,e.definition.hasOwnProperty("try")&&e.definition.hasOwnProperty("except"))await this.initBlockTypeTryExcept({node:e});else if(e.definition.hasOwnProperty("for"))await this.initBlockTypeFor({node:e});else if(e.definition.hasOwnProperty("switch"))await this.initBlockTypeSwitch({node:e});else if(e.definition.hasOwnProperty("parallel"))await this.initBlockTypeParallel({node:e});else if(e.definition.hasOwnProperty("raise"))await this.initBlockTypeRaise({node:e});else if(e.definition.hasOwnProperty("return"))await this.initBlockTypeReturn({node:e});else if(e.definition.hasOwnProperty("assign"))await this.initBlockTypeAssign({node:e});else if(e.definition.hasOwnProperty("call"))await this.initBlockTypeCall({node:e});else if(e.definition.hasOwnProperty("form"))await this.initBlockTypeForm({node:e});else if(e.definition.hasOwnProperty("shell"))await this.initBlockTypeShell({node:e});else if(e.definition.hasOwnProperty("config"))await this.initBlockTypeConfig({node:e});else if(e.definition.hasOwnProperty("operation"))await this.initBlockTypeOperation({node:e});else if(e.definition.hasOwnProperty("steps"))await this.initBlockTypeSteps({node:e});else{if(!e.definition.hasOwnProperty("next"))throw new Error("Undefined step type.");await this.initBlockTypeJump({node:e})}}async initBlockTypeTryExcept({node:e}){if(e.type="tryexcept",e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!0,e.definition.try){const t="try",o={name:t,childs:[],parent:e,definition:e.definition[t],index:e.childs.length,context:{}};e.childs.push(o),await this.initNode({node:o})}if(e.definition.except){const t="except",o={name:t,childs:[],parent:e,definition:e.definition[t],index:e.childs.length,context:{}};e.childs.push(o),await this.initNode({node:o})}}async initBlockTypeSwitch({node:e}){e.type="switch",e.blockAutoJumpToParent=!1,e.blockAutoJumpToSibling=!0;for(let t=0;t<e.definition.switch.length;t++){const o=e.definition.switch[t],n={name:`${t}`,childs:[],parent:e,definition:o,index:e.childs.length,context:{}};e.childs.push(n),o.hasOwnProperty("steps")?await this.initNode({node:n}):(n.depth=e.depth+1,n.type="jump")}}async initBlockTypeFor({node:e}){e.type="for",e.blockAutoJumpToParent=!0,e.blockAutoJumpToSibling=!1;for(let t=0;t<e.definition.for.steps.length;t++){const o=e.definition.for.steps[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeSteps({node:e}){e.type||(e.type="steps");const t=e.definition.steps||[];for await(const o of t){const t=Object.keys(o)[0],n={name:t,childs:[],parent:e,definition:o[t],index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}async initBlockTypeAssign({node:e}){e.type="assign"}async initBlockTypeCall({node:e}){e.type="call";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeForm({node:e}){e.type="form";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],n=Object.keys(o)[0],i={name:n,childs:[],parent:e,definition:o[n],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}async initBlockTypeReturn({node:e}){e.type="return"}async initBlockTypeRaise({node:e}){e.type="raise"}async initBlockTypeJump({node:e}){e.type="jump"}async initBlockTypeOperation({node:e}){e.type="operation"}async initBlockTypeParallel({node:e}){e.type="parallel"}async initBlockTypeShell({node:e}){const t="shell",o=e.definition,n=typeof o[t];if("string"!==n&&"object"!==n)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/shell",o.args="string"===n?{cmd:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}async initBlockTypeConfig({node:e}){const t="config",o=e.definition,n=typeof o[t];if("string"!==n&&"object"!==n)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/config",o.args="string"===n?{name:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}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=rt.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const n=[];let i=e;for(;i?.parent;)n.push(i.index),i=i.parent;n.reverse(),e.codeKey=`B_${n.join("_")}_${e.type}`,e.pathKey=`${n.join(".")}`,e.typeId=ut(24);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&&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.call,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.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.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 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});n.atom=i;const a=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));a?.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}){const t=Et({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#m),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await It.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await It.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await It.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=rt.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],n=await Ot({file:e,recursive:!0});for await(const e of n.required){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=(await Ft({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:t.protocol}}if("npm:"===t.protocol){const e=(await Ft({name:t.pathname,groupBy:{minor:!0}}))[0][0];return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:[{package:t.pathname,version:`^${e}`,type:"npm"}]},protocol:t.protocol}}}}resolveNextBlock({node:e}){const t=e.definition;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;){if(t.blockAutoJumpToParent&&!0===t.blockAutoJumpToSibling){if(!0===t.blockAutoJumpToParent)break;o=t.index+1,t=t.parent;continue}const n=t.childs.find((e=>e.index===o));if(n){e.context.next=n;break}if(!0===t.blockAutoJumpToParent)break;o=t.index+1,t=t.parent}}}async resolveNodeTree({root:e}){for await(const t of e.childs)await this.resolveTypeWorkflow({node:t})}async resolveTypeWorkflow({node:e}){e.context.transform=dt(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]}}}e.context.next=e.childs[0];for await(const t of e.childs)await this.resolveType({node:t})}async resolveType({node:e}){"assign"===e.type?await this.resolveTypeAssign({node:e}):"return"===e.type?await this.resolveTypeReturn({node:e}):"call"===e.type?await this.resolveTypeCall({node:e}):"form"===e.type?await this.resolveTypeForm({node:e}):"raise"===e.type?await this.resolveTypeRaise({node:e}):"switch"===e.type?await this.resolveTypeSwitch({node:e}):"jump"===e.type?await this.resolveTypeJump({node:e}):"tryexcept"===e.type?await this.resolveTypeTryExcept({node:e}):"for"===e.type?await this.resolveTypeFor({node:e}):"operation"===e.type?await this.resolveTypeOperation({node:e}):"steps"===e.type&&await this.resolveTypeSteps({node:e});for await(const t of e.childs)await this.resolveType({node:t})}async resolveTypeAssign({node:e}){e.context.transform=dt(e.definition);const t=e.context.transform;for(let e=0;e<t.assign?.length;e++){let o=t.assign[e],n=Object.keys(o)[0],i=o[n],a={key:await this.transformExpression(n),value:await this.transformExpression(i)};t.assign[e]=a}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeSteps({node:e}){e.context.next=e.childs[0]}async resolveTypeReturn({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.return=await this.transformExpression(t.return),await this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.args&&(t.args=await this.transformExpression(t.args)),t.result&&(t.result=await this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.props&&(t.props=await this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.raise=await this.transformExpression(t.raise),await this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||dt(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||dt(t.definition),t.context.transform.condition=await this.transformExpression(t.definition.condition);await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||dt(e.definition);const t=e.context.transform;t.next=await this.transformExpression(t.next),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||dt(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||dt(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||dt(e.definition);e.context.transform.for.in=await this.transformExpression(e.definition.for.in),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||dt(e.definition),await this.resolveTypeCommon({node:e})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.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.#t.projectDir;if("local:"===o.protocol){const e=rt.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=rt.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!st.existsSync(e)){st.mkdirSync(rt.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",st.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir=`./types/${rt.basename(n)}/src`}else if("npm:"===o.protocol)o.relativePath=o.name;else{const e=`${n}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;st.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=pt.compile(st.readFileSync(rt.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render({...e,ui:{package:"@flownet/react-app"}}),n=this.#t.projectDir,i=rt.resolve(n,"src/default/index.js");st.writeFileSync(i,o,"utf8")}async createNodeTree({root:e}){await this.setInProgress({message:"Creating block files."});for await(const t of e.childs)await this.createTypeWorkflow({node:t})}async createTypeWorkflow({node:e}){const t=this.#t.templateDir,o=pt.compile(st.readFileSync(rt.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=rt.resolve(n,`src/default/${e.codeKey}.js`);st.writeFileSync(i,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"form":case"raise":case"switch":case"jump":case"tryexcept":case"for":case"operation":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.#r[e.type];if(t)return t;const o=this.#t.templateDir;return t=pt.compile(st.readFileSync(rt.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#i),this.#r[e.type]=t,t}createStepFile({node:e}){const t=this.#t.projectDir,o=`${e.codeKey}.js`,n=rt.resolve(t,`src/default/blocks/${o}`);st.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(mt(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=await this.transformValue(e[t[o]])}else if("string"==typeof e){const t=await Bt({expression:e});if(t){const{processor:o,statement:n}=t;switch(o){case"var":case"vs":case"v":e=`$::v.${n}::`;break;case"exp":case"e":e=`$::${n}::`;break;case"mod":case"m":e=`$::closure.module['${n}']::`;break;case"form":case"f":e=`$::closure.form.${n}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...n}=this.#o.doc,i={content:ct.dump(n)},a=this.#t.templateDir,s=pt.compile(st.readFileSync(rt.resolve(a,`${e}.njk`),"utf8"),this.#i).render(i),r=this.#t.projectDir,c=rt.resolve(r,`${e}`);st.writeFileSync(c,s,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:ct.dump(this.#n)},n=this.#t.templateDir,i=pt.compile(st.readFileSync(rt.resolve(n,`${e}.njk`),"utf8"),this.#i).render(o),a=this.#t.projectDir,s=rt.resolve(a,`${e}`);st.writeFileSync(s,i,"utf8")}async runPrettifier(){const e=this.#t.projectDir,t=lt.exec("prettier --write .",{cwd:rt.resolve(e,"src")});if(0!==t.code)throw new Error(t.stderr)}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.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.#o.id){const e=await It.list({type:"workflow.deploy",parent_id:this.#o.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await It.update(o,{id:o.id}))}}}async deployProject(e){const{deploymentProject:t}=e,o=t.doc.targets;for(let e=0;e<o.length;e++){const n=o[e];await Ct({...this.#b,deploymentProject:t,deploymentProjectTarget:n})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;if(!this.#t.id)return;let n=await It.first({name:t.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await It.update(n,{id:n.id})):n=await It.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){console.log(qt.blue(e)),await this._cache_set(this.#d,{status:"IN_PROGRESS",message:e})}async build(){if(this.#g&&!this.#y)return await this.createNetwork();try{const e=this.#g?await Nt({root:this.#l}):void 0;this.#y&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#g&&st.writeFileSync(rt.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#l}),await this.createEngine({root:this.#l}),await this.createNodeTree({root:this.#l}),await this.createProjectYaml(),await this.createProjectMainYaml(),await Dt(this.#b),await _t(this.#b),await jt(this.#b),await vt(this.#b),await xt(this.#b),await gt(this.#b),await kt(this.#b),await bt(this.#b),await Tt(this.#b),await Pt(this.#b),this.#h&&(await $t(this.#b),await St(this.#b),this.#w&&await this.deploy())),await this._cache_set(this.#d,{status:"COMPLETED",data:{network:e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}async createNetwork(){try{const e=await Nt({root:this.#l});await this._cache_set(this.#d,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}};const Mt=c,Jt=l;var Lt=function({baseDir:e=__dirname}){let t=e;for(;t!==Jt.parse(t).root;){const e=Jt.join(t,"node_modules");if(Mt.existsSync(e))return e;t=Jt.dirname(t)}return null};const Kt=process.cwd();e({name:["redis"],dir:Kt,optional:!0});const Ut=t,Wt=o,{hideBin:zt}=n,Gt=i,Ht=a,Yt=s,Vt=r,Xt=Rt,Zt=Lt({baseDir:__dirname});async function Qt(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:Ut.resolve(Kt,`./.output/${e.id}`),templateDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/default"),templateCommonDir:Ut.resolve(Zt,"./@flownet/template-node-common/default"),coreDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=Ut.resolve(Kt,"flow.yaml");if(!Gt.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=Gt.readFileSync(t,"utf8"),n=Ht.parse(o),i=Ut.dirname(t),a=Ut.resolve(i,"flow.main.yaml");if(!Gt.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const s=Gt.readFileSync(a,"utf8"),r=Ht.parse(s),c={workflowAtom:{doc:{...n,"content-type":"yaml",content:s}},projectDir:i,projectFilePath:t,projectFileContent:o,projectFileParsed:n,projectMainFilePath:a,projectMainFileContent:s,projectMainFileParsed:r},l=Ut.resolve(i,"flow.devops.yaml");if(Gt.existsSync(l)){const e=Gt.readFileSync(l,"utf8"),t=Ht.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{Gt.writeFileSync(c.devops.filePath,Ht.stringify(c.devops.doc))}}}const p=Ut.resolve(i,"flow.readme.md");if(Gt.existsSync(p)){const e=Gt.readFileSync(p,"utf8");c.readme={filePath:p,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/default"),templateCommonDir:Ut.resolve(Zt,"./@flownet/template-node-common/default"),coreDir:Ut.resolve(Zt,"./@flownet/template-node-workflow/core"),projectDir:Ut.resolve(t.projectDir,"./.workspace"),projectSrcDir:Ut.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Zt}/.bin:${process.env.PATH}`,Wt(zt(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=Ut.resolve(Zt,"./@flownet/template-node-workflow/project"),o=Ut.resolve(Kt,e.name);Gt.existsSync(o)||Gt.mkdirSync(o),await Vt({dir:t,outDir:o,context:e});let n=Yt.exec("fnet build",{cwd:o});if(0!==n.code)throw new Error("Failed to build project.");if(Yt.which("git")&&(n=Yt.exec("git init",{cwd:o}),0!==n.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await Qt(e),o=new Xt(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)}})).command("deploy","Build and deploy flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Qt({...e,mode:"all"}),o=new Xt(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)}})).command("file","Just create files",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"})),(async e=>{try{const t=await Qt({...e,mode:"file"}),o=new Xt(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)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`node ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run serve ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run watch ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("app [commands..]","npm run app - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run app ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("cli [commands..]","npm run cli - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Qt(e),{projectDir:o}=t,n=e.commands||[],i=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),a=`npm run cli ${n.join(" ")} ${i}`;Yt.exec(a,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var e,t,s=require("@flownet/lib-load-fnet-config"),i=require("redis"),r=require("@flownet/lib-is-redis-online"),n=require("express"),o=require("helmet"),l=require("cors"),d=require("path"),c=require("shelljs"),a=require("nanoid"),u=require("request-ip"),h=require("express-session"),w=require("keycloak-connect"),p=require("qs");function _(){if(t)return e;t=1;const s=i,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=s.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}}var b,f,m,y,k={name:"@fnet/cli",version:"0.13.1",files:["dist"],scripts:{start:"node src/index.js",build:"rollup --config --bundleConfigAsCjs",deploy:"npm install && npm run build && npm publish --access public",watch:"rollup --config --watch --sourcemap --bundleConfigAsCjs --environment DEVELOPMENT"},dependencies:{"@flownet/lib-atom-api-js":"^0.1.8","@flownet/lib-bpmn-from-flow":"^0.1.7","@flownet/lib-is-redis-online":"^0.1.13","@flownet/lib-list-npm-versions":"^0.1.31","@flownet/lib-load-fnet-config":"^0.2.1","@flownet/lib-parse-imports-js":"^0.1.35","@flownet/lib-parse-node-url":"^0.1.16","@flownet/lib-pick-npm-versions":"^0.1.12","@flownet/lib-render-templates-dir":"^0.1.12","@flownet/lib-to-electron":"^0.2.1","@flownet/lib-to-gitlab":"^0.1.21","@flownet/lib-to-ios-app":"^0.2.5","@flownet/lib-to-macos-app":"^0.2.3","@flownet/lib-to-nextjs":"^0.1.12","@flownet/lib-to-webos":"^0.2.8","@flownet/lib-upload-files-to-gcs":"^0.1.12","@flownet/template-node-common":"^0.12.0","@flownet/template-node-library":"^0.12.0","@flownet/template-node-workflow":"^0.12.0","@fnet/expression":"^0.1.5","@fnet/shell":"^0.1.9","@node-red/util":"^3.1.0",axios:"^1.5.0",chalk:"^4.1.2",cors:"^2.8.5",express:"^4.18.2","express-session":"^1.17.3","get-value":"^3.0.1",helmet:"^5.1.1",isobject:"^4.0.0","js-yaml":"^4.1.0","keycloak-connect":"^22.0.3","lodash.clonedeep":"^4.5.0","lodash.merge":"^4.6.2",minimist:"^1.2.8",nanoid:"^3.3.6",nunjucks:"^3.2.4",prettier:"^3.0.3",qs:"^6.11.2",redis:"^4.6.10","request-ip":"^3.3.0",semver:"^7.5.4",serve:"^14.2.1","set-value":"^4.1.0",shelljs:"^0.8.5",typescript:"^5.2.2",uuid:"^9.0.1",yaml:"^2.3.2",yargs:"^17.7.2"},bin:{fnet:"dist/builder/wf-cli.js",flib:"dist/builder/lib-cli.js",fsrv:"dist/index.js",fnode:"dist/builder/lib-cli.js"},devDependencies:{"@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.1","@rollup/plugin-replace":"^5.0.2","@rollup/plugin-terser":"^0.4.3",rollup:"^3.29.1"}};const v=process.cwd();s({name:["server","redis"],dir:v,optional:!0}),async function(){const e=await _()();if(!e)throw new Error("Redis is offline.");const t=k,s=n,i=o,r=l,g=function(){if(f)return b;f=1;const e=n,t=d,s=c,{nanoid:i}=a;return b=class{#e;constructor(e){this._keycloak=e.keycloak,this._router=this._initRouter(),this._redis_client=e.redisClient,this._expire_ttl=3600,this._expire_ttl_short=300,this.#e=e.wdir}_initRouter(){let t=e.Router();return t.post("/workflow/builder/create",this._buildHandler.bind(this)),t.post("/workflow/builder/status",this._statusHandler.bind(this)),t.post("/workflow/builder/network",this._networkHandler.bind(this)),t}join(e,t){t.use(e,this._router)}async _cache_set(e,t,s){await this._redis_client.SETEX(e,s||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async _cache_get(e){const t=await this._redis_client.GET(e).catch(console.error);return JSON.parse(t)}_buildHandler(e,t){this._build({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_networkHandler(e,t){this._network({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_statusHandler(e,t){try{const s=e.body.id;if(!s)throw new Error("Build Id is not defined.");const i="BUILD:"+s;this._cache_get(i).then((e=>{t.send(e)})).catch((e=>{t.status(500).send()}))}catch(e){t.status(500).send()}}async _build(e){const r=e.id;if(!r)throw new Error("Workflow Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=all`;return s.exec(o,{async:!0,cwd:this.#e}),{id:n}}async _network(e){const r=e.id;if(!r)throw new Error("Workflow Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=bpmn`;s.exec(o,{cwd:this.#e});const l="BUILD:"+n;return await this._cache_get(l)}}}(),j=function(){if(y)return m;y=1;const e=n,t=d,s=c,{nanoid:i}=a;return m=class{#e;constructor(e){this._keycloak=e.keycloak,this._router=this._initRouter(),this._redis_client=e.redisClient,this._expire_ttl=3600,this._expire_ttl_short=300,this.#e=e.wdir}_initRouter(){let t=e.Router();return t.post("/library/builder/create",this._buildHandler.bind(this)),t.post("/library/builder/status",this._statusHandler.bind(this)),t}join(e,t){t.use(e,this._router)}async _cache_set(e,t,s){await this._redis_client.SETEX(e,s||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async _cache_get(e){const t=await this._redis_client.GET(e).catch(console.error);return JSON.parse(t)}_buildHandler(e,t){this._build({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_statusHandler(e,t){try{const s=e.body.id;if(!s)throw new Error("Build Id is not defined.");const i="BUILD:"+s;this._cache_get(i).then((e=>{t.send(e)})).catch((e=>{t.status(500).send()}))}catch(e){t.status(500).send()}}async _build(e){const r=e.id;if(!r)throw new Error("Library Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/lib-cli.js")} build --id=${r} --buildId=${n} --mode=all}`;return s.exec(o,{async:!0,cwd:this.#e}),{id:n}}}}(),E=u,x=h,q=new(0,x.MemoryStore),S=new w({store:q}),I=s(),R=p;I.set("query parser",(function(e){return R.parse(e,{depth:12})})),I.use(x({secret:process.env.SESSION_SECRET,resave:!1,saveUninitialized:!0,store:q})),I.use(r()),I.use(i()),I.use(s.json({limit:"1024kb"})),I.get("/healthz",(function(e,t){t.sendStatus(200)})),I.use(E.mw()),I.use(S.middleware()),new g({keycloak:S,wdir:v,redisClient:e}).join("/v1",I),new j({keycloak:S,wdir:v,redisClient:e}).join("/v1",I),I.listen(process.env.HTTP_PORT||8080),console.log(`[${t.version}] ${t.name} started.`)}().catch((e=>{console.error(e.message),process.exit(1)})),module.exports={};
2
+ "use strict";var e,t,s=require("@flownet/lib-load-fnet-config"),i=require("redis"),r=require("@flownet/lib-is-redis-online"),n=require("express"),o=require("helmet"),l=require("cors"),d=require("path"),c=require("shelljs"),a=require("nanoid"),u=require("request-ip"),h=require("express-session"),w=require("keycloak-connect"),p=require("qs");function _(){if(t)return e;t=1;const s=i,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=s.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}}var b,f,m,y,k={name:"@fnet/cli",version:"0.14.1",files:["dist"],scripts:{start:"node src/index.js",build:"rollup --config --bundleConfigAsCjs",deploy:"npm install && npm run build && npm publish --access public",watch:"rollup --config --watch --sourcemap --bundleConfigAsCjs --environment DEVELOPMENT"},dependencies:{"@flownet/lib-atom-api-js":"^0.1.8","@flownet/lib-bpmn-from-flow":"^0.1.7","@flownet/lib-is-redis-online":"^0.1.13","@flownet/lib-list-npm-versions":"^0.1.31","@flownet/lib-load-fnet-config":"^0.2.1","@flownet/lib-parse-imports-js":"^0.1.35","@flownet/lib-parse-node-url":"^0.1.16","@flownet/lib-pick-npm-versions":"^0.1.12","@flownet/lib-render-templates-dir":"^0.1.12","@flownet/lib-to-electron":"^0.2.1","@flownet/lib-to-gitlab":"^0.1.21","@flownet/lib-to-ios-app":"^0.2.5","@flownet/lib-to-macos-app":"^0.2.3","@flownet/lib-to-nextjs":"^0.1.12","@flownet/lib-to-webos":"^0.2.8","@flownet/lib-upload-files-to-gcs":"^0.1.12","@flownet/template-node-common":"^0.12.0","@flownet/template-node-library":"^0.12.0","@flownet/template-node-workflow":"^0.12.0","@fnet/expression":"^0.1.5","@fnet/shell":"^0.1.9","@node-red/util":"^3.1.0",axios:"^1.5.0",chalk:"^4.1.2",cors:"^2.8.5",express:"^4.18.2","express-session":"^1.17.3","get-value":"^3.0.1",helmet:"^5.1.1",isobject:"^4.0.0","js-yaml":"^4.1.0","keycloak-connect":"^22.0.3","lodash.clonedeep":"^4.5.0","lodash.merge":"^4.6.2",minimist:"^1.2.8",nanoid:"^3.3.6",nunjucks:"^3.2.4",prettier:"^3.0.3",qs:"^6.11.2",redis:"^4.6.10","request-ip":"^3.3.0",semver:"^7.5.4",serve:"^14.2.1","set-value":"^4.1.0",shelljs:"^0.8.5",typescript:"^5.2.2",uuid:"^9.0.1",yaml:"^2.3.2",yargs:"^17.7.2"},bin:{fnet:"dist/builder/wf-cli.js",flib:"dist/builder/lib-cli.js",fsrv:"dist/index.js",fnode:"dist/builder/lib-cli.js"},devDependencies:{"@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.1","@rollup/plugin-replace":"^5.0.2","@rollup/plugin-terser":"^0.4.3",rollup:"^3.29.1"}};const v=process.cwd();s({name:["server","redis"],dir:v,optional:!0}),async function(){const e=await _()();if(!e)throw new Error("Redis is offline.");const t=k,s=n,i=o,r=l,g=function(){if(f)return b;f=1;const e=n,t=d,s=c,{nanoid:i}=a;return b=class{#e;constructor(e){this._keycloak=e.keycloak,this._router=this._initRouter(),this._redis_client=e.redisClient,this._expire_ttl=3600,this._expire_ttl_short=300,this.#e=e.wdir}_initRouter(){let t=e.Router();return t.post("/workflow/builder/create",this._buildHandler.bind(this)),t.post("/workflow/builder/status",this._statusHandler.bind(this)),t.post("/workflow/builder/network",this._networkHandler.bind(this)),t}join(e,t){t.use(e,this._router)}async _cache_set(e,t,s){await this._redis_client.SETEX(e,s||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async _cache_get(e){const t=await this._redis_client.GET(e).catch(console.error);return JSON.parse(t)}_buildHandler(e,t){this._build({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_networkHandler(e,t){this._network({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_statusHandler(e,t){try{const s=e.body.id;if(!s)throw new Error("Build Id is not defined.");const i="BUILD:"+s;this._cache_get(i).then((e=>{t.send(e)})).catch((e=>{t.status(500).send()}))}catch(e){t.status(500).send()}}async _build(e){const r=e.id;if(!r)throw new Error("Workflow Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=all`;return s.exec(o,{async:!0,cwd:this.#e}),{id:n}}async _network(e){const r=e.id;if(!r)throw new Error("Workflow Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=bpmn`;s.exec(o,{cwd:this.#e});const l="BUILD:"+n;return await this._cache_get(l)}}}(),j=function(){if(y)return m;y=1;const e=n,t=d,s=c,{nanoid:i}=a;return m=class{#e;constructor(e){this._keycloak=e.keycloak,this._router=this._initRouter(),this._redis_client=e.redisClient,this._expire_ttl=3600,this._expire_ttl_short=300,this.#e=e.wdir}_initRouter(){let t=e.Router();return t.post("/library/builder/create",this._buildHandler.bind(this)),t.post("/library/builder/status",this._statusHandler.bind(this)),t}join(e,t){t.use(e,this._router)}async _cache_set(e,t,s){await this._redis_client.SETEX(e,s||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async _cache_get(e){const t=await this._redis_client.GET(e).catch(console.error);return JSON.parse(t)}_buildHandler(e,t){this._build({...e.body}).then((e=>{t.status(200).send(e)})).catch((e=>{t.status(500).send()}))}_statusHandler(e,t){try{const s=e.body.id;if(!s)throw new Error("Build Id is not defined.");const i="BUILD:"+s;this._cache_get(i).then((e=>{t.send(e)})).catch((e=>{t.status(500).send()}))}catch(e){t.status(500).send()}}async _build(e){const r=e.id;if(!r)throw new Error("Library Id is not defined.");const n=i(24),o=`node ${t.resolve(__dirname,"builder/lib-cli.js")} build --id=${r} --buildId=${n} --mode=all}`;return s.exec(o,{async:!0,cwd:this.#e}),{id:n}}}}(),E=u,x=h,q=new(0,x.MemoryStore),S=new w({store:q}),I=s(),R=p;I.set("query parser",(function(e){return R.parse(e,{depth:12})})),I.use(x({secret:process.env.SESSION_SECRET,resave:!1,saveUninitialized:!0,store:q})),I.use(r()),I.use(i()),I.use(s.json({limit:"1024kb"})),I.get("/healthz",(function(e,t){t.sendStatus(200)})),I.use(E.mw()),I.use(S.middleware()),new g({keycloak:S,wdir:v,redisClient:e}).join("/v1",I),new j({keycloak:S,wdir:v,redisClient:e}).join("/v1",I),I.listen(process.env.HTTP_PORT||8080),console.log(`[${t.version}] ${t.name} started.`)}().catch((e=>{console.error(e.message),process.exit(1)})),module.exports={};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fnet/cli",
3
- "version": "0.13.1",
3
+ "version": "0.14.1",
4
4
  "files": [
5
5
  "dist"
6
6
  ],
package/readme.md CHANGED
@@ -1,61 +1,82 @@
1
- # Flow Node Project Setup Guide
1
+ # @fnet/cli: Flow Node & Flow Project Setup Guide
2
+
3
+ ## Overview
4
+
5
+ The `@fnet/cli` is a command-line interface tool designed to facilitate the development and deployment of flow-based projects within the Flownet.ai ecosystem. It simplifies the processes of creating, managing, and deploying flow-based projects, acting as a bridge between developers and the Flownet.ai platform.
2
6
 
3
7
  ## Prerequisites
4
8
 
5
- 1. Ensure you have `@fnet/cli` installed globally. If not, install it using:
9
+ Ensure you have `@fnet/cli` installed globally:
6
10
  ```bash
7
11
  npm i @fnet/cli -g
8
12
  ```
9
13
 
10
- 2. Once installed, two binary commands will be available: `fnet` and `fnode`. Use `fnode` for flow node projects.
14
+ Upon installation, two binary commands become available: `fnet` (for flow projects) and `fnode` (for flow node projects).
11
15
 
12
16
  ## Identifying Project Type
13
17
 
14
- - If there's a `node.yaml` in the project directory, it's a flow node project.
15
- - Use `fnode` commands for operations related to flow node projects.
18
+ - Flow Node Project: Presence of `node.yaml`. Use `fnode` commands.
19
+ - Flow Project: Presence of `flow.yaml`. Use `fnet` commands.
16
20
 
17
21
  ## Building the Project
18
22
 
19
- To compile the project, use:
23
+ For Flow Node:
20
24
  ```bash
21
25
  fnode build
22
26
  ```
23
- This will generate a `.workspace` directory containing all necessary files and configurations for debugging, building, and deploying the project.
24
27
 
25
- ## Watching the Project
28
+ For Flow:
29
+ ```bash
30
+ fnet build
31
+ ```
32
+
33
+ Both commands generate a `.workspace` directory with files and configurations for debugging, building, and deploying.
26
34
 
27
- To run the project in development mode, use:
35
+ ## Watching the Project (Development Mode)
36
+
37
+ For Flow Node:
28
38
  ```bash
29
39
  fnode watch
30
40
  ```
31
41
 
42
+ For Flow:
43
+ ```bash
44
+ fnet watch
45
+ ```
46
+
32
47
  ## Deploying the Project
33
48
 
34
- Before deploying, ensure the `node.devops.yaml` file has the correct configurations for deployment.
49
+ Ensure respective `node.devops.yaml` (for Flow Node) or `flow.devops.yaml` (for Flow) has the correct deployment configurations.
35
50
 
36
- ### Configuration for NPM Deploy in devops.yaml
51
+ ### Configuration for NPM Deployment
37
52
 
38
- For deploying to npm, ensure your `node.devops.yaml` file has the following structure:
53
+ **Structure for devops.yaml:**
39
54
 
40
55
  ```yaml
41
56
  targets:
42
57
  - name: npm
43
58
  enabled: true
44
59
  params:
45
- name: "NPM PACKAGE NAME IN NPM REPO"
46
- version: "NPM VERSION"
60
+ name: "NPM_PACKAGE_NAME"
61
+ version: "NPM_VERSION"
47
62
  ```
63
+ Replace placeholders with desired npm package name and version.
48
64
 
49
- Replace `"NPM PACKAGE NAME IN NPM REPO"` with the desired npm package name and `"NPM VERSION"` with the desired version.
65
+ For deployment:
50
66
 
51
- To deploy the project as per the configurations, use:
67
+ For Flow Node:
52
68
  ```bash
53
69
  fnode deploy
54
70
  ```
55
71
 
56
- ### Configuration for NPM Deploy
72
+ For Flow:
73
+ ```bash
74
+ fnet deploy
75
+ ```
76
+
77
+ **NPM Configuration File:**
57
78
 
58
- For deploying to npm, the tool will look for a `npm.fnet` file under the first `.fnet` directory it finds (in the project root or any parent directory, with a fallback to the user's home directory). The `npm.fnet` file should have the following format:
79
+ The CLI checks for `npm.fnet` under the first `.fnet` directory (in the project root, parent directory, or user's home). The file format:
59
80
 
60
81
  ```yaml
61
82
  version: 1
@@ -63,74 +84,43 @@ type: fnet.config
63
84
  env:
64
85
  NPM_TOKEN: "YOUR_NPM_TOKEN"
65
86
  ```
87
+ Replace `YOUR_NPM_TOKEN` with your npm token for deployment authentication.
66
88
 
67
- Replace `YOUR_NPM_TOKEN` with your actual npm token for authentication during deployment.
68
-
69
-
70
- # Flow Project Setup Guide
71
-
72
- ## Prerequisites
73
-
74
- 1. Ensure you have `@fnet/cli` installed globally. If not, install it using:
75
- ```bash
76
- npm i @fnet/cli -g
77
- ```
89
+ ## Deploying to Google Cloud Storage (GCS)
78
90
 
79
- 2. Once installed, two binary commands will be available: `fnet` and `fnode`. Use `fnet` for flow projects.
91
+ The `@fnet/cli` also facilitates deploying build packages directly to a Google Cloud Storage bucket.
80
92
 
81
- ## Identifying Project Type
93
+ ### Configuration for GCS Deployment
82
94
 
83
- - If there's a `flow.yaml` in the project directory, it's a flow project.
84
- - Use `fnet` commands for operations related to flow projects.
85
-
86
- ## Building the Project
87
-
88
- To compile the project, use:
89
- ```bash
90
- fnet build
91
- ```
92
- This will generate a `.workspace` directory containing all necessary files and configurations for debugging, building, and deploying the project.
93
-
94
- ## Watching the Project
95
-
96
- To run the project in development mode, use:
97
- ```bash
98
- fnet watch
99
- ```
100
-
101
- ## Deploying the Project
102
-
103
- Before deploying, ensure the `flow.devops.yaml` file has the correct configurations for deployment.
104
-
105
- ### Configuration for NPM Deploy in flow.devops.yaml
106
-
107
- For deploying to npm, ensure your `flow.devops.yaml` file has the following structure:
95
+ To deploy to a Google Cloud Storage bucket, add a new target named `gcs` under the `targets` section in your `devops.yaml`:
108
96
 
109
97
  ```yaml
110
98
  targets:
111
- - name: npm
99
+ ...
100
+ - name: gcs
112
101
  enabled: true
113
102
  params:
114
- name: "NPM PACKAGE NAME IN NPM REPO"
115
- version: "NPM VERSION"
103
+ name: "@flownet/lib-1"
104
+ version: 0.1.2
116
105
  ```
117
106
 
118
- Replace `"NPM PACKAGE NAME IN NPM REPO"` with the desired npm package name and `"NPM VERSION"` with the desired version.
107
+ Replace the placeholders with your package name and version accordingly.
119
108
 
120
- To deploy the project as per the configurations, use:
121
- ```bash
122
- fnet deploy
123
- ```
124
-
125
- ### Configuration for NPM Deploy
109
+ ### GCS Configuration File:
126
110
 
127
- For deploying to npm, the tool will look for a `npm.fnet` file under the first `.fnet` directory it finds (in the project root or any parent directory, with a fallback to the user's home directory). The `npm.fnet` file should have the following format:
111
+ For GCS deployment, the CLI looks for a `gcs.fnet` file under the first `.fnet` directory (either in the project root, parent directory, or user's home directory). The expected format of this file is:
128
112
 
129
113
  ```yaml
130
114
  version: 1
131
115
  type: fnet.config
132
116
  env:
133
- NPM_TOKEN: "YOUR_NPM_TOKEN"
117
+ GCS_PROJECT_ID: "YOUR_PROJECT_ID"
118
+ GCS_BUCKET_NAME: "YOUR_BUCKET_NAME"
119
+ GCS_UPLOADER_KEY_FILE: "PATH_TO_YOUR_SERVICE_ACCOUNT_KEY_JSON"
134
120
  ```
135
121
 
136
- Replace `YOUR_NPM_TOKEN` with your actual npm token for authentication during deployment.
122
+ Make sure to replace the placeholders with the appropriate values:
123
+
124
+ - `YOUR_PROJECT_ID`: Your Google Cloud project ID.
125
+ - `YOUR_BUCKET_NAME`: The name of the GCS bucket where you want to deploy.
126
+ - `PATH_TO_YOUR_SERVICE_ACCOUNT_KEY_JSON`: Path to the service account key in JSON format, which has the necessary permissions to upload files to the specified bucket.