@ycmd/creds
Version:
LSK.js CLI Creds is the easiest way to manage GitHub / Gitlab secrets and credentials
16 lines • 13.4 kB
JavaScript
var Y=Object.defineProperty;var n=(t,e)=>Y(t,"name",{value:e,configurable:!0}),k=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var z=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var O=z((lt,pe)=>{pe.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"}]}});import{Err as R}from"@lskjs/err";import{log as g}from"@lskjs/log/log";import F from"yargs";import{Err as M}from"@lskjs/err";import{log as L}from"@lskjs/log/log";import{getComment as Z,jsonToFile as ee}from"@lskjs/stringify";import{map as te,mapSeries as G}from"fishbird";import{existsSync as re}from"fs";import{mkdir as oe,unlink as se}from"fs/promises";import{Err as b}from"@lskjs/err";import H from"libsodium-wrappers";import{Err as u}from"@lskjs/err";import{log as d}from"@lskjs/log/log";import W from"axios";import{map as _}from"fishbird";var f=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=W.create(r)}checkConfig(){throw new u("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("NOT_IMPLEMENTED")}async uploadVariable(e,r){throw new u("NOT_IMPLEMENTED")}async removeOldHooks(){}async uploadHook(e){}async uploadHooks(e){if(!e)throw new u("!env");let{hooks:r=[]}=e;try{await this.removeOldHooks()}catch(o){d.error("[ERR] Old hooks removing failed:",o.message)}await _(r,async(o,i)=>{try{await this.uploadHook(o),d.info(`[OK] Hook ${i} uploaded`)}catch(a){d.error(`[ERR] Hook ${i} not uploaded:`,a.message)}})}async uploadAll(e){if(!e)throw new u("!env");let{secrets:r={},variables:o={},files:i=[]}=e;await this.uploadHooks(e),await _(Object.entries(r),async([a,s])=>{try{await this.uploadSecret(a,s),d.info(`[OK] Secret ${a} uploaded`)}catch(c){d.error(`[ERR] Secret ${a} not uploaded, because`,c.message),d.error(c)}}),await _(Object.entries(o),async([a,s])=>{try{await this.uploadVariable(a,s),d.info(`[OK] Variable ${a} uploaded`)}catch(c){d.error(`[ERR] Variable ${a} not uploaded, because`,c.message)}}),await _(i,async({name:a,credType:s,content:c})=>{let l=a,p=c;try{if(s==="variable")await this.uploadVariable(l,p);else if(s==="secret")await this.uploadSecret(l,p);else if(s==="skip"){d.debug(`[SKIP] File ${l} uploaded as ${s}`);return}else throw new u("unknown credType",{credType:s});d.info(`[OK] File ${l} uploaded as ${s}`)}catch(m){d.error(`[ERR] File ${l} not uploaded as ${s}, because`,m.message)}})}};var h=class extends f{static{n(this,"GithubService")}checkConfig(){if(!this.token)throw new b("!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 b(p.message,{data:p?.response?.data})});if(!o?.key)throw new b("!publicKey");if(!o?.key_id)throw new b("!publicKeyId");await H.ready;let i=H,a=i.from_base64(o.key,i.base64_variants.ORIGINAL),s=i.from_string(r),c=i.crypto_box_seal(s,a),l=i.to_base64(c,i.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:i}=await this.client({method:"get",url:`/actions/variables/${e}`}).catch(a=>a?.response);i===404&&await this.client({method:"post",url:"/actions/variables",data:{name:e,value:r}}),i===200&&o.name.toLowerCase()===e.toLowerCase()&&await this.client({method:"patch",url:`/actions/variables/${e}`,data:{name:e,value:r}})}uploadHook(){throw new b("Github hooks not supported yet")}};import{Err as v}from"@lskjs/err";import{log as N}from"@lskjs/log/log";import{map as X}from"fishbird";var w=class extends f{static{n(this,"GitlabService")}checkConfig(){if(!this.server)throw new v("!server");if(!this.projectId)throw new v("!projectId");if(!this.token)throw new v("!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(i=>{if(!this.force)throw i;return{data:{value:"@lskjs/creds"}}});if(o.value&&o.value.indexOf("@lskjs/creds")===-1&&!this.force){N.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 N.warn("GitLab uploading variable doesn't supported"),new v("NOT_IMPLEMENTED")}async uploadEnv(){throw N.warn("GitLab uploading env doesn't supported"),new v("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 X(e,async({id:r})=>{await this.client({method:"delete",url:`/hooks/${r}`})})}async uploadHook(e){await this.client({method:"post",url:"/hooks",data:e})}};import{map as J}from"fishbird";import{readdir as Q}from"fs/promises";import{resolve as I}from"path";async function D(t){let e=await Q(t,{withFileTypes:!0});return(await J(e,async o=>o.isDirectory()?[{name:o.name,dir:I(t),filename:I(t,o.name)},...await D(I(t,o.name))]:[])).flat()}n(D,"getDirs");async function $(t,e={}){let r=e.buildDir||`${t}/build`,o,i=`${t}/config.js`;try{o=k(i)}catch(l){if(l.code==="MODULE_NOT_FOUND"){L.error(`${i} not found`);return}throw l}await se(`${r}`).catch(()=>{}),await oe(r,{recursive:!0});let a=o.service?.serviceName;if(!a)throw new M("!serviceName");let s;if(a==="github")s=new h({...o.service,...e});else if(a==="gitlab")s=new w({...o.service,...e});else throw new M("incorrect serviceName",{serviceName:a});let{files:c=[]}=o;await G(c,async l=>{let{type:p,filename:m,handler:j}=l,P=await j(l,o),C=Z({filename:m,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 ee(`${r}/${m}`,P,{type:p,compare:!e.force,comment:C}),L.info(`[build] ${s.getProjectPath()} (${m})`)})}n($,"buildCommand");async function S(t,e={}){let r=await D(t),o=(await te(r,async i=>{let{filename:a}=i;return await re(`${a}/config.js`)?i:null})).filter(Boolean);return G(o,async({filename:i})=>{await $(i,e).catch(a=>{L.error(`Build error ${i}: `,a)})})}n(S,"buildDeepCommand");import{Err as V}from"@lskjs/err";import{mapSeries as ie}from"fishbird";import{readFile as ae}from"fs/promises";async function x(t,e={}){let r=e.buildDir||`${t}/build`,o=k(`${t}/config.js`),i=o.service?.serviceName;if(!i)throw new V("!serviceName");let a;if(i==="github")a=new h({...o.service,...e});else if(i==="gitlab")a=new w({...o.service,...e});else throw new V("incorrect serviceName",{serviceName:i});let{files:s=[],variables:c,secrets:l,hooks:p}=o,m=await ie(s,async j=>{let{filename:P}=j,C=await ae(`${r}/${P}`).then(q=>q.toString());return{...j,content:C}});await a.uploadAll({files:m,variables:c,secrets:l,hooks:p})}n(x,"uploadCommand");function ne(t){return typeof t!="string"||t[0]==="/"?t:(t[0]==="~"&&(t=t.slice(2)),`${process.cwd()}/${t}`)}n(ne,"addCwd");var y=ne;import{colorize as U}from"@lskjs/colors";var A=`
__ $ _______.$ __ ___ $ __ _______.
| | $ / |$| |/ / $ | | / |
| | $ | (----.$| ' / $ | | | (----.
| | $ \\ \\ $| < $ .--. | | \\ \\
| .----.$----) | $| . \\ $ | .--' | .----) |
|_______|$_______/ $|__|\\__\\ $ \\______/ |_______/
$ $ $
`,B=[["bold","red"],["bold","blue"],["bold","cyan"],["bold","yellow"]];function K({color:t=1}={}){return t?A.split(`
`).map(r=>r.split("$").map((o,i)=>o==="#"?U(" ",["bgYellow"]):B[i]?U(o.replace(/#/g,U(" ",["bgYellow"])),B[i]):"").join("")).join(`
`):A}n(K,"getLogo");import{mapValues as ce}from"@lskjs/algos";import{getCwdInfo as le,getLskConfig as de}from"@lskjs/cli-utils";import E from"@lskjs/env";function T({config:t,log:e}={}){let r=n(s=>`${s} `.padEnd(14),"pad");e(r("[Name] "),t.name),e(r("[Version] "),t.version);let o=process.cwd();e(r("")),e(r("[CWD] "),o),ce(le({cwd:o}),(s,c)=>{e(r(`${c}`),s)}),e(r("")),e(r("[ENV] "));let i=Object.keys(E).sort().filter(s=>s!=="stage"&&s!=="version");e(r("stage"),E.stage),e(r("version"),E.version),i.forEach(s=>{let c=E[s];e(r(`${s}`),c)});let a=de();e(r("")),e(r("[lskrc]"),a.path||"Not found"),process.env.DEBUG&&(e(a),e(r("[config]"),t))}n(T,"printInfo");var bt=F(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:O().name,version:O().version};console.log(K()),T({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=y(e);t.deep?await S(r,{force:t.force}):await $(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=y(e);if(t.deep)throw new R("Not implemented mass upload");await x(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=y(e);if(t.deep)throw await S(r,{force:t.force}),new R("Not implemented mass upload");await $(r,{force:t.force}),await x(r,{force:t.force})}}).fail((t,e)=>{let r=t||R.getMessage(e);r&&(g.fatal(""),r&&g.fatal(r),g.fatal("")),e&&(g.error(""),g.error(e),g.error("")),!!t&&(console.log(""),String(F.showHelp()),console.log("")),process.exit(1)}).demandCommand().alias("h","help").help("h").argv;export{bt as default};
//# sourceMappingURL=cli.mjs.map