diff --git a/django_vite/core/asset_loader.py b/django_vite/core/asset_loader.py index b83ac6a..2a8e96d 100644 --- a/django_vite/core/asset_loader.py +++ b/django_vite/core/asset_loader.py @@ -313,7 +313,7 @@ def generate_vite_asset( scripts_attrs = {"type": "module", "crossorigin": "", **kwargs} # Add dependent CSS - tags.extend(self._load_css_files_of_asset(path)) + tags.extend(self._load_css_files_of_asset(path, attrs=kwargs)) # Add the script by itself url = self._get_production_server_url(manifest_entry.file) @@ -330,6 +330,7 @@ def generate_vite_asset( "crossorigin": "anonymous", "rel": "modulepreload", "as": "script", + **kwargs, } for dep in manifest_entry.imports: @@ -390,7 +391,7 @@ def preload_vite_asset( ) # Add dependent CSS - tags.extend(self._preload_css_files_of_asset(path)) + tags.extend(self._preload_css_files_of_asset(path, attrs=None)) # Preload imports for dep in manifest_entry.imports: @@ -407,21 +408,21 @@ def preload_vite_asset( return "\n".join(tags) def _preload_css_files_of_asset( - self, - path: str, + self, path: str, attrs: Optional[Dict[str, str]] = None ) -> List[Tag]: return self._generate_css_files_of_asset( path, tag_generator=TagGenerator.stylesheet_preload, + attrs=attrs, ).tags def _load_css_files_of_asset( - self, - path: str, + self, path: str, attrs: Optional[Dict[str, str]] = None ) -> List[Tag]: return self._generate_css_files_of_asset( path, tag_generator=TagGenerator.stylesheet, + attrs=attrs, ).tags class GeneratedCssFilesOutput(NamedTuple): @@ -438,6 +439,7 @@ def _generate_css_files_of_asset( already_processed_js: Optional[Set[str]] = None, already_processed_css: Optional[Set[str]] = None, tag_generator: Callable[[str], Tag] = TagGenerator.stylesheet, + attrs: Optional[Dict[str, str]] = None, ) -> GeneratedCssFilesOutput: """ Generates all CSS tags for dependencies of an asset. @@ -467,7 +469,11 @@ def _generate_css_files_of_asset( new_already_processed_js, new_already_processed_css, ) = self._generate_css_files_of_asset( - import_path, already_processed_js, already_processed_css, tag_generator + import_path, + already_processed_js, + already_processed_css, + tag_generator, + attrs, ) already_processed_js.update(new_already_processed_js) already_processed_css.update(new_already_processed_css) @@ -477,7 +483,7 @@ def _generate_css_files_of_asset( if css_path in already_processed_css: continue url = self._get_production_server_url(css_path) - tags.append(tag_generator(url)) + tags.append(tag_generator(url, attrs=attrs)) already_processed_css.add(css_path) return self.GeneratedCssFilesOutput( diff --git a/django_vite/core/tag_generator.py b/django_vite/core/tag_generator.py index 1f85641..91c2291 100644 --- a/django_vite/core/tag_generator.py +++ b/django_vite/core/tag_generator.py @@ -1,4 +1,4 @@ -from typing import Dict +from typing import Dict, Optional Tag = str @@ -36,7 +36,7 @@ def script(src: str, attrs: Dict[str, str]) -> Tag: return f'' @staticmethod - def stylesheet(href: str) -> Tag: + def stylesheet(href: str, attrs: Optional[Dict[str, str]] = None) -> Tag: """ Generates an HTML stylesheet tag for CSS. @@ -47,10 +47,12 @@ def stylesheet(href: str) -> Tag: str -- CSS link tag. """ - return f'' + attrs_str = attrs_to_str(attrs if attrs else {}) + + return f'' @staticmethod - def stylesheet_preload(href: str) -> Tag: + def stylesheet_preload(href: str, attrs: Optional[Dict[str, str]] = None) -> Tag: """ Generates an HTML preload tag for CSS. @@ -61,7 +63,9 @@ def stylesheet_preload(href: str) -> Tag: str -- CSS link tag. """ - return f'' + attrs_str = attrs_to_str(attrs if attrs else {}) + + return f'' @staticmethod def preload(href: str, attrs: Dict[str, str]) -> Tag: diff --git a/tests/tests/templatetags/test_vite_asset.py b/tests/tests/templatetags/test_vite_asset.py index 3d489f3..ebb5d0c 100644 --- a/tests/tests/templatetags/test_vite_asset.py +++ b/tests/tests/templatetags/test_vite_asset.py @@ -220,9 +220,14 @@ def test_vite_asset_kebab_attribute(): ) html = template.render(Context({})) soup = BeautifulSoup(html, "html.parser") - script_tag = soup.find("script") - assert script_tag["data-item-track"] == "reload" - assert script_tag["data-other"] == "3" + + for script_tag in soup.find_all("script"): + assert script_tag["data-item-track"] == "reload" + assert script_tag["data-other"] == "3" + + for link in soup.find_all("link"): + assert link["data-item-track"] == "reload" + assert link["data-other"] == "3" def test_vite_asset_custom_attributes(dev_mode_all):