UNPKG

@northflank/cli

Version:

Provides a command-line interface to the Northflank platform.

1 lines 11.9 kB
const a2g=a2j;(function(X,j){const M=a2j,V=X();while(!![]){try{const H=parseInt(M(0x109))/0x1*(-parseInt(M(0x112))/0x2)+-parseInt(M(0xb5))/0x3*(-parseInt(M(0x103))/0x4)+-parseInt(M(0x13c))/0x5+-parseInt(M(0xf6))/0x6+-parseInt(M(0xed))/0x7+parseInt(M(0x10c))/0x8*(-parseInt(M(0x133))/0x9)+-parseInt(M(0xeb))/0xa*(-parseInt(M(0xfb))/0xb);if(H===j)break;else V['push'](V['shift']());}catch(O){V['push'](V['shift']());}}}(a2X,0x7dafb));import{ProxyAgent}from'proxy-agent';import a2V from'chalk';import{error,getCommand,retry,success,warning,decodeJwtPayload}from'../utils.js';import{InquirerHelper}from'../inquirer-helper.js';import{printAsTable}from'../formatting/console-format-helpers.js';import{NorthflankApiBrowserLogin}from'../login/browser-login.js';import a2H from'node-fetch';import{set}from'lodash-es';import a2O from'inquirer';function a2j(X,j){const V=a2X();return a2j=function(H,O){H=H-0xb3;let F=V[H];return F;},a2j(X,j);}function a2X(){const z=['Contexts','contextAvailable','\x0a\x20\x20Host:\x09\x09\x09','Shows\x20full\x20context\x20information\x20(including\x20tokens)','test','--host\x20[HOST]','loadContextWrapper','No\x20context\x20available.\x20Use\x20\x27northflank\x20login\x27\x20to\x20create\x20context.','set-token','https://api.northflank.com','Job\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context','useJobId','apiClient','all','host','delete','update-token','removeContext','List\x20all\x20available\x20contexts','-i,\x20--id\x20[ID]','Change\x20the\x20default\x20job\x20in\x20the\x20current\x20local\x20context','getCurrentBaseUrl','197217VGeBcZ','project','Local\x20context\x20\x27','\x0a\x20\x20Token\x20ID:\x09\x09','\x20(current)','contexts','useContext','current','catch','4144235BnnhZX','override','tokenLogin','Use\x20project\x20with\x20id:','action','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','330SgFJAW','getProjectName','\x27\x20successfully\x20updated.','browser-opened','Use\x20browser\x20login\x20but\x20only\x20print\x20URL\x20which\x20can\x20be\x20used\x20to\x20login','Switch\x20between\x20your\x20local\x20contexts','close','Failed\x20to\x20login\x20with\x20the\x20provided\x20token,\x20make\x20sure\x20to\x20use\x20a\x20valid\x20token\x20and\x20host.','Choose\x20the\x20context\x20to\x20','getCurrentName','addCommand','\x20(api\x20host:\x20','Token\x20for\x20this\x20context.\x20When\x20set,\x20browser\x20login\x20is\x20not\x20used','Failed\x20to\x20login\x20with\x20the\x20provided\x20token.\x20Token\x20was\x20not\x20changed','--all','fullUrl','token\x20login','--override','No\x20context\x20available.\x20Please\x20use\x20\x27northflank\x20login\x27\x20to\x20create\x20context.','Retrieve\x20and\x20update\x20local\x20context\x20settings.','agent','.\x20Using\x20fallback.','then','useServiceId','dir','valueOf','finally','Project\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context','remove','description','option','log','stdout','search-list',':\x20\x0a\x20\x20Name:\x09\x09\x09','Use\x20job\x20with\x20id:','browserLogin','Update\x20token\x20for\x20current\x20context','alias','service','getCurrentProjectName','Change\x20the\x20default\x20project\x20in\x20the\x20current\x20local\x20context','Name\x20for\x20login\x20context','Use\x20service\x20with\x20id:','askForContext','\x0a\x20\x20Token\x20Role\x20ID:\x09','browser\x20login','name','Local\x20context\x20name\x20to\x20remove.','tokenPrompt','Change\x20the\x20default\x20service\x20in\x20the\x20current\x20local\x20context','updateToken','list','moveCursor','1940kozRVC','-n,\x20--name\x20[NAME]','2433984ITFnui','\x0a\x20\x20Default\x20Project:\x09','getInfo','--do-not-open-browser','askForService','use\x20from\x20now\x20on','getCurrentToken','/v1/login','Connect\x20the\x20CLI\x20to\x20your\x20Northflank\x20account.','1594806aiiXzp','Display\x20full\x20URL\x20to\x20allow\x20opening\x20the\x20link\x20manually',',\x20added\x20context\x20with\x20name\x20','Bearer\x20','No\x20current\x20context\x20set.\x20Use\x20\x27northflank\x20login\x27\x20to\x20create\x20one\x20or\x20\x27northflank\x20context\x20use\x27\x20to\x20select\x20an\x20existing\x20one.','74965IGKwoC','Changed\x20current\x20context\x20to\x20','replace','Follow\x20the\x20steps\x20displayed\x20on\x20the\x20page\x20opened\x20in\x20the\x20browser\x20(URL\x20opened:\x20','login','Open\x20this\x20URL\x20in\x20your\x20browser\x20and\x20follow\x20the\x20steps:\x0a\x09','Use\x20manual\x20login\x20with\x20API\x20token','sort','26904QsyPIh','confirm','token','\x0a\x20\x20Default\x20Service:\x09','length','startLogin','11nmoAQa','autologin-','askForProject','16MPkpNC','No\x20project\x20in\x20current\x20context.\x20Please\x20set\x20project\x20before\x20setting\x20a\x20project-scoped\x20resource','contextProvider','defaultBaseUrl','-t,\x20--token\x20[TOKEN]','loginPrompt','11086QynLEd','sanitiseHostname','bold','host\x20url\x20for\x20this\x20context','https://','message','Remove\x20a\x20context','job','apiTokenLogin','Error\x20occured\x20during\x20browser\x20login:\x20','verifyToken'];a2X=function(){return z;};return a2X();}export class CliContext{[a2g(0xc9)];['defaultBaseUrl'];[a2g(0x129)];[a2g(0x138)];[a2g(0xff)];constructor(X,j=undefined,V=a2g(0x126)){const J=a2g;this['agent']=j,this[J(0x10f)]=V,this['apiClient']=X;const H=new InquirerHelper(X);this[J(0xff)]=getCommand()['name'](J(0xff))[J(0xd2)](J(0xf5))[J(0xd3)]('--token-login',J(0x101),![])['option'](J(0xf0),J(0xb9),![])['option'](J(0xec),J(0xdf))[J(0xd3)](J(0x110),J(0xc1))[J(0xd3)](J(0x122),J(0x115),this['defaultBaseUrl'])[J(0xd3)](J(0xc6),'Override\x20existing\x20contexts\x20(this\x20will\x20remove\x20project\x20and\x20service\x20context)',![])[J(0xb3)](async y=>{const b=J;set(y,b(0x12b),this[b(0x113)](y[b(0x12b)]));const A=y[b(0x13e)]||y['token']!==undefined,{name:l,host:T,token:W,override:v}=A?await this[b(0x11a)](y,H):await this[b(0xd9)](y,H);try{await this['apiClient'][b(0x10e)]['addContext']({'name':l,'host':T,'token':W},v);}catch(G){error(G[b(0x117)]);return;}if(!await this['verifyToken']())error(b(0xbc)),await this['apiClient']['contextProvider'][b(0x12e)](l);else{const d=A?b(0xc5):b(0xe3),x='\x0aSuccessfully\x20logged\x20in\x20using\x20'+d+b(0xf8)+a2V['italic'](l)+b(0xc0)+T+')';success(x);}}),this[J(0x138)]=getCommand()[J(0xe4)]('context')['description'](J(0xc8))[J(0xdb)]('contexts')[J(0xdb)]('ctx');const O=getCommand()[J(0xe4)](J(0xe9))['name']('ls')[J(0xd2)](J(0x12f))[J(0xd3)](J(0xc3),J(0x120))[J(0xb3)](async y=>{const E=J;console['log'](X[E(0x10e)][E(0xef)]());const e=X['contextProvider'][E(0x123)]();if(y[E(0x12a)]===!![]){console[E(0xcd)](e);return;}const A=e[E(0x13a)],l=e[E(0x138)][E(0x102)]((T,W)=>T['name']===A?-0x1:W[E(0xe4)]===A?0x1:0x0)['map'](T=>{const t=E,W=A===T['name']?t(0x137):'';return{'Name':''+T[t(0xe4)]+W,'Host':T[t(0x12b)],'Default\x20Project':T[t(0x134)]||'-','Default\x20Service':T[t(0xdc)]||'-'};});printAsTable(l,E(0x11d));}),F=getCommand()[J(0xe4)]('show')['description']('Shows\x20detailed\x20information\x20about\x20current\x20context')[J(0xb3)](async()=>{const Z=J;console[Z(0xd4)](X[Z(0x10e)]['getInfo']());const y=X[Z(0x10e)]['getCurrentContext']();if(y===undefined){console[Z(0xd4)](Z(0xfa));return;}const e=decodeJwtPayload(y[Z(0x105)]),A=y[Z(0x12b)];console[Z(0xd4)](a2V[Z(0x114)]('Current\x20token\x20info')+Z(0xd7)+y[Z(0xe4)]+Z(0x11f)+A+Z(0xee)+(y[Z(0x134)]||'-')+Z(0x106)+(y['service']||'-')+Z(0x136)+(e?.['tokenInternalId']||'-')+Z(0xe2)+(e?.['roleInternalId']||'-')+Z(0xb4));}),h=getCommand();h[J(0xe4)]('use')['description'](J(0xba))[J(0xd3)](J(0xec),'Change\x20current\x20context\x20to\x20context\x20identified\x20by\x20this\x20name')[J(0xb3)](async y=>{const w=J,e=y?.[w(0xe4)]||await this['askForContext']('use');await this[w(0x129)][w(0x10e)]['useContext'](e),success(w(0xfc)+e);});const P=J(0x130),o=getCommand()['name'](J(0x134))[J(0xd2)](J(0xde))[J(0xd3)](P,J(0xd0))[J(0xb3)](async y=>{const N=J,e=y?.['id']||await H[N(0x10b)]();await this[N(0x129)][N(0x10e)]['useProjectId'](e),console[N(0xd4)](N(0x13f),e);}),C=getCommand()[J(0xe4)]('service')['description'](J(0xe7))[J(0xd3)](P,'Service\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context')[J(0xb3)](async y=>{const p=J,e=y?.['id']||await H[p(0xf1)](this[p(0xb6)]())();console[p(0xd4)](p(0xe0),e),await this[p(0x129)][p(0x10e)][p(0xcc)](e);}),B=getCommand()[J(0xe4)](J(0x119))[J(0xd2)](J(0x131))['option'](P,J(0x127))[J(0xb3)](async y=>{const m=J,e=y?.['id']||await H['askForJob'](this['getProjectName']())();console['log'](m(0xd8),e),await this[m(0x129)]['contextProvider'][m(0x128)](e);});h[J(0xbf)](o),h[J(0xbf)](B),h[J(0xbf)](C);const s=getCommand()[J(0xe4)](J(0xd1))[J(0xdb)](J(0x12c))['alias']('rm')[J(0xd2)](J(0x118))['option'](P,J(0xe5))[J(0xb3)](async y=>{const k=J,e=y?.['id']||await this[k(0xe1)](k(0xd1)),A=this[k(0x129)][k(0x10e)]['getCurrentContext']()?.['name'];await this['apiClient'][k(0x10e)][k(0x12e)](e),success(k(0x135)+e+'\x27\x20successfully\x20removed.');if(!this[k(0x11e)]()){warning(k(0x124));return;}if(A===e){const l=y?.[k(0xe4)]||await this[k(0xe1)](k(0xf2));await this[k(0x129)]['contextProvider'][k(0x139)](l),success(k(0xfc)+l);}}),S=getCommand()[J(0xe4)](J(0x12d))[J(0xdb)](J(0x125))[J(0xd2)](J(0xda))[J(0xd3)](J(0x110),'Token\x20for\x20this\x20context')['action'](async y=>{const I=J,{contextProvider:e}=this[I(0x129)],A=y?.[I(0x105)]||await H[I(0xe6)](),l=e['getCurrentToken']();await e['updateToken'](A);if(await this[I(0x11c)]())success('Token\x20for\x20current\x20context\x20\x27'+e[I(0xbe)]()+I(0xb7));else{if(l)await e[I(0xe8)](l);error(I(0xc2));}});this[J(0x138)][J(0xbf)](O),this[J(0x138)][J(0xbf)](F),this[J(0x138)][J(0xbf)](h),this[J(0x138)]['addCommand'](s),this[J(0x138)][J(0xbf)](S);}async[a2g(0xd9)](X,j){const K=a2g,V=!X['doNotOpenBrowser'],H=X[K(0x12b)]??this[K(0x10f)],O=new NorthflankApiBrowserLogin(H,V,this[K(0xc9)]);let F;O['on'](K(0xb8),({url:C})=>{const L=K;if(V){const B=C[L(0xfd)](/sessionToken=.*/,'sessionToken=********');console['log'](L(0xfe)+B+')'),F=a2O['prompt']([{'type':L(0x104),'name':L(0xc4),'message':L(0xf7),'default':![]}]),F[L(0xcb)](s=>{const a=L;process['stdout'][a(0xea)](0x0,-0x1),process[a(0xd5)]['clearLine'](0x1),s[a(0xc4)]&&console[a(0xd4)]('Open\x20this\x20URL\x20in\x20your\x20browser\x20and\x20follow\x20the\x20steps:\x0a\x09'+C+'\x20');});}else console[L(0xd4)](L(0x100)+C+'\x20');});const {token:h,contextName:P}=await O[K(0x108)]()[K(0x13b)](async C=>{const r=K;error(r(0x11b)+C[r(0x117)]+r(0xca));const B=await this['apiTokenLogin'](X,j);return{'token':B[r(0x105)],'contextName':B[r(0xe4)]};})[K(0xcf)](()=>{const R=K;if(F)F['ui'][R(0xbb)]();}),o=X[K(0xe4)]??P??K(0x10a)+new Date()[K(0xce)]();return{'name':o,'token':h,'host':H,'override':X[K(0x13d)]??![]};}[a2g(0x113)]=X=>{const n=a2g;let j=X;return!/^https?:\/\//i[n(0x121)](j)&&(j=n(0x116)+j),j=j[n(0xfd)](/\/+$/,''),j;};async['apiTokenLogin'](X,j){const D=a2g,V=this['apiClient']['contextProvider'][D(0x123)]()[D(0x138)],{name:H,token:O,host:F,override:h}=await j[D(0x111)](X,V);return{'name':H,'token':O,'host':F,'override':h};}[a2g(0xb6)](){const Y=a2g,X=this[Y(0x129)]['contextProvider'][Y(0xdd)]();if(X===undefined)throw new Error(Y(0x10d));return X;}async[a2g(0xe1)](X){const u=a2g;if(!this[u(0x11e)]())throw new Error(u(0xc7));const j=this['apiClient'][u(0x10e)][u(0x123)]()[u(0x138)]['map'](H=>H['name']),V=j[u(0x107)]>0x4?u(0xd6):u(0xe9);return(await a2O['prompt']([{'type':V,'name':u(0xe4),'message':u(0xbd)+X+':','choices':j}]))[u(0xe4)];}[a2g(0x11e)](){const Q=a2g;return this[Q(0x129)][Q(0x10e)]['loadContextWrapper']()['contexts'][Q(0x107)]>0x0;}async['verifyToken'](){const f=a2g;try{const X=this[f(0x129)]['contextProvider'][f(0x132)](),j=this['apiClient'][f(0x10e)][f(0xf3)](),V=X+f(0xf4),H={'Authorization':f(0xf9)+j},O=new ProxyAgent(),F=await retry(0x3)(async()=>a2H(V,{'method':'GET','signal':AbortSignal['timeout'](0xbb8),'headers':H,'agent':O}));if(F['ok'])return!![];return![];}catch(h){return![];}}}