@giteeteam/apps-cli 0.5.0-alpha.4 → 0.5.0-alpha.5

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/README.md CHANGED
@@ -7,7 +7,6 @@ $ npm install @giteeteam/apps-cli -g
7
7
 
8
8
  ## 创建应用
9
9
  ```bash
10
- // uikit-app为项目名称
11
10
  $ giteeteam-apps init
12
11
  ```
13
12
 
@@ -16,7 +15,12 @@ $ giteeteam-apps init
16
15
  $ giteeteam-apps build
17
16
  ```
18
17
 
19
- ## 调试插件function
18
+ ## 登录
19
+ ```bash
20
+ $ giteeteam-apps login
21
+ ```
22
+
23
+ ## 调试插件function(需要先登录再调试)
20
24
  ```bash
21
25
  $ giteeteam-apps tunnel
22
26
  ```
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";require("dotenv/config");var e=require("commander"),r=require("fs-extra"),t=require("path"),o=require("archiver"),s=require("rollup"),a=require("fs"),n=require("esbuild"),i=require("@rollup/plugin-node-resolve"),c=require("@rollup/plugin-commonjs"),u=require("ora"),p=require("@giteeteam/apps-manifest"),l=require("inquirer"),d=require("simple-git"),m=require("chalk"),v=require("readline"),w=require("execa"),f=require("child_process"),g=require("axios"),y=require("localtunnel"),h=require("lowdb"),E=require("lowdb/adapters/FileSync"),P=require("chokidar"),D=require("crypto"),_=require("base64url"),S="0.5.0-alpha.4";const $={treeShaking:!0,format:"esm",loader:"tsx"};var L;function R(e,r,o=L.DEV){const s=[i.nodeResolve(),c()];var u;s.push((u={sourcemap:o===L.DEV,minify:o!==L.DEV,target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"},u={...$,...u},{name:"esbuild",resolveId(e,r,o){if(!r||[".ts",".tsx",".js",".jsx",".mjs"].some((r=>e.endsWith(r))))return e;const s=t.dirname(r);let n;if(a.existsSync(n=t.resolve(s,e,"index.ts")))return n;if(a.existsSync(n=t.resolve(s,e,"index.tsx")))return n;if(a.existsSync(n=t.resolve(s,e+".ts")))return n;if(a.existsSync(n=t.resolve(s,e+".tsx")))return n;throw console.error({source:e,importer:r,options:o}),n=t.relative(".",t.resolve(r,e)),new Error(`ENOENT: ${n.replace(/\\/g,"/")}`)},async transform(e,r){u.sourcefile=r;const{code:t,map:o}=await n.transform(e,u);return o?{code:t,map:o}:t}}));return{inputOptions:{input:e,plugins:s},outputOptions:{file:r,format:"es",sourcemap:o===L.DEV}}}async function k(e){const{fileName:r,inputDir:o,outputDir:n,mode:i=L.DEV}=e,c=t.join(o,`${r}.ts`);try{await a.promises.access(c)}catch(e){return void console.error(`${c} is not exist`)}const u=t.join(n,`${r}.js`),{inputOptions:p,outputOptions:l}=R(c,u,i),d=await s.rollup(p);await d.write(l)}!function(e){e.DEV="development",e.PROD="production"}(L||(L={}));const N=async(e,r)=>{const t=u(e.start).start();try{const o=await r();return t.succeed(e.succeed),o}catch(r){throw console.error(r.message),t.fail(e.error),r}},x=async()=>{const e=t.resolve("manifest.yml"),o=await r.readFile(e);return new p.Manifest(o.toString())};var T=async({outputDir:e,inputDir:s,prod:a,copyFiles:n,zip:i})=>{const c=await x(),{version:u,key:p}=c.app;if(p)if(u){if(await r.emptyDir(e),await N({start:"start bundle",error:"bundle failed",succeed:"bundle success"},(()=>(async e=>{const{manifest:r,mode:t,outputDir:o,inputDir:s}=e,a=r.getFunctionFiles().map((async e=>{await k({inputDir:s,fileName:e,outputDir:o,mode:t})}));await Promise.all(a)})({outputDir:e,inputDir:s,manifest:c,mode:a?L.PROD:L.DEV}))),await N({start:"start package",error:"package failed",succeed:"package success"},(()=>(async({outputDir:e,manifest:o,copyFiles:s})=>{const{resources:a}=o;if(a)for(const{key:o,path:s}of a){const a=t.resolve(t.join("./",s)),n=t.join(e,o);await r.copy(a,n)}for(const o of s){const s=t.resolve(o),a=t.join(e,o);await r.copy(s,a)}})({outputDir:e,manifest:c,copyFiles:n}))),i){const s=`${p}_${u}.zip`;await N({start:"start archive",error:"archive failed",succeed:"archive success"},(()=>(async(e,s)=>{const a=t.resolve(s);return await r.remove(a),new Promise(((t,s)=>{const n=r.createWriteStream(a),i=o("zip",{zlib:{level:9}});n.on("close",(function(){t()})),i.on("warning",(function(e){console.log(e),"ENOENT"===e.code||s(e)})),i.on("error",(function(e){console.log(e),s(e)})),i.pipe(n),i.directory(e,!1),i.finalize()}))})(e,s)))}}else console.error("manifest app version is required");else console.error("manifest app key is required")};const O=["manifest.yml"];var j;!function(e){e.micro="micro",e.uikit="uikit"}(j||(j={}));const q=(e,r)=>{const t=Math.min(Math.max(e/r,0),1),o=` ${e}/${r}`,s=Math.max(0,process.stderr.columns-o.length-3),a=Math.min(r,s),n=Math.round(a*t),i="#".repeat(n),c="-".repeat(a-n);var u;u=process.stderr,m.supportsColor?v.cursorTo(u,0):u.write("\r"),process.stderr.write(`[${i}${c}]${o}`)},C=(e,r,t,o)=>new Promise(((s,a)=>{var n;const i=w(e,r,{cwd:t,stdio:["inherit","inherit","pipe"],env:o});null===(n=i.stderr)||void 0===n||n.on("data",(e=>{const r=e.toString();if(/warning/.test(r))return;const t=r.match(/\[.*] (\d+)\/(\d+)/);t?q(parseFloat(t[1]),parseFloat(t[2])):process.stderr.write(e)})),i.on("close",(t=>{0===t?s():a(new Error(`command failed: ${e} ${r.join(" ")}`))}))})),b=async(e,t)=>{await N({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},(()=>(async(e,t)=>{await r.pathExists(t)||await r.mkdir(t);const o=d(t);await o.clone(e,t)})(e,t)))};var A=async e=>{const{cwd:o}=e,s=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"App Name",message:"Please enter an app name",validate:e=>!!e}))["App Name"]})(),a=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"App key",message:"Please enter a valid app key",validate:e=>!!/^[a-z][a-z0-9_]*$/.test(e)||(console.log(""),console.log("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"]})(),n=t.join(o,a);if(await r.pathExists(n))return void console.error(`Project path already exists: ${n}`);await b("https://github.com/moriahq/apps-template.git",n),await r.copy(t.join(n,"micro"),n),await Promise.all(Object.values(j).map((e=>r.remove(t.join(n,e))))),await r.remove(t.join(n,"./.git"));await Promise.all(["./manifest.yml","./package.json","./webpack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx"].map((e=>(async(e,t)=>{if(!await r.pathExists(e))return;const o=await r.readFile(e,{encoding:"utf-8"});await r.writeFile(e,o.replace(/{{(\w+)}}/g,((e,r)=>"string"==typeof t[r]?t[r]:e)))})(t.join(n,e),{appName:s,appKey:a})))),await(async e=>{await N({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},(()=>C("yarn",["install"],e)))})(n),await(async e=>{const r=d(e);await r.init()})(n),console.log("Project init success!"),console.log("Project path:"+n)};class I{constructor(e,r){this.imageName=e,this.containerName=r}async downloadImage(){console.log(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.log(`Download image(${this.imageName}) success!`)}async runContainer({port:e,env:r,volume:t=[]}){await this.removeContainer();const o=`docker run -d -p ${e}:${e} ${Object.keys(r).map((e=>`-e ${e}=${r[e]}`)).join(" ")} ${null==t?void 0:t.map((e=>`-v ${e}`)).join(" ")} --name ${this.containerName} ${this.imageName}`;await this.execPromise(o)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch((()=>{}))}logs(){const e=f.spawn("docker",["logs","-f",this.containerName]);e.stdout.on("data",(e=>{console.log(`${e}`)})),e.stderr.on("data",(e=>{console.log(`${e}`)}))}execPromise(e){return new Promise(((r,t)=>{f.exec(e,((e,o,s)=>{if(e)return t(e);r({stdout:o,stderr:s})}))}))}}const F=h(new E(t.join(__dirname,"user.json"))),U=()=>{const e=F.get("version").value();e&&e===S||F.defaults({version:S,user:{}}).write()},M=e=>{U(),F.set("user",e).write()},G=()=>(U(),F.get("user").value()),V=process.env.RESOURCES||"[]",z=m.bold.red;var B=e=>{console.info(z(e))};const Q=(e,r,t)=>{for(const o of e)k({inputDir:r,outputDir:t,fileName:o,mode:L.DEV})};var K=async e=>{var o,s,a;const{inputDir:n,outputDir:i,server:c}=e;await r.emptyDir(i);const u=await x(),p=u.app.key,l=u.app.version,d=u.getFunctionFiles();if(!p)return void B("appKey is required!");if(!l)return void B("version is required!");const{domain:m}=G();if(!m)return void B("Please login in first!");const v=[],w=`${`/${p}/development/${l}`}/server-side`,f=t.join(i,w);await(async e=>{const o=t.resolve("manifest.yml"),s=t.join(e,"manifest.yml");await r.copy(o,s)})(f),await(async e=>{const{inputDir:r,outputDir:t}=e,o=(await x()).getFunctionFiles();let s;Q(o,r,t);const a=P.watch(r);console.info(`watch: ${r}`),a.on("change",(e=>{clearTimeout(s),s=setTimeout((()=>{console.info(`${e} has change`),Q(o,r,t)}),1e3)}))})({inputDir:n,outputDir:f}),v.push((()=>r.remove(i)));let h="";if(c&&d.length>0){const{runtimeImage:e,containerPort:r,containerEnv:t,containerName:n}=(()=>{var e;const r=process.env.RUNTIME_IMAGE||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:latest",t=Number(null!==(e=process.env.CONTAINER_PORT)&&void 0!==e?e:8455);return{runtimeImage:r,containerPort:t,containerName:"cli-dev-apps-runtime-server",containerEnv:{PORT:t,APPS_DIR:"/usr/src/app/apps",LRU_TTL:1,FS_MODE:"local",DEBUG:process.env.DEBUG||"runtime*",LOG_LEVEL:process.env.LOG_LEVEL,APPS_DEFAULT_LOCALE:process.env.APPS_DEFAULT_LOCALE||"zh-CN",PARSE_PUBLIC_SERVER_URL:process.env.PARSE_PUBLIC_SERVER_URL,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL,PGSQL_CLIENT_HOST:process.env.PGSQL_CLIENT_HOST,PGSQL_CLIENT_PORT:process.env.PGSQL_CLIENT_PORT,PGSQL_CLIENT_USER:process.env.PGSQL_CLIENT_USER,PGSQL_CLIENT_PASSWORD:process.env.PGSQL_CLIENT_PASSWORD}}})(),c=new I(e,n);if(await c.downloadImage(),await c.runContainer({port:r,env:t,volume:[`${i}:/usr/src/app/apps`]}),v.push((()=>c.removeContainer())),c.logs(),h=await N({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},(()=>(async(e,r)=>{try{return(await y({port:e,subdomain:r.replace(/_/g,"-"),host:"http://tunnel.gitee.work:1777"})).url}catch(e){return console.info("runTunnel error",null==e?void 0:e.message),""}})(r,p))),null===(a=null===(s=null===(o=u.getManifest())||void 0===o?void 0:o.modules)||void 0===s?void 0:s.webtrigger)||void 0===a?void 0:a.length){console.log("You can use this url for test:");const e=`${m}/apps/api/v1/:tenant/apps/${p}/environments/development/webtriggers/:webtriggerKey`;console.log(`POST ${e}`)}}await(async(e,r)=>{const{domain:t,cookie:o}=G();await g({method:"POST",url:`${t}/apps/api/v1/apps/tunnel/${e}`,data:{resources:JSON.parse(V),runtimeHost:r},headers:{cookie:o}}).catch((e=>{console.error(`addTunnel error ${null==e?void 0:e.message}`)}))})(p,h),v.push((()=>(async e=>{const{domain:r,cookie:t}=G();await g({method:"DELETE",url:`${r}/apps/api/v1/apps/tunnel/${e}`,headers:{cookie:t}}).catch((e=>{console.error("removeTunnel error",null==e?void 0:e.message)}))})(p))),process.on("SIGINT",(async()=>{await Promise.all(v.map((e=>e()))),process.exit()}))};const H=Buffer.from("ABCDEFGHIJKLM_iv","utf-8"),W=Buffer.from("ABCDEFGHIJKL_key","utf-8"),J=e=>{try{const r=D.createCipheriv("aes-128-cbc",W,H);let t=r.update(e,"utf8","base64");return t+=r.final("base64"),_.toBase64(t)}catch(e){return console.error(`Encryption error: ${e}`),null}};var Y=async({domain:e,username:r,password:t})=>{e||(e=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"Domain",message:"Please enter the domain address",validate:e=>!!e})).Domain})());const o=(e=>{const[,r]=e.split("//");return(e=>/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.test(e))(r)})(e);if(o)M({domain:e,dev:o}),console.info("Login success!");else{r||(r=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"Username",message:"Please enter username",validate:e=>!!e})).Username})()),t||(t=await(async()=>{const e=l.createPromptModule();return(await e({type:"password",name:"Password",message:"Please enter password",validate:e=>!!e})).Password})());const{cookie:s}=await(async({baseUrl:e,username:r,password:t})=>{var o;try{return{cookie:null===(o=(await g({method:"POST",url:`${e}/api/gateway/login`,data:{username:r,password:t}})).headers)||void 0===o?void 0:o["set-cookie"]}}catch(e){return console.error("Login error:",null==e?void 0:e.message),{cookie:""}}})({baseUrl:e,username:r,password:J(t)||t});s&&(M({domain:e,username:r,cookie:s,dev:o}),console.info("Login success!"))}};const X=new e.Command;X.version(S).description("Giteeteam Apps Cli"),X.command("build").option("--prod","build in production").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").action((async e=>{const{input:r="src",output:o="dist",prod:s,copy:a=[],zip:n}=e;await T({outputDir:t.resolve(o),inputDir:t.resolve(r),prod:!!s,copyFiles:[...O,...a],zip:n})})),X.command("init").action((async()=>{const e=process.cwd();await A({cwd:e})})),X.command("tunnel").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").action((async e=>{const{input:r="src",output:o="cache",server:s=!0}=e;await K({outputDir:t.resolve(o),inputDir:t.resolve(r),server:s})})),X.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action((async e=>{await Y(e)})),X.parse(process.argv);
2
+ "use strict";require("dotenv/config");var e=require("commander"),r=require("fs-extra"),t=require("path"),o=require("archiver"),s=require("rollup"),a=require("fs"),n=require("esbuild"),i=require("@rollup/plugin-node-resolve"),c=require("@rollup/plugin-commonjs"),u=require("ora"),p=require("@giteeteam/apps-manifest"),l=require("inquirer"),d=require("simple-git"),m=require("chalk"),v=require("readline"),w=require("execa"),f=require("node:path"),g=require("node:child_process"),y=require("axios"),h=require("localtunnel"),E=require("lowdb"),P=require("lowdb/adapters/FileSync"),D=require("chokidar"),_=require("crypto"),S=require("base64url"),$="0.5.0-alpha.5";const L={treeShaking:!0,format:"esm",loader:"tsx"};var R;function k(e,r,o=R.DEV){const s=[i.nodeResolve(),c()];var u;s.push((u={sourcemap:o===R.DEV,minify:o!==R.DEV,target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"},u={...L,...u},{name:"esbuild",resolveId(e,r,o){if(!r||[".ts",".tsx",".js",".jsx",".mjs"].some((r=>e.endsWith(r))))return e;const s=t.dirname(r);let n;if(a.existsSync(n=t.resolve(s,e,"index.ts")))return n;if(a.existsSync(n=t.resolve(s,e,"index.tsx")))return n;if(a.existsSync(n=t.resolve(s,e+".ts")))return n;if(a.existsSync(n=t.resolve(s,e+".tsx")))return n;throw console.error({source:e,importer:r,options:o}),n=t.relative(".",t.resolve(r,e)),new Error(`ENOENT: ${n.replace(/\\/g,"/")}`)},async transform(e,r){u.sourcefile=r;const{code:t,map:o}=await n.transform(e,u);return o?{code:t,map:o}:t}}));return{inputOptions:{input:e,plugins:s},outputOptions:{file:r,format:"es",sourcemap:o===R.DEV}}}async function N(e){const{fileName:r,inputDir:o,outputDir:n,mode:i=R.DEV}=e,c=t.join(o,`${r}.ts`);try{await a.promises.access(c)}catch(e){return void console.error(`${c} is not exist`)}const u=t.join(n,`${r}.js`),{inputOptions:p,outputOptions:l}=k(c,u,i),d=await s.rollup(p);await d.write(l)}!function(e){e.DEV="development",e.PROD="production"}(R||(R={}));const x=async(e,r)=>{const t=u(e.start).start();try{const o=await r();return t.succeed(e.succeed),o}catch(r){throw console.error(r.message),t.fail(e.error),r}},T=async()=>{const e=t.resolve("manifest.yml"),o=await r.readFile(e);return new p.Manifest(o.toString())};var O=async({outputDir:e,inputDir:s,prod:a,copyFiles:n,zip:i})=>{const c=await T(),{version:u,key:p}=c.app;if(p)if(u){if(await r.emptyDir(e),await x({start:"start bundle",error:"bundle failed",succeed:"bundle success"},(()=>(async e=>{const{manifest:r,mode:t,outputDir:o,inputDir:s}=e,a=r.getFunctionFiles().map((async e=>{await N({inputDir:s,fileName:e,outputDir:o,mode:t})}));await Promise.all(a)})({outputDir:e,inputDir:s,manifest:c,mode:a?R.PROD:R.DEV}))),await x({start:"start package",error:"package failed",succeed:"package success"},(()=>(async({outputDir:e,manifest:o,copyFiles:s})=>{const{resources:a}=o;if(a)for(const{key:o,path:s}of a){const a=t.resolve(t.join("./",s)),n=t.join(e,o);await r.copy(a,n)}for(const o of s){const s=t.resolve(o),a=t.join(e,o);await r.copy(s,a)}})({outputDir:e,manifest:c,copyFiles:n}))),i){const s=`${p}_${u}.zip`;await x({start:"start archive",error:"archive failed",succeed:"archive success"},(()=>(async(e,s)=>{const a=t.resolve(s);return await r.remove(a),new Promise(((t,s)=>{const n=r.createWriteStream(a),i=o("zip",{zlib:{level:9}});n.on("close",(function(){t()})),i.on("warning",(function(e){console.log(e),"ENOENT"===e.code||s(e)})),i.on("error",(function(e){console.log(e),s(e)})),i.pipe(n),i.directory(e,!1),i.finalize()}))})(e,s)))}}else console.error("manifest app version is required");else console.error("manifest app key is required")};const j=["manifest.yml"];var q;!function(e){e.micro="micro",e.uikit="uikit"}(q||(q={}));const C=(e,r)=>{const t=Math.min(Math.max(e/r,0),1),o=` ${e}/${r}`,s=Math.max(0,process.stderr.columns-o.length-3),a=Math.min(r,s),n=Math.round(a*t),i="#".repeat(n),c="-".repeat(a-n);var u;u=process.stderr,m.supportsColor?v.cursorTo(u,0):u.write("\r"),process.stderr.write(`[${i}${c}]${o}`)},b=(e,r,t,o)=>new Promise(((s,a)=>{var n;const i=w(e,r,{cwd:t,stdio:["inherit","inherit","pipe"],env:o});null===(n=i.stderr)||void 0===n||n.on("data",(e=>{const r=e.toString();if(/warning/.test(r))return;const t=r.match(/\[.*] (\d+)\/(\d+)/);t?C(parseFloat(t[1]),parseFloat(t[2])):process.stderr.write(e)})),i.on("close",(t=>{0===t?s():a(new Error(`command failed: ${e} ${r.join(" ")}`))}))})),A=async(e,t)=>{await x({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},(()=>(async(e,t)=>{await r.pathExists(t)||await r.mkdir(t);const o=d(t);await o.clone(e,t)})(e,t)))};var I=async e=>{const{cwd:o}=e,s=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"App Name",message:"Please enter an app name",validate:e=>!!e}))["App Name"]})(),a=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"App key",message:"Please enter a valid app key",validate:e=>!!/^[a-z][a-z0-9_]*$/.test(e)||(console.log(""),console.log("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"]})(),n=t.join(o,a);if(await r.pathExists(n))return void console.error(`Project path already exists: ${n}`);await A("https://github.com/moriahq/apps-template.git",n),await r.copy(t.join(n,"micro"),n),await Promise.all(Object.values(q).map((e=>r.remove(t.join(n,e))))),await r.remove(t.join(n,"./.git"));await Promise.all(["./manifest.yml","./package.json","./webpack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx"].map((e=>(async(e,t)=>{if(!await r.pathExists(e))return;const o=await r.readFile(e,{encoding:"utf-8"});await r.writeFile(e,o.replace(/{{(\w+)}}/g,((e,r)=>"string"==typeof t[r]?t[r]:e)))})(t.join(n,e),{appName:s,appKey:a})))),await(async e=>{await x({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},(()=>b("yarn",["install"],e)))})(n),await(async e=>{const r=d(e);await r.init()})(n),console.log("Project init success!"),console.log("Project path:"+n)};class F{constructor(e,r){this.imageName=e,this.containerName=r}async downloadImage(){console.log(`Downloading image(${this.imageName}) ...`),await this.execPromise(`docker pull ${this.imageName}`),console.log(`Download image(${this.imageName}) success!`)}async runContainer({port:e,env:r,volume:t=[]}){await this.removeContainer();const o=`docker run -d -p ${e}:${e} ${Object.keys(r).map((e=>`-e ${e}=${r[e]}`)).join(" ")} ${null==t?void 0:t.map((e=>`-v ${e}`)).join(" ")} --name ${this.containerName} ${this.imageName}`;await this.execPromise(o)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch((()=>{}))}logs(){const e=g.spawn("docker",["logs","-f",this.containerName]);e.stdout.on("data",(e=>{console.log(`${e}`)})),e.stderr.on("data",(e=>{console.log(`${e}`)}))}execPromise(e){return new Promise(((r,t)=>{g.exec(e,((e,o,s)=>{if(e)return t(e);r({stdout:o,stderr:s})}))}))}}const U=E(new P(f.join(__dirname,"user.json"))),M=()=>{const e=U.get("version").value();e&&e===$||U.defaults({version:$,user:{}}).write()},G=e=>{M(),U.set("user",e).write()},V=()=>(M(),U.get("user").value()),z=process.env.RESOURCES||"[]",B=m.bold.red;var Q=e=>{console.info(B(e))};const K=(e,r,t)=>{for(const o of e)N({inputDir:r,outputDir:t,fileName:o,mode:R.DEV})};var H=async e=>{var t,o,s;const{inputDir:a,outputDir:n,server:i}=e;await r.emptyDir(n);const c=await T(),u=c.app.key,p=c.app.version,l=c.getFunctionFiles();if(!u)return void Q("appKey is required!");if(!p)return void Q("version is required!");const{domain:d}=V();if(!d)return void Q("Please login in first!");const m=[],v=`${`/${u}/development/${p}`}/server-side`,w=f.join(n,v);await(async e=>{const t=f.resolve("manifest.yml"),o=f.join(e,"manifest.yml");await r.copy(t,o)})(w),await(async e=>{const{inputDir:r,outputDir:t}=e,o=(await T()).getFunctionFiles();let s;K(o,r,t);const a=D.watch(r);console.info(`watch: ${r}`),a.on("change",(e=>{clearTimeout(s),s=setTimeout((()=>{console.info(`${e} has change`),K(o,r,t)}),1e3)}))})({inputDir:a,outputDir:w}),m.push((()=>r.remove(n)));let g="";if(i&&l.length>0){const{runtimeImage:e,containerPort:r,containerEnv:a,containerName:i}=(()=>{var e;const r=process.env.RUNTIME_IMAGE||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:latest",t=Number(null!==(e=process.env.CONTAINER_PORT)&&void 0!==e?e:8455);return{runtimeImage:r,containerPort:t,containerName:"cli-dev-apps-runtime-server",containerEnv:{PORT:t,APPS_DIR:"/usr/src/app/apps",LRU_TTL:1,FS_MODE:"local",DEBUG:process.env.DEBUG||"runtime*",LOG_LEVEL:process.env.LOG_LEVEL,APPS_DEFAULT_LOCALE:process.env.APPS_DEFAULT_LOCALE||"zh-CN",PARSE_PUBLIC_SERVER_URL:process.env.PARSE_PUBLIC_SERVER_URL,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL,PGSQL_CLIENT_HOST:process.env.PGSQL_CLIENT_HOST,PGSQL_CLIENT_PORT:process.env.PGSQL_CLIENT_PORT,PGSQL_CLIENT_USER:process.env.PGSQL_CLIENT_USER,PGSQL_CLIENT_PASSWORD:process.env.PGSQL_CLIENT_PASSWORD}}})(),p=new F(e,i);if(await p.downloadImage(),await p.runContainer({port:r,env:a,volume:[`${n}:/usr/src/app/apps`]}),m.push((()=>p.removeContainer())),p.logs(),g=await x({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},(()=>(async(e,r)=>{try{return(await h({port:e,subdomain:r.replace(/_/g,"-"),host:"http://tunnel.gitee.work:1777"})).url}catch(e){return console.info("runTunnel error",null==e?void 0:e.message),""}})(r,u))),null===(s=null===(o=null===(t=c.getManifest())||void 0===t?void 0:t.modules)||void 0===o?void 0:o.webtrigger)||void 0===s?void 0:s.length){console.log("You can use this url for test:");const e=`${d}/apps/api/v1/:tenant/apps/${u}/environments/development/webtriggers/:webtriggerKey`;console.log(`POST ${e}`)}}await(async(e,r)=>{const{domain:t,cookie:o}=V();await y({method:"POST",url:`${t}/apps/api/v1/apps/tunnel/${e}`,data:{resources:JSON.parse(z),runtimeHost:r},headers:{cookie:o}}).catch((e=>{console.error(`addTunnel error ${null==e?void 0:e.message}`)}))})(u,g),m.push((()=>(async e=>{const{domain:r,cookie:t}=V();await y({method:"DELETE",url:`${r}/apps/api/v1/apps/tunnel/${e}`,headers:{cookie:t}}).catch((e=>{console.error("removeTunnel error",null==e?void 0:e.message)}))})(u))),process.on("SIGINT",(async()=>{await Promise.all(m.map((e=>e()))),process.exit()}))};const W=Buffer.from("ABCDEFGHIJKLM_iv","utf-8"),J=Buffer.from("ABCDEFGHIJKL_key","utf-8"),Y=e=>{try{const r=_.createCipheriv("aes-128-cbc",J,W);let t=r.update(e,"utf8","base64");return t+=r.final("base64"),S.toBase64(t)}catch(e){return console.error(`Encryption error: ${e}`),null}};var X=async({domain:e,username:r,password:t})=>{e||(e=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"Domain",message:"Please enter the domain address",validate:e=>!!e})).Domain})());const o=(e=>{const[,r]=e.split("//");return(e=>/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.test(e))(r)})(e);if(o)G({domain:e,dev:o}),console.info("Login success!");else{r||(r=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"Username",message:"Please enter username",validate:e=>!!e})).Username})()),t||(t=await(async()=>{const e=l.createPromptModule();return(await e({type:"password",name:"Password",message:"Please enter password",validate:e=>!!e})).Password})());const{cookie:s}=await(async({baseUrl:e,username:r,password:t})=>{var o;try{return{cookie:null===(o=(await y({method:"POST",url:`${e}/api/gateway/login`,data:{username:r,password:t}})).headers)||void 0===o?void 0:o["set-cookie"]}}catch(e){return console.error("Login error:",null==e?void 0:e.message),{cookie:""}}})({baseUrl:e,username:r,password:Y(t)||t});s&&(G({domain:e,username:r,cookie:s,dev:o}),console.info("Login success!"))}};const Z=new e.Command;Z.version($).description("Giteeteam Apps Cli"),Z.command("build").option("--prod","build in production").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").action((async e=>{const{input:r="src",output:o="dist",prod:s,copy:a=[],zip:n}=e;await O({outputDir:t.resolve(o),inputDir:t.resolve(r),prod:!!s,copyFiles:[...j,...a],zip:n})})),Z.command("init").action((async()=>{const e=process.cwd();await I({cwd:e})})),Z.command("tunnel").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").action((async e=>{const{input:r="src",output:o="cache",server:s=!0}=e;await H({outputDir:t.resolve(o),inputDir:t.resolve(r),server:s})})),Z.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action((async e=>{await X(e)})),Z.parse(process.argv);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giteeteam/apps-cli",
3
- "version": "0.5.0-alpha.4",
3
+ "version": "0.5.0-alpha.5",
4
4
  "description": "Giteeteam Apps cli",
5
5
  "keywords": [
6
6
  "typescript",
@@ -24,7 +24,6 @@
24
24
  "url": "git+https://github.com/moriahq/proxima.git"
25
25
  },
26
26
  "scripts": {
27
- "dev": "tsc -w",
28
27
  "build": "rm -rf dist && rollup -c rollup.config.ts --configPlugin typescript",
29
28
  "prepublish": "pnpm build",
30
29
  "prepack": "pnpm build",