npm-versions-sort

sort npm versions

// ==UserScript==
// @name         npm-versions-sort
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  sort npm versions
// @author       JackZhouMine([email protected])
// @match        https://www.npmjs.com/package/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=npmjs.com
// @grant        none
// @license MIT
// ==/UserScript==
(function(){const P=`
  :root {
    --sort-color-default: #e8deff;
    --sort-color-active: #885afa;
    --bg-ali: aliceblue;
  }
  .bg-ali {
    background-color:var(--bg-ali);
  }
  .flex {
    display: flex;
  }
  .flex-end {
    justify-content: flex-end;
  }
  .items-center {
    align-items: center;
  }
  .w-full_i {
    width: 100% !important;
  }
  .sortable {
    background-color: #f7f7f7;
  }

  .sort-icon {
    display: inline-flex;
    flex-direction: column;
    justify-content: space-between;
    height: 30px;
    margin-left: 6px;
  }
  .triangle {
    width: 0;
    height: 0;
    border-left: 10px solid transparent;
    border-right: 10px solid transparent;
    cursor: pointer;
  }
  .up {
    border-bottom: 13px solid;
    border-bottom-color: var(--sort-color-default);
  }
  .up-active {
    border-bottom-color: var(--sort-color-active);
  }
  .down {
    border-top: 13px solid;
    border-top-color: var(--sort-color-default);
  }
  .down-active {
    border-top-color: var(--sort-color-active);
  }
`,U="versions",F=s("#main"),q=B();O(P),z()===U&&setTimeout(()=>{T(),L(),V(),g(l()),y(),C(),D()},100),u("click",M,q);function M(){setTimeout(()=>{R(),y(),C(),D()},300)}function T(e=1,n="Downloads (Last 7 Days)"){b()[e].appendChild(x("download",n))}function L(){b()[0].appendChild(x("version","Version"))}function V(){b()[2].appendChild(x("published","Published"))}function R(){T(),L(),V()}function y(){const e=s("#download-up"),n=s("#download-down");u("click",()=>{g(l(),"asc"),e.classList.add("up-active"),n.classList.remove("down-active"),i("version"),i("published")},e),u("click",()=>{g(l(),"desc"),e.classList.remove("up-active"),n.classList.add("down-active"),i("version"),i("published")},n)}function C(){const e=s("#version-up"),n=s("#version-down");u("click",()=>{I(l(),"asc"),e.classList.add("up-active"),n.classList.remove("down-active"),i("download"),i("published")},e),u("click",()=>{I(l(),"desc"),e.classList.remove("up-active"),n.classList.add("down-active"),i("download"),i("published")},n)}function D(){const e=s("#published-up"),n=s("#published-down");u("click",()=>{k(l(),"asc"),e.classList.add("up-active"),n.classList.remove("down-active"),i("download"),i("version")},e),u("click",()=>{k(l(),"desc"),e.classList.remove("up-active"),n.classList.add("down-active"),i("download"),i("version")},n)}function i(e="download"){const n=s(`#${e}-up`),t=s(`#${e}-down`);n.classList.remove("up-active"),t.classList.remove("down-active")}function S(){const e=s("#tabpanel-versions");return s('table[aria-labelledby="version-history"]',e)}function l(){return s("tbody",S())}function _(){return s("thead",S())}function b(){return Array.from(w("th",_()))}function g(e,n="desc"){const t=Array.from(w("tr",e));t.sort((r,c)=>{const a=H(r),d=H(c);return n==="desc"?d-a:a-d});const o=document.createDocumentFragment();t.forEach(r=>o.appendChild(r)),e.appendChild(o)}function I(e,n="desc"){const t=Array.from(w("tr",e));t.sort((r,c)=>{const a=$(r),d=$(c);return n==="desc"?E(d,a):-E(d,a)});const o=document.createDocumentFragment();t.forEach(r=>o.appendChild(r)),e.appendChild(o)}function k(e,n="desc"){const t=Array.from(w("tr",e));t.sort((r,c)=>{const a=j(r),d=j(c);return n==="desc"?-N(d,a):N(d,a)});const o=document.createDocumentFragment();t.forEach(r=>o.appendChild(r)),e.appendChild(o)}function H(e){var o;const n=((o=s(".downloads",e))==null?void 0:o.textContent.replace(/,/g,""))||"0";return parseInt(n,10)}function $(e){var t;return(t=s("a",e))==null?void 0:t.textContent.replace(/,/g,"")}function j(e){return s("time",e).getAttribute("datetime")}function O(e){const n=A("style");n.textContent=e,document.head.appendChild(n)}function z(){return new URLSearchParams(window.location.search).get("activeTab")}function B(){const e=s('ul[role="tablist"]',F);return e==null?void 0:e.lastElementChild}function x(e="download",n){let t="";e==="download"?t=`
      <div class="triangle up" id="${e}-up"></div>
      <div class="triangle down down-active" id="${e}-down"></div>
      `:t=`
      <div class="triangle up" id="${e}-up"></div>
      <div class="triangle down" id="${e}-down"></div>
      `;const o=A("div");return o.classList.add("sort-icon"),o.innerHTML=t,o}function u(e,n,t){t&&t.addEventListener(e,n)}function s(e,n=document){return n.querySelector(e)}function w(e,n=document){return n.querySelectorAll(e)}function A(e){return document.createElement(e)}function E(e,n){const t=f=>{const[m,p]=f.split("-"),[h,v="0",G="0"]=m.split(".");return{major:parseInt(h,10),minor:parseInt(v,10),patch:parseInt(G,10),prerelease:p?p.split("."):[]}},o=t(e),r=t(n);if(o.major!==r.major)return o.major>r.major?1:-1;if(o.minor!==r.minor)return o.minor>r.minor?1:-1;if(o.patch!==r.patch)return o.patch>r.patch?1:-1;const c=o.prerelease,a=r.prerelease;if(c.length===0&&a.length>0)return 1;if(c.length>0&&a.length===0)return-1;if(c.length===0&&a.length===0)return 0;const d=Math.max(c.length,a.length);for(let f=0;f<d;f++){const m=c[f],p=a[f];if(m===void 0)return-1;if(p===void 0)return 1;const h=parseInt(m,10),v=parseInt(p,10);if(isNaN(h)){if(!isNaN(v))return 1}else{if(isNaN(v))return-1;if(h!==v)return h>v?1:-1}if(m!==p)return m>p?1:-1}return 0}function N(e,n){const t=new Date(e),o=new Date(n);return t>o?1:t<o?-1:0}})();