UNPKG

@ycmd/creds

Version:

LSK.js CLI Creds is the easiest way to manage GitHub / Gitlab secrets and credentials

5 lines 8 kB
var V=Object.create;var g=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var G=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var l=(a,e)=>g(a,"name",{value:e,configurable:!0});var q=(a,e)=>{for(var t in e)g(a,t,{get:e[t],enumerable:!0})},O=(a,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of B(e))!F.call(a,o)&&o!==t&&g(a,o,{get:()=>e[o],enumerable:!(r=A(e,o))||r.enumerable});return a};var S=(a,e,t)=>(t=a!=null?V(G(a)):{},O(e||!a||!a.__esModule?g(t,"default",{value:a,enumerable:!0}):t,a)),z=a=>O(g({},"__esModule",{value:!0}),a);var J={};q(J,{buildCommand:()=>x,buildDeepCommand:()=>X});module.exports=z(J);var N=require("@lskjs/err"),y=require("@lskjs/log/log"),E=require("@lskjs/stringify"),b=require("fishbird"),H=require("fs"),I=require("fs/promises");var m=require("@lskjs/err"),C=S(require("libsodium-wrappers"));var d=require("@lskjs/err"),c=require("@lskjs/log/log"),U=S(require("axios")),v=require("fishbird");var p=class{static{l(this,"Service")}projectId;projectName;projectPath;projectCredsUrl;token;server;force;client;constructor(e){Object.assign(this,e),this.checkConfig();let t={baseURL:this.getBaseUrl(),headers:this.getHeaders()};this.client=U.default.create(t)}checkConfig(){throw new d.Err("NOT_IMPLEMENTED")}getBaseUrl(){return null}getHeaders(){return{}}getServiceLink(){return null}getProjectName(){return this.projectName}getProjectId(){return this.projectId}getProjectPath(){return this.projectPath}getProjectUrl(){return null}getProjectCredsUrl(){return this.projectCredsUrl}getProjectCICDSettingURL(){return null}async uploadSecret(e,t){throw new d.Err("NOT_IMPLEMENTED")}async uploadVariable(e,t){throw new d.Err("NOT_IMPLEMENTED")}async removeOldHooks(){}async uploadHook(e){}async uploadHooks(e){if(!e)throw new d.Err("!env");let{hooks:t=[]}=e;try{await this.removeOldHooks()}catch(r){c.log.error("[ERR] Old hooks removing failed:",r.message)}await(0,v.map)(t,async(r,o)=>{try{await this.uploadHook(r),c.log.info(`[OK] Hook ${o} uploaded`)}catch(i){c.log.error(`[ERR] Hook ${o} not uploaded:`,i.message)}})}async uploadAll(e){if(!e)throw new d.Err("!env");let{secrets:t={},variables:r={},files:o=[]}=e;await this.uploadHooks(e),await(0,v.map)(Object.entries(t),async([i,s])=>{try{await this.uploadSecret(i,s),c.log.info(`[OK] Secret ${i} uploaded`)}catch(u){c.log.error(`[ERR] Secret ${i} not uploaded, because`,u.message),c.log.error(u)}}),await(0,v.map)(Object.entries(r),async([i,s])=>{try{await this.uploadVariable(i,s),c.log.info(`[OK] Variable ${i} uploaded`)}catch(u){c.log.error(`[ERR] Variable ${i} not uploaded, because`,u.message)}}),await(0,v.map)(o,async({name:i,credType:s,content:u})=>{let n=i,h=u;try{if(s==="variable")await this.uploadVariable(n,h);else if(s==="secret")await this.uploadSecret(n,h);else if(s==="skip"){c.log.debug(`[SKIP] File ${n} uploaded as ${s}`);return}else throw new d.Err("unknown credType",{credType:s});c.log.info(`[OK] File ${n} uploaded as ${s}`)}catch(f){c.log.error(`[ERR] File ${n} not uploaded as ${s}, because`,f.message)}})}};var j=class extends p{static{l(this,"GithubService")}checkConfig(){if(!this.token)throw new m.Err("!token")}f;getBaseUrl(){return`https://${this.server||"api.github.com"}/repos/${this.getProjectPath()}`}getHeaders(){return{Accept:"application/vnd.github+json",Authorization:`Bearer ${this.token}`,"X-GitHub-Api-Version":"2022-11-28"}}getServiceLink(){return"github.com"}getProjectUrl(){return`https://${this.getServiceLink()}/${this.projectName}`}getProjectCICDSettingURL(){return`${this.getProjectUrl()}/settings/secrets/actions`}async uploadSecret(e,t){let{data:r}=await this.client({method:"get",url:"/actions/secrets/public-key"}).catch(h=>{throw new m.Err(h.message,{data:h?.response?.data})});if(!r?.key)throw new m.Err("!publicKey");if(!r?.key_id)throw new m.Err("!publicKeyId");await C.default.ready;let o=C.default,i=o.from_base64(r.key,o.base64_variants.ORIGINAL),s=o.from_string(t),u=o.crypto_box_seal(s,i),n=o.to_base64(u,o.base64_variants.ORIGINAL);await this.client({method:"put",url:`/actions/secrets/${e}`,data:{encrypted_value:n,key_id:r.key_id}})}async uploadVariable(e,t){let{data:r,status:o}=await this.client({method:"get",url:`/actions/variables/${e}`}).catch(i=>i?.response);o===404&&await this.client({method:"post",url:"/actions/variables",data:{name:e,value:t}}),o===200&&r.name.toLowerCase()===e.toLowerCase()&&await this.client({method:"patch",url:`/actions/variables/${e}`,data:{name:e,value:t}})}uploadHook(){throw new m.Err("Github hooks not supported yet")}};var w=require("@lskjs/err"),k=require("@lskjs/log/log"),D=require("fishbird");var $=class extends p{static{l(this,"GitlabService")}checkConfig(){if(!this.server)throw new w.Err("!server");if(!this.projectId)throw new w.Err("!projectId");if(!this.token)throw new w.Err("!token")}getBaseUrl(){return`https://${this.server}/api/v4/projects/${this.getProjectId()}`}getHeaders(){return{"PRIVATE-TOKEN":this.token}}getServiceLink(){return this.server}getProjectUrl(){return`https://${this.getServiceLink()}/${this.getProjectPath()}`}getProjectCICDSettingURL(){return`${this.getProjectUrl()}/-/settings/ci_cd`}async uploadSecret(e,t){let{data:r}=await this.client({method:"get",url:`/variables/${e}`}).catch(o=>{if(!this.force)throw o;return{data:{value:"@lskjs/creds"}}});if(r.value&&r.value.indexOf("@lskjs/creds")===-1&&!this.force){k.log.warn(`[IGNORE] Project ${this.projectId} ${e}`);return}await this.client({method:"delete",url:`/variables/${e}`}).catch(()=>{}),await this.client({method:"post",url:"/variables",data:{key:e,variable_type:"file",value:t,protected:!0}})}async uploadVariable(){throw k.log.warn("GitLab uploading variable doesn't supported"),new w.Err("NOT_IMPLEMENTED")}async uploadEnv(){throw k.log.warn("GitLab uploading env doesn't supported"),new w.Err("NOT_IMPLEMENTED")}async removeOldHooks(){let{data:e}=await this.client({method:"get",url:"/hooks"}).catch(t=>{if(!this.force)throw t;return{data:{value:"@lskjs/creds"}}});await(0,D.map)(e,async({id:t})=>{await this.client({method:"delete",url:`/hooks/${t}`})})}async uploadHook(e){await this.client({method:"post",url:"/hooks",data:e})}};var _=require("fishbird"),R=require("fs/promises"),P=require("path");async function L(a){let e=await(0,R.readdir)(a,{withFileTypes:!0});return(await(0,_.map)(e,async r=>r.isDirectory()?[{name:r.name,dir:(0,P.resolve)(a),filename:(0,P.resolve)(a,r.name)},...await L((0,P.resolve)(a,r.name))]:[])).flat()}l(L,"getDirs");async function x(a,e={}){let t=e.buildDir||`${a}/build`,r,o=`${a}/config.js`;try{r=require(o)}catch(n){if(n.code==="MODULE_NOT_FOUND"){y.log.error(`${o} not found`);return}throw n}await(0,I.unlink)(`${t}`).catch(()=>{}),await(0,I.mkdir)(t,{recursive:!0});let i=r.service?.serviceName;if(!i)throw new N.Err("!serviceName");let s;if(i==="github")s=new j({...r.service,...e});else if(i==="gitlab")s=new $({...r.service,...e});else throw new N.Err("incorrect serviceName",{serviceName:i});let{files:u=[]}=r;await(0,b.mapSeries)(u,async n=>{let{type:h,filename:f,handler:M}=n,T=await M(n,r),K=(0,E.getComment)({filename:f,values:[["Server",s.getServiceLink()],["Project",s.getProjectPath()],["Project ID",s.getProjectId()],["Project Url",s.getProjectUrl()],["CI/CD Setting",s.getProjectCICDSettingURL()]],footer:s.getProjectCredsUrl()&&` Auto generated by ${s.getProjectCredsUrl()} If you want to change something, please contact admin repo. `.trim()});await(0,E.jsonToFile)(`${t}/${f}`,T,{type:h,compare:!e.force,comment:K}),y.log.info(`[build] ${s.getProjectPath()} (${f})`)})}l(x,"buildCommand");async function X(a,e={}){let t=await L(a),r=(await(0,b.map)(t,async o=>{let{filename:i}=o;return await(0,H.existsSync)(`${i}/config.js`)?o:null})).filter(Boolean);return(0,b.mapSeries)(r,async({filename:o})=>{await x(o,e).catch(i=>{y.log.error(`Build error ${o}: `,i)})})}l(X,"buildDeepCommand");0&&(module.exports={buildCommand,buildDeepCommand}); //# sourceMappingURL=buildCommand.js.map