from pathlib import Path from django.conf import settings from django.contrib.staticfiles.storage import ManifestStaticFilesStorage from rcssmin import cssmin from rjsmin import jsmin class UmapManifestStaticFilesStorage(ManifestStaticFilesStorage): support_js_module_import_aggregation = True # We remove `;` at the end of all regexps to match our prettier config. _js_module_import_aggregation_patterns = ( "*.js", ( ( ( r"""(?Pimport(?s:(?P[\s\{].*?))""" r"""\s*from\s*['"](?P[\.\/].*?)["']\s*)""" ), 'import%(import)s from "%(url)s"\n', ), ( ( r"""(?Pexport(?s:(?P[\s\{].*?))""" r"""\s*from\s*["'](?P[\.\/].*?)["']\s*)""" ), 'export%(exports)s from "%(url)s"\n', ), ( r"""(?Pimport\s*['"](?P[\.\/].*?)["']\s*)""", 'import"%(url)s"\n', ), ( r"""(?Pimport\(["'](?P.*?)["']\))""", """import("%(url)s")""", ), ), ) def post_process(self, paths, **options): collected = super().post_process(paths, **options) for original_path, processed_path, processed in collected: if isinstance(processed, Exception): print("Error with file", original_path) raise processed if processed_path.endswith(".js"): path = Path(settings.STATIC_ROOT) / processed_path initial = path.read_text() if "sourceMappingURL" not in initial: # Already minified. minified = jsmin(initial) path.write_text(minified) if processed_path.endswith(".css"): path = Path(settings.STATIC_ROOT) / processed_path initial = path.read_text() if "sourceMappingURL" not in initial: # Already minified. minified = cssmin(initial) path.write_text(minified) yield original_path, processed_path, True