UNPKG

@northflank/cli

Version:

Provides a command-line interface to the Northflank platform.

2 lines 16.9 kB
#!/usr/bin/env -S node --no-deprecation function a1E(m,E){const h=a1m();return a1E=function(I,T){I=I-0x128;let e=h[I];return e;},a1E(m,E);}const a1mm=a1E;(function(m,E){const m9=a1E,h=m();while(!![]){try{const I=parseInt(m9(0x13f))/0x1+-parseInt(m9(0x203))/0x2*(parseInt(m9(0x1f3))/0x3)+parseInt(m9(0x1c8))/0x4+parseInt(m9(0x19e))/0x5*(-parseInt(m9(0x162))/0x6)+parseInt(m9(0x1fd))/0x7+parseInt(m9(0x15e))/0x8*(-parseInt(m9(0x145))/0x9)+parseInt(m9(0x15d))/0xa;if(I===E)break;else h['push'](h['shift']());}catch(T){h['push'](h['shift']());}}}(a1m,0x71e32));import{ApiClient,ApiClientFileContextProvider,GetApiEndpointPaginated}from'@northflank/js-client';import{Command}from'commander';function a1m(){const mY=['addCommand','backups','Documentation:\x20','org','stringify','endsWith','Failed\x20to\x20validate\x20input\x20(incorrect\x20format):\x20','helpOption','addons','call','subdomain','sshCmd','loadAll','isPaginatedEndpoint','teamScoped','addonId','argv','get','log','data','File\x20does\x20not\x20exist:\x20','update','login','domainId','hasNextPage','delete','forEach','aliases','backup','replace','=>\x20running\x20command\x20with:\x20','askForPipeline','askForLogSink','after','askForCredentials','startsWith','map','Unknown\x20input\x20format.\x20Not\x20valid\x20json\x20and\x20not\x20valid\x20yaml.','page','tag','OPTIONAL:\x20','force','tags','vol','getMetricsCommand','logSinkId','exitCode','endpoints','askForTemplate','adn','message','askForProject','Unknown\x20input\x20file\x20type:\x20','getOwnPropertyNames','noDefaults','askForSubdomain','opt','jobId','rawResponse','336635ltNNTG','JSON-formatted\x20resource\x20definition,\x20takes\x20precedence\x20over\x20\x22--file\x22','output','secrets','askForService','credentials','teamId','default','custom-columns=','runs','action','Expecting\x20resource\x20input\x20with\x20\x27--input\x27\x20or\x20\x27--file\x27\x20argument','utf-8','subdomainId','contextProvider','name','askForSecret','body','askForTag','list','uploadCmd','projectId','find','string','resource','file','invoices','setPathVars','requiredPermissions','retrievePayloadViaInteractiveCli','job','resourceTagId','type','logs','opts','paginationArgs','italic','query','boolean','askForAddonBackup','addon','getCurrentContext','2527960dCzHVy','\x20properties','split','jobs','domains','templateId','Get\x20information\x20about\x20Northflank\x20','stdout','getCurrentServiceName','askForTeam','pipelineId','secretId','getLogsCommand','invoice','askConfirm','domain','cursor','volumes','yaml','help\x20[command]','includes','VERBOSE:\x20Using\x20endpoint\x20->\x20',',\x20-','askForJob','\x0a>\x20Token\x20permissions\x20required:\x20','concat','_skip','base','host','askGeneric','branch','askForBuild','backupId','nonInteractiveEndpoint','load','commands','parseAsync','repositories','toUpperCase','VERBOSE:\x20Request\x20body\x20->\x20','\x20Northflank\x20resources','askForSubdomainPath','-v,\x20--version','143238gzzMMu','filter','clearLine','skipValidation','cred','length','parse','credential','projects','join','1586004thRqVd','rgn','yml','branches','json','tpl','38nxRfPX','docsTagsPath','error','scrt','bind','option','required','pop','.yaml','getCurrentJobName','File\x20to\x20load\x20resource\x20json\x20from','version','service','there\x20are\x20more\x20rows,\x20load?','clusterId','underline','keys','secret','volumeId','url','../package.json','enablePositionalOptions','askForTemplateRun','volume','restores','\x0a\x09details\x20:','trim','statusText','brn','-f,\x20--file\x20<file-path>','\x20--','api.','repository','serviceId','sort','addHelpText','askForBackupDestination','credentialId','plans','260974ebnSCz','subdomainPath','moveCursor','defaults','regions','buildId','9rghKQz','getCurrentProjectName','deleteWarningPrompt','backup-destinations','getTokenScope','all','quiet','repos','count','services','Print\x20the\x20current\x20version\x20of\x20the\x20Northflank\x20cli','askForVolume','Update\x20Northflank\x20','readFileSync','--verbose','some','VERBOSE:\x20HTTP_PROXY\x20or\x20HTTPS_PROXY\x20environment\x20variable\x20set:\x20tunnelling\x20traffic\x20through\x20HTTP\x20proxy.','path','Northflank\x20cli\x20version:\x20','-i,\x20--input\x20<resource-def>','existsSync','description','backupDestinationId','Display\x20help\x20for\x20command','13258350Dncyxb','2648944BrCGol','pagination','toLowerCase','portFwdCmd','66LFiEAt'];a1m=function(){return mY;};return a1m();}import a1h from'fs';import a1I from'chalk';import{CliContext}from'./context/contextCommands.js';import{agent,assertContextExisting,asyncSequential,checkUpdate,customUserAgent,error,getCommand,proxyEnvsSet,warning}from'./utils.js';import*as a1T from'./defaults.js';import{InquirerHelper}from'./inquirer-helper.js';import{consoleFormat,handleJsonOutput,handleYamlOutput,printAsTable}from'./formatting/console-format-helpers.js';import{getCommandOverview}from'./formatting/command-overview.js';import{CliPortForward}from'./port-forward/index.js';import{CliExec}from'./exec/index.js';import{CliSsh}from'./ssh/index.js';import{CliLogs}from'./logs/index.js';import{CliMetrics}from'./metrics/index.js';import{CliFileCopy}from'./copy/index.js';import{isEqual,has,set,kebabCase,upperFirst,isString,omit}from'lodash-es';import a1e from'js-yaml';import{readFileSync}from'fs';import{fileURLToPath}from'url';import{dirname,join}from'path';const __filename=fileURLToPath(import.meta[a1mm(0x12b)]),__dirname=dirname(__filename),pgk=JSON[a1mm(0x1f9)](readFileSync(join(__dirname,a1mm(0x12c)),a1mm(0x1aa)));export const getProgram=m=>{const mE=a1mm,E=new Command('northflank');E['description']('Manage\x20your\x20Northflank\x20resources\x20from\x20the\x20command\x20line'),E[mE(0x12d)](!![]),E['version'](mE(0x157)+a1I[mE(0x212)](pgk[mE(0x20e)]),mE(0x1f2),mE(0x14f));const h=new ApiClient(m,{'throwErrorOnHttpErrorCode':![],'customUserAgent':customUserAgent,'agent':agent}),I=new CliContext(h,agent),T=new CliPortForward(m,agent),e=new CliExec(m,agent),o=new CliSsh(m,agent),g=new CliFileCopy(m,agent),J=new CliLogs(m,agent),L=new CliMetrics(m,agent);return E[mE(0x163)](T[mE(0x161)]),E['addCommand'](e['execCmd']),E[mE(0x163)](o[mE(0x16e)]),E[mE(0x163)](g['downloadCmd']),E[mE(0x163)](g[mE(0x1b2)]),E['addCommand'](I[mE(0x179)]),E['addCommand'](I['contexts']),generateCommands(h,h[mE(0x192)],E,J,L),E[mE(0x163)](getCommandOverview(E)),E['helpCommand'](mE(0x1db),mE(0x15c)),E[mE(0x16a)](undefined,mE(0x15c)),E;};((async()=>{const mh=a1mm;try{const m=new ApiClientFileContextProvider();await checkUpdate(m);const E=getProgram(m);await E[mh(0x1ec)](process[mh(0x173)]);}catch(h){error('Error\x20occured\x20while\x20trying\x20to\x20run\x20command,\x20error:\x20'+h[mh(0x195)]),process[mh(0x173)]['find'](I=>I===mh(0x153))&&console[mh(0x175)](h),process[mh(0x191)]=0x1;}})());function isListCommand(m){const mI=a1mm,E=[[mI(0x174),'addon',mI(0x164)],[mI(0x174),'job',mI(0x1a7)]];return m[mI(0x1b4)](h=>h===mI(0x1b1))||E['some'](h=>isEqual(m,h));}function generateCommands(m,E,h,I,T,e=a1T[a1mm(0x142)],o=[]){const mT=a1mm,g=new InquirerHelper(new ApiClient(m[mT(0x1ac)],{'throwErrorOnHttpErrorCode':!![],'customUserAgent':customUserAgent,'agent':agent}));function J(W,K){const me=mT;return W[me(0x209)]!==![]&&K===undefined;}function L(W,K){const mo=mT,{opt:z,name:S}=W,H=z[mo(0x1a5)],r=J(z,H),F=n=>n[mo(0x1f8)]>0x1?'--'+n:'-'+n,t=z?.['alias'],Y=t?Array['isArray'](t)?'-'+t?.[mo(0x187)](n=>F(n))[mo(0x1fc)](mo(0x1de))+',':''+F(t):'',N=r?'':mo(0x18b),w=typeof z['type']===mo(0x1c4)||z[mo(0x1be)]===mo(0x1c4)?Y+mo(0x136)+S:Y+'\x20--'+S+'\x20<'+S[mo(0x1ee)]()+'>',b=N+z['description'];K['option'](w[mo(0x132)](),b,H);}function P(W,K){const mg=mT;if(K[mg(0x1eb)][mg(0x154)](z=>z[mg(0x1ad)]()===mg(0x1bf)))return;isEqual(W,[mg(0x174),mg(0x20f)])&&(K[mg(0x163)](I[mg(0x1d4)]('service')),K[mg(0x163)](T[mg(0x18f)](mg(0x20f))),K[mg(0x163)](I['getLogsCommand'](mg(0x20f),!![])),K[mg(0x163)](T['getMetricsCommand']('service',!![]))),isEqual(W,[mg(0x174),mg(0x1bc)])&&(K['addCommand'](I[mg(0x1d4)](mg(0x1bc))),K[mg(0x163)](T[mg(0x18f)](mg(0x1bc))),K[mg(0x163)](I[mg(0x1d4)](mg(0x1bc),!![])),K['addCommand'](T[mg(0x18f)]('job',!![]))),isEqual(W,[mg(0x174),mg(0x1c6)])&&(K[mg(0x163)](I[mg(0x1d4)](mg(0x1c6))),K[mg(0x163)](T['getMetricsCommand'](mg(0x1c6)))),isEqual(W,['get',mg(0x1c6),mg(0x17f)])&&K[mg(0x163)](I['getLogsCommand'](mg(0x1c6),![],!![])),isEqual(W,[mg(0x174),'addon',mg(0x130)])&&K[mg(0x163)](I[mg(0x1d4)](mg(0x1c6),![],!![],!![]));}return Object[mT(0x198)](e)[mT(0x17d)](W=>{const mJ=mT,K=E[W],z=e[W],S=o[mJ(0x1e1)]([W]),H=m[mJ(0x1ac)][mJ(0x149)]();function r(O,B){const mL=mJ,q=Object[mL(0x198)](O||{});q[mL(0x187)](a=>{return{'name':a,'opt':O[a]};})[mL(0x13a)]((a,R)=>!J(a[mL(0x19b)])?!J(R[mL(0x19b)])?0x0:0x1:-0x1)[mL(0x17d)](a=>{L(a,B);});}function F(O,B){const mP=mJ,q=[['project',mP(0x1fb),'prj'],[mP(0x20f),mP(0x14e),'svc'],[mP(0x1a3),mP(0x1fa),mP(0x1f7)],[mP(0x1c6),mP(0x16b),mP(0x194)],[mP(0x1bc),mP(0x1cb)],['plan',mP(0x13e),'pln'],['region',mP(0x143),mP(0x1fe)],[mP(0x1d7),mP(0x1cc),'dmn'],[mP(0x129),mP(0x1a1),mP(0x206)],[mP(0x1d9),mP(0x12f),mP(0x18e)],[mP(0x200),mP(0x1e6),mP(0x134)],[mP(0x1d5),mP(0x1b8),'inv'],['template','templates',mP(0x202)],[mP(0x14c),mP(0x138),mP(0x1ed),'repo'],['backup-destination',mP(0x148)],[mP(0x18a),mP(0x18d)]],a=q[mP(0x1b4)](R=>R[mP(0x1dc)](B));if(a!==undefined)O[mP(0x17e)](a[mP(0x1f4)](R=>R!==B));}async function t(O){const mX=mJ,B={},{contextProvider:q}=m,a=S['includes'](mX(0x17c)),R=O[mX(0x199)]===!![];async function x(f,M,U,C,Z){const mW=mX,i=O?.[f];if(Z!==undefined&&Z===i)return;if(C||has(z[mW(0x19b)]?.[mW(0x156)]??{},f)){const V=!R&&!a&&U?U():undefined,G=i||V||await M();G!==undefined&&set(B,f,G);}}const D=Object['entries'](z[mX(0x19b)]?.[mX(0x156)]??{});return z[mX(0x19b)]?.[mX(0x171)]&&H===mX(0x166)&&!D['some'](([f])=>f===mX(0x1a4))&&await x(mX(0x1a4),g[mX(0x1d1)](!![])[mX(0x207)](g),undefined,!![],mX(0x1e2)),await asyncSequential(D,async([f,M])=>{const mK=mX,U=B?.[mK(0x1b3)],C=B?.[mK(0x1a4)],Z=B?.[mK(0x1cd)];switch(f){case'teamId':return await x(mK(0x1a4),g[mK(0x1d1)](!![])[mK(0x207)](g),undefined,![],mK(0x1e2));case mK(0x1b3):return await x(mK(0x1b3),g[mK(0x196)](C)[mK(0x207)](g),q[mK(0x146)][mK(0x207)](q));case mK(0x139):return await x(mK(0x139),g[mK(0x1a2)](U,C)[mK(0x207)](g),q[mK(0x1d0)][mK(0x207)](q));case mK(0x172):return await x('addonId',g['askForAddon'](U,C)['bind'](g));case mK(0x19c):return await x(mK(0x19c),g[mK(0x1df)](U,C)[mK(0x207)](g),q[mK(0x20c)]['bind'](q));case'runId':return await x('runId',g['askForJobRun'](B['jobId'],U,![],C)[mK(0x207)](g));case mK(0x1d3):return await x(mK(0x1d3),g[mK(0x1ae)](U,C)[mK(0x207)](g));case'domain':case mK(0x17a):return await x(mK(0x1d7),g['askForDomain'](C)[mK(0x207)](g));case'credentialId':return await x(mK(0x13d),g[mK(0x185)](C)[mK(0x207)](g));case mK(0x12a):return await x(mK(0x12a),g[mK(0x150)](U,C)[mK(0x207)](g));case'subdomain':return await x(mK(0x16d),g[mK(0x19a)](B['domain'],C)[mK(0x207)](g));case mK(0x1ab):return await x('subdomainId',g[mK(0x19a)](B[mK(0x17a)],C)[mK(0x207)](g));case mK(0x140):return await x(mK(0x140),g[mK(0x1f1)](B[mK(0x1d7)],B[mK(0x16d)]??B[mK(0x1ab)],C)[mK(0x207)](g));case mK(0x1e8):return await x(mK(0x1e8),g[mK(0x1c5)](U,B['addonId'],C)[mK(0x207)](g));case mK(0x144):return await x(mK(0x144),g[mK(0x1e7)](U,B[mK(0x139)],B[mK(0x19c)],C)[mK(0x207)](g));case mK(0x1cd):return await x(mK(0x1cd),g[mK(0x193)](C)[mK(0x207)](g));case'templateRunId':return await x('templateRunId',g[mK(0x12e)](Z,C)[mK(0x207)](g));case'logSinkId':return await x(mK(0x190),g[mK(0x183)](C)[mK(0x207)](g));case mK(0x1d2):return await x(mK(0x1d2),g[mK(0x182)](U,C)[mK(0x207)](g));case mK(0x1bd):return await x(mK(0x1bd),g[mK(0x1b0)](C)[mK(0x207)](g));case mK(0x15b):return await x(mK(0x15b),g[mK(0x13c)](C)[mK(0x207)](g));case mK(0x211):return await x(mK(0x211),g['askForClusterId'](C)[mK(0x207)](g));default:return await x(f,g[mK(0x1e5)](f,M?.[mK(0x15a)])[mK(0x207)](g));}}),B;}async function Y(O){const mz=mJ,B={},q=z['opt']?.['isPaginatedEndpoint']?a1T[mz(0x1c1)]:{},a={...z[mz(0x19b)]?.[mz(0x1c3)]??{},...q},R=Object[mz(0x128)](a)[mz(0x1f4)](x=>x!==mz(0x16f));return await asyncSequential(R,async x=>{if(O[x]!==undefined)return set(B,x,O[x]);}),B;}function N(){const mS=mJ;switch(S[0x0]){case'get':return mS(0x1ce)+(S[0x1]||mS(0x1b6))+'s';case mS(0x178):return mS(0x151)+(S[0x1]||mS(0x1b6))+mS(0x1c9);default:return upperFirst(W)+mS(0x1f0);}}function w(O,B){const mH=mJ;if(!B){const C=getCommand()[mH(0x1ad)](kebabCase(W))[mH(0x15a)](N());return F(C,W),C;}const q=O?.[mH(0x1ba)]?a1I['italic'](mH(0x1e0)+O[mH(0x1ba)]):'',a=m[mH(0x1ac)][mH(0x1c7)](),R=a!==undefined&&z?.[mH(0x19b)]?.[mH(0x204)]!==undefined,x=a?.[mH(0x1e4)]['replace'](mH(0x137),''),D=R?mH(0x165)+x+'/docs/v1/api/'+z?.[mH(0x19b)]?.[mH(0x204)]:'',f=O?.[mH(0x15a)]||'',M=getCommand(!![])['name'](kebabCase(W))[mH(0x15a)](f)[mH(0x13b)](mH(0x184),[q,D][mH(0x1fc)]('\x0a'));F(M,W);(z['opt']?.['body']||z[mH(0x19b)]?.[mH(0x1e9)])&&(M[mH(0x208)](mH(0x135),mH(0x20d)),M[mH(0x208)](mH(0x158),mH(0x19f)));if(z['opt']?.['teamScoped']&&H===mH(0x166)){const Z={'description':'Team\x20id\x20for\x20team-level\x20endpoints\x20with\x20organisation-level\x20API\x20token.\x20To\x20use\x20organisation-level\x20endpoint\x20set\x20to\x20\x27_skip\x27','type':mH(0x1b5),'required':![]};z[mH(0x19b)][mH(0x156)]={'teamId':Z,...z[mH(0x19b)][mH(0x156)]??{}};}r(z[mH(0x19b)]?.[mH(0x156)],M),r(z[mH(0x19b)]?.[mH(0x1c3)],M);const U=z['opt']?.[mH(0x170)];return U&&r(a1T['paginationArgs'],M),r(z['opt']?.[mH(0x1e3)],M),M[mH(0x1a8)](async()=>{const mr=mH;assertContextExisting(m);const i=M[mr(0x1c0)]();i?.['verbose']&&proxyEnvsSet&&warning(mr(0x155));const V=i[mr(0x189)]!==undefined||i[mr(0x1d8)]!==undefined;if(i[mr(0x16f)]===!![]&&V)throw new Error('Options\x20\x27loadAll\x27\x20can\x20not\x20be\x20combined\x20with\x20\x27page\x27\x20or\x20\x27cursor\x27');const G=i?.[mr(0x1a0)],l=G===mr(0x201),s=G===mr(0x1da)||G===mr(0x1ff),y=await t(i);g[mr(0x1b9)](y);const u=await Y(i),k=Object[mr(0x128)](z[mr(0x19b)]?.[mr(0x156)]??{})[mr(0x187)](v=>v+'='+a1I['green'](y[v]))['join'](',\x20');if(k[mr(0x1f8)]>0x0&&!l&&!s){const v=mr(0x181)+k;console[mr(0x175)](v);}const A=z[mr(0x19b)]?.[mr(0x1af)]||z[mr(0x19b)]?.['nonInteractiveEndpoint']?await X(i,z,S):undefined;if(!i[mr(0x18c)]&&S[mr(0x1dc)](mr(0x17c))&&!await g[mr(0x147)]()){warning('Resource\x20was\x20not\x20deleted.');return;}const p=U&&(i[mr(0x16f)]||(i[mr(0x1a0)]===mr(0x201)||i['output']===mr(0x1da))&&!V);let j=p&&K instanceof GetApiEndpointPaginated?await K[mr(0x14a)]({'parameters':y,'options':u,'data':A}):await K[mr(0x16c)]({'parameters':y,'options':{...u},'data':A});if(i?.['verbose']){const m0=j['request'];console[mr(0x175)](mr(0x1dd)+m0['method'][mr(0x1ee)]()+':'+m0[mr(0x12b)]),A!==undefined&&console[mr(0x175)](mr(0x1ef)+a1I[mr(0x1c2)](JSON[mr(0x167)](A)));}if(j[mr(0x205)]){const {details:m1,id:m2,message:m3,status:m4}=j['error'],m5=m1?mr(0x131)+JSON[mr(0x167)](m1):'',m6=m2?',\x20NF\x20error\x20id:\x20'+m2:'',m7='(HTTP\x20status\x20code:\x20'+m4+m6+')';throw new Error('API\x20request\x20failed\x0a\x09Message:\x20'+m3+'\x20'+m7+m5);}let d=0x0;printCallResult(i,l,j[mr(0x176)],s,S,G,![],d,j[mr(0x19d)][mr(0x133)]);if(!i[mr(0x14b)]&&!p&&!V&&j[mr(0x15f)]?.[mr(0x17b)])while(j[mr(0x15f)]?.[mr(0x17b)]){const m8=await g[mr(0x1d6)](mr(0x210));if(m8)process['stdout'][mr(0x141)](0x0,-0x1),process[mr(0x1cf)][mr(0x1f5)](0x1),d+=j[mr(0x15f)][mr(0x14d)],j=await j[mr(0x15f)]['getNextPage'](),printCallResult(i,l,j[mr(0x176)],s,S,G,!![],d,j[mr(0x19d)][mr(0x133)]);else return;}}),M;}const b=has(z,mJ(0x19b)),n=K,Q=w(n,b);P(S,Q),h['addCommand'](Q);const c=omit(z,'opt');Object[mJ(0x128)](c)['length']>0x0&&generateCommands(m,K,Q,I,T,c,S);});async function X(W,K,z){const mF=mT,{input:S,file:H}=W;if(S!==undefined)try{return JSON['parse'](S);}catch(r){try{return a1e[mF(0x1ea)](S);}catch(F){throw new Error(mF(0x188));}}if(H!==undefined){if(!a1h[mF(0x159)](H))throw new Error(mF(0x177)+H);const t=a1h[mF(0x152)](H)['toString']();let Y;try{if(isString(t)){if(W['file']['endsWith']('.json'))Y=JSON[mF(0x1f9)](t);else{if(W[mF(0x1b7)][mF(0x168)](mF(0x20b))||W['file'][mF(0x168)](mF(0x1ff)))Y=a1e[mF(0x1ea)](t);else throw new Error(mF(0x197)+W[mF(0x1b7)][mF(0x1ca)]('.')[mF(0x20a)]());}}else Y=t;return Y;}catch(N){throw new Error(mF(0x169)+N['message']);}}if(K?.[mF(0x19b)]?.[mF(0x1e9)])throw new Error(mF(0x1a9));return await g[mF(0x1bb)](K,{'cmdPath':z,'skipValidation':W[mF(0x1f6)]});}}const printCallResult=(m,E,h,I,T,e,o,g,J)=>{const mt=a1mm;if(!m?.['quiet']){if(E)handleJsonOutput(m?.[mt(0x1a0)],h);else{if(I)handleYamlOutput(m?.[mt(0x1a0)],h);else{if(isListCommand(T)){const L=e?.[mt(0x186)](mt(0x1a6))?e[mt(0x180)](mt(0x1a6),'')[mt(0x1ca)](',')['map'](z=>z[mt(0x160)]()):undefined,P=T[T[mt(0x1f8)]-0x1],X=''+P+(P[mt(0x168)]('s')?'':'s'),W=upperFirst(X),K=has(h,X)?h[X]:h;printAsTable(K,W,L,o,g);}else console['log'](consoleFormat(h,J));}}}};