Fixed #33446 -- Added CSS source map support to ManifestStaticFilesStorage.

This commit is contained in:
Adam Johnson 2022-01-18 09:06:19 +00:00 committed by Mariusz Felisiak
parent fac26684fd
commit dc8bb35e39
7 changed files with 41 additions and 3 deletions

View File

@ -51,6 +51,10 @@ class HashedFilesMixin:
r"""(?P<matched>@import\s*["']\s*(?P<url>.*?)["'])""",
"""@import url("%(url)s")""",
),
(
r'(?m)(?P<matched>)^(/\*# (?-i:sourceMappingURL)=(?P<url>.*) \*/)$',
'/*# sourceMappingURL=%(url)s */',
),
)),
('*.js', (
(

View File

@ -294,7 +294,7 @@ method). The regular expressions used to find those paths
(``django.contrib.staticfiles.storage.HashedFilesMixin.patterns``) cover:
* The `@import`_ rule and `url()`_ statement of `Cascading Style Sheets`_.
* The `source map`_ comment in JavaScript.
* `Source map`_ comments in CSS and JavaScript files.
For example, the ``'css/styles.css'`` file with this content:
@ -327,10 +327,14 @@ argument. For example::
.. versionchanged:: 4.0
Support for finding paths in the source map comments was added.
Support for finding paths in JavaScript source map comments was added.
The ``manifest_storage`` argument was added.
.. versionchanged:: 4.1
Support for finding paths in CSS source map comments was added.
.. attribute:: storage.ManifestStaticFilesStorage.max_post_process_passes
Since static files might reference other static files that need to have their

View File

@ -139,7 +139,8 @@ Minor features
:mod:`django.contrib.staticfiles`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* ...
* :class:`~django.contrib.staticfiles.storage.ManifestStaticFilesStorage` now
replaces paths to CSS source map references with their hashed counterparts.
:mod:`django.contrib.syndication`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View File

@ -0,0 +1,2 @@
* {outline: 1px solid red;}
/*# sourceMappingURL=source_map.css.map */

View File

@ -0,0 +1,2 @@
* {outline: 1px solid red;}
/*# sOuRcEMaPpInGURL=source_map.css.map */

View File

@ -212,6 +212,30 @@ class TestHashedFiles:
self.assertIn(b"other.d41d8cd98f00.css", content)
self.assertPostCondition()
def test_css_source_map(self):
relpath = self.hashed_file_path('cached/source_map.css')
self.assertEqual(relpath, 'cached/source_map.b2fceaf426aa.css')
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertNotIn(b'/*# sourceMappingURL=source_map.css.map */', content)
self.assertIn(
b'/*# sourceMappingURL=source_map.css.99914b932bd3.map */',
content,
)
self.assertPostCondition()
def test_css_source_map_sensitive(self):
relpath = self.hashed_file_path('cached/source_map_sensitive.css')
self.assertEqual(relpath, 'cached/source_map_sensitive.456683f2106f.css')
with storage.staticfiles_storage.open(relpath) as relfile:
content = relfile.read()
self.assertIn(b'/*# sOuRcEMaPpInGURL=source_map.css.map */', content)
self.assertNotIn(
b'/*# sourceMappingURL=source_map.css.99914b932bd3.map */',
content,
)
self.assertPostCondition()
def test_js_source_map(self):
relpath = self.hashed_file_path('cached/source_map.js')
self.assertEqual(relpath, 'cached/source_map.cd45b8534a87.js')