@fnet/cli 0.7.1 → 0.7.2
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/index.js +1 -1
- package/package.json +1 -1
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"),i=require("yargs/yargs"),a=require("yargs/helpers"),o=require("fs"),s=require("yaml"),n=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),d=require("js-yaml"),p=require("nunjucks"),m=require("lodash.clonedeep"),h=require("axios"),u=require("@node-red/util"),g=require("semver"),y=require("redis"),f=require("@flownet/lib-is-redis-online"),b=require("node:os"),w=require("lodash.merge"),j=require("nanoid"),_=require("@flownet/lib-atom-api-js"),v=require("qs"),D=require("@flownet/lib-execute-command-with-ipc-file"),k=require("@flownet/lib-parse-node-url"),x=require("@flownet/lib-parse-imports-js"),P=require("@flownet/lib-pick-npm-versions"),I=require("@flownet/lib-to-nextjs"),S=require("@flownet/lib-list-npm-versions");const $=y,E=f;const{Api:A}=_,C=h.default,F=v;const T=I,O=m,R=w,q=g,L=l;const N=c,M=l,B=d,G=n,J=p,K=m,U=h,Y=u,z=g,H=async()=>{if(!await E({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=$.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},W=b,X=w,{nanoid:Z}=j,Q=class{init({config:e,accessToken:t}){return new Promise(((i,a)=>{if(A.set_api_url(e.data.url),t)return A.set_req_token(t),void i(t);C({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:F.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{A.set_req_token(e.data.access_token),i(e.data.access_token)})).catch((e=>{A.set_req_token(),a(e)}))}))}},{Atom:V}=_,ee=D,te=k,ie=e,ae=x,oe=P,se=async({atom:e,target:t,onProgress:i,projectDir:a,dependencies:o})=>{i&&await i({message:"Deploying it as nextjs package."});t.params=R({name:"nextjs-app",version:"0.1.0"},t.params);const s=q.inc(t.params.version,"patch");t.params.version=s;const n=O(t);n.params.dependencies=O(o);const r={atom:e,target:n.params,projectDir:a,renderDir:L.resolve(a,"nextjs")};return{deployer:await T(r)}},ne=r,re=S;var ce=class{#e;#t;#i;#a;#o;#s;#n;#r;#c;#l;#d;#p;#m;#h;#u;#g;#y;#f;constructor(e){this.#e=new Q,this.#t=e,this.#s=[],this.#n=[],this._expire_ttl=3600,this._expire_ttl_short=300}async _cache_set(e,t,i){this._redis_client&&await this._redis_client.SETEX(e,i||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await H(),this.#c=this.#t.buildId||Z(24),this.#u=this.#t.mode,this.#g=["all","deploy","build","file"].includes(this.#u),this.#y=["all","deploy","build"].includes(this.#u),this.#f=["all","deploy"].includes(this.#u),this.#d=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#p=await(ie({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data),this.#m=await(ie({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#h=await(ie({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await this.initFeatures(),await this.initDependencies(),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#p}))}async initLibrary(){const e=this.#t.id;this.#i=this.#t.project?.libraryAtom||await V.get({id:e});let t=this.#i.doc.bundleName;t=t||(this.#i.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#i.doc.bundleName=t,this.#i.type=this.#i.type||"workflow.lib"}async initFeatures(){this.#i.doc.features=this.#i.doc.features||{};const e=this.#i.doc.features;e.form_enabled=!0===this.#i.doc.form||!0===this.#i.doc.form?.enabled||!0===e.form||!0===e.form?.enabled,e.browser_autorun=!0===e.browser?.autorun,e.multiple_enabled=e.multiple_enabled||!0===e.multiple||!0===e.multiple?.enabled,e.index_html_enabled=!0===this.#i.doc.features.form_enabled,e.bin_file_enabled=!1===this.#i.doc.features.form_enabled;const t={cjs:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0},cjsx:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1},esm:{format:"esm",context:e.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0},esmx:{format:"esm",browser:!0,babel:!0,context:e.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1},iife:{format:"iife",context:e.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1}},i={};!0===e.webos&&(t.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,babel_options:{targets:{chrome:"79"}}}),!0===e.index_html_enabled&&(t.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx"},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===e.bin_file_enabled&&(t.cli={format:"cjs",context:"global",babel:!1,browser:!0,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjsx",banner:"#!/usr/bin/env node",terser:!0}),e.babel_options=e.babel_options||e.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},e.browsersync_options=X({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},e.browsersync_options||e.browsersync?.options||{}),e.replace_options=X({},e.replace_options||e.replace?.options||{}),e.terser_options=X({},e.terser_options||e.terser?.options||{}),e.css_options=X({},e.css_options||e.css?.options||{}),e.wasm_options=X({},e.wasm_options||e.wasm?.options||{}),e.copy_options=X(i,e.copy_options||e.copy?.options||{}),e.json_options=X({},e.json_options||e.json?.options||{}),e.image_options=X({},e.image_options||e.image?.options||{}),e.rollup_output=X(t,e.rollup_output||e.rollup?.output||e.rollup||{});const a=Object.keys(t);for(const i of a){const a=t[i];a&&(a.babel_options=a.babel_options||e.babel_options,a.browsersync_options=X(e.browsersync_options,a.browsersync_options),a.replace_options=X(e.replace_options,a.replace_options),a.terser_options=X(e.terser_options,a.terser_options),a.css_options=X(e.css_options,a.css_options),a.wasm_options=X(e.wasm_options,a.wasm_options),a.copy_options=X(e.copy_options,a.copy_options),a.json_options=X(e.json_options,a.json_options),a.image_options=X(e.image_options,a.image_options),e.form_enabled&&(a.babel=!0))}e.babel_enabled=a.some((t=>!0===e.rollup_output[t].babel)),e.browser_enabled=a.some((t=>!0===e.rollup_output[t].babel)),e.browsersync_enabled=a.some((t=>!0===e.rollup_output[t].browsersync)),e.browsersync_enabled=e.browsersync_enabled&&(e.form_enabled||!0===e.browser_autorun),e.wasm_enabled=!0===e.wasm||e.wasm&&!1!==e.wasm?.enabled,e.css_enabled=!0===e.css||e.css&&!1!==e.css?.enabled,e.json_enabled=!0===e.json||e.json&&!1!==e.json?.enabled,e.terser_enabled=!0===e.terser||e.terser&&!1!==e.terser?.enabled,e.copy_enabled=e.form_enabled||e.copy_enabled||e.copy&&!1!==e.copy?.enabled,e.image_enabled=!0===e.image||e.image&&!1!==e.image?.enabled,e.bin_name=e.bin_name||e.bin?.name||e.bin,e.bin_enabled=e.bin_name&&("string"==typeof e.bin_name)(e.bin_enabled||!1!==e.bin?.enabled),e.dependency_auto_enabled=!1!==e.dependency_auto&&!1!==e.dependency_auto?.enabled,e.npm_install_flags=e.npm_install_flags||"",e.react_version=e.react_version||e.react?.version||18}async initDependencies(){if(this.#i.doc.features.form_enabled&&this.#i.doc.features.dependency_auto_enabled){let e="^18.2";e=`^${(await re({name:"react",groupBy:{major:!0}})).find((e=>e[0]===this.#i.doc.features.react_version.toString()))[0]}`,this.#s.push({package:"react",version:e}),this.#s.push({package:"react-dom",version:e})}this.#s.push({package:"chalk",version:"^4"}),this.#n.push({package:"@babel/core",version:"^7.23"}),this.#n.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),this.#n.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),this.#n.push({package:"@rollup/plugin-replace",version:"^5.0"}),this.#n.push({package:"rollup",version:"^3.26"}),this.#n.push({package:"rollup-plugin-delete",version:"^2.0"}),this.#n.push({package:"rollup-plugin-dts",version:"^6.0"}),this.#n.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),this.#i.doc.features.babel_enabled&&(this.#n.push({package:"@rollup/plugin-babel",version:"^6.0"}),this.#n.push({package:"@babel/preset-env",version:"7.22"}),this.#n.push({package:"@babel/preset-react",version:"7.22"})),this.#i.doc.features.browsersync_enabled&&this.#n.push({package:"rollup-plugin-browsersync",version:"^1.3"}),this.#i.doc.features.json_enabled&&this.#n.push({package:"@rollup/plugin-json",version:"^6.0"}),this.#i.doc.features.terser_enabled&&this.#n.push({package:"@rollup/plugin-terser",version:"^0.4"}),this.#i.doc.features.wasm_enabled&&this.#n.push({package:"@rollup/plugin-wasm",version:"^6.1"}),this.#i.doc.features.image_enabled&&this.#n.push({package:"@rollup/plugin-image",version:"^3.0"}),this.#i.doc.features.css_enabled&&(this.#n.push({package:"rollup-plugin-postcss",version:"4.0"}),this.#n.push({package:"sass",version:"^1.66"})),this.#i.doc.features.copy_enabled&&this.#n.push({package:"rollup-plugin-copy",version:"^3.5"})}async initLibraryDir(){const e=this.#t.projectDir;let t;const i=["node_modules"];if(N.existsSync(e)&&N.readdirSync(e).forEach((a=>{i.includes(a)||(t=G.rm("-rf",M.join(e,a)))})),t=G.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=G.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=G.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=G.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#a=J.configure(e,{watch:!1,dev:!0})}async initLibs(){const e=[{name:this.#i.doc.name,type:"atom",parent_id:this.#i.parent_id}];this.#o=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#s})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const i=e.filter((e=>"atom"===e.type));for(let e=0;e<i.length;e++){const a=i[e],o=await this.findAtomLibrary({url:a.name});a.atom=o;const s=o.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));s?.forEach((e=>{const i=t.find((t=>t.package===e.package));i?"string"==typeof e.path?(i.path||[]).some((t=>t===e.path))||(i.path=i.path||[],i.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(i.path||[]).some((t=>t===e))||(i.path=i.path||[],i.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const t=te({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#d),"ac:"===t.protocol){const i=t.pathname.split("/");if(1===i.length)return await V.first({where:{name:e,parent_id:this.#p.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===i.length){const e=await V.first({where:{name:i[0],parent_id:this.#p.env.ATOM_LIBRARIES_ID,type:"folder"}});return await V.first({where:{name:i[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#i;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=M.resolve(this.#t.projectSrcDir,"index.js"),i=await ae({file:t,recursive:!0}),a=e.doc.dependencies,o=!0===this.#i.doc.features.all_parsed_imports?i.all:i.required;for await(const e of o){if("npm"!==e.type)continue;if(a.find((t=>t.package===e.package)))continue;const t=await oe({name:e.package,count:1});a.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#i.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const i=t[e].atom,a=this.#t.projectDir;if("local:"===i.protocol){const e=M.resolve(this.#t.projectSrcDir,`${i.fileName||i.name}.js`),t=M.relative(`${this.#t.projectDir}/src/default/`,e);if(!N.existsSync(e)){N.mkdirSync(M.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",N.writeFileSync(e,t,"utf8")}i.relativePath=t,this.#i.typesDir="./types/target/src"}else{const e=`${a}/src/libs/${i.id}.js`,t=i.doc.contents?.find((e=>"esm"===e.format))||i.doc;N.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#o.filter((e=>"atom"===e.type)),libraryAtom:this.#i,atom:this.#i},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,o=M.resolve(a,"src/default/index.js");N.writeFileSync(o,i,"utf8")}async createRollup(){await this.setInProgress({message:"Creating rollup file."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"rollup.config.js.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,o=M.resolve(a,"rollup.config.js");N.writeFileSync(o,i,"utf8")}async createPackageJSON(){await this.setInProgress({message:"Creating package.json."});const e=this.#s.find((e=>"react"===e.package)),t=this.#s.find((e=>"react-dom"===e.package));e&&!t?this.#s.push({package:"react-dom",version:e.version}):e&&t&&(t.version=e.version),e&&this.#i.doc.features.react_version>=17&&(this.#s.find((e=>"@emotion/react"===e.package))||this.#s.push({package:"@emotion/react",version:"^11"}),this.#s.find((e=>"@emotion/styled"===e.package))||this.#s.push({package:"@emotion/styled",version:"^11"}));const i=[];!0===this.#i.doc.features.index_html_enabled&&i.push(M.resolve(this.#t.projectDir,"src/app/index.js")),!0===this.#i.doc.features.bin_file_enabled&&i.push(M.resolve(this.#t.projectDir,"src/cli/index.js"));for await(const e of i){const t=e;if(!N.existsSync(t))throw new Error(`App file not found: ${t}`);const i=await ae({file:t,recursive:!0}),a=!0===this.#i.doc.features.all_parsed_imports?i.all:i.required;for await(const e of a){if("npm"!==e.type)continue;if(this.#s.find((t=>t.package===e.package)))continue;if(this.#n.find((t=>t.package===e.package)))continue;const t=(await re({name:e.package,groupBy:{minor:!0}}))[0][0];this.#n.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const a={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s,packageDevDependencies:this.#n},o=this.#t.templateDir,s=J.compile(N.readFileSync(M.resolve(o,"package.json.njk"),"utf8"),this.#a).render(a),n=this.#t.projectDir,r=M.resolve(n,"package.json");N.writeFileSync(r,s,"utf8")}async createBin(){if(!0!==this.#i.doc.features.bin_file_enabled)return;await this.setInProgress({message:"Creating bin."});const e=this.#t.projectDir;if(0!==G.exec(`mkdir ${e}/src/cli`).code)throw new Error("Couldnt create src/cli dir.");const t={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s},i=this.#t.templateDir;let a=J.compile(N.readFileSync(M.resolve(i,"src/cli/index.js.njk"),"utf8"),this.#a).render(t),o=M.resolve(e,"src/cli/index.js");N.writeFileSync(o,a,"utf8")}async createIndexHtml(){if(!this.#i.doc.features.index_html_enabled)return;await this.setInProgress({message:"Creating index.html."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s,ts:Date.now()},t=this.#t.templateDir,i=M.resolve(this.#t.projectDir,"src/app");N.existsSync(i)||N.mkdirSync(i,{recursive:!0}),await ne({dir:M.resolve(t,"src/app"),outDir:i,context:e})}async createTsConfig(){await this.setInProgress({message:"Creating tsconfig.json."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"tsconfig.json.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,o=M.resolve(a,"tsconfig.json");N.writeFileSync(o,i,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#s},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,".gitignore.njk"),"utf8"),this.#a).render(e),a=this.#t.projectDir,o=M.resolve(a,".gitignore");N.writeFileSync(o,i,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:i,...a}=this.#i.doc,o={content:B.dump(a)},s=this.#t.templateDir,n=J.compile(N.readFileSync(M.resolve(s,`${e}.njk`),"utf8"),this.#a).render(o),r=this.#t.projectDir,c=M.resolve(r,`${e}`);N.writeFileSync(c,n,"utf8")}async createProjectReadme(){const e="readme.md",t=`Creating ${e}`;if(await this.setInProgress({message:t}),this.#t.project?.readme){const t={content:this.#t.project.readme.doc.content},i=this.#t.templateDir,a=J.compile(N.readFileSync(M.resolve(i,`${e}.njk`),"utf8"),this.#a).render(t),o=this.#t.projectDir,s=M.resolve(o,`${e}`);N.writeFileSync(s,a,"utf8")}else if(this.#i.id){const t=await V.first({type:"wiki",parent_id:this.#i.id});if(!t||"markdown"!==t.doc?.["content-type"])return;const{content:i,...a}=t.doc,o={content:i},s=this.#t.templateDir,n=J.compile(N.readFileSync(M.resolve(s,`${e}.njk`),"utf8"),this.#a).render(o),r=this.#t.projectDir,c=M.resolve(r,`${e}`);N.writeFileSync(c,n,"utf8")}}async createToYargs(){if(!0===this.#i.doc.features.form_enabled)return;await this.setInProgress({message:"Creating yargs."});const e={},t=this.#i.doc.inputs||[],i=[];t.forEach((t=>{if(!1===t.cli||!t.name)return;t.import&&i.push(t);const a={};t.type&&(a.type=t.type),t.default&&(a.default=t.default),t.choices&&(a.choices=t.choices),(t.describe||t.description)&&(a.describe=t.describe||t.description),t.alias&&(a.alias=t.alias),!0===t.required&&(a.required=!0),!0===t.hidden&&(a.hidden=!0),!0===t.array&&(a.array=!0),!0===t.normalize&&(a.normalize=!0),t.nargs&&(a.nargs=t.nargs),e[t.name]=a}));const a={options:e,imports:i,atom:this.#i},o=this.#t.templateDir,s=J.compile(N.readFileSync(M.resolve(o,"src/default/to.yargs.js.njk"),"utf8"),this.#a).render(a),n=this.#t.projectDir,r=M.resolve(n,"src/default/to.yargs.js");N.writeFileSync(r,s,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=G.exec(`npm install ${this.#i.doc.features.npm_install_flags}`,{cwd:e});if(0!==t.code)throw new Error("Couldnt install npm packages.");if(await this.setInProgress({message:"Prettifiying source files."}),t=G.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:e}),0!==t.code)throw new Error("Couldnt format files.");if(await this.setInProgress({message:"Creating .d.ts"}),t=G.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=G.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build library project.")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&await i.save()}}else if(this.#i.id){const e=await V.list({type:"library.deploy",parent_id:this.#i.id});for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&(i=await V.update(i,{id:i.id}))}}}async deployProject(e){const{deploymentProject:t}=e,i=t.doc.targets||[];for(let e=0;e<i.length;e++){const a=i[e];await this.deployProjectTarget({deploymentProject:t,deploymentProjectTarget:a})}}async deployProjectTarget(e){const{deploymentProjectTarget:t,deploymentProject:i}=e;if(!0===t.enabled)if(t.name===this.#p.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#p.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#p.env.ATOM_DEPLOY_NPM_TARGET)await this.deployAsNpm(e);else if("pm"===t.name)await this.deployAsPm(e);else if("gitlab"===t.name)await this.deployAsGitlab(e);else{let e;if("nextjs"===t.name&&(e=se),!e)return;await e({atom:this.#i,target:t,onProgress:this.setInProgress.bind(this),projectDir:this.#t.projectDir,dependencies:this.#s}),t.build={id:this.#c,ts:Date.now()},i.isDirty=!0}}async deployAsWorkflowLib(e){if(await this.setInProgress({message:"Deploying it as workflow lib."}),!0===i.dryRun)return;const{deploymentProject:t,deploymentProjectTarget:i}=e;let a;if(i.deploy.id){if(a=await V.get({id:i.deploy.id}),!a)return}else{if(a=await V.create({parent_id:this.#p.env.ATOM_LIBRARIES_ID,doc:{name:i.deploy.name,type:"workflow.lib",dependencies:[],content:void 0,subtype:"library"}}),!a)return;i.deploy.id=a.id,t.isDirty=!0}const o=this.#t.projectDir;a.doc.contents=[{content:N.readFileSync(M.resolve(o,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:N.readFileSync(M.resolve(o,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:N.readFileSync(M.resolve(o,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],a.doc.name=i.deploy.name,a.doc.dependencies=this.#s,a.doc.subtype="workflow",a=await V.update(a,{id:a.id})}async deployAsRedFlow(e){await this.setInProgress({message:"Deploying it as node-red flow."});const{deploymentProject:t,deploymentProjectTarget:i}=e,a=this.#t.projectDir,o=this.#t.templateDir,s=this.#i;let n;if("simple"===i.deploy.template)n={atom:s,packageDependencies:this.#s,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${s.id?s.id:W.hostname()}/${s.name}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:s.doc.name,initialize:{content:N.readFileSync(M.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},inject:{id:Y.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:Y.util.generateId()}}};else if("cronjob"===i.deploy.template){let e=i.deploy.params?.schedules?K(i.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),n={atom:s,packageDependencies:this.#s,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${s.id?s.id:W.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:s.doc.name,initialize:{content:N.readFileSync(M.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},cronjob:{id:Y.util.generateId(),schedules:e},debug:{id:Y.util.generateId()}}}}else{if("http"!==i.deploy.template)return;n={atom:s,packageDependencies:this.#s,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${s.id?s.id:W.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:s.doc.name,initialize:{content:N.readFileSync(M.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:s.doc.bundleName}},httpin:{id:Y.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:Y.util.generateId()},debug:{id:Y.util.generateId()}}}}let r=J.compile(N.readFileSync(M.resolve(o,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),this.#a).render(n);if(N.writeFileSync(M.resolve(a,"node-red.yaml"),r),r=B.load(r),!0===i.dryRun)return;t.isDirty=!0,i.build={id:this.#c,ts:Date.now()};const c=i.deploy.url||this.#h.env.RED_URL,l={};if(!1!==i.deploy.auth&&(l.Authorization="Bearer "+this.#r),i.deploy.id)!0===i.actions?.delete?(await U({method:"DELETE",url:`${c}/flow/${i.deploy.id}`,headers:l}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await U({method:"PUT",url:`${c}/flow/${i.deploy.id}`,data:r,headers:l});else{const e=await U({method:"POST",url:`${c}/flow`,data:r,headers:l});i.deploy.id=e.data.id}}async deployAsNpm(e){await this.setInProgress({message:"Deploying it as npm package."});const{deploymentProject:t,deploymentProjectTarget:i}=e,a=this.#t.projectDir,o=M.resolve(a,"package.json"),s=N.readFileSync(o),n=JSON.parse(s);n.name=i.deploy.params.name,n.version=z.inc(i.deploy.params.version,"patch");const r=i.deploy.params.bin?.name||i.deploy.params.bin;if(!1!==i.deploy.params.bin?.enabled&&r&&"string"==typeof r&&(n.bin={[r]:"dist/cli/cjsx/index.js",[this.#i.doc.name]:"dist/cli/cjsx/index.js"}),delete n.scripts,delete n.devDependencies,n.scripts={serve:"npx serve ."},N.writeFileSync(o,JSON.stringify(n,null,"\t")),N.writeFileSync(M.resolve(a,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#m.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==G.exec("npm publish --access public",{cwd:a}).code)throw new Error("Couldnt publish to npm");N.writeFileSync(o,s),t.isDirty=!0,i.deploy.params.version=n.version,i.build={id:this.#c,ts:Date.now()}}async deployAsPm(e){await this.setInProgress({message:"Deploying it as pm package."});const{deploymentProject:t,deploymentProjectTarget:i}=e,a=this.#t.projectDir,o=M.resolve(a,"package.json"),s=N.readFileSync(o),n=JSON.parse(s);n.name=i.deploy.params.name,n.version=z.inc(i.deploy.params.version,"patch"),delete n.scripts,delete n.devDependencies,N.writeFileSync(o,JSON.stringify(n,null,"\t"));const{file:r,data:c}=await ie({name:i.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${M.resolve(M.dirname(r),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${a}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${n.name}/${n.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===i.dryRun&&(l+=" --dryRun"),await ee({command:l}),N.writeFileSync(o,s),!0!==i.dryRun&&(t.isDirty=!0,i.deploy.params.version=n.version,i.build={id:this.#c,ts:Date.now()},await this.registerToPackageManager({target:i,packageJSON:n}))}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:i}=e,a=this.#t.projectDir;let o="fnet-to-gitlab";const s=i.deploy.params.config||"gitlab",n=ie({name:s,dir:this.#t.projectDir});if(!n)throw new Error(`Couldnt load config ${s}`);const{data:r}=n.data;o+=` --projectGroupId=${r.projectGroupId}`,o+=` --projectPath='${a}'`,o+=` --projectName='${i.deploy.params.name}'`,o+=` --projectBranch='${i.deploy.params.branch||"main"}'`,o+=` --gitlabHost='${r.gitlabHost}'`,o+=` --gitlabToken='${r.gitlabToken}'`,o+=` --gitlabUsername='${r.gitlabUsername}'`,o+=` --gitlabUserEmail='${r.gitlabUserEmail}'`,!0!==i.dryRun&&(await ee({command:o}),t.isDirty=!0,i.build={id:this.#c,ts:Date.now()})}async registerToPackageManager(e){const{target:t,packageJSON:i}=e;let a=await V.first({name:t.deploy.params.name,parent_id:this.#p.env.ATOM_PACKAGES_ID});a?(a.doc.versions.splice(0,0,{v:i.version}),await V.update(a,{id:a.id})):a=await V.create({parent_id:this.#p.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:i.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#g&&(await this.createAtomLibFiles({libs:this.#o}),await this.createEngine(),await this.createTsConfig(),await this.createGitIgnore(),await this.createProjectYaml(),await this.createProjectReadme(),await this.createToYargs(),await this.createBin(),await this.createIndexHtml(),await this.createRollup(),await this.createPackageJSON(),this.#y&&(await this.runBuildScripts(),this.#f&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const le=c,de=l;var pe=function({baseDir:e=__dirname}){let t=e;for(;t!==de.parse(t).root;){const e=de.join(t,"node_modules");if(le.existsSync(e))return e;t=de.dirname(t)}return null};const me=process.cwd();console.log(`cwd: ${me}`),e({name:["redis"],dir:me});const he=t,ue=i,{hideBin:ge}=a,ye=o,fe=s,be=n,we=r,je=ce,_e=pe({baseDir:__dirname});async function ve(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:he.resolve(_e,"./@flownet/template-node-library/default"),projectDir:he.resolve(me,`./.output/${e.id}`),coreDir:he.resolve(_e,"./@flownet/template-node-library/core")};{const t=await async function(){const e=he.resolve(me,"node.yaml");if(!ye.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=ye.readFileSync(e,"utf8"),i=fe.parse(t),a=he.dirname(e),o={libraryAtom:{doc:{...i,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:a,projectFilePath:e,projectFileContent:t,projectFileParsed:i},s=he.resolve(a,"node.devops.yaml");if(ye.existsSync(s)){const e=ye.readFileSync(s,"utf8"),t=fe.parse(e);o.devops={filePath:s,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{ye.writeFileSync(o.devops.filePath,fe.stringify(o.devops.doc))}}}const n=he.resolve(a,"node.readme.md");if(ye.existsSync(n)){const e=ye.readFileSync(n,"utf8");o.readme={filePath:n,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return o}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:he.resolve(_e,"./@flownet/template-node-library/default"),coreDir:he.resolve(_e,"./@flownet/template-node-library/core"),projectDir:he.resolve(t.projectDir,"./target"),projectSrcDir:he.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${_e}/.bin:${process.env.PATH}`,ue(ge(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=he.resolve(_e,"@flownet/template-node-library/project"),i=he.resolve(me,e.name);ye.existsSync(i)||ye.mkdirSync(i),await we({dir:t,outDir:i,context:e});let a=be.exec("fnode build",{cwd:i});if(0!==a.code)throw new Error("Failed to build project.");if(be.which("git")&&(a=be.exec("git init",{cwd:i}),0!==a.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.log("Initialization failed!",e),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await ve(e),i=new je(t);await i.init(),await i.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.log("Building library failed!",e),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,a=e.commands||[],o=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`npm ${a.join(" ")} ${o}`;be.exec(s,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,a=e.commands||[],o=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),s=`node ${a.join(" ")} ${o}`;be.exec(s,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,a=e.commands||[],o=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 ${a.join(" ")} ${o}`;be.exec(s,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,a=e.commands||[],o=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 ${a.join(" ")} ${o}`;be.exec(s,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
|
2
|
+
"use strict";var e=require("@flownet/lib-load-fnet-config"),t=require("path"),i=require("yargs/yargs"),s=require("yargs/helpers"),a=require("fs"),o=require("yaml"),n=require("shelljs"),r=require("@flownet/lib-render-templates-dir"),c=require("node:fs"),l=require("node:path"),d=require("js-yaml"),p=require("nunjucks"),m=require("lodash.clonedeep"),h=require("axios"),u=require("@node-red/util"),g=require("semver"),y=require("redis"),f=require("@flownet/lib-is-redis-online"),b=require("node:os"),w=require("lodash.merge"),j=require("nanoid"),_=require("@flownet/lib-atom-api-js"),v=require("qs"),D=require("@flownet/lib-execute-command-with-ipc-file"),k=require("@flownet/lib-parse-node-url"),x=require("@flownet/lib-parse-imports-js"),P=require("@flownet/lib-pick-npm-versions"),I=require("@flownet/lib-to-nextjs"),S=require("@flownet/lib-list-npm-versions");const $=y,E=f;const{Api:A}=_,C=h.default,F=v;const T=I,O=m,R=w,q=g,L=l;const N=c,M=l,B=d,G=n,J=p,K=m,U=h,Y=u,z=g,H=async()=>{if(!await E({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=$.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e},W=b,X=w,{nanoid:Z}=j,Q=class{init({config:e,accessToken:t}){return new Promise(((i,s)=>{if(A.set_api_url(e.data.url),t)return A.set_req_token(t),void i(t);C({method:"POST",url:`${e.data.issuer}/protocol/openid-connect/token`,data:F.stringify(e.data.grant.params),headers:{"Content-Type":"application/x-www-form-urlencoded"}}).then((e=>{A.set_req_token(e.data.access_token),i(e.data.access_token)})).catch((e=>{A.set_req_token(),s(e)}))}))}},{Atom:V}=_,ee=D,te=k,ie=e,se=x,ae=P,oe=async({atom:e,target:t,onProgress:i,projectDir:s,dependencies:a})=>{i&&await i({message:"Deploying it as nextjs package."});t.params=R({name:"nextjs-app",version:"0.1.0"},t.params);const o=q.inc(t.params.version,"patch");t.params.version=o;const n=O(t);n.params.dependencies=O(a);const r={atom:e,target:n.params,projectDir:s,renderDir:L.resolve(s,"nextjs")};return{deployer:await T(r)}},ne=r,re=S;var ce=class{#e;#t;#i;#s;#a;#o;#n;#r;#c;#l;#d;#p;#m;#h;#u;#g;#y;#f;constructor(e){this.#e=new Q,this.#t=e,this.#o=[],this.#n=[],this._expire_ttl=3600,this._expire_ttl_short=300}async _cache_set(e,t,i){this._redis_client&&await this._redis_client.SETEX(e,i||this._expire_ttl,JSON.stringify(t)).catch(console.error)}async init(){this._redis_client=await H(),this.#c=this.#t.buildId||Z(24),this.#u=this.#t.mode,this.#g=["all","deploy","build","file"].includes(this.#u),this.#y=["all","deploy","build"].includes(this.#u),this.#f=["all","deploy"].includes(this.#u),this.#d=this.#t.protocol,this.#l="BUILD:"+this.#c,this.#p=await(ie({name:this.#t.atomConfig||"atom",dir:this.#t.projectDir})?.data),this.#m=await(ie({name:this.#t.npmConfig||"npm",dir:this.#t.projectDir})?.data),this.#h=await(ie({name:this.#t.redConfig||"red",dir:this.#t.projectDir})?.data);try{await this.setInProgress({message:"Initialization started."}),await this.initAuth(),await this.initLibrary(),await this.initFeatures(),await this.initDependencies(),await this.initLibraryDir(),await this.initNunjucks(),await this.initLibs()}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e?.message||e}),e}}async initAuth(){this.#t.id&&(this.#r=await this.#e.init({config:this.#p}))}async initLibrary(){const e=this.#t.id;this.#i=this.#t.project?.libraryAtom||await V.get({id:e});let t=this.#i.doc.bundleName;t=t||(this.#i.doc.name||"").toUpperCase().replace(/[^A-Z0-9]/g,"_"),this.#i.doc.bundleName=t,this.#i.type=this.#i.type||"workflow.lib"}async initFeatures(){this.#i.doc.features=this.#i.doc.features||{};const e=this.#i.doc.features;e.form_enabled=!0===this.#i.doc.form||!0===this.#i.doc.form?.enabled||!0===e.form||!0===e.form?.enabled,e.browser_autorun=!0===e.browser?.autorun,e.multiple_enabled=e.multiple_enabled||!0===e.multiple||!0===e.multiple?.enabled,e.index_html_enabled=!0===this.#i.doc.features.form_enabled,e.bin_file_enabled=!1===this.#i.doc.features.form_enabled;const t={cjs:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!1,copy:!0,replace:!0,terser:!1},cjsx:{format:"cjs",context:e.form_enabled?"window":"global",babel:!1,browser:!0,replace:!0,enabled:!1,terser:!0},esm:{format:"esm",context:e.form_enabled?"window":"global",babel:!1,browser:!1,replace:!0,browsersync:!0,terser:!1},esmx:{format:"esm",browser:!0,babel:!0,context:e.form_enabled?"window":"global",replace:!0,browsersync:!1,enabled:!1,terser:!0},iife:{format:"iife",context:e.form_enabled?"window":"global",babel:!0,browser:!0,replace:!0,enabled:!1,terser:!0}},i={};!0===e.webos&&(t.webos={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,terser:!0,babel_options:{targets:{chrome:"79"}}}),!0===e.index_html_enabled&&(t.app={format:"esm",browser:!0,babel:!0,context:"window",replace:!0,input:"./src/app/index.js",output_dir:"./dist/app/esmx",terser:!0},i.targets=i.targets||[],i.targets.push({src:"./src/app/index.html",dest:"./dist/app/esmx"})),!0===e.bin_file_enabled&&(t.cli={format:"cjs",context:"global",babel:!1,browser:!0,replace:!0,enabled:!0,input:"./src/cli/index.js",output_dir:"./dist/cli/cjsx",banner:"#!/usr/bin/env node",terser:!0}),e.babel_options=e.babel_options||e.babel?.options||{targets:{browsers:"last 9 versions, not dead",node:"18"}},e.browsersync_options=X({server:".",startPath:"/dist/app/esmx/index.html",files:["./dist/**/*"]},e.browsersync_options||e.browsersync?.options||{}),e.replace_options=X({},e.replace_options||e.replace?.options||{}),e.terser_options=X({},e.terser_options||e.terser?.options||{}),e.css_options=X({},e.css_options||e.css?.options||{}),e.wasm_options=X({},e.wasm_options||e.wasm?.options||{}),e.copy_options=X(i,e.copy_options||e.copy?.options||{}),e.json_options=X({},e.json_options||e.json?.options||{}),e.image_options=X({},e.image_options||e.image?.options||{}),e.rollup_output=X(t,e.rollup_output||e.rollup?.output||e.rollup||{});const s=Object.keys(t);for(const i of s){const s=t[i];s&&(s.babel_options=s.babel_options||e.babel_options,s.browsersync_options=X(e.browsersync_options,s.browsersync_options),s.replace_options=X(e.replace_options,s.replace_options),s.terser_options=X(e.terser_options,s.terser_options),s.css_options=X(e.css_options,s.css_options),s.wasm_options=X(e.wasm_options,s.wasm_options),s.copy_options=X(e.copy_options,s.copy_options),s.json_options=X(e.json_options,s.json_options),s.image_options=X(e.image_options,s.image_options),e.form_enabled&&(s.babel=!0))}e.babel_enabled=s.some((t=>!0===e.rollup_output[t].babel)),e.browser_enabled=s.some((t=>!0===e.rollup_output[t].babel)),e.browsersync_enabled=s.some((t=>!0===e.rollup_output[t].browsersync)),e.browsersync_enabled=e.browsersync_enabled&&(e.form_enabled||!0===e.browser_autorun),e.wasm_enabled=!0===e.wasm||e.wasm&&!1!==e.wasm?.enabled,e.css_enabled=!0===e.css||e.css&&!1!==e.css?.enabled,e.json_enabled=!0===e.json||e.json&&!1!==e.json?.enabled,e.terser_enabled=!0===e.terser||e.terser&&!1!==e.terser?.enabled,e.copy_enabled=e.form_enabled||e.copy_enabled||e.copy&&!1!==e.copy?.enabled,e.image_enabled=!0===e.image||e.image&&!1!==e.image?.enabled,e.bin_name=e.bin_name||e.bin?.name||e.bin,e.bin_enabled=e.bin_name&&("string"==typeof e.bin_name)(e.bin_enabled||!1!==e.bin?.enabled),e.dependency_auto_enabled=!1!==e.dependency_auto&&!1!==e.dependency_auto?.enabled,e.npm_install_flags=e.npm_install_flags||"",e.react_version=e.react_version||e.react?.version||18}async initDependencies(){if(this.#i.doc.features.form_enabled&&this.#i.doc.features.dependency_auto_enabled){let e="^18.2";e=`^${(await re({name:"react",groupBy:{major:!0}})).find((e=>e[0]===this.#i.doc.features.react_version.toString()))[0]}`,this.#o.push({package:"react",version:e}),this.#o.push({package:"react-dom",version:e})}this.#o.push({package:"chalk",version:"^4"}),this.#n.push({package:"@babel/core",version:"^7.23"}),this.#n.push({package:"@rollup/plugin-commonjs",version:"^25.0"}),this.#n.push({package:"@rollup/plugin-node-resolve",version:"^15.1"}),this.#n.push({package:"@rollup/plugin-replace",version:"^5.0"}),this.#n.push({package:"rollup",version:"^3.26"}),this.#n.push({package:"rollup-plugin-delete",version:"^2.0"}),this.#n.push({package:"rollup-plugin-dts",version:"^6.0"}),this.#n.push({package:"rollup-plugin-peer-deps-external",version:"^2.2"}),this.#i.doc.features.babel_enabled&&(this.#n.push({package:"@rollup/plugin-babel",version:"^6.0"}),this.#n.push({package:"@babel/preset-env",version:"7.22"}),this.#n.push({package:"@babel/preset-react",version:"7.22"})),this.#i.doc.features.browsersync_enabled&&this.#n.push({package:"rollup-plugin-browsersync",version:"^1.3"}),this.#i.doc.features.json_enabled&&this.#n.push({package:"@rollup/plugin-json",version:"^6.0"}),this.#i.doc.features.terser_enabled&&this.#n.push({package:"@rollup/plugin-terser",version:"^0.4"}),this.#i.doc.features.wasm_enabled&&this.#n.push({package:"@rollup/plugin-wasm",version:"^6.1"}),this.#i.doc.features.image_enabled&&this.#n.push({package:"@rollup/plugin-image",version:"^3.0"}),this.#i.doc.features.css_enabled&&(this.#n.push({package:"rollup-plugin-postcss",version:"4.0"}),this.#n.push({package:"sass",version:"^1.66"})),this.#i.doc.features.copy_enabled&&this.#n.push({package:"rollup-plugin-copy",version:"^3.5"})}async initLibraryDir(){const e=this.#t.projectDir;let t;const i=["node_modules"];if(N.existsSync(e)&&N.readdirSync(e).forEach((s=>{i.includes(s)||(t=G.rm("-rf",M.join(e,s)))})),t=G.exec(`mkdir -p ${e}`),0!==t.code)throw new Error("Couldnt create workflow dir.");if(t=G.exec(`mkdir ${e}/src`),0!==t.code)throw new Error("Couldnt create library/src dir.");if(t=G.exec(`mkdir ${e}/src/default`),0!==t.code)throw new Error("Couldnt create library/src/default dir.");if(t=G.exec(`mkdir -p ${e}/src/libs`),0!==t.code)throw new Error("Couldnt create library/src/libs dir.")}async initNunjucks(){const e=this.#t.templateDir;this.#s=J.configure(e,{watch:!1,dev:!0})}async initLibs(){const e=[{name:this.#i.doc.name,type:"atom",parent_id:this.#i.parent_id}];this.#a=e,await this.initAtomLibsAndDeps({libs:e,packageDependencies:this.#o})}async initAtomLibsAndDeps({libs:e,packageDependencies:t}){const i=e.filter((e=>"atom"===e.type));for(let e=0;e<i.length;e++){const s=i[e],a=await this.findAtomLibrary({url:s.name});s.atom=a;const o=a.doc.dependencies?.filter((e=>void 0===e.repo||"npm"===e.repo));o?.forEach((e=>{const i=t.find((t=>t.package===e.package));i?"string"==typeof e.path?(i.path||[]).some((t=>t===e.path))||(i.path=i.path||[],i.path.push(e.path)):Array.isArray(e.path)&&e.path.forEach((e=>{(i.path||[]).some((t=>t===e))||(i.path=i.path||[],i.path.push(e))})):t.push(e)}))}t.sort(((e,t)=>e.package?.localeCompare(t.package)))}async findAtomLibrary({url:e}){const t=te({url:e});if(!t)throw new Error(`Invalid package name: ${e}`);if(t.protocol||(t.protocol=this.#d),"ac:"===t.protocol){const i=t.pathname.split("/");if(1===i.length)return await V.first({where:{name:e,parent_id:this.#p.env.ATOM_LIBRARIES_ID,type:"workflow.lib"}});if(2===i.length){const e=await V.first({where:{name:i[0],parent_id:this.#p.env.ATOM_LIBRARIES_ID,type:"folder"}});return await V.first({where:{name:i[1],parent_id:e.id,type:"workflow.lib"}})}}else if("local:"===t.protocol){const e=this.#i;e.protocol="local:",e.doc.dependencies=e.doc.dependencies||[],e.name=e.doc.name;const t=M.resolve(this.#t.projectSrcDir,"index.js"),i=await se({file:t,recursive:!0}),s=e.doc.dependencies,a=!0===this.#i.doc.features.all_parsed_imports?i.all:i.required;for await(const e of a){if("npm"!==e.type)continue;if(s.find((t=>t.package===e.package)))continue;const t=await ae({name:e.package,count:1});s.push({package:e.package,subpath:e.subpath,version:t.minorRange,type:"npm"})}return e}}async createAtomLibFiles({libs:e}){await this.setInProgress({message:"Creating external lib files."}),this.#i.typesDir="./types";const t=e.filter((e=>"atom"===e.type));for(let e=0;e<t.length;e++){const i=t[e].atom,s=this.#t.projectDir;if("local:"===i.protocol){const e=M.resolve(this.#t.projectSrcDir,`${i.fileName||i.name}.js`),t=M.relative(`${this.#t.projectDir}/src/default/`,e);if(!N.existsSync(e)){N.mkdirSync(M.dirname(e),{recursive:!0});let t="export default async (args)=>{\n";t+="}",N.writeFileSync(e,t,"utf8")}i.relativePath=t,this.#i.typesDir="./types/target/src"}else{const e=`${s}/src/libs/${i.id}.js`,t=i.doc.contents?.find((e=>"esm"===e.format))||i.doc;N.writeFileSync(e,t.content,"utf8")}}}async createEngine(){await this.setInProgress({message:"Creating engine file."});const e={libs:this.#a.filter((e=>"atom"===e.type)),libraryAtom:this.#i,atom:this.#i},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"src/default/engine.js.njk"),"utf8"),this.#s).render(e),s=this.#t.projectDir,a=M.resolve(s,"src/default/index.js");N.writeFileSync(a,i,"utf8")}async createRollup(){await this.setInProgress({message:"Creating rollup file."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"rollup.config.js.njk"),"utf8"),this.#s).render(e),s=this.#t.projectDir,a=M.resolve(s,"rollup.config.js");N.writeFileSync(a,i,"utf8")}async createPackageJSON(){await this.setInProgress({message:"Creating package.json."});const e=this.#o.find((e=>"react"===e.package)),t=this.#o.find((e=>"react-dom"===e.package));e&&!t?this.#o.push({package:"react-dom",version:e.version}):e&&t&&(t.version=e.version),e&&this.#i.doc.features.react_version>=17&&(this.#o.find((e=>"@emotion/react"===e.package))||this.#o.push({package:"@emotion/react",version:"^11"}),this.#o.find((e=>"@emotion/styled"===e.package))||this.#o.push({package:"@emotion/styled",version:"^11"}));const i=[];!0===this.#i.doc.features.index_html_enabled&&i.push(M.resolve(this.#t.projectDir,"src/app/index.js")),!0===this.#i.doc.features.bin_file_enabled&&i.push(M.resolve(this.#t.projectDir,"src/cli/index.js"));for await(const e of i){const t=e;if(!N.existsSync(t))throw new Error(`App file not found: ${t}`);const i=await se({file:t,recursive:!0}),s=!0===this.#i.doc.features.all_parsed_imports?i.all:i.required;for await(const e of s){if("npm"!==e.type)continue;if(this.#o.find((t=>t.package===e.package)))continue;if(this.#n.find((t=>t.package===e.package)))continue;const t=(await re({name:e.package,groupBy:{minor:!0}}))[0][0];this.#n.push({package:e.package,subpath:e.subpath,version:`^${t}`,type:"npm"})}}const s={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o,packageDevDependencies:this.#n},a=this.#t.templateDir,o=J.compile(N.readFileSync(M.resolve(a,"package.json.njk"),"utf8"),this.#s).render(s),n=this.#t.projectDir,r=M.resolve(n,"package.json");N.writeFileSync(r,o,"utf8")}async createBin(){if(!0!==this.#i.doc.features.bin_file_enabled)return;await this.setInProgress({message:"Creating bin."});const e=this.#t.projectDir;if(0!==G.exec(`mkdir ${e}/src/cli`).code)throw new Error("Couldnt create src/cli dir.");const t={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o},i=this.#t.templateDir;let s=J.compile(N.readFileSync(M.resolve(i,"src/cli/index.js.njk"),"utf8"),this.#s).render(t),a=M.resolve(e,"src/cli/index.js");N.writeFileSync(a,s,"utf8")}async createIndexHtml(){if(!this.#i.doc.features.index_html_enabled)return;await this.setInProgress({message:"Creating index.html."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o,ts:Date.now()},t=this.#t.templateDir,i=M.resolve(this.#t.projectDir,"src/app");N.existsSync(i)||N.mkdirSync(i,{recursive:!0}),await ne({dir:M.resolve(t,"src/app"),outDir:i,context:e})}async createTsConfig(){await this.setInProgress({message:"Creating tsconfig.json."});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,"tsconfig.json.njk"),"utf8"),this.#s).render(e),s=this.#t.projectDir,a=M.resolve(s,"tsconfig.json");N.writeFileSync(a,i,"utf8")}async createGitIgnore(){await this.setInProgress({message:"Creating .gitignore"});const e={libraryAtom:this.#i,atom:this.#i,packageDependencies:this.#o},t=this.#t.templateDir,i=J.compile(N.readFileSync(M.resolve(t,".gitignore.njk"),"utf8"),this.#s).render(e),s=this.#t.projectDir,a=M.resolve(s,".gitignore");N.writeFileSync(a,i,"utf8")}async createProjectYaml(){const e="node.yaml",t=`Creating ${e}`;await this.setInProgress({message:t});const{content:i,...s}=this.#i.doc,a={content:B.dump(s)},o=this.#t.templateDir,n=J.compile(N.readFileSync(M.resolve(o,`${e}.njk`),"utf8"),this.#s).render(a),r=this.#t.projectDir,c=M.resolve(r,`${e}`);N.writeFileSync(c,n,"utf8")}async createProjectReadme(){const e="readme.md",t=`Creating ${e}`;if(await this.setInProgress({message:t}),this.#t.project?.readme){const t={content:this.#t.project.readme.doc.content},i=this.#t.templateDir,s=J.compile(N.readFileSync(M.resolve(i,`${e}.njk`),"utf8"),this.#s).render(t),a=this.#t.projectDir,o=M.resolve(a,`${e}`);N.writeFileSync(o,s,"utf8")}else if(this.#i.id){const t=await V.first({type:"wiki",parent_id:this.#i.id});if(!t||"markdown"!==t.doc?.["content-type"])return;const{content:i,...s}=t.doc,a={content:i},o=this.#t.templateDir,n=J.compile(N.readFileSync(M.resolve(o,`${e}.njk`),"utf8"),this.#s).render(a),r=this.#t.projectDir,c=M.resolve(r,`${e}`);N.writeFileSync(c,n,"utf8")}}async createToYargs(){if(!0===this.#i.doc.features.form_enabled)return;await this.setInProgress({message:"Creating yargs."});const e={},t=this.#i.doc.inputs||[],i=[];t.forEach((t=>{if(!1===t.cli||!t.name)return;t.import&&i.push(t);const s={};t.type&&(s.type=t.type),t.default&&(s.default=t.default),t.choices&&(s.choices=t.choices),(t.describe||t.description)&&(s.describe=t.describe||t.description),t.alias&&(s.alias=t.alias),!0===t.required&&(s.required=!0),!0===t.hidden&&(s.hidden=!0),!0===t.array&&(s.array=!0),!0===t.normalize&&(s.normalize=!0),t.nargs&&(s.nargs=t.nargs),e[t.name]=s}));const s={options:e,imports:i,atom:this.#i},a=this.#t.templateDir,o=J.compile(N.readFileSync(M.resolve(a,"src/default/to.yargs.js.njk"),"utf8"),this.#s).render(s),n=this.#t.projectDir,r=M.resolve(n,"src/default/to.yargs.js");N.writeFileSync(r,o,"utf8")}async runBuildScripts(){const e=this.#t.projectDir;await this.setInProgress({message:"Installing npm packages."});let t=G.exec(`npm install ${this.#i.doc.features.npm_install_flags}`,{cwd:e});if(0!==t.code)throw new Error("Couldnt install npm packages.");if(await this.setInProgress({message:"Prettifiying source files."}),t=G.exec("prettier --write src/**/* bin/* *.{js,json,yaml,html} --no-error-on-unmatched-pattern",{cwd:e}),0!==t.code)throw new Error("Couldnt format files.");if(await this.setInProgress({message:"Creating .d.ts"}),t=G.exec("tsc",{cwd:e}),0!==t.code)throw new Error("Couldnt create .d.ts files.");if(await this.setInProgress({message:"Building main project."}),t=G.exec("npm run build",{cwd:e}),0!==t.code)throw new Error("Couldnt build library project.")}async deploy(){if(await this.setInProgress({message:"Deploying."}),this.#t.project?.devops){const e=[this.#t.project?.devops];for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&await i.save()}}else if(this.#i.id){const e=await V.list({type:"library.deploy",parent_id:this.#i.id});for(let t=0;t<e.length;t++){let i=e[t];await this.deployProject({deploymentProject:i}),!0===i.isDirty&&(i=await V.update(i,{id:i.id}))}}}async deployProject(e){const{deploymentProject:t}=e,i=t.doc.targets||[];for(let e=0;e<i.length;e++){const s=i[e];await this.deployProjectTarget({deploymentProject:t,deploymentProjectTarget:s})}}async deployProjectTarget(e){const{deploymentProjectTarget:t,deploymentProject:i}=e;if(!0===t.enabled)if(t.name===this.#p.env.ATOM_DEPLOY_LIBRARY_TARGET)await this.deployAsWorkflowLib(e);else if(t.name===this.#p.env.ATOM_DEPLOY_RED_TARGET)await this.deployAsRedFlow(e);else if(t.name===this.#p.env.ATOM_DEPLOY_NPM_TARGET)await this.deployAsNpm(e);else if("pm"===t.name)await this.deployAsPm(e);else if("gitlab"===t.name)await this.deployAsGitlab(e);else{let e;if("nextjs"===t.name&&(e=oe),!e)return;await e({atom:this.#i,target:t,onProgress:this.setInProgress.bind(this),projectDir:this.#t.projectDir,dependencies:this.#o}),t.build={id:this.#c,ts:Date.now()},i.isDirty=!0}}async deployAsWorkflowLib(e){if(await this.setInProgress({message:"Deploying it as workflow lib."}),!0===i.dryRun)return;const{deploymentProject:t,deploymentProjectTarget:i}=e;let s;if(i.deploy.id){if(s=await V.get({id:i.deploy.id}),!s)return}else{if(s=await V.create({parent_id:this.#p.env.ATOM_LIBRARIES_ID,doc:{name:i.deploy.name,type:"workflow.lib",dependencies:[],content:void 0,subtype:"library"}}),!s)return;i.deploy.id=s.id,t.isDirty=!0}const a=this.#t.projectDir;s.doc.contents=[{content:N.readFileSync(M.resolve(a,"dist/default/esm/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"esm"},{content:N.readFileSync(M.resolve(a,"dist/default/cjs/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"cjs"},{content:N.readFileSync(M.resolve(a,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),"content-type":"javascript",format:"iife"}],s.doc.name=i.deploy.name,s.doc.dependencies=this.#o,s.doc.subtype="workflow",s=await V.update(s,{id:s.id})}async deployAsRedFlow(e){await this.setInProgress({message:"Deploying it as node-red flow."});const{deploymentProject:t,deploymentProjectTarget:i}=e,s=this.#t.projectDir,a=this.#t.templateDir,o=this.#i;let n;if("simple"===i.deploy.template)n={atom:o,packageDependencies:this.#o,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${o.id?o.id:W.hostname()}/${o.name}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:o.doc.name,initialize:{content:N.readFileSync(M.resolve(s,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:o.doc.bundleName}},inject:{id:Y.util.generateId(),...i.deploy.params?.inject,payload:"json"===i.deploy.params?.inject?.payloadType?`'${JSON.stringify(i.deploy.params?.inject?.payload)}'`:i.deploy.params?.inject?.payload},debug:{id:Y.util.generateId()}}};else if("cronjob"===i.deploy.template){let e=i.deploy.params?.schedules?K(i.deploy.params?.schedules):void 0;e?.forEach((e=>{"json"===e.payloadType&&(e.payload=`'${JSON.stringify(e.payload)}'`)})),n={atom:o,packageDependencies:this.#o,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${o.id?o.id:W.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:o.doc.name,initialize:{content:N.readFileSync(M.resolve(s,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:o.doc.bundleName}},cronjob:{id:Y.util.generateId(),schedules:e},debug:{id:Y.util.generateId()}}}}else{if("http"!==i.deploy.template)return;n={atom:o,packageDependencies:this.#o,red:{tab:{id:i.deploy.id||Y.util.generateId(),label:`LIB/${o.id?o.id:W.hostname()}/${i.deploy.name||i.deploy.template}`},function:{id:Y.util.generateId(),name:o.doc.name,initialize:{content:N.readFileSync(M.resolve(s,"dist/default/iife/index.js"),{encoding:"utf8",flag:"r"}),var:o.doc.bundleName}},httpin:{id:Y.util.generateId(),method:i.deploy.params.method||"get",url:i.deploy.params.url},httpout:{id:Y.util.generateId()},debug:{id:Y.util.generateId()}}}}let r=J.compile(N.readFileSync(M.resolve(a,`deploy/node-red/${i.deploy.template}.yaml.njk`),"utf8"),this.#s).render(n);if(N.writeFileSync(M.resolve(s,"node-red.yaml"),r),r=B.load(r),!0===i.dryRun)return;t.isDirty=!0,i.build={id:this.#c,ts:Date.now()};const c=i.deploy.url||this.#h.env.RED_URL,l={};if(!1!==i.deploy.auth&&(l.Authorization="Bearer "+this.#r),i.deploy.id)!0===i.actions?.delete?(await U({method:"DELETE",url:`${c}/flow/${i.deploy.id}`,headers:l}),delete i.actions.delete,delete i.deploy.id,i.enabled=!1):await U({method:"PUT",url:`${c}/flow/${i.deploy.id}`,data:r,headers:l});else{const e=await U({method:"POST",url:`${c}/flow`,data:r,headers:l});i.deploy.id=e.data.id}}async deployAsNpm(e){await this.setInProgress({message:"Deploying it as npm package."});const{deploymentProject:t,deploymentProjectTarget:i}=e,s=this.#t.projectDir,a=M.resolve(s,"package.json"),o=N.readFileSync(a),n=JSON.parse(o);n.name=i.deploy.params.name,n.version=z.inc(i.deploy.params.version,"patch");const r=i.deploy.params.bin?.name||i.deploy.params.bin;if(!1!==i.deploy.params.bin?.enabled&&r&&"string"==typeof r&&(n.bin={[r]:"dist/cli/cjsx/index.js",[this.#i.doc.name]:"dist/cli/cjsx/index.js"}),delete n.scripts,delete n.devDependencies,n.scripts={serve:"npx serve ."},N.writeFileSync(a,JSON.stringify(n,null,"\t")),N.writeFileSync(M.resolve(s,".npmrc"),`//registry.npmjs.org/:_authToken=${this.#m.env.NPM_TOKEN}`),!0===i.dryRun)return;if(0!==G.exec("npm publish --access public",{cwd:s}).code)throw new Error("Couldnt publish to npm");N.writeFileSync(a,o),t.isDirty=!0,i.deploy.params.version=n.version,i.build={id:this.#c,ts:Date.now()}}async deployAsPm(e){await this.setInProgress({message:"Deploying it as pm package."});const{deploymentProject:t,deploymentProjectTarget:i}=e,s=this.#t.projectDir,a=M.resolve(s,"package.json"),o=N.readFileSync(a),n=JSON.parse(o);n.name=i.deploy.params.name,n.version=z.inc(i.deploy.params.version,"patch"),delete n.scripts,delete n.devDependencies,N.writeFileSync(a,JSON.stringify(n,null,"\t"));const{file:r,data:c}=await ie({name:i.deploy.params.pm?.config||this.#t.pmConfig||"pm",dir:this.#t.projectDir});let l="fnet-upload-files-to-gcs";l+=` --projectId='${c.env.PM_PROJECT_ID}'`,l+=` --bucketName='${c.env.PM_BUCKET_NAME}'`,l+=` --keyFilename='${M.resolve(M.dirname(r),c.env.PM_UPLOADER_KEY_FILE)}'`,l+=` --dir='${s}'`,l+=" --pattern={'dist/**/**','bin/**/**','test/**/**','*.html'}",l+=` --destDir='${n.name}/${n.version}'`,l+=" --headers.cacheControl='public, max-age=31536000, immutable'",!0===i.dryRun&&(l+=" --dryRun"),await ee({command:l}),N.writeFileSync(a,o),!0!==i.dryRun&&(t.isDirty=!0,i.deploy.params.version=n.version,i.build={id:this.#c,ts:Date.now()},await this.registerToPackageManager({target:i,packageJSON:n}))}async deployAsGitlab(e){await this.setInProgress({message:"Deploying it as gitlab project."});const{deploymentProject:t,deploymentProjectTarget:i}=e,s=this.#t.projectDir;let a="fnet-to-gitlab";const o=i.deploy.params.config||"gitlab",n=ie({name:o,dir:this.#t.projectDir});if(!n)throw new Error(`Couldnt load config ${o}`);const{data:r}=n.data;a+=` --projectGroupId=${r.projectGroupId}`,a+=` --projectPath='${s}'`,a+=` --projectName='${i.deploy.params.name}'`,a+=` --projectBranch='${i.deploy.params.branch||"main"}'`,a+=` --gitlabHost='${r.gitlabHost}'`,a+=` --gitlabToken='${r.gitlabToken}'`,a+=` --gitlabUsername='${r.gitlabUsername}'`,a+=` --gitlabUserEmail='${r.gitlabUserEmail}'`,!0!==i.dryRun&&(await ee({command:a}),t.isDirty=!0,i.build={id:this.#c,ts:Date.now()})}async registerToPackageManager(e){const{target:t,packageJSON:i}=e;let s=await V.first({name:t.deploy.params.name,parent_id:this.#p.env.ATOM_PACKAGES_ID});s?(s.doc.versions.splice(0,0,{v:i.version}),await V.update(s,{id:s.id})):s=await V.create({parent_id:this.#p.env.ATOM_PACKAGES_ID,doc:{name:t.deploy.params.name,type:"pm",versions:[{v:i.version}]}})}async setInProgress({message:e}){await this._cache_set(this.#l,{status:"IN_PROGRESS",message:e})}async build(){try{this.#g&&(await this.createAtomLibFiles({libs:this.#a}),await this.createEngine(),await this.createTsConfig(),await this.createGitIgnore(),await this.createProjectYaml(),await this.createProjectReadme(),await this.createToYargs(),await this.createBin(),await this.createIndexHtml(),await this.createRollup(),await this.createPackageJSON(),this.#y&&(await this.runBuildScripts(),this.#f&&await this.deploy())),await this._cache_set(this.#l,{status:"COMPLETED"})}catch(e){throw await this._cache_set(this.#l,{status:"FAILED",message:e.message||e}),e}}};const le=c,de=l;var pe=function({baseDir:e=__dirname}){let t=e;for(;t!==de.parse(t).root;){const e=de.join(t,"node_modules");if(le.existsSync(e))return e;t=de.dirname(t)}return null};const me=process.cwd();console.log(`cwd: ${me}`),e({name:["redis"],dir:me});const he=t,ue=i,{hideBin:ge}=s,ye=a,fe=o,be=n,we=r,je=ce,_e=pe({baseDir:__dirname});async function ve(e){if(e.id)return{id:e.id,buildId:e.buildId,mode:e.mode,protocol:e.protocol||"ac:",templateDir:he.resolve(_e,"./@flownet/template-node-library/default"),projectDir:he.resolve(me,`./.output/${e.id}`),coreDir:he.resolve(_e,"./@flownet/template-node-library/core")};{const t=await async function(){const e=he.resolve(me,"node.yaml");if(!ye.existsSync(e))throw new Error("node.yaml file not found in current directory.");const t=ye.readFileSync(e,"utf8"),i=fe.parse(t),s=he.dirname(e),a={libraryAtom:{doc:{...i,"content-type":"javascript",language:"js"},fileName:"index"},projectDir:s,projectFilePath:e,projectFileContent:t,projectFileParsed:i},o=he.resolve(s,"node.devops.yaml");if(ye.existsSync(o)){const e=ye.readFileSync(o,"utf8"),t=fe.parse(e);a.devops={filePath:o,fileContent:e,doc:{...t},type:"library.deploy",save:async()=>{ye.writeFileSync(a.devops.filePath,fe.stringify(a.devops.doc))}}}const n=he.resolve(s,"node.readme.md");if(ye.existsSync(n)){const e=ye.readFileSync(n,"utf8");a.readme={filePath:n,fileContent:e,doc:{content:e,"content-type":"markdown"},type:"wiki"}}return a}();return{buildId:e.buildId,mode:e.mode,protocol:e.protocol||"local:",templateDir:he.resolve(_e,"./@flownet/template-node-library/default"),coreDir:he.resolve(_e,"./@flownet/template-node-library/core"),projectDir:he.resolve(t.projectDir,"./target"),projectSrcDir:he.resolve(t.projectDir,"./src"),project:t}}}process.env.PATH=`${_e}/.bin:${process.env.PATH}`,ue(ge(process.argv)).command("create","Create flow node project",(e=>e.option("name",{type:"Project name",demandOption:!0})),(async e=>{try{const t=he.resolve(_e,"@flownet/template-node-library/project"),i=he.resolve(me,e.name);ye.existsSync(i)||ye.mkdirSync(i),await we({dir:t,outDir:i,context:e});let s=be.exec("fnode build",{cwd:i});if(0!==s.code)throw new Error("Failed to build project.");if(be.which("git")&&(s=be.exec("git init",{cwd:i}),0!==s.code))throw new Error("Failed to initialize git.");console.log("Creating project succeeded!"),process.exit(0)}catch(e){console.log("Initialization failed!",e),process.exit(1)}})).command("build","Build flow node project",(e=>e.option("id",{type:"string"}).option("buildId",{type:"string",alias:"bid"}).option("mode",{type:"string",alias:"m",default:"build",choices:["all","file","build","deploy","bpmn"]})),(async e=>{try{const t=await ve(e),i=new je(t);await i.init(),await i.build(),console.log("Building library succeeded!"),process.exit(0)}catch(e){console.log("Building library failed!",e),process.exit(1)}})).command("npm [commands..]","npm - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,s=e.commands||[],a=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),o=`npm ${s.join(" ")} ${a}`;be.exec(o,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("node [commands..]","node - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,s=e.commands||[],a=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),o=`node ${s.join(" ")} ${a}`;be.exec(o,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("serve [commands..]","npm run serve - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,s=e.commands||[],a=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),o=`npm run serve ${s.join(" ")} ${a}`;be.exec(o,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).command("watch [commands..]","npm run watch - bridge",(e=>e.option("id",{type:"string"})),(async e=>{try{const t=await ve(e),{projectDir:i}=t,s=e.commands||[],a=Object.keys(e).filter((t=>"_"!==t&&"$0"!==t&&"commands"!==t&&"id"!==t&&"object"!=typeof e[t])).map((t=>`--${t}=${e[t]}`)).join(" "),o=`npm run watch ${s.join(" ")} ${a}`;be.exec(o,{cwd:i}),process.exit(0)}catch(e){console.error(e),process.exit(1)}})).demandCommand(1,"You need at least one command before moving on").help().argv,module.exports={};
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var e,t,i=require("@flownet/lib-load-fnet-config"),s=require("redis"),r=require("@flownet/lib-is-redis-online"),n=require("express"),o=require("helmet"),l=require("cors"),d=require("path"),c=require("shelljs"),a=require("nanoid"),u=require("request-ip"),h=require("express-session"),w=require("keycloak-connect"),p=require("qs");function _(){if(t)return e;t=1;const i=s,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=i.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}}var b,f,m,y,k={name:"@fnet/cli",version:"0.7.
|
|
2
|
+
"use strict";var e,t,i=require("@flownet/lib-load-fnet-config"),s=require("redis"),r=require("@flownet/lib-is-redis-online"),n=require("express"),o=require("helmet"),l=require("cors"),d=require("path"),c=require("shelljs"),a=require("nanoid"),u=require("request-ip"),h=require("express-session"),w=require("keycloak-connect"),p=require("qs");function _(){if(t)return e;t=1;const i=s,n=r;return e=async()=>{if(!await n({host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}))return;const e=i.createClient({socket:{host:process.env.REDIS_HOST,port:process.env.REDIS_PORT}});return await e.connect(),e}}var b,f,m,y,k={name:"@fnet/cli",version:"0.7.2",files:["dist"],scripts:{start:"node src/index.js",build:"rollup --config --bundleConfigAsCjs",deploy:"npm install && npm run build && npm publish --access public",watch:"rollup --config --watch --sourcemap --bundleConfigAsCjs --environment DEVELOPMENT"},dependencies:{"@flownet/lib-atom-api-js":"^0.1.7","@flownet/lib-bpmn-from-flow":"^0.1.6","@flownet/lib-execute-command-with-ipc-file":"^0.1.10","@flownet/lib-is-redis-online":"^0.1.12","@flownet/lib-list-npm-versions":"^0.1.27","@flownet/lib-load-fnet-config":"^0.1.26","@flownet/lib-parse-imports-js":"^0.1.34","@flownet/lib-parse-node-url":"^0.1.15","@flownet/lib-pick-npm-versions":"^0.1.5","@flownet/lib-render-templates-dir":"^0.1.11","@flownet/lib-to-electron":"^0.1.19","@flownet/lib-to-gitlab":"^0.1.20","@flownet/lib-to-ios-app":"^0.1.20","@flownet/lib-to-macos-app":"^0.1.11","@flownet/lib-to-nextjs":"^0.1.10","@flownet/lib-to-webos":"^0.1.9","@flownet/lib-upload-files-to-gcs":"^0.1.11","@flownet/template-node-library":"^0.5.1","@flownet/template-node-workflow":"^0.6.1","@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={};
|