proscenium 0.14.0-x86_64-linux → 0.15.0.beta.2-x86_64-linux
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +63 -54
- data/lib/proscenium/builder.rb +62 -19
- data/lib/proscenium/core_ext/object/css_module_ivars.rb +19 -0
- data/lib/proscenium/css_module/rewriter.rb +28 -0
- data/lib/proscenium/css_module.rb +16 -1
- data/lib/proscenium/ensure_loaded.rb +6 -6
- data/lib/proscenium/ext/proscenium +0 -0
- data/lib/proscenium/ext/proscenium.h +16 -1
- data/lib/proscenium/helper.rb +23 -70
- data/lib/proscenium/importer.rb +2 -6
- data/lib/proscenium/libs/react-manager/index.jsx +56 -36
- data/lib/proscenium/log_subscriber.rb +14 -2
- data/lib/proscenium/middleware/esbuild.rb +2 -2
- data/lib/proscenium/monkey.rb +67 -32
- data/lib/proscenium/phlex/asset_inclusions.rb +4 -83
- data/lib/proscenium/phlex.rb +9 -1
- data/lib/proscenium/railtie.rb +17 -16
- data/lib/proscenium/react_componentable.rb +3 -3
- data/lib/proscenium/side_load.rb +122 -6
- data/lib/proscenium/version.rb +1 -1
- data/lib/proscenium/view_component.rb +7 -1
- data/lib/proscenium.rb +10 -0
- metadata +19 -3
data/lib/proscenium/helper.rb
CHANGED
@@ -2,15 +2,23 @@
|
|
2
2
|
|
3
3
|
module Proscenium
|
4
4
|
module Helper
|
5
|
+
def sideload_assets(value)
|
6
|
+
if value.nil?
|
7
|
+
@current_template.instance_variable_defined?(:@sideload_assets_options) &&
|
8
|
+
@current_template.remove_instance_variable(:@sideload_assets_options)
|
9
|
+
else
|
10
|
+
@current_template.instance_variable_set :@sideload_assets_options, value
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
# Overriden to allow regular use of javascript_include_tag and stylesheet_link_tag, while still
|
15
|
+
# building with Proscenium. It's important to note that `include_assets` will not call this, as
|
16
|
+
# those asset paths all begin with a slash, which the Rails asset helpers do not pass through to
|
17
|
+
# here.
|
5
18
|
def compute_asset_path(path, options = {})
|
6
19
|
if %i[javascript stylesheet].include?(options[:type])
|
7
|
-
result =
|
8
|
-
|
9
|
-
if (qs = Proscenium.config.cache_query_string)
|
10
|
-
result << "?#{qs}"
|
11
|
-
end
|
12
|
-
|
13
|
-
return result
|
20
|
+
result = Proscenium::Builder.build_to_path(path, base_url: request.base_url)
|
21
|
+
return result.split('::').last.delete_prefix 'public'
|
14
22
|
end
|
15
23
|
|
16
24
|
super
|
@@ -40,78 +48,23 @@ module Proscenium
|
|
40
48
|
CssModule::Transformer.new(path).class_names(*names).map { |name, _| name }.join(' ')
|
41
49
|
end
|
42
50
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
51
|
+
def include_assets
|
52
|
+
include_stylesheets + include_javascripts
|
53
|
+
end
|
54
|
+
|
55
|
+
def include_stylesheets
|
56
|
+
'<!-- [PROSCENIUM_STYLESHEETS] -->'.html_safe
|
49
57
|
end
|
50
58
|
alias side_load_stylesheets include_stylesheets
|
51
59
|
deprecate side_load_stylesheets: 'Use `include_stylesheets` instead', deprecator: Deprecator.new
|
52
60
|
|
53
61
|
# Includes all javascripts that have been imported and side loaded.
|
54
62
|
#
|
55
|
-
# @param extract_lazy_scripts [Boolean] if true, any lazy scripts will be extracted using
|
56
|
-
# `content_for` to `:proscenium_lazy_scripts` for later use. Be sure to include this in your
|
57
|
-
# page with the `declare_lazy_scripts` helper, or simply
|
58
|
-
# `content_for :proscenium_lazy_scripts`.
|
59
63
|
# @return [String] the HTML tags for the javascripts.
|
60
|
-
def include_javascripts
|
61
|
-
|
62
|
-
|
63
|
-
if Rails.application.config.proscenium.code_splitting && Importer.multiple_js_imported?
|
64
|
-
imports = Importer.imported.dup
|
65
|
-
|
66
|
-
paths_to_build = []
|
67
|
-
Importer.each_javascript(delete: true) do |x, _|
|
68
|
-
paths_to_build << x.delete_prefix('/')
|
69
|
-
end
|
70
|
-
|
71
|
-
result = Builder.build(paths_to_build.join(';'), base_url: request.base_url)
|
72
|
-
|
73
|
-
# Remove the react components from the results, so they are not side loaded. Instead they
|
74
|
-
# are lazy loaded by the component manager.
|
75
|
-
|
76
|
-
scripts = {}
|
77
|
-
result.split(';').each do |x|
|
78
|
-
inpath, outpath = x.split('::')
|
79
|
-
inpath.prepend '/'
|
80
|
-
outpath.delete_prefix! 'public'
|
81
|
-
|
82
|
-
next unless imports.key?(inpath)
|
83
|
-
|
84
|
-
if (import = imports[inpath]).delete(:lazy)
|
85
|
-
scripts[inpath] = import.merge(outpath: outpath)
|
86
|
-
else
|
87
|
-
out << javascript_include_tag(outpath, extname: false, **options)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
if extract_lazy_scripts
|
92
|
-
content_for :proscenium_lazy_scripts do
|
93
|
-
tag.script type: 'application/json', id: 'prosceniumLazyScripts' do
|
94
|
-
raw scripts.to_json
|
95
|
-
end
|
96
|
-
end
|
97
|
-
else
|
98
|
-
out << tag.script(type: 'application/json', id: 'prosceniumLazyScripts') do
|
99
|
-
raw scripts.to_json
|
100
|
-
end
|
101
|
-
end
|
102
|
-
else
|
103
|
-
Importer.each_javascript(delete: true) do |path, _|
|
104
|
-
out << javascript_include_tag(path, extname: false, **options)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
out.join("\n").html_safe
|
64
|
+
def include_javascripts
|
65
|
+
'<!-- [PROSCENIUM_LAZY_SCRIPTS] --><!-- [PROSCENIUM_JAVASCRIPTS] -->'.html_safe
|
109
66
|
end
|
110
67
|
alias side_load_javascripts include_javascripts
|
111
68
|
deprecate side_load_javascripts: 'Use `include_javascripts` instead', deprecator: Deprecator.new
|
112
|
-
|
113
|
-
def declare_lazy_scripts
|
114
|
-
content_for :proscenium_lazy_scripts
|
115
|
-
end
|
116
69
|
end
|
117
70
|
end
|
data/lib/proscenium/importer.rb
CHANGED
@@ -72,8 +72,8 @@ module Proscenium
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
JS_EXTENSIONS.find(&import_if_exists)
|
76
|
-
CSS_EXTENSIONS.find(&import_if_exists)
|
75
|
+
JS_EXTENSIONS.find(&import_if_exists) unless options[:js] == false
|
76
|
+
CSS_EXTENSIONS.find(&import_if_exists) unless options[:css] == false
|
77
77
|
end
|
78
78
|
|
79
79
|
def each_stylesheet(delete: false)
|
@@ -109,10 +109,6 @@ module Proscenium
|
|
109
109
|
imported&.keys&.any? { |x| x.end_with?(*JS_EXTENSIONS) }
|
110
110
|
end
|
111
111
|
|
112
|
-
def multiple_js_imported?
|
113
|
-
imported&.keys&.many? { |x| x.end_with?(*JS_EXTENSIONS) }
|
114
|
-
end
|
115
|
-
|
116
112
|
def imported?(filepath = nil)
|
117
113
|
filepath ? imported&.key?(filepath) : !imported.blank?
|
118
114
|
end
|
@@ -1,18 +1,70 @@
|
|
1
1
|
window.Proscenium = window.Proscenium || { lazyScripts: {} };
|
2
|
+
const pathAttribute = "data-proscenium-component-path";
|
2
3
|
|
4
|
+
// Find lazyscripts JSON already in the DOM.
|
3
5
|
const element = document.querySelector("#prosceniumLazyScripts");
|
4
6
|
if (element) {
|
5
|
-
const scripts = JSON.parse(element.text);
|
6
7
|
window.Proscenium.lazyScripts = {
|
7
8
|
...window.Proscenium.lazyScripts,
|
8
|
-
...
|
9
|
+
...JSON.parse(element.text),
|
9
10
|
};
|
10
11
|
}
|
11
12
|
|
12
|
-
|
13
|
+
// Find components already in the DOM.
|
14
|
+
const elements = document.querySelectorAll(`[${pathAttribute}]`);
|
13
15
|
elements.length > 0 && init(elements);
|
14
16
|
|
15
|
-
|
17
|
+
new MutationObserver((mutationsList) => {
|
18
|
+
for (const { addedNodes } of mutationsList) {
|
19
|
+
for (const ele of addedNodes) {
|
20
|
+
if (ele.tagName === "SCRIPT" && ele.id === "prosceniumLazyScripts") {
|
21
|
+
window.Proscenium.lazyScripts = {
|
22
|
+
...window.Proscenium.lazyScripts,
|
23
|
+
...JSON.parse(ele.text),
|
24
|
+
};
|
25
|
+
} else if (ele.matches(`[${pathAttribute}]`)) {
|
26
|
+
init([ele]);
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}).observe(document, {
|
31
|
+
subtree: true,
|
32
|
+
childList: true,
|
33
|
+
});
|
34
|
+
|
35
|
+
function init(elements) {
|
36
|
+
Array.from(elements, (element) => {
|
37
|
+
const path = element.dataset.prosceniumComponentPath;
|
38
|
+
const isLazy = "prosceniumComponentLazy" in element.dataset;
|
39
|
+
const props = JSON.parse(element.dataset.prosceniumComponentProps);
|
40
|
+
|
41
|
+
if (proscenium.env.RAILS_ENV === "development") {
|
42
|
+
console.groupCollapsed(
|
43
|
+
`[proscenium/react/manager] ${isLazy ? "💤" : "⚡️"} %o`,
|
44
|
+
path
|
45
|
+
);
|
46
|
+
console.log("element: %o", element);
|
47
|
+
console.log("props: %o", props);
|
48
|
+
console.groupEnd();
|
49
|
+
}
|
50
|
+
|
51
|
+
if (isLazy) {
|
52
|
+
const observer = new IntersectionObserver((entries) => {
|
53
|
+
entries.forEach((entry) => {
|
54
|
+
if (entry.isIntersecting) {
|
55
|
+
observer.unobserve(element);
|
56
|
+
|
57
|
+
mount(element, path, props);
|
58
|
+
}
|
59
|
+
});
|
60
|
+
});
|
61
|
+
|
62
|
+
observer.observe(element);
|
63
|
+
} else {
|
64
|
+
mount(element, path, props);
|
65
|
+
}
|
66
|
+
});
|
67
|
+
|
16
68
|
/**
|
17
69
|
* Mounts component located at `path`, into the DOM `element`.
|
18
70
|
*
|
@@ -66,36 +118,4 @@ function init() {
|
|
66
118
|
console.error("[proscenium/react/manager] %o - %o", path, error);
|
67
119
|
});
|
68
120
|
}
|
69
|
-
|
70
|
-
Array.from(elements, (element) => {
|
71
|
-
const path = element.dataset.prosceniumComponentPath;
|
72
|
-
const isLazy = "prosceniumComponentLazy" in element.dataset;
|
73
|
-
const props = JSON.parse(element.dataset.prosceniumComponentProps);
|
74
|
-
|
75
|
-
if (proscenium.env.RAILS_ENV === "development") {
|
76
|
-
console.groupCollapsed(
|
77
|
-
`[proscenium/react/manager] ${isLazy ? "💤" : "⚡️"} %o`,
|
78
|
-
path
|
79
|
-
);
|
80
|
-
console.log("element: %o", element);
|
81
|
-
console.log("props: %o", props);
|
82
|
-
console.groupEnd();
|
83
|
-
}
|
84
|
-
|
85
|
-
if (isLazy) {
|
86
|
-
const observer = new IntersectionObserver((entries) => {
|
87
|
-
entries.forEach((entry) => {
|
88
|
-
if (entry.isIntersecting) {
|
89
|
-
observer.unobserve(element);
|
90
|
-
|
91
|
-
mount(element, path, props);
|
92
|
-
}
|
93
|
-
});
|
94
|
-
});
|
95
|
-
|
96
|
-
observer.observe(element);
|
97
|
-
} else {
|
98
|
-
mount(element, path, props);
|
99
|
-
}
|
100
|
-
});
|
101
121
|
}
|
@@ -10,12 +10,24 @@ module Proscenium
|
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
13
|
+
def build_to_path(event)
|
14
14
|
path = event.payload[:identifier]
|
15
|
+
cached = event.payload[:cached] ? ' | Cached!' : ''
|
15
16
|
path = CGI.unescape(path) if path.start_with?(/https?%3A%2F%2F/)
|
16
17
|
|
17
18
|
info do
|
18
|
-
message = +"[Proscenium] Building #{path}"
|
19
|
+
message = +" #{color('[Proscenium]', nil, bold: true)} Building (to path) #{path}"
|
20
|
+
message << " (Duration: #{event.duration.round(1)}ms | " \
|
21
|
+
"Allocations: #{event.allocations}#{cached})"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def build_to_string(event)
|
26
|
+
path = event.payload[:identifier]
|
27
|
+
path = CGI.unescape(path) if path.start_with?(/https?%3A%2F%2F/)
|
28
|
+
|
29
|
+
info do
|
30
|
+
message = +" #{color('[Proscenium]', nil, bold: true)} Building #{path}"
|
19
31
|
message << " (Duration: #{event.duration.round(1)}ms | Allocations: #{event.allocations})"
|
20
32
|
end
|
21
33
|
end
|
@@ -20,8 +20,8 @@ module Proscenium
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def attempt
|
23
|
-
render_response Builder.
|
24
|
-
|
23
|
+
render_response Builder.build_to_string(path_to_build, root: Rails.root.to_s,
|
24
|
+
base_url: @request.base_url)
|
25
25
|
rescue Builder::CompileError => e
|
26
26
|
raise self.class::CompileError, { file: @request.fullpath, detail: e.message }, caller
|
27
27
|
end
|
data/lib/proscenium/monkey.rb
CHANGED
@@ -3,42 +3,52 @@
|
|
3
3
|
module Proscenium
|
4
4
|
# rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
|
5
5
|
module Monkey
|
6
|
-
module DebugView
|
7
|
-
def initialize(assigns)
|
8
|
-
paths = [RESCUES_TEMPLATE_PATH, Rails.root.join('lib', 'templates').to_s]
|
9
|
-
lookup_context = ActionView::LookupContext.new(paths)
|
10
|
-
super(lookup_context, assigns, nil)
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
6
|
module TemplateRenderer
|
15
7
|
private
|
16
8
|
|
17
|
-
def render_template(view, template, layout_name, locals)
|
18
|
-
|
9
|
+
def render_template(view, template, layout_name, locals) # rubocop:disable Metrics/*
|
10
|
+
result = super
|
11
|
+
return result if !view.controller || !Proscenium.config.side_load
|
19
12
|
|
20
|
-
layout = find_layout(layout_name, locals.keys, [formats.first])
|
21
13
|
renderable = template.instance_variable_get(:@renderable)
|
22
14
|
|
23
|
-
if Object.const_defined?(:ViewComponent) &&
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
15
|
+
to_sideload = if Object.const_defined?(:ViewComponent) &&
|
16
|
+
template.is_a?(ActionView::Template::Renderable) &&
|
17
|
+
renderable.class < ::ViewComponent::Base &&
|
18
|
+
renderable.class.format == :html
|
19
|
+
renderable
|
20
|
+
elsif template.respond_to?(:virtual_path) &&
|
21
|
+
template.respond_to?(:type) && template.type == :html
|
22
|
+
template
|
23
|
+
end
|
24
|
+
if to_sideload
|
25
|
+
options = view.controller.sideload_assets_options
|
26
|
+
layout = find_layout(layout_name, locals.keys, [formats.first])
|
27
|
+
sideload_template_assets layout, view.controller, options if layout
|
28
|
+
sideload_template_assets to_sideload, view.controller, options
|
29
|
+
end
|
30
|
+
|
31
|
+
result
|
32
|
+
end
|
33
|
+
|
34
|
+
def sideload_template_assets(tpl, controller, options)
|
35
|
+
options = {} if options.nil?
|
36
|
+
options = { js: options, css: options } unless options.is_a?(Hash)
|
37
|
+
|
38
|
+
if tpl.instance_variable_defined?(:@sideload_assets_options)
|
39
|
+
tpl_options = tpl.instance_variable_get(:@sideload_assets_options)
|
40
|
+
options = case tpl_options
|
41
|
+
when Hash then options.deep_merge(tpl_options)
|
42
|
+
else
|
43
|
+
{ js: tpl_options, css: tpl_options }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
%i[css js].each do |k|
|
48
|
+
options[k] = controller.instance_eval(&options[k]) if options[k].is_a?(Proc)
|
39
49
|
end
|
40
50
|
|
41
|
-
|
51
|
+
Importer.sideload "app/views/#{tpl.virtual_path}", **options
|
42
52
|
end
|
43
53
|
end
|
44
54
|
|
@@ -46,13 +56,38 @@ module Proscenium
|
|
46
56
|
private
|
47
57
|
|
48
58
|
def render_partial_template(view, locals, template, layout, block)
|
49
|
-
|
59
|
+
result = super
|
60
|
+
|
61
|
+
return result if !view.controller || !Proscenium.config.side_load
|
62
|
+
|
63
|
+
if template.respond_to?(:virtual_path) &&
|
50
64
|
template.respond_to?(:type) && template.type == :html
|
51
|
-
|
52
|
-
|
65
|
+
options = view.controller.sideload_assets_options
|
66
|
+
sideload_template_assets layout, options if layout
|
67
|
+
sideload_template_assets template, options
|
68
|
+
end
|
69
|
+
|
70
|
+
result
|
71
|
+
end
|
72
|
+
|
73
|
+
def sideload_template_assets(tpl, options)
|
74
|
+
options = {} if options.nil?
|
75
|
+
options = { js: options, css: options } unless options.is_a?(Hash)
|
76
|
+
|
77
|
+
if tpl.instance_variable_defined?(:@sideload_assets_options)
|
78
|
+
tpl_options = tpl.instance_variable_get(:@sideload_assets_options)
|
79
|
+
options = if tpl_options.is_a?(Hash)
|
80
|
+
options.deep_merge tpl_options
|
81
|
+
else
|
82
|
+
{ js: tpl_options, css: tpl_options }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
%i[css js].each do |k|
|
87
|
+
options[k] = controller.instance_eval(&options[k]) if options[k].is_a?(Proc)
|
53
88
|
end
|
54
89
|
|
55
|
-
|
90
|
+
Importer.sideload "app/views/#{tpl.virtual_path}", **options
|
56
91
|
end
|
57
92
|
end
|
58
93
|
end
|
@@ -1,96 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Proscenium::Phlex::AssetInclusions
|
4
|
-
include Phlex::Rails::Helpers::ContentFor
|
5
|
-
include Phlex::Rails::Helpers::StyleSheetPath
|
6
|
-
include Phlex::Rails::Helpers::JavaScriptPath
|
7
|
-
|
8
4
|
def include_stylesheets
|
9
5
|
comment { '[PROSCENIUM_STYLESHEETS]' }
|
10
6
|
end
|
11
7
|
|
12
|
-
def include_javascripts
|
13
|
-
comment { '[PROSCENIUM_JAVASCRIPTS]' }
|
14
|
-
!defer_lazy_scripts && include_lazy_javascripts
|
15
|
-
end
|
16
|
-
|
17
|
-
def include_lazy_javascripts
|
8
|
+
def include_javascripts
|
18
9
|
comment { '[PROSCENIUM_LAZY_SCRIPTS]' }
|
10
|
+
comment { '[PROSCENIUM_JAVASCRIPTS]' }
|
19
11
|
end
|
20
12
|
|
21
|
-
def include_assets
|
13
|
+
def include_assets
|
22
14
|
include_stylesheets
|
23
|
-
include_javascripts
|
24
|
-
end
|
25
|
-
|
26
|
-
def after_template
|
27
|
-
super
|
28
|
-
|
29
|
-
@_buffer.gsub! '<!-- [PROSCENIUM_STYLESHEETS] -->', capture_stylesheets!
|
30
|
-
@_buffer.gsub! '<!-- [PROSCENIUM_JAVASCRIPTS] -->', capture_javascripts!
|
31
|
-
|
32
|
-
if content_for?(:proscenium_lazy_scripts)
|
33
|
-
flush
|
34
|
-
@_buffer.gsub!('<!-- [PROSCENIUM_LAZY_SCRIPTS] -->', capture do
|
35
|
-
content_for(:proscenium_lazy_scripts)
|
36
|
-
end)
|
37
|
-
else
|
38
|
-
@_buffer.gsub! '<!-- [PROSCENIUM_LAZY_SCRIPTS] -->', ''
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
def capture_stylesheets!
|
45
|
-
capture do
|
46
|
-
Proscenium::Importer.each_stylesheet(delete: true) do |path, _path_options|
|
47
|
-
link rel: 'stylesheet', href: stylesheet_path(path, extname: false)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def capture_javascripts! # rubocop:disable Metrics/*
|
53
|
-
unless Rails.application.config.proscenium.code_splitting &&
|
54
|
-
Proscenium::Importer.multiple_js_imported?
|
55
|
-
return capture do
|
56
|
-
Proscenium::Importer.each_javascript(delete: true) do |path, _|
|
57
|
-
script(src: javascript_path(path, extname: false), type: :module)
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
imports = Proscenium::Importer.imported.dup
|
63
|
-
paths_to_build = []
|
64
|
-
Proscenium::Importer.each_javascript(delete: true) do |x, _|
|
65
|
-
paths_to_build << x.delete_prefix('/')
|
66
|
-
end
|
67
|
-
|
68
|
-
result = Proscenium::Builder.build(paths_to_build.join(';'), base_url: helpers.request.base_url)
|
69
|
-
|
70
|
-
# Remove the react components from the results, so they are not side loaded. Instead they
|
71
|
-
# are lazy loaded by the component manager.
|
72
|
-
|
73
|
-
capture do
|
74
|
-
scripts = {}
|
75
|
-
result.split(';').each do |x|
|
76
|
-
inpath, outpath = x.split('::')
|
77
|
-
inpath.prepend '/'
|
78
|
-
outpath.delete_prefix! 'public'
|
79
|
-
|
80
|
-
next unless imports.key?(inpath)
|
81
|
-
|
82
|
-
if (import = imports[inpath]).delete(:lazy)
|
83
|
-
scripts[inpath] = import.merge(outpath: outpath)
|
84
|
-
else
|
85
|
-
script(src: javascript_path(outpath, extname: false), type: :module)
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
content_for :proscenium_lazy_scripts do
|
90
|
-
script type: 'application/json', id: 'prosceniumLazyScripts' do
|
91
|
-
unsafe_raw scripts.to_json
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
15
|
+
include_javascripts
|
95
16
|
end
|
96
17
|
end
|
data/lib/proscenium/phlex.rb
CHANGED
@@ -12,15 +12,19 @@ module Proscenium
|
|
12
12
|
|
13
13
|
include Proscenium::SourcePath
|
14
14
|
include CssModules
|
15
|
+
include AssetInclusions
|
15
16
|
|
16
17
|
module Sideload
|
17
18
|
def before_template
|
18
|
-
Proscenium::SideLoad.sideload_inheritance_chain self
|
19
|
+
Proscenium::SideLoad.sideload_inheritance_chain self,
|
20
|
+
helpers.controller.sideload_assets_options
|
19
21
|
|
20
22
|
super
|
21
23
|
end
|
22
24
|
end
|
23
25
|
|
26
|
+
class_attribute :sideload_assets_options
|
27
|
+
|
24
28
|
class << self
|
25
29
|
attr_accessor :abstract_class
|
26
30
|
|
@@ -29,6 +33,10 @@ module Proscenium
|
|
29
33
|
|
30
34
|
super
|
31
35
|
end
|
36
|
+
|
37
|
+
def sideload_assets(value)
|
38
|
+
self.sideload_assets_options = value
|
39
|
+
end
|
32
40
|
end
|
33
41
|
end
|
34
42
|
end
|
data/lib/proscenium/railtie.rb
CHANGED
@@ -6,12 +6,6 @@ require 'proscenium/log_subscriber'
|
|
6
6
|
ENV['RAILS_ENV'] = Rails.env
|
7
7
|
|
8
8
|
module Proscenium
|
9
|
-
class << self
|
10
|
-
def config
|
11
|
-
@config ||= Railtie.config.proscenium
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
9
|
class Railtie < ::Rails::Engine
|
16
10
|
isolate_namespace Proscenium
|
17
11
|
|
@@ -20,6 +14,10 @@ module Proscenium
|
|
20
14
|
config.proscenium.side_load = true
|
21
15
|
config.proscenium.code_splitting = true
|
22
16
|
|
17
|
+
# Cache asset paths when building to path. Enabled by default in production.
|
18
|
+
# @see Proscenium::Builder#build_to_path
|
19
|
+
config.proscenium.cache = ActiveSupport::Cache::MemoryStore.new if Rails.env.production?
|
20
|
+
|
23
21
|
# TODO: implement!
|
24
22
|
config.proscenium.cache_query_string = Rails.env.production? && ENV.fetch('REVISION', nil)
|
25
23
|
config.proscenium.cache_max_age = 2_592_000 # 30 days
|
@@ -45,6 +43,12 @@ module Proscenium
|
|
45
43
|
'Proscenium::Builder::BuildError' => 'build_error'
|
46
44
|
}
|
47
45
|
|
46
|
+
config.after_initialize do |_app|
|
47
|
+
ActiveSupport.on_load(:action_view) do
|
48
|
+
include Proscenium::Helper
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
48
52
|
initializer 'proscenium.debugging' do
|
49
53
|
if Rails.gem_version >= Gem::Version.new('7.1.0')
|
50
54
|
tpl_path = root.join('lib', 'proscenium', 'templates').to_s
|
@@ -58,20 +62,17 @@ module Proscenium
|
|
58
62
|
app.middleware.insert_after ActionDispatch::Static, Rack::ConditionalGet
|
59
63
|
end
|
60
64
|
|
61
|
-
initializer 'proscenium.
|
62
|
-
ActiveSupport.on_load(:
|
63
|
-
|
64
|
-
|
65
|
+
initializer 'proscenium.sideloading' do
|
66
|
+
ActiveSupport.on_load(:action_controller) do
|
67
|
+
ActionController::Base.include EnsureLoaded
|
68
|
+
ActionController::Base.include SideLoad::Controller
|
65
69
|
end
|
66
70
|
end
|
67
71
|
|
68
|
-
initializer 'proscenium.
|
72
|
+
initializer 'proscenium.monkey_patches' do
|
69
73
|
ActiveSupport.on_load(:action_view) do
|
70
|
-
ActionView::
|
71
|
-
|
72
|
-
|
73
|
-
ActiveSupport.on_load(:action_controller) do
|
74
|
-
ActionController::Base.include EnsureLoaded
|
74
|
+
ActionView::TemplateRenderer.prepend Monkey::TemplateRenderer
|
75
|
+
ActionView::PartialRenderer.prepend Monkey::PartialRenderer
|
75
76
|
end
|
76
77
|
end
|
77
78
|
end
|
@@ -44,9 +44,9 @@ module Proscenium
|
|
44
44
|
end
|
45
45
|
|
46
46
|
class_methods do
|
47
|
-
def sideload
|
48
|
-
Importer.import manager
|
49
|
-
Importer.sideload source_path, lazy: true
|
47
|
+
def sideload(options)
|
48
|
+
Importer.import manager, **options, js: { type: 'module' }
|
49
|
+
Importer.sideload source_path, lazy: true, **options
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|