diff --git a/README.md b/README.md index fb4dc25..d4d1e36 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,7 @@ This was inspired by github1s.com. ### Changelog +- `1.1.15`: Move `code-insiders` to end of preference list - `1.1.14`: Fix code-insiders and fix passing in editor manually when its `subl` or `code`. - `1.1.13`: Use `Authorization` header instead of `access_token` query string. - `1.1.12`: When available, also use github access token for fetching tarballs (instead of just search) diff --git a/bin/git-peek b/bin/git-peek index 82559c9..c082d80 100755 --- a/bin/git-peek +++ b/bin/git-peek @@ -493,7 +493,7 @@ See: https://github.com/isaacs/node-glob/issues/167`);if(!(this instanceof pl))r `+r.slice(l,t),l=t+1),p=_;return y+=` `,r.length-l>n&&p>l?y+=r.slice(l,p)+` `+r.slice(p+1):y+=r.slice(l),y.slice(1)}function iwe(r){for(var n="",o=0,u,l=0;l=65536?l+=2:l++)o=BS(r,l),u=u0[o],!u&&PS(o)?(n+=r[l],o>=65536&&(n+=r[l+1])):n+=u||X4e(o);return n}function uwe(r,n,o){var u="",l=r.tag,t,p,_;for(t=0,p=o.length;t1024&&(R+="? "),R+=r.dump+(r.condenseFlow?'"':"")+":"+(r.condenseFlow?"":" "),!!q1(r,n,w,!1,!1)&&(R+=r.dump,u+=R));r.tag=l,r.dump="{"+u+"}"}function lwe(r,n,o,u){var l="",t=r.tag,p=Object.keys(o),_,y,w,R,k,M;if(r.sortKeys===!0)p.sort();else if(typeof r.sortKeys=="function")p.sort(r.sortKeys);else if(r.sortKeys)throw new M0("sortKeys must be a boolean or a function");for(_=0,y=p.length;_1024,k&&(r.dump&&IS===r.dump.charCodeAt(0)?M+="?":M+="? "),M+=r.dump,k&&(M+=Q6(r,n)),!!q1(r,n+1,R,!0,k)&&(r.dump&&IS===r.dump.charCodeAt(0)?M+=":":M+=": ",M+=r.dump,l+=M));r.tag=t,r.dump=l||"{}"}function lV(r,n,o){var u,l,t,p,_,y;for(l=o?r.explicitTypes:r.implicitTypes,t=0,p=l.length;t tag resolver accepts not "'+y+'" style');r.dump=u}return!0}return!1}function q1(r,n,o,u,l,t,p){r.tag=null,r.dump=o,lV(r,o,!1)||lV(r,o,!0);var _=GW.call(r.dump),y=u,w;u&&(u=r.flowLevel<0||r.flowLevel>n);var R=_==="[object Object]"||_==="[object Array]",k,M;if(R&&(k=r.duplicates.indexOf(o),M=k!==-1),(r.tag!==null&&r.tag!=="?"||M||r.indent!==2&&n>0)&&(l=!1),M&&r.usedDuplicates[k])r.dump="*ref_"+k;else{if(R&&M&&!r.usedDuplicates[k]&&(r.usedDuplicates[k]=!0),_==="[object Object]")u&&Object.keys(r.dump).length!==0?(lwe(r,n,r.dump,l),M&&(r.dump="&ref_"+k+r.dump)):(swe(r,n,r.dump),M&&(r.dump="&ref_"+k+" "+r.dump));else if(_==="[object Array]")u&&r.dump.length!==0?(r.noArrayIndent&&!p&&n>0?sV(r,n-1,r.dump,l):sV(r,n,r.dump,l),M&&(r.dump="&ref_"+k+r.dump)):(uwe(r,n,r.dump),M&&(r.dump="&ref_"+k+" "+r.dump));else if(_==="[object String]")r.tag!=="?"&&owe(r,r.dump,n,t,y);else{if(_==="[object Undefined]")return!1;if(r.skipInvalid)return!1;throw new M0("unacceptable kind of an object to dump "+_)}r.tag!==null&&r.tag!=="?"&&(w=encodeURI(r.tag[0]==="!"?r.tag.slice(1):r.tag).replace(/!/g,"%21"),r.tag[0]==="!"?w="!"+w:w.slice(0,18)==="tag:yaml.org,2002:"?w="!!"+w.slice(18):w="!<"+w+">",r.dump=w+" "+r.dump)}return!0}function awe(r,n){var o=[],u=[],l,t;for(J6(r,o,u),l=0,t=u.length;lVl.default.createElement(kh.Box,{flexDirection:"row"},Vl.default.createElement(kh.Box,{width:u,marginRight:1},Vl.default.createElement(kh.Text,{color:r?"blue":"whiteBright"},n)),Vl.default.createElement(kh.Box,{justifyContent:"flex-end"},Vl.default.createElement(kh.Text,{wrap:"truncate-end",color:"white",dimColor:!r},"| ",o==null?void 0:o.slice(0,48)))),KD={q:"",limit:20,per_page:8},mV={headers:{Accept:"application/vnd.github.v3+json"}};function Rwe(){var n,o,u;let r=pV.default.join(process.env.HOME,".config/hub");if((u=(o=(n=process.env.GITHUB_TOKEN)==null?void 0:n.trim())==null?void 0:o.length)!=null?u:0)return process.env.GITHUB_TOKEN.trim();if(tO.default.existsSync(r)){let l=aV.load(tO.default.readFileSync(r,"utf8"));if(typeof l!="object")return null;let t=Object.keys(l).find(p=>p.toLowerCase().includes("github.com"));if(t){let p=l[t].find(_=>_==null?void 0:_.oauth_token);if(p)return p==null?void 0:p.oauth_token}return null}else return null}var rO;function nO(){return typeof rO=="undefined"&&(rO=Rwe()),rO}function Awe(){if(iO)return;let r=nO();if(!r)return iO=!0,!1;mV.headers.Authorization=`Bearer ${r}`,iO=!0}var iO=!1;async function Owe(){var o,u;let r=await T_("https://trends.now.sh/api/repos"),n=await r.json();return n.total_count=(u=(o=n.items)==null?void 0:o.length)!=null?u:0,n.items||(n.items=[]),n.items.length>KD.per_page&&(n.items=n.items.slice(0,KD.per_page)),[r,n]}async function Lwe(r,n){let o=r.slice(1);KD.q=o;let u,l;if(o.trim().length)u=await T_(`https://api.github.com/search/repositories?${hV.default.stringify(KD)}`,mV),u.ok&&(l=await u.json());else{let t=await Owe();u=t[0],l=t[1]}if(u.ok){Number.isFinite(l.total_count)||(console.log("GitHub search API request failed."),process.exit(1));let t=new Array(Math.min(l.total_count,20,l.items.length)),p=0;for(let _=0;_{let[o,u]=Vl.useState(n||""),{data:l,error:t}=dV.default(["/"+o.trim()],Lwe,{isDocumentVisible:()=>!0,isOnline:()=>!0,isPaused:()=>!1}),p=Vl.default.useRef();Vl.default.useEffect(()=>{(l==null?void 0:l.length)&&(p.current=l)},[l,p]);let _=Vl.default.useCallback(y=>(y==null?void 0:y.value)&&r(y.value),[r]);return Vl.default.createElement(Vl.default.Fragment,null,Vl.default.createElement(kh.Text,{color:"black"},"Search Github repositories:"),Vl.default.createElement(kh.Text,null,"> ",Vl.default.createElement(fV.default,{value:o,onChange:u})),Vl.default.createElement(cV.default,{items:l||p.current,onSelect:_,itemComponent:bwe}))};function vV(r){return new Promise((n,o)=>{let u,l=!1;async function t(p){l=!0,u.unmount(),u.cleanup(),n(p),u=null}Awe();try{u=kh.render(Vl.default.createElement(Nwe,{onSelect:t,initialQuery:r}),{})}catch(p){u&&(u.unmount(),u.cleanup()),console.error(p),o(p)}u.waitUntilExit().then(()=>{l||process.exit()})})}var YX=is(i$()),KX=is(DX());var $X=is(HX()),XX=["code","subl","code-insiders","vim","vi"];typeof Promise.any!="function"&&GX();var JT=!1,Qc;var Vu,eL={redirect:"follow"},fg;(function(r){r[r.unknown=0]="unknown",r[r.vscode=1]="vscode",r[r.sublime=2]="sublime",r[r.vim=3]="vim"})(fg||(fg={}));function uE(){var r,n;JT||(Qc==null||Qc.removeCallback(),Qc=null,JT=!0,console.log("\u{1F5D1} Deleted temp repo")),((r=Vu==null?void 0:Vu.archive)==null?void 0:r.destroy)&&(Vu==null||Vu.archive.destroy()),(Vu==null?void 0:Vu._tar)&&(Vu==null||Vu._tar.removeAllListeners()),(Vu==null?void 0:Vu.slowTask)&&(Vu.slowTask.removeAllListeners(),Vu.slowTask=null),((n=Vu==null?void 0:Vu.destination)==null?void 0:n.length)&&u3.default.existsSync(Vu.destination)&&u3.default.rmSync(Vu.destination,{recursive:!0,force:!0})}process.once("SIGINT",uE);var s3=class{constructor(){this.didFinish=!1;this.slowTask=null;this.didUseFallback=!1}log(n){console.log(n)}async _prefetchGithub(n,o,u,l,t){let p=`https://cdn.jsdelivr.net/gh/${o}/${n}@${l}/${u||"README.md"}`,_=await T_(p,{redirect:"follow"});if(!_.ok||_.status===404)return!1;let y=await _.text();return y.trim().length?(await u3.default.promises.mkdir(oE.default.dirname(t),{recursive:!0}),await u3.default.promises.writeFile(t,y,"utf8"),!0):!1}prefetchGithub(n,o,u,l,t,p){return Promise.any([this._prefetchGithub(n,o,u,l,p),this._prefetchGithub(n,o,u,t,p)])}search(n){return vV(n)}async _unzip(n){let o=nO();o&&!eL.headers&&(eL.headers={authorization:`Bearer ${o}`});let u=await T_(n,eL);if(u.ok)return u.body;throw u.text()}async unzip(n,o,u,l,t){let p=await this.getArchive(`https://api.github.com/repos/${n}/${o}/tarball/${u}`,`https://api.github.com/repos/${n}/${o}/tarball/${l}`);return this.log("\u23F3 Extracting repository to temp folder..."),p.pipe(this._tar=YX.default.x({cwd:t,strip:1,onentry(_){},onwarn(_,y){console.warn(_)}})),await new Promise((_,y)=>{p.on("end",()=>{this._tar=null,this.log("\u{1F4BF} Finished downloading repository!"),_()}),p.on("error",w=>{JT||(this.log("\u{1F4BF} Failed to download repository!"),y(w))})})}clone(n,o){let u=`git clone --filter=tree:0 --single-branch --depth=1 ${n} ${o}`;return this.log(`Cloning ${n} to temp folder...`),new Promise((l,t)=>{let p=ZT.default.exec(u,{});p.stderr.pipe(process.stderr),p.once("close",()=>{l()}),p.once("exit",()=>{l()}),p.once("error",_=>{t(_)})})}parse(){return VX.default(` +`:""}var fwe=cwe,hwe={dump:fwe};function eO(r,n){return function(){throw new Error("Function yaml."+r+" is removed in js-yaml 4. Use yaml."+n+" instead, which is now safe by default.")}}var dwe=Ra,pwe=CW,mwe=DW,vwe=TW,gwe=xW,ywe=W6,_we=HW.load,Ewe=HW.loadAll,wwe=hwe.dump,Swe=M0,Cwe=eO("safeLoad","load"),Dwe=eO("safeLoadAll","loadAll"),Twe=eO("safeDump","dump"),xwe={Type:dwe,Schema:pwe,FAILSAFE_SCHEMA:mwe,JSON_SCHEMA:vwe,CORE_SCHEMA:gwe,DEFAULT_SCHEMA:ywe,load:_we,loadAll:Ewe,dump:wwe,YAMLException:Swe,safeLoad:Cwe,safeLoadAll:Dwe,safeDump:Twe},aV=xwe;var bwe=({isSelected:r=!1,label:n,description:o,maxLabelWidth:u})=>Vl.default.createElement(kh.Box,{flexDirection:"row"},Vl.default.createElement(kh.Box,{width:u,marginRight:1},Vl.default.createElement(kh.Text,{color:r?"blue":"whiteBright"},n)),Vl.default.createElement(kh.Box,{justifyContent:"flex-end"},Vl.default.createElement(kh.Text,{wrap:"truncate-end",color:"white",dimColor:!r},"| ",o==null?void 0:o.slice(0,48)))),KD={q:"",limit:20,per_page:8},mV={headers:{Accept:"application/vnd.github.v3+json"}};function Rwe(){var n,o,u;let r=pV.default.join(process.env.HOME,".config/hub");if((u=(o=(n=process.env.GITHUB_TOKEN)==null?void 0:n.trim())==null?void 0:o.length)!=null?u:0)return process.env.GITHUB_TOKEN.trim();if(tO.default.existsSync(r)){let l=aV.load(tO.default.readFileSync(r,"utf8"));if(typeof l!="object")return null;let t=Object.keys(l).find(p=>p.toLowerCase().includes("github.com"));if(t){let p=l[t].find(_=>_==null?void 0:_.oauth_token);if(p)return p==null?void 0:p.oauth_token}return null}else return null}var rO;function nO(){return typeof rO=="undefined"&&(rO=Rwe()),rO}function Awe(){if(iO)return;let r=nO();if(!r)return iO=!0,!1;mV.headers.Authorization=`Bearer ${r}`,iO=!0}var iO=!1;async function Owe(){var o,u;let r=await T_("https://trends.now.sh/api/repos"),n=await r.json();return n.total_count=(u=(o=n.items)==null?void 0:o.length)!=null?u:0,n.items||(n.items=[]),n.items.length>KD.per_page&&(n.items=n.items.slice(0,KD.per_page)),[r,n]}async function Lwe(r,n){let o=r.slice(1);KD.q=o;let u,l;if(o.trim().length)u=await T_(`https://api.github.com/search/repositories?${hV.default.stringify(KD)}`,mV),u.ok&&(l=await u.json());else{let t=await Owe();u=t[0],l=t[1]}if(u.ok){Number.isFinite(l.total_count)||(console.log("GitHub search API request failed."),process.exit(1));let t=new Array(Math.min(l.total_count,20,l.items.length)),p=0;for(let _=0;_{let[o,u]=Vl.useState(n||""),{data:l,error:t}=dV.default(["/"+o.trim()],Lwe,{isDocumentVisible:()=>!0,isOnline:()=>!0,isPaused:()=>!1}),p=Vl.default.useRef();Vl.default.useEffect(()=>{(l==null?void 0:l.length)&&(p.current=l)},[l,p]);let _=Vl.default.useCallback(y=>(y==null?void 0:y.value)&&r(y.value),[r]);return Vl.default.createElement(Vl.default.Fragment,null,Vl.default.createElement(kh.Text,{color:"black"},"Search Github repositories:"),Vl.default.createElement(kh.Text,null,"> ",Vl.default.createElement(fV.default,{value:o,onChange:u})),Vl.default.createElement(cV.default,{items:l||p.current,onSelect:_,itemComponent:bwe}))};function vV(r){return new Promise((n,o)=>{let u,l=!1;async function t(p){l=!0,u.unmount(),u.cleanup(),n(p),u=null}Awe();try{u=kh.render(Vl.default.createElement(Nwe,{onSelect:t,initialQuery:r}),{})}catch(p){u&&(u.unmount(),u.cleanup()),console.error(p),o(p)}u.waitUntilExit().then(()=>{l||process.exit()})})}var YX=is(i$()),KX=is(DX());var $X=is(HX()),XX=["code","subl","vim","vi","code-insiders"];typeof Promise.any!="function"&&GX();var JT=!1,Qc;var Vu,eL={redirect:"follow"},fg;(function(r){r[r.unknown=0]="unknown",r[r.vscode=1]="vscode",r[r.sublime=2]="sublime",r[r.vim=3]="vim"})(fg||(fg={}));function uE(){var r,n;JT||(Qc==null||Qc.removeCallback(),Qc=null,JT=!0,console.log("\u{1F5D1} Deleted temp repo")),((r=Vu==null?void 0:Vu.archive)==null?void 0:r.destroy)&&(Vu==null||Vu.archive.destroy()),(Vu==null?void 0:Vu._tar)&&(Vu==null||Vu._tar.removeAllListeners()),(Vu==null?void 0:Vu.slowTask)&&(Vu.slowTask.removeAllListeners(),Vu.slowTask=null),((n=Vu==null?void 0:Vu.destination)==null?void 0:n.length)&&u3.default.existsSync(Vu.destination)&&u3.default.rmSync(Vu.destination,{recursive:!0,force:!0})}process.once("SIGINT",uE);var s3=class{constructor(){this.didFinish=!1;this.slowTask=null;this.didUseFallback=!1}log(n){console.log(n)}async _prefetchGithub(n,o,u,l,t){let p=`https://cdn.jsdelivr.net/gh/${o}/${n}@${l}/${u||"README.md"}`,_=await T_(p,{redirect:"follow"});if(!_.ok||_.status===404)return!1;let y=await _.text();return y.trim().length?(await u3.default.promises.mkdir(oE.default.dirname(t),{recursive:!0}),await u3.default.promises.writeFile(t,y,"utf8"),!0):!1}prefetchGithub(n,o,u,l,t,p){return Promise.any([this._prefetchGithub(n,o,u,l,p),this._prefetchGithub(n,o,u,t,p)])}search(n){return vV(n)}async _unzip(n){let o=nO();o&&!eL.headers&&(eL.headers={authorization:`Bearer ${o}`});let u=await T_(n,eL);if(u.ok)return u.body;throw u.text()}async unzip(n,o,u,l,t){let p=await this.getArchive(`https://api.github.com/repos/${n}/${o}/tarball/${u}`,`https://api.github.com/repos/${n}/${o}/tarball/${l}`);return this.log("\u23F3 Extracting repository to temp folder..."),p.pipe(this._tar=YX.default.x({cwd:t,strip:1,onentry(_){},onwarn(_,y){console.warn(_)}})),await new Promise((_,y)=>{p.on("end",()=>{this._tar=null,this.log("\u{1F4BF} Finished downloading repository!"),_()}),p.on("error",w=>{JT||(this.log("\u{1F4BF} Failed to download repository!"),y(w))})})}clone(n,o){let u=`git clone --filter=tree:0 --single-branch --depth=1 ${n} ${o}`;return this.log(`Cloning ${n} to temp folder...`),new Promise((l,t)=>{let p=ZT.default.exec(u,{});p.stderr.pipe(process.stderr),p.once("close",()=>{l()}),p.once("exit",()=>{l()}),p.once("error",_=>{t(_)})})}parse(){return VX.default(` USAGE $ git-peek [git link or github link or search query or repository file path] diff --git a/package.json b/package.json index 6894a7b..dc29f8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jarred/git-peek", - "version": "1.1.14", + "version": "1.1.15", "author": "Jarred Sumner @Jarred-Sumner", "description": "Quickly preview remote Git repositories in your local editor", "bin": { diff --git a/src/index.ts b/src/index.ts index 3be797a..149b0da 100644 --- a/src/index.ts +++ b/src/index.ts @@ -12,7 +12,7 @@ import { fetch } from "./fetch"; import which from "which"; // let editorsToTry = ["code", "subl", "code-insiders", "vim", "vi"]; -let editorsToTry = ["code", "subl", "code-insiders", "vim", "vi"]; +let editorsToTry = ["code", "subl", "vim", "vi", "code-insiders"]; if (typeof Promise.any !== "function") { require("promise-any-polyfill");