UNPKG

@northflank/cli

Version:

Provides a command-line interface to the Northflank platform.

1 lines 11.8 kB
const a2b=a2E;(function(m,E){const w=a2E,h=m();while(!![]){try{const I=-parseInt(w(0xf6))/0x1+-parseInt(w(0x97))/0x2+parseInt(w(0xb9))/0x3+-parseInt(w(0x86))/0x4+-parseInt(w(0xda))/0x5*(-parseInt(w(0xf3))/0x6)+-parseInt(w(0xeb))/0x7+-parseInt(w(0xf7))/0x8*(-parseInt(w(0xd1))/0x9);if(I===E)break;else h['push'](h['shift']());}catch(T){h['push'](h['shift']());}}}(a2m,0x42f65));import{ProxyAgent}from'proxy-agent';import a2h from'chalk';import{error,getCommand,retry,success,warning,decodeJwtPayload}from'../utils.js';function a2E(m,E){const h=a2m();return a2E=function(I,T){I=I-0x74;let e=h[I];return e;},a2E(m,E);}function a2m(){const k=['--token-login','log','addCommand','job','Token\x20for\x20current\x20context\x20\x27','bold','Error\x20occured\x20during\x20browser\x20login:\x20','Local\x20context\x20name\x20to\x20remove.','catch','search-list','agent','show','\x0a\x20\x20\x20\x20\x20\x20\x20\x20','1338300nAaFEo','Use\x20service\x20with\x20id:',':\x20\x0a\x20\x20Name:\x09\x09\x09','set-token','then','\x27\x20successfully\x20removed.','\x0a\x20\x20Token\x20Role\x20ID:\x09','update-token','startLogin','\x20(api\x20host:\x20','getInfo','remove','Current\x20token\x20info','name','map','Name\x20for\x20login\x20context','list','Use\x20manual\x20login\x20with\x20API\x20token','token\x20login','Bearer\x20','--host\x20[HOST]','\x0aSuccessfully\x20logged\x20in\x20using\x20','useServiceId','valueOf','18bwbxND','Failed\x20to\x20login\x20with\x20the\x20provided\x20token.\x20Token\x20was\x20not\x20changed','No\x20context\x20available.\x20Use\x20\x27northflank\x20login\x27\x20to\x20create\x20context.','message','service','host','getCurrentName','useJobId','-i,\x20--id\x20[ID]','15PcgHKs','length','moveCursor','getCurrentProjectName','getCurrentBaseUrl','\x0a\x20\x20Default\x20Project:\x09','Follow\x20the\x20steps\x20displayed\x20on\x20the\x20page\x20opened\x20in\x20the\x20browser\x20(URL\x20opened:\x20','context','No\x20context\x20available.\x20Please\x20use\x20\x27northflank\x20login\x27\x20to\x20create\x20context.','roleInternalId','Open\x20this\x20URL\x20in\x20your\x20browser\x20and\x20follow\x20the\x20steps:\x0a\x09','autologin-','No\x20project\x20in\x20current\x20context.\x20Please\x20set\x20project\x20before\x20setting\x20a\x20project-scoped\x20resource','use\x20from\x20now\x20on','defaultBaseUrl','Choose\x20the\x20context\x20to\x20','contexts','1050868JzTzFU','host\x20url\x20for\x20this\x20context','sort','all','--do-not-open-browser','\x0a\x20\x20Token\x20Scope:\x09\x09','use','getCurrentToken','708744EFqdup','clearLine','option','403149lzLQlQ','1484864kczXub','loginPrompt','browser-opened','verifyToken','Switch\x20between\x20your\x20local\x20contexts','Override\x20existing\x20contexts\x20(this\x20will\x20remove\x20project\x20and\x20service\x20context)','Connect\x20the\x20CLI\x20to\x20your\x20Northflank\x20account.','tokenScope','ctx','Shows\x20detailed\x20information\x20about\x20current\x20context','tokenInternalId','updateToken','addContext','removeContext','-t,\x20--token\x20[TOKEN]','action','current','apiTokenLogin','\x27\x20successfully\x20updated.','alias','timeout','-n,\x20--name\x20[NAME]','login','finally','Remove\x20a\x20context','Change\x20the\x20default\x20project\x20in\x20the\x20current\x20local\x20context','--all','tokenLogin','Change\x20current\x20context\x20to\x20context\x20identified\x20by\x20this\x20name','close','Change\x20the\x20default\x20service\x20in\x20the\x20current\x20local\x20context','1352032tdkJMF','https://','fullUrl','Token\x20for\x20this\x20context.\x20When\x20set,\x20browser\x20login\x20is\x20not\x20used','project','token','Use\x20job\x20with\x20id:','contextAvailable','sanitiseHostname','List\x20all\x20available\x20contexts','getCurrentContext','Contexts','askForContext','\x20(current)','tokenPrompt','Local\x20context\x20\x27','\x0a\x20\x20Token\x20ID:\x09\x09','12260kSzkMt','\x0a\x20\x20Default\x20Service:\x09','No\x20current\x20context\x20set.\x20Use\x20\x27northflank\x20login\x27\x20to\x20create\x20one\x20or\x20\x27northflank\x20context\x20use\x27\x20to\x20select\x20an\x20existing\x20one.','apiClient','Service\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context','override','prompt','Failed\x20to\x20login\x20with\x20the\x20provided\x20token,\x20make\x20sure\x20to\x20use\x20a\x20valid\x20token\x20and\x20host.','Display\x20full\x20URL\x20to\x20allow\x20opening\x20the\x20link\x20manually','loadContextWrapper','Update\x20token\x20for\x20current\x20context','stdout','getProjectName','Change\x20the\x20default\x20job\x20in\x20the\x20current\x20local\x20context','contextProvider','browser\x20login','Changed\x20current\x20context\x20to\x20','Project\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context','Shows\x20full\x20context\x20information\x20(including\x20tokens)','description','browserLogin'];a2m=function(){return k;};return a2m();}import{InquirerHelper}from'../inquirer-helper.js';import{printAsTable}from'../formatting/console-format-helpers.js';import{NorthflankApiBrowserLogin}from'../login/browser-login.js';import a2I from'node-fetch';import{set}from'lodash-es';import a2T from'inquirer';export class CliContext{['agent'];[a2b(0xe8)];[a2b(0x9a)];[a2b(0xea)];[a2b(0x7d)];constructor(m,E=undefined,h='https://api.northflank.com'){const n=a2b;this[n(0xb6)]=E,this[n(0xe8)]=h,this['apiClient']=m;const I=new InquirerHelper(m);this[n(0x7d)]=getCommand()[n(0xc6)](n(0x7d))[n(0xaa)](n(0xfd))[n(0xf5)](n(0xac),n(0xca),![])['option'](n(0xef),'Use\x20browser\x20login\x20but\x20only\x20print\x20URL\x20which\x20can\x20be\x20used\x20to\x20login',![])['option'](n(0x7c),n(0xc8))[n(0xf5)](n(0x75),n(0x89))['option'](n(0xcd),n(0xec),this[n(0xe8)])[n(0xf5)]('--override',n(0xfc),![])[n(0x76)](async K=>{const Q=n;set(K,'host',this[Q(0x8e)](K[Q(0xd6)]));const z=K[Q(0x82)]||K[Q(0x8b)]!==undefined,{name:S,host:H,token:r,override:F}=z?await this[Q(0x78)](K,I):await this[Q(0xab)](K,I);try{await this[Q(0x9a)]['contextProvider'][Q(0x103)]({'name':S,'host':H,'token':r},F);}catch(t){error(t[Q(0xd4)]);return;}if(!await this[Q(0xfa)]())error(Q(0x9e)),await this[Q(0x9a)]['contextProvider']['removeContext'](S);else{const Y=z?Q(0xcb):Q(0xa6),N=Q(0xce)+Y+',\x20added\x20context\x20with\x20name\x20'+a2h['italic'](S)+Q(0xc2)+H+')';success(N);}}),this[n(0xea)]=getCommand()['name'](n(0xe1))[n(0xaa)]('Retrieve\x20and\x20update\x20local\x20context\x20settings.')[n(0x7a)](n(0xea))['alias'](n(0xff));const T=getCommand()['name'](n(0xc9))[n(0xc6)]('ls')['description'](n(0x8f))[n(0xf5)](n(0x81),n(0xa9))['action'](async K=>{const c=n;console[c(0xad)](m[c(0xa5)][c(0xc3)]());const z=m[c(0xa5)]['loadContextWrapper']();if(K[c(0xee)]===!![]){console['dir'](z);return;}const S=z[c(0x77)],H=z[c(0xea)][c(0xed)]((r,F)=>r['name']===S?-0x1:F['name']===S?0x1:0x0)[c(0xc7)](r=>{const O=c,F=S===r['name']?O(0x93):'';return{'Name':''+r[O(0xc6)]+F,'Host':r[O(0xd6)],'Token\x20scope':r[O(0xfe)],'Default\x20Project':r[O(0x8a)]||'-','Default\x20Service':r[O(0xd5)]||'-'};});printAsTable(H,c(0x91));}),e=getCommand()[n(0xc6)](n(0xb7))[n(0xaa)](n(0x100))[n(0x76)](async()=>{const B=n;console[B(0xad)](m[B(0xa5)][B(0xc3)]());const K=m[B(0xa5)]['getCurrentContext']();if(K===undefined){console[B(0xad)](B(0x99));return;}const z=decodeJwtPayload(K[B(0x8b)]),S=K[B(0xd6)];console[B(0xad)](a2h[B(0xb1)](B(0xc5))+B(0xbb)+K[B(0xc6)]+'\x0a\x20\x20Host:\x09\x09\x09'+S+B(0xf0)+K[B(0xfe)]+B(0xdf)+(K[B(0x8a)]||'-')+B(0x98)+(K[B(0xd5)]||'-')+B(0x96)+(z?.[B(0x101)]||'-')+B(0xbf)+(z?.[B(0xe3)]||'-')+B(0xb8));}),o=getCommand();o[n(0xc6)](n(0xf1))[n(0xaa)](n(0xfb))[n(0xf5)](n(0x7c),n(0x83))['action'](async K=>{const q=n,z=K?.[q(0xc6)]||await this[q(0x92)]('use');this['apiClient'][q(0xa5)]['useContext'](z),success(q(0xa7)+z);});const g=n(0xd9),J=getCommand()['name'](n(0x8a))[n(0xaa)](n(0x80))[n(0xf5)](g,n(0xa8))[n(0x76)](async K=>{const a=n,z=K?.['id']||await I['askForProject']()();this[a(0x9a)][a(0xa5)]['useProjectId'](z),console[a(0xad)]('Use\x20project\x20with\x20id:',z);}),L=getCommand()[n(0xc6)](n(0xd5))[n(0xaa)](n(0x85))['option'](g,n(0x9b))['action'](async K=>{const R=n,z=K?.['id']||await I['askForService'](this['getProjectName']())();console[R(0xad)](R(0xba),z),this[R(0x9a)]['contextProvider'][R(0xcf)](z);}),P=getCommand()[n(0xc6)](n(0xaf))[n(0xaa)](n(0xa4))['option'](g,'Job\x20name\x20(internal\x20id)\x20to\x20use\x20as\x20default\x20in\x20context')[n(0x76)](async K=>{const x=n,z=K?.['id']||await I['askForJob'](this[x(0xa3)]())();console[x(0xad)](x(0x8c),z),await this[x(0x9a)][x(0xa5)][x(0xd8)](z);});o['addCommand'](J),o[n(0xae)](P),o[n(0xae)](L);const X=getCommand()[n(0xc6)]('remove')[n(0x7a)]('delete')[n(0x7a)]('rm')[n(0xaa)](n(0x7f))[n(0xf5)](g,n(0xb3))[n(0x76)](async K=>{const D=n,z=K?.['id']||await this['askForContext'](D(0xc4)),S=this[D(0x9a)][D(0xa5)][D(0x90)]()?.['name'];this[D(0x9a)][D(0xa5)][D(0x74)](z),success(D(0x95)+z+D(0xbe));if(!this[D(0x8d)]()){warning(D(0xd3));return;}if(S===z){const H=K?.[D(0xc6)]||await this[D(0x92)](D(0xe7));this['apiClient'][D(0xa5)]['useContext'](H),success('Changed\x20current\x20context\x20to\x20'+H);}}),W=getCommand()[n(0xc6)](n(0xc0))[n(0x7a)](n(0xbc))[n(0xaa)](n(0xa1))[n(0xf5)]('-t,\x20--token\x20[TOKEN]','Token\x20for\x20this\x20context')[n(0x76)](async K=>{const f=n,{contextProvider:z}=this['apiClient'],S=K?.[f(0x8b)]||await I[f(0x94)](),H=z['getCurrentToken']();z['updateToken'](S);if(await this['verifyToken']())success(f(0xb0)+z[f(0xd7)]()+f(0x79));else{if(H)z[f(0x102)](H);error(f(0xd2));}});this[n(0xea)][n(0xae)](T),this[n(0xea)][n(0xae)](e),this['contexts']['addCommand'](o),this[n(0xea)]['addCommand'](X),this[n(0xea)][n(0xae)](W);}async[a2b(0xab)](m,E){const M=a2b,h=!m['doNotOpenBrowser'],I=m[M(0xd6)]??this[M(0xe8)],T=new NorthflankApiBrowserLogin(I,h,this[M(0xb6)]);let e;T['on'](M(0xf9),({url:L})=>{const U=M;if(h){const P=L['replace'](/sessionToken=.*/,'sessionToken=********');console[U(0xad)](U(0xe0)+P+')'),e=a2T['prompt']([{'type':'confirm','name':U(0x88),'message':U(0x9f),'default':![]}]),e[U(0xbd)](X=>{const C=U;process[C(0xa2)][C(0xdc)](0x0,-0x1),process[C(0xa2)][C(0xf4)](0x1),X[C(0x88)]&&console[C(0xad)]('Open\x20this\x20URL\x20in\x20your\x20browser\x20and\x20follow\x20the\x20steps:\x0a\x09'+L+'\x20');});}else console[U(0xad)](U(0xe4)+L+'\x20');});const {token:o,contextName:g}=await T[M(0xc1)]()[M(0xb4)](async L=>{const Z=M;error(Z(0xb2)+L['message']+'.\x20Using\x20fallback.');const P=await this[Z(0x78)](m,E);return{'token':P[Z(0x8b)],'contextName':P[Z(0xc6)]};})[M(0x7e)](()=>{const i=M;if(e)e['ui'][i(0x84)]();}),J=m[M(0xc6)]??g??M(0xe5)+new Date()[M(0xd0)]();return{'name':J,'token':o,'host':I,'override':m[M(0x9c)]??![]};}[a2b(0x8e)]=m=>{const V=a2b;let E=m;return!/^https?:\/\//i['test'](E)&&(E=V(0x87)+E),E=E['replace'](/\/+$/,''),E;};async[a2b(0x78)](m,E){const G=a2b,h=this['apiClient'][G(0xa5)][G(0xa0)]()[G(0xea)],{name:I,token:T,host:e,override:o}=await E[G(0xf8)](m,h);return{'name':I,'token':T,'host':e,'override':o};}[a2b(0xa3)](){const l=a2b,m=this[l(0x9a)][l(0xa5)][l(0xdd)]();if(m===undefined)throw new Error(l(0xe6));return m;}async[a2b(0x92)](m){const s=a2b;if(!this[s(0x8d)]())throw new Error(s(0xe2));const E=this[s(0x9a)][s(0xa5)]['loadContextWrapper']()[s(0xea)][s(0xc7)](I=>I[s(0xc6)]),h=E[s(0xdb)]>0x4?s(0xb5):'list';return(await a2T[s(0x9d)]([{'type':h,'name':s(0xc6),'message':s(0xe9)+m+':','choices':E}]))['name'];}[a2b(0x8d)](){const y=a2b;return this[y(0x9a)][y(0xa5)][y(0xa0)]()[y(0xea)]['length']>0x0;}async['verifyToken'](){const u=a2b;try{const m=this[u(0x9a)][u(0xa5)][u(0xde)](),E=this['apiClient'][u(0xa5)][u(0xf2)](),h=m+'/v1/login',I={'Authorization':u(0xcc)+E},T=new ProxyAgent(),o=await retry(0x3)(async()=>a2I(h,{'method':'GET','signal':AbortSignal[u(0x7b)](0xbb8),'headers':I,'agent':T}));if(o['ok'])return!![];return![];}catch(g){return![];}}}