UNPKG

@ycmd/creds

Version:

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

16 lines 14 kB
#!/usr/bin/env node var ae=Object.create;var j=Object.defineProperty;var ne=Object.getOwnPropertyDescriptor;var ce=Object.getOwnPropertyNames;var le=Object.getPrototypeOf,de=Object.prototype.hasOwnProperty;var n=(t,e)=>j(t,"name",{value:e,configurable:!0});var pe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),me=(t,e)=>{for(var r in e)j(t,r,{get:e[r],enumerable:!0})},q=(t,e,r,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ce(e))!de.call(t,s)&&s!==r&&j(t,s,{get:()=>e[s],enumerable:!(o=ne(e,s))||o.enumerable});return t};var E=(t,e,r)=>(r=t!=null?ae(le(t)):{},q(e||!t||!t.__esModule?j(r,"default",{value:t,enumerable:!0}):r,t)),ue=t=>q(j({},"__esModule",{value:!0}),t);var T=pe((Te,he)=>{he.exports={name:"@lskjs/creds",version:"3.19.0",description:"LSK.js CLI Creds is the easiest way to manage GitHub / Gitlab secrets and credentials",author:"Igor Suvorov <hi@isuvorov.com> (https://github.com/isuvorov)",private:!1,scripts:{dev:" lsk run dev",build:" lsk run build",test:" lsk run test",prepack:" lsk run prepack",release:" lsk run release"},dependencies:{"@lskjs/algos":"^3.17.0","@lskjs/cli-scripts":"^3.19.0","@lskjs/cli-utils":"^3.17.0","@lskjs/colors":"^3.17.0","@lskjs/env":"^3.17.0","@lskjs/err":"^3.17.0","@lskjs/log":"^3.17.0","@lskjs/stringify":"^3.19.0","@types/node":"18.13.0",axios:"^1.6.0",fishbird:"^0.21.0","libsodium-wrappers":"^0.7.13",yargs:"^17.7.2"},"//":"///////////========================/////////========================/////////========================//////////",prettier:"@lskjs/eslint-config/prettier",eslintConfig:{extends:"@lskjs/eslint-config"},jest:{preset:"@lskjs/jest-config"},files:["bin","lib","README.md","LICENCE"],bin:{lskcreds:"bin/run"},main:"lib/index.js",types:"lib/index.d.ts",exports:{".":{import:"./lib/index.mjs",types:"./lib/index.d.ts",default:"./lib/index.js"},"./*":{import:"./lib/*.mjs",types:"./lib/*.d.ts",default:"./lib/*.js"}},"///":"//////////========================/////////========================/////////========================/////////",repository:"https://github.com/lskjs/lskjs/tree/master//libs-cli/lsk",homepage:"https://github.com/lskjs/cli",bugs:"https://github.com/lskjs/lskjs/issues",license:"MIT",publishConfig:{access:"public",registry:"https://registry.npmjs.org/"},keywords:["lskjs","lsk","cli","helper"],"////":"/////////========================/////////========================/////////========================/////////",oclif:{commands:"./lib/commands",bin:"lsk",plugins:["@oclif/plugin-help"]},_scripts:{postpack:"rm -f oclif.manifest.json",prepack:"rm -rf lib && tsc -b && oclif-dev manifest && oclif-dev readme",test:"echo skip",build:"oclif-dev readme && git add README.md && echo ok"},"_size-limit":[{"//":"esm error",path:"lib/index.js",limit:"1kb"}]}});var ge={};me(ge,{default:()=>we});module.exports=ue(ge);var O=require("@lskjs/err"),f=require("@lskjs/log/log"),F=E(require("yargs"));var V=require("@lskjs/err"),N=require("@lskjs/log/log"),I=require("@lskjs/stringify"),_=require("fishbird"),J=require("fs"),D=require("fs/promises");var w=require("@lskjs/err"),M=E(require("libsodium-wrappers"));var u=require("@lskjs/err"),d=require("@lskjs/log/log"),Y=E(require("axios")),k=require("fishbird");var h=class{static{n(this,"Service")}projectId;projectName;projectPath;projectCredsUrl;token;server;force;client;constructor(e){Object.assign(this,e),this.checkConfig();let r={baseURL:this.getBaseUrl(),headers:this.getHeaders()};this.client=Y.default.create(r)}checkConfig(){throw new u.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,r){throw new u.Err("NOT_IMPLEMENTED")}async uploadVariable(e,r){throw new u.Err("NOT_IMPLEMENTED")}async removeOldHooks(){}async uploadHook(e){}async uploadHooks(e){if(!e)throw new u.Err("!env");let{hooks:r=[]}=e;try{await this.removeOldHooks()}catch(o){d.log.error("[ERR] Old hooks removing failed:",o.message)}await(0,k.map)(r,async(o,s)=>{try{await this.uploadHook(o),d.log.info(`[OK] Hook ${s} uploaded`)}catch(a){d.log.error(`[ERR] Hook ${s} not uploaded:`,a.message)}})}async uploadAll(e){if(!e)throw new u.Err("!env");let{secrets:r={},variables:o={},files:s=[]}=e;await this.uploadHooks(e),await(0,k.map)(Object.entries(r),async([a,i])=>{try{await this.uploadSecret(a,i),d.log.info(`[OK] Secret ${a} uploaded`)}catch(c){d.log.error(`[ERR] Secret ${a} not uploaded, because`,c.message),d.log.error(c)}}),await(0,k.map)(Object.entries(o),async([a,i])=>{try{await this.uploadVariable(a,i),d.log.info(`[OK] Variable ${a} uploaded`)}catch(c){d.log.error(`[ERR] Variable ${a} not uploaded, because`,c.message)}}),await(0,k.map)(s,async({name:a,credType:i,content:c})=>{let l=a,p=c;try{if(i==="variable")await this.uploadVariable(l,p);else if(i==="secret")await this.uploadSecret(l,p);else if(i==="skip"){d.log.debug(`[SKIP] File ${l} uploaded as ${i}`);return}else throw new u.Err("unknown credType",{credType:i});d.log.info(`[OK] File ${l} uploaded as ${i}`)}catch(m){d.log.error(`[ERR] File ${l} not uploaded as ${i}, because`,m.message)}})}};var g=class extends h{static{n(this,"GithubService")}checkConfig(){if(!this.token)throw new w.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,r){let{data:o}=await this.client({method:"get",url:"/actions/secrets/public-key"}).catch(p=>{throw new w.Err(p.message,{data:p?.response?.data})});if(!o?.key)throw new w.Err("!publicKey");if(!o?.key_id)throw new w.Err("!publicKeyId");await M.default.ready;let s=M.default,a=s.from_base64(o.key,s.base64_variants.ORIGINAL),i=s.from_string(r),c=s.crypto_box_seal(i,a),l=s.to_base64(c,s.base64_variants.ORIGINAL);await this.client({method:"put",url:`/actions/secrets/${e}`,data:{encrypted_value:l,key_id:o.key_id}})}async uploadVariable(e,r){let{data:o,status:s}=await this.client({method:"get",url:`/actions/variables/${e}`}).catch(a=>a?.response);s===404&&await this.client({method:"post",url:"/actions/variables",data:{name:e,value:r}}),s===200&&o.name.toLowerCase()===e.toLowerCase()&&await this.client({method:"patch",url:`/actions/variables/${e}`,data:{name:e,value:r}})}uploadHook(){throw new w.Err("Github hooks not supported yet")}};var b=require("@lskjs/err"),P=require("@lskjs/log/log"),z=require("fishbird");var v=class extends h{static{n(this,"GitlabService")}checkConfig(){if(!this.server)throw new b.Err("!server");if(!this.projectId)throw new b.Err("!projectId");if(!this.token)throw new b.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,r){let{data:o}=await this.client({method:"get",url:`/variables/${e}`}).catch(s=>{if(!this.force)throw s;return{data:{value:"@lskjs/creds"}}});if(o.value&&o.value.indexOf("@lskjs/creds")===-1&&!this.force){P.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:r,protected:!0}})}async uploadVariable(){throw P.log.warn("GitLab uploading variable doesn't supported"),new b.Err("NOT_IMPLEMENTED")}async uploadEnv(){throw P.log.warn("GitLab uploading env doesn't supported"),new b.Err("NOT_IMPLEMENTED")}async removeOldHooks(){let{data:e}=await this.client({method:"get",url:"/hooks"}).catch(r=>{if(!this.force)throw r;return{data:{value:"@lskjs/creds"}}});await(0,z.map)(e,async({id:r})=>{await this.client({method:"delete",url:`/hooks/${r}`})})}async uploadHook(e){await this.client({method:"post",url:"/hooks",data:e})}};var W=require("fishbird"),X=require("fs/promises"),C=require("path");async function G(t){let e=await(0,X.readdir)(t,{withFileTypes:!0});return(await(0,W.map)(e,async o=>o.isDirectory()?[{name:o.name,dir:(0,C.resolve)(t),filename:(0,C.resolve)(t,o.name)},...await G((0,C.resolve)(t,o.name))]:[])).flat()}n(G,"getDirs");async function L(t,e={}){let r=e.buildDir||`${t}/build`,o,s=`${t}/config.js`;try{o=require(s)}catch(l){if(l.code==="MODULE_NOT_FOUND"){N.log.error(`${s} not found`);return}throw l}await(0,D.unlink)(`${r}`).catch(()=>{}),await(0,D.mkdir)(r,{recursive:!0});let a=o.service?.serviceName;if(!a)throw new V.Err("!serviceName");let i;if(a==="github")i=new g({...o.service,...e});else if(a==="gitlab")i=new v({...o.service,...e});else throw new V.Err("incorrect serviceName",{serviceName:a});let{files:c=[]}=o;await(0,_.mapSeries)(c,async l=>{let{type:p,filename:m,handler:y}=l,R=await y(l,o),H=(0,I.getComment)({filename:m,values:[["Server",i.getServiceLink()],["Project",i.getProjectPath()],["Project ID",i.getProjectId()],["Project Url",i.getProjectUrl()],["CI/CD Setting",i.getProjectCICDSettingURL()]],footer:i.getProjectCredsUrl()&&` Auto generated by ${i.getProjectCredsUrl()} If you want to change something, please contact admin repo. `.trim()});await(0,I.jsonToFile)(`${r}/${m}`,R,{type:p,compare:!e.force,comment:H}),N.log.info(`[build] ${i.getProjectPath()} (${m})`)})}n(L,"buildCommand");async function A(t,e={}){let r=await G(t),o=(await(0,_.map)(r,async s=>{let{filename:a}=s;return await(0,J.existsSync)(`${a}/config.js`)?s:null})).filter(Boolean);return(0,_.mapSeries)(o,async({filename:s})=>{await L(s,e).catch(a=>{N.log.error(`Build error ${s}: `,a)})})}n(A,"buildDeepCommand");var B=require("@lskjs/err"),Q=require("fishbird"),Z=require("fs/promises");async function K(t,e={}){let r=e.buildDir||`${t}/build`,o=require(`${t}/config.js`),s=o.service?.serviceName;if(!s)throw new B.Err("!serviceName");let a;if(s==="github")a=new g({...o.service,...e});else if(s==="gitlab")a=new v({...o.service,...e});else throw new B.Err("incorrect serviceName",{serviceName:s});let{files:i=[],variables:c,secrets:l,hooks:p}=o,m=await(0,Q.mapSeries)(i,async y=>{let{filename:R}=y,H=await(0,Z.readFile)(`${r}/${R}`).then(ie=>ie.toString());return{...y,content:H}});await a.uploadAll({files:m,variables:c,secrets:l,hooks:p})}n(K,"uploadCommand");function fe(t){return typeof t!="string"||t[0]==="/"?t:(t[0]==="~"&&(t=t.slice(2)),`${process.cwd()}/${t}`)}n(fe,"addCwd");var S=fe;var x=require("@lskjs/colors");var ee=` __ $ _______.$ __ ___ $ __ _______. | | $ / |$| |/ / $ | | / | | | $ | (----.$| ' / $ | | | (----. | | $ \\ \\ $| < $ .--. | | \\ \\ | .----.$----) | $| . \\ $ | .--' | .----) | |_______|$_______/ $|__|\\__\\ $ \\______/ |_______/ $ $ $ `,te=[["bold","red"],["bold","blue"],["bold","cyan"],["bold","yellow"]];function re({color:t=1}={}){return t?ee.split(` `).map(r=>r.split("$").map((o,s)=>o==="#"?(0,x.colorize)(" ",["bgYellow"]):te[s]?(0,x.colorize)(o.replace(/#/g,(0,x.colorize)(" ",["bgYellow"])),te[s]):"").join("")).join(` `):ee}n(re,"getLogo");var oe=require("@lskjs/algos"),U=require("@lskjs/cli-utils"),$=E(require("@lskjs/env"));function se({config:t,log:e}={}){let r=n(i=>`${i} `.padEnd(14),"pad");e(r("[Name] "),t.name),e(r("[Version] "),t.version);let o=process.cwd();e(r("")),e(r("[CWD] "),o),(0,oe.mapValues)((0,U.getCwdInfo)({cwd:o}),(i,c)=>{e(r(`${c}`),i)}),e(r("")),e(r("[ENV] "));let s=Object.keys($.default).sort().filter(i=>i!=="stage"&&i!=="version");e(r("stage"),$.default.stage),e(r("version"),$.default.version),s.forEach(i=>{let c=$.default[i];e(r(`${i}`),c)});let a=(0,U.getLskConfig)();e(r("")),e(r("[lskrc]"),a.path||"Not found"),process.env.DEBUG&&(e(a),e(r("[config]"),t))}n(se,"printInfo");var we=(0,F.default)(process.argv.slice(2)).strict().scriptName("lskcreds").usage("Usage: $0 <command> [options]").command({command:"info",aliases:["i"],desc:"Get info about current project",handler:()=>{let t={name:T().name,version:T().version};console.log(re()),se({log:(...e)=>console.log(...e),config:t})}}).command({command:"build <dir> [--force] [--deep]",builder:{force:{type:"boolean",default:!1},deep:{type:"boolean",default:!1}},aliases:["b"],desc:"Build creds",handler:async t=>{let e=t.dir||".",r=S(e);t.deep?await A(r,{force:t.force}):await L(r,{force:t.force})}}).command({command:"upload <dir> [--force] [--deep]",builder:{force:{type:"boolean",default:!1},deep:{type:"boolean",default:!1}},aliases:["u"],desc:"Upload creds",handler:async t=>{let e=t.dir||".",r=S(e);if(t.deep)throw new O.Err("Not implemented mass upload");await K(r,{force:t.force})}}).command({command:"build-upload <dir> [--force] [--deep]",builder:{force:{type:"boolean",default:!1},deep:{type:"boolean",default:!1}},aliases:["bu"],desc:"Build creds then upload",handler:async t=>{let e=t.dir||".",r=S(e);if(t.deep)throw await A(r,{force:t.force}),new O.Err("Not implemented mass upload");await L(r,{force:t.force}),await K(r,{force:t.force})}}).fail((t,e)=>{let r=t||O.Err.getMessage(e);r&&(f.log.fatal(""),r&&f.log.fatal(r),f.log.fatal("")),e&&(f.log.error(""),f.log.error(e),f.log.error("")),!!t&&(console.log(""),String(F.default.showHelp()),console.log("")),process.exit(1)}).demandCommand().alias("h","help").help("h").argv; //# sourceMappingURL=cli.js.map