Class: Proscenium::SideLoad

Inherits:
Object show all
Defined in:
lib/proscenium/side_load.rb

Defined Under Namespace

Modules: Controller

Constant Summary collapse

JS_COMMENT =
'<!-- [PROSCENIUM_JAVASCRIPTS] -->'
CSS_COMMENT =
'<!-- [PROSCENIUM_STYLESHEETS] -->'

Class Method Summary collapse

Class Method Details

.sideload_inheritance_chain(obj, options) ⇒ Object

Side loads the class, and its super classes that respond to ‘.source_path`.

Set the ‘abstract_class` class variable to true in any class, and it will not be side loaded.

If the class responds to ‘.sideload`, it will be called instead of the regular side loading. You can use this to customise what is side loaded.



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# File 'lib/proscenium/side_load.rb', line 96

def sideload_inheritance_chain(obj, options)
  return unless Proscenium.config.side_load

  options = {} if options.nil?
  options = { js: options, css: options } unless options.is_a?(Hash)

  unless obj.sideload_assets_options.nil?
    tpl_options = obj.sideload_assets_options
    options = if tpl_options.is_a?(Hash)
                options.deep_merge tpl_options
              else
                { js: tpl_options, css: tpl_options }
              end
  end

  %i[css js].each do |k|
    options[k] = obj.instance_eval(&options[k]) if options[k].is_a?(Proc)
  end

  css_imports = []

  klass = obj.class
  while klass.respond_to?(:source_path) && klass.source_path && !klass.abstract_class
    if klass.respond_to?(:sideload)
      klass.sideload options
    elsif options[:css] == false
      Importer.sideload klass.source_path, **options
    else
      Importer.sideload_js klass.source_path, **options
      css_imports << klass.source_path
    end

    klass = klass.superclass
  end

  # The reason why we sideload CSS after JS is because the order of CSS is important.
  # Basically, the layout should be loaded before the view so that CSS cascading works in the
  # right direction.
  css_imports.reverse_each do |it|
    Importer.sideload_css it, **options
  end
end