@ycmd/creds
Version:
LSK.js CLI Creds is the easiest way to manage GitHub / Gitlab secrets and credentials
2 lines • 6.74 kB
JavaScript
var C=Object.create;var g=Object.defineProperty;var U=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var M=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var h=(o,e)=>g(o,"name",{value:e,configurable:!0});var V=(o,e)=>{for(var t in e)g(o,t,{get:e[t],enumerable:!0})},P=(o,e,t,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of D(e))!K.call(o,r)&&r!==t&&g(o,r,{get:()=>e[r],enumerable:!(a=U(e,r))||a.enumerable});return o};var I=(o,e,t)=>(t=o!=null?C(M(o)):{},P(e||!o||!o.__esModule?g(t,"default",{value:o,enumerable:!0}):t,o)),x=o=>P(g({},"__esModule",{value:!0}),o);var G={};V(G,{uploadCommand:()=>A});module.exports=x(G);var y=require("@lskjs/err"),O=require("fishbird"),S=require("fs/promises");var m=require("@lskjs/err"),$=I(require("libsodium-wrappers"));var d=require("@lskjs/err"),n=require("@lskjs/log/log"),N=I(require("axios")),f=require("fishbird");var p=class{static{h(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=N.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(a){n.log.error("[ERR] Old hooks removing failed:",a.message)}await(0,f.map)(t,async(a,r)=>{try{await this.uploadHook(a),n.log.info(`[OK] Hook ${r} uploaded`)}catch(s){n.log.error(`[ERR] Hook ${r} not uploaded:`,s.message)}})}async uploadAll(e){if(!e)throw new d.Err("!env");let{secrets:t={},variables:a={},files:r=[]}=e;await this.uploadHooks(e),await(0,f.map)(Object.entries(t),async([s,i])=>{try{await this.uploadSecret(s,i),n.log.info(`[OK] Secret ${s} uploaded`)}catch(c){n.log.error(`[ERR] Secret ${s} not uploaded, because`,c.message),n.log.error(c)}}),await(0,f.map)(Object.entries(a),async([s,i])=>{try{await this.uploadVariable(s,i),n.log.info(`[OK] Variable ${s} uploaded`)}catch(c){n.log.error(`[ERR] Variable ${s} not uploaded, because`,c.message)}}),await(0,f.map)(r,async({name:s,credType:i,content:c})=>{let l=s,u=c;try{if(i==="variable")await this.uploadVariable(l,u);else if(i==="secret")await this.uploadSecret(l,u);else if(i==="skip"){n.log.debug(`[SKIP] File ${l} uploaded as ${i}`);return}else throw new d.Err("unknown credType",{credType:i});n.log.info(`[OK] File ${l} uploaded as ${i}`)}catch(j){n.log.error(`[ERR] File ${l} not uploaded as ${i}, because`,j.message)}})}};var v=class extends p{static{h(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:a}=await this.client({method:"get",url:"/actions/secrets/public-key"}).catch(u=>{throw new m.Err(u.message,{data:u?.response?.data})});if(!a?.key)throw new m.Err("!publicKey");if(!a?.key_id)throw new m.Err("!publicKeyId");await $.default.ready;let r=$.default,s=r.from_base64(a.key,r.base64_variants.ORIGINAL),i=r.from_string(t),c=r.crypto_box_seal(i,s),l=r.to_base64(c,r.base64_variants.ORIGINAL);await this.client({method:"put",url:`/actions/secrets/${e}`,data:{encrypted_value:l,key_id:a.key_id}})}async uploadVariable(e,t){let{data:a,status:r}=await this.client({method:"get",url:`/actions/variables/${e}`}).catch(s=>s?.response);r===404&&await this.client({method:"post",url:"/actions/variables",data:{name:e,value:t}}),r===200&&a.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"),b=require("@lskjs/log/log"),L=require("fishbird");var k=class extends p{static{h(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:a}=await this.client({method:"get",url:`/variables/${e}`}).catch(r=>{if(!this.force)throw r;return{data:{value:"@lskjs/creds"}}});if(a.value&&a.value.indexOf("@lskjs/creds")===-1&&!this.force){b.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 b.log.warn("GitLab uploading variable doesn't supported"),new w.Err("NOT_IMPLEMENTED")}async uploadEnv(){throw b.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,L.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})}};async function A(o,e={}){let t=e.buildDir||`${o}/build`,a=require(`${o}/config.js`),r=a.service?.serviceName;if(!r)throw new y.Err("!serviceName");let s;if(r==="github")s=new v({...a.service,...e});else if(r==="gitlab")s=new k({...a.service,...e});else throw new y.Err("incorrect serviceName",{serviceName:r});let{files:i=[],variables:c,secrets:l,hooks:u}=a,j=await(0,O.mapSeries)(i,async E=>{let{filename:_}=E,R=await(0,S.readFile)(`${t}/${_}`).then(H=>H.toString());return{...E,content:R}});await s.uploadAll({files:j,variables:c,secrets:l,hooks:u})}h(A,"uploadCommand");0&&(module.exports={uploadCommand});
//# sourceMappingURL=uploadCommand.js.map