@fnet/cli 0.8.1 → 0.8.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/builder/lib-cli.js +1 -1
- package/dist/builder/wf-cli.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +4 -3
package/dist/builder/lib-cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),i=require("yargs/helpers"),a=require("fs"),s=require("yaml"),n=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),u=require("axios"),g=require("@node-red/util"),y=require("semver"),h=require("redis"),f=require("@flownet/lib-is-redis-online"),b=require("node:os"),w=require("nanoid"),j=require("@flownet/lib-atom-api-js"),_=require("qs"),v=require("lodash.merge"),k=require("@flownet/lib-list-npm-versions"),x=require("@flownet/lib-parse-imports-js"),D=require("@flownet/lib-execute-command-with-ipc-file"),P=require("@flownet/lib-parse-node-url"),I=require("@flownet/lib-pick-npm-versions"),S=require("@flownet/lib-to-nextjs");const $=h,E=f;const{Api:C}=j,A=u.default,F=_;const T=v;const q=k;const O=c,R=l,L=r;const N=d,M=c,B=l,K=x,G=k;const J=c,U=l,z=r;const Y=c,H=l,W=d;const X=c,Z=l,Q=d;const V=c,ee=l,te=d;const oe=c,ie=l,ae=d;const se=S,ne=m,re=v,ce=y,le=l;const pe=c,de=l,me=p,ue=n,ge=d,ye=m,he=u,fe=g,be=y,we=async()=>{if(!await E({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=$.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},je=b,{nanoid:_e}=w,ve=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(C.set_api_url(e.data.url),t)return C.set_req_token(t),void o(t);A({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:F.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{C.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{C.set_req_token(),i(e)}))}))}},ke=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!0}},i={};!0===t.webos&&(o.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=T({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=T({},t.replace_options||t.replace?.options||{}),t.terser_options=T({},t.terser_options||t.terser?.options||{}),t.css_options=T({},t.css_options||t.css?.options||{}),t.wasm_options=T({},t.wasm_options||t.wasm?.options||{}),t.copy_options=T(i,t.copy_options||t.copy?.options||{}),t.json_options=T({},t.json_options||t.json?.options||{}),t.image_options=T({},t.image_options||t.image?.options||{}),t.rollup_output=T(o,t.rollup_output||t.rollup?.output||t.rollup||{});const a=Object.keys(o);for(const e of a){const i=o[e];i&&(i.babel_options=i.babel_options||t.babel_options,i.browsersync_options=T(t.browsersync_options,i.browsersync_options),i.replace_options=T(t.replace_options,i.replace_options),i.terser_options=T(t.terser_options,i.terser_options),i.css_options=T(t.css_options,i.css_options),i.wasm_options=T(t.wasm_options,i.wasm_options),i.copy_options=T(t.copy_options,i.copy_options),i.json_options=T(t.json_options,i.json_options),i.image_options=T(t.image_options,i.image_options),t.form_enabled&&(i.babel=!0))}t.babel_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=a.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.form_enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},xe=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await q({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(e.doc.features.bin_file_enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},De=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const a={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i,ts:Date.now()},s=o.templateDir,n=R.resolve(o.projectDir,"src/app");O.existsSync(n)||O.mkdirSync(n,{recursive:!0}),await L({pattern:["index.html.njk","index.js.njk"],dir:R.resolve(s,"src/app"),outDir:n,context:a})},Pe=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:i,setInProgress:a,njEnv:s})=>{await a({message:"Creating package.json."});const n=o.find((e=>"react"===e.package)),r=o.find((e=>"react-dom"===e.package));n&&!r?o.push({package:"react-dom",version:n.version}):n&&r&&(r.version=n.version),n&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.index_html_enabled&&c.push(B.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&c.push(B.resolve(t.projectDir,"src/cli/index.js"));for await(const t of c){const a=t;if(!M.existsSync(a))throw new Error(`App file not found: ${a}`);const s=await K({file:a,recursive:!0}),n=!0===e.doc.features.all_parsed_imports?s.all:s.required;for await(const e of n){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const t=(await G({name:e.package,groupBy:{minor:!0}}))[0][0];i.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const l={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,packageDevDependencies:i},p=t.templateDir,d=N.compile(M.readFileSync(B.resolve(p,"package.json.njk"),"utf8"),s).render(l),m=t.projectDir,u=B.resolve(m,"package.json");M.writeFileSync(u,d,"utf8")},Ie=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const a={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},s=o.templateDir,n=U.resolve(o.projectDir,"src/cli");J.existsSync(n)||J.mkdirSync(n,{recursive:!0}),await z({pattern:["index.js.njk"],dir:U.resolve(s,"src/cli"),outDir:n,context:a})},Se=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating rollup file."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateDir,r=W.compile(Y.readFileSync(H.resolve(n,"rollup.config.js.njk"),"utf8"),a).render(s),c=o.projectDir,l=H.resolve(c,"rollup.config.js");Y.writeFileSync(l,r,"utf8")},$e=async({atom:e,setInProgress:t,context:o,njEnv:i})=>{if(!0===e.doc.features.form_enabled)return;await t({message:"Creating yargs."});const a={},s=e.doc.inputs||[],n=[];s.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&n.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),a[e.name]=t}));const r={options:a,imports:n,atom:e},c=o.templateDir,l=Q.compile(X.readFileSync(Z.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),i).render(r),p=o.projectDir,d=Z.resolve(p,"src/default/to.yargs.js");X.writeFileSync(d,l,"utf8")},Ee=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating .gitignore"});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateDir,r=te.compile(V.readFileSync(ee.resolve(n,".gitignore.njk"),"utf8"),a).render(s),c=o.projectDir,l=ee.resolve(c,".gitignore");V.writeFileSync(l,r,"utf8")},Ce=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating tsconfig.json."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateDir,r=ae.compile(oe.readFileSync(ie.resolve(n,"tsconfig.json.njk"),"utf8"),a).render(s),c=o.projectDir,l=ie.resolve(c,"tsconfig.json");oe.writeFileSync(l,r,"utf8")},{Atom:Ae}=j,Fe=D,Te=P,qe=e,Oe=x,Re=I,Le=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:a})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=re({name:"nextjs-app",version:"0.1.0"},t.params);const s=ce.inc(t.params.version,"patch");t.params.version=s;const n=ne(t);n.params.dependencies=ne(a);const r={atom:e,target:n.params,projectDir:i,renderDir:le.resolve(i,"nextjs")};return{deployer:await se(r)}};var Ne=class{#e;#t;#o;#i;#a;#s;#n;#r;#c;#l;#p;#d;#m;#u;#g;#y;#h;#f;#b;constructor(e){this.#e=new ve,this.#t=e,this.#s=[],this.#n=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#b={packageDependencies:this.#s,packageDevDependencies:this.#n,setInProgress:this.setInProgress.bind(this),context:this.#t}}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 we(),this.#c=this.#t.buildId||_e(24),this.#g=this.#t.mode,this.#y=["all","deploy","build","file"].includes(this.#g),this.#h=["all","deploy","build"].includes(this.#g),this.#f=["all","deploy"].includes(this.#g),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(qe({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data),this.#m=await(qe({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#u=await(qe({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await ke(this.#b),await xe(this.#b),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#d}))}async initLibrary(){const e=this.#t.id;this.#o=this.#t.project?.libraryAtom||await Ae.get({id:e});let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow.lib",this.#b.atom=this.#o}async initLibraryDir(){const e=this.#t.projectDir;let t;const o=["node_modules"];if(pe.existsSync(e)&&pe.readdirSync(e).forEach((i=>{o.includes(i)||(t=ue.rm("-rf",de.join(e,i)))})),t=ue.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=ue.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=ue.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=ue.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#i=ge.configure(e,{watch:!1,dev:!0}),this.#b.njEnv=this.#i}async initLibs(){const e=[{name:this.#o.doc.name,type:"atom",parent_id:this.#o.parent_id}];this.#a=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#s})}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],a=await this.findAtomLibrary({url:i.name});i.atom=a;const s=a.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=Te({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 Ae.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await Ae.first({where:{name:o[0],parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"folder"}});return await Ae.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#o;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=de.resolve(this.#t.projectSrcDir,"index.js"),o=await Oe({file:t,recursive:!0}),i=e.doc.dependencies,a=!0===this.#o.doc.features.all_parsed_imports?o.all:o.required;for await(const e of a){if("npm"!==e.type)continue;if(i.find((t=>t.package===e.package)))continue;const t=await Re({name:e.package,count:1});i.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,i=this.#t.projectDir;if("local:"===o.protocol){const e=de.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=de.relative(`${this.#t.projectDir}/src/default/`,e);if(!pe.existsSync(e)){pe.mkdirSync(de.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",pe.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir="./types/target/src"}else{const e=`${i}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;pe.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#a.filter((e=>"atom"===e.type)),libraryAtom:this.#o,atom:this.#o},t=this.#t.templateDir,o=ge.compile(pe.readFileSync(de.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render(e),i=this.#t.projectDir,a=de.resolve(i,"src/default/index.js");pe.writeFileSync(a,o,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,a={content:me.dump(i)},s=this.#t.templateDir,n=ge.compile(pe.readFileSync(de.resolve(s,`${e}.njk`),"utf8"),this.#i).render(a),r=this.#t.projectDir,c=de.resolve(r,`${e}`);pe.writeFileSync(c,n,"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=ge.compile(pe.readFileSync(de.resolve(o,`${e}.njk`),"utf8"),this.#i).render(t),a=this.#t.projectDir,s=de.resolve(a,`${e}`);pe.writeFileSync(s,i,"utf8")}else if(this.#o.id){const t=await Ae.first({type:"wiki",parent_id:this.#o.id});if(!t||"markdown"!==t.doc?.["content-type"])return;const{content:o,...i}=t.doc,a={content:o},s=this.#t.templateDir,n=ge.compile(pe.readFileSync(de.resolve(s,`${e}.njk`),"utf8"),this.#i).render(a),r=this.#t.projectDir,c=de.resolve(r,`${e}`);pe.writeFileSync(c,n,"utf8")}}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=ue.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=ue.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=ue.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=ue.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build library project.")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&await o.save()}}else if(this.#o.id){const e=await Ae.list({type:"library.deploy",parent_id:this.#o.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await Ae.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.#d.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#d.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#d.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{let e;if("nextjs"===t.name&&(e=Le),!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.#c,ts:Date.now()},o.isDirty=!0}}async deployAsWorkflowLib(e){if(await this.setInProgress({message:"Deploying it as workflow lib."}),!0===o.dryRun)return;const{deploymentProject:t,deploymentProjectTarget:o}=e;let i;if(o.deploy.id){if(i=await Ae.get({id:o.deploy.id}),!i)return}else{if(i=await Ae.create({parent_id:this.#d.env.ATOM_LIBRARIES_ID,doc:{name:o.deploy.name,type:"workflow.lib",dependencies:[],content:void 0,subtype:"library"}}),!i)return;o.deploy.id=i.id,t.isDirty=!0}const a=this.#t.projectDir;i.doc.contents=[{content:pe.readFileSync(de.resolve(a,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:pe.readFileSync(de.resolve(a,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:pe.readFileSync(de.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],i.doc.name=o.deploy.name,i.doc.dependencies=this.#s,i.doc.subtype="workflow",i=await Ae.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,a=this.#t.templateDir,s=this.#o;let n;if("simple"===o.deploy.template)n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||fe.util.generateId(),label:`LIB/${s.id?s.id:je.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:fe.util.generateId(),name:s.doc.name,initialize:{content:pe.readFileSync(de.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:fe.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:fe.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?ye(o.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||fe.util.generateId(),label:`LIB/${s.id?s.id:je.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:fe.util.generateId(),name:s.doc.name,initialize:{content:pe.readFileSync(de.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:fe.util.generateId(),schedules:e},debug:{id:fe.util.generateId()}}}}else{if("http"!==o.deploy.template)return;n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||fe.util.generateId(),label:`LIB/${s.id?s.id:je.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:fe.util.generateId(),name:s.doc.name,initialize:{content:pe.readFileSync(de.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:fe.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:fe.util.generateId()},debug:{id:fe.util.generateId()}}}}let r=ge.compile(pe.readFileSync(de.resolve(a,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#i).render(n);if(pe.writeFileSync(de.resolve(i,"node-red.yaml"),r),r=me.load(r),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#c,ts:Date.now()};const c=o.deploy.url||this.#u.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#r),o.deploy.id)!0===o.actions?.delete?(await he({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await he({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:r,headers:l});else{const e=await he({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,a=de.resolve(i,"package.json"),s=pe.readFileSync(a),n=JSON.parse(s);n.name=o.deploy.params.name,n.version=be.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&&(n.bin={[r]:"dist/cli/cjs/index.js",[this.#o.doc.name]:"dist/cli/cjs/index.js"}),delete n.scripts,delete n.devDependencies,n.scripts={serve:"npx serve ."},pe.writeFileSync(a,JSON.stringify(n,null,"\t")),pe.writeFileSync(de.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#m.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==ue.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");pe.writeFileSync(a,s),t.isDirty=!0,o.deploy.params.version=n.version,o.build={id:this.#c,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,a=de.resolve(i,"package.json"),s=pe.readFileSync(a),n=JSON.parse(s);n.name=o.deploy.params.name,n.version=be.inc(o.deploy.params.version,"patch"),delete n.scripts,delete n.devDependencies,pe.writeFileSync(a,JSON.stringify(n,null,"\t"));const{file:r,data:c}=await qe({name:o.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${de.resolve(de.dirname(r),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${i}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${n.name}/${n.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(l+=" --dryRun"),await Fe({command:l}),pe.writeFileSync(a,s),!0!==o.dryRun&&(t.isDirty=!0,o.deploy.params.version=n.version,o.build={id:this.#c,ts:Date.now()},await this.registerToPackageManager({target:o,packageJSON:n}))}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir;let a="fnet-to-gitlab";const s=o.deploy.params.config||"gitlab",n=qe({name:s,dir:this.#t.projectDir});if(!n)throw new Error(`Couldnt load config ${s}`);const{data:r}=n.data;a+=` --projectGroupId=${r.projectGroupId}`,a+=` --projectPath='${i}'`,a+=` --projectName='${o.deploy.params.name}'`,a+=` --projectBranch='${o.deploy.params.branch||"main"}'`,a+=` --gitlabHost='${r.gitlabHost}'`,a+=` --gitlabToken='${r.gitlabToken}'`,a+=` --gitlabUsername='${r.gitlabUsername}'`,a+=` --gitlabUserEmail='${r.gitlabUserEmail}'`,!0!==o.dryRun&&(await Fe({command:a}),t.isDirty=!0,o.build={id:this.#c,ts:Date.now()})}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await Ae.first({name:t.deploy.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await Ae.update(i,{id:i.id})):i=await Ae.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#y&&(await this.createAtomLibFiles({libs:this.#a}),await this.createEngine(),await this.createProjectYaml(),await this.createProjectReadme(),await Ce(this.#b),await Ee(this.#b),await $e(this.#b),await Ie(this.#b),await De(this.#b),await Se(this.#b),await Pe(this.#b),this.#h&&(await this.runBuildScripts(),this.#f&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const Me=c,Be=l;var Ke=function({baseDir:e=__dirname}){let t=e;for(;t!==Be.parse(t).root;){const e=Be.join(t,"node_modules");if(Me.existsSync(e))return e;t=Be.dirname(t)}return null};const Ge=process.cwd();console.log(`cwd: ${Ge}`),e({name:["redis"],dir:Ge});const Je=t,Ue=o,{hideBin:ze}=i,Ye=a,He=s,We=n,Xe=r,Ze=Ne,Qe=Ke({baseDir:__dirname});async function Ve(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:Je.resolve(Qe,"./@flownet/template-node-library/default"),projectDir:Je.resolve(Ge,`./.output/${e.id}`),coreDir:Je.resolve(Qe,"./@flownet/template-node-library/core")};{const t=await async function(){const e=Je.resolve(Ge,"node.yaml");if(!Ye.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Ye.readFileSync(e,"utf8"),o=He.parse(t),i=Je.dirname(e),a={libraryAtom:{doc:{...o,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:i,projectFilePath:e,projectFileContent:t,projectFileParsed:o},s=Je.resolve(i,"node.devops.yaml");if(Ye.existsSync(s)){const e=Ye.readFileSync(s,"utf8"),t=He.parse(e);a.devops={filePath:s,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Ye.writeFileSync(a.devops.filePath,He.stringify(a.devops.doc))}}}const n=Je.resolve(i,"node.readme.md");if(Ye.existsSync(n)){const e=Ye.readFileSync(n,"utf8");a.readme={filePath:n,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:Je.resolve(Qe,"./@flownet/template-node-library/default"),coreDir:Je.resolve(Qe,"./@flownet/template-node-library/core"),projectDir:Je.resolve(t.projectDir,"./target"),projectSrcDir:Je.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${Qe}/.bin:${process.env.PATH}`,Ue(ze(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=Je.resolve(Qe,"@flownet/template-node-library/project"),o=Je.resolve(Ge,e.name);Ye.existsSync(o)||Ye.mkdirSync(o),await Xe({dir:t,outDir:o,context:e});let i=We.exec("fnode build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(We.which("git")&&(i=We.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.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await Ve(e),o=new Ze(t);await o.init(),await o.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ve(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;We.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ve(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;We.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ve(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;We.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await Ve(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;We.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
|
2
|
+
"use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),i=require("yargs/helpers"),a=require("fs"),s=require("yaml"),n=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),u=require("axios"),g=require("@node-red/util"),y=require("semver"),f=require("redis"),h=require("@flownet/lib-is-redis-online"),b=require("node:os"),w=require("nanoid"),_=require("@flownet/lib-atom-api-js"),j=require("qs"),v=require("lodash.merge"),k=require("@flownet/lib-list-npm-versions"),D=require("@flownet/lib-parse-imports-js"),x=require("@flownet/lib-execute-command-with-ipc-file"),P=require("@flownet/lib-parse-node-url"),I=require("@flownet/lib-pick-npm-versions"),S=require("@flownet/lib-to-nextjs");const C=f,$=h;const{Api:A}=_,E=u.default,F=j;const T=v;const q=k;const O=c,R=l,L=r;const N=d,M=c,B=l,K=D,G=k;const J=c,U=l,z=r;const Y=c,H=l,W=d;const X=c,Z=l,Q=d;const V=c,ee=l,te=d;const oe=c,ie=l,ae=d;const se=d,ne=c,re=l;const ce=S,le=m,pe=v,de=y,me=l;const ue=c,ge=l,ye=p,fe=n,he=d,be=m,we=u,_e=g,je=y,ve=async()=>{if(!await $({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=C.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},ke=b,{nanoid:De}=w,xe=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(A.set_api_url(e.data.url),t)return A.set_req_token(t),void o(t);E({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:F.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{A.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{A.set_req_token(),i(e)}))}))}},Pe=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!0}},i={};!0===t.webos&&(o.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=T({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=T({},t.replace_options||t.replace?.options||{}),t.terser_options=T({},t.terser_options||t.terser?.options||{}),t.css_options=T({},t.css_options||t.css?.options||{}),t.wasm_options=T({},t.wasm_options||t.wasm?.options||{}),t.copy_options=T(i,t.copy_options||t.copy?.options||{}),t.json_options=T({},t.json_options||t.json?.options||{}),t.image_options=T({},t.image_options||t.image?.options||{}),t.rollup_output=T(o,t.rollup_output||t.rollup?.output||t.rollup||{});const a=Object.keys(o);for(const e of a){const i=o[e];i&&(i.babel_options=i.babel_options||t.babel_options,i.browsersync_options=T(t.browsersync_options,i.browsersync_options),i.replace_options=T(t.replace_options,i.replace_options),i.terser_options=T(t.terser_options,i.terser_options),i.css_options=T(t.css_options,i.css_options),i.wasm_options=T(t.wasm_options,i.wasm_options),i.copy_options=T(t.copy_options,i.copy_options),i.json_options=T(t.json_options,i.json_options),i.image_options=T(t.image_options,i.image_options),t.form_enabled&&(i.babel=!0))}t.babel_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=a.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=a.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.form_enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},Ie=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await q({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(e.doc.features.bin_file_enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},Se=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const a={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i,ts:Date.now()},s=o.templateDir,n=R.resolve(o.projectDir,"src/app");O.existsSync(n)||O.mkdirSync(n,{recursive:!0}),await L({pattern:["index.html.njk","index.js.njk"],dir:R.resolve(s,"src/app"),outDir:n,context:a})},Ce=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:i,setInProgress:a,njEnv:s})=>{await a({message:"Creating package.json."});const n=o.find((e=>"react"===e.package)),r=o.find((e=>"react-dom"===e.package));n&&!r?o.push({package:"react-dom",version:n.version}):n&&r&&(r.version=n.version),n&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.index_html_enabled&&c.push(B.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&c.push(B.resolve(t.projectDir,"src/cli/index.js"));for await(const t of c){const a=t;if(!M.existsSync(a))throw new Error(`App file not found: ${a}`);const s=await K({file:a,recursive:!0}),n=!0===e.doc.features.all_parsed_imports?s.all:s.required;for await(const e of n){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const t=(await G({name:e.package,groupBy:{minor:!0}}))[0][0];i.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const l={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,packageDevDependencies:i},p=t.templateCommonDir,d=N.compile(M.readFileSync(B.resolve(p,"package.json.njk"),"utf8"),s).render(l),m=t.projectDir,u=B.resolve(m,"package.json");M.writeFileSync(u,d,"utf8")},$e=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const a={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},s=o.templateDir,n=U.resolve(o.projectDir,"src/cli");J.existsSync(n)||J.mkdirSync(n,{recursive:!0}),await z({pattern:["index.js.njk"],dir:U.resolve(s,"src/cli"),outDir:n,context:a})},Ae=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating rollup file."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateCommonDir,r=W.compile(Y.readFileSync(H.resolve(n,"rollup.config.js.njk"),"utf8"),a).render(s),c=o.projectDir,l=H.resolve(c,"rollup.config.js");Y.writeFileSync(l,r,"utf8")},Ee=async({atom:e,setInProgress:t,context:o,njEnv:i})=>{if(!0===e.doc.features.form_enabled)return;await t({message:"Creating yargs."});const a={},s=e.doc.inputs||[],n=[];s.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&n.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),a[e.name]=t}));const r={options:a,imports:n,atom:e},c=o.templateDir,l=Q.compile(X.readFileSync(Z.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),i).render(r),p=o.projectDir,d=Z.resolve(p,"src/default/to.yargs.js");X.writeFileSync(d,l,"utf8")},Fe=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating .gitignore"});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateCommonDir,r=te.compile(V.readFileSync(ee.resolve(n,".gitignore.njk"),"utf8"),a).render(s),c=o.projectDir,l=ee.resolve(c,".gitignore");V.writeFileSync(l,r,"utf8")},Te=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:a})=>{await t({message:"Creating tsconfig.json."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},n=o.templateCommonDir,r=ae.compile(oe.readFileSync(ie.resolve(n,"tsconfig.json.njk"),"utf8"),a).render(s),c=o.projectDir,l=ie.resolve(c,"tsconfig.json");oe.writeFileSync(l,r,"utf8")},qe=async({atom:e,context:t,setInProgress:o,njEnv:i,Atom:a})=>{const s="readme.md",n=`Creating ${s}`;if(await o({message:n}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,a=se.compile(ne.readFileSync(re.resolve(o,`${s}.njk`),"utf8"),i).render(e),n=t.projectDir,r=re.resolve(n,`${s}`);ne.writeFileSync(r,a,"utf8")}else if(e.id){const o=await a.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:n,...r}=o.doc,c={content:n},l=t.templateCommonDir,p=se.compile(ne.readFileSync(re.resolve(l,`${s}.njk`),"utf8"),i).render(c),d=t.projectDir,m=re.resolve(d,`${s}`);ne.writeFileSync(m,p,"utf8")}},{Atom:Oe}=_,Re=x,Le=P,Ne=e,Me=D,Be=I,Ke=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:a})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=pe({name:"nextjs-app",version:"0.1.0"},t.params);const s=de.inc(t.params.version,"patch");t.params.version=s;const n=le(t);n.params.dependencies=le(a);const r={atom:e,target:n.params,projectDir:i,renderDir:me.resolve(i,"nextjs")};return{deployer:await ce(r)}};var Ge=class{#e;#t;#o;#i;#a;#s;#n;#r;#c;#l;#p;#d;#m;#u;#g;#y;#f;#h;#b;constructor(e){this.#e=new xe,this.#t=e,this.#s=[],this.#n=[],this._expire_ttl=3600,this._expire_ttl_short=300,this.#b={packageDependencies:this.#s,packageDevDependencies:this.#n,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:Oe}}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 ve(),this.#c=this.#t.buildId||De(24),this.#g=this.#t.mode,this.#y=["all","deploy","build","file"].includes(this.#g),this.#f=["all","deploy","build"].includes(this.#g),this.#h=["all","deploy"].includes(this.#g),this.#p=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#d=await(Ne({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data),this.#m=await(Ne({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#u=await(Ne({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await Pe(this.#b),await Ie(this.#b),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#d}))}async initLibrary(){const e=this.#t.id;this.#o=this.#t.project?.libraryAtom||await Oe.get({id:e});let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow.lib",this.#b.atom=this.#o}async initLibraryDir(){const e=this.#t.projectDir;let t;const o=["node_modules"];if(ue.existsSync(e)&&ue.readdirSync(e).forEach((i=>{o.includes(i)||(t=fe.rm("-rf",ge.join(e,i)))})),t=fe.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=fe.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=fe.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=fe.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#i=he.configure(e,{watch:!1,dev:!0}),this.#b.njEnv=this.#i}async initLibs(){const e=[{name:this.#o.doc.name,type:"atom",parent_id:this.#o.parent_id}];this.#a=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#s})}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],a=await this.findAtomLibrary({url:i.name});i.atom=a;const s=a.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=Le({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 Oe.first({where:{name:e,parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await Oe.first({where:{name:o[0],parent_id:this.#d.env.ATOM_LIBRARIES_ID,type:"folder"}});return await Oe.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#o;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=ge.resolve(this.#t.projectSrcDir,"index.js"),o=await Me({file:t,recursive:!0}),i=e.doc.dependencies,a=!0===this.#o.doc.features.all_parsed_imports?o.all:o.required;for await(const e of a){if("npm"!==e.type)continue;if(i.find((t=>t.package===e.package)))continue;const t=await Be({name:e.package,count:1});i.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,i=this.#t.projectDir;if("local:"===o.protocol){const e=ge.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=ge.relative(`${this.#t.projectDir}/src/default/`,e);if(!ue.existsSync(e)){ue.mkdirSync(ge.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",ue.writeFileSync(e,t,"utf8")}o.relativePath=t,this.#o.typesDir="./types/target/src"}else{const e=`${i}/src/libs/${o.id}.js`,t=o.doc.contents?.find((e=>"esm"===e.format))||o.doc;ue.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#a.filter((e=>"atom"===e.type)),libraryAtom:this.#o,atom:this.#o},t=this.#t.templateDir,o=he.compile(ue.readFileSync(ge.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#i).render(e),i=this.#t.projectDir,a=ge.resolve(i,"src/default/index.js");ue.writeFileSync(a,o,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:o,...i}=this.#o.doc,a={content:ye.dump(i)},s=this.#t.templateDir,n=he.compile(ue.readFileSync(ge.resolve(s,`${e}.njk`),"utf8"),this.#i).render(a),r=this.#t.projectDir,c=ge.resolve(r,`${e}`);ue.writeFileSync(c,n,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=fe.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=fe.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=fe.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=fe.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build library project.")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&await o.save()}}else if(this.#o.id){const e=await Oe.list({type:"library.deploy",parent_id:this.#o.id});for(let t=0;t<e.length;t++){let o=e[t];await this.deployProject({deploymentProject:o}),!0===o.isDirty&&(o=await Oe.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.#d.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#d.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#d.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{let e;if("nextjs"===t.name&&(e=Ke),!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.#c,ts:Date.now()},o.isDirty=!0}}async deployAsWorkflowLib(e){if(await this.setInProgress({message:"Deploying it as workflow lib."}),!0===o.dryRun)return;const{deploymentProject:t,deploymentProjectTarget:o}=e;let i;if(o.deploy.id){if(i=await Oe.get({id:o.deploy.id}),!i)return}else{if(i=await Oe.create({parent_id:this.#d.env.ATOM_LIBRARIES_ID,doc:{name:o.deploy.name,type:"workflow.lib",dependencies:[],content:void 0,subtype:"library"}}),!i)return;o.deploy.id=i.id,t.isDirty=!0}const a=this.#t.projectDir;i.doc.contents=[{content:ue.readFileSync(ge.resolve(a,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:ue.readFileSync(ge.resolve(a,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:ue.readFileSync(ge.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],i.doc.name=o.deploy.name,i.doc.dependencies=this.#s,i.doc.subtype="workflow",i=await Oe.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,a=this.#t.templateDir,s=this.#o;let n;if("simple"===o.deploy.template)n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||_e.util.generateId(),label:`LIB/${s.id?s.id:ke.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(ge.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:_e.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:_e.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?be(o.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||_e.util.generateId(),label:`LIB/${s.id?s.id:ke.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(ge.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:_e.util.generateId(),schedules:e},debug:{id:_e.util.generateId()}}}}else{if("http"!==o.deploy.template)return;n={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||_e.util.generateId(),label:`LIB/${s.id?s.id:ke.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(ge.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:_e.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:_e.util.generateId()},debug:{id:_e.util.generateId()}}}}let r=he.compile(ue.readFileSync(ge.resolve(a,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#i).render(n);if(ue.writeFileSync(ge.resolve(i,"node-red.yaml"),r),r=ye.load(r),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#c,ts:Date.now()};const c=o.deploy.url||this.#u.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#r),o.deploy.id)!0===o.actions?.delete?(await we({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await we({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:r,headers:l});else{const e=await we({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,a=ge.resolve(i,"package.json"),s=ue.readFileSync(a),n=JSON.parse(s);n.name=o.deploy.params.name,n.version=je.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&&(n.bin={[r]:"dist/cli/cjs/index.js",[this.#o.doc.name]:"dist/cli/cjs/index.js"}),delete n.scripts,delete n.devDependencies,n.scripts={serve:"npx serve ."},ue.writeFileSync(a,JSON.stringify(n,null,"\t")),ue.writeFileSync(ge.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#m.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==fe.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");ue.writeFileSync(a,s),t.isDirty=!0,o.deploy.params.version=n.version,o.build={id:this.#c,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,a=ge.resolve(i,"package.json"),s=ue.readFileSync(a),n=JSON.parse(s);n.name=o.deploy.params.name,n.version=je.inc(o.deploy.params.version,"patch"),delete n.scripts,delete n.devDependencies,ue.writeFileSync(a,JSON.stringify(n,null,"\t"));const{file:r,data:c}=await Ne({name:o.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${ge.resolve(ge.dirname(r),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${i}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${n.name}/${n.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===o.dryRun&&(l+=" --dryRun"),await Re({command:l}),ue.writeFileSync(a,s),!0!==o.dryRun&&(t.isDirty=!0,o.deploy.params.version=n.version,o.build={id:this.#c,ts:Date.now()},await this.registerToPackageManager({target:o,packageJSON:n}))}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:o}=e,i=this.#t.projectDir;let a="fnet-to-gitlab";const s=o.deploy.params.config||"gitlab",n=Ne({name:s,dir:this.#t.projectDir});if(!n)throw new Error(`Couldnt load config ${s}`);const{data:r}=n.data;a+=` --projectGroupId=${r.projectGroupId}`,a+=` --projectPath='${i}'`,a+=` --projectName='${o.deploy.params.name}'`,a+=` --projectBranch='${o.deploy.params.branch||"main"}'`,a+=` --gitlabHost='${r.gitlabHost}'`,a+=` --gitlabToken='${r.gitlabToken}'`,a+=` --gitlabUsername='${r.gitlabUsername}'`,a+=` --gitlabUserEmail='${r.gitlabUserEmail}'`,!0!==o.dryRun&&(await Re({command:a}),t.isDirty=!0,o.build={id:this.#c,ts:Date.now()})}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await Oe.first({name:t.deploy.params.name,parent_id:this.#d.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await Oe.update(i,{id:i.id})):i=await Oe.create({parent_id:this.#d.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#y&&(await this.createAtomLibFiles({libs:this.#a}),await this.createEngine(),await this.createProjectYaml(),await qe(this.#b),await Te(this.#b),await Fe(this.#b),await Ee(this.#b),await $e(this.#b),await Se(this.#b),await Ae(this.#b),await Ce(this.#b),this.#f&&(await this.runBuildScripts(),this.#h&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const Je=c,Ue=l;var ze=function({baseDir:e=__dirname}){let t=e;for(;t!==Ue.parse(t).root;){const e=Ue.join(t,"node_modules");if(Je.existsSync(e))return e;t=Ue.dirname(t)}return null};const Ye=process.cwd();console.log(`cwd: ${Ye}`),e({name:["redis"],dir:Ye});const He=t,We=o,{hideBin:Xe}=i,Ze=a,Qe=s,Ve=n,et=r,tt=Ge,ot=ze({baseDir:__dirname});async function it(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:He.resolve(ot,"./@flownet/template-node-library/default"),templateCommonDir:He.resolve(ot,"./@flownet/template-node-common/default"),projectDir:He.resolve(Ye,`./.output/${e.id}`),coreDir:He.resolve(ot,"./@flownet/template-node-library/core")};{const t=await async function(){const e=He.resolve(Ye,"node.yaml");if(!Ze.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=Ze.readFileSync(e,"utf8"),o=Qe.parse(t),i=He.dirname(e),a={libraryAtom:{doc:{...o,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:i,projectFilePath:e,projectFileContent:t,projectFileParsed:o},s=He.resolve(i,"node.devops.yaml");if(Ze.existsSync(s)){const e=Ze.readFileSync(s,"utf8"),t=Qe.parse(e);a.devops={filePath:s,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{Ze.writeFileSync(a.devops.filePath,Qe.stringify(a.devops.doc))}}}const n=He.resolve(i,"node.readme.md");if(Ze.existsSync(n)){const e=Ze.readFileSync(n,"utf8");a.readme={filePath:n,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:He.resolve(ot,"./@flownet/template-node-library/default"),templateCommonDir:He.resolve(ot,"./@flownet/template-node-common/default"),coreDir:He.resolve(ot,"./@flownet/template-node-library/core"),projectDir:He.resolve(t.projectDir,"./target"),projectSrcDir:He.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${ot}/.bin:${process.env.PATH}`,We(Xe(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=He.resolve(ot,"@flownet/template-node-library/project"),o=He.resolve(Ye,e.name);Ze.existsSync(o)||Ze.mkdirSync(o),await et({dir:t,outDir:o,context:e});let i=Ve.exec("fnode build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(Ve.which("git")&&(i=Ve.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.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await it(e),o=new tt(t);await o.init(),await o.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.error("Building library failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await it(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;Ve.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await it(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;Ve.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await it(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;Ve.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await it(e),{projectDir:o}=t,i=e.commands||[],a=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(" ")} ${a}`;Ve.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
package/dist/builder/wf-cli.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),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"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),f=require("isobject"),h=require("axios"),y=require("@node-red/util"),u=require("semver"),w=require("redis"),g=require("@flownet/lib-is-redis-online"),b=require("node:os"),k=require("nanoid"),x=require("@flownet/lib-atom-api-js"),v=require("qs"),j=require("lodash.merge"),_=require("@flownet/lib-list-npm-versions"),D=require("@flownet/lib-parse-imports-js"),T=require("@flownet/lib-execute-command-with-ipc-file"),P=require("@flownet/lib-parse-node-url"),S=require("@flownet/lib-bpmn-from-flow"),A=require("@flownet/lib-to-webos"),E=require("@flownet/lib-to-electron"),C=require("@flownet/lib-to-macos-app"),I=require("@flownet/lib-to-ios-app"),$=require("@flownet/lib-to-nextjs"),N=require("@fnet/expression");const F=w,O=g;const{Api:B}=x,R=h.default,M=v;const q=j;const L=_;const J=c,K=l,W=r;const U=d,z=c,G=l,Y=D,H=_;const V=c,X=l,Z=r;const Q=c,ee=l,te=d;const oe=c,ie=l,ne=d;const se=c,ae=l,re=d;const ce=c,le=l,pe=d;const de=$,me=m,fe=j,he=u,ye=l;const ue=c,we=l,ge=p,be=a,ke=d,xe=m,ve=f,je=h,_e=y,De=u,Te=async()=>{if(!await O({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},Pe=b,{nanoid:Se}=k,Ae=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(B.set_api_url(e.data.url),t)return B.set_req_token(t),void o(t);R({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:M.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{B.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{B.set_req_token(),i(e)}))}))}},Ee=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!0}},i={};!0===t.webos&&(o.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=q({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=q({},t.replace_options||t.replace?.options||{}),t.terser_options=q({},t.terser_options||t.terser?.options||{}),t.css_options=q({},t.css_options||t.css?.options||{}),t.wasm_options=q({},t.wasm_options||t.wasm?.options||{}),t.copy_options=q(i,t.copy_options||t.copy?.options||{}),t.json_options=q({},t.json_options||t.json?.options||{}),t.image_options=q({},t.image_options||t.image?.options||{}),t.rollup_output=q(o,t.rollup_output||t.rollup?.output||t.rollup||{});const n=Object.keys(o);for(const e of n){const i=o[e];i&&(i.babel_options=i.babel_options||t.babel_options,i.browsersync_options=q(t.browsersync_options,i.browsersync_options),i.replace_options=q(t.replace_options,i.replace_options),i.terser_options=q(t.terser_options,i.terser_options),i.css_options=q(t.css_options,i.css_options),i.wasm_options=q(t.wasm_options,i.wasm_options),i.copy_options=q(t.copy_options,i.copy_options),i.json_options=q(t.json_options,i.json_options),i.image_options=q(t.image_options,i.image_options),t.form_enabled&&(i.babel=!0))}t.babel_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=n.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.form_enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},Ce=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await L({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(e.doc.features.bin_file_enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},Ie=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const n={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i,ts:Date.now()},s=o.templateDir,a=K.resolve(o.projectDir,"src/app");J.existsSync(a)||J.mkdirSync(a,{recursive:!0}),await W({pattern:["index.html.njk","index.js.njk"],dir:K.resolve(s,"src/app"),outDir:a,context:n})},$e=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:i,setInProgress:n,njEnv:s})=>{await n({message:"Creating package.json."});const a=o.find((e=>"react"===e.package)),r=o.find((e=>"react-dom"===e.package));a&&!r?o.push({package:"react-dom",version:a.version}):a&&r&&(r.version=a.version),a&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.index_html_enabled&&c.push(G.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&c.push(G.resolve(t.projectDir,"src/cli/index.js"));for await(const t of c){const n=t;if(!z.existsSync(n))throw new Error(`App file not found: ${n}`);const s=await Y({file:n,recursive:!0}),a=!0===e.doc.features.all_parsed_imports?s.all:s.required;for await(const e of a){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const t=(await H({name:e.package,groupBy:{minor:!0}}))[0][0];i.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const l={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,packageDevDependencies:i},p=t.templateDir,d=U.compile(z.readFileSync(G.resolve(p,"package.json.njk"),"utf8"),s).render(l),m=t.projectDir,f=G.resolve(m,"package.json");z.writeFileSync(f,d,"utf8")},Ne=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const n={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},s=o.templateDir,a=X.resolve(o.projectDir,"src/cli");V.existsSync(a)||V.mkdirSync(a,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(s,"src/cli"),outDir:a,context:n})},Fe=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating rollup file."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateDir,r=te.compile(Q.readFileSync(ee.resolve(a,"rollup.config.js.njk"),"utf8"),n).render(s),c=o.projectDir,l=ee.resolve(c,"rollup.config.js");Q.writeFileSync(l,r,"utf8")},Oe=async({atom:e,setInProgress:t,context:o,njEnv:i})=>{if(!0===e.doc.features.form_enabled)return;await t({message:"Creating yargs."});const n={},s=e.doc.inputs||[],a=[];s.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&a.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),n[e.name]=t}));const r={options:n,imports:a,atom:e},c=o.templateDir,l=ne.compile(oe.readFileSync(ie.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),i).render(r),p=o.projectDir,d=ie.resolve(p,"src/default/to.yargs.js");oe.writeFileSync(d,l,"utf8")},Be=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating .gitignore"});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateDir,r=re.compile(se.readFileSync(ae.resolve(a,".gitignore.njk"),"utf8"),n).render(s),c=o.projectDir,l=ae.resolve(c,".gitignore");se.writeFileSync(l,r,"utf8")},Re=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating tsconfig.json."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateDir,r=pe.compile(ce.readFileSync(le.resolve(a,"tsconfig.json.njk"),"utf8"),n).render(s),c=o.projectDir,l=le.resolve(c,"tsconfig.json");ce.writeFileSync(l,r,"utf8")},{Atom:Me}=x,qe=T,Le=P,Je=_,Ke=S,We=e,Ue=D,ze=A,Ge=E,Ye=C,He=I,Ve=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:n})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=fe({name:"nextjs-app",version:"0.1.0"},t.params);const s=he.inc(t.params.version,"patch");t.params.version=s;const a=me(t);a.params.dependencies=me(n);const r={atom:e,target:a.params,projectDir:i,renderDir:ye.resolve(i,"nextjs")};return{deployer:await de(r)}},Xe=N;var Ze=class{#e;#t;#o;#i;#n;#s;#a;#r;#c;#l;#p;#d;#m;#f;#h;#y;#u;#w;#g;#b;#k;#x;constructor(e){this.#e=new Ae,this.#t=e,this.#s=[],this.#a=[],this.#r={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#x={packageDependencies:this.#s,packageDevDependencies:this.#a,setInProgress:this.setInProgress.bind(this),context:this.#t}}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 Te(),this.#p=this.#t.buildId||Se(24),this.#u=this.#t.mode,this.#w=["all","deploy","build","file"].includes(this.#u),this.#g=["all","deploy","build"].includes(this.#u),this.#b=["all","deploy"].includes(this.#u),this.#k=["all","deploy","build","file","bpmn"].includes(this.#u),this.#m=this.#t.protocol,this.#d="BUILD:"+this.#p,this.#f=await(We({name:"atom",dir:this.#t.projectDir})?.data),this.#h=await(We({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#y=await(We({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await Ee(this.#x),await Ce(this.#x),await this.transformWorkflow({workflow:this.#i});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.#l=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#c=await this.#e.init({config:this.#f}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await Me.get({id:e}),this.#i="string"==typeof this.#o.doc.content?ge.load(this.#o.doc.content):this.#o.doc.content;let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow",this.#x.atom=this.#o}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(ue.existsSync(e)&&ue.readdirSync(e).forEach((t=>{i.includes(t)||(o=be.rm("-rf",we.join(e,t)))})),o=be.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=be.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=be.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=be.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=be.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=ke.configure(e,{watch:!1,dev:!0}),this.#x.njEnv=this.#n}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],t.steps=t.steps.map((e=>this.transformStep({step:e})))}transformStep({step:e}){if(Array.isArray(e))throw new Error("Step must be an object.");const[t,o]=Object.entries(e)[0];if(o.hasOwnProperty("onerror")){const{onerror:i,...n}=o;e[t]={try:n,except:i}}if(e[t].hasOwnProperty("steps")){const o=e[t].steps;if(!Array.isArray(o))throw new Error("Steps must be an array.");e[t].steps=o.map((e=>this.transformStep({step:e})))}return e}async initNodeTree({workflow:e}){const t=Object.keys(e),o={definition:e,name:void 0,type:"root",parent:void 0,childs:[],blockAutoJumpToParent:!0,blockAutoJumpToSibling:!0,index:0,depth:0,context:{libs:[],atom:this.#o}};t.forEach((t=>{const 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=we.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=Se(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=Le({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#m),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await Me.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await Me.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await Me.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=we.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],i=await Ue({file:e,recursive:!0});for await(const e of i.required){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=(await Je({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:t.protocol}}if("npm:"===t.protocol){const e=(await Je({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=xe(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=xe(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={key:await this.transformExpression(i),value:await this.transformExpression(n)};t.assign[e]=s}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeSteps({node:e}){e.context.next=e.childs[0]}async resolveTypeReturn({node:e}){e.context.transform=e.context.transform||xe(e.definition);const t=e.context.transform;t.return=await this.transformExpression(t.return),await this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||xe(e.definition);const t=e.context.transform;t.args&&(t.args=await this.transformExpression(t.args)),t.result&&(t.result=await this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||xe(e.definition);const t=e.context.transform;t.props&&(t.props=await this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||xe(e.definition);const t=e.context.transform;t.raise=await this.transformExpression(t.raise),await this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||xe(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||xe(t.definition),t.context.transform.condition=await this.transformExpression(t.definition.condition);await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||xe(e.definition);const t=e.context.transform;t.next=await this.transformExpression(t.next),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||xe(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||xe(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||xe(e.definition);e.context.transform.for.in=await this.transformExpression(e.definition.for.in),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||xe(e.definition),await this.resolveTypeCommon({node:e})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.typesDir="./types";const t=e.context.libs.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,i=this.#t.projectDir;if("local:"===o.protocol){const e=we.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=we.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!ue.existsSync(e)){ue.mkdirSync(we.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",ue.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;ue.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=ke.compile(ue.readFileSync(we.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#n).render({...e,ui:{package:"@flownet/react-app"}}),i=this.#t.projectDir,n=we.resolve(i,"src/default/index.js");ue.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=ke.compile(ue.readFileSync(we.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=we.resolve(i,`src/default/${e.codeKey}.js`);ue.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=ke.compile(ue.readFileSync(we.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=we.resolve(t,`src/default/blocks/${o}`);ue.writeFileSync(i,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=i}async transformExpression(e){let t=await this.transformValue(e);return t=JSON.stringify(t),t=this.replaceSpecialPattern(t),t}async transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=await this.transformValue(e[t]);else if(ve(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=await this.transformValue(e[t[o]])}else if("string"==typeof e){const t=await Xe({expression:e});if(t){const{processor:o,statement:i}=t;switch(o){case"var":case"vs":case"v":e=`$::v.${i}::`;break;case"exp":case"e":e=`$::${i}::`;break;case"mod":case"m":e=`$::closure.module['${i}']::`;break;case"form":case"f":e=`$::closure.form.${i}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createAutoRun(){if(!0===this.#o.doc.features.multiple||!this.#o.doc.features.browser_enabled||!this.#o.doc.features.browser_autorun)return;await this.setInProgress({message:"Creating autorun.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s,ts:Date.now()},t=this.#t.templateDir,o=ke.compile(ue.readFileSync(we.resolve(t,"autorun.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=we.resolve(i,"autorun.html");ue.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:ge.dump(i)},s=this.#t.templateDir,a=ke.compile(ue.readFileSync(we.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=we.resolve(r,`${e}`);ue.writeFileSync(c,a,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:ge.dump(this.#i)},i=this.#t.templateDir,n=ke.compile(ue.readFileSync(we.resolve(i,`${e}.njk`),"utf8"),this.#n).render(o),s=this.#t.projectDir,a=we.resolve(s,`${e}`);ue.writeFileSync(a,n,"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=ke.compile(ue.readFileSync(we.resolve(o,`${e}.njk`),"utf8"),this.#n).render(t),n=this.#t.projectDir,s=we.resolve(n,`${e}`);ue.writeFileSync(s,i,"utf8")}else if(this.#o.id){const t=await Me.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=ke.compile(ue.readFileSync(we.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=we.resolve(r,`${e}`);ue.writeFileSync(c,a,"utf8")}}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=be.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=be.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=be.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=be.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build workflow project.")}async runPrettifier(){const e=this.#t.projectDir,t=be.exec("prettier --write .",{cwd:we.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 Me.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 Me.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.#f.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#f.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#f.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=Ve),!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.#p,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.#f.env.ATOM_LIBRARIES_ID,s=o.deploy.name;else{if(2!==a.length)throw new Error("Wrong name path.");{const e=await Me.first({where:{name:a[0],parent_id:this.#f.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.#p,ts:Date.now()},o.deploy.id){if(i=await Me.get({id:o.deploy.id}),!i)return}else{if(i=await Me.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:ue.readFileSync(we.resolve(r,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:ue.readFileSync(we.resolve(r,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:ue.readFileSync(we.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 Me.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||_e.util.generateId(),label:`WF/${s.id?s.id:Pe.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(we.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:_e.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:_e.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?xe(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||_e.util.generateId(),label:`WF/${s.id?s.id:Pe.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(we.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:_e.util.generateId(),schedules:e},debug:{id:_e.util.generateId()}}}}else{if("http"!==o.deploy.template)return;a={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||_e.util.generateId(),label:`WF/${s.id?s.id:Pe.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:_e.util.generateId(),name:s.doc.name,initialize:{content:ue.readFileSync(we.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:_e.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:_e.util.generateId()},debug:{id:_e.util.generateId()}}}}let r=ke.compile(ue.readFileSync(we.resolve(n,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#n).render(a);if(ue.writeFileSync(we.resolve(i,"node-red.yaml"),r),r=ge.load(r),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#p,ts:Date.now()};const c=o.deploy.url||this.#y.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#c),o.deploy.id)!0===o.actions?.delete?(await je({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await je({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:r,headers:l});else{const e=await je({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=we.resolve(i,"package.json"),s=ue.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=De.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 ."},ue.writeFileSync(n,JSON.stringify(a,null,"\t")),ue.writeFileSync(we.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#h.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==be.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");ue.writeFileSync(n,s),t.isDirty=!0,o.deploy.params.version=a.version,o.build={id:this.#p,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=we.resolve(i,"package.json"),s=ue.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=De.inc(o.deploy.params.version,"patch"),delete a.scripts,delete a.devDependencies,ue.writeFileSync(n,JSON.stringify(a,null,"\t"));const{file:r,data:c}=await We({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='${we.resolve(we.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 qe({command:l}),ue.writeFileSync(n,s),!0!==o.dryRun){if(!0===o.deploy.form?.enabled)if(o.deploy.form.id){const e=await Me.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 Me.update(e,{id:e.id})}else{const e=await Me.create({parent_id:this.#f.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.#p,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=We({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 qe({command:n}),t.isDirty=!0,o.build={id:this.#p,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=De.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 ze(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=De.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:we.resolve(i,"electron"),atom:this.#o,atomTarget:o},r=await Ge(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=De.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:we.resolve(i,"macos-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.#p,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=De.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:we.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await He(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=De.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:we.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await He(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,ts:Date.now()}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await Me.first({name:t.deploy.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await Me.update(i,{id:i.id})):i=await Me.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#d,{status:"IN_PROGRESS",message:e})}async build(){if(this.#k&&!this.#w)return await this.createNetwork();try{const e=this.#k?await Ke({root:this.#l}):void 0;this.#w&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#k&&ue.writeFileSync(we.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#l}),await this.createEngine({root:this.#l}),await this.createNodeTree({root:this.#l}),await this.createProjectYaml(),await this.createProjectMainYaml(),await this.createProjectReadme(),await this.createAutoRun(),await Re(this.#x),await Be(this.#x),await Oe(this.#x),await Ne(this.#x),await Ie(this.#x),await Fe(this.#x),await $e(this.#x),this.#g&&(await this.runBuildScripts(),this.#b&&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 Ke({root:this.#l});await this._cache_set(this.#d,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}};const Qe=c,et=l;var tt=function({baseDir:e=__dirname}){let t=e;for(;t!==et.parse(t).root;){const e=et.join(t,"node_modules");if(Qe.existsSync(e))return e;t=et.dirname(t)}return null};const ot=process.cwd();console.log(`cwd: ${ot}`),e({name:["redis"],dir:ot});const it=t,nt=o,{hideBin:st}=i,at=n,rt=s,ct=a,lt=r,pt=Ze,dt=tt({baseDir:__dirname});async function mt(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:it.resolve(ot,`./.output/${e.id}`),templateDir:it.resolve(dt,"./@flownet/template-node-workflow/default"),coreDir:it.resolve(dt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=it.resolve(ot,"flow.yaml");if(!at.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=at.readFileSync(t,"utf8"),i=rt.parse(o),n=it.dirname(t),s=it.resolve(n,"flow.main.yaml");if(!at.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const a=at.readFileSync(s,"utf8"),r=rt.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=it.resolve(n,"flow.devops.yaml");if(at.existsSync(l)){const e=at.readFileSync(l,"utf8"),t=rt.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{at.writeFileSync(c.devops.filePath,rt.stringify(c.devops.doc))}}}const p=it.resolve(n,"flow.readme.md");if(at.existsSync(p)){const e=at.readFileSync(p,"utf8");c.readme={filePath:p,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:it.resolve(dt,"./@flownet/template-node-workflow/default"),coreDir:it.resolve(dt,"./@flownet/template-node-workflow/core"),projectDir:it.resolve(t.projectDir,"./target"),projectSrcDir:it.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${dt}/.bin:${process.env.PATH}`,nt(st(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=it.resolve(dt,"./@flownet/template-node-workflow/project"),o=it.resolve(ot,e.name);at.existsSync(o)||at.mkdirSync(o),await lt({dir:t,outDir:o,context:e});let i=ct.exec("fnet build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(ct.which("git")&&(i=ct.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.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await mt(e),o=new pt(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await mt(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}`;ct.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await mt(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}`;ct.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await mt(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}`;ct.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await mt(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}`;ct.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
|
2
|
+
"use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),o=require("yargs/yargs"),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"),p=require("js-yaml"),d=require("nunjucks"),m=require("lodash.clonedeep"),f=require("isobject"),h=require("axios"),y=require("@node-red/util"),u=require("semver"),w=require("redis"),g=require("@flownet/lib-is-redis-online"),b=require("node:os"),k=require("nanoid"),v=require("@flownet/lib-atom-api-js"),x=require("qs"),j=require("lodash.merge"),_=require("@flownet/lib-list-npm-versions"),D=require("@flownet/lib-parse-imports-js"),T=require("@flownet/lib-execute-command-with-ipc-file"),P=require("@flownet/lib-parse-node-url"),S=require("@flownet/lib-bpmn-from-flow"),C=require("@flownet/lib-to-webos"),A=require("@flownet/lib-to-electron"),E=require("@flownet/lib-to-macos-app"),I=require("@flownet/lib-to-ios-app"),$=require("@flownet/lib-to-nextjs"),N=require("@fnet/expression");const F=w,O=g;const{Api:B}=v,R=h.default,M=x;const q=j;const L=_;const J=c,K=l,W=r;const U=d,z=c,G=l,Y=D,H=_;const V=c,X=l,Z=r;const Q=c,ee=l,te=d;const oe=c,ie=l,ne=d;const se=c,ae=l,re=d;const ce=c,le=l,pe=d;const de=d,me=c,fe=l;const he=$,ye=m,ue=j,we=u,ge=l;const be=c,ke=l,ve=p,xe=a,je=d,_e=m,De=f,Te=h,Pe=y,Se=u,Ce=async()=>{if(!await O({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},Ae=b,{nanoid:Ee}=k,Ie=class{init({config:e,accessToken:t}){return new Promise(((o,i)=>{if(B.set_api_url(e.data.url),t)return B.set_req_token(t),void o(t);R({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:M.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{B.set_req_token(e.data.access_token),o(e.data.access_token)})).catch((e=>{B.set_req_token(),i(e)}))}))}},$e=async({atom:e})=>{e.doc.features=e.doc.features||{};const t=e.doc.features;t.form_enabled=!0===e.doc.form||!0===e.doc.form?.enabled||!0===t.form||!0===t.form?.enabled,t.browser_autorun=!0===t.browser?.autorun,t.multiple_enabled=t.multiple_enabled||!0===t.multiple||!0===t.multiple?.enabled,t.index_html_enabled=!0===e.doc.features.form_enabled,t.bin_file_enabled=!1===e.doc.features.form_enabled;const o={cjs:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1},cjsx:{format:"cjs",context:t.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:t.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1},esmx:{format:"esm",browser:!0,babel:!0,context:t.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:t.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!0}},i={};!0===t.webos&&(o.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===t.index_html_enabled&&(o.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===t.bin_file_enabled&&(o.cli={format:"cjs",context:"global",babel:!1,browser:!1,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjs",banner:"#!/usr/bin/env node",terser:!1}),t.babel_options=t.babel_options||t.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},t.browsersync_options=q({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},t.browsersync_options||t.browsersync?.options||{}),t.replace_options=q({},t.replace_options||t.replace?.options||{}),t.terser_options=q({},t.terser_options||t.terser?.options||{}),t.css_options=q({},t.css_options||t.css?.options||{}),t.wasm_options=q({},t.wasm_options||t.wasm?.options||{}),t.copy_options=q(i,t.copy_options||t.copy?.options||{}),t.json_options=q({},t.json_options||t.json?.options||{}),t.image_options=q({},t.image_options||t.image?.options||{}),t.rollup_output=q(o,t.rollup_output||t.rollup?.output||t.rollup||{});const n=Object.keys(o);for(const e of n){const i=o[e];i&&(i.babel_options=i.babel_options||t.babel_options,i.browsersync_options=q(t.browsersync_options,i.browsersync_options),i.replace_options=q(t.replace_options,i.replace_options),i.terser_options=q(t.terser_options,i.terser_options),i.css_options=q(t.css_options,i.css_options),i.wasm_options=q(t.wasm_options,i.wasm_options),i.copy_options=q(t.copy_options,i.copy_options),i.json_options=q(t.json_options,i.json_options),i.image_options=q(t.image_options,i.image_options),t.form_enabled&&(i.babel=!0))}t.babel_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browser_enabled=n.some((e=>!0===t.rollup_output[e].babel)),t.browsersync_enabled=n.some((e=>!0===t.rollup_output[e].browsersync)),t.browsersync_enabled=t.browsersync_enabled&&(t.form_enabled||!0===t.browser_autorun),t.wasm_enabled=!0===t.wasm||t.wasm&&!1!==t.wasm?.enabled,t.css_enabled=!0===t.css||t.css&&!1!==t.css?.enabled,t.json_enabled=!0===t.json||t.json&&!1!==t.json?.enabled,t.terser_enabled=!0===t.terser||t.terser&&!1!==t.terser?.enabled,t.copy_enabled=t.form_enabled||t.copy_enabled||t.copy&&!1!==t.copy?.enabled,t.image_enabled=!0===t.image||t.image&&!1!==t.image?.enabled,t.bin_name=t.bin_name||t.bin?.name||t.bin,t.bin_enabled=t.bin_name&&("string"==typeof t.bin_name)(t.bin_enabled||!1!==t.bin?.enabled),t.dependency_auto_enabled=!1!==t.dependency_auto&&!1!==t.dependency_auto?.enabled,t.npm_install_flags=t.npm_install_flags||"",t.react_version=t.react_version||t.react?.version||18},Ne=async({atom:e,packageDependencies:t,packageDevDependencies:o})=>{if("workflow"===e.type&&(t.push({package:"eventemitter3",version:"^4.0"}),t.push({package:"get-value",version:"^3.0"}),t.push({package:"set-value",version:"^4.1"})),e.doc.features.form_enabled&&e.doc.features.dependency_auto_enabled){let o="^18.2";o=`^${(await L({name:"react",groupBy:{major:!0}})).find((t=>t[0]===e.doc.features.react_version.toString()))[0]}`,t.push({package:"react",version:o}),t.push({package:"react-dom",version:o}),"workflow"===e.type&&(t.push({package:"@flownet/react-app",version:"^0.1"}),t.push({package:"@flownet/react-app-state",version:"^0.1"}))}if(e.doc.features.bin_file_enabled&&t.push({package:"yargs",version:"^17"}),t.push({package:"chalk",version:"^4"}),o.push({package:"@babel/core",version:"^7.23"}),o.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),o.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),o.push({package:"@rollup/plugin-replace",version:"^5.0"}),o.push({package:"rollup",version:"^3.26"}),o.push({package:"rollup-plugin-delete",version:"^2.0"}),o.push({package:"rollup-plugin-dts",version:"^6.0"}),o.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),e.doc.features.babel_enabled&&(o.push({package:"@rollup/plugin-babel",version:"^6.0"}),o.push({package:"@babel/preset-env",version:"7.22"}),o.push({package:"@babel/preset-react",version:"7.22"})),e.doc.features.browsersync_enabled&&o.push({package:"rollup-plugin-browsersync",version:"^1.3"}),e.doc.features.json_enabled&&o.push({package:"@rollup/plugin-json",version:"^6.0"}),e.doc.features.terser_enabled&&o.push({package:"@rollup/plugin-terser",version:"^0.4"}),e.doc.features.wasm_enabled&&o.push({package:"@rollup/plugin-wasm",version:"^6.1"}),e.doc.features.image_enabled&&o.push({package:"@rollup/plugin-image",version:"^3.0"}),e.doc.features.css_enabled){o.push({package:"rollup-plugin-postcss",version:"4.0"}),o.push({package:"sass",version:"^1.66"});(e.doc.features.css_options?.plugins||[]).forEach((e=>{switch(e.name){case"postcss-import":o.push({package:"postcss-import",version:"^15.1"});break;case"postcss-url":o.push({package:"postcss-url",version:"^10.1"});break;case"postcss-preset-env":o.push({package:"postcss-preset-env",version:"^9.1"});break;case"autoprefixer":o.push({package:"autoprefixer",version:"^10.4"});break;case"cssnano":o.push({package:"cssnano",version:"^6.0"})}}))}e.doc.features.copy_enabled&&o.push({package:"rollup-plugin-copy",version:"^3.5"})},Fe=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!e.doc.features.index_html_enabled)return;await t({message:"Creating index.html."});const n={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i,ts:Date.now()},s=o.templateDir,a=K.resolve(o.projectDir,"src/app");J.existsSync(a)||J.mkdirSync(a,{recursive:!0}),await W({pattern:["index.html.njk","index.js.njk"],dir:K.resolve(s,"src/app"),outDir:a,context:n})},Oe=async({atom:e,context:t,packageDependencies:o,packageDevDependencies:i,setInProgress:n,njEnv:s})=>{await n({message:"Creating package.json."});const a=o.find((e=>"react"===e.package)),r=o.find((e=>"react-dom"===e.package));a&&!r?o.push({package:"react-dom",version:a.version}):a&&r&&(r.version=a.version),a&&e.doc.features.react_version>=17&&(o.find((e=>"@emotion/react"===e.package))||o.push({package:"@emotion/react",version:"^11"}),o.find((e=>"@emotion/styled"===e.package))||o.push({package:"@emotion/styled",version:"^11"}));const c=[];!0===e.doc.features.index_html_enabled&&c.push(G.resolve(t.projectDir,"src/app/index.js")),!0===e.doc.features.bin_file_enabled&&c.push(G.resolve(t.projectDir,"src/cli/index.js"));for await(const t of c){const n=t;if(!z.existsSync(n))throw new Error(`App file not found: ${n}`);const s=await Y({file:n,recursive:!0}),a=!0===e.doc.features.all_parsed_imports?s.all:s.required;for await(const e of a){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;if(i.find((t=>t.package===e.package)))continue;const t=(await H({name:e.package,groupBy:{minor:!0}}))[0][0];i.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const l={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:o,packageDevDependencies:i},p=t.templateCommonDir,d=U.compile(z.readFileSync(G.resolve(p,"package.json.njk"),"utf8"),s).render(l),m=t.projectDir,f=G.resolve(m,"package.json");z.writeFileSync(f,d,"utf8")},Be=async({atom:e,setInProgress:t,context:o,packageDependencies:i})=>{if(!0!==e.doc.features.bin_file_enabled)return;await t({message:"Creating cli."});const n={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},s=o.templateDir,a=X.resolve(o.projectDir,"src/cli");V.existsSync(a)||V.mkdirSync(a,{recursive:!0}),await Z({pattern:["index.js.njk"],dir:X.resolve(s,"src/cli"),outDir:a,context:n})},Re=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating rollup file."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateCommonDir,r=te.compile(Q.readFileSync(ee.resolve(a,"rollup.config.js.njk"),"utf8"),n).render(s),c=o.projectDir,l=ee.resolve(c,"rollup.config.js");Q.writeFileSync(l,r,"utf8")},Me=async({atom:e,setInProgress:t,context:o,njEnv:i})=>{if(!0===e.doc.features.form_enabled)return;await t({message:"Creating yargs."});const n={},s=e.doc.inputs||[],a=[];s.forEach((e=>{if(!1===e.cli||!e.name)return;e.import&&a.push(e);const t={};e.type&&(t.type=e.type),e.default&&(t.default=e.default),e.choices&&(t.choices=e.choices),(e.describe||e.description)&&(t.describe=e.describe||e.description),e.alias&&(t.alias=e.alias),!0===e.required&&(t.required=!0),!0===e.hidden&&(t.hidden=!0),!0===e.array&&(t.array=!0),!0===e.normalize&&(t.normalize=!0),e.nargs&&(t.nargs=e.nargs),n[e.name]=t}));const r={options:n,imports:a,atom:e},c=o.templateDir,l=ne.compile(oe.readFileSync(ie.resolve(c,"src/default/to.yargs.js.njk"),"utf8"),i).render(r),p=o.projectDir,d=ie.resolve(p,"src/default/to.yargs.js");oe.writeFileSync(d,l,"utf8")},qe=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating .gitignore"});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateCommonDir,r=re.compile(se.readFileSync(ae.resolve(a,".gitignore.njk"),"utf8"),n).render(s),c=o.projectDir,l=ae.resolve(c,".gitignore");se.writeFileSync(l,r,"utf8")},Le=async({atom:e,setInProgress:t,context:o,packageDependencies:i,njEnv:n})=>{await t({message:"Creating tsconfig.json."});const s={workflowAtom:e,libraryAtom:e,atom:e,packageDependencies:i},a=o.templateCommonDir,r=pe.compile(ce.readFileSync(le.resolve(a,"tsconfig.json.njk"),"utf8"),n).render(s),c=o.projectDir,l=le.resolve(c,"tsconfig.json");ce.writeFileSync(l,r,"utf8")},Je=async({atom:e,context:t,setInProgress:o,njEnv:i,Atom:n})=>{const s="readme.md",a=`Creating ${s}`;if(await o({message:a}),t.project?.readme){const e={content:t.project.readme.doc.content},o=t.templateCommonDir,n=de.compile(me.readFileSync(fe.resolve(o,`${s}.njk`),"utf8"),i).render(e),a=t.projectDir,r=fe.resolve(a,`${s}`);me.writeFileSync(r,n,"utf8")}else if(e.id){const o=await n.first({type:"wiki",parent_id:e.id});if(!o||"markdown"!==o.doc?.["content-type"])return;const{content:a,...r}=o.doc,c={content:a},l=t.templateCommonDir,p=de.compile(me.readFileSync(fe.resolve(l,`${s}.njk`),"utf8"),i).render(c),d=t.projectDir,m=fe.resolve(d,`${s}`);me.writeFileSync(m,p,"utf8")}},{Atom:Ke}=v,We=T,Ue=P,ze=_,Ge=S,Ye=e,He=D,Ve=C,Xe=A,Ze=E,Qe=I,et=async({atom:e,target:t,onProgress:o,projectDir:i,dependencies:n})=>{o&&await o({message:"Deploying it as nextjs package."});t.params=ue({name:"nextjs-app",version:"0.1.0"},t.params);const s=we.inc(t.params.version,"patch");t.params.version=s;const a=ye(t);a.params.dependencies=ye(n);const r={atom:e,target:a.params,projectDir:i,renderDir:ge.resolve(i,"nextjs")};return{deployer:await he(r)}},tt=N;var ot=class{#e;#t;#o;#i;#n;#s;#a;#r;#c;#l;#p;#d;#m;#f;#h;#y;#u;#w;#g;#b;#k;#v;constructor(e){this.#e=new Ie,this.#t=e,this.#s=[],this.#a=[],this.#r={},this._expire_ttl=3600,this._expire_ttl_short=300,this.#v={packageDependencies:this.#s,packageDevDependencies:this.#a,setInProgress:this.setInProgress.bind(this),context:this.#t,Atom:Ke}}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 Ce(),this.#p=this.#t.buildId||Ee(24),this.#u=this.#t.mode,this.#w=["all","deploy","build","file"].includes(this.#u),this.#g=["all","deploy","build"].includes(this.#u),this.#b=["all","deploy"].includes(this.#u),this.#k=["all","deploy","build","file","bpmn"].includes(this.#u),this.#m=this.#t.protocol,this.#d="BUILD:"+this.#p,this.#f=await(Ye({name:"atom",dir:this.#t.projectDir})?.data),this.#h=await(Ye({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#y=await(Ye({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initWorkflow(),await $e(this.#v),await Ne(this.#v),await this.transformWorkflow({workflow:this.#i});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.#l=e}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#c=await this.#e.init({config:this.#f}))}async initWorkflow(){const e=this.#t.id;this.#o=this.#t.project?.workflowAtom||await Ke.get({id:e}),this.#i="string"==typeof this.#o.doc.content?ve.load(this.#o.doc.content):this.#o.doc.content;let t=this.#o.doc.bundleName;t=t||(this.#o.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#o.doc.bundleName=t,this.#o.type=this.#o.type||"workflow",this.#v.atom=this.#o}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(be.existsSync(e)&&be.readdirSync(e).forEach((t=>{i.includes(t)||(o=xe.rm("-rf",ke.join(e,t)))})),o=xe.exec(`mkdir -p ${e}`),0!==o.code)throw new Error("Couldnt create workflow dir.");if(o=xe.exec(`mkdir ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src dir.");if(o=xe.exec(`cp -a ${t} ${e}/src`),0!==o.code)throw new Error("Couldnt create workflow/src/core dir.");if(o=xe.exec(`mkdir -p ${e}/src/libs`),0!==o.code)throw new Error("Couldnt create workflow/src/libs dir.");if(o=xe.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=je.configure(e,{watch:!1,dev:!0}),this.#v.njEnv=this.#n}transformWorkflow({workflow:e}){for(const t of Object.values(e))t.steps=t.steps||[],t.steps=t.steps.map((e=>this.transformStep({step:e})))}transformStep({step:e}){if(Array.isArray(e))throw new Error("Step must be an object.");const[t,o]=Object.entries(e)[0];if(o.hasOwnProperty("onerror")){const{onerror:i,...n}=o;e[t]={try:n,except:i}}if(e[t].hasOwnProperty("steps")){const o=e[t].steps;if(!Array.isArray(o))throw new Error("Steps must be an array.");e[t].steps=o.map((e=>this.transformStep({step:e})))}return e}async initNodeTree({workflow:e}){const t=Object.keys(e),o={definition:e,name:void 0,type:"root",parent:void 0,childs:[],blockAutoJumpToParent:!0,blockAutoJumpToSibling:!0,index:0,depth:0,context:{libs:[],atom:this.#o}};t.forEach((t=>{const 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=ke.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=Ee(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=Ue({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#m),"ac:"===t.protocol){const o=t.pathname.split("/");if(1===o.length)return await Ke.first({where:{name:e,parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===o.length){const e=await Ke.first({where:{name:o[0],parent_id:this.#f.env.ATOM_LIBRARIES_ID,type:"folder"}});return await Ke.first({where:{name:o[1],parent_id:e.id,type:"workflow.lib"}})}}else{if("local:"===t.protocol){const e=ke.resolve(this.#t.projectSrcDir,`${t.pathname}.js`),o=[],i=await He({file:e,recursive:!0});for await(const e of i.required){if("npm"!==e.type)continue;if(o.find((t=>t.package===e.package)))continue;const t=(await ze({name:e.package,groupBy:{minor:!0}}))[0][0];o.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}return{name:t.pathname,doc:{type:"workflow.lib","content-type":"javascript",language:"js",dependencies:o},protocol:t.protocol}}if("npm:"===t.protocol){const e=(await ze({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=_e(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=_e(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={key:await this.transformExpression(i),value:await this.transformExpression(n)};t.assign[e]=s}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeSteps({node:e}){e.context.next=e.childs[0]}async resolveTypeReturn({node:e}){e.context.transform=e.context.transform||_e(e.definition);const t=e.context.transform;t.return=await this.transformExpression(t.return),await this.resolveTypeCommon({node:e})}async resolveTypeCall({node:e}){e.context.transform=e.context.transform||_e(e.definition);const t=e.context.transform;t.args&&(t.args=await this.transformExpression(t.args)),t.result&&(t.result=await this.transformExpression(t.result));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.call)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeForm({node:e}){e.context.transform=e.context.transform||_e(e.definition);const t=e.context.transform;t.props&&(t.props=await this.transformExpression(t.props));const o=e.workflow.parent;e.context.lib=o.context.libs.find((e=>e.name===t.form)),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeRaise({node:e}){e.context.transform=e.context.transform||_e(e.definition);const t=e.context.transform;t.raise=await this.transformExpression(t.raise),await this.resolveTypeCommon({node:e})}async resolveTypeSwitch({node:e}){e.context.transform=e.context.transform||_e(e.definition),e.context.transform;for(const t of e.childs)t.context.transform=t.context.transform||_e(t.definition),t.context.transform.condition=await this.transformExpression(t.definition.condition);await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeJump({node:e}){e.context.transform=e.context.transform||_e(e.definition);const t=e.context.transform;t.next=await this.transformExpression(t.next),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeTryExcept({node:e}){if(e.context.transform=e.context.transform||_e(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||_e(t.definition),t.context.transform.hasOwnProperty("as")||(t.context.transform.as="error")}await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeFor({node:e}){e.context.transform=e.context.transform||_e(e.definition);e.context.transform.for.in=await this.transformExpression(e.definition.for.in),await this.resolveTypeCommon({node:e}),this.resolveNextBlock({node:e})}async resolveTypeOperation({node:e}){e.context.transform=e.context.transform||_e(e.definition),await this.resolveTypeCommon({node:e})}async resolveTypeCommon({node:e}){const t=e.context.transform;t.hasOwnProperty("operation")&&(t.operation=await this.transformExpression(t.operation)),t.hasOwnProperty("page")&&(t.page=await this.transformExpression(t.page)),t.hasOwnProperty("print")&&(t.print=await this.transformExpression(t.print)),t.hasOwnProperty("sleep")&&(t.sleep=await this.transformExpression(t.sleep)),t.hasOwnProperty("assert")&&(t.assert=await this.transformExpression(t.assert))}async createAtomLibFiles({root:e}){await this.setInProgress({message:"Creating external lib files."}),this.#o.typesDir="./types";const t=e.context.libs.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const o=t[e].atom,i=this.#t.projectDir;if("local:"===o.protocol){const e=ke.resolve(this.#t.projectSrcDir,`${o.fileName||o.name}.js`),t=ke.relative(`${this.#t.projectDir}/src/default/blocks`,e);if(!be.existsSync(e)){be.mkdirSync(ke.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",be.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;be.writeFileSync(e,t.content,"utf8")}}}async createEngine({root:e}){await this.setInProgress({message:"Creating engine file."});const t=this.#t.templateDir,o=je.compile(be.readFileSync(ke.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#n).render({...e,ui:{package:"@flownet/react-app"}}),i=this.#t.projectDir,n=ke.resolve(i,"src/default/index.js");be.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=je.compile(be.readFileSync(ke.resolve(t,"src/default/workflow.js.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=ke.resolve(i,`src/default/${e.codeKey}.js`);be.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=je.compile(be.readFileSync(ke.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=ke.resolve(t,`src/default/blocks/${o}`);be.writeFileSync(i,e.context.render,"utf8"),e.context.fileName=o,e.context.filePath=i}async transformExpression(e){let t=await this.transformValue(e);return t=JSON.stringify(t),t=this.replaceSpecialPattern(t),t}async transformValue(e){if(Array.isArray(e))for(let t=0;t<e.length;t++)e[t]=await this.transformValue(e[t]);else if(De(e)){const t=Object.keys(e);for(let o=0;o<t.length;o++)e[t[o]]=await this.transformValue(e[t[o]])}else if("string"==typeof e){const t=await tt({expression:e});if(t){const{processor:o,statement:i}=t;switch(o){case"var":case"vs":case"v":e=`$::v.${i}::`;break;case"exp":case"e":e=`$::${i}::`;break;case"mod":case"m":e=`$::closure.module['${i}']::`;break;case"form":case"f":e=`$::closure.form.${i}::`}}}return e}replaceSpecialPattern(e){return e.replace(/"\$::(.*?)::"/g,"$1")}replaceExpressionLegacy(e){return e.replaceAll(/(?<outer>"\${(?<inner>[^{]*)}")/g,"$2")}async createAutoRun(){if(!0===this.#o.doc.features.multiple||!this.#o.doc.features.browser_enabled||!this.#o.doc.features.browser_autorun)return;await this.setInProgress({message:"Creating autorun.html."});const e={workflowAtom:this.#o,atom:this.#o,packageDependencies:this.#s,ts:Date.now()},t=this.#t.templateDir,o=je.compile(be.readFileSync(ke.resolve(t,"autorun.html.njk"),"utf8"),this.#n).render(e),i=this.#t.projectDir,n=ke.resolve(i,"autorun.html");be.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:ve.dump(i)},s=this.#t.templateDir,a=je.compile(be.readFileSync(ke.resolve(s,`${e}.njk`),"utf8"),this.#n).render(n),r=this.#t.projectDir,c=ke.resolve(r,`${e}`);be.writeFileSync(c,a,"utf8")}async createProjectMainYaml(){const e="flow.main.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const o={content:ve.dump(this.#i)},i=this.#t.templateDir,n=je.compile(be.readFileSync(ke.resolve(i,`${e}.njk`),"utf8"),this.#n).render(o),s=this.#t.projectDir,a=ke.resolve(s,`${e}`);be.writeFileSync(a,n,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=xe.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=xe.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=xe.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=xe.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build workflow project.")}async runPrettifier(){const e=this.#t.projectDir,t=xe.exec("prettier --write .",{cwd:ke.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 Ke.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 Ke.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.#f.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#f.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#f.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=et),!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.#p,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.#f.env.ATOM_LIBRARIES_ID,s=o.deploy.name;else{if(2!==a.length)throw new Error("Wrong name path.");{const e=await Ke.first({where:{name:a[0],parent_id:this.#f.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.#p,ts:Date.now()},o.deploy.id){if(i=await Ke.get({id:o.deploy.id}),!i)return}else{if(i=await Ke.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:be.readFileSync(ke.resolve(r,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:be.readFileSync(ke.resolve(r,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:be.readFileSync(ke.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 Ke.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||Pe.util.generateId(),label:`WF/${s.id?s.id:Ae.hostname()}/${s.name}/${o.deploy.name||o.deploy.template}`},function:{id:Pe.util.generateId(),name:s.doc.name,initialize:{content:be.readFileSync(ke.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:Pe.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:Pe.util.generateId()}}};else if("cronjob"===o.deploy.template){let e=o.deploy.params?.schedules?_e(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||Pe.util.generateId(),label:`WF/${s.id?s.id:Ae.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Pe.util.generateId(),name:s.doc.name,initialize:{content:be.readFileSync(ke.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:Pe.util.generateId(),schedules:e},debug:{id:Pe.util.generateId()}}}}else{if("http"!==o.deploy.template)return;a={atom:s,packageDependencies:this.#s,red:{tab:{id:o.deploy.id||Pe.util.generateId(),label:`WF/${s.id?s.id:Ae.hostname()}/${o.deploy.name||o.deploy.template}`},function:{id:Pe.util.generateId(),name:s.doc.name,initialize:{content:be.readFileSync(ke.resolve(i,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:Pe.util.generateId(),method:o.deploy.params.method||"get",url:o.deploy.params.url},httpout:{id:Pe.util.generateId()},debug:{id:Pe.util.generateId()}}}}let r=je.compile(be.readFileSync(ke.resolve(n,`deploy/node-red/${o.deploy.template}.yaml.njk`),"utf8"),this.#n).render(a);if(be.writeFileSync(ke.resolve(i,"node-red.yaml"),r),r=ve.load(r),!0===o.dryRun)return;t.isDirty=!0,o.build={id:this.#p,ts:Date.now()};const c=o.deploy.url||this.#y.env.RED_URL,l={};if(!1!==o.deploy.auth&&(l.Authorization="Bearer "+this.#c),o.deploy.id)!0===o.actions?.delete?(await Te({method:"DELETE",url:`${c}/flow/${o.deploy.id}`,headers:l}),delete o.actions.delete,delete o.deploy.id,o.enabled=!1):await Te({method:"PUT",url:`${c}/flow/${o.deploy.id}`,data:r,headers:l});else{const e=await Te({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=ke.resolve(i,"package.json"),s=be.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=Se.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 ."},be.writeFileSync(n,JSON.stringify(a,null,"\t")),be.writeFileSync(ke.resolve(i,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#h.env.NPM_TOKEN}`),!0===o.dryRun)return;if(0!==xe.exec("npm publish --access public",{cwd:i}).code)throw new Error("Couldnt publish to npm");be.writeFileSync(n,s),t.isDirty=!0,o.deploy.params.version=a.version,o.build={id:this.#p,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=ke.resolve(i,"package.json"),s=be.readFileSync(n),a=JSON.parse(s);a.name=o.deploy.params.name,a.version=Se.inc(o.deploy.params.version,"patch"),delete a.scripts,delete a.devDependencies,be.writeFileSync(n,JSON.stringify(a,null,"\t"));const{file:r,data:c}=await Ye({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='${ke.resolve(ke.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 We({command:l}),be.writeFileSync(n,s),!0!==o.dryRun){if(!0===o.deploy.form?.enabled)if(o.deploy.form.id){const e=await Ke.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 Ke.update(e,{id:e.id})}else{const e=await Ke.create({parent_id:this.#f.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.#p,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=Ye({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 We({command:n}),t.isDirty=!0,o.build={id:this.#p,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=Se.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 Ve(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=Se.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:ke.resolve(i,"electron"),atom:this.#o,atomTarget:o},r=await Xe(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=Se.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:ke.resolve(i,"macos-app"),atom:this.#o,atomTarget:o},r=await Ze(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=Se.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:ke.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await Qe(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,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=Se.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:ke.resolve(i,"ios-app"),atom:this.#o,atomTarget:o},r=await Qe(a);console.log(r),t.isDirty=!0,o.deploy.params.version=n,o.build={id:this.#p,ts:Date.now()}}async registerToPackageManager(e){const{target:t,packageJSON:o}=e;let i=await Ke.first({name:t.deploy.params.name,parent_id:this.#f.env.ATOM_PACKAGES_ID});i?(i.doc.versions.splice(0,0,{v:o.version}),await Ke.update(i,{id:i.id})):i=await Ke.create({parent_id:this.#f.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:o.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#d,{status:"IN_PROGRESS",message:e})}async build(){if(this.#k&&!this.#w)return await this.createNetwork();try{const e=this.#k?await Ge({root:this.#l}):void 0;this.#w&&(await this.initWorkflowDir(),await this.initNunjucks(),this.#k&&be.writeFileSync(ke.resolve(this.#t.projectDir,"./project.bpmn"),e.diagramXML,"utf8"),await this.createAtomLibFiles({root:this.#l}),await this.createEngine({root:this.#l}),await this.createNodeTree({root:this.#l}),await this.createProjectYaml(),await this.createProjectMainYaml(),await this.createAutoRun(),await Je(this.#v),await Le(this.#v),await qe(this.#v),await Me(this.#v),await Be(this.#v),await Fe(this.#v),await Re(this.#v),await Oe(this.#v),this.#g&&(await this.runBuildScripts(),this.#b&&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 Ge({root:this.#l});await this._cache_set(this.#d,{status:"COMPLETED",data:{...e}})}catch(e){throw await this._cache_set(this.#d,{status:"FAILED",message:e.message||e}),e}}};const it=c,nt=l;var st=function({baseDir:e=__dirname}){let t=e;for(;t!==nt.parse(t).root;){const e=nt.join(t,"node_modules");if(it.existsSync(e))return e;t=nt.dirname(t)}return null};const at=process.cwd();console.log(`cwd: ${at}`),e({name:["redis"],dir:at});const rt=t,ct=o,{hideBin:lt}=i,pt=n,dt=s,mt=a,ft=r,ht=ot,yt=st({baseDir:__dirname});async function ut(e){if(e.id){return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",projectDir:rt.resolve(at,`./.output/${e.id}`),templateDir:rt.resolve(yt,"./@flownet/template-node-workflow/default"),templateCommonDir:rt.resolve(yt,"./@flownet/template-node-common/default"),coreDir:rt.resolve(yt,"./@flownet/template-node-workflow/core")}}{const t=await async function(e){const t=rt.resolve(at,"flow.yaml");if(!pt.existsSync(t))throw new Error("flow.yaml file not found in current directory.");const o=pt.readFileSync(t,"utf8"),i=dt.parse(o),n=rt.dirname(t),s=rt.resolve(n,"flow.main.yaml");if(!pt.existsSync(t))throw new Error("flow.main.yaml file not found in current directory.");const a=pt.readFileSync(s,"utf8"),r=dt.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=rt.resolve(n,"flow.devops.yaml");if(pt.existsSync(l)){const e=pt.readFileSync(l,"utf8"),t=dt.parse(e);c.devops={filePath:l,fileContent:e,doc:{...t},type:"workflow.deploy",save:async()=>{pt.writeFileSync(c.devops.filePath,dt.stringify(c.devops.doc))}}}const p=rt.resolve(n,"flow.readme.md");if(pt.existsSync(p)){const e=pt.readFileSync(p,"utf8");c.readme={filePath:p,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return c}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:rt.resolve(yt,"./@flownet/template-node-workflow/default"),templateCommonDir:rt.resolve(yt,"./@flownet/template-node-common/default"),coreDir:rt.resolve(yt,"./@flownet/template-node-workflow/core"),projectDir:rt.resolve(t.projectDir,"./target"),projectSrcDir:rt.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${yt}/.bin:${process.env.PATH}`,ct(lt(process.argv)).command("create","Initialize flow node project",(e=>e.option("name",{type:"string"})),(async e=>{try{const t=rt.resolve(yt,"./@flownet/template-node-workflow/project"),o=rt.resolve(at,e.name);pt.existsSync(o)||pt.mkdirSync(o),await ft({dir:t,outDir:o,context:e});let i=mt.exec("fnet build",{cwd:o});if(0!==i.code)throw new Error("Failed to build project.");if(mt.which("git")&&(i=mt.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.error("Initialization failed!",e.message),process.exit(1)}})).command("build","Build flow net project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await ut(e),o=new ht(t);await o.init(),await o.build(),console.log("Building workflow succeeded!"),process.exit(0)}catch(e){console.error("Building workflow failed!",e.message),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ut(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}`;mt.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ut(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}`;mt.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ut(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}`;mt.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ut(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}`;mt.exec(s,{cwd:o}),process.exit(0)}catch(e){console.error(e.message),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e,t,i=require("@flownet/lib-load-fnet-config"),s=require("redis"),r=require("@flownet/lib-is-redis-online"),n=require("express"),o=require("helmet"),l=require("cors"),d=require("path"),c=require("shelljs"),a=require("nanoid"),u=require("request-ip"),h=require("express-session"),w=require("keycloak-connect"),p=require("qs");function _(){if(t)return e;t=1;const i=s,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=i.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}}var b,f,m,y,k={name:"@fnet/cli",version:"0.8.
|
|
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.8.4",files:["dist"],scripts:{start:"node src/index.js",build:"rollup --config --bundleConfigAsCjs",deploy:"npm install && npm run build && npm publish --access public",watch:"rollup --config --watch --sourcemap --bundleConfigAsCjs --environment DEVELOPMENT"},dependencies:{"@flownet/lib-atom-api-js":"^0.1.8","@flownet/lib-bpmn-from-flow":"^0.1.7","@flownet/lib-execute-command-with-ipc-file":"^0.1.11","@flownet/lib-is-redis-online":"^0.1.13","@flownet/lib-list-npm-versions":"^0.1.31","@flownet/lib-load-fnet-config":"^0.1.27","@flownet/lib-parse-imports-js":"^0.1.35","@flownet/lib-parse-node-url":"^0.1.16","@flownet/lib-pick-npm-versions":"^0.1.12","@flownet/lib-render-templates-dir":"^0.1.12","@flownet/lib-to-electron":"^0.1.20","@flownet/lib-to-gitlab":"^0.1.21","@flownet/lib-to-ios-app":"^0.1.21","@flownet/lib-to-macos-app":"^0.1.12","@flownet/lib-to-nextjs":"^0.1.11","@flownet/lib-to-webos":"^0.1.10","@flownet/lib-upload-files-to-gcs":"^0.1.12","@flownet/template-node-common":"^0.8.4","@flownet/template-node-library":"^0.8.4","@flownet/template-node-workflow":"^0.8.4","@fnet/expression":"^0.1.2","@node-red/util":"^3.1.0",axios:"^1.5.0",chalk:"^4.1.2",cors:"^2.8.5",express:"^4.18.2","express-session":"^1.17.3","get-value":"^3.0.1",helmet:"^5.1.1",isobject:"^4.0.0","js-yaml":"^4.1.0","keycloak-connect":"^22.0.3","lodash.clonedeep":"^4.5.0","lodash.merge":"^4.6.2",minimist:"^1.2.8",nanoid:"^3.3.6",nunjucks:"^3.2.4",prettier:"^3.0.3",qs:"^6.11.2",redis:"^4.6.10","request-ip":"^3.3.0",semver:"^7.5.4",serve:"^14.2.1","set-value":"^4.1.0",shelljs:"^0.8.5",typescript:"^5.2.2",uuid:"^9.0.1",yaml:"^2.3.2",yargs:"^17.7.2"},bin:{fnet:"dist/builder/wf-cli.js",flib:"dist/builder/lib-cli.js",fsrv:"dist/index.js",fnode:"dist/builder/lib-cli.js"},devDependencies:{"@rollup/plugin-commonjs":"^25.0.4","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.1","@rollup/plugin-replace":"^5.0.2","@rollup/plugin-terser":"^0.4.3",rollup:"^3.29.1"}};const v=process.cwd();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={};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fnet/cli",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4",
|
|
4
4
|
"files": [
|
|
5
5
|
"dist"
|
|
6
6
|
],
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
"@flownet/lib-to-nextjs": "^0.1.11",
|
|
29
29
|
"@flownet/lib-to-webos": "^0.1.10",
|
|
30
30
|
"@flownet/lib-upload-files-to-gcs": "^0.1.12",
|
|
31
|
-
"@flownet/template-node-
|
|
32
|
-
"@flownet/template-node-
|
|
31
|
+
"@flownet/template-node-common": "^0.8.4",
|
|
32
|
+
"@flownet/template-node-library": "^0.8.4",
|
|
33
|
+
"@flownet/template-node-workflow": "^0.8.4",
|
|
33
34
|
"@fnet/expression": "^0.1.2",
|
|
34
35
|
"@node-red/util": "^3.1.0",
|
|
35
36
|
"axios": "^1.5.0",
|