gchcg-cli
Version:
1 lines • 1.65 kB
JavaScript
;const path=require("path"),{spawn:spawn}=require("child_process"),fse=require("fs-extra"),pkgDir=require("pkg-dir").sync,pathExists=require("path-exists").sync,{isObject:isObject}=require("./utils"),formatPath=require("./format-path");class Package{constructor(t){if(!t)throw new Error("Package类的options参数不能为空!");if(!isObject(t))throw new Error("Package类的options参数必须为对象!");this.isDir=t.isDir,this.targetPath=t.targetPath,this.storeDir=t.storeDir,this.packageName=t.packageName,this.packageVersion=t.packageVersion,this.gitUrl=t.gitUrl}async prepare(){this.storeDir&&!pathExists(this.storeDir)&&fse.mkdirpSync(this.storeDir)}get cacheFilePath(){return path.resolve(this.storeDir,`${this.packageName}`)}async exists(){return this.storeDir?(await this.prepare(),pathExists(this.cacheFilePath)):pathExists(this.targetPath)}async install(){return await this.prepare(),new Promise(((t,e)=>{const r=spawn("git",["clone",this.gitUrl,this.packageName],{cwd:this.storeDir,stdio:"inherit"});r.on("close",(r=>{0!==r?e(new Error(`Git clone exited with code ${r}`)):t()})),r.on("error",(t=>{e(t)}))}))}async update(){await this.prepare();const t=this.cacheFilePath;return new Promise(((e,r)=>{const i=spawn("git",["pull"],{cwd:t,stdio:"inherit"});i.on("close",(t=>{0!==t?r(new Error(`Git pull exited with code ${t}`)):e()})),i.on("error",(t=>{r(t)}))}))}getRootFilePath(){function t(t){const e=pkgDir(t);if(e){const t=require(path.resolve(e,"package.json"));if(t&&t.main)return formatPath(path.resolve(e,t.main))}return null}return this.storeDir?t(this.cacheFilePath):t(this.targetPath)}}module.exports=Package;