@fnet/cli 0.5.7 → 0.5.8
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/wf-cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
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"),i=require("yargs/helpers"),n=require("fs"),s=require("yaml"),a=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),d=require("js-yaml"),p=require("nunjucks"),m=require("lodash.clonedeep"),h=require("isobject"),f=require("axios"),y=require("@node-red/util"),u=require("semver"),w=require("redis"),g=require("@flownet/lib-is-redis-online"),b=require("node:os"),x=require("lodash.merge"),k=require("nanoid"),j=require("@flownet/lib-atom-api-js"),v=require("qs"),D=require("@flownet/lib-execute-command-with-ipc-file"),_=require("@flownet/lib-parse-node-url"),T=require("@flownet/lib-list-npm-versions"),P=require("@flownet/lib-bpmn-from-flow"),S=require("@flownet/lib-parse-imports-js"),I=require("@flownet/lib-to-webos"),E=require("@flownet/lib-to-electron"),A=require("@flownet/lib-to-macos-app"),C=require("@flownet/lib-to-ios-app"),N=require("@flownet/lib-to-nextjs");const F=w,$=g;const{Api:O}=j,B=f.default,R=v;const M=N,q=m,J=x,L=u,K=l;const W=c,G=l,U=d,Y=a,z=p,H=m,V=h,X=f,Z=y,Q=u,ee=async()=>{if(!await $({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},te=b,oe=x,{nanoid:ie}=k,ne=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(O.set_api_url(e.data.url),t)return O.set_req_token(t),void o(t);B({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=>{O.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{O.set_req_token(),i(e)}))}))}},{Atom:se}=j,ae=D,re=_,ce=T,le=P,de=e,pe=S,me=I,he=E,fe=A,ye=C,ue=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:n})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=J({name:"nextjs-app",version:"0.1.0"},t.params);const s=L.inc(t.params.version,"patch");t.params.version=s;const a=q(t);a.params.dependencies=q(n);const r={atom:e,target:a.params,projectDir:i,renderDir:K.resolve(i,"nextjs")};return{deployer:await M(r)}};var we=class{#e;#t;#o;#i;#n;#s;#a;#r;#c;#l;#d;#p;#m;#h;#f;#y;#u;#w;#g;#b;constructor(e){this.#e=new ne,this.#t=e,this.#s=[],this.#a={},this._expire_ttl=3600,this._expire_ttl_short=300}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 ee(),this.#l=this.#t.buildId||ie(24),this.#y=this.#t.mode,this.#u=["all","deploy","build","file"].includes(this.#y),this.#w=["all","deploy","build"].includes(this.#y),this.#g=["all","deploy"].includes(this.#y),this.#b=["all","deploy","build","file","bpmn"].includes(this.#y),this.#p=this.#t.protocol,this.#d="BUILD:"+this.#l,this.#m=await(de({name:"atom",dir:this.#t.projectDir})?.data),this.#h=await(de({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#f=await(de({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await this.initFeatures(),await this.initDependencies();const e=await this.initNodeTree({workflow:this.#i});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.#s}),await this.resolveNodeTree({root:e}),this.#c=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#m}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await se.get({id:e}),this.#i="string"==typeof this.#o.doc.content?U.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"}async initFeatures(){this.#o.doc.features=this.#o.doc.features||{};const e=this.#o.doc.features;e.print_steps=e.print_steps||e.print?.steps||!1,e.form_enabled=!0===this.#o.doc.form||!0===this.#o.doc.form?.enabled||!0===e.form||!0===e.form?.enabled,e.browser_autorun=!0===e.browser?.autorun;const t={cjs:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0},cjsx:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0},esm:{format:"esm",context:e.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0},esmx:{format:"esm",browser:!0,babel:!0,context:e.form_enabled?"window":"global",replace:!0,browsersync:!0},iife:{format:"iife",context:e.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0}};!0===e.webos&&(t.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,babel_options:{targets:{chrome:"79"}}}),e.babel_options=e.babel_options||e.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},e.browsersync_options=oe({server:".",startPath:"/",files:["./app/**/*","./dist/**/*"]},e.browsersync_options||e.browsersync?.options||{}),e.replace_options=oe({},e.replace_options||e.replace?.options||{}),e.terser_options=oe({},e.terser_options||e.terser?.options||{}),e.css_options=oe({},e.css_options||e.css?.options||{}),e.wasm_options=oe({},e.wasm_options||e.wasm?.options||{}),e.copy_options=oe({},e.copy_options||e.copy?.options||{}),e.json_options=oe({},e.json_options||e.json?.options||{}),e.rollup_output=oe(t,e.rollup_output||e.rollup?.output||e.rollup||{});const o=Object.keys(t);for(const i of o){const o=t[i];o&&(o.babel_options=o.babel_options||e.babel_options,o.browsersync_options=oe(e.browsersync_options,o.browsersync_options),o.replace_options=oe(e.replace_options,o.replace_options),o.terser_options=oe(e.terser_options,o.terser_options),o.css_options=oe(e.css_options,o.css_options),o.wasm_options=oe(e.wasm_options,o.wasm_options),o.copy_options=oe(e.copy_options,o.copy_options),o.json_options=oe(e.json_options,o.json_options),e.form_enabled&&(o.babel=!0))}e.babel_enabled=o.some((t=>!0===e.rollup_output[t].babel)),e.browser_enabled=o.some((t=>!0===e.rollup_output[t].babel)),e.browsersync_enabled=o.some((t=>!0===e.rollup_output[t].browsersync)),e.browsersync_enabled=e.browsersync_enabled&&(e.form_enabled||!0===e.browser_autorun),e.multiple_enabled=e.multiple_enabled||!0===e.multiple||!0===e.multiple?.enabled,e.wasm_enabled=!0===e.wasm||e.wasm&&!1!==e.wasm?.enabled,e.css_enabled=!0===e.css||e.css&&!1!==e.css?.enabled,e.json_enabled=!0===e.json||e.json&&!1!==e.json?.enabled,e.terser_enabled=!0===e.terser||e.terser&&!1!==e.terser?.enabled,e.copy_enabled=e.copy_enabled||e.copy&&!1!==e.copy?.enabled,e.bin_name=e.bin_name||e.bin?.name||e.bin,e.bin_enabled=e.bin_name&&("string"==typeof e.bin_name)(e.bin_enabled||!1!==e.bin?.enabled),e.dependency_auto_enabled=!1!==e.dependency_auto&&!1!==e.dependency_auto?.enabled,e.npm_install_flags=e.npm_install_flags||"",e.index_html_enabled=!(!0===this.#o.doc.features.multiple_enabled||!0!==this.#o.doc.features.form_enabled),e.bin_file_enabled=!(!0===this.#o.doc.features.multiple_enabled||!0===this.#o.doc.features.form_enabled)}async initDependencies(){this.#s.push({package:"eventemitter3",version:"^4.0"}),this.#s.push({package:"get-value",version:"^3.0"}),this.#s.push({package:"set-value",version:"^4.1"}),this.#o.doc.features.form_enabled?(this.#s.push({package:"react",version:"^18.2"}),this.#s.push({package:"react-dom",version:"^18.2"}),this.#s.push({package:"@flownet/react-app",version:"^0.1"}),this.#s.push({package:"@flownet/react-app-state",version:"^0.1"})):this.#s.push({package:"yargs",version:"^17"}),this.#s.push({package:"chalk",version:"^4"})}async initWorkflowDir(){const e=this.#t.projectDir,t=this.#t.coreDir;let o;const i=["node_modules"];if(W.existsSync(e)&&W.readdirSync(e).forEach((t=>{i.includes(t)||(o=Y.rm("-rf",G.join(e,t)))})),o=Y.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=Y.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=Y.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=Y.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=Y.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.#n=z.configure(e,{watch:!1,dev:!0})}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 i={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(i)}));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],i={name:`${t}`,childs:[],parent:e,definition:o,index:e.childs.length,context:{}};e.childs.push(i),o.hasOwnProperty("steps")?await this.initNode({node:i}):(i.depth=e.depth+1,i.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],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}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],i={name:t,childs:[],parent:e,definition:o[t],index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}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],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}async initBlockTypeForm({node:e}){e.type="form";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}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,i=typeof o[t];if("string"!==i&&"object"!==i)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/shell",o.args="string"===i?{cmd:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}async initBlockTypeConfig({node:e}){const t="config",o=e.definition,i=typeof o[t];if("string"!==i&&"object"!==i)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/config",o.args="string"===i?{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=G.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const i=[];let n=e;for(;n?.parent;)i.push(n.index),n=n.parent;i.reverse(),e.codeKey=`B_${i.join("_")}_${e.type}`,e.pathKey=`${i.join(".")}`,e.typeId=ie(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 i=t[e];"call"===i.type&&o.push(i)}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,i=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},n=t.find((e=>e.name===i.name&&e.type===i.type));n||t.push(i),e.target=n||i}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,i=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return i||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 i=t[e];"form"===i.type&&o.push(i)}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,i=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},n=t.find((e=>e.name===i.name&&e.type===i.type));n||t.push(i),e.target=n||i}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,i=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return i||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 i=o[e],n=await this.findAtomLibrary({url:i.name});i.atom=n;const s=n.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));s?.forEach((e=>{const o=t.find((t=>t.package===e.package));o?"string"==typeof e.path?(o.path||[]).some((t=>t===e.path))||(o.path=o.path||[],o.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(o.path||[]).some((t=>t===e))||(o.path=o.path||[],o.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const t=re({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 se.first({where:{name:e,parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await se.first({where:{name:o[0],parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"folder"}});return await se.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=G.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],i=await pe({file:e});for await(const e of i.required){if("npm"!==e.type)continue;const t=(await ce({name:e.package,groupBy:{minor:!0}}))[0][0];o.find((t=>t.package===e.package))||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 ce({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 i=o.childs.find((e=>e.name===t.next));if(i){e.context.next=i;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 i=t.childs.find((e=>e.index===o));if(i){e.context.next=i;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=H(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 i=Object.keys(o)[0];t.params[e]={key:i,hasDefault:!0,default:o[i]}}}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=H(e.definition);const t=e.context.transform;for(let e=0;e<t.assign?.length;e++){let o=t.assign[e],i=Object.keys(o)[0],n=o[i],s=this.transformValue(i),a=this.transformValue(n),r={key:JSON.stringify(s),value:JSON.stringify(a)};r.key=this.replaceExpression(r.key),r.value=this.replaceExpression(r.value),t.assign[e]=r}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||H(e.definition),this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.args&&(t.args=this.transformExpression(t.args)),t.result&&(t.result=this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.props&&(t.props=this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.raise=this.transformExpression(t.raise),this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||H(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||H(t.definition),t.context.transform.condition=this.replaceExpression(JSON.stringify(this.transformValue(t.definition.condition)));this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.next=this.transformExpression(t.next),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||H(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||H(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||H(e.definition);e.context.transform.for.in=this.transformExpression(e.definition.for.in),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||H(e.definition),this.resolveTypeCommon({node:e})}resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=this.transformValue(t.operation)),t.hasOwnProperty("page")&&(t.page=this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=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,i=this.#t.projectDir;if("local:"===o.protocol){const e=G.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=G.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!W.existsSync(e)){W.mkdirSync(G.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",W.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=`${i}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;W.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#n).render({...e,ui:{package:"@flownet/react-app"}}),i=this.#t.projectDir,n=G.resolve(i,"src/default/index.js");W.writeFileSync(n,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=z.compile(W.readFileSync(G.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,`src/default/${e.codeKey}.js`);W.writeFileSync(n,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.#a[e.type];if(t)return t;const o=this.#t.templateDir;return t=z.compile(W.readFileSync(G.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#n),this.#a[e.type]=t,t}createStepFile({node:e}){const t=this.#t.projectDir,o=`${e.codeKey}.js`,i=G.resolve(t,`src/default/blocks/${o}`);W.writeFileSync(i,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=i}transformExpression(e){let t=this.transformValue(e);return t=JSON.stringify(t),t=this.replaceExpression(t),t}transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=this.transformValue(e[t]);else if(V(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=this.transformValue(e[t[o]])}return e}replaceExpression(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createRollup(){await this.setInProgress({message:"Creating rollup file."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"rollup.config.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"rollup.config.js");W.writeFileSync(n,o,"utf8")}async createPackageJSON(){await this.setInProgress({message:"Creating package.json."});const e=this.#s.find((e=>"react"===e.package)),t=this.#s.find((e=>"react-dom"===e.package));e&&!t?this.#s.push({package:"react-dom",version:e.version}):e&&t&&(t.version=e.version),e&&(this.#s.find((e=>"@emotion/react"===e.package))||this.#s.push({package:"@emotion/react",version:"^11"}),this.#s.find((e=>"@emotion/styled"===e.package))||this.#s.push({package:"@emotion/styled",version:"^11"}));const o={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},i=this.#t.templateDir,n=z.compile(W.readFileSync(G.resolve(i,"package.json.njk"),"utf8"),this.#n).render(o),s=this.#t.projectDir,a=G.resolve(s,"package.json");W.writeFileSync(a,n,"utf8")}async createBin(){if(!0!==this.#o.doc.features.bin_file_enabled)return;await this.setInProgress({message:"Creating bin file."});const e=this.#t.projectDir;if(0!==Y.exec(`mkdir ${e}/bin`).code)throw new Error("Couldnt create library/bin dir.");const t={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},o=this.#t.templateDir;let i=z.compile(W.readFileSync(G.resolve(o,"bin/index.js.njk"),"utf8"),this.#n).render(t),n=G.resolve(e,"bin/index.js");W.writeFileSync(n,i,"utf8")}async createIndexHtml(){if(!this.#o.doc.features.index_html_enabled)return;await this.setInProgress({message:"Creating index.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s,ts:Date.now()},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"index.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"index.html");W.writeFileSync(n,o,"utf8")}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.#s,ts:Date.now()},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"autorun.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"autorun.html");W.writeFileSync(n,o,"utf8")}async createTsConfig(){await this.setInProgress({message:"Creating tsconfig.json."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"tsconfig.json.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"tsconfig.json");W.writeFileSync(n,o,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,".gitignore.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,".gitignore");W.writeFileSync(n,o,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,".gitignore.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,".gitignore");W.writeFileSync(n,o,"utf8")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,n={content:U.dump(i)},s=this.#t.templateDir,a=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=G.resolve(r,`${e}`);W.writeFileSync(c,a,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,n={content:o},s=this.#t.templateDir,a=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=G.resolve(r,`${e}`);W.writeFileSync(c,a,"utf8")}async createProjectReadme(){const e="readme.md",t=`Creating ${e}`;if(await this.setInProgress({message:t}),this.#t.project?.readme){const t={content:this.#t.project.readme.doc.content},o=this.#t.templateDir,i=z.compile(W.readFileSync(G.resolve(o,`${e}.njk`),"utf8"),this.#n).render(t),n=this.#t.projectDir,s=G.resolve(n,`${e}`);W.writeFileSync(s,i,"utf8")}else if(this.#o.id){const t=await se.first({type:"wiki",parent_id:this.#o.id});if(!t||"markdown"!==t.doc?.["content-type"])return;const{content:o,...i}=t.doc,n={content:o},s=this.#t.templateDir,a=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=G.resolve(r,`${e}`);W.writeFileSync(c,a,"utf8")}}async createToYargs(){await this.setInProgress({message:"Creating yargs."});const e={},t=this.#o.doc.inputs||[],o=[];t.forEach((t=>{if(!1===t.cli||!t.name)return;t.import&&o.push(t);const i={};t.type&&(i.type=t.type),t.default&&(i.default=t.default),t.choices&&(i.choices=t.choices),(t.describe||t.description)&&(i.describe=t.describe||t.description),t.alias&&(i.alias=t.alias),!0===t.required&&(i.required=!0),!0===t.hidden&&(i.hidden=!0),!0===t.array&&(i.array=!0),!0===t.normalize&&(i.normalize=!0),t.nargs&&(i.nargs=t.nargs),e[t.name]=i}));const i={options:e,imports:o,atom:this.#o},n=this.#t.templateDir,s=z.compile(W.readFileSync(G.resolve(n,"src/default/to.yargs.js.njk"),"utf8"),this.#n).render(i),a=this.#t.projectDir,r=G.resolve(a,"src/default/to.yargs.js");W.writeFileSync(r,s,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=Y.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=Y.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=Y.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=Y.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build workflow project.")}async runPrettifier(){const e=this.#t.projectDir,t=Y.exec("prettier --write .",{cwd:G.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 se.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 se.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 i=o[e];await this.deployProjectTarget({deploymentProject:t,deploymentProjectTarget:i})}}async deployProjectTarget(e){const{deploymentProjectTarget:t,deploymentProject:o}=e;if(!0===t.enabled)if(t.name===this.#m.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#m.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#m.env.ATOM_DEPLOY_NPM_TARGET)await this.deployAsNpm(e);else if("pm"===t.name)await this.deployAsPm(e);else if("gitlab"===t.name)await this.deployAsGitlab(e);else if("webos"===t.name)await this.deployAsWebos(e);else if("electron"===t.name)await this.deployAsElectron(e);else if("macos-app"===t.name)await this.deployAsMacOSApp(e);else if("ios-app"===t.name)await this.deployAsIOSApp(e);else{let e;if("nextjs"===t.name&&(e=ue),!e)return;await e({atom:this.#o,target:t,onProgress:this.setInProgress.bind(this),projectDir:this.#t.projectDir,dependencies:this.#s}),t.build={id:this.#l,ts:Date.now()},o.isDirty=!0}}async deployAsWorkflowLib(e){await this.setInProgress({message:"Deploying it as workflow lib."});const{deploymentProject:t,deploymentProjectTarget:o}=e;let i,n,s,a=o.deploy.name.split("/");if(1===a.length)n=this.#m.env.ATOM_LIBRARIES_ID,s=o.deploy.name;else{if(2!==a.length)throw new Error("Wrong name path.");{const e=await se.first({where:{name:a[0],parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");n=e.id,s=a[1]}}if(!0===o.dryRun)return;if(t.isDirty=!0,o.build={id:this.#l,ts:Date.now()},o.deploy.id){if(i=await se.get({id:o.deploy.id}),!i)return}else{if(i=await se.create({parent_id:n,doc:{name:s,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!i)return;o.deploy.id=i.id}const r=this.#t.projectDir;i.doc.contents=[{content:W.readFileSync(G.resolve(r,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:W.readFileSync(G.resolve(r,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:W.readFileSync(G.resolve(r,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],i.doc.name=s,i.doc.dependencies=this.#s,i.doc.subtype="workflow",i=await se.update(i,{id:i.id})}async deployAsRedFlow(e){await this.setInProgress({message:"Deploying it as node-red flow."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=this.#t.templateDir,s=this.#o;let a;if("simple"===o.deploy.template)a={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:Z.util.generateId(),...o.deploy.params?.inject,payload:"json"===o.deploy.params?.inject?.payloadType?`'${JSON.stringify(o.deploy.params?.inject?.payload)}'`:o.deploy.params?.inject?.payload},debug:{id:Z.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?H(o.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),a={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:Z.util.generateId(),schedules:e},debug:{id:Z.util.generateId()}}}}else{if("http"!==o.deploy.template)return;a={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:Z.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:Z.util.generateId()},debug:{id:Z.util.generateId()}}}}let r=z.compile(W.readFileSync(G.resolve(n,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#n).render(a);if(W.writeFileSync(G.resolve(i,"node-red.yaml"),r),r=U.load(r),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#l,ts:Date.now()};const c=o.deploy.url||this.#f.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#r),o.deploy.id)!0===o.actions?.delete?(await X({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await X({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:r,headers:l});else{const e=await X({method:"POST",url:`${c}/flow`,data:r,headers:l});o.deploy.id=e.data.id}}async deployAsNpm(e){await this.setInProgress({message:"Deploying it as npm package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=G.resolve(i,"package.json"),s=W.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=Q.inc(o.deploy.params.version,"patch");const r=o.deploy.params.bin?.name||o.deploy.params.bin;if(!1!==o.deploy.params.bin?.enabled&&r&&"string"==typeof r&&(a.bin={[r]:"bin/index.js",[this.#o.doc.name]:"bin/index.js"}),delete a.scripts,delete a.devDependencies,a.scripts={serve:"npx serve ."},W.writeFileSync(n,JSON.stringify(a,null,"\t")),W.writeFileSync(G.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#h.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==Y.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");W.writeFileSync(n,s),t.isDirty=!0,o.deploy.params.version=a.version,o.build={id:this.#l,ts:Date.now()}}async deployAsPm(e){await this.setInProgress({message:"Deploying it as pm package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=G.resolve(i,"package.json"),s=W.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=Q.inc(o.deploy.params.version,"patch"),delete a.scripts,delete a.devDependencies,W.writeFileSync(n,JSON.stringify(a,null,"\t"));const{file:r,data:c}=await de({name:o.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";if(l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${G.resolve(G.dirname(r),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${i}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${a.name}/${a.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(l+=" --dryRun"),await ae({command:l}),W.writeFileSync(n,s),!0!==o.dryRun){if(!0===o.deploy.form?.enabled)if(o.deploy.form.id){const e=await se.get({id:o.deploy.form.id});if(!e)throw new Error("Couldnt find form.");e.doc.name=o.deploy.params.name,e.doc.workflow={id:this.#o.id},e.doc.versions.splice(0,0,{v:a.version}),await se.update(e,{id:e.id})}else{const e=await se.create({parent_id:this.#m.env.ATOM_FORMS_ID,doc:{name:o.deploy.params.name,type:"workflow.form",workflow:{id:this.#o.id},versions:[{v:a.version}]}});o.deploy.form.id=e.id}t.isDirty=!0,o.deploy.params.version=a.version,o.build={id:this.#l,ts:Date.now()},await this.registerToPackageManager({target:o,packageJSON:a})}}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir;let n="fnet-to-gitlab";const s=o.deploy.params.config||"gitlab",a=de({name:s,dir:this.#t.projectDir});if(!a)throw new Error(`Couldnt load config ${s}`);const{data:r}=a.data;n+=` --projectGroupId=${r.projectGroupId}`,n+=` --projectPath='${i}'`,n+=` --projectName='${o.deploy.params.name}'`,n+=` --projectBranch='${o.deploy.params.branch||"main"}'`,n+=` --gitlabHost='${r.gitlabHost}'`,n+=` --gitlabToken='${r.gitlabToken}'`,n+=` --gitlabUsername='${r.gitlabUsername}'`,n+=` --gitlabUserEmail='${r.gitlabUserEmail}'`,!0!==o.dryRun&&(await ae({command:n}),t.isDirty=!0,o.build={id:this.#l,ts:Date.now()})}async deployAsWebos(e){await this.setInProgress({message:"Deploying it as webos package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,a={id:s.id,ver:n,title:s.title,vendor:s.vendor,src:i,srcBundleName:this.#o.doc.bundleName,dest:i,destName:"webos",atom:this.#o,atomTarget:o},r=await me(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsElectron(e){await this.setInProgress({message:"Deploying it as electron package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,a={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"electron"),atom:this.#o,atomTarget:o},r=await he(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsMacOSApp(e){await this.setInProgress({message:"Deploying it as macos app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,a={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"macos-app"),atom:this.#o,atomTarget:o},r=await fe(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsIOSApp(e){await this.setInProgress({message:"Deploying it as ios app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,a={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await ye(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsIOSApp(e){await this.setInProgress({message:"Deploying it as ios app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,a={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await ye(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await se.first({name:t.deploy.params.name,parent_id:this.#m.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await se.update(i,{id:i.id})):i=await se.create({parent_id:this.#m.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.#b&&!this.#u)return await this.createNetwork();try{const e=this.#b?await le({root:this.#c}):void 0;this.#u&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#b&&W.writeFileSync(G.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#c}),await this.createEngine({root:this.#c}),await this.createNodeTree({root:this.#c}),await this.createRollup(),await this.createBin(),await this.createPackageJSON(),await this.createTsConfig(),await this.createGitIgnore(),await this.createProjectYaml(),await this.createProjectMainYaml(),await this.createProjectReadme(),await this.createToYargs(),await this.createIndexHtml(),await this.createAutoRun(),this.#w&&(await this.runBuildScripts(),this.#g&&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 le({root:this.#c});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 ge=c,be=l;var xe=function({baseDir:e=__dirname}){let t=e;for(;t!==be.parse(t).root;){const e=be.join(t,"node_modules");if(ge.existsSync(e))return e;t=be.dirname(t)}return null};const ke=process.cwd();console.log(`cwd: ${ke}`),e({name:["redis"],dir:ke});const je=t,ve=o,{hideBin:De}=i,_e=n,Te=s,Pe=a,Se=r,Ie=we,Ee=xe({baseDir:__dirname});async function Ae(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:je.resolve(ke,`./.output/${e.id}`),templateDir:je.resolve(Ee,"./@flownet/template-node-workflow/default"),coreDir:je.resolve(Ee,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=je.resolve(ke,"flow.yaml");if(!_e.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=_e.readFileSync(t,"utf8"),i=Te.parse(o),n=je.dirname(t),s=je.resolve(n,"flow.main.yaml");if(!_e.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const a=_e.readFileSync(s,"utf8"),r=Te.parse(a),c={workflowAtom:{doc:{...i,"content-type":"yaml",content:a}},projectDir:n,projectFilePath:t,projectFileContent:o,projectFileParsed:i,projectMainFilePath:s,projectMainFileContent:a,projectMainFileParsed:r},l=je.resolve(n,"flow.devops.yaml");if(_e.existsSync(l)){const e=_e.readFileSync(l,"utf8"),t=Te.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{_e.writeFileSync(c.devops.filePath,Te.stringify(c.devops.doc))}}}const d=je.resolve(n,"flow.readme.md");if(_e.existsSync(d)){const e=_e.readFileSync(d,"utf8");c.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:je.resolve(Ee,"./@flownet/template-node-workflow/default"),coreDir:je.resolve(Ee,"./@flownet/template-node-workflow/core"),projectDir:je.resolve(t.projectDir,"./target"),projectSrcDir:je.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Ee}/.bin:${process.env.PATH}`,ve(De(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=je.resolve(Ee,"./@flownet/template-node-workflow/project"),o=je.resolve(ke,e.name);_e.existsSync(o)||_e.mkdirSync(o),await Se({dir:t,outDir:o,context:e});let i=Pe.exec("fnet build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(Pe.which("git")&&(i=Pe.exec("git init",{cwd:o}),0!==i.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.log("Initialization failed!",e),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 Ae(e),o=new Ie(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.log("Building workflow failed!",e),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`node ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm run serve ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm run watch ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),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"),i=require("yargs/helpers"),n=require("fs"),s=require("yaml"),r=require("shelljs"),a=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),d=require("js-yaml"),p=require("nunjucks"),m=require("lodash.clonedeep"),h=require("isobject"),f=require("axios"),y=require("@node-red/util"),u=require("semver"),w=require("redis"),g=require("@flownet/lib-is-redis-online"),b=require("node:os"),x=require("lodash.merge"),k=require("nanoid"),j=require("@flownet/lib-atom-api-js"),v=require("qs"),D=require("@flownet/lib-execute-command-with-ipc-file"),_=require("@flownet/lib-parse-node-url"),T=require("@flownet/lib-list-npm-versions"),P=require("@flownet/lib-bpmn-from-flow"),S=require("@flownet/lib-parse-imports-js"),I=require("@flownet/lib-to-webos"),E=require("@flownet/lib-to-electron"),A=require("@flownet/lib-to-macos-app"),C=require("@flownet/lib-to-ios-app"),N=require("@flownet/lib-to-nextjs");const F=w,$=g;const{Api:O}=j,B=f.default,R=v;const M=N,q=m,J=x,L=u,K=l;const W=c,G=l,U=d,Y=r,z=p,H=m,V=h,X=f,Z=y,Q=u,ee=async()=>{if(!await $({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},te=b,oe=x,{nanoid:ie}=k,ne=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(O.set_api_url(e.data.url),t)return O.set_req_token(t),void o(t);B({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=>{O.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{O.set_req_token(),i(e)}))}))}},{Atom:se}=j,re=D,ae=_,ce=T,le=P,de=e,pe=S,me=I,he=E,fe=A,ye=C,ue=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:n})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=J({name:"nextjs-app",version:"0.1.0"},t.params);const s=L.inc(t.params.version,"patch");t.params.version=s;const r=q(t);r.params.dependencies=q(n);const a={atom:e,target:r.params,projectDir:i,renderDir:K.resolve(i,"nextjs")};return{deployer:await M(a)}};var we=class{#e;#t;#o;#i;#n;#s;#r;#a;#c;#l;#d;#p;#m;#h;#f;#y;#u;#w;#g;#b;constructor(e){this.#e=new ne,this.#t=e,this.#s=[],this.#r={},this._expire_ttl=3600,this._expire_ttl_short=300}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 ee(),this.#l=this.#t.buildId||ie(24),this.#y=this.#t.mode,this.#u=["all","deploy","build","file"].includes(this.#y),this.#w=["all","deploy","build"].includes(this.#y),this.#g=["all","deploy"].includes(this.#y),this.#b=["all","deploy","build","file","bpmn"].includes(this.#y),this.#p=this.#t.protocol,this.#d="BUILD:"+this.#l,this.#m=await(de({name:"atom",dir:this.#t.projectDir})?.data),this.#h=await(de({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#f=await(de({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await this.initFeatures(),await this.initDependencies();const e=await this.initNodeTree({workflow:this.#i});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.#s}),await this.resolveNodeTree({root:e}),this.#c=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#a=await this.#e.init({config:this.#m}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await se.get({id:e}),this.#i="string"==typeof this.#o.doc.content?U.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"}async initFeatures(){this.#o.doc.features=this.#o.doc.features||{};const e=this.#o.doc.features;e.print_steps=e.print_steps||e.print?.steps||!1,e.form_enabled=!0===this.#o.doc.form||!0===this.#o.doc.form?.enabled||!0===e.form||!0===e.form?.enabled,e.browser_autorun=!0===e.browser?.autorun;const t={cjs:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0},cjsx:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0},esm:{format:"esm",context:e.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0},esmx:{format:"esm",browser:!0,babel:!0,context:e.form_enabled?"window":"global",replace:!0,browsersync:!0},iife:{format:"iife",context:e.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0}};!0===e.webos&&(t.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,babel_options:{targets:{chrome:"79"}}}),e.babel_options=e.babel_options||e.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},e.browsersync_options=oe({server:".",startPath:"/",files:["./app/**/*","./dist/**/*"]},e.browsersync_options||e.browsersync?.options||{}),e.replace_options=oe({},e.replace_options||e.replace?.options||{}),e.terser_options=oe({},e.terser_options||e.terser?.options||{}),e.css_options=oe({},e.css_options||e.css?.options||{}),e.wasm_options=oe({},e.wasm_options||e.wasm?.options||{}),e.copy_options=oe({},e.copy_options||e.copy?.options||{}),e.json_options=oe({},e.json_options||e.json?.options||{}),e.rollup_output=oe(t,e.rollup_output||e.rollup?.output||e.rollup||{});const o=Object.keys(t);for(const i of o){const o=t[i];o&&(o.babel_options=o.babel_options||e.babel_options,o.browsersync_options=oe(e.browsersync_options,o.browsersync_options),o.replace_options=oe(e.replace_options,o.replace_options),o.terser_options=oe(e.terser_options,o.terser_options),o.css_options=oe(e.css_options,o.css_options),o.wasm_options=oe(e.wasm_options,o.wasm_options),o.copy_options=oe(e.copy_options,o.copy_options),o.json_options=oe(e.json_options,o.json_options),e.form_enabled&&(o.babel=!0))}e.babel_enabled=o.some((t=>!0===e.rollup_output[t].babel)),e.browser_enabled=o.some((t=>!0===e.rollup_output[t].babel)),e.browsersync_enabled=o.some((t=>!0===e.rollup_output[t].browsersync)),e.browsersync_enabled=e.browsersync_enabled&&(e.form_enabled||!0===e.browser_autorun),e.multiple_enabled=e.multiple_enabled||!0===e.multiple||!0===e.multiple?.enabled,e.wasm_enabled=!0===e.wasm||e.wasm&&!1!==e.wasm?.enabled,e.css_enabled=!0===e.css||e.css&&!1!==e.css?.enabled,e.json_enabled=!0===e.json||e.json&&!1!==e.json?.enabled,e.terser_enabled=!0===e.terser||e.terser&&!1!==e.terser?.enabled,e.copy_enabled=e.copy_enabled||e.copy&&!1!==e.copy?.enabled,e.bin_name=e.bin_name||e.bin?.name||e.bin,e.bin_enabled=e.bin_name&&("string"==typeof e.bin_name)(e.bin_enabled||!1!==e.bin?.enabled),e.dependency_auto_enabled=!1!==e.dependency_auto&&!1!==e.dependency_auto?.enabled,e.npm_install_flags=e.npm_install_flags||"",e.index_html_enabled=!(!0===this.#o.doc.features.multiple_enabled||!0!==this.#o.doc.features.form_enabled),e.bin_file_enabled=!(!0===this.#o.doc.features.multiple_enabled||!0===this.#o.doc.features.form_enabled)}async initDependencies(){this.#s.push({package:"eventemitter3",version:"^4.0"}),this.#s.push({package:"get-value",version:"^3.0"}),this.#s.push({package:"set-value",version:"^4.1"}),this.#o.doc.features.form_enabled?(this.#s.push({package:"react",version:"^18.2"}),this.#s.push({package:"react-dom",version:"^18.2"}),this.#s.push({package:"@flownet/react-app",version:"^0.1"}),this.#s.push({package:"@flownet/react-app-state",version:"^0.1"})):this.#s.push({package:"yargs",version:"^17"}),this.#s.push({package:"chalk",version:"^4"})}async initWorkflowDir(){const e=this.#t.projectDir,t=this.#t.coreDir;let o;const i=["node_modules"];if(W.existsSync(e)&&W.readdirSync(e).forEach((t=>{i.includes(t)||(o=Y.rm("-rf",G.join(e,t)))})),o=Y.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=Y.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=Y.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=Y.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=Y.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.#n=z.configure(e,{watch:!1,dev:!0})}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 i={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(i)}));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],i={name:`${t}`,childs:[],parent:e,definition:o,index:e.childs.length,context:{}};e.childs.push(i),o.hasOwnProperty("steps")?await this.initNode({node:i}):(i.depth=e.depth+1,i.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],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}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],i={name:t,childs:[],parent:e,definition:o[t],index:e.childs.length,context:{}};e.childs.push(i),await this.initNode({node:i})}}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],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}async initBlockTypeForm({node:e}){e.type="form";for(let t=0;t<e.definition.modules?.length;t++){const o=e.definition.modules[t],i=Object.keys(o)[0],n={name:i,childs:[],parent:e,definition:o[i],module:!0,blockAutoJumpToParent:!0,index:e.childs.length,context:{}};e.childs.push(n),await this.initNode({node:n})}}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,i=typeof o[t];if("string"!==i&&"object"!==i)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/shell",o.args="string"===i?{cmd:o[t]}:o[t],delete o[t],await this.initBlockTypeCall({node:e})}async initBlockTypeConfig({node:e}){const t="config",o=e.definition,i=typeof o[t];if("string"!==i&&"object"!==i)throw new Error(`Unsupported ${t} usage`);o.call="npm:@fnet/config",o.args="string"===i?{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=G.join(e.parent.indexKey,e.name);e.indexKey=o,t[o]=e;const i=[];let n=e;for(;n?.parent;)i.push(n.index),n=n.parent;i.reverse(),e.codeKey=`B_${i.join("_")}_${e.type}`,e.pathKey=`${i.join(".")}`,e.typeId=ie(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 i=t[e];"call"===i.type&&o.push(i)}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,i=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},n=t.find((e=>e.name===i.name&&e.type===i.type));n||t.push(i),e.target=n||i}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,i=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return i||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 i=t[e];"form"===i.type&&o.push(i)}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,i=await this.findNodeCallTarget({refNode:e,curNode:e.parent})||{name:o,type:"atom"},n=t.find((e=>e.name===i.name&&e.type===i.type));n||t.push(i),e.target=n||i}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,i=t.childs.find((e=>e.name===o&&"subworkflow"===e.type));return i||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 i=o[e],n=await this.findAtomLibrary({url:i.name});i.atom=n;const s=n.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));s?.forEach((e=>{const o=t.find((t=>t.package===e.package));o?"string"==typeof e.path?(o.path||[]).some((t=>t===e.path))||(o.path=o.path||[],o.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(o.path||[]).some((t=>t===e))||(o.path=o.path||[],o.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const t=ae({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 se.first({where:{name:e,parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await se.first({where:{name:o[0],parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"folder"}});return await se.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=G.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],i=await pe({file:e});for await(const e of i.required){if("npm"!==e.type)continue;const t=(await ce({name:e.package,groupBy:{minor:!0}}))[0][0];o.find((t=>t.package===e.package))||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 ce({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 i=o.childs.find((e=>e.name===t.next));if(i){e.context.next=i;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 i=t.childs.find((e=>e.index===o));if(i){e.context.next=i;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=H(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 i=Object.keys(o)[0];t.params[e]={key:i,hasDefault:!0,default:o[i]}}}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=H(e.definition);const t=e.context.transform;for(let e=0;e<t.assign?.length;e++){let o=t.assign[e],i=Object.keys(o)[0],n=o[i],s=this.transformValue(i),r=this.transformValue(n),a={key:JSON.stringify(s),value:JSON.stringify(r)};a.key=this.replaceExpression(a.key),a.value=this.replaceExpression(a.value),t.assign[e]=a}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||H(e.definition);const t=e.context.transform;t.return=this.transformExpression(t.return),this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.args&&(t.args=this.transformExpression(t.args)),t.result&&(t.result=this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.props&&(t.props=this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.raise=this.transformExpression(t.raise),this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||H(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||H(t.definition),t.context.transform.condition=this.replaceExpression(JSON.stringify(this.transformValue(t.definition.condition)));this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||H(e.definition);const t=e.context.transform;t.next=this.transformExpression(t.next),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||H(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||H(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||H(e.definition);e.context.transform.for.in=this.transformExpression(e.definition.for.in),this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||H(e.definition),this.resolveTypeCommon({node:e})}resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=this.transformValue(t.operation)),t.hasOwnProperty("page")&&(t.page=this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=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,i=this.#t.projectDir;if("local:"===o.protocol){const e=G.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=G.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!W.existsSync(e)){W.mkdirSync(G.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",W.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=`${i}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;W.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#n).render({...e,ui:{package:"@flownet/react-app"}}),i=this.#t.projectDir,n=G.resolve(i,"src/default/index.js");W.writeFileSync(n,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=z.compile(W.readFileSync(G.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,`src/default/${e.codeKey}.js`);W.writeFileSync(n,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=z.compile(W.readFileSync(G.resolve(o,`src/default/blocks/${e.type}.js.njk`),"utf8"),this.#n),this.#r[e.type]=t,t}createStepFile({node:e}){const t=this.#t.projectDir,o=`${e.codeKey}.js`,i=G.resolve(t,`src/default/blocks/${o}`);W.writeFileSync(i,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=i}transformExpression(e){let t=this.transformValue(e);return t=JSON.stringify(t),t=this.replaceExpression(t),t}transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=this.transformValue(e[t]);else if(V(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=this.transformValue(e[t[o]])}return e}replaceExpression(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createRollup(){await this.setInProgress({message:"Creating rollup file."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"rollup.config.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"rollup.config.js");W.writeFileSync(n,o,"utf8")}async createPackageJSON(){await this.setInProgress({message:"Creating package.json."});const e=this.#s.find((e=>"react"===e.package)),t=this.#s.find((e=>"react-dom"===e.package));e&&!t?this.#s.push({package:"react-dom",version:e.version}):e&&t&&(t.version=e.version),e&&(this.#s.find((e=>"@emotion/react"===e.package))||this.#s.push({package:"@emotion/react",version:"^11"}),this.#s.find((e=>"@emotion/styled"===e.package))||this.#s.push({package:"@emotion/styled",version:"^11"}));const o={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},i=this.#t.templateDir,n=z.compile(W.readFileSync(G.resolve(i,"package.json.njk"),"utf8"),this.#n).render(o),s=this.#t.projectDir,r=G.resolve(s,"package.json");W.writeFileSync(r,n,"utf8")}async createBin(){if(!0!==this.#o.doc.features.bin_file_enabled)return;await this.setInProgress({message:"Creating bin file."});const e=this.#t.projectDir;if(0!==Y.exec(`mkdir ${e}/bin`).code)throw new Error("Couldnt create library/bin dir.");const t={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},o=this.#t.templateDir;let i=z.compile(W.readFileSync(G.resolve(o,"bin/index.js.njk"),"utf8"),this.#n).render(t),n=G.resolve(e,"bin/index.js");W.writeFileSync(n,i,"utf8")}async createIndexHtml(){if(!this.#o.doc.features.index_html_enabled)return;await this.setInProgress({message:"Creating index.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s,ts:Date.now()},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"index.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"index.html");W.writeFileSync(n,o,"utf8")}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.#s,ts:Date.now()},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"autorun.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"autorun.html");W.writeFileSync(n,o,"utf8")}async createTsConfig(){await this.setInProgress({message:"Creating tsconfig.json."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,"tsconfig.json.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,"tsconfig.json");W.writeFileSync(n,o,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,".gitignore.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,".gitignore");W.writeFileSync(n,o,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s},t=this.#t.templateDir,o=z.compile(W.readFileSync(G.resolve(t,".gitignore.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=G.resolve(i,".gitignore");W.writeFileSync(n,o,"utf8")}async createProjectYaml(){const e="flow.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,n={content:U.dump(i)},s=this.#t.templateDir,r=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),a=this.#t.projectDir,c=G.resolve(a,`${e}`);W.writeFileSync(c,r,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,n={content:o},s=this.#t.templateDir,r=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),a=this.#t.projectDir,c=G.resolve(a,`${e}`);W.writeFileSync(c,r,"utf8")}async createProjectReadme(){const e="readme.md",t=`Creating ${e}`;if(await this.setInProgress({message:t}),this.#t.project?.readme){const t={content:this.#t.project.readme.doc.content},o=this.#t.templateDir,i=z.compile(W.readFileSync(G.resolve(o,`${e}.njk`),"utf8"),this.#n).render(t),n=this.#t.projectDir,s=G.resolve(n,`${e}`);W.writeFileSync(s,i,"utf8")}else if(this.#o.id){const t=await se.first({type:"wiki",parent_id:this.#o.id});if(!t||"markdown"!==t.doc?.["content-type"])return;const{content:o,...i}=t.doc,n={content:o},s=this.#t.templateDir,r=z.compile(W.readFileSync(G.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),a=this.#t.projectDir,c=G.resolve(a,`${e}`);W.writeFileSync(c,r,"utf8")}}async createToYargs(){await this.setInProgress({message:"Creating yargs."});const e={},t=this.#o.doc.inputs||[],o=[];t.forEach((t=>{if(!1===t.cli||!t.name)return;t.import&&o.push(t);const i={};t.type&&(i.type=t.type),t.default&&(i.default=t.default),t.choices&&(i.choices=t.choices),(t.describe||t.description)&&(i.describe=t.describe||t.description),t.alias&&(i.alias=t.alias),!0===t.required&&(i.required=!0),!0===t.hidden&&(i.hidden=!0),!0===t.array&&(i.array=!0),!0===t.normalize&&(i.normalize=!0),t.nargs&&(i.nargs=t.nargs),e[t.name]=i}));const i={options:e,imports:o,atom:this.#o},n=this.#t.templateDir,s=z.compile(W.readFileSync(G.resolve(n,"src/default/to.yargs.js.njk"),"utf8"),this.#n).render(i),r=this.#t.projectDir,a=G.resolve(r,"src/default/to.yargs.js");W.writeFileSync(a,s,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=Y.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=Y.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=Y.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=Y.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build workflow project.")}async runPrettifier(){const e=this.#t.projectDir,t=Y.exec("prettier --write .",{cwd:G.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 se.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 se.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 i=o[e];await this.deployProjectTarget({deploymentProject:t,deploymentProjectTarget:i})}}async deployProjectTarget(e){const{deploymentProjectTarget:t,deploymentProject:o}=e;if(!0===t.enabled)if(t.name===this.#m.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#m.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#m.env.ATOM_DEPLOY_NPM_TARGET)await this.deployAsNpm(e);else if("pm"===t.name)await this.deployAsPm(e);else if("gitlab"===t.name)await this.deployAsGitlab(e);else if("webos"===t.name)await this.deployAsWebos(e);else if("electron"===t.name)await this.deployAsElectron(e);else if("macos-app"===t.name)await this.deployAsMacOSApp(e);else if("ios-app"===t.name)await this.deployAsIOSApp(e);else{let e;if("nextjs"===t.name&&(e=ue),!e)return;await e({atom:this.#o,target:t,onProgress:this.setInProgress.bind(this),projectDir:this.#t.projectDir,dependencies:this.#s}),t.build={id:this.#l,ts:Date.now()},o.isDirty=!0}}async deployAsWorkflowLib(e){await this.setInProgress({message:"Deploying it as workflow lib."});const{deploymentProject:t,deploymentProjectTarget:o}=e;let i,n,s,r=o.deploy.name.split("/");if(1===r.length)n=this.#m.env.ATOM_LIBRARIES_ID,s=o.deploy.name;else{if(2!==r.length)throw new Error("Wrong name path.");{const e=await se.first({where:{name:r[0],parent_id:this.#m.env.ATOM_LIBRARIES_ID,type:"folder"},limit:1});if(!e)throw new Error("Couldnt file lib folder.");n=e.id,s=r[1]}}if(!0===o.dryRun)return;if(t.isDirty=!0,o.build={id:this.#l,ts:Date.now()},o.deploy.id){if(i=await se.get({id:o.deploy.id}),!i)return}else{if(i=await se.create({parent_id:n,doc:{name:s,type:"workflow.lib","content-type":"javascript",dependencies:[],content:void 0,subtype:"workflow"}}),!i)return;o.deploy.id=i.id}const a=this.#t.projectDir;i.doc.contents=[{content:W.readFileSync(G.resolve(a,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:W.readFileSync(G.resolve(a,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:W.readFileSync(G.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],i.doc.name=s,i.doc.dependencies=this.#s,i.doc.subtype="workflow",i=await se.update(i,{id:i.id})}async deployAsRedFlow(e){await this.setInProgress({message:"Deploying it as node-red flow."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=this.#t.templateDir,s=this.#o;let r;if("simple"===o.deploy.template)r={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:Z.util.generateId(),...o.deploy.params?.inject,payload:"json"===o.deploy.params?.inject?.payloadType?`'${JSON.stringify(o.deploy.params?.inject?.payload)}'`:o.deploy.params?.inject?.payload},debug:{id:Z.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?H(o.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),r={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:Z.util.generateId(),schedules:e},debug:{id:Z.util.generateId()}}}}else{if("http"!==o.deploy.template)return;r={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Z.util.generateId(),label:`WF/${s.id?s.id:te.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Z.util.generateId(),name:s.doc.name,initialize:{content:W.readFileSync(G.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:Z.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:Z.util.generateId()},debug:{id:Z.util.generateId()}}}}let a=z.compile(W.readFileSync(G.resolve(n,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#n).render(r);if(W.writeFileSync(G.resolve(i,"node-red.yaml"),a),a=U.load(a),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#l,ts:Date.now()};const c=o.deploy.url||this.#f.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#a),o.deploy.id)!0===o.actions?.delete?(await X({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await X({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:a,headers:l});else{const e=await X({method:"POST",url:`${c}/flow`,data:a,headers:l});o.deploy.id=e.data.id}}async deployAsNpm(e){await this.setInProgress({message:"Deploying it as npm package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=G.resolve(i,"package.json"),s=W.readFileSync(n),r=JSON.parse(s);r.name=o.deploy.params.name,r.version=Q.inc(o.deploy.params.version,"patch");const a=o.deploy.params.bin?.name||o.deploy.params.bin;if(!1!==o.deploy.params.bin?.enabled&&a&&"string"==typeof a&&(r.bin={[a]:"bin/index.js",[this.#o.doc.name]:"bin/index.js"}),delete r.scripts,delete r.devDependencies,r.scripts={serve:"npx serve ."},W.writeFileSync(n,JSON.stringify(r,null,"\t")),W.writeFileSync(G.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#h.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==Y.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");W.writeFileSync(n,s),t.isDirty=!0,o.deploy.params.version=r.version,o.build={id:this.#l,ts:Date.now()}}async deployAsPm(e){await this.setInProgress({message:"Deploying it as pm package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=G.resolve(i,"package.json"),s=W.readFileSync(n),r=JSON.parse(s);r.name=o.deploy.params.name,r.version=Q.inc(o.deploy.params.version,"patch"),delete r.scripts,delete r.devDependencies,W.writeFileSync(n,JSON.stringify(r,null,"\t"));const{file:a,data:c}=await de({name:o.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";if(l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${G.resolve(G.dirname(a),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${i}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${r.name}/${r.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(l+=" --dryRun"),await re({command:l}),W.writeFileSync(n,s),!0!==o.dryRun){if(!0===o.deploy.form?.enabled)if(o.deploy.form.id){const e=await se.get({id:o.deploy.form.id});if(!e)throw new Error("Couldnt find form.");e.doc.name=o.deploy.params.name,e.doc.workflow={id:this.#o.id},e.doc.versions.splice(0,0,{v:r.version}),await se.update(e,{id:e.id})}else{const e=await se.create({parent_id:this.#m.env.ATOM_FORMS_ID,doc:{name:o.deploy.params.name,type:"workflow.form",workflow:{id:this.#o.id},versions:[{v:r.version}]}});o.deploy.form.id=e.id}t.isDirty=!0,o.deploy.params.version=r.version,o.build={id:this.#l,ts:Date.now()},await this.registerToPackageManager({target:o,packageJSON:r})}}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir;let n="fnet-to-gitlab";const s=o.deploy.params.config||"gitlab",r=de({name:s,dir:this.#t.projectDir});if(!r)throw new Error(`Couldnt load config ${s}`);const{data:a}=r.data;n+=` --projectGroupId=${a.projectGroupId}`,n+=` --projectPath='${i}'`,n+=` --projectName='${o.deploy.params.name}'`,n+=` --projectBranch='${o.deploy.params.branch||"main"}'`,n+=` --gitlabHost='${a.gitlabHost}'`,n+=` --gitlabToken='${a.gitlabToken}'`,n+=` --gitlabUsername='${a.gitlabUsername}'`,n+=` --gitlabUserEmail='${a.gitlabUserEmail}'`,!0!==o.dryRun&&(await re({command:n}),t.isDirty=!0,o.build={id:this.#l,ts:Date.now()})}async deployAsWebos(e){await this.setInProgress({message:"Deploying it as webos package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,r={id:s.id,ver:n,title:s.title,vendor:s.vendor,src:i,srcBundleName:this.#o.doc.bundleName,dest:i,destName:"webos",atom:this.#o,atomTarget:o},a=await me(r);console.log(a),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsElectron(e){await this.setInProgress({message:"Deploying it as electron package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,r={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"electron"),atom:this.#o,atomTarget:o},a=await he(r);console.log(a),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsMacOSApp(e){await this.setInProgress({message:"Deploying it as macos app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,r={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"macos-app"),atom:this.#o,atomTarget:o},a=await fe(r);console.log(a),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsIOSApp(e){await this.setInProgress({message:"Deploying it as ios app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,r={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},a=await ye(r);console.log(a),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async deployAsIOSApp(e){await this.setInProgress({message:"Deploying it as ios app package."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir,n=Q.inc(o.deploy.params.version,"patch");if(!0===o.dryRun)return;const s=o.deploy.params,r={id:s.id,ver:n,title:s.title,vendor:s.vendor,projectDir:i,projectBundleName:this.#o.doc.bundleName,renderDir:G.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},a=await ye(r);console.log(a),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#l,ts:Date.now()}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await se.first({name:t.deploy.params.name,parent_id:this.#m.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await se.update(i,{id:i.id})):i=await se.create({parent_id:this.#m.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.#b&&!this.#u)return await this.createNetwork();try{const e=this.#b?await le({root:this.#c}):void 0;this.#u&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#b&&W.writeFileSync(G.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#c}),await this.createEngine({root:this.#c}),await this.createNodeTree({root:this.#c}),await this.createRollup(),await this.createBin(),await this.createPackageJSON(),await this.createTsConfig(),await this.createGitIgnore(),await this.createProjectYaml(),await this.createProjectMainYaml(),await this.createProjectReadme(),await this.createToYargs(),await this.createIndexHtml(),await this.createAutoRun(),this.#w&&(await this.runBuildScripts(),this.#g&&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 le({root:this.#c});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 ge=c,be=l;var xe=function({baseDir:e=__dirname}){let t=e;for(;t!==be.parse(t).root;){const e=be.join(t,"node_modules");if(ge.existsSync(e))return e;t=be.dirname(t)}return null};const ke=process.cwd();console.log(`cwd: ${ke}`),e({name:["redis"],dir:ke});const je=t,ve=o,{hideBin:De}=i,_e=n,Te=s,Pe=r,Se=a,Ie=we,Ee=xe({baseDir:__dirname});async function Ae(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:je.resolve(ke,`./.output/${e.id}`),templateDir:je.resolve(Ee,"./@flownet/template-node-workflow/default"),coreDir:je.resolve(Ee,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=je.resolve(ke,"flow.yaml");if(!_e.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=_e.readFileSync(t,"utf8"),i=Te.parse(o),n=je.dirname(t),s=je.resolve(n,"flow.main.yaml");if(!_e.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const r=_e.readFileSync(s,"utf8"),a=Te.parse(r),c={workflowAtom:{doc:{...i,"content-type":"yaml",content:r}},projectDir:n,projectFilePath:t,projectFileContent:o,projectFileParsed:i,projectMainFilePath:s,projectMainFileContent:r,projectMainFileParsed:a},l=je.resolve(n,"flow.devops.yaml");if(_e.existsSync(l)){const e=_e.readFileSync(l,"utf8"),t=Te.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{_e.writeFileSync(c.devops.filePath,Te.stringify(c.devops.doc))}}}const d=je.resolve(n,"flow.readme.md");if(_e.existsSync(d)){const e=_e.readFileSync(d,"utf8");c.readme={filePath:d,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:je.resolve(Ee,"./@flownet/template-node-workflow/default"),coreDir:je.resolve(Ee,"./@flownet/template-node-workflow/core"),projectDir:je.resolve(t.projectDir,"./target"),projectSrcDir:je.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Ee}/.bin:${process.env.PATH}`,ve(De(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=je.resolve(Ee,"./@flownet/template-node-workflow/project"),o=je.resolve(ke,e.name);_e.existsSync(o)||_e.mkdirSync(o),await Se({dir:t,outDir:o,context:e});let i=Pe.exec("fnet build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(Pe.which("git")&&(i=Pe.exec("git init",{cwd:o}),0!==i.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.log("Initialization failed!",e),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 Ae(e),o=new Ie(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.log("Building workflow failed!",e),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`node ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm run serve ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ae(e),{projectDir:o}=t,i=e.commands||[],n=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm run watch ${i.join(" ")} ${n}`;Pe.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e),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.5.
|
|
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.5.8",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.7","@flownet/lib-bpmn-from-flow":"^0.1.6","@flownet/lib-execute-command-with-ipc-file":"^0.1.10","@flownet/lib-is-redis-online":"^0.1.12","@flownet/lib-list-npm-versions":"^0.1.27","@flownet/lib-load-fnet-config":"^0.1.25","@flownet/lib-parse-imports-js":"^0.1.34","@flownet/lib-parse-node-url":"^0.1.15","@flownet/lib-pick-npm-versions":"^0.1.5","@flownet/lib-render-templates-dir":"^0.1.11","@flownet/lib-to-electron":"^0.1.19","@flownet/lib-to-gitlab":"^0.1.20","@flownet/lib-to-ios-app":"^0.1.20","@flownet/lib-to-macos-app":"^0.1.11","@flownet/lib-to-nextjs":"^0.1.10","@flownet/lib-to-webos":"^0.1.9","@flownet/lib-upload-files-to-gcs":"^0.1.11","@flownet/template-node-library":"^0.4.20","@flownet/template-node-workflow":"^0.5.14","@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();console.log(`cwd: ${v}`),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={};
|