UNPKG

@rspack/core

Version:

The fast Rust-based web bundler with webpack-compatible API

225 lines (223 loc) • 5.83 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/runtime/cssExtractHmr.ts var cssExtractHmr_exports = {}; __export(cssExtractHmr_exports, { cssReload: () => cssReload, normalizeUrl: () => normalizeUrl }); module.exports = __toCommonJS(cssExtractHmr_exports); function normalizeUrl(url) { const urlString = url.trim(); if (/^data:/i.test(urlString)) { return urlString; } const protocol = urlString.indexOf("//") !== -1 ? `${urlString.split("//")[0]}//` : ""; const components = urlString.replace(new RegExp(protocol, "i"), "").split("/"); const host = components[0].toLowerCase().replace(/\.$/, ""); components[0] = ""; const path = components.reduce((accumulator, item) => { switch (item) { case "..": accumulator.pop(); break; case ".": break; default: accumulator.push(item); } return accumulator; }, []).join("/"); return protocol + host + path; } var srcByModuleId = /* @__PURE__ */ Object.create(null); var noDocument = typeof document === "undefined"; var { forEach } = Array.prototype; function debounce(fn, time) { let timeout = 0; return function(...args) { const self = this; const functionCall = function functionCall2() { return fn.apply(self, args); }; clearTimeout(timeout); timeout = setTimeout(functionCall, time); }; } function noop() { } function getCurrentScriptUrl(moduleId) { let src = srcByModuleId[moduleId]; if (!src) { if (document.currentScript) { ({ src } = document.currentScript); } else { const scripts = document.getElementsByTagName("script"); const lastScriptTag = scripts[scripts.length - 1]; if (lastScriptTag) { ({ src } = lastScriptTag); } } srcByModuleId[moduleId] = src; } return (fileMap) => { if (!src) { return null; } const splitResult = src.match(/([^\\/]+)\.js$/); const filename = splitResult && splitResult[1]; if (!filename || !fileMap) { return [src.replace(".js", ".css")]; } return fileMap.split(",").map((mapRule) => { const reg = new RegExp(`${filename}\\.js$`, "g"); return normalizeUrl( src.replace(reg, `${mapRule.replace(/{fileName}/g, filename)}.css`) ); }); }; } function updateCss(el, url) { let normalizedUrl; if (!url) { if (!el.href) { return; } normalizedUrl = el.href.split("?")[0]; } else { normalizedUrl = url; } if (!isUrlRequest(normalizedUrl)) { return; } if (el.isLoaded === false) { return; } if (!normalizedUrl || !(normalizedUrl.indexOf(".css") > -1)) { return; } el.visited = true; const newEl = el.cloneNode(); newEl.isLoaded = false; newEl.addEventListener("load", () => { if (newEl.isLoaded) { return; } newEl.isLoaded = true; if (el.parentNode) { el.parentNode.removeChild(el); } }); newEl.addEventListener("error", () => { if (newEl.isLoaded) { return; } newEl.isLoaded = true; if (el.parentNode) { el.parentNode.removeChild(el); } }); newEl.href = `${normalizedUrl}?${Date.now()}`; const parent = el.parentNode; if (!parent) { return; } if (el.nextSibling) { parent.insertBefore(newEl, el.nextSibling); } else { parent.appendChild(newEl); } } function getReloadUrl(href, src) { let ret = ""; const normalizedHref = normalizeUrl(href); src.some((url) => { if (normalizedHref.indexOf(src) > -1) { ret = url; } }); return ret; } function reloadStyle(src) { if (!src) { return false; } const elements = document.querySelectorAll("link"); let loaded = false; forEach.call(elements, (el) => { if (!el.href) { return; } const url = getReloadUrl(el.href, src); if (!isUrlRequest(url)) { return; } if (el.visited === true) { return; } if (url) { updateCss(el, url); loaded = true; } }); return loaded; } function reloadAll() { const elements = document.querySelectorAll("link"); forEach.call(elements, (el) => { if (el.visited === true) { return; } updateCss(el); }); } function isUrlRequest(url) { if (!/^[a-zA-Z][a-zA-Z\d+\-.]*:/.test(url)) { return false; } return true; } function cssReload(moduleId, options) { if (noDocument) { console.log("[HMR] No `window.document` found, CSS HMR disabled"); return noop; } const getScriptSrc = getCurrentScriptUrl(moduleId); function update() { const src = getScriptSrc(options.filename); const reloaded = reloadStyle(src); if (options.locals) { console.log("[HMR] Detected local CSS Modules. Reload all CSS"); reloadAll(); return; } if (reloaded) { console.log("[HMR] CSS reload %s", src && src.join(" ")); } else { console.log("[HMR] Reload all CSS"); reloadAll(); } } return debounce(update, 50); } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { cssReload, normalizeUrl });