#32319: Add support to HashedFilesMixin for ES modules
-------------------------------------+-------------------------------------
     Reporter:  gilmrjc              |                    Owner:  blighj
         Type:  New feature          |                   Status:  closed
    Component:  contrib.staticfiles  |                  Version:  dev
     Severity:  Normal               |               Resolution:  fixed
     Keywords:                       |             Triage Stage:  Ready for
                                     |  checkin
    Has patch:  1                    |      Needs documentation:  0
  Needs tests:  0                    |  Patch needs improvement:  0
Easy pickings:  0                    |                    UI/UX:  0
-------------------------------------+-------------------------------------
Comment (by Michael):

 Replying to [comment:16 blighj]:
 > I think it is possible to do this with a regex and still work with the
 kinds of statements found in higlight.js from #33253. You can tighten up
 what is matched by being more specfic on the url it matches, based on the
 specs of what a browser will support for a module specifier.
 > https://v8.dev/features/modules#specifiers
 > >{{{
 > >// Supported:
 > >import {shout} from './lib.mjs';
 > >import {shout} from '../lib.mjs';
 > >import {shout} from '/modules/lib.mjs';
 > >import {shout} from 'https://simple.example/modules/lib.mjs';
 > >}}}
 > >For now, module specifiers must be full URLs, or relative URLs starting
 with /, ./, or ../.
 >
 > The collectstatic command should not be changing absolute URLs, only
 relative ones, so we can and an extra requirement to the (?P<url>) matcher
 so it must start with a dot or forward slash (?P<url>**[\.\/]**.*?)
 > This limits what the regex matches, so that the code types in
 highlight.js, and some other issues I've seen in videojs and ace, are no
 longer matched.
 > But it doesn't have to worry about all possible values of the
 import/export part of the expression, which would be very hard to do with
 regex.
 >
 > Here is what I'm using in my project for the js patterns
 > {{{
 >         (
 >             "*.js",
 >             (
 >                 (
 >
 
r"""(?P<matched>import(?P<import>[\s\{].*?)\s*from\s*['"](?P<url>[\.\/].*?)["']\s*;)""",
 >                     """import%(import)s from "%(url)s";""",
 >                 ),
 >                 (
 >
 
r"""(?P<matched>export(?P<exports>[\s\{].*?)\s*from\s*["'](?P<url>[\.\/].*?)["']\s*;)""",
 >                     """export%(exports)s from "%(url)s";""",
 >                 ),
 >                 (
 >
 r"""(?P<matched>import\s*['"](?P<url>[\.\/].*?)["']\s*;)""",
 >                     """import"%(url)s";""",
 >                 ),
 >             ),
 >         ),
 > }}}
 >
 > I'm enforcing the need for a semicolon for extra safety, and I've added
 support for
 > {{{
 > import{shout}from './lib.mjs';
 > }}}
 > which was needed for some js coming out of esbuild.
 >
 > I don't know if {{{//}}} is supported by browsers for module specifiers,
 if it is then you'd have to update the regex to not capture those, I
 haven't needed it for my own projects yet, so I'm keeping my regex simpler
 for now.

 Enforcing the `;` for "safety" actually breaks import assertions, e.g.:

 {{{
 import l from"/static/skin/skin/x-triangle.min.css"assert{type:"css"};
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/32319#comment:24>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018ed82349bb-ed9b1a32-cd92-4412-aae2-1fc50d02153f-000000%40eu-central-1.amazonses.com.

Reply via email to