@fnet/cli 0.9.8 → 0.9.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder/lib-cli.js +1 -1
- package/dist/builder/wf-cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +3 -3
package/dist/builder/lib-cli.js
CHANGED
|
@@ -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"),a=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"),y=require("@flownet/lib-atom-api-js"),f=require("axios"),b=require("qs"),h=require("lodash.merge"),w=require("@flownet/lib-list-npm-versions"),j=require("@flownet/lib-parse-imports-js"),_=require("@flownet/lib-execute-command-with-ipc-file"),v=require("semver"),k=require("node:os"),x=require("@node-red/util"),D=require("@flownet/lib-to-ios-app"),P=require("@flownet/lib-to-macos-app"),I=require("@flownet/lib-to-electron"),S=require("@flownet/lib-to-webos"),$=require("@flownet/lib-to-nextjs"),C=require("lodash.clonedeep"),E=require("@flownet/lib-parse-node-url"),A=require("@flownet/lib-pick-npm-versions");const F=m,T=u;const{Api:q}=y,O=f.default,R=b;const M=h;const L=w;const N=c,B=l,K=r;const J=d,U=c,z=l,H=j,G=w;const Y=c,W=l,X=r;const Z=c,Q=l,V=d,ee=j;const te=c,oe=l,ae=d;const ie=c,ne=l,se=d;const re=c,ce=l,le=d;const pe=d,de=c,me=l;const ue=_,ge=e;const ye=c,fe=l,be=v,he=_,we=e;const je=c,_e=l,ve=v,ke=s,xe=e;const De=c,Pe=l,Ie=k,Se=d,$e=x,Ce=e;const Ee=i,Ae=t,Fe=e;const Te=D;const qe=P;const Oe=I;const Re=S;const Me=$,Le=C,Ne=h,Be=v,Ke=l;const Je=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:a,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const n=t.projectDir;let s="fnet-to-gitlab";const r=a.deploy.params.config||"gitlab",c=ge({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='${a.deploy.params.name}'`,s+=` --projectBranch='${a.deploy.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==a.dryRun&&(await ue({command:s}),o.isDirty=!0)},Ue=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:a,buildId:i,registerToPackageManager:n})=>{await e({message:"Deploying it as pm package."});const s=t.projectDir,r=fe.resolve(s,"package.json"),c=ye.readFileSync(r),l=JSON.parse(c);l.name=a.deploy.params.name,l.version=be.inc(a.deploy.params.version,"patch"),delete l.scripts,delete l.devDependencies,ye.writeFileSync(r,JSON.stringify(l,null,"\t"));const{file:p,data:d}=await we({name:a.deploy.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let m="fnet-upload-files-to-gcs";m+=` --projectId='${d.env.PM_PROJECT_ID}'`,m+=` --bucketName='${d.env.PM_BUCKET_NAME}'`,m+=` --keyFilename='${fe.resolve(fe.dirname(p),d.env.PM_UPLOADER_KEY_FILE)}'`,m+=` --dir='${s}'`,m+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",m+=` --destDir='${l.name}/${l.version}'`,m+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===a.dryRun&&(m+=" --dryRun"),await he({command:m}),ye.writeFileSync(r,c),!0!==a.dryRun&&(o.isDirty=!0,a.deploy.params.version=l.version,await n({target:a,packageJSON:l}))},ze=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const n=o.projectDir,s=_e.resolve(n,"package.json"),r=je.readFileSync(s),c=JSON.parse(r);c.name=i.params.name,c.version=ve.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 ."},je.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(xe({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(je.writeFileSync(_e.resolve(n,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==ke.exec("npm publish --access public",{cwd:n}).code)throw new Error("Couldnt publish to npm");je.writeFileSync(s,r),a.isDirty=!0,i.params.version=c.version},He=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n,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||$e.util.generateId(),label:`${p}/${e.id?e.id:Ie.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:$e.util.generateId(),name:e.doc.name,initialize:{content:De.readFileSync(Pe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:$e.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:$e.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.deploy.params?.schedules?cloneDeep(i.deploy.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||$e.util.generateId(),label:`${p}/${e.id?e.id:Ie.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:$e.util.generateId(),name:e.doc.name,initialize:{content:De.readFileSync(Pe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:$e.util.generateId(),schedules:t},debug:{id:$e.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||$e.util.generateId(),label:`${p}/${e.id?e.id:Ie.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:$e.util.generateId(),name:e.doc.name,initialize:{content:De.readFileSync(Pe.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:$e.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:$e.util.generateId()},debug:{id:$e.util.generateId()}}}}let m=Se.compile(De.readFileSync(Pe.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(De.writeFileSync(Pe.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;a.isDirty=!0;const u=await(Ce({name:o.redConfig||"red",dir:o.projectDir})?.data),g=i.deploy.url||u.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:`${g}/flow/${i.deploy.id}`,headers:y}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${g}/flow/${i.deploy.id}`,data:m,headers:y});else{const e=await axios({method:"POST",url:`${g}/flow`,data:m,headers:y});i.deploy.id=e.data.id}},Ge=async({atom:e,Atom:t,setInProgress:o,context:a,packageDependencies:i,deploymentProject:n,deploymentProjectTarget:s,buildId:r})=>{await o({message:"Deploying it as workflow lib."});const c=await(Fe({name:"atom",dir:a.projectDir})?.data);let l,p,d,m=s.deploy.name.split("/");if(1===m.length)p=c.env.ATOM_LIBRARIES_ID,d=s.deploy.name;else{if(2!==m.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:m[0],parent_id:c.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");p=e.id,d=m[1]}}if(!0===s.dryRun)return;if(n.isDirty=!0,s.deploy.id){if(l=await t.get({id:s.deploy.id}),!l)return}else{if(l=await t.create({parent_id:p,doc:{name:d,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!l)return;s.deploy.id=l.id}const u=a.projectDir;l.doc.contents=[{content:Ee.readFileSync(Ae.resolve(u,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:Ee.readFileSync(Ae.resolve(u,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:Ee.readFileSync(Ae.resolve(u,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],l.doc.name=d,l.doc.dependencies=i,"workflow.lib"===e.type?l.doc.subtype="library":"workflow"===e.type&&(l.doc.subtype="workflow"),l=await t.update(l,{id:l.id})},Ye=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n,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 Te(c),a.isDirty=!0},We=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n})=>{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 qe(r),a.isDirty=!0},Xe=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n})=>{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 Oe(r),a.isDirty=!0},Ze=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const n=o.projectDir;if(!0===i.dryRun)return;const s={src:n,dest:n,atom:e,params:i.params};await Re(s),a.isDirty=!0},Qe=async({atom:e,target:t,onProgress:o,projectDir:a,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=Ne({name:"nextjs-app",version:"0.1.0"},t.params);const n=Be.inc(t.params.version,"patch");t.params.version=n;const s=Le(t);s.params.dependencies=Le(i);const r={atom:e,target:s.params,projectDir:a,renderDir:Ke.resolve(a,"nextjs")};return{deployer:await Me(r)}};const Ve=c,et=l,tt=p,ot=s,at=d,it=async()=>{if(!await T({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=F.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:nt}=g,st=class{init({config:e,accessToken:t}){return new Promise(((o,a)=>{if(q.set_api_url(e.data.url),t)return q.set_req_token(t),void o(t);O({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(),a(e)}))}))}},rt=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.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;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}},a={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},a.targets=a.targets||[],a.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=M({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=M({},t.replace_options||t.replace?.options||{}),t.terser_options=M({},t.terser_options||t.terser?.options||{}),t.css_options=M({},t.css_options||t.css?.options||{}),t.wasm_options=M({},t.wasm_options||t.wasm?.options||{}),t.copy_options=M(a,t.copy_options||t.copy?.options||{}),t.json_options=M({},t.json_options||t.json?.options||{}),t.image_options=M({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=M(o,t.rollup_output||t.rollup?.output||{});const i=Object.keys(o);for(const e of i){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=M(t.browsersync_options,a.browsersync_options),a.replace_options=M(t.replace_options,a.replace_options),a.terser_options=M(t.terser_options,a.terser_options),a.css_options=M(t.css_options,a.css_options),a.wasm_options=M(t.wasm_options,a.wasm_options),a.copy_options=M(t.copy_options,a.copy_options),a.json_options=M(t.json_options,a.json_options),a.image_options=M(t.image_options,a.image_options),t.form_enabled&&(a.babel=!0)):a.enabled=!1)}t.babel_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=i.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),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.form_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},ct=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(e.doc.features.bin_file_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"})},lt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:a,ts:Date.now()},n=o.templateDir,s=B.resolve(o.projectDir,"src/app");N.existsSync(s)||N.mkdirSync(s,{recursive:!0}),await K({pattern:["index.html.njk","index.js.njk"],dir:B.resolve(n,"src/app"),outDir:s,context:i})},pt=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:a,setInProgress:i})=>{await i({message:"Creating package.json."});const n=o.find((e=>"react"===e.package)),s=o.find((e=>"react-dom"===e.package));n&&!s?o.push({package:"react-dom",version:n.version}):n&&s&&(s.version=n.version),n&&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.index_html_enabled&&r.push(z.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&r.push(z.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!U.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(o.find((t=>t.package===e.package)))continue;if(a.find((t=>t.package===e.package)))continue;const t=(await G({name:e.package,groupBy:{minor:!0}}))[0][0];a.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:o,packageDevDependencies:a},l=t.templateCommonDir,p=J.compile(U.readFileSync(z.resolve(l,"package.json.njk"),"utf8"),J.configure(l)).render(c),d=t.projectDir,m=z.resolve(d,"package.json");U.writeFileSync(m,p,"utf8")},dt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:a},n=o.templateDir,s=W.resolve(o.projectDir,"src/cli");Y.existsSync(s)||Y.mkdirSync(s,{recursive:!0}),await X({pattern:["index.js.njk"],dir:W.resolve(n,"src/cli"),outDir:s,context:i})},mt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:a},n=Q.resolve(o.projectDir,"src","default/index.js");if(!Z.existsSync(n))throw new Error(`Entry file not found: ${n}`);const s=(await ee({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 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=V.compile(Z.readFileSync(Q.resolve(l,"rollup.config.js.njk"),"utf8"),V.configure(l)).render(i),d=o.projectDir,m=Q.resolve(d,"rollup.config.js");Z.writeFileSync(m,p,"utf8")},ut=async({atom:e,setInProgress:t,context:o,njEnv:a})=>{if(!0===e.doc.features.form_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=o.templateDir,l=ae.compile(te.readFileSync(oe.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),a).render(r),p=o.projectDir,d=oe.resolve(p,"src/default/to.yargs.js");te.writeFileSync(d,l,"utf8")},gt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:a},n=o.templateCommonDir,s=se.compile(ie.readFileSync(ne.resolve(n,".gitignore.njk"),"utf8"),se.configure(n)).render(i),r=o.projectDir,c=ne.resolve(r,".gitignore");ie.writeFileSync(c,s,"utf8")},yt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:a},n=o.templateCommonDir,s=le.compile(re.readFileSync(ce.resolve(n,"tsconfig.json.njk"),"utf8"),le.configure(n)).render(i),r=o.projectDir,c=ce.resolve(r,"tsconfig.json");re.writeFileSync(c,s,"utf8")},ft=async({atom:e,context:t,setInProgress:o,Atom:a})=>{const i="readme.md",n=`Creating ${i}`;if(await o({message:n}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,a=pe.compile(de.readFileSync(me.resolve(o,`${i}.njk`),"utf8"),pe.configure(o)).render(e),n=t.projectDir,s=me.resolve(n,`${i}`);de.writeFileSync(s,a,"utf8")}else if(e.id){const o=await a.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:n,...s}=o.doc,r={content:n},c=t.templateCommonDir,l=pe.compile(de.readFileSync(me.resolve(c,`${i}.njk`),"utf8"),pe.configure(c)).render(r),p=t.projectDir,d=me.resolve(p,`${i}`);de.writeFileSync(d,l,"utf8")}},bt=async e=>{const{atom:t,packageDependencies:o,context:a,deploymentProjectTarget:i,deploymentProject:n,buildId:s}=e;if(!0===i.enabled)if("lib"===i.name)await Ge({...e});else if("red"===i.name)await He({...e});else if("npm"===i.name)await ze({...e});else if("pm"===i.name)await Ue({...e});else if("gitlab"===i.name)await Je({...e});else if("macos-app"===i.name)await We({...e});else if("ios-app"===i.name)await Ye({...e});else if("electron"===i.name)await Xe({...e});else if("webos"===i.name)await Ze({...e});else{let e;if("nextjs"===i.name&&(e=Qe),!e)return;await e({atom:t,target:i,onProgress:setInProgress,projectDir:a.projectDir,dependencies:o})}},{Atom:ht}=y,wt=E,jt=e,_t=j,vt=A;var kt=class{#e;#t;#o;#a;#i;#n;#s;#r;#c;#l;#p;#d;#m;#u;#g;#y;#f;constructor(e){this.#e=new st,this.#t=e,this.#n=[],this.#s=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#f={packageDependencies:this.#n,packageDevDependencies:this.#s,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:ht,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 it(),this.#c=this.#t.buildId||nt(24),this.#f.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.#y=["all","deploy"].includes(this.#m),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(jt({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await rt(this.#f),await ct(this.#f),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.#f.atomAccessToken=this.#r)}async initLibrary(){const e=this.#t.id;this.#o=this.#t.project?.libraryAtom||await ht.get({id:e});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.lib",this.#f.atom=this.#o}async initLibraryDir(){const e=this.#t.projectDir;let t;const o=["node_modules"];if(Ve.existsSync(e)&&Ve.readdirSync(e).forEach((a=>{o.includes(a)||(t=ot.rm("-rf",et.join(e,a)))})),t=ot.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=ot.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=ot.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=ot.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#a=at.configure(e,{watch:!1,dev:!0}),this.#f.njEnv=this.#a}async initLibs(){const e=[{name:this.#o.doc.name,type:"atom",parent_id:this.#o.parent_id}];this.#i=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#n})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const o=e.filter((e=>"atom"===e.type));for(let e=0;e<o.length;e++){const a=o[e],i=await this.findAtomLibrary({url:a.name});a.atom=i;const n=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));n?.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=wt({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#p),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await ht.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await ht.first({where:{name:o[0],parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"folder"}});return await ht.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#o;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=et.resolve(this.#t.projectSrcDir,"index.js"),o=await _t({file:t,recursive:!0}),a=e.doc.dependencies,i=!0===this.#o.doc.features.all_parsed_imports?o.all:o.required;for await(const e of i){if("npm"!==e.type)continue;if(a.find((t=>t.package===e.package)))continue;const t=await vt({name:e.package,count:1});a.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.#o.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,a=this.#t.projectDir;if("local:"===o.protocol){const e=et.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=et.relative(`${this.#t.projectDir}/src/default/`,e);if(!Ve.existsSync(e)){Ve.mkdirSync(et.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",Ve.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir="./types/target/src"}else{const e=`${a}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;Ve.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.#o,atom:this.#o},t=this.#t.templateDir,o=at.compile(Ve.readFileSync(et.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,i=et.resolve(a,"src/default/index.js");Ve.writeFileSync(i,o,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...a}=this.#o.doc,i={content:tt.dump(a)},n=this.#t.templateDir,s=at.compile(Ve.readFileSync(et.resolve(n,`${e}.njk`),"utf8"),this.#a).render(i),r=this.#t.projectDir,c=et.resolve(r,`${e}`);Ve.writeFileSync(c,s,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=ot.exec(`npm install ${this.#o.doc.features.npm_install_flags}`,{cwd:e});if(0!==t.code)throw new Error("Couldnt install npm packages.");if(await this.setInProgress({message:"Prettifiying source files."}),t=ot.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:e}),0!==t.code)throw new Error("Couldnt format files.");if(await this.setInProgress({message:"Creating .d.ts"}),t=ot.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=ot.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build library project.")}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 ht.list({type:"library.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 ht.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 a=o[e];await bt({...this.#f,deploymentProject:t,deploymentProjectTarget:a})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let a=await ht.first({name:t.deploy.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});a?(a.doc.versions.splice(0,0,{v:o.version}),await ht.update(a,{id:a.id})):a=await ht.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message: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 ft(this.#f),await yt(this.#f),await gt(this.#f),await ut(this.#f),await dt(this.#f),await lt(this.#f),await mt(this.#f),await pt(this.#f),this.#g&&(await this.runBuildScripts(),this.#y&&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 xt=c,Dt=l;var Pt=function({baseDir:e=__dirname}){let t=e;for(;t!==Dt.parse(t).root;){const e=Dt.join(t,"node_modules");if(xt.existsSync(e))return e;t=Dt.dirname(t)}return null};const It=process.cwd();console.log(`cwd: ${It}`),e({name:["redis"],dir:It});const St=t,$t=o,{hideBin:Ct}=a,Et=i,At=n,Ft=s,Tt=r,qt=kt,Ot=Pt({baseDir:__dirname});async function Rt(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:St.resolve(Ot,"./@flownet/template-node-library/default"),templateCommonDir:St.resolve(Ot,"./@flownet/template-node-common/default"),projectDir:St.resolve(It,`./.output/${e.id}`),coreDir:St.resolve(Ot,"./@flownet/template-node-library/core")};{const t=await async function(){const e=St.resolve(It,"node.yaml");if(!Et.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Et.readFileSync(e,"utf8"),o=At.parse(t),a=St.dirname(e),i={libraryAtom:{doc:{...o,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:a,projectFilePath:e,projectFileContent:t,projectFileParsed:o},n=St.resolve(a,"node.devops.yaml");if(Et.existsSync(n)){const e=Et.readFileSync(n,"utf8"),t=At.parse(e);i.devops={filePath:n,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Et.writeFileSync(i.devops.filePath,At.stringify(i.devops.doc))}}}const s=St.resolve(a,"node.readme.md");if(Et.existsSync(s)){const e=Et.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:St.resolve(Ot,"./@flownet/template-node-library/default"),templateCommonDir:St.resolve(Ot,"./@flownet/template-node-common/default"),coreDir:St.resolve(Ot,"./@flownet/template-node-library/core"),projectDir:St.resolve(t.projectDir,"./target"),projectSrcDir:St.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Ot}/.bin:${process.env.PATH}`,$t(Ct(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=St.resolve(Ot,"@flownet/template-node-library/project"),o=St.resolve(It,e.name);Et.existsSync(o)||Et.mkdirSync(o),await Tt({dir:t,outDir:o,context:e});let a=Ft.exec("fnode build",{cwd:o});if(0!==a.code)throw new Error("Failed to build project.");if(Ft.which("git")&&(a=Ft.exec("git init",{cwd:o}),0!==a.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 Rt(e),o=new qt(t);await o.init(),await o.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 Rt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Ft.exec(n,{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 Rt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Ft.exec(n,{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 Rt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Ft.exec(n,{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 Rt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Ft.exec(n,{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"),a=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"),y=require("@flownet/lib-atom-api-js"),f=require("axios"),b=require("qs"),w=require("lodash.merge"),h=require("@flownet/lib-list-npm-versions"),j=require("@flownet/lib-parse-imports-js"),_=require("@flownet/lib-execute-command-with-ipc-file"),v=require("semver"),k=require("node:os"),x=require("@node-red/util"),D=require("@flownet/lib-to-ios-app"),I=require("@flownet/lib-to-macos-app"),P=require("@flownet/lib-to-electron"),S=require("@flownet/lib-to-webos"),$=require("@flownet/lib-to-nextjs"),C=require("lodash.clonedeep"),E=require("@flownet/lib-parse-node-url"),A=require("@flownet/lib-pick-npm-versions");const F=m,T=u;const{Api:q}=y,O=f.default,R=b;const M=w;const L=h;const N=c,B=l,J=r;const K=d,U=c,z=l,H=j,G=h;const Y=c,W=l,X=r;const Z=c,Q=l,V=d,ee=j;const te=c,oe=l,ae=d;const ie=c,ne=l,se=d;const re=c,ce=l,le=d;const pe=d,de=c,me=l;const ue=s;const ge=s;const ye=s;const fe=s;const be=_,we=e;const he=c,je=l,_e=v,ve=_,ke=e;const xe=c,De=l,Ie=v,Pe=s,Se=e;const $e=c,Ce=l,Ee=k,Ae=d,Fe=x,Te=e;const qe=i,Oe=t,Re=e;const Me=D;const Le=I;const Ne=P;const Be=S;const Je=$,Ke=C,Ue=w,ze=v,He=l;const Ge=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:a,buildId:i})=>{await e({message:"Deploying it as gitlab project."});const n=t.projectDir;let s="fnet-to-gitlab";const r=a.deploy.params.config||"gitlab",c=we({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='${a.deploy.params.name}'`,s+=` --projectBranch='${a.deploy.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==a.dryRun&&(await be({command:s}),o.isDirty=!0)},Ye=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:a,buildId:i,registerToPackageManager:n})=>{await e({message:"Deploying it as pm package."});const s=t.projectDir,r=je.resolve(s,"package.json"),c=he.readFileSync(r),l=JSON.parse(c);l.name=a.deploy.params.name,l.version=_e.inc(a.deploy.params.version,"patch"),delete l.scripts,delete l.devDependencies,he.writeFileSync(r,JSON.stringify(l,null,"\t"));const{file:p,data:d}=await ke({name:a.deploy.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let m="fnet-upload-files-to-gcs";m+=` --projectId='${d.env.PM_PROJECT_ID}'`,m+=` --bucketName='${d.env.PM_BUCKET_NAME}'`,m+=` --keyFilename='${je.resolve(je.dirname(p),d.env.PM_UPLOADER_KEY_FILE)}'`,m+=` --dir='${s}'`,m+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",m+=` --destDir='${l.name}/${l.version}'`,m+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===a.dryRun&&(m+=" --dryRun"),await ve({command:m}),he.writeFileSync(r,c),!0!==a.dryRun&&(o.isDirty=!0,a.deploy.params.version=l.version,await n({target:a,packageJSON:l}))},We=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const n=o.projectDir,s=De.resolve(n,"package.json"),r=xe.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 ."},xe.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Se({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(xe.writeFileSync(De.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");xe.writeFileSync(s,r),a.isDirty=!0,i.params.version=c.version},Xe=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n,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||Fe.util.generateId(),label:`${p}/${e.id?e.id:Ee.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Fe.util.generateId(),name:e.doc.name,initialize:{content:$e.readFileSync(Ce.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Fe.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:Fe.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.deploy.params?.schedules?cloneDeep(i.deploy.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||Fe.util.generateId(),label:`${p}/${e.id?e.id:Ee.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Fe.util.generateId(),name:e.doc.name,initialize:{content:$e.readFileSync(Ce.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Fe.util.generateId(),schedules:t},debug:{id:Fe.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Fe.util.generateId(),label:`${p}/${e.id?e.id:Ee.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Fe.util.generateId(),name:e.doc.name,initialize:{content:$e.readFileSync(Ce.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Fe.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:Fe.util.generateId()},debug:{id:Fe.util.generateId()}}}}let m=Ae.compile($e.readFileSync(Ce.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if($e.writeFileSync(Ce.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;a.isDirty=!0;const u=await(Te({name:o.redConfig||"red",dir:o.projectDir})?.data),g=i.deploy.url||u.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:`${g}/flow/${i.deploy.id}`,headers:y}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${g}/flow/${i.deploy.id}`,data:m,headers:y});else{const e=await axios({method:"POST",url:`${g}/flow`,data:m,headers:y});i.deploy.id=e.data.id}},Ze=async({atom:e,Atom:t,setInProgress:o,context:a,packageDependencies:i,deploymentProject:n,deploymentProjectTarget:s,buildId:r})=>{await o({message:"Deploying it as workflow lib."});const c=await(Re({name:"atom",dir:a.projectDir})?.data);let l,p,d,m=s.deploy.name.split("/");if(1===m.length)p=c.env.ATOM_LIBRARIES_ID,d=s.deploy.name;else{if(2!==m.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:m[0],parent_id:c.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");p=e.id,d=m[1]}}if(!0===s.dryRun)return;if(n.isDirty=!0,s.deploy.id){if(l=await t.get({id:s.deploy.id}),!l)return}else{if(l=await t.create({parent_id:p,doc:{name:d,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!l)return;s.deploy.id=l.id}const u=a.projectDir;l.doc.contents=[{content:qe.readFileSync(Oe.resolve(u,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:qe.readFileSync(Oe.resolve(u,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:qe.readFileSync(Oe.resolve(u,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],l.doc.name=d,l.doc.dependencies=i,"workflow.lib"===e.type?l.doc.subtype="library":"workflow"===e.type&&(l.doc.subtype="workflow"),l=await t.update(l,{id:l.id})},Qe=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n,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 Me(c),a.isDirty=!0},Ve=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n})=>{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),a.isDirty=!0},et=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i,buildId:n})=>{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 Ne(r),a.isDirty=!0},tt=async({atom:e,setInProgress:t,context:o,deploymentProject:a,deploymentProjectTarget:i})=>{await t({message:"Deploying it as webos package."});const n=o.projectDir;if(!0===i.dryRun)return;const s={src:n,dest:n,atom:e,params:i.params};await Be(s),a.isDirty=!0},ot=async({atom:e,target:t,onProgress:o,projectDir:a,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=Ue({name:"nextjs-app",version:"0.1.0"},t.params);const n=ze.inc(t.params.version,"patch");t.params.version=n;const s=Ke(t);s.params.dependencies=Ke(i);const r={atom:e,target:s.params,projectDir:a,renderDir:He.resolve(a,"nextjs")};return{deployer:await Je(r)}};const at=c,it=l,nt=p,st=s,rt=d,ct=async()=>{if(!await T({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=F.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:lt}=g,pt=class{init({config:e,accessToken:t}){return new Promise(((o,a)=>{if(q.set_api_url(e.data.url),t)return q.set_req_token(t),void o(t);O({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(),a(e)}))}))}},dt=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.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;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}},a={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},a.targets=a.targets||[],a.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=M({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=M({},t.replace_options||t.replace?.options||{}),t.terser_options=M({},t.terser_options||t.terser?.options||{}),t.css_options=M({},t.css_options||t.css?.options||{}),t.wasm_options=M({},t.wasm_options||t.wasm?.options||{}),t.copy_options=M(a,t.copy_options||t.copy?.options||{}),t.json_options=M({},t.json_options||t.json?.options||{}),t.image_options=M({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=M(o,t.rollup_output||t.rollup?.output||{});const i=Object.keys(o);for(const e of i){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=M(t.browsersync_options,a.browsersync_options),a.replace_options=M(t.replace_options,a.replace_options),a.terser_options=M(t.terser_options,a.terser_options),a.css_options=M(t.css_options,a.css_options),a.wasm_options=M(t.wasm_options,a.wasm_options),a.copy_options=M(t.copy_options,a.copy_options),a.json_options=M(t.json_options,a.json_options),a.image_options=M(t.image_options,a.image_options),t.form_enabled&&(a.babel=!0)):a.enabled=!1)}t.babel_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=i.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),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.form_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},mt=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(e.doc.features.bin_file_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"})},ut=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:a,ts:Date.now()},n=o.templateDir,s=B.resolve(o.projectDir,"src/app");N.existsSync(s)||N.mkdirSync(s,{recursive:!0}),await J({pattern:["index.html.njk","index.js.njk"],dir:B.resolve(n,"src/app"),outDir:s,context:i})},gt=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:a,setInProgress:i})=>{await i({message:"Creating package.json."});const n=o.find((e=>"react"===e.package)),s=o.find((e=>"react-dom"===e.package));n&&!s?o.push({package:"react-dom",version:n.version}):n&&s&&(s.version=n.version),n&&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.index_html_enabled&&r.push(z.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&r.push(z.resolve(t.projectDir,"src/cli/index.js"));for await(const t of r){const i=t;if(!U.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(o.find((t=>t.package===e.package)))continue;if(a.find((t=>t.package===e.package)))continue;const t=(await G({name:e.package,groupBy:{minor:!0}}))[0][0];a.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const c={atom:e,packageDependencies:o,packageDevDependencies:a},l=t.templateCommonDir,p=K.compile(U.readFileSync(z.resolve(l,"package.json.njk"),"utf8"),K.configure(l)).render(c),d=t.projectDir,m=z.resolve(d,"package.json");U.writeFileSync(m,p,"utf8")},yt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:a},n=o.templateDir,s=W.resolve(o.projectDir,"src/cli");Y.existsSync(s)||Y.mkdirSync(s,{recursive:!0}),await X({pattern:["index.js.njk"],dir:W.resolve(n,"src/cli"),outDir:s,context:i})},ft=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:a},n=Q.resolve(o.projectDir,"src","default/index.js");if(!Z.existsSync(n))throw new Error(`Entry file not found: ${n}`);const s=(await ee({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 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=V.compile(Z.readFileSync(Q.resolve(l,"rollup.config.js.njk"),"utf8"),V.configure(l)).render(i),d=o.projectDir,m=Q.resolve(d,"rollup.config.js");Z.writeFileSync(m,p,"utf8")},bt=async({atom:e,setInProgress:t,context:o,njEnv:a})=>{if(!0===e.doc.features.form_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=o.templateDir,l=ae.compile(te.readFileSync(oe.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),a).render(r),p=o.projectDir,d=oe.resolve(p,"src/default/to.yargs.js");te.writeFileSync(d,l,"utf8")},wt=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:a},n=o.templateCommonDir,s=se.compile(ie.readFileSync(ne.resolve(n,".gitignore.njk"),"utf8"),se.configure(n)).render(i),r=o.projectDir,c=ne.resolve(r,".gitignore");ie.writeFileSync(c,s,"utf8")},ht=async({atom:e,setInProgress:t,context:o,packageDependencies:a})=>{await t({message:"Creating tsconfig.json."});const i={atom:e,packageDependencies:a},n=o.templateCommonDir,s=le.compile(re.readFileSync(ce.resolve(n,"tsconfig.json.njk"),"utf8"),le.configure(n)).render(i),r=o.projectDir,c=ce.resolve(r,"tsconfig.json");re.writeFileSync(c,s,"utf8")},jt=async({atom:e,context:t,setInProgress:o,Atom:a})=>{const i="readme.md",n=`Creating ${i}`;if(await o({message:n}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,a=pe.compile(de.readFileSync(me.resolve(o,`${i}.njk`),"utf8"),pe.configure(o)).render(e),n=t.projectDir,s=me.resolve(n,`${i}`);de.writeFileSync(s,a,"utf8")}else if(e.id){const o=await a.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:n,...s}=o.doc,r={content:n},c=t.templateCommonDir,l=pe.compile(de.readFileSync(me.resolve(c,`${i}.njk`),"utf8"),pe.configure(c)).render(r),p=t.projectDir,d=me.resolve(p,`${i}`);de.writeFileSync(d,l,"utf8")}},_t=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Prettifiying source files."});if(0!==ue.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:o}).code)throw new Error("Couldnt format files.")},vt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Creating .d.ts"});if(0!==ge.exec("tsc",{cwd:o}).code)throw new Error("Couldnt create .d.ts files.")},kt=async({setInProgress:e,atom:t,context:o})=>{const a=o.projectDir;await e({message:"Installing npm packages."});if(0!==ye.exec(`npm install ${t.doc.features.npm_install_flags}`,{cwd:a}).code)throw new Error("Couldnt install npm packages.")},xt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Building main project."});if(0!==fe.exec("npm run build",{cwd:o}).code)throw new Error("Couldnt build project.")},Dt=async e=>{const{atom:t,packageDependencies:o,context:a,deploymentProjectTarget:i,deploymentProject:n,buildId:s}=e;if(!0===i.enabled)if("lib"===i.name)await Ze({...e});else if("red"===i.name)await Xe({...e});else if("npm"===i.name)await We({...e});else if("pm"===i.name)await Ye({...e});else if("gitlab"===i.name)await Ge({...e});else if("macos-app"===i.name)await Ve({...e});else if("ios-app"===i.name)await Qe({...e});else if("electron"===i.name)await et({...e});else if("webos"===i.name)await tt({...e});else{let e;if("nextjs"===i.name&&(e=ot),!e)return;await e({atom:t,target:i,onProgress:setInProgress,projectDir:a.projectDir,dependencies:o})}},{Atom:It}=y,Pt=E,St=e,$t=j,Ct=A;var Et=class{#e;#t;#o;#a;#i;#n;#s;#r;#c;#l;#p;#d;#m;#u;#g;#y;#f;constructor(e){this.#e=new pt,this.#t=e,this.#n=[],this.#s=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#f={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,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 ct(),this.#c=this.#t.buildId||lt(24),this.#f.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.#y=["all","deploy"].includes(this.#m),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(St({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await dt(this.#f),await mt(this.#f),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.#f.atomAccessToken=this.#r)}async initLibrary(){const e=this.#t.id;this.#o=this.#t.project?.libraryAtom||await It.get({id:e});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.lib",this.#f.atom=this.#o}async initLibraryDir(){const e=this.#t.projectDir;let t;const o=["node_modules"];if(at.existsSync(e)&&at.readdirSync(e).forEach((a=>{o.includes(a)||(t=st.rm("-rf",it.join(e,a)))})),t=st.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=st.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=st.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=st.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#a=rt.configure(e,{watch:!1,dev:!0}),this.#f.njEnv=this.#a}async initLibs(){const e=[{name:this.#o.doc.name,type:"atom",parent_id:this.#o.parent_id}];this.#i=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#n})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const o=e.filter((e=>"atom"===e.type));for(let e=0;e<o.length;e++){const a=o[e],i=await this.findAtomLibrary({url:a.name});a.atom=i;const n=i.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));n?.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=Pt({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#p),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await It.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await It.first({where:{name:o[0],parent_id:this.#d.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=this.#o;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=it.resolve(this.#t.projectSrcDir,"index.js"),o=await $t({file:t,recursive:!0}),a=e.doc.dependencies,i=!0===this.#o.doc.features.all_parsed_imports?o.all:o.required;for await(const e of i){if("npm"!==e.type)continue;if(a.find((t=>t.package===e.package)))continue;const t=await Ct({name:e.package,count:1});a.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.#o.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,a=this.#t.projectDir;if("local:"===o.protocol){const e=it.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=it.relative(`${this.#t.projectDir}/src/default/`,e);if(!at.existsSync(e)){at.mkdirSync(it.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",at.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir=`./types/${it.basename(a)}/src`}else{const e=`${a}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;at.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.#o,atom:this.#o},t=this.#t.templateDir,o=rt.compile(at.readFileSync(it.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,i=it.resolve(a,"src/default/index.js");at.writeFileSync(i,o,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...a}=this.#o.doc,i={content:nt.dump(a)},n=this.#t.templateDir,s=rt.compile(at.readFileSync(it.resolve(n,`${e}.njk`),"utf8"),this.#a).render(i),r=this.#t.projectDir,c=it.resolve(r,`${e}`);at.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 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:"library.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 a=o[e];await Dt({...this.#f,deploymentProject:t,deploymentProjectTarget:a})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let a=await It.first({name:t.deploy.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});a?(a.doc.versions.splice(0,0,{v:o.version}),await It.update(a,{id:a.id})):a=await It.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message: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 jt(this.#f),await ht(this.#f),await wt(this.#f),await bt(this.#f),await yt(this.#f),await ut(this.#f),await ft(this.#f),await gt(this.#f),await _t(this.#f),await vt(this.#f),this.#g&&(await kt(this.#f),await xt(this.#f),this.#y&&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 At=c,Ft=l;var Tt=function({baseDir:e=__dirname}){let t=e;for(;t!==Ft.parse(t).root;){const e=Ft.join(t,"node_modules");if(At.existsSync(e))return e;t=Ft.dirname(t)}return null};const qt=process.cwd();e({name:["redis"],dir:qt});const Ot=t,Rt=o,{hideBin:Mt}=a,Lt=i,Nt=n,Bt=s,Jt=r,Kt=Et,Ut=Tt({baseDir:__dirname});async function zt(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:Ot.resolve(Ut,"./@flownet/template-node-library/default"),templateCommonDir:Ot.resolve(Ut,"./@flownet/template-node-common/default"),projectDir:Ot.resolve(qt,`./.output/${e.id}`),coreDir:Ot.resolve(Ut,"./@flownet/template-node-library/core")};{const t=await async function(){const e=Ot.resolve(qt,"node.yaml");if(!Lt.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Lt.readFileSync(e,"utf8"),o=Nt.parse(t),a=Ot.dirname(e),i={libraryAtom:{doc:{...o,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:a,projectFilePath:e,projectFileContent:t,projectFileParsed:o},n=Ot.resolve(a,"node.devops.yaml");if(Lt.existsSync(n)){const e=Lt.readFileSync(n,"utf8"),t=Nt.parse(e);i.devops={filePath:n,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Lt.writeFileSync(i.devops.filePath,Nt.stringify(i.devops.doc))}}}const s=Ot.resolve(a,"node.readme.md");if(Lt.existsSync(s)){const e=Lt.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:Ot.resolve(Ut,"./@flownet/template-node-library/default"),templateCommonDir:Ot.resolve(Ut,"./@flownet/template-node-common/default"),coreDir:Ot.resolve(Ut,"./@flownet/template-node-library/core"),projectDir:Ot.resolve(t.projectDir,"./.workspace"),projectSrcDir:Ot.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Ut}/.bin:${process.env.PATH}`,Rt(Mt(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=Ot.resolve(Ut,"@flownet/template-node-library/project"),o=Ot.resolve(qt,e.name);Lt.existsSync(o)||Lt.mkdirSync(o),await Jt({dir:t,outDir:o,context:e});let a=Bt.exec("fnode build",{cwd:o});if(0!==a.code)throw new Error("Failed to build project.");if(Bt.which("git")&&(a=Bt.exec("git init",{cwd:o}),0!==a.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 zt(e),o=new Kt(t);await o.init(),await o.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 zt({...e,mode:"all"}),o=new Kt(t);await o.init(),await o.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 zt({...e,mode:"file"}),o=new Kt(t);await o.init(),await o.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 zt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Bt.exec(n,{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 zt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Bt.exec(n,{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 zt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Bt.exec(n,{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 zt(e),{projectDir:o}=t,a=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 ${a.join(" ")} ${i}`;Bt.exec(n,{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/builder/wf-cli.js
CHANGED
|
@@ -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"),h=require("@flownet/lib-is-redis-online"),y=require("nanoid"),w=require("@flownet/lib-atom-api-js"),g=require("axios"),b=require("qs"),k=require("lodash.merge"),x=require("@flownet/lib-list-npm-versions"),v=require("@flownet/lib-parse-imports-js"),j=require("@flownet/lib-execute-command-with-ipc-file"),_=require("semver"),D=require("node:os"),T=require("@node-red/util"),P=require("@flownet/lib-to-ios-app"),S=require("@flownet/lib-to-macos-app"),$=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");const A=u,O=h;const{Api:B}=w,q=g.default,R=b;const M=k;const J=x;const L=c,K=l,U=r;const W=d,z=c,H=l,Y=v,G=x;const V=c,X=l,Z=r;const Q=c,ee=l,te=d,oe=v;const ne=c,ie=l,ae=d;const se=c,re=l,ce=d;const le=c,pe=l,de=d;const me=d,fe=c,ue=l;const he=j,ye=e;const we=c,ge=l,be=_,ke=j,xe=e;const ve=c,je=l,_e=_,De=s,Te=e;const Pe=c,Se=l,$e=D,Ce=d,Ie=T,Ee=e;const Fe=i,Ne=t,Ae=e;const Oe=P;const Be=S;const qe=$;const Re=C;const Me=I,Je=m,Le=k,Ke=_,Ue=l;const We=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.deploy.params.config||"gitlab",c=ye({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.deploy.params.name}'`,s+=` --projectBranch='${n.deploy.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==n.dryRun&&(await he({command:s}),o.isDirty=!0)},ze=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,buildId:i,registerToPackageManager:a})=>{await e({message:"Deploying it as pm package."});const s=t.projectDir,r=ge.resolve(s,"package.json"),c=we.readFileSync(r),l=JSON.parse(c);l.name=n.deploy.params.name,l.version=be.inc(n.deploy.params.version,"patch"),delete l.scripts,delete l.devDependencies,we.writeFileSync(r,JSON.stringify(l,null,"\t"));const{file:p,data:d}=await xe({name:n.deploy.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let m="fnet-upload-files-to-gcs";m+=` --projectId='${d.env.PM_PROJECT_ID}'`,m+=` --bucketName='${d.env.PM_BUCKET_NAME}'`,m+=` --keyFilename='${ge.resolve(ge.dirname(p),d.env.PM_UPLOADER_KEY_FILE)}'`,m+=` --dir='${s}'`,m+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",m+=` --destDir='${l.name}/${l.version}'`,m+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===n.dryRun&&(m+=" --dryRun"),await ke({command:m}),we.writeFileSync(r,c),!0!==n.dryRun&&(o.isDirty=!0,n.deploy.params.version=l.version,await a({target:n,packageJSON:l}))},He=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const a=o.projectDir,s=je.resolve(a,"package.json"),r=ve.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 ."},ve.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await(Te({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(ve.writeFileSync(je.resolve(a,".npmrc"),`//registry.npmjs.org/:_authToken=${p.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==De.exec("npm publish --access public",{cwd:a}).code)throw new Error("Couldnt publish to npm");ve.writeFileSync(s,r),n.isDirty=!0,i.params.version=c.version},Ye=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||Ie.util.generateId(),label:`${p}/${e.id?e.id:$e.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Ie.util.generateId(),name:e.doc.name,initialize:{content:Pe.readFileSync(Se.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Ie.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:Ie.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.deploy.params?.schedules?cloneDeep(i.deploy.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||Ie.util.generateId(),label:`${p}/${e.id?e.id:$e.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Ie.util.generateId(),name:e.doc.name,initialize:{content:Pe.readFileSync(Se.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Ie.util.generateId(),schedules:t},debug:{id:Ie.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Ie.util.generateId(),label:`${p}/${e.id?e.id:$e.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Ie.util.generateId(),name:e.doc.name,initialize:{content:Pe.readFileSync(Se.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Ie.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:Ie.util.generateId()},debug:{id:Ie.util.generateId()}}}}let m=Ce.compile(Pe.readFileSync(Se.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Pe.writeFileSync(Se.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;n.isDirty=!0;const f=await(Ee({name:o.redConfig||"red",dir:o.projectDir})?.data),u=i.deploy.url||f.env.RED_URL,h={};if(!1!==i.deploy.auth&&(h.Authorization="Bearer "+atomAccessToken),i.deploy.id)!0===i.actions?.delete?(await axios({method:"DELETE",url:`${u}/flow/${i.deploy.id}`,headers:h}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await axios({method:"PUT",url:`${u}/flow/${i.deploy.id}`,data:m,headers:h});else{const e=await axios({method:"POST",url:`${u}/flow`,data:m,headers:h});i.deploy.id=e.data.id}},Ge=async({atom:e,Atom:t,setInProgress:o,context:n,packageDependencies:i,deploymentProject:a,deploymentProjectTarget:s,buildId:r})=>{await o({message:"Deploying it as workflow lib."});const c=await(Ae({name:"atom",dir:n.projectDir})?.data);let l,p,d,m=s.deploy.name.split("/");if(1===m.length)p=c.env.ATOM_LIBRARIES_ID,d=s.deploy.name;else{if(2!==m.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:m[0],parent_id:c.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");p=e.id,d=m[1]}}if(!0===s.dryRun)return;if(a.isDirty=!0,s.deploy.id){if(l=await t.get({id:s.deploy.id}),!l)return}else{if(l=await t.create({parent_id:p,doc:{name:d,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!l)return;s.deploy.id=l.id}const f=n.projectDir;l.doc.contents=[{content:Fe.readFileSync(Ne.resolve(f,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:Fe.readFileSync(Ne.resolve(f,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:Fe.readFileSync(Ne.resolve(f,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],l.doc.name=d,l.doc.dependencies=i,"workflow.lib"===e.type?l.doc.subtype="library":"workflow"===e.type&&(l.doc.subtype="workflow"),l=await t.update(l,{id:l.id})},Ve=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 Oe(c),n.isDirty=!0},Xe=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 Be(r),n.isDirty=!0},Ze=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 qe(r),n.isDirty=!0},Qe=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 Re(s),n.isDirty=!0},et=async({atom:e,target:t,onProgress:o,projectDir:n,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=Le({name:"nextjs-app",version:"0.1.0"},t.params);const a=Ke.inc(t.params.version,"patch");t.params.version=a;const s=Je(t);s.params.dependencies=Je(i);const r={atom:e,target:s.params,projectDir:n,renderDir:Ue.resolve(n,"nextjs")};return{deployer:await Me(r)}};const tt=c,ot=l,nt=p,it=s,at=d,st=m,rt=f,ct=async()=>{if(!await O({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=A.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:lt}=y,pt=class{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(B.set_api_url(e.data.url),t)return B.set_req_token(t),void o(t);q({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=>{B.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{B.set_req_token(),n(e)}))}))}},dt=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.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;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}},n={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},n.targets=n.targets||[],n.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=M({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=M({},t.replace_options||t.replace?.options||{}),t.terser_options=M({},t.terser_options||t.terser?.options||{}),t.css_options=M({},t.css_options||t.css?.options||{}),t.wasm_options=M({},t.wasm_options||t.wasm?.options||{}),t.copy_options=M(n,t.copy_options||t.copy?.options||{}),t.json_options=M({},t.json_options||t.json?.options||{}),t.image_options=M({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=M(o,t.rollup_output||t.rollup?.output||{});const i=Object.keys(o);for(const e of i){const n=o[e];n&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(n.enabled=!0),n.babel_options=n.babel_options||t.babel_options,n.browsersync_options=M(t.browsersync_options,n.browsersync_options),n.replace_options=M(t.replace_options,n.replace_options),n.terser_options=M(t.terser_options,n.terser_options),n.css_options=M(t.css_options,n.css_options),n.wasm_options=M(t.wasm_options,n.wasm_options),n.copy_options=M(t.copy_options,n.copy_options),n.json_options=M(t.json_options,n.json_options),n.image_options=M(t.image_options,n.image_options),t.form_enabled&&(n.babel=!0)):n.enabled=!1)}t.babel_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=i.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),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.form_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},mt=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 J({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(e.doc.features.bin_file_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"})},ft=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!e.doc.features.index_html_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=K.resolve(o.projectDir,"src/app");L.existsSync(s)||L.mkdirSync(s,{recursive:!0}),await U({pattern:["index.html.njk","index.js.njk"],dir:K.resolve(a,"src/app"),outDir:s,context:i})},ut=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.index_html_enabled&&r.push(H.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_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 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 G({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=W.compile(z.readFileSync(H.resolve(l,"package.json.njk"),"utf8"),W.configure(l)).render(c),d=t.projectDir,m=H.resolve(d,"package.json");z.writeFileSync(m,p,"utf8")},ht=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n},a=o.templateDir,s=X.resolve(o.projectDir,"src/cli");V.existsSync(s)||V.mkdirSync(s,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(a,"src/cli"),outDir:s,context:i})},yt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:n},a=ee.resolve(o.projectDir,"src","default/index.js");if(!Q.existsSync(a))throw new Error(`Entry file not found: ${a}`);const s=(await oe({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=te.compile(Q.readFileSync(ee.resolve(l,"rollup.config.js.njk"),"utf8"),te.configure(l)).render(i),d=o.projectDir,m=ee.resolve(d,"rollup.config.js");Q.writeFileSync(m,p,"utf8")},wt=async({atom:e,setInProgress:t,context:o,njEnv:n})=>{if(!0===e.doc.features.form_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=ae.compile(ne.readFileSync(ie.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=ie.resolve(p,"src/default/to.yargs.js");ne.writeFileSync(d,l,"utf8")},gt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=ce.compile(se.readFileSync(re.resolve(a,".gitignore.njk"),"utf8"),ce.configure(a)).render(i),r=o.projectDir,c=re.resolve(r,".gitignore");se.writeFileSync(c,s,"utf8")},bt=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=de.compile(le.readFileSync(pe.resolve(a,"tsconfig.json.njk"),"utf8"),de.configure(a)).render(i),r=o.projectDir,c=pe.resolve(r,"tsconfig.json");le.writeFileSync(c,s,"utf8")},kt=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=me.compile(fe.readFileSync(ue.resolve(o,`${i}.njk`),"utf8"),me.configure(o)).render(e),a=t.projectDir,s=ue.resolve(a,`${i}`);fe.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=me.compile(fe.readFileSync(ue.resolve(c,`${i}.njk`),"utf8"),me.configure(c)).render(r),p=t.projectDir,d=ue.resolve(p,`${i}`);fe.writeFileSync(d,l,"utf8")}},xt=async e=>{const{atom:t,packageDependencies:o,context:n,deploymentProjectTarget:i,deploymentProject:a,buildId:s}=e;if(!0===i.enabled)if("lib"===i.name)await Ge({...e});else if("red"===i.name)await Ye({...e});else if("npm"===i.name)await He({...e});else if("pm"===i.name)await ze({...e});else if("gitlab"===i.name)await We({...e});else if("macos-app"===i.name)await Xe({...e});else if("ios-app"===i.name)await Ve({...e});else if("electron"===i.name)await Ze({...e});else if("webos"===i.name)await Qe({...e});else{let e;if("nextjs"===i.name&&(e=et),!e)return;await e({atom:t,target:i,onProgress:setInProgress,projectDir:n.projectDir,dependencies:o})}},{Atom:vt}=w,jt=E,_t=x,Dt=F,Tt=e,Pt=v,St=N;var $t=class{#e;#t;#o;#n;#i;#a;#s;#r;#c;#l;#p;#d;#m;#f;#u;#h;#y;#w;#g;#b;constructor(e){this.#e=new pt,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:vt,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 ct(),this.#p=this.#t.buildId||lt(24),this.#b.buildId=this.#p,this.#u=this.#t.mode,this.#h=["all","deploy","build","file"].includes(this.#u),this.#y=["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(Tt({name:"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await dt(this.#b),await mt(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 vt.get({id:e}),this.#n="string"==typeof this.#o.doc.content?nt.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(tt.existsSync(e)&&tt.readdirSync(e).forEach((t=>{n.includes(t)||(o=it.rm("-rf",ot.join(e,t)))})),o=it.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=it.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=it.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=it.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=it.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=at.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=ot.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=lt(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=jt({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 vt.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await vt.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await vt.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=ot.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],n=await Pt({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 _t({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 _t({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=st(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=st(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||st(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||st(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||st(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||st(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||st(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||st(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||st(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||st(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||st(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||st(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||st(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=ot.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=ot.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!tt.existsSync(e)){tt.mkdirSync(ot.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",tt.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir="./types/target/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;tt.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=at.compile(tt.readFileSync(ot.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render({...e,ui:{package:"@flownet/react-app"}}),n=this.#t.projectDir,i=ot.resolve(n,"src/default/index.js");tt.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=at.compile(tt.readFileSync(ot.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=ot.resolve(n,`src/default/${e.codeKey}.js`);tt.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=at.compile(tt.readFileSync(ot.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=ot.resolve(t,`src/default/blocks/${o}`);tt.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(rt(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 St({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 createAutoRun(){if(!0===this.#o.doc.features.multiple||!this.#o.doc.features.browser_enabled||!this.#o.doc.features.browser_autorun)return;await this.setInProgress({message:"Creating autorun.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#a,ts:Date.now()},t=this.#t.templateDir,o=at.compile(tt.readFileSync(ot.resolve(t,"autorun.html.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=ot.resolve(n,"autorun.html");tt.writeFileSync(i,o,"utf8")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...n}=this.#o.doc,i={content:nt.dump(n)},a=this.#t.templateDir,s=at.compile(tt.readFileSync(ot.resolve(a,`${e}.njk`),"utf8"),this.#i).render(i),r=this.#t.projectDir,c=ot.resolve(r,`${e}`);tt.writeFileSync(c,s,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:nt.dump(this.#n)},n=this.#t.templateDir,i=at.compile(tt.readFileSync(ot.resolve(n,`${e}.njk`),"utf8"),this.#i).render(o),a=this.#t.projectDir,s=ot.resolve(a,`${e}`);tt.writeFileSync(s,i,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=it.exec(`npm install ${this.#o.doc.features.npm_install_flags}`,{cwd:e});if(0!==t.code)throw new Error("Couldnt install npm packages.");if(await this.setInProgress({message:"Prettifiying source files."}),t=it.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:e}),0!==t.code)throw new Error("Couldnt format files.");if(await this.setInProgress({message:"Creating .d.ts"}),t=it.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=it.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build workflow project.")}async runPrettifier(){const e=this.#t.projectDir,t=it.exec("prettier --write .",{cwd:ot.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 vt.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 vt.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 xt({...this.#b,deploymentProject:t,deploymentProjectTarget:n})}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let n=await vt.first({name:t.deploy.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await vt.update(n,{id:n.id})):n=await vt.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#d,{status:"IN_PROGRESS",message:e})}async build(){if(this.#g&&!this.#h)return await this.createNetwork();try{const e=this.#g?await Dt({root:this.#l}):void 0;this.#h&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#g&&tt.writeFileSync(ot.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 this.createAutoRun(),await kt(this.#b),await bt(this.#b),await gt(this.#b),await wt(this.#b),await ht(this.#b),await ft(this.#b),await yt(this.#b),await ut(this.#b),this.#y&&(await this.runBuildScripts(),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 Dt({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 Ct=c,It=l;var Et=function({baseDir:e=__dirname}){let t=e;for(;t!==It.parse(t).root;){const e=It.join(t,"node_modules");if(Ct.existsSync(e))return e;t=It.dirname(t)}return null};const Ft=process.cwd();console.log(`cwd: ${Ft}`),e({name:["redis"],dir:Ft});const Nt=t,At=o,{hideBin:Ot}=n,Bt=i,qt=a,Rt=s,Mt=r,Jt=$t,Lt=Et({baseDir:__dirname});async function Kt(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:Nt.resolve(Ft,`./.output/${e.id}`),templateDir:Nt.resolve(Lt,"./@flownet/template-node-workflow/default"),templateCommonDir:Nt.resolve(Lt,"./@flownet/template-node-common/default"),coreDir:Nt.resolve(Lt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=Nt.resolve(Ft,"flow.yaml");if(!Bt.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=Bt.readFileSync(t,"utf8"),n=qt.parse(o),i=Nt.dirname(t),a=Nt.resolve(i,"flow.main.yaml");if(!Bt.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const s=Bt.readFileSync(a,"utf8"),r=qt.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=Nt.resolve(i,"flow.devops.yaml");if(Bt.existsSync(l)){const e=Bt.readFileSync(l,"utf8"),t=qt.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{Bt.writeFileSync(c.devops.filePath,qt.stringify(c.devops.doc))}}}const p=Nt.resolve(i,"flow.readme.md");if(Bt.existsSync(p)){const e=Bt.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:Nt.resolve(Lt,"./@flownet/template-node-workflow/default"),templateCommonDir:Nt.resolve(Lt,"./@flownet/template-node-common/default"),coreDir:Nt.resolve(Lt,"./@flownet/template-node-workflow/core"),projectDir:Nt.resolve(t.projectDir,"./target"),projectSrcDir:Nt.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Lt}/.bin:${process.env.PATH}`,At(Ot(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=Nt.resolve(Lt,"./@flownet/template-node-workflow/project"),o=Nt.resolve(Ft,e.name);Bt.existsSync(o)||Bt.mkdirSync(o),await Mt({dir:t,outDir:o,context:e});let n=Rt.exec("fnet build",{cwd:o});if(0!==n.code)throw new Error("Failed to build project.");if(Rt.which("git")&&(n=Rt.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 Kt(e),o=new Jt(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 Kt(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}`;Rt.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 Kt(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}`;Rt.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 Kt(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}`;Rt.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 Kt(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}`;Rt.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("@flownet/lib-execute-command-with-ipc-file"),_=require("semver"),D=require("node:os"),T=require("@node-red/util"),P=require("@flownet/lib-to-ios-app"),S=require("@flownet/lib-to-macos-app"),C=require("@flownet/lib-to-electron"),$=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");const A=u,O=y;const{Api:B}=w,q=g.default,R=b;const M=x;const J=k;const L=c,K=l,U=r;const W=d,z=c,H=l,Y=v,G=k;const V=c,X=l,Z=r;const Q=c,ee=l,te=d,oe=v;const ne=c,ie=l,ae=d;const se=c,re=l,ce=d;const le=c,pe=l,de=d;const me=d,fe=c,ue=l;const ye=s;const he=s;const we=s;const ge=s;const be=j,xe=e;const ke=c,ve=l,je=_,_e=j,De=e;const Te=c,Pe=l,Se=_,Ce=s,$e=e;const Ie=c,Ee=l,Fe=D,Ne=d,Ae=T,Oe=e;const Be=i,qe=t,Re=e;const Me=P;const Je=S;const Le=C;const Ke=$;const Ue=I,We=m,ze=x,He=_,Ye=l;const Ge=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.deploy.params.config||"gitlab",c=xe({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.deploy.params.name}'`,s+=` --projectBranch='${n.deploy.params.branch||"main"}'`,s+=` --gitlabHost='${l.gitlabHost}'`,s+=` --gitlabToken='${l.gitlabToken}'`,s+=` --gitlabUsername='${l.gitlabUsername}'`,s+=` --gitlabUserEmail='${l.gitlabUserEmail}'`,!0!==n.dryRun&&(await be({command:s}),o.isDirty=!0)},Ve=async({setInProgress:e,context:t,deploymentProject:o,deploymentProjectTarget:n,buildId:i,registerToPackageManager:a})=>{await e({message:"Deploying it as pm package."});const s=t.projectDir,r=ve.resolve(s,"package.json"),c=ke.readFileSync(r),l=JSON.parse(c);l.name=n.deploy.params.name,l.version=je.inc(n.deploy.params.version,"patch"),delete l.scripts,delete l.devDependencies,ke.writeFileSync(r,JSON.stringify(l,null,"\t"));const{file:p,data:d}=await De({name:n.deploy.params.pm?.config||t.pmConfig||"pm",dir:t.projectDir});let m="fnet-upload-files-to-gcs";m+=` --projectId='${d.env.PM_PROJECT_ID}'`,m+=` --bucketName='${d.env.PM_BUCKET_NAME}'`,m+=` --keyFilename='${ve.resolve(ve.dirname(p),d.env.PM_UPLOADER_KEY_FILE)}'`,m+=` --dir='${s}'`,m+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",m+=` --destDir='${l.name}/${l.version}'`,m+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===n.dryRun&&(m+=" --dryRun"),await _e({command:m}),ke.writeFileSync(r,c),!0!==n.dryRun&&(o.isDirty=!0,n.deploy.params.version=l.version,await a({target:n,packageJSON:l}))},Xe=async({atom:e,setInProgress:t,context:o,deploymentProject:n,deploymentProjectTarget:i})=>{await t({message:"Deploying it as npm package."});const a=o.projectDir,s=Pe.resolve(a,"package.json"),r=Te.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 ."},Te.writeFileSync(s,JSON.stringify(c,null,"\t"));const p=await($e({name:o.npmConfig||"npm",dir:o.projectDir})?.data);if(Te.writeFileSync(Pe.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");Te.writeFileSync(s,r),n.isDirty=!0,i.params.version=c.version},Ze=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||Ae.util.generateId(),label:`${p}/${e.id?e.id:Fe.hostname()}/${e.name}/${i.deploy.name||i.deploy.template}`},function:{id:Ae.util.generateId(),name:e.doc.name,initialize:{content:Ie.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},inject:{id:Ae.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:Ae.util.generateId()}}};else if("cronjob"===i.deploy.template){let t=i.deploy.params?.schedules?cloneDeep(i.deploy.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||Ae.util.generateId(),label:`${p}/${e.id?e.id:Fe.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Ae.util.generateId(),name:e.doc.name,initialize:{content:Ie.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},cronjob:{id:Ae.util.generateId(),schedules:t},debug:{id:Ae.util.generateId()}}}}else{if("http"!==i.deploy.template)return;d={atom:e,packageDependencies:s,red:{tab:{id:i.deploy.id||Ae.util.generateId(),label:`${p}/${e.id?e.id:Fe.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Ae.util.generateId(),name:e.doc.name,initialize:{content:Ie.readFileSync(Ee.resolve(c,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:e.doc.bundleName}},httpin:{id:Ae.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:Ae.util.generateId()},debug:{id:Ae.util.generateId()}}}}let m=Ne.compile(Ie.readFileSync(Ee.resolve(l,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),r).render(d);if(Ie.writeFileSync(Ee.resolve(c,"node-red.yaml"),m),m=yaml.load(m),!0===i.dryRun)return;n.isDirty=!0;const f=await(Oe({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}},Qe=async({atom:e,Atom:t,setInProgress:o,context:n,packageDependencies:i,deploymentProject:a,deploymentProjectTarget:s,buildId:r})=>{await o({message:"Deploying it as workflow lib."});const c=await(Re({name:"atom",dir:n.projectDir})?.data);let l,p,d,m=s.deploy.name.split("/");if(1===m.length)p=c.env.ATOM_LIBRARIES_ID,d=s.deploy.name;else{if(2!==m.length)throw new Error("Wrong name path.");{const e=await t.first({where:{name:m[0],parent_id:c.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");p=e.id,d=m[1]}}if(!0===s.dryRun)return;if(a.isDirty=!0,s.deploy.id){if(l=await t.get({id:s.deploy.id}),!l)return}else{if(l=await t.create({parent_id:p,doc:{name:d,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!l)return;s.deploy.id=l.id}const f=n.projectDir;l.doc.contents=[{content:Be.readFileSync(qe.resolve(f,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:Be.readFileSync(qe.resolve(f,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:Be.readFileSync(qe.resolve(f,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],l.doc.name=d,l.doc.dependencies=i,"workflow.lib"===e.type?l.doc.subtype="library":"workflow"===e.type&&(l.doc.subtype="workflow"),l=await t.update(l,{id:l.id})},et=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 Me(c),n.isDirty=!0},tt=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 Je(r),n.isDirty=!0},ot=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 Le(r),n.isDirty=!0},nt=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 Ke(s),n.isDirty=!0},it=async({atom:e,target:t,onProgress:o,projectDir:n,dependencies:i})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=ze({name:"nextjs-app",version:"0.1.0"},t.params);const a=He.inc(t.params.version,"patch");t.params.version=a;const s=We(t);s.params.dependencies=We(i);const r={atom:e,target:s.params,projectDir:n,renderDir:Ye.resolve(n,"nextjs")};return{deployer:await Ue(r)}};const at=c,st=l,rt=p,ct=s,lt=d,pt=m,dt=f,mt=async()=>{if(!await O({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=A.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},{nanoid:ft}=h,ut=class{init({config:e,accessToken:t}){return new Promise(((o,n)=>{if(B.set_api_url(e.data.url),t)return B.set_req_token(t),void o(t);q({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=>{B.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{B.set_req_token(),n(e)}))}))}},yt=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.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;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}},n={};!0===t.webos&&(o.webos={format:"iife",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},n.targets=n.targets||[],n.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=M({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=M({},t.replace_options||t.replace?.options||{}),t.terser_options=M({},t.terser_options||t.terser?.options||{}),t.css_options=M({},t.css_options||t.css?.options||{}),t.wasm_options=M({},t.wasm_options||t.wasm?.options||{}),t.copy_options=M(n,t.copy_options||t.copy?.options||{}),t.json_options=M({},t.json_options||t.json?.options||{}),t.image_options=M({},t.image_options||t.image?.options||{}),t.rollup=t.rollup||{},t.rollup_output=M(o,t.rollup_output||t.rollup?.output||{});const i=Object.keys(o);for(const e of i){const n=o[e];n&&(!1!==t.rollup[e]?(!0===t.rollup[e]&&(n.enabled=!0),n.babel_options=n.babel_options||t.babel_options,n.browsersync_options=M(t.browsersync_options,n.browsersync_options),n.replace_options=M(t.replace_options,n.replace_options),n.terser_options=M(t.terser_options,n.terser_options),n.css_options=M(t.css_options,n.css_options),n.wasm_options=M(t.wasm_options,n.wasm_options),n.copy_options=M(t.copy_options,n.copy_options),n.json_options=M(t.json_options,n.json_options),n.image_options=M(t.image_options,n.image_options),t.form_enabled&&(n.babel=!0)):n.enabled=!1)}t.babel_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=i.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=i.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),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.form_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},ht=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 J({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(e.doc.features.bin_file_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"})},wt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!e.doc.features.index_html_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=K.resolve(o.projectDir,"src/app");L.existsSync(s)||L.mkdirSync(s,{recursive:!0}),await U({pattern:["index.html.njk","index.js.njk"],dir:K.resolve(a,"src/app"),outDir:s,context:i})},gt=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.index_html_enabled&&r.push(H.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_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 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 G({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=W.compile(z.readFileSync(H.resolve(l,"package.json.njk"),"utf8"),W.configure(l)).render(c),d=t.projectDir,m=H.resolve(d,"package.json");z.writeFileSync(m,p,"utf8")},bt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const i={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:n},a=o.templateDir,s=X.resolve(o.projectDir,"src/cli");V.existsSync(s)||V.mkdirSync(s,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(a,"src/cli"),outDir:s,context:i})},xt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating rollup file."});const i={atom:e,packageDependencies:n},a=ee.resolve(o.projectDir,"src","default/index.js");if(!Q.existsSync(a))throw new Error(`Entry file not found: ${a}`);const s=(await oe({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=te.compile(Q.readFileSync(ee.resolve(l,"rollup.config.js.njk"),"utf8"),te.configure(l)).render(i),d=o.projectDir,m=ee.resolve(d,"rollup.config.js");Q.writeFileSync(m,p,"utf8")},kt=async({atom:e,setInProgress:t,context:o,njEnv:n})=>{if(!0===e.doc.features.form_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=ae.compile(ne.readFileSync(ie.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),n).render(r),p=o.projectDir,d=ie.resolve(p,"src/default/to.yargs.js");ne.writeFileSync(d,l,"utf8")},vt=async({atom:e,setInProgress:t,context:o,packageDependencies:n})=>{await t({message:"Creating .gitignore"});const i={atom:e,packageDependencies:n},a=o.templateCommonDir,s=ce.compile(se.readFileSync(re.resolve(a,".gitignore.njk"),"utf8"),ce.configure(a)).render(i),r=o.projectDir,c=re.resolve(r,".gitignore");se.writeFileSync(c,s,"utf8")},jt=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=de.compile(le.readFileSync(pe.resolve(a,"tsconfig.json.njk"),"utf8"),de.configure(a)).render(i),r=o.projectDir,c=pe.resolve(r,"tsconfig.json");le.writeFileSync(c,s,"utf8")},_t=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=me.compile(fe.readFileSync(ue.resolve(o,`${i}.njk`),"utf8"),me.configure(o)).render(e),a=t.projectDir,s=ue.resolve(a,`${i}`);fe.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=me.compile(fe.readFileSync(ue.resolve(c,`${i}.njk`),"utf8"),me.configure(c)).render(r),p=t.projectDir,d=ue.resolve(p,`${i}`);fe.writeFileSync(d,l,"utf8")}},Dt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Prettifiying source files."});if(0!==ye.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:o}).code)throw new Error("Couldnt format files.")},Tt=async({setInProgress:e,context:t})=>{const o=t.projectDir;await e({message:"Creating .d.ts"});if(0!==he.exec("tsc",{cwd:o}).code)throw new Error("Couldnt create .d.ts files.")},Pt=async({setInProgress:e,atom:t,context:o})=>{const n=o.projectDir;await e({message:"Installing npm packages."});if(0!==we.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!==ge.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,deploymentProject:a,buildId:s}=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 Ve({...e});else if("gitlab"===i.name)await Ge({...e});else if("macos-app"===i.name)await tt({...e});else if("ios-app"===i.name)await et({...e});else if("electron"===i.name)await ot({...e});else if("webos"===i.name)await nt({...e});else{let e;if("nextjs"===i.name&&(e=it),!e)return;await e({atom:t,target:i,onProgress:setInProgress,projectDir:n.projectDir,dependencies:o})}},{Atom:$t}=w,It=E,Et=k,Ft=F,Nt=e,At=v,Ot=N;var Bt=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 ut,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:$t,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 mt(),this.#p=this.#t.buildId||ft(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(Nt({name:"atom",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await yt(this.#b),await ht(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 $t.get({id:e}),this.#n="string"==typeof this.#o.doc.content?rt.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(at.existsSync(e)&&at.readdirSync(e).forEach((t=>{n.includes(t)||(o=ct.rm("-rf",st.join(e,t)))})),o=ct.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=ct.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=ct.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=ct.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=ct.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=lt.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=st.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=ft(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=It({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 $t.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await $t.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await $t.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=st.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],n=await At({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 Et({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 Et({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=pt(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=pt(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||pt(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||pt(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||pt(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||pt(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||pt(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||pt(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||pt(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||pt(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||pt(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||pt(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||pt(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=st.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=st.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!at.existsSync(e)){at.mkdirSync(st.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",at.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir=`./types/${st.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;at.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=lt.compile(at.readFileSync(st.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render({...e,ui:{package:"@flownet/react-app"}}),n=this.#t.projectDir,i=st.resolve(n,"src/default/index.js");at.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=lt.compile(at.readFileSync(st.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=st.resolve(n,`src/default/${e.codeKey}.js`);at.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=lt.compile(at.readFileSync(st.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=st.resolve(t,`src/default/blocks/${o}`);at.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(dt(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 Ot({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 createAutoRun(){if(!0===this.#o.doc.features.multiple||!this.#o.doc.features.browser_enabled||!this.#o.doc.features.browser_autorun)return;await this.setInProgress({message:"Creating autorun.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#a,ts:Date.now()},t=this.#t.templateDir,o=lt.compile(at.readFileSync(st.resolve(t,"autorun.html.njk"),"utf8"),this.#i).render(e),n=this.#t.projectDir,i=st.resolve(n,"autorun.html");at.writeFileSync(i,o,"utf8")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...n}=this.#o.doc,i={content:rt.dump(n)},a=this.#t.templateDir,s=lt.compile(at.readFileSync(st.resolve(a,`${e}.njk`),"utf8"),this.#i).render(i),r=this.#t.projectDir,c=st.resolve(r,`${e}`);at.writeFileSync(c,s,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:rt.dump(this.#n)},n=this.#t.templateDir,i=lt.compile(at.readFileSync(st.resolve(n,`${e}.njk`),"utf8"),this.#i).render(o),a=this.#t.projectDir,s=st.resolve(a,`${e}`);at.writeFileSync(s,i,"utf8")}async runPrettifier(){const e=this.#t.projectDir,t=ct.exec("prettier --write .",{cwd:st.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 $t.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 $t.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;let n=await $t.first({name:t.deploy.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});n?(n.doc.versions.splice(0,0,{v:o.version}),await $t.update(n,{id:n.id})):n=await $t.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message: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 Ft({root:this.#l}):void 0;this.#y&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#g&&at.writeFileSync(st.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 this.createAutoRun(),await _t(this.#b),await jt(this.#b),await vt(this.#b),await kt(this.#b),await bt(this.#b),await wt(this.#b),await xt(this.#b),await gt(this.#b),await Dt(this.#b),await Tt(this.#b),this.#h&&(await Pt(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 Ft({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 qt=c,Rt=l;var Mt=function({baseDir:e=__dirname}){let t=e;for(;t!==Rt.parse(t).root;){const e=Rt.join(t,"node_modules");if(qt.existsSync(e))return e;t=Rt.dirname(t)}return null};const Jt=process.cwd();e({name:["redis"],dir:Jt});const Lt=t,Kt=o,{hideBin:Ut}=n,Wt=i,zt=a,Ht=s,Yt=r,Gt=Bt,Vt=Mt({baseDir:__dirname});async function Xt(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:Lt.resolve(Jt,`./.output/${e.id}`),templateDir:Lt.resolve(Vt,"./@flownet/template-node-workflow/default"),templateCommonDir:Lt.resolve(Vt,"./@flownet/template-node-common/default"),coreDir:Lt.resolve(Vt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=Lt.resolve(Jt,"flow.yaml");if(!Wt.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=Wt.readFileSync(t,"utf8"),n=zt.parse(o),i=Lt.dirname(t),a=Lt.resolve(i,"flow.main.yaml");if(!Wt.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const s=Wt.readFileSync(a,"utf8"),r=zt.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=Lt.resolve(i,"flow.devops.yaml");if(Wt.existsSync(l)){const e=Wt.readFileSync(l,"utf8"),t=zt.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{Wt.writeFileSync(c.devops.filePath,zt.stringify(c.devops.doc))}}}const p=Lt.resolve(i,"flow.readme.md");if(Wt.existsSync(p)){const e=Wt.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:Lt.resolve(Vt,"./@flownet/template-node-workflow/default"),templateCommonDir:Lt.resolve(Vt,"./@flownet/template-node-common/default"),coreDir:Lt.resolve(Vt,"./@flownet/template-node-workflow/core"),projectDir:Lt.resolve(t.projectDir,"./.workspace"),projectSrcDir:Lt.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Vt}/.bin:${process.env.PATH}`,Kt(Ut(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=Lt.resolve(Vt,"./@flownet/template-node-workflow/project"),o=Lt.resolve(Jt,e.name);Wt.existsSync(o)||Wt.mkdirSync(o),await Yt({dir:t,outDir:o,context:e});let n=Ht.exec("fnet build",{cwd:o});if(0!==n.code)throw new Error("Failed to build project.");if(Ht.which("git")&&(n=Ht.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 Xt(e),o=new Gt(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 Xt({...e,mode:"all"}),o=new Gt(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 Xt({...e,mode:"file"}),o=new Gt(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 Xt(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}`;Ht.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 Xt(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}`;Ht.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 Xt(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}`;Ht.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 Xt(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}`;Ht.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,i=require("@flownet/lib-load-fnet-config"),s=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 i=s,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=i.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.9.
|
|
2
|
+
"use strict";var e,t,i=require("@flownet/lib-load-fnet-config"),s=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 i=s,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=i.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.9.10",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-execute-command-with-ipc-file":"^0.1.11","@flownet/lib-is-redis-online":"^0.1.13","@flownet/lib-list-npm-versions":"^0.1.31","@flownet/lib-load-fnet-config":"^0.1.27","@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.4","@flownet/lib-to-macos-app":"^0.2.2","@flownet/lib-to-nextjs":"^0.1.12","@flownet/lib-to-webos":"^0.2.7","@flownet/lib-upload-files-to-gcs":"^0.1.12","@flownet/template-node-common":"^0.8.9","@flownet/template-node-library":"^0.8.8","@flownet/template-node-workflow":"^0.8.8","@fnet/expression":"^0.1.2","@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();i({name:["server","redis"],dir:v}),async function(){const e=await _()();if(!e)throw new Error("Redis is offline.");const t=k,i=n,s=o,r=l,g=function(){if(f)return b;f=1;const e=n,t=d,i=c,{nanoid:s}=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,i){await this._redis_client.SETEX(e,i||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 i=e.body.id;if(!i)throw new Error("Build Id is not defined.");const s="BUILD:"+i;this._cache_get(s).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=s(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=all`;return i.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=s(24),o=`node ${t.resolve(__dirname,"builder/wf-cli.js")} build --id=${r} --buildId=${n} --mode=bpmn`;i.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,i=c,{nanoid:s}=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,i){await this._redis_client.SETEX(e,i||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 i=e.body.id;if(!i)throw new Error("Build Id is not defined.");const s="BUILD:"+i;this._cache_get(s).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=s(24),o=`node ${t.resolve(__dirname,"builder/lib-cli.js")} build --id=${r} --buildId=${n} --mode=all}`;return i.exec(o,{async:!0,cwd:this.#e}),{id:n}}}}(),E=u,x=h,q=new(0,x.MemoryStore),S=new w({store:q}),I=i(),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(s()),I.use(i.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.9.
|
|
3
|
+
"version": "0.9.10",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
"@flownet/lib-to-webos": "^0.2.7",
|
|
30
30
|
"@flownet/lib-upload-files-to-gcs": "^0.1.12",
|
|
31
31
|
"@flownet/template-node-common": "^0.8.9",
|
|
32
|
-
"@flownet/template-node-library": "^0.8.
|
|
33
|
-
"@flownet/template-node-workflow": "^0.8.
|
|
32
|
+
"@flownet/template-node-library": "^0.8.8",
|
|
33
|
+
"@flownet/template-node-workflow": "^0.8.8",
|
|
34
34
|
"@fnet/expression": "^0.1.2",
|
|
35
35
|
"@node-red/util": "^3.1.0",
|
|
36
36
|
"axios": "^1.5.0",
|