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