UNPKG

ado-auth

Version:
8 lines (7 loc) 13 kB
#!/usr/bin/env node var Pe=Object.create;var k=Object.defineProperty,Ue=Object.defineProperties,Ae=Object.getOwnPropertyDescriptor,Me=Object.getOwnPropertyDescriptors,Fe=Object.getOwnPropertyNames,re=Object.getOwnPropertySymbols,Le=Object.getPrototypeOf,ne=Object.prototype.hasOwnProperty,je=Object.prototype.propertyIsEnumerable;var oe=(t,e,r)=>e in t?k(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,R=(t,e)=>{for(var r in e||(e={}))ne.call(e,r)&&oe(t,r,e[r]);if(re)for(var r of re(e))je.call(e,r)&&oe(t,r,e[r]);return t},N=(t,e)=>Ue(t,Me(e)),ie=t=>k(t,"__esModule",{value:!0});var Be=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Je=(t,e)=>{ie(t);for(var r in e)k(t,r,{get:e[r],enumerable:!0})},Ye=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Fe(e))!ne.call(t,n)&&n!=="default"&&k(t,n,{get:()=>e[n],enumerable:!(r=Ae(e,n))||r.enumerable});return t},a=t=>Ye(ie(k(t!=null?Pe(Le(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var l=(t,e,r)=>new Promise((n,p)=>{var s=d=>{try{m(r.next(d))}catch(B){p(B)}},o=d=>{try{m(r.throw(d))}catch(B){p(B)}},m=d=>d.done?n(d.value):Promise.resolve(d.value).then(s,o);m((r=r.apply(t,e)).next())});var h=Be(c=>{var J,se,pe,ae,ce=!0;typeof process!="undefined"&&({FORCE_COLOR:J,NODE_DISABLE_COLORS:se,NO_COLOR:pe,TERM:ae}=process.env,ce=process.stdout&&process.stdout.isTTY);var He=c.$={enabled:!se&&pe==null&&ae!=="dumb"&&(J!=null&&J!=="0"||ce)};function g(t,e){let r=new RegExp(`\\x1b\\[${e}m`,"g"),n=`[${t}m`,p=`[${e}m`;return function(s){return!He.enabled||s==null?s:n+(~(""+s).indexOf(p)?s.replace(r,p+n):s)+p}}c.reset=g(0,0);c.bold=g(1,22);c.dim=g(2,22);c.italic=g(3,23);c.underline=g(4,24);c.inverse=g(7,27);c.hidden=g(8,28);c.strikethrough=g(9,29);c.black=g(30,39);c.red=g(31,39);c.green=g(32,39);c.yellow=g(33,39);c.blue=g(34,39);c.magenta=g(35,39);c.cyan=g(36,39);c.white=g(37,39);c.gray=g(90,39);c.grey=g(90,39);c.bgBlack=g(40,49);c.bgRed=g(41,49);c.bgGreen=g(42,49);c.bgYellow=g(43,49);c.bgBlue=g(44,49);c.bgMagenta=g(45,49);c.bgCyan=g(46,49);c.bgWhite=g(47,49)});Je(exports,{AUTH_DELIMITER:()=>w,AdoAuthApiResponseTypes:()=>te,CLIENT_ID:()=>O,DEFAULT_HOST:()=>D,PrepareTypes:()=>y,SERVER_PORT:()=>I,SERVER_TIMEOUT:()=>Y,auth:()=>G,listenForTokenFromTheWebsite:()=>H,npmString:()=>E,operate:()=>ee,prepare:()=>q,readConfig:()=>Z,refetch:()=>W,writeAdoRc:()=>_,writeNpmrc:()=>V,writeYarn2rc:()=>Q,yarnString:()=>T});var S=a(h()),De=a(require("sade"));var ge="0.2.13";var x=a(h()),Y=6e4,I=35287,D="https://ado-auth.vercel.app",O="54DC9EFD-680A-4B1E-8066-D669BC6A5D09",w=":_authToken=",E=(0,x.yellow)((0,x.bold)("npm")),T=(0,x.yellow)((0,x.bold)("yarn"));var b=a(h()),L=a(require("os")),j=a(require("path"));var he=a(require("open")),be=a(require("url"));var me=a(require("fs"));function _(t,e){let r=Number(e.expires_in);if(isNaN(r))throw Error("Auth token has invalid expires_in property. Expected a number.");let n=new Date(Date.now()+r*1e3).toISOString();me.default.writeFileSync(t,JSON.stringify(N(R({},e),{expires_on:n}),null," "),"utf8")}var ue=a(h());var le=a(h()),fe=a(require("light-spinner")),$=class extends fe.default{constructor(e){super(e);this.prefixText=e.prefixText||""}setPrefixText(e){this.prefixText=e}setText(e){this.text=`${(0,le.dim)(`[${this.prefixText}] `)} ${e}`}};var de=class{constructor(){this.debugEnabled=!1;this.debugPrefix=(0,ue.dim)("[ado-auth]");this.enableDebug=()=>{this.debugEnabled=!0};this.disableDebug=()=>{this.debugEnabled=!1};this.debug=(e,...r)=>{this.debugEnabled&&console.debug(this.debugPrefix,e,...r)};this.spinner={new:e=>{var r;this.debugEnabled&&((r=this._spinner)==null||r.stop(),this._spinner=new $(e),this._spinner.start())},start:()=>{var e;this.debugEnabled&&((e=this._spinner)==null||e.start())},succeed:e=>{var r,n;this.debugEnabled&&(this.debug(` \u2705 ${e||((r=this._spinner)==null?void 0:r.text)}`),(n=this._spinner)==null||n.stop())},fail:e=>{var r,n;this.debugEnabled&&(this.debug(` \u274C ${e||((r=this._spinner)==null?void 0:r.text)}`),(n=this._spinner)==null||n.stop())}}}newSpinner(e){this._spinner=new $(e)}},i=new de;var ye=a(require("http")),U=a(h());function P(t){return l(this,null,function*(){return new Promise((e,r)=>l(this,null,function*(){let n=[],p;t.on("data",s=>{n.push(s)}).on("end",()=>{p=JSON.parse(Buffer.concat(n).toString()),e(p||void 0)}).on("error",r)}))})}function H(t){return new Promise((e,r)=>{let n=ye.default.createServer((s,o)=>l(this,null,function*(){if(!s.method)return o.end();if(o.setHeader("Access-Control-Allow-Origin",t.host),o.setHeader("Access-Control-Allow-Methods","POST, OPTIONS"),o.setHeader("Access-Control-Allow-Headers","content-type"),/POST/i.test(s.method)){let m=yield P(s);if(m&&m.access_token)return o.setHeader("Content-Type","application/json"),e(m),clearTimeout(p),o.end(JSON.stringify({status:"OK"})),i.spinner.succeed("Received the token"),n.close()}return o.writeHead(200),o.end()})),p=setTimeout(()=>(i.spinner.fail("Could not retrieve token within 60 seconds"),r(new Error("Token retrieval took too long")),n.close()),Y);i.debug("Started server at",(0,U.bold)((0,U.green)(`http://localhost:${t.port}`))),n.listen(t.port),i.spinner.new({text:"listening to POST request from the ado-auth site"})})}function We(t=O,e,r){let n=new be.URL(e);return n.pathname="/api/auth",`https://app.vssps.visualstudio.com/oauth2/authorize?client_id=${t}&response_type=Assertion&scope=vso.packaging&redirect_uri=${n.href}&state=${encodeURIComponent(`{"port":"${r}"}`)}`}function G(t,e){return l(this,null,function*(){let r=We(e.clientId,e.host,e.port);i.debug(`Opening ${r}`),(0,he.default)(r);let n=yield H(e);return n.access_token&&n.refresh_token&&n.expires_in?_(t,n):console.error("Something went wrong while fetching refresh token"),n})}var Te=a(require("url"));var Se=a(require("https")),Re=a(require("url"));function xe(t,e,r){return l(this,null,function*(){let n=JSON.stringify(r),p=new Re.URL(t),s={hostname:p.hostname,port:443,path:p.pathname,method:e,headers:{"Content-Type":"application/json","Content-Length":Buffer.byteLength(n)}};return new Promise(o=>{Se.default.request(s,m=>l(this,null,function*(){let d=yield P(m);o(d)})).end(n)})})}function W(t,e,r){return l(this,null,function*(){let n=new Te.URL(r.host);n.pathname="api/refresh",i.debug(`Calling ${n.href} to refresh token`),i.spinner.new({text:"Refreshing token"});let p=yield xe(n.href,"POST",{token:t.refresh_token,port:r.port});if((p==null?void 0:p.code)==="SUCCESS")return _(e,p.body),i.spinner.succeed("Received refreshed token succesfully."),p.body;i.spinner.fail("Something went wrong while fetching refresh token"),i.debug(p)})}var z=a(require("fs"));var y;(function(n){n[n.refetch=0]="refetch",n[n.fetch=1]="fetch",n[n.noop=2]="noop"})(y||(y={}));function q(t){if(z.default.existsSync(t)){let e=z.default.readFileSync(t,"utf-8");try{let r=JSON.parse(e);return new Date(r.expires_on)<new Date(Date.now()-5*60*1e3)?{type:y.refetch,data:r}:{type:y.noop,data:r}}catch(r){r instanceof Error&&console.warn(r.message)}}return{type:y.fetch}}var A=a(require("fs")),f=a(h()),ke=a(require("os")),Oe=a(require("path"));function V({npmrcPath:t,registries:e,token:r}){let n="";if(i.debug(`${(0,f.bold)(`${e.size}`)} registries to be updated`),A.default.existsSync(t)){i.debug(`found ${(0,f.cyan)((0,f.bold)(".npmrc"))} in home directory`);let p=A.default.readFileSync(t,"utf-8");for(let s of p.split(/\n/))if(/^\/\//.test(s)){let[o]=s.split(w),m=[...e].find(d=>d===o);m?(i.debug(`Adding a token to the "${(0,f.blue)(m)}" entry`),n+=o+w+r.access_token+` `,e.delete(m)):n+=s+` `}}else i.debug(`No ${(0,f.cyan)((0,f.bold)(".npmrc"))} in home directory`);for(let p of e.values())i.debug(`Adding a new entry "${(0,f.blue)(p)}" with token`),e.delete(p),n+=p+w+(r==null?void 0:r.access_token)+` `;n&&(i.debug("\u270F\uFE0F ",(0,f.green)("Writing"),(0,f.cyan)((0,f.bold)("~/.npmrc"))),A.default.writeFileSync(Oe.default.resolve(ke.default.homedir(),".npmrc"),n))}var M=a(require("fs")),K=a(require("js-yaml")),u=a(h()),we=a(require("os")),Ee=a(require("path"));function Q({registries:t,token:e,yarnrcPath:r}){let n={npmRegistries:{}};if(M.default.existsSync(r)){if(i.debug(`Found ${(0,u.bold)((0,u.cyan)(".yarnrc.yml"))} in home directory`),n=K.default.load(M.default.readFileSync(r,"utf-8")),n.npmRegistries||(n.npmRegistries={}),n&&typeof n=="object")for(let o of t){let m=n.npmRegistries[o];m&&(i.debug(`Adding a token to the "${(0,u.blue)(o)}" entry`),m.npmAuthToken=e.access_token,t.delete(o))}}else i.debug(`No ${(0,u.cyan)((0,u.bold)(".yarnrc.yml"))} found in home directory`);let p=t.size?[...t].reduce((o,m)=>({npmRegistries:N(R({},o.npmRegistries),{[m]:{npmAlwaysAuth:!0,npmAuthToken:e.access_token}})}),{npmRegistries:{}}):{npmRegistries:{}},s=K.default.dump({npmRegistries:R(R({},p.npmRegistries),n.npmRegistries)});s&&(i.debug("\u270F\uFE0F ",(0,u.green)("Writing"),(0,u.cyan)((0,u.bold)("~/.yarnrc.yml"))),M.default.writeFileSync(Ee.default.resolve(we.default.homedir(),".yarnrc.yml"),s))}var C=a(require("child_process")),v=a(h());var ze=/^(https?)?:?\/\/registry\.(yarnpkg|npmjs)\.(com|org).*/i,qe=[/^\/\/pkgs\.dev\.azure\.com/i,/^\/\/(.*?).pkgs\.visualstudio\.com/i];function Ve(t){return qe.filter(e=>e.test(t)).length>0}var _e={npm:"npm config get registry",yarn:"yarn config get registry",yarn2:"yarn config get npmRegistryServer"},F={encoding:"utf8",cwd:process.cwd()};function X(t=""){return t.replace(/^https?:/,"")}function Ke(t){try{if(t==="npm"||t==="yarn"){let e=JSON.parse((0,C.execSync)("npm config list --json",F)),r=[];for(let n in e)/@(.*?):registry/.test(n)&&r.push(X(e[n]));return r}else if(t==="yarn2"){let e=[],r=JSON.parse((0,C.execSync)("yarn config get npmScopes --json",F));for(let n of r)e.push(X(n.npmRegistryServer));return e}}catch(e){i.debug("No scoped registries found")}}var Ce={npm:E,yarn:T,yarn2:T};function ve(t){return!/undefined/i.test(t)&&Ve(t)&&!ze.test(t)}function Ne(t){var n,p;let e=[],r=t;if(t==="yarn"){let o=((n=(0,C.execSync)("yarn -v",F))==null?void 0:n.trim()).match(/(\d+)\.*/i);Number(o==null?void 0:o[1])>=2&&(r="yarn2")}try{let s=X((p=(0,C.execSync)(_e[r],F))==null?void 0:p.trim());ve(s)&&e.push(s),i.debug("Trying to add scoped registries");for(let o of Ke(r)||[])ve(o)&&e.push(o)}catch(s){i.debug(`Running "${_e[r]}" resulted in an error - `,s)}if(!e.length)i.debug(`No custom ${Ce[r]} Azure DevOps registry found.`);else{i.debug(`${Ce[r]} config contains these registries -> `);for(let s of e)i.debug(` ${(0,v.blue)(s)}`)}return e}function Z(){let t=[];try{t.push(...Ne("npm"))}catch(r){r instanceof Error&&i.debug("running npm failed - ",(0,v.red)(r.message))}let e=[];try{e.push(...Ne("yarn"))}catch(r){r instanceof Error&&i.debug("running yarn failed - ",(0,v.red)(r.message))}return new Set([...t.flatMap(r=>Ie(r)),...e.flatMap(r=>Ie(r))].filter(Boolean))}function Ie(t){if(!t)return[];let e=t.replace(/\/registry\/?$/im,"/");return[e,e+"registry/"]}function ee(t){return l(this,null,function*(){t.debug&&i.enableDebug(),i.debug(`Trying to get registry settings from ${E} and ${T}`);let e=Z();if(!e.size)return i.debug("No custom registries found. Skipping ado-auth");let r=j.default.resolve(L.default.homedir(),".ado-authrc.json"),n=j.default.resolve(L.default.homedir(),".npmrc"),p=j.default.resolve(L.default.homedir(),".yarnrc.yml"),s=q(r),o;s.type===y.fetch?(i.debug((0,b.magenta)((0,b.bold)("Trying to get auth token"))),o=yield G(r,t)):s.type===y.refetch?(i.debug((0,b.magenta)((0,b.bold)("Trying to refetch auth token"))),o=yield W(s.data,r,t)):s.type===y.noop&&(i.debug("\u2705 ",(0,b.green)((0,b.bold)("Valid token exists!"))),o=s.data),o&&(V({npmrcPath:n,token:o,registries:new Set(e)}),Q({yarnrcPath:p,token:o,registries:new Set(e)}))})}var te;(function(o){o.NO_RESULT="NO_RESULT",o.NO_TOKENS="NO_TOKENS",o.MISSING_CODE="MISSING_CODE",o.MISSING_SECRET="MISSING_SECRET",o.ADO_REQUEST_ERROR="ADO_REQUEST_ERROR",o.SUCCESS="SUCCESS"})(te||(te={}));var $e=(0,De.default)("ado-auth",!0).version(ge).option("--host","On-premises url (including protocol) for the tool ado-auth api",D).option("-p, --port","localhost listening port to use for ado-auth api",I).option("-c, --clientid","vistualstudio.com app client ID to use to authenticate").option("-d, --debug","show debug logs",!1);$e.action(t=>l(void 0,null,function*(){t.debug&&i.enableDebug(),t.clientId?i.debug("Using client id - ",(0,S.red)((0,S.bold)(t.clientId))):t.clientId=O,t.host!==D&&i.debug("Using cusotm host for authentication - ",(0,S.red)((0,S.bold)(t.host))),t.port!==I&&i.debug("Using custom port for auth callback - ",(0,S.red)((0,S.bold)(`${t.port}`))),yield ee(t)}));require.main===module&&!process.env.CI&&$e.parse(process.argv);0&&(module.exports={AUTH_DELIMITER,AdoAuthApiResponseTypes,CLIENT_ID,DEFAULT_HOST,PrepareTypes,SERVER_PORT,SERVER_TIMEOUT,auth,listenForTokenFromTheWebsite,npmString,operate,prepare,readConfig,refetch,writeAdoRc,writeNpmrc,writeYarn2rc,yarnString});