Skip to content

Commit

Permalink
fix circular js import recursion
Browse files Browse the repository at this point in the history
  • Loading branch information
Niicck committed Jul 12, 2024
1 parent 00acae0 commit 872403d
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 17 deletions.
42 changes: 29 additions & 13 deletions django_vite/core/asset_loader.py
Original file line number Diff line number Diff line change
Expand Up @@ -427,13 +427,16 @@ def _load_css_files_of_asset(
class GeneratedCssFilesOutput(NamedTuple):
# list of generated CSS tags
tags: List[Tag]
# set of already processed js imports
already_processed_js: Set[str]
# set of already processed CSS tags
already_processed: Set[str]
already_processed_css: Set[str]

def _generate_css_files_of_asset(
self,
path: str,
already_processed: Optional[Set[str]] = None,
already_processed_js: Optional[Set[str]] = None,
already_processed_css: Optional[Set[str]] = None,
tag_generator: Callable[[str], Tag] = TagGenerator.stylesheet,
) -> GeneratedCssFilesOutput:
"""
Expand All @@ -448,25 +451,38 @@ def _generate_css_files_of_asset(
tags -- List of CSS tags.
already_processed -- List of already processed css paths
"""
if already_processed is None:
already_processed = set()
if already_processed_css is None:
already_processed_css = set()
if already_processed_js is None:
already_processed_js = set()
tags: List[Tag] = []
manifest_entry = self.manifest.get(path)

for import_path in manifest_entry.imports:
new_tags, new_already_processed = self._generate_css_files_of_asset(
import_path, already_processed, tag_generator
if import_path in already_processed_js:
continue
already_processed_js.add(import_path)
(
new_tags,
new_already_processed_js,
new_already_processed_css,
) = self._generate_css_files_of_asset(
import_path, already_processed_js, already_processed_css, tag_generator
)
already_processed.update(new_already_processed)
already_processed_js.update(new_already_processed_js)
already_processed_css.update(new_already_processed_css)
tags.extend(new_tags)

for css_path in manifest_entry.css:
if css_path not in already_processed:
url = self._get_production_server_url(css_path)
tags.append(tag_generator(url))
already_processed.add(css_path)

return self.GeneratedCssFilesOutput(tags, already_processed)
if css_path in already_processed_css:
continue
url = self._get_production_server_url(css_path)
tags.append(tag_generator(url))
already_processed_css.add(css_path)

return self.GeneratedCssFilesOutput(
tags, already_processed_js, already_processed_css
)

def generate_vite_asset_url(self, path: str) -> str:
"""
Expand Down
File renamed without changes.
11 changes: 7 additions & 4 deletions tests/tests/templatetags/test_vite_asset.py
Original file line number Diff line number Diff line change
Expand Up @@ -310,20 +310,23 @@ def test_vite_asset_external_app_production(external_vue_app):
"DJANGO_VITE": {
"default": {
"dev_mode": False,
"manifest_path": Path(settings.STATIC_ROOT) / "recursion.json",
"manifest_path": Path(settings.STATIC_ROOT)
/ "circular-imports.json",
}
}
},
],
indirect=True,
)
def test_recursion(patch_settings):
def test_circular_js_imports(patch_settings):
"""
Circular JS imports in a manifest should not cause an infinite recursion error.
"""
template = Template(
"""
{% load django_vite %}
{% vite_asset 'src/index.jsx' %}
"""
)
html = template.render(Context({}))
soup = BeautifulSoup(html, "html.parser")
assert True
assert html

0 comments on commit 872403d

Please sign in to comment.