No-Cache UserScript Link Loader

Forces the loading of UserScript links without caching to ensure the latest version is always fetched.

As of 21/05/2023. See the latest version.

// ==UserScript==
// @name         No-Cache UserScript Link Loader
// @namespace    http://tampermonkey.net/
// @version      1.0.0
// @description  Forces the loading of UserScript links without caching to ensure the latest version is always fetched.
// @author       CY Fung
// @match        https://greasyfork.org/*
// @icon         https://www.google.com/s2/favicons?sz=64&domain=greasyfork.org
// @grant        none
// @run-at       document-start
// @unwrap
// @allFrames
// @inject-into  page
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';
    let f0 = null;
    /*
    let f0 = () => {
        if (!cid) return;
        if (!document || !document.head) return;
        let meta = document.createElement('meta');
        meta.setAttribute('http-equiv', 'expires');
        meta.setAttribute('content', '0');
        document.head.appendChild(meta);
        clearInterval(cid);
        f0 = null;
    }
    let cid = setInterval(f0, 1);
    */

    const rand4 = () => Math.floor(Math.random() * 8888 + 1000);
    const generateLink = async (href) => {
        let link = document.createElement("link");
        link.rel = "prefetch";
        link.setAttribute('crossorigin', "anonymous");
        link.setAttribute('as', "script");
        link.setAttribute('fetchpriority', 'high');
        link.href = href + '?' + rand4() + '#' + rand4();
        document.head.appendChild(link);
    }
    const f = () => {
        let p = document.querySelectorAll('a[href*="scripts/"][href$=".user.js"]:not([no-cache-95])');
        for (const s of p) {
            s.setAttribute('no-cache-95', '');
            f0 ? f0() : null;
            let href1 = s.href;
            let href2 = s.getAttribute('href');
            generateLink(href1);
            href1 === href2 || generateLink(href2);
        }
        if (document.readyState === 'complete') return;
        requestAnimationFrame(f);
    };
    requestAnimationFrame(f);





    // Your code here...
})();