From b30cd8474d0a2338ff8683b80139cb61caf58056 Mon Sep 17 00:00:00 2001 From: Karen Rasmussen Date: Tue, 27 Oct 2026 16:48:12 -0300 Subject: [PATCH] Serve ES modules with a wrapper the browser accepts --- tests/unit/viahtml/patch_test.py | 171 ++++++++++++++++++++++++++++++- viahtml/patch.py | 106 +++++++++++++++++++ 2 files changed, 275 insertions(+), 2 deletions(-) diff --git a/tests/unit/viahtml/patch_test.py b/tests/unit/viahtml/patch_test.py index a080124f..5000614d 100644 --- a/tests/unit/viahtml/patch_test.py +++ b/tests/unit/viahtml/patch_test.py @@ -1,12 +1,22 @@ # pylint:disable=protected-access -from unittest.mock import create_autospec, sentinel +from unittest.mock import create_autospec, patch, sentinel import pytest +from pywb.rewrite.content_rewriter import RewriteInfo +from pywb.rewrite.default_rewriter import DefaultRewriter +from pywb.rewrite.html_rewriter import HTMLRewriter from pywb.rewrite.url_rewriter import UrlRewriter from viahtml.hooks import Hooks -from viahtml.patch import _PatchedHTMLRewriter +from viahtml.patch import ( + ESM_MOD, + ESM_TEXT_TYPE, + _ESMWombatProxyRewriter, + _patch_esm_rewriting, + _PatchedHTMLRewriter, + _resolve_text_type, +) class TestRewriteLinkHref: @@ -17,6 +27,13 @@ class TestRewriteLinkHref: # pywb's /id_/ endpoint in order to disable any rewriting of # manifest files. ("https://example.com", [("rel", "manifest")], "id_/https://example.com"), + # Links that preload an ES module go through the module modifier, so + # that the module isn't served with pywb's classic script wrapper. + ( + "https://example.com", + [("rel", "modulepreload")], + "esm_/https://example.com", + ), # Any other links get sent to the rw_mod endpoint which will rewrite # the file as usual. ("https://example.com", [], "rw_mod/https://example.com"), @@ -87,6 +104,45 @@ def test_rewrite_tag_attrs_if_modify_tag_attrs_returns_stop_False( # It returns what pywb's _rewrite_tag_attrs returned. assert returned is True + def test_it_sends_module_scripts_to_the_module_modifier( + self, patched_html_rewriter + ): + self.returning_module_script(patched_html_rewriter) + + patched_html_rewriter._rewrite_tag_attrs("script", sentinel.tag_attrs) + + assert ( + self.written(patched_html_rewriter) + == '