def render(self, context): """ Build the filepath by appending the extension. """ module_path = self.path.resolve(context) if not settings.SYSTEMJS_ENABLED: if settings.SYSTEMJS_DEFAULT_JS_EXTENSIONS: name, ext = posixpath.splitext(module_path) if not ext: module_path = '{}.js'.format(module_path) if settings.SYSTEMJS_SERVER_URL: tpl = """<script src="{url}{app}" type="text/javascript"></script>""" else: tpl = """<script type="text/javascript">System.import('{app}');</script>""" return tpl.format(app=module_path, url=settings.SYSTEMJS_SERVER_URL) # else: create a bundle rel_path = System.get_bundle_path(module_path) url = staticfiles_storage.url(rel_path) tag_attrs = {'type': 'text/javascript'} for key, value in self.tag_attrs.items(): if not isinstance(value, bool): value = value.resolve(context) tag_attrs[key] = value return """<script{attrs} src="{url}"></script>""".format( url=url, attrs=flatatt(tag_attrs) )
def render(self, context): """ Build the filepath by appending the extension. """ module_path = self.path.resolve(context) if not settings.SYSTEMJS_ENABLED: if settings.SYSTEMJS_DEFAULT_JS_EXTENSIONS: name, ext = posixpath.splitext(module_path) if not ext: module_path = '{}.js'.format(module_path) tpl = """<script type="text/javascript">System.import('{app}');</script>""" return tpl.format(app=module_path) # else: create a bundle rel_path = System.get_bundle_path(module_path) url = staticfiles_storage.url(rel_path) tag_attrs = {'type': 'text/javascript'} for key, value in self.tag_attrs.items(): if not isinstance(value, bool): value = value.resolve(context) tag_attrs[key] = value return """<script{attrs} src="{url}"></script>""".format( url=url, attrs=flatatt(tag_attrs))
def handle(self, **options): super(Command, self).handle(**options) self.post_process = options['post_process'] self.minimal = options.get('minimal') self.verbosity = 2 self.storage = copy(staticfiles_storage) self.storage.systemjs_bundling = True # set flag to check later # initialize SystemJS specific objects to process the bundles tracer = SystemTracer(node_path=options.get('node_path')) system_opts = self.get_system_opts(options) system = System(**system_opts) has_different_options = self.minimal and tracer.get_bundle_options() != system_opts # discover the apps being imported in the templates all_apps = self.find_apps(templates=options.get('templates')) all_apps = set(sum(all_apps.values(), [])) bundled_files = OrderedDict() # FIXME: this should be configurable, if people use S3BotoStorage for example, it needs to end up there storage = FileSystemStorage(settings.STATIC_ROOT, base_url=settings.STATIC_URL) for app in all_apps: # do we need to generate the bundle for this app? if self.minimal and not (has_different_options or tracer.check_needs_update(app)): # check if the bundle actually exists - if it doesn't, don't skip it # this happens on the first ever bundle bundle_path = System.get_bundle_path(app) if self.storage.exists(bundle_path): self.stdout.write('Checked bundle for app \'{app}\', no changes found'.format(app=app)) continue rel_path = system.bundle(app) if not self.storage.exists(rel_path): self.stderr.write('Could not bundle {app}'.format(app=app)) else: self.stdout.write('Bundled {app} into {out}'.format(app=app, out=rel_path)) bundled_files[rel_path] = (storage, rel_path) if self.minimal and bundled_files: self.stdout.write('Generating the new depcache and writing to file...') all_deps = {app: tracer.trace(app) for app in all_apps} tracer.write_depcache(all_deps, system_opts) if self.post_process and hasattr(self.storage, 'post_process'): # post-process system.js if it's within settings.STATIC_ROOT systemjs_path = find_systemjs_location() try: within_static_root = self.storage.exists(systemjs_path) except SuspiciousFileOperation: within_static_root = False if within_static_root: relative = os.path.relpath(systemjs_path, settings.STATIC_ROOT) bundled_files[relative] = (storage, relative) processor = self.storage.post_process(bundled_files, dry_run=False) for original_path, processed_path, processed in processor: if isinstance(processed, Exception): # pragma: no cover self.stderr.write("Post-processing '%s' failed!" % original_path) # Add a blank line before the traceback, otherwise it's # too easy to miss the relevant part of the error message. self.stderr.write("") raise processed if processed: # pragma: no cover self.log("Post-processed '%s' as '%s'" % (original_path, processed_path), level=1) else: self.log("Skipped post-processing '%s'" % original_path) # pragma: no cover