﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
34497	ManifestStaticFilesStorage skips import and export of javascript modules with absolute paths	Hielke Walinga	Hielke Walinga	"The recently added support for finding the ES modules does not work for absolute paths. As this is skipped. 

It is not uncommon to import from the absolute path. 

{{{
import function from ""/appname/file.js""
}}}

The current implementation just skips this. 

A change in the code can be made to find these correctly.

Current:
{{{
            # Ignore absolute/protocol-relative and data-uri URLs.
            if re.match(r""^[a-z]+:"", url):
                return matched

            # Ignore absolute URLs that don't point to a static file (dynamic
            # CSS / JS?). Note that STATIC_URL cannot be empty.
            if url.startswith(""/"") and not url.startswith(settings.STATIC_URL):
                return matched

            # Strip off the fragment so a path-like fragment won't interfere.
            url_path, fragment = urldefrag(url)

            # Ignore URLs without a path
            if not url_path:
                return matched

            if url_path.startswith(""/""):
                # Otherwise the condition above would have returned prematurely.
                assert url_path.startswith(settings.STATIC_URL)
                target_name = url_path[len(settings.STATIC_URL) :]
            else:
                # We're using the posixpath module to mix paths and URLs conveniently.
                source_name = name if os.sep == ""/"" else name.replace(os.sep, ""/"")
                target_name = posixpath.join(posixpath.dirname(source_name), url_path)

            # Determine the hashed name of the target file with the storage backend.
            hashed_url = self._url(
                self._stored_name,
                unquote(target_name),
                force=True,
                hashed_files=hashed_files,
            )

            transformed_url = ""/"".join(
                url_path.split(""/"")[:-1] + hashed_url.split(""/"")[-1:]
            )
}}}

Proposed change:
{{{
            # Ignore absolute/protocol-relative and data-uri URLs.
            if re.match(r""^[a-z]+:"", url):
                return matched

            # Strip off the fragment so a path-like fragment won't interfere.
            url_path, fragment = urldefrag(url)

            # Ignore URLs without a path
            if not url_path:
                return matched

            if url_path.startswith('/'):
                if url_path.startswith(settings.STATIC_URL):
                    target_name = url_path[len(settings.STATIC_URL):]
                else:
                    target_name = url_path[1:]
            else:
                # We're using the posixpath module to mix paths and URLs conveniently.
                source_name = name if os.sep == '/' else name.replace(os.sep, '/')
                target_name = posixpath.join(posixpath.dirname(source_name), url_path)

            try:
                # Determine the hashed name of the target file with the storage backend.
                hashed_url = self._url(
                    self._stored_name, unquote(target_name),
                    force=True, hashed_files=hashed_files,
                )
            except ValueError:
                # Ignore absolute URLs that don't point to a static file (dynamic
                # CSS / JS?). Note that STATIC_URL cannot be empty.
                if url.startswith(""/"") and not url.startswith(settings.STATIC_URL):
                    return matched
                else:
                    raise

            transformed_url = ""/"".join(
                url_path.split(""/"")[:-1] + hashed_url.split(""/"")[-1:]
            )
}}}

== PR

I could make a PR if this seems good. Thank you. "	Bug	closed	contrib.staticfiles	4.2	Normal	invalid	ManifestStaticFilesStorage ES modules	blighj	Accepted	1	0	1	0	0	0
