User:Thundercraft5/sw.js

// Add any test code here. // DO NOT SUBMIT TO JSRT! /* global self, Request */ /* jshint undef:true, esversion: 6 */ const map = { "test": "User:Thundercraft5/sw.js/module.js", "test2": "User:Thundercraft5/sw.js/module2.js", };

const providers = { "unpkg": "https://unpkg.com/${PACKAGE}@${VERSION|latest}/${PATH}", "esm-sh": "https://esm.sh/${PACKAGE}@${VERSION|latest}/${PATH}", "jsdelivr": "https://cdn.jsdelivr.net/npm/${PACKAGE}@${VERSION|latest}/${PATH}", }; const modules = {};

function formatString(s, replacements) { return s.replace(/\${(? \w+)(?:\|(?.+?)?)?}/g, (...args) => {		const { name, defaultValue } = args.pop;		return replacements[name] || defaultValue || "";	}); }

async function eventHandler { let { request: { url }, request } = this; url = new URL(url); console.log(this.clientId, url, Object.fromEntries(request.headers)); if (url.pathname.match(/^\/(?!.*\/wiki\/).*(\.[mc]?js$)?/)) { let normalized = url.pathname.replace(/^\/@/g, ""); console.log(normalized); const isSpecifier = ![".", "/"].some(s => normalized.includes(s)); const { groups: providerMatch } = normalized.match(/^(? [\w\-]+):(? [a-z\-0-9]+)(?:@(? [\d\.]{1,3}\d+|latest))?(? [^\&\?\#]+)?/) || {};		if (!providerMatch) { if (isSpecifier && !providerMatch) { normalized = map[normalized]; if (!normalized) { console.warn(`Module specifier "${normalized}" not found!`); throw new Error(`Module specifier "${normalized}" could not be resolved`); }			} else { normalized = new URL("./" + normalized, (await clients.get(this.clientId)).url); normalized = normalized.pathname.replace(/^\/([a-z\-]+?\/)?wiki\//, ""); }			console.log(normalized); url.searchParams.append("action", "raw"); url.searchParams.append("ctype", "text/javascript"); url.searchParams.set("title", normalized); url.pathname = "/index.php"; } else if (providers[providerMatch.provider]) { const { provider, path, version = "latest", package: packageName } = providerMatch; url = formatString(providers[provider], {				PACKAGE: packageName,				PATH: path,				VERSION: version,			}); }		return fetch(new Request(url, { ...request })) .then(async response => {				const headers = Object.fromEntries(response.headers);				const validTypes = ["application/javascript", "text/javascript"];				const type = headers?.["content-type"]?.split(";").shift;				if (!validTypes.includes(type)) 					throw new Error(`Server responded with a MIME type of "${type}", expected ${validTypes.map(s => `"${s}"`).join(" or ")} instead`);				return [					{ ...response, url }, 					headers,					await response.text,				];			}) .then(([response, headers, text]) => new Response(new Blob([text], { type: headers["content-type"] }), { ...response })); 	} };

self.addEventListener('fetch', event => { 	const result = eventHandler.call(event);	event.respondWith(result.then(r => {		if (r === undefined) return fetch(event.request);		else return r;	})); });

self.addEventListener('activate', event => {	console.log(event); });

self.addEventListener('install', event => {	console.log(event);	});