@fnet/cli 0.7.4 → 0.7.6

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