@giteeteam/apps-cli 0.5.5 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
1
  #!/usr/bin/env node
2
- "use strict";require("dotenv/config");var e=require("commander"),t=require("fs-extra"),r=require("path"),o=require("archiver"),n=require("rollup"),a=require("fs"),s=require("esbuild"),i=require("@rollup/plugin-node-resolve"),c=require("@rollup/plugin-commonjs"),p=require("ora"),u=require("@giteeteam/apps-manifest"),l=require("inquirer"),d=require("simple-git"),m=require("chalk"),v=require("readline"),w=require("execa"),y=require("axios"),g=require("node:path"),f=require("lowdb"),h=require("lowdb/adapters/FileSync"),E=require("crypto"),P=require("base64url"),S=require("debug"),D=require("node:child_process"),_=require("localtunnel"),R=require("chokidar"),L=require("node:fs"),$=require("form-data"),N="0.5.5";const O={treeShaking:!0,format:"esm",loader:"tsx"};var T;function x(e,t,o=T.DEV){const n=[i.nodeResolve(),c()];var p;n.push((p={sourcemap:o===T.DEV,minify:o!==T.DEV,target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"},p={...O,...p},{name:"esbuild",resolveId(e,t,o){if(!t||[".ts",".tsx",".js",".jsx",".mjs",".json"].some((t=>e.endsWith(t))))return e;const n=r.dirname(t);let s;if(a.existsSync(s=r.resolve(n,e,"index.ts")))return s;if(a.existsSync(s=r.resolve(n,e,"index.tsx")))return s;if(a.existsSync(s=r.resolve(n,e+".ts")))return s;if(a.existsSync(s=r.resolve(n,e+".tsx")))return s;throw console.error({source:e,importer:t,options:o}),s=r.relative(".",r.resolve(t,e)),new Error(`ENOENT: ${s.replace(/\\/g,"/")}`)},async transform(e,t){p.sourcefile=t,p.loader=t.endsWith(".json")?"json":p.loader;const{code:r,map:o}=await s.transform(e,p);return o?{code:r,map:o}:r}}));return{inputOptions:{input:e,plugins:n},outputOptions:{file:t,format:"es",sourcemap:o===T.DEV}}}async function j(e){const{fileName:t,inputDir:o,outputDir:s,mode:i=T.DEV}=e,c=r.join(o,`${t}.ts`);try{await a.promises.access(c)}catch(e){return void console.error(`${c} is not exist`)}const p=r.join(s,`${t}.js`),{inputOptions:u,outputOptions:l}=x(c,p,i),d=await n.rollup(u);await d.write(l)}!function(e){e.DEV="development",e.PROD="production"}(T||(T={}));const k=async(e,t)=>{var r,o;const n=p(e.start).start();try{const r=await t();return n.succeed(e.succeed),r}catch(t){throw n.fail(`${e.error}: ${(null===(o=null===(r=null==t?void 0:t.response)||void 0===r?void 0:r.data)||void 0===o?void 0:o.message)||t.message}`),t}},q=async()=>{const e=r.resolve("manifest.yml"),o=await t.readFile(e);return new u.Manifest(o.toString())};var C=async({outputDir:e,inputDir:n,prod:a,copyFiles:s,zip:i})=>{const c=await q(),{version:p,key:u}=c.app;if(u)if(p){if(await t.emptyDir(e),await k({start:"start bundle",error:"bundle failed",succeed:"bundle success"},(()=>(async e=>{const{manifest:t,mode:r,outputDir:o,inputDir:n}=e,a=t.getFunctionFiles().map((async e=>{await j({inputDir:n,fileName:e,outputDir:o,mode:r})}));await Promise.all(a)})({outputDir:e,inputDir:n,manifest:c,mode:a?T.PROD:T.DEV}))),await k({start:"start package",error:"package failed",succeed:"package success"},(()=>(async({outputDir:e,manifest:o,copyFiles:n})=>{const{resources:a}=o;if(a)for(const{key:o,path:n}of a){const a=r.resolve(r.join("./",n)),s=r.join(e,o);await t.copy(a,s)}for(const o of n){const n=r.resolve(o),a=r.join(e,o);await t.copy(n,a)}})({outputDir:e,manifest:c,copyFiles:s}))),i){const n=`${u}_${p}.zip`;await k({start:"start archive",error:"archive failed",succeed:"archive success"},(()=>(async(e,n)=>{const a=r.resolve(n);return await t.remove(a),new Promise(((r,n)=>{const s=t.createWriteStream(a),i=o("zip",{zlib:{level:9}});s.on("close",(function(){r()})),i.on("warning",(function(e){console.log(e),"ENOENT"===e.code||n(e)})),i.on("error",(function(e){console.log(e),n(e)})),i.pipe(s),i.directory(e,!1),i.finalize()}))})(e,n)))}}else console.error("manifest app version is required");else console.error("manifest app key is required")};const b=["manifest.yml"];var A;!function(e){e.micro="micro",e.uikit="uikit"}(A||(A={}));const I=(e,t)=>{const r=Math.min(Math.max(e/t,0),1),o=` ${e}/${t}`,n=Math.max(0,process.stderr.columns-o.length-3),a=Math.min(t,n),s=Math.round(a*r),i="#".repeat(s),c="-".repeat(a-s);var p;p=process.stderr,m.supportsColor?v.cursorTo(p,0):p.write("\r"),process.stderr.write(`[${i}${c}]${o}`)},U=(e,t,r,o)=>new Promise(((n,a)=>{var s;const i=w(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:o});null===(s=i.stderr)||void 0===s||s.on("data",(e=>{const t=e.toString();if(/warning/.test(t))return;const r=t.match(/\[.*] (\d+)\/(\d+)/);r?I(parseFloat(r[1]),parseFloat(r[2])):process.stderr.write(e)})),i.on("close",(r=>{0===r?n():a(new Error(`command failed: ${e} ${t.join(" ")}`))}))})),F=async(e,r)=>{await k({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},(()=>(async(e,r)=>{await t.pathExists(r)||await t.mkdir(r);const o=d(r);await o.clone(e,r)})(e,r)))};var M=async e=>{const{cwd:o}=e,n=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"]})(),s=r.join(o,a);if(await t.pathExists(s))return void console.error(`Project path already exists: ${s}`);await F("https://github.com/moriahq/apps-template.git",s),await t.copy(r.join(s,"micro"),s),await Promise.all(Object.values(A).map((e=>t.remove(r.join(s,e))))),await t.remove(r.join(s,"./.git"));await Promise.all(["./manifest.yml","./package.json","./webpack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx"].map((e=>(async(e,r)=>{if(!await t.pathExists(e))return;const o=await t.readFile(e,{encoding:"utf-8"});await t.writeFile(e,o.replace(/{{(\w+)}}/g,((e,t)=>"string"==typeof r[t]?r[t]:e)))})(r.join(s,e),{appName:n,appKey:a})))),await(async e=>{await k({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},(()=>U("yarn",["install"],e)))})(s),await(async e=>{const t=d(e);await t.init()})(s),console.log("Project init success!"),console.log("Project path:"+s)};const G=f(new h(g.join(__dirname,"user.json"))),V=()=>{const e=G.get("version").value();e&&e===N||G.defaults({version:N,user:{}}).write()},z=e=>{V(),G.set("user",e).write()},B=()=>(V(),G.get("user").value()),K=Buffer.from("ABCDEFGHIJKLM_iv","utf-8"),Q=Buffer.from("ABCDEFGHIJKL_key","utf-8"),H=e=>{try{const t=E.createCipheriv("aes-128-cbc",Q,K);let r=t.update(e,"utf8","base64");return r+=t.final("base64"),P.toBase64(r)}catch(e){return console.error(`Encryption error: ${e}`),null}};var W=async({domain:e,username:t,password:r})=>{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[,t]=e.split("//");return(e=>/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.test(e))(t)})(e=(e=>{try{return new URL(e).origin}catch(t){return e}})(e));if(o)z({domain:e,dev:o}),console.info("Login success!");else{t||(t=await(async()=>{const e=l.createPromptModule();return(await e({type:"input",name:"Username",message:"Please enter username",validate:e=>!!e})).Username})()),r||(r=await(async()=>{const e=l.createPromptModule();return(await e({type:"password",name:"Password",message:"Please enter password",validate:e=>!!e})).Password})());const{cookie:n}=await(async({baseUrl:e,username:t,password:r})=>{var o;try{return{cookie:null===(o=(await y({method:"POST",url:`${e}/api/gateway/login`,data:{username:t,password:r}})).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:t,password:H(r)||r});n&&(z({domain:e,username:t,cookie:n,dev:o}),console.info("Login success!"))}};const J=async({url:e,method:t,data:r,headers:o})=>{const{domain:n,cookie:a}=B();return(await y({method:t,baseURL:n,url:e,data:r,headers:{...o,cookie:a}})).data};class Y{constructor(e,t){this.imageName=e,this.containerName=t}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:t,volume:r=[]}){await this.removeContainer();const o=`docker run -d -p ${e}:${e} ${Object.keys(t).map((e=>`-e ${e}=${t[e]}`)).join(" ")} ${null==r?void 0:r.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=D.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(((t,r)=>{D.exec(e,((e,o,n)=>{if(e)return r(e);t({stdout:o,stderr:n})}))}))}}const X=process.env.RESOURCES||'[{"key":"main","path":"http://127.0.0.1:8000"}]',Z=m.bold.red;var ee=e=>{console.info(Z(e))};const te=(e,t,r)=>{for(const o of e)j({inputDir:t,outputDir:r,fileName:o,mode:T.DEV})},re=S("cli:tunnel"),oe=async()=>{const e=await(async()=>{var e;const t=await J({method:"GET",url:"/apps/api/v1/config"}).catch((e=>{var t,r;console.info(`getRuntimeConfig error ${(null===(r=null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.data)||void 0===r?void 0:r.message)||(null==e?void 0:e.message)}`)}));return(null===(e=t.data)||void 0===e?void 0:e.runtime)||{}})(),t=process.env.RUNTIME_IMAGE||e.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455;return{runtimeImage:t,containerPort:r,containerName:"cli-dev-apps-runtime-server",containerEnv:{PORT:r,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||e.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||e.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||e.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||e.appsServerUrl,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}}};var ne=async e=>{var r,o,n;const{inputDir:a,outputDir:s,server:i,copy:c}=e;await t.emptyDir(s);const p=await q(),u=p.app.key,l=p.app.version,d=p.getFunctionFiles();if(!u)return void ee("appKey is required!");if(!l)return void ee("version is required!");const{domain:m}=B();if(!m)return void ee("Please login in first!");const v=[],w=async()=>{await Promise.all(v.map((e=>e()))),process.exit()};process.on("SIGINT",w),process.on("uncaughtException",w),process.on("unhandledRejection",w);const y=`${`/${u}/development/${l}`}/server-side`,f=g.join(s,y);await(async(e,r)=>{for(const o of r){const r=g.resolve(o),n=g.join(e,o);await t.copy(r,n)}})(f,c),await(async e=>{const{inputDir:t,outputDir:r}=e,o=(await q()).getFunctionFiles();let n;te(o,t,r);const a=R.watch(t);console.info(`watch: ${t}`),a.on("change",(e=>{clearTimeout(n),n=setTimeout((()=>{console.info(`${e} has change`),te(o,t,r)}),1e3)}))})({inputDir:a,outputDir:f}),v.push((()=>t.remove(s)));let h="";if(i&&d.length>0){const{runtimeImage:e,containerPort:t,containerEnv:r,containerName:o}=await oe(),n=new Y(e,o);await n.downloadImage(),await n.runContainer({port:t,env:r,volume:[`${s}:/usr/src/app/apps`]}),v.push((()=>n.removeContainer())),h=await k({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},(()=>(async e=>{try{return(await _({port:e,host:"http://tunnel.gitee.work:1777"})).url}catch(e){return console.info("runTunnel error",null==e?void 0:e.message),""}})(t))),re("runtimeHost",h),n.logs()}if(await(async(e,t)=>{await J({method:"POST",url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:JSON.parse(X),runtimeHost:t}}).catch((e=>{var t,r;console.info(`addTunnel error ${(null===(r=null===(t=null==e?void 0:e.response)||void 0===t?void 0:t.data)||void 0===r?void 0:r.message)||(null==e?void 0:e.message)}`)}))})(u,h),v.push((()=>(async e=>{await J({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch((()=>{}))})(u))),i&&(null===(n=null===(o=null===(r=p.getManifest())||void 0===r?void 0:r.modules)||void 0===o?void 0:o.webtrigger)||void 0===n?void 0:n.length)){console.log("You can use this url for test:");const e=`${m}/apps/api/v1/:tenant/apps/${u}/environments/development/webtriggers/:webtriggerKey`;console.log(`POST ${e}`)}};const ae=["manifest.yml"];var se;!function(e){e.DEVELOPMENT="development",e.STAGING="staging",e.PRODUCTION="production"}(se||(se={}));const ie=new e.Command;ie.version(N).description("Giteeteam Apps Cli"),ie.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:t="src",output:o="dist",prod:n,copy:a=[],zip:s}=e;await C({outputDir:r.resolve(o),inputDir:r.resolve(t),prod:!!n,copyFiles:[...b,...a],zip:s})})),ie.command("init").action((async()=>{const e=process.cwd();await M({cwd:e})})),ie.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action((async e=>{await W(e)})),ie.command("tunnel").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").action((async e=>{const{copy:t=[],input:o="src",output:n="cache",server:a=!0}=e;await ne({outputDir:r.resolve(n),inputDir:r.resolve(o),copy:[...ae,...t],server:a})})),ie.command("deploy [filename]").option("-e --environment [environment]","app environment").action((async(e,t)=>{const{domain:r}=B(),{environment:o=se.DEVELOPMENT}=t;Object.values(se).includes(o)?r?await k({start:"start deploy",error:"deploy failed",succeed:"deploy success"},(()=>(async(e,t)=>{if(!L.existsSync(e))return void console.info("文件不存在");const r=new $;r.append("environmentKey",t),r.append("package",L.createReadStream(g.resolve(e))),await J({method:"POST",url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})})(e,o))).catch((()=>{})):ee("Please login in first!"):ee("Only support development, staging, production environment.")})),ie.parse(process.argv);
2
+ "use strict";var lt=Object.create;var te=Object.defineProperty;var ut=Object.getOwnPropertyDescriptor;var dt=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,gt=Object.prototype.hasOwnProperty;var yt=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of dt(t))!gt.call(e,o)&&o!==r&&te(e,o,{get:()=>t[o],enumerable:!(n=ut(t,o))||n.enumerable});return e};var a=(e,t,r)=>(r=e!=null?lt(ft(e)):{},yt(t||!e||!e.__esModule?te(r,"default",{value:e,enumerable:!0}):r,e));var lo=require("dotenv/config"),at=require("commander");var E="0.6.0";var ye=a(require("fs-extra"));var I=a(require("fs-extra")),y=a(require("path")),re=async({outputDir:e,manifest:t,copyFiles:r})=>{let{resources:n}=t;if(n)for(let{key:o,path:i}of n){let s=y.default.resolve(y.default.join("./",i)),p=y.default.join(e,o);await I.default.copy(s,p)}for(let o of r){let i=y.default.resolve(o),s=y.default.join(e,o);await I.default.copy(i,s)}};var oe=a(require("path")),ne=a(require("archiver")),M=a(require("fs-extra")),ie=async(e,t)=>{let r=oe.default.resolve(t);return await M.default.remove(r),new Promise((n,o)=>{let i=M.default.createWriteStream(r),s=(0,ne.default)("zip",{zlib:{level:9}});i.on("close",function(){n()}),s.on("warning",function(p){console.log(p),p.code==="ENOENT"||o(p)}),s.on("error",function(p){console.log(p),o(p)}),s.pipe(i),s.directory(e,!1),s.finalize()})};var ae=require("rollup"),N=a(require("path")),pe=a(require("fs"));var O=require("fs"),l=require("path"),se=require("esbuild"),wt={treeShaking:!0,format:"esm",loader:"tsx"};function j(e){return e={...wt,...e},{name:"esbuild",resolveId(t,r,n){if(!r||[".ts",".tsx",".js",".jsx",".mjs",".json"].some(s=>t.endsWith(s)))return t;let o=(0,l.dirname)(r),i;if((0,O.existsSync)(i=(0,l.resolve)(o,t,"index.ts")))return i;if((0,O.existsSync)(i=(0,l.resolve)(o,t,"index.tsx")))return i;if((0,O.existsSync)(i=(0,l.resolve)(o,t+".ts")))return i;if((0,O.existsSync)(i=(0,l.resolve)(o,t+".tsx")))return i;throw console.error({source:t,importer:r,options:n}),i=(0,l.relative)(".",(0,l.resolve)(r,t)),new Error(`ENOENT: ${i.replace(/\\/g,"/")}`)},async transform(t,r){e.sourcefile=r,e.loader=r.endsWith(".json")?"json":e.loader;let{code:n,map:o}=await(0,se.transform)(t,e);return o?{code:n,map:o}:n}}}var ce=require("@rollup/plugin-node-resolve"),me=a(require("@rollup/plugin-commonjs"));function ht(e,t,r="development"){let n=[(0,ce.nodeResolve)(),(0,me.default)()];return n.push(j({sourcemap:r==="development",minify:r!=="development",target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"})),{inputOptions:{input:e,plugins:n},outputOptions:{file:t,format:"es",sourcemap:r==="development"}}}async function A(e){let{fileName:t,inputDir:r,outputDir:n,mode:o="development"}=e,i=N.default.join(r,`${t}.ts`);try{await pe.default.promises.access(i)}catch{console.error(`${i} is not exist`);return}let s=N.default.join(n,`${t}.js`),{inputOptions:p,outputOptions:c}=ht(i,s,o);await(await(0,ae.rollup)(p)).write(c)}var le=async e=>{let{manifest:t,mode:r,outputDir:n,inputDir:o}=e,s=t.getFunctionFiles().map(async p=>{await A({inputDir:o,fileName:p,outputDir:n,mode:r})});await Promise.all(s)};var ue=a(require("ora")),m=async(e,t)=>{var n,o;let r=(0,ue.default)(e.start).start();try{let i=await t();return r.succeed(e.succeed),i}catch(i){throw r.fail(`${e.error}: ${((o=(n=i==null?void 0:i.response)==null?void 0:n.data)==null?void 0:o.message)||i.message}`),i}};var de=a(require("fs-extra")),fe=require("@giteeteam/apps-manifest"),ge=a(require("path")),v=async()=>{let e=ge.default.resolve("manifest.yml"),t=await de.default.readFile(e);return new fe.Manifest(t.toString())};var ve=async({outputDir:e,inputDir:t,prod:r,copyFiles:n,zip:o})=>{let i=await v(),{version:s,key:p}=i.app;if(!p){console.error("manifest app key is required");return}if(!s){console.error("manifest app version is required");return}if(await ye.default.emptyDir(e),await m({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>le({outputDir:e,inputDir:t,manifest:i,mode:r?"production":"development"})),await m({start:"start package",error:"package failed",succeed:"package success"},()=>re({outputDir:e,manifest:i,copyFiles:n})),o){let c=`${p}_${s}.zip`;await m({start:"start archive",error:"archive failed",succeed:"archive success"},()=>ie(e,c))}};var B=a(require("path")),xt=["manifest.yml"],we=async e=>{let{input:t="src",output:r="package",prod:n,dev:o,copy:i=[],zip:s}=e;await ve({outputDir:B.default.resolve(r),inputDir:B.default.resolve(t),prod:n??!o,copyFiles:[...xt,...i],zip:s})};var K=a(require("inquirer")),b=a(require("fs-extra")),w=a(require("path"));var V=a(require("simple-git")),G=a(require("fs-extra")),he=async e=>{await(0,V.default)(e).init()},Pe=async(e,t)=>{await G.default.pathExists(t)||await G.default.mkdir(t),await(0,V.default)(t).clone(e,t)};var L=a(require("fs-extra")),xe="https://github.com/moriahq/apps-template.git",q=(r=>(r.micro="micro",r.uikit="uikit",r))(q||{}),Ee=async(e,t)=>{if(!await L.default.pathExists(e))return;let r=await L.default.readFile(e,{encoding:"utf-8"});await L.default.writeFile(e,r.replace(/{{(\w+)}}/g,(n,o)=>typeof t[o]=="string"?t[o]:n))};var Oe=require("chalk"),be=a(require("readline")),Re=a(require("execa")),Ot=e=>{if(!Oe.supportsColor){e.write("\r");return}be.default.cursorTo(e,0)},bt=(e,t)=>{let r=Math.min(Math.max(e/t,0),1),n=` ${e}/${t}`,o=Math.max(0,process.stderr.columns-n.length-3),i=Math.min(t,o),s=Math.round(i*r),p="#".repeat(s),c="-".repeat(i-s);Ot(process.stderr),process.stderr.write(`[${p}${c}]${n}`)},Rt=(e,t,r,n)=>new Promise((o,i)=>{var p;let s=(0,Re.default)(e,t,{cwd:r,stdio:["inherit","inherit","pipe"],env:n});(p=s.stderr)==null||p.on("data",c=>{let P=c.toString();if(/warning/.test(P))return;let g=P.match(/\[.*] (\d+)\/(\d+)/);if(g){bt(parseFloat(g[1]),parseFloat(g[2]));return}process.stderr.write(c)}),s.on("close",c=>{if(c!==0){i(new Error(`command failed: ${e} ${t.join(" ")}`));return}o()})}),De={executeCommand:Rt};var Dt=async()=>(await K.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],St=async()=>(await K.default.createPromptModule()({type:"input",name:"App key",message:"Please enter a valid app key",validate:r=>/^[a-z][a-z0-9_]*$/.test(r)?!0:(console.log(""),console.log("only supports letters, numbers, underscores and starts with letters"),!1)}))["App key"],At=async(e,t)=>{await m({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Pe(e,t))},Lt=async e=>{await m({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>De.executeCommand("yarn",["install"],e))},Se=async e=>{let{cwd:t}=e,r="micro",n=await Dt(),o=await St(),i=w.default.join(t,o);if(await b.default.pathExists(i)){console.error(`Project path already exists: ${i}`);return}await At(xe,i),await b.default.copy(w.default.join(i,r),i),await Promise.all(Object.values(q).map(p=>b.default.remove(w.default.join(i,p)))),await b.default.remove(w.default.join(i,"./.git"));let s=["./manifest.yml","./package.json","./webpack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx"];await Promise.all(s.map(p=>Ee(w.default.join(i,p),{appName:n,appKey:o}))),await Lt(i),await he(i),console.log("Project init success!"),console.log("Project path:"+i)};var Ae=async()=>{let e=process.cwd();await Se({cwd:e})};var k=a(require("inquirer"));var Le=a(require("axios")),_e=async({baseUrl:e,username:t,password:r})=>{var n;try{return{cookie:(n=(await(0,Le.default)({method:"POST",url:`${e}/api/gateway/login`,data:{username:t,password:r}})).headers)==null?void 0:n["set-cookie"]}}catch(o){return console.error("Login error:",o==null?void 0:o.message),{cookie:""}}};var ke=a(require("path")),Te=a(require("lowdb")),$e=a(require("lowdb/adapters/FileSync"));var _t=ke.default.join(__dirname,"user.json"),kt=new $e.default(_t),_=(0,Te.default)(kt),Ue=()=>{let e=_.get("version").value();(!e||e!==E)&&_.defaults({version:E,user:{}}).write()},z=e=>{Ue(),_.set("user",e).write()},h=()=>(Ue(),_.get("user").value());var Ce=a(require("validator/lib/isIP"));var Fe=e=>{let[,t]=e.split("//");return(0,Ce.default)(t)},Ie=e=>{try{return new URL(e).origin}catch{return e}};var Me=a(require("crypto")),je=a(require("base64url")),Tt=Buffer.from("ABCDEFGHIJKLM_iv","utf-8"),$t=Buffer.from("ABCDEFGHIJKL_key","utf-8"),Ut="aes-128-cbc";var Ne=e=>{try{let t=Me.default.createCipheriv(Ut,$t,Tt),r=t.update(e,"utf8","base64");return r+=t.final("base64"),je.default.toBase64(r)}catch(t){return console.error(`Encryption error: ${t}`),null}};var Ct=async()=>(await k.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>{try{return new URL(r),!0}catch{return"Please enter a valid domain name"}}})).Domain,Ft=async()=>(await k.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,It=async()=>(await k.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,Be=async({domain:e,username:t,password:r})=>{e||(e=await Ct()),e=Ie(e);let n=Fe(e);if(n)z({domain:e,dev:n}),console.info("Login success!");else{t||(t=await Ft()),r||(r=await It());let{cookie:o}=await _e({baseUrl:e,username:t,password:Ne(r)||r});o&&(z({domain:e,username:t,cookie:o,dev:n}),console.info("Login success!"))}};var Ge=async e=>{await Be(e)};var W=a(require("path"));var $=a(require("path")),U=a(require("fs-extra")),Ze=a(require("debug"));var Ve=a(require("axios"));var u=async({url:e,method:t,data:r,headers:n})=>{let{domain:o,cookie:i}=h();return(await(0,Ve.default)({method:t,baseURL:o,url:e,data:r,headers:{...n,cookie:i}})).data};var qe=async()=>{var t;return((t=(await u({method:"GET",url:"/apps/api/v1/config"}).catch(r=>{var n,o;console.info(`getRuntimeConfig error ${((o=(n=r==null?void 0:r.response)==null?void 0:n.data)==null?void 0:o.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:t.runtime)||{}};var T=require("child_process"),R=class{constructor(t,r){this.imageName=t,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:t,env:r,volume:n=[]}){await this.removeContainer();let o=Object.keys(r).map(p=>`-e ${p}=${r[p]}`).join(" "),i=n==null?void 0:n.map(p=>`-v ${p}`).join(" "),s=`docker run -d -p ${t}:${t} ${o} ${i} --name ${this.containerName} ${this.imageName}`;await this.execPromise(s)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let t=(0,T.spawn)("docker",["logs","-f",this.containerName]);t.stdout.on("data",r=>{console.log(`${r}`)}),t.stderr.on("data",r=>{console.log(`${r}`)})}execPromise(t){return new Promise((r,n)=>{(0,T.exec)(t,(o,i,s)=>{if(o)return n(o);r({stdout:i,stderr:s})})})}};var Ke=a(require("localtunnel"));var ze=async({appKey:e,runtimeHost:t,resources:r,resourcePort:n})=>{r!=null&&r.length&&r.forEach(o=>{o.path=`http://127.0.0.1:${n}`}),await u({method:"POST",url:`/apps/api/v1/apps/tunnel/${e}`,data:{resources:r,runtimeHost:t}}).catch(o=>{var i,s;console.info(`addTunnel error ${((s=(i=o==null?void 0:o.response)==null?void 0:i.data)==null?void 0:s.message)||(o==null?void 0:o.message)}`)})},We=async e=>{await u({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${e}`}).catch(()=>{})},He=async e=>{try{return(await(0,Ke.default)({port:e,host:"http://tunnel.gitee.work:1777"})).url}catch(t){return console.info("runTunnel error",t==null?void 0:t.message),""}};var Qe=a(require("chalk")),Mt=Qe.default.bold.red,d={error:e=>{console.info(Mt(e))}};var Xe=a(require("chokidar"));var Je=(e,t,r)=>{for(let n of e)A({inputDir:t,outputDir:r,fileName:n,mode:"development"})},Ye=async e=>{let{inputDir:t,outputDir:r}=e,o=(await v()).getFunctionFiles();Je(o,t,r);let i,s=Xe.default.watch(t);console.info(`watch: ${t}`),s.on("change",p=>{clearTimeout(i),i=setTimeout(()=>{console.info(`${p} has change`),Je(o,t,r)},1e3)})};var jt=(0,Ze.default)("cli:tunnel"),Nt=async()=>{let e=await qe(),t=process.env.RUNTIME_IMAGE||e.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455,n="cli-dev-apps-runtime-server",o={PORT:r,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||e.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||e.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||e.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||e.appsServerUrl,APPS_PARSE_SERVER_URL:process.env.APPS_PARSE_SERVER_URL||e.appsParseServerUrl,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};return{runtimeImage:t,containerPort:r,containerName:n,containerEnv:o}},Bt=async(e,t)=>{for(let r of t){let n=$.default.resolve(r),o=$.default.join(e,r);await U.default.copy(n,o)}},et=async e=>{var X,Y,Z;let{inputDir:t,outputDir:r,server:n,copy:o,resourcePort:i}=e;await U.default.emptyDir(r);let s=await v(),p=s.app.key,c=s.app.version,P=s.getFunctionFiles(),g=s.resources||[];if(!p){d.error("appKey is required!");return}if(!c){d.error("version is required!");return}let{domain:Q}=h();if(!Q){d.error("Please login in first!");return}let D=[],C=async()=>{await Promise.all(D.map(x=>x())),process.exit()};process.on("SIGINT",C),process.on("uncaughtException",C),process.on("unhandledRejection",C);let pt=`${`/${p}/development/${c}`}/server-side`,J=$.default.join(r,pt);await Bt(J,o),await Ye({inputDir:t,outputDir:J}),D.push(()=>U.default.remove(r));let F="";if(n&&P.length>0){let{runtimeImage:x,containerPort:ee,containerEnv:ct,containerName:mt}=await Nt(),S=new R(x,mt);await S.downloadImage(),await S.runContainer({port:ee,env:ct,volume:[`${r}:/usr/src/app/apps`]}),D.push(()=>S.removeContainer()),F=await m({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},()=>He(ee)),jt("runtimeHost",F),S.logs()}if(await ze({appKey:p,runtimeHost:F,resources:g,resourcePort:i}),D.push(()=>We(p)),n&&((Z=(Y=(X=s.getManifest())==null?void 0:X.modules)==null?void 0:Y.webtrigger)!=null&&Z.length)){console.log("You can use this url for test:");let x=`${Q}/apps/api/v1/:tenant/apps/${p}/environments/development/webtriggers/:webtriggerKey`;console.log(`POST ${x}`)}};var Gt=["manifest.yml"],tt=async e=>{let{copy:t=[],input:r="src",output:n="cache",server:o=!0,resourcePort:i}=e;await et({outputDir:W.default.resolve(n),inputDir:W.default.resolve(r),copy:[...Gt,...t],server:o,resourcePort:Number(i)||8e3})};var H=a(require("fs")),rt=a(require("path")),ot=a(require("form-data"));var nt=async(e,t)=>{if(!H.default.existsSync(e)){console.info(`file:${e} is not exist`);return}let r=new ot.default;r.append("environmentKey",t),r.append("package",H.default.createReadStream(rt.default.resolve(e))),await u({method:"POST",url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})};var it=(n=>(n.DEVELOPMENT="development",n.STAGING="staging",n.PRODUCTION="production",n))(it||{}),st=async(e,t)=>{let{domain:r}=h(),{environment:n="development"}=t;if(!Object.values(it).includes(n)){d.error("Only support development, staging, production environment.");return}if(!r){d.error("Please login in first!");return}await m({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>nt(e,n)).catch(()=>{})};var f=new at.Command;f.version(E,"-v -V --vers").description("Giteeteam Apps Cli");f.command("build").option("--prod","build in production").option("--dev","build in development").option("--no-zip","no archive").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir").action(we);f.command("init").action(Ae);f.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action(Ge);f.command("tunnel").option("-c --copy [letters...]","copy files").option("-i --input [dir]","input dir").option("-o --output [dir]","output dir,default cache").option("--no-server","no server").option("--resourcePort [number]","resource port").action(tt);f.command("deploy [filename]").option("-e --environment [environment]","app environment").action(st);f.parse(process.argv);
File without changes
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@giteeteam/apps-cli",
3
- "version": "0.5.5",
3
+ "version": "0.6.0",
4
4
  "description": "Giteeteam Apps cli",
5
5
  "keywords": [
6
6
  "typescript",
@@ -15,16 +15,9 @@
15
15
  "files": [
16
16
  "dist"
17
17
  ],
18
- "bugs": {
19
- "url": "https://github.com/moriahq/proxima/issues"
20
- },
21
- "homepage": "https://github.com/moriahq/proxima/tree/develop/giteeteam/packages/giteeteam/packages/apps-cli",
22
- "repository": {
23
- "type": "git",
24
- "url": "git+https://github.com/moriahq/proxima.git"
25
- },
26
18
  "scripts": {
27
- "build": "rm -rf dist && rollup -c rollup.config.ts --configPlugin typescript",
19
+ "build-back": "rm -rf dist && rollup -c rollup.config.ts --configPlugin typescript",
20
+ "build": "rm -rf dist && etsc",
28
21
  "prepublish": "pnpm build",
29
22
  "prepack": "pnpm build",
30
23
  "unlink": "yarn unlink",
@@ -37,7 +30,7 @@
37
30
  "registry": "https://registry.npmjs.org/"
38
31
  },
39
32
  "dependencies": {
40
- "@giteeteam/apps-manifest": "^0.4.1",
33
+ "@giteeteam/apps-manifest": "^0.6.5",
41
34
  "@rollup/plugin-commonjs": "^22.0.0",
42
35
  "@rollup/plugin-node-resolve": "13.3.0",
43
36
  "archiver": "^5.3.1",
@@ -45,19 +38,20 @@
45
38
  "base64url": "^3.0.1",
46
39
  "chalk": "^4.1.2",
47
40
  "chokidar": "^3.5.3",
48
- "commander": "^9.3.0",
41
+ "commander": "^11.1.0",
49
42
  "debug": "^4.3.4",
50
43
  "dotenv": "^16.3.1",
51
44
  "esbuild": "^0.18.11",
52
- "execa": "^5.1.1",
45
+ "execa": "5.1.1",
53
46
  "form-data": "^4.0.0",
54
- "fs-extra": "^10.1.0",
55
- "inquirer": "^8.2.4",
47
+ "fs-extra": "^11.1.1",
48
+ "inquirer": "^8.2.6",
56
49
  "localtunnel": "2.0.2",
57
50
  "lowdb": "1.0.0",
58
51
  "ora": "^5.4.1",
59
- "rollup": "^3.26.0",
60
- "simple-git": "^3.19.1"
52
+ "rollup": "^3.29.4",
53
+ "simple-git": "^3.19.1",
54
+ "validator": "^13.11.0"
61
55
  },
62
56
  "devDependencies": {
63
57
  "@rollup/plugin-json": "^6.0.0",
@@ -65,10 +59,12 @@
65
59
  "@rollup/plugin-typescript": "^11.1.2",
66
60
  "@types/archiver": "^5.3.1",
67
61
  "@types/debug": "^4.1.8",
68
- "@types/fs-extra": "^9.0.13",
69
- "@types/inquirer": "^8.2.1",
62
+ "@types/fs-extra": "^11.0.4",
63
+ "@types/inquirer": "^8.2.9",
70
64
  "@types/localtunnel": "2.0.1",
71
65
  "@types/lowdb": "1.0.11",
66
+ "@types/validator": "^13.11.1",
67
+ "esbuild-node-tsc": "^2.0.5",
72
68
  "rollup-plugin-typescript2": "^0.31.2",
73
69
  "typescript": "^4.8.3"
74
70
  },