@giteeteam/apps-cli 0.5.4 → 0.5.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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"),o=require("fs-extra"),t=require("path"),r=require("archiver"),n=require("rollup"),s=require("fs"),a=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"),f=require("node:path"),g=require("lowdb"),h=require("lowdb/adapters/FileSync"),E=require("crypto"),P=require("base64url"),D=require("debug"),S=require("node:child_process"),$=require("localtunnel"),_=require("chokidar"),L=require("node:fs"),R=require("form-data"),k="0.5.4";const N={treeShaking:!0,format:"esm",loader:"tsx"};var O;function T(e,o,r=O.DEV){const n=[i.nodeResolve(),c()];var p;n.push((p={sourcemap:r===O.DEV,minify:r!==O.DEV,target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"},p={...N,...p},{name:"esbuild",resolveId(e,o,r){if(!o||[".ts",".tsx",".js",".jsx",".mjs",".json"].some((o=>e.endsWith(o))))return e;const n=t.dirname(o);let a;if(s.existsSync(a=t.resolve(n,e,"index.ts")))return a;if(s.existsSync(a=t.resolve(n,e,"index.tsx")))return a;if(s.existsSync(a=t.resolve(n,e+".ts")))return a;if(s.existsSync(a=t.resolve(n,e+".tsx")))return a;throw console.error({source:e,importer:o,options:r}),a=t.relative(".",t.resolve(o,e)),new Error(`ENOENT: ${a.replace(/\\/g,"/")}`)},async transform(e,o){p.sourcefile=o,p.loader=o.endsWith(".json")?"json":p.loader;const{code:t,map:r}=await a.transform(e,p);return r?{code:t,map:r}:t}}));return{inputOptions:{input:e,plugins:n},outputOptions:{file:o,format:"es",sourcemap:r===O.DEV}}}async function j(e){const{fileName:o,inputDir:r,outputDir:a,mode:i=O.DEV}=e,c=t.join(r,`${o}.ts`);try{await s.promises.access(c)}catch(e){return void console.error(`${c} is not exist`)}const p=t.join(a,`${o}.js`),{inputOptions:u,outputOptions:l}=T(c,p,i),d=await n.rollup(u);await d.write(l)}!function(e){e.DEV="development",e.PROD="production"}(O||(O={}));const x=async(e,o)=>{var t,r;const n=p(e.start).start();try{const t=await o();return n.succeed(e.succeed),t}catch(o){throw n.fail(`${e.error}: ${(null===(r=null===(t=null==o?void 0:o.response)||void 0===t?void 0:t.data)||void 0===r?void 0:r.message)||o.message}`),o}},q=async()=>{const e=t.resolve("manifest.yml"),r=await o.readFile(e);return new u.Manifest(r.toString())};var C=async({outputDir:e,inputDir:n,prod:s,copyFiles:a,zip:i})=>{const c=await q(),{version:p,key:u}=c.app;if(u)if(p){if(await o.emptyDir(e),await x({start:"start bundle",error:"bundle failed",succeed:"bundle success"},(()=>(async e=>{const{manifest:o,mode:t,outputDir:r,inputDir:n}=e,s=o.getFunctionFiles().map((async e=>{await j({inputDir:n,fileName:e,outputDir:r,mode:t})}));await Promise.all(s)})({outputDir:e,inputDir:n,manifest:c,mode:s?O.PROD:O.DEV}))),await x({start:"start package",error:"package failed",succeed:"package success"},(()=>(async({outputDir:e,manifest:r,copyFiles:n})=>{const{resources:s}=r;if(s)for(const{key:r,path:n}of s){const s=t.resolve(t.join("./",n)),a=t.join(e,r);await o.copy(s,a)}for(const r of n){const n=t.resolve(r),s=t.join(e,r);await o.copy(n,s)}})({outputDir:e,manifest:c,copyFiles:a}))),i){const n=`${u}_${p}.zip`;await x({start:"start archive",error:"archive failed",succeed:"archive success"},(()=>(async(e,n)=>{const s=t.resolve(n);return await o.remove(s),new Promise(((t,n)=>{const a=o.createWriteStream(s),i=r("zip",{zlib:{level:9}});a.on("close",(function(){t()})),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(a),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 I=["manifest.yml"];var b;!function(e){e.micro="micro",e.uikit="uikit"}(b||(b={}));const A=(e,o)=>{const t=Math.min(Math.max(e/o,0),1),r=` ${e}/${o}`,n=Math.max(0,process.stderr.columns-r.length-3),s=Math.min(o,n),a=Math.round(s*t),i="#".repeat(a),c="-".repeat(s-a);var p;p=process.stderr,m.supportsColor?v.cursorTo(p,0):p.write("\r"),process.stderr.write(`[${i}${c}]${r}`)},F=(e,o,t,r)=>new Promise(((n,s)=>{var a;const i=w(e,o,{cwd:t,stdio:["inherit","inherit","pipe"],env:r});null===(a=i.stderr)||void 0===a||a.on("data",(e=>{const o=e.toString();if(/warning/.test(o))return;const t=o.match(/\[.*] (\d+)\/(\d+)/);t?A(parseFloat(t[1]),parseFloat(t[2])):process.stderr.write(e)})),i.on("close",(t=>{0===t?n():s(new Error(`command failed: ${e} ${o.join(" ")}`))}))})),M=async(e,t)=>{await x({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},(()=>(async(e,t)=>{await o.pathExists(t)||await o.mkdir(t);const r=d(t);await r.clone(e,t)})(e,t)))};var U=async e=>{const{cwd:r}=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"]})(),s=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"]})(),a=t.join(r,s);if(await o.pathExists(a))return void console.error(`Project path already exists: ${a}`);await M("https://github.com/moriahq/apps-template.git",a),await o.copy(t.join(a,"micro"),a),await Promise.all(Object.values(b).map((e=>o.remove(t.join(a,e))))),await o.remove(t.join(a,"./.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 o.pathExists(e))return;const r=await o.readFile(e,{encoding:"utf-8"});await o.writeFile(e,r.replace(/{{(\w+)}}/g,((e,o)=>"string"==typeof t[o]?t[o]:e)))})(t.join(a,e),{appName:n,appKey:s})))),await(async e=>{await x({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},(()=>F("yarn",["install"],e)))})(a),await(async e=>{const o=d(e);await o.init()})(a),console.log("Project init success!"),console.log("Project path:"+a)};const G=g(new h(f.join(__dirname,"user.json"))),V=()=>{const e=G.get("version").value();e&&e===k||G.defaults({version:k,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 o=E.createCipheriv("aes-128-cbc",Q,K);let t=o.update(e,"utf8","base64");return t+=o.final("base64"),P.toBase64(t)}catch(e){return console.error(`Encryption error: ${e}`),null}};var W=async({domain:e,username:o,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 r=(e=>{const[,o]=e.split("//");return(e=>/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/.test(e))(o)})(e);if(r)z({domain:e,dev:r}),console.info("Login success!");else{o||(o=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:n}=await(async({baseUrl:e,username:o,password:t})=>{var r;try{return{cookie:null===(r=(await y({method:"POST",url:`${e}/api/gateway/login`,data:{username:o,password:t}})).headers)||void 0===r?void 0:r["set-cookie"]}}catch(e){return console.error("Login error:",null==e?void 0:e.message),{cookie:""}}})({baseUrl:e,username:o,password:H(t)||t});n&&(z({domain:e,username:o,cookie:n,dev:r}),console.info("Login success!"))}};class J{constructor(e,o){this.imageName=e,this.containerName=o}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:o,volume:t=[]}){await this.removeContainer();const r=`docker run -d -p ${e}:${e} ${Object.keys(o).map((e=>`-e ${e}=${o[e]}`)).join(" ")} ${null==t?void 0:t.map((e=>`-v ${e}`)).join(" ")} --name ${this.containerName} ${this.imageName}`;await this.execPromise(r)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch((()=>{}))}logs(){const e=S.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(((o,t)=>{S.exec(e,((e,r,n)=>{if(e)return t(e);o({stdout:r,stderr:n})}))}))}}const Y=process.env.RESOURCES||'[{"key":"main","path":"http://127.0.0.1:8000"}]',X=m.bold.red;var Z=e=>{console.info(X(e))};const ee=(e,o,t)=>{for(const r of e)j({inputDir:o,outputDir:t,fileName:r,mode:O.DEV})},oe=D("cli:tunnel");var te=async e=>{var t,r,n;const{inputDir:s,outputDir:a,server:i,copy:c}=e;await o.emptyDir(a);const p=await q(),u=p.app.key,l=p.app.version,d=p.getFunctionFiles();if(!u)return void Z("appKey is required!");if(!l)return void Z("version is required!");const{domain:m}=B();if(!m)return void Z("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 g=`${`/${u}/development/${l}`}/server-side`,h=f.join(a,g);await(async(e,t)=>{for(const r of t){const t=f.resolve(r),n=f.join(e,r);await o.copy(t,n)}})(h,c),await(async e=>{const{inputDir:o,outputDir:t}=e,r=(await q()).getFunctionFiles();let n;ee(r,o,t);const s=_.watch(o);console.info(`watch: ${o}`),s.on("change",(e=>{clearTimeout(n),n=setTimeout((()=>{console.info(`${e} has change`),ee(r,o,t)}),1e3)}))})({inputDir:s,outputDir:h}),v.push((()=>o.remove(a)));let E="";if(i&&d.length>0){const{runtimeImage:e,containerPort:o,containerEnv:t,containerName:r}=(()=>{const e=process.env.RUNTIME_IMAGE||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.2.0-alpha-84",o=Number(process.env.CONTAINER_PORT)||8455;return{runtimeImage:e,containerPort:o,containerName:"cli-dev-apps-runtime-server",containerEnv:{PORT:o,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}}})(),n=new J(e,r);await n.downloadImage(),await n.runContainer({port:o,env:t,volume:[`${a}:/usr/src/app/apps`]}),v.push((()=>n.removeContainer())),E=await x({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),""}})(o))),oe("runtimeHost",E),n.logs()}if(await(async(e,o)=>{const{domain:t,cookie:r}=B();await y({method:"POST",url:`${t}/apps/api/v1/apps/tunnel/${e}`,data:{resources:JSON.parse(Y),runtimeHost:o},headers:{cookie:r}}).catch((e=>{var o,t;console.info(`addTunnel error ${(null===(t=null===(o=null==e?void 0:e.response)||void 0===o?void 0:o.data)||void 0===t?void 0:t.message)||(null==e?void 0:e.message)}`)}))})(u,E),v.push((()=>(async e=>{const{domain:o,cookie:t}=B();await y({method:"DELETE",url:`${o}/apps/api/v1/apps/tunnel/${e}`,headers:{cookie:t}}).catch((()=>{}))})(u))),i&&(null===(n=null===(r=null===(t=p.getManifest())||void 0===t?void 0:t.modules)||void 0===r?void 0:r.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 re=["manifest.yml"];var ne;!function(e){e.DEVELOPMENT="development",e.STAGING="staging",e.PRODUCTION="production"}(ne||(ne={}));const se=new e.Command;se.version(k).description("Giteeteam Apps Cli"),se.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:o="src",output:r="dist",prod:n,copy:s=[],zip:a}=e;await C({outputDir:t.resolve(r),inputDir:t.resolve(o),prod:!!n,copyFiles:[...I,...s],zip:a})})),se.command("init").action((async()=>{const e=process.cwd();await U({cwd:e})})),se.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)})),se.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:o=[],input:r="src",output:n="cache",server:s=!0}=e;await te({outputDir:t.resolve(n),inputDir:t.resolve(r),copy:[...re,...o],server:s})})),se.command("deploy [filename]").option("-e --environment [environment]","app environment").action((async(e,o)=>{const{domain:t}=B(),{environment:r=ne.DEVELOPMENT}=o;Object.values(ne).includes(r)?t?await x({start:"start deploy",error:"deploy failed",succeed:"deploy success"},(()=>(async(e,o)=>{const{domain:t,cookie:r}=B();if(!L.existsSync(e))return void console.info("文件不存在");const n=new R;n.append("environmentKey",o),n.append("package",L.createReadStream(f.resolve(e))),await y({method:"POST",url:`${t}/apps/api/v1/apps/deploy`,data:n,headers:{cookie:r,...n.getHeaders()}})})(e,r))).catch((()=>{})):Z("Please login in first!"):Z("Only support development, staging, production environment.")})),se.parse(process.argv);
2
+ "use strict";var Pe=Object.create;var at=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var be=Object.getPrototypeOf,Se=Object.prototype.hasOwnProperty;var pt=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Oe(e))!Se.call(t,n)&&n!==r&&at(t,n,{get:()=>e[n],enumerable:!(o=Ee(e,n))||o.enumerable});return t};var s=(t,e,r)=>(r=t!=null?Pe(be(t)):{},De(e||!t||!t.__esModule?at(r,"default",{value:t,enumerable:!0}):r,t));var Gt=pt((R,X)=>{"use strict";Object.defineProperty(R,"__esModule",{value:!0});R.default=Ge;function F(t){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?F=function(r){return typeof r}:F=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},F(t)}function Ge(t){var e=typeof t=="string"||t instanceof String;if(!e){var r=F(t);throw t===null?r="null":r==="object"&&(r=t.constructor.name),new TypeError("Expected a string but received a ".concat(r))}}X.exports=R.default;X.exports.default=R.default});var Vt=pt((A,Z)=>{"use strict";Object.defineProperty(A,"__esModule",{value:!0});A.default=Y;var qe=Ve(Gt());function Ve(t){return t&&t.__esModule?t:{default:t}}var qt="(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])",d="(".concat(qt,"[.]){3}").concat(qt),ze=new RegExp("^".concat(d,"$")),c="(?:[0-9a-fA-F]{1,4})",Ke=new RegExp("^("+"(?:".concat(c,":){7}(?:").concat(c,"|:)|")+"(?:".concat(c,":){6}(?:").concat(d,"|:").concat(c,"|:)|")+"(?:".concat(c,":){5}(?::").concat(d,"|(:").concat(c,"){1,2}|:)|")+"(?:".concat(c,":){4}(?:(:").concat(c,"){0,1}:").concat(d,"|(:").concat(c,"){1,3}|:)|")+"(?:".concat(c,":){3}(?:(:").concat(c,"){0,2}:").concat(d,"|(:").concat(c,"){1,4}|:)|")+"(?:".concat(c,":){2}(?:(:").concat(c,"){0,3}:").concat(d,"|(:").concat(c,"){1,5}|:)|")+"(?:".concat(c,":){1}(?:(:").concat(c,"){0,4}:").concat(d,"|(:").concat(c,"){1,6}|:)|")+"(?::((?::".concat(c,"){0,5}:").concat(d,"|(?::").concat(c,"){1,7}|:))")+")(%[0-9a-zA-Z-.:]{1,})?$");function Y(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"";return(0,qe.default)(t),e=String(e),e?e==="4"?ze.test(t):e==="6"?Ke.test(t):!1:Y(t,4)||Y(t,6)}Z.exports=A.default;Z.exports.default=A.default});var Ao=require("dotenv/config"),ve=require("commander");var b="0.5.6";var Ot=s(require("fs-extra"));var B=s(require("fs-extra")),w=s(require("path")),ct=async({outputDir:t,manifest:e,copyFiles:r})=>{let{resources:o}=e;if(o)for(let{key:n,path:i}of o){let a=w.default.resolve(w.default.join("./",i)),p=w.default.join(t,n);await B.default.copy(a,p)}for(let n of r){let i=w.default.resolve(n),a=w.default.join(t,n);await B.default.copy(i,a)}};var mt=s(require("path")),lt=s(require("archiver")),G=s(require("fs-extra")),ut=async(t,e)=>{let r=mt.default.resolve(e);return await G.default.remove(r),new Promise((o,n)=>{let i=G.default.createWriteStream(r),a=(0,lt.default)("zip",{zlib:{level:9}});i.on("close",function(){o()}),a.on("warning",function(p){console.log(p),p.code==="ENOENT"||n(p)}),a.on("error",function(p){console.log(p),n(p)}),a.pipe(i),a.directory(t,!1),a.finalize()})};var dt=require("rollup"),V=s(require("path")),gt=s(require("fs"));var S=require("fs"),u=require("path"),ft=require("esbuild"),Ae={treeShaking:!0,format:"esm",loader:"tsx"};function q(t){return t={...Ae,...t},{name:"esbuild",resolveId(e,r,o){if(!r||[".ts",".tsx",".js",".jsx",".mjs",".json"].some(a=>e.endsWith(a)))return e;let n=(0,u.dirname)(r),i;if((0,S.existsSync)(i=(0,u.resolve)(n,e,"index.ts")))return i;if((0,S.existsSync)(i=(0,u.resolve)(n,e,"index.tsx")))return i;if((0,S.existsSync)(i=(0,u.resolve)(n,e+".ts")))return i;if((0,S.existsSync)(i=(0,u.resolve)(n,e+".tsx")))return i;throw console.error({source:e,importer:r,options:o}),i=(0,u.relative)(".",(0,u.resolve)(r,e)),new Error(`ENOENT: ${i.replace(/\\/g,"/")}`)},async transform(e,r){t.sourcefile=r,t.loader=r.endsWith(".json")?"json":t.loader;let{code:o,map:n}=await(0,ft.transform)(e,t);return n?{code:o,map:n}:o}}}var yt=require("@rollup/plugin-node-resolve"),vt=s(require("@rollup/plugin-commonjs"));function _e(t,e,r="development"){let o=[(0,yt.nodeResolve)(),(0,vt.default)()];return o.push(q({sourcemap:r==="development",minify:r!=="development",target:"es2018",jsx:"transform",jsxFactory:"AppsUI.createElement",jsxFragment:"AppsUI.Fragment"})),{inputOptions:{input:t,plugins:o},outputOptions:{file:e,format:"es",sourcemap:r==="development"}}}async function k(t){let{fileName:e,inputDir:r,outputDir:o,mode:n="development"}=t,i=V.default.join(r,`${e}.ts`);try{await gt.default.promises.access(i)}catch{console.error(`${i} is not exist`);return}let a=V.default.join(o,`${e}.js`),{inputOptions:p,outputOptions:m}=_e(i,a,n);await(await(0,dt.rollup)(p)).write(m)}var ht=async t=>{let{manifest:e,mode:r,outputDir:o,inputDir:n}=t,a=e.getFunctionFiles().map(async p=>{await k({inputDir:n,fileName:p,outputDir:o,mode:r})});await Promise.all(a)};var wt=s(require("ora")),l=async(t,e)=>{var o,n;let r=(0,wt.default)(t.start).start();try{let i=await e();return r.succeed(t.succeed),i}catch(i){throw r.fail(`${t.error}: ${((n=(o=i==null?void 0:i.response)==null?void 0:o.data)==null?void 0:n.message)||i.message}`),i}};var xt=s(require("fs-extra")),Pt=require("@giteeteam/apps-manifest"),Et=s(require("path")),x=async()=>{let t=Et.default.resolve("manifest.yml"),e=await xt.default.readFile(t);return new Pt.Manifest(e.toString())};var bt=async({outputDir:t,inputDir:e,prod:r,copyFiles:o,zip:n})=>{let i=await x(),{version:a,key:p}=i.app;if(!p){console.error("manifest app key is required");return}if(!a){console.error("manifest app version is required");return}if(await Ot.default.emptyDir(t),await l({start:"start bundle",error:"bundle failed",succeed:"bundle success"},()=>ht({outputDir:t,inputDir:e,manifest:i,mode:r?"production":"development"})),await l({start:"start package",error:"package failed",succeed:"package success"},()=>ct({outputDir:t,manifest:i,copyFiles:o})),n){let m=`${p}_${a}.zip`;await l({start:"start archive",error:"archive failed",succeed:"archive success"},()=>ut(t,m))}};var z=s(require("path")),ke=["manifest.yml"],St=async t=>{let{input:e="src",output:r="dist",prod:o,copy:n=[],zip:i}=t;await bt({outputDir:z.default.resolve(r),inputDir:z.default.resolve(e),prod:!!o,copyFiles:[...ke,...n],zip:i})};var H=s(require("inquirer")),D=s(require("fs-extra")),P=s(require("path"));var W=s(require("simple-git")),K=s(require("fs-extra")),Dt=async t=>{await(0,W.default)(t).init()},Rt=async(t,e)=>{await K.default.pathExists(e)||await K.default.mkdir(e),await(0,W.default)(e).clone(t,e)};var T=s(require("fs-extra")),At="https://github.com/moriahq/apps-template.git",Q=(r=>(r.micro="micro",r.uikit="uikit",r))(Q||{}),_t=async(t,e)=>{if(!await T.default.pathExists(t))return;let r=await T.default.readFile(t,{encoding:"utf-8"});await T.default.writeFile(t,r.replace(/{{(\w+)}}/g,(o,n)=>typeof e[n]=="string"?e[n]:o))};var Lt=require("chalk"),kt=s(require("readline")),Tt=s(require("execa")),$e=t=>{if(!Lt.supportsColor){t.write("\r");return}kt.default.cursorTo(t,0)},Fe=(t,e)=>{let r=Math.min(Math.max(t/e,0),1),o=` ${t}/${e}`,n=Math.max(0,process.stderr.columns-o.length-3),i=Math.min(e,n),a=Math.round(i*r),p="#".repeat(a),m="-".repeat(i-a);$e(process.stderr),process.stderr.write(`[${p}${m}]${o}`)},Ie=(t,e,r,o)=>new Promise((n,i)=>{var p;let a=(0,Tt.default)(t,e,{cwd:r,stdio:["inherit","inherit","pipe"],env:o});(p=a.stderr)==null||p.on("data",m=>{let h=m.toString();if(/warning/.test(h))return;let f=h.match(/\[.*] (\d+)\/(\d+)/);if(f){Fe(parseFloat(f[1]),parseFloat(f[2]));return}process.stderr.write(m)}),a.on("close",m=>{if(m!==0){i(new Error(`command failed: ${t} ${e.join(" ")}`));return}n()})}),$t={executeCommand:Ie};var Ce=async()=>(await H.default.createPromptModule()({type:"input",name:"App Name",message:"Please enter an app name",validate:r=>!!r}))["App Name"],Me=async()=>(await H.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"],Ue=async(t,e)=>{await l({start:"Start clone repository",error:"Clone repository failed!",succeed:"Clone repository success!"},()=>Rt(t,e))},Ne=async t=>{await l({start:"Start install dependencies",error:"Install dependencies failed!",succeed:"Install dependencies success!"},()=>$t.executeCommand("yarn",["install"],t))},Ft=async t=>{let{cwd:e}=t,r="micro",o=await Ce(),n=await Me(),i=P.default.join(e,n);if(await D.default.pathExists(i)){console.error(`Project path already exists: ${i}`);return}await Ue(At,i),await D.default.copy(P.default.join(i,r),i),await Promise.all(Object.values(Q).map(p=>D.default.remove(P.default.join(i,p)))),await D.default.remove(P.default.join(i,"./.git"));let a=["./manifest.yml","./package.json","./webpack.config.js","./public/index.html","./src/App.tsx","./src/index.tsx"];await Promise.all(a.map(p=>_t(P.default.join(i,p),{appName:o,appKey:n}))),await Ne(i),await Dt(i),console.log("Project init success!"),console.log("Project path:"+i)};var It=async()=>{let t=process.cwd();await Ft({cwd:t})};var I=s(require("inquirer"));var Ct=s(require("axios")),Mt=async({baseUrl:t,username:e,password:r})=>{var o;try{return{cookie:(o=(await(0,Ct.default)({method:"POST",url:`${t}/api/gateway/login`,data:{username:e,password:r}})).headers)==null?void 0:o["set-cookie"]}}catch(n){return console.error("Login error:",n==null?void 0:n.message),{cookie:""}}};var Ut=s(require("path")),Nt=s(require("lowdb")),jt=s(require("lowdb/adapters/FileSync"));var je=Ut.default.join(__dirname,"user.json"),Be=new jt.default(je),$=(0,Nt.default)(Be),Bt=()=>{let t=$.get("version").value();(!t||t!==b)&&$.defaults({version:b,user:{}}).write()},J=t=>{Bt(),$.set("user",t).write()},E=()=>(Bt(),$.get("user").value());var zt=s(Vt());var Kt=t=>{let[,e]=t.split("//");return(0,zt.default)(e)},Wt=t=>{try{return new URL(t).origin}catch{return t}};var Qt=s(require("crypto")),Ht=s(require("base64url")),We=Buffer.from("ABCDEFGHIJKLM_iv","utf-8"),Qe=Buffer.from("ABCDEFGHIJKL_key","utf-8"),He="aes-128-cbc";var Jt=t=>{try{let e=Qt.default.createCipheriv(He,Qe,We),r=e.update(t,"utf8","base64");return r+=e.final("base64"),Ht.default.toBase64(r)}catch(e){return console.error(`Encryption error: ${e}`),null}};var Je=async()=>(await I.default.createPromptModule()({type:"input",name:"Domain",message:"Please enter the domain address",validate:r=>!!r})).Domain,Xe=async()=>(await I.default.createPromptModule()({type:"input",name:"Username",message:"Please enter username",validate:r=>!!r})).Username,Ye=async()=>(await I.default.createPromptModule()({type:"password",name:"Password",message:"Please enter password",validate:r=>!!r})).Password,Xt=async({domain:t,username:e,password:r})=>{t||(t=await Je()),t=Wt(t);let o=Kt(t);if(o)J({domain:t,dev:o}),console.info("Login success!");else{e||(e=await Xe()),r||(r=await Ye());let{cookie:n}=await Mt({baseUrl:t,username:e,password:Jt(r)||r});n&&(J({domain:t,username:e,cookie:n,dev:o}),console.info("Login success!"))}};var Yt=async t=>{await Xt(t)};var tt=s(require("path"));var M=s(require("path")),U=s(require("fs-extra")),ce=s(require("debug"));var Zt=s(require("axios"));var g=async({url:t,method:e,data:r,headers:o})=>{let{domain:n,cookie:i}=E();return(await(0,Zt.default)({method:e,baseURL:n,url:t,data:r,headers:{...o,cookie:i}})).data};var te=async()=>{var e;return((e=(await g({method:"GET",url:"/apps/api/v1/config"}).catch(r=>{var o,n;console.info(`getRuntimeConfig error ${((n=(o=r==null?void 0:r.response)==null?void 0:o.data)==null?void 0:n.message)||(r==null?void 0:r.message)}`)})).data)==null?void 0:e.runtime)||{}};var C=require("child_process"),_=class{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:o=[]}){await this.removeContainer();let n=Object.keys(r).map(p=>`-e ${p}=${r[p]}`).join(" "),i=o==null?void 0:o.map(p=>`-v ${p}`).join(" "),a=`docker run -d -p ${e}:${e} ${n} ${i} --name ${this.containerName} ${this.imageName}`;await this.execPromise(a)}async removeContainer(){await this.execPromise(`docker rm -f ${this.containerName}`).catch(()=>{})}logs(){let e=(0,C.spawn)("docker",["logs","-f",this.containerName]);e.stdout.on("data",r=>{console.log(`${r}`)}),e.stderr.on("data",r=>{console.log(`${r}`)})}execPromise(e){return new Promise((r,o)=>{(0,C.exec)(e,(n,i,a)=>{if(n)return o(n);r({stdout:i,stderr:a})})})}};var ee=s(require("localtunnel"));var Ze=process.env.RESOURCES||'[{"key":"main","path":"http://127.0.0.1:8000"}]',re=async(t,e)=>{await g({method:"POST",url:`/apps/api/v1/apps/tunnel/${t}`,data:{resources:JSON.parse(Ze),runtimeHost:e}}).catch(r=>{var o,n;console.info(`addTunnel error ${((n=(o=r==null?void 0:r.response)==null?void 0:o.data)==null?void 0:n.message)||(r==null?void 0:r.message)}`)})},oe=async t=>{await g({method:"DELETE",url:`/apps/api/v1/apps/tunnel/${t}`}).catch(()=>{})},ne=async t=>{try{return(await(0,ee.default)({port:t,host:"http://tunnel.gitee.work:1777"})).url}catch(e){return console.info("runTunnel error",e==null?void 0:e.message),""}};var ie=s(require("chalk")),tr=ie.default.bold.red,y={error:t=>{console.info(tr(t))}};var ae=s(require("chokidar"));var se=(t,e,r)=>{for(let o of t)k({inputDir:e,outputDir:r,fileName:o,mode:"development"})},pe=async t=>{let{inputDir:e,outputDir:r}=t,n=(await x()).getFunctionFiles();se(n,e,r);let i,a=ae.default.watch(e);console.info(`watch: ${e}`),a.on("change",p=>{clearTimeout(i),i=setTimeout(()=>{console.info(`${p} has change`),se(n,e,r)},1e3)})};var er=(0,ce.default)("cli:tunnel"),rr=async()=>{let t=await te(),e=process.env.RUNTIME_IMAGE||t.image||"docker-hub.gitee.work/gitee-prod/proxima-apps-runtime-server:4.4.0-alpha-86",r=Number(process.env.CONTAINER_PORT)||8455,o="cli-dev-apps-runtime-server",n={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||t.parsePublicServerUrl,PARSE_SERVER_MASTER_KEY:process.env.PARSE_SERVER_MASTER_KEY||t.parseServerMasterKey,PROXIMA_CORE_URL:process.env.PROXIMA_CORE_URL||t.proximaCoreUrl,APPS_SERVER_URL:process.env.APPS_SERVER_URL||t.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};return{runtimeImage:e,containerPort:r,containerName:o,containerEnv:n}},or=async(t,e)=>{for(let r of e){let o=M.default.resolve(r),n=M.default.join(t,r);await U.default.copy(o,n)}},me=async t=>{var ot,nt,it;let{inputDir:e,outputDir:r,server:o,copy:n}=t;await U.default.emptyDir(r);let i=await x(),a=i.app.key,p=i.app.version,m=i.getFunctionFiles();if(!a){y.error("appKey is required!");return}if(!p){y.error("version is required!");return}let{domain:h}=E();if(!h){y.error("Please login in first!");return}let f=[],N=async()=>{await Promise.all(f.map(O=>O())),process.exit()};process.on("SIGINT",N),process.on("uncaughtException",N),process.on("unhandledRejection",N);let he=`${`/${a}/development/${p}`}/server-side`,rt=M.default.join(r,he);await or(rt,n),await pe({inputDir:e,outputDir:rt}),f.push(()=>U.default.remove(r));let j="";if(o&&m.length>0){let{runtimeImage:O,containerPort:st,containerEnv:we,containerName:xe}=await rr(),L=new _(O,xe);await L.downloadImage(),await L.runContainer({port:st,env:we,volume:[`${r}:/usr/src/app/apps`]}),f.push(()=>L.removeContainer()),j=await l({start:"start tunnel",error:"tunnel failed",succeed:"tunnel success"},()=>ne(st)),er("runtimeHost",j),L.logs()}if(await re(a,j),f.push(()=>oe(a)),o&&((it=(nt=(ot=i.getManifest())==null?void 0:ot.modules)==null?void 0:nt.webtrigger)!=null&&it.length)){console.log("You can use this url for test:");let O=`${h}/apps/api/v1/:tenant/apps/${a}/environments/development/webtriggers/:webtriggerKey`;console.log(`POST ${O}`)}};var nr=["manifest.yml"],le=async t=>{let{copy:e=[],input:r="src",output:o="cache",server:n=!0}=t;await me({outputDir:tt.default.resolve(o),inputDir:tt.default.resolve(r),copy:[...nr,...e],server:n})};var et=s(require("fs")),ue=s(require("path")),fe=s(require("form-data"));var de=async(t,e)=>{if(!et.default.existsSync(t)){console.info(`file:${t} is not exist`);return}let r=new fe.default;r.append("environmentKey",e),r.append("package",et.default.createReadStream(ue.default.resolve(t))),await g({method:"POST",url:"/apps/api/v1/apps/deploy",data:r,headers:{...r.getHeaders()}})};var ge=(o=>(o.DEVELOPMENT="development",o.STAGING="staging",o.PRODUCTION="production",o))(ge||{}),ye=async(t,e)=>{let{domain:r}=E(),{environment:o="development"}=e;if(!Object.values(ge).includes(o)){y.error("Only support development, staging, production environment.");return}if(!r){y.error("Please login in first!");return}await l({start:"start deploy",error:"deploy failed",succeed:"deploy success"},()=>de(t,o)).catch(()=>{})};var v=new ve.Command;v.version(b).description("Giteeteam Apps Cli");v.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(St);v.command("init").action(It);v.command("login").option("--domain [domain]","login domain").option("-u --username [username]","login username").option("-p --password [password]","login user password").action(Yt);v.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(le);v.command("deploy [filename]").option("-e --environment [environment]","app environment").action(ye);v.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.4",
3
+ "version": "0.5.6",
4
4
  "description": "Giteeteam Apps cli",
5
5
  "keywords": [
6
6
  "typescript",
@@ -24,7 +24,8 @@
24
24
  "url": "git+https://github.com/moriahq/proxima.git"
25
25
  },
26
26
  "scripts": {
27
- "build": "rm -rf dist && rollup -c rollup.config.ts --configPlugin typescript",
27
+ "build-back": "rm -rf dist && rollup -c rollup.config.ts --configPlugin typescript",
28
+ "build": "rm -rf dist && etsc",
28
29
  "prepublish": "pnpm build",
29
30
  "prepack": "pnpm build",
30
31
  "unlink": "yarn unlink",
@@ -69,8 +70,11 @@
69
70
  "@types/inquirer": "^8.2.1",
70
71
  "@types/localtunnel": "2.0.1",
71
72
  "@types/lowdb": "1.0.11",
73
+ "@types/validator": "^13.11.1",
74
+ "esbuild-node-tsc": "^2.0.5",
72
75
  "rollup-plugin-typescript2": "^0.31.2",
73
- "typescript": "^4.8.3"
76
+ "typescript": "^4.8.3",
77
+ "validator": "^13.11.0"
74
78
  },
75
79
  "engines": {
76
80
  "node": ">=14.18.0"