proscenium 0.11.0-x86_64-linux → 0.12.0-x86_64-linux

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c6d0b7bc727c5204adc7752cea2888dab566c2831b547069101706c0385969c1
4
- data.tar.gz: dd6c21954e8ab827c65e215db2dfc6d095672b28442db5b0ff54296cddd1d421
3
+ metadata.gz: 8b1f55f355634fb97a5426b2c4c7cac21138cd0d92d3644d767f7865746fc1c6
4
+ data.tar.gz: a8ff6d75ba6e92654b1cd0f6d71e59bc976cb0194ae79c787e409defe78184cb
5
5
  SHA512:
6
- metadata.gz: 127ef4f1d15c73aca068cd303c3a59685f9ed762e9e56bc2624800fa8cfac890ee2d7ab9b3420029eb3f15049e02ad015954f06cf5c5bb72343461a438e14fb1
7
- data.tar.gz: 6e9875c9cbe9b26310fd2373b875c9c87c36b12c06790f6b7a150b84b6ea74c2d5e2e401b643e2447b5a2f8092704543e6861470f608768b8fcc2af670f8c23d
6
+ metadata.gz: 65cd3db84bd43ec4cf43437fbee1de74bb58f58a8b945a38aa23008bc5b8abfaca26b6763dbd51930f43903ab53077b17e9f575944de3e472d98b16e1604c13b
7
+ data.tar.gz: 1b24eaadcb999f60851b4c53c7285b067b63764b8cc62f5fcc9f98a8f930c4adc9f628f4763f0dbefcc08abefa078bac08dc84fc088bb88c576a2bc60ca1e6cf
data/README.md CHANGED
@@ -46,7 +46,8 @@ Proscenium treats your client-side code as first class citizens of your Rails ap
46
46
  - [ViewComponent Support](#viewcomponent-support)
47
47
  - [Cache Busting](#cache-busting)
48
48
  - [rjs is back!](#rjs-is-back)
49
- - [Included Paths](#included-paths)
49
+ - [Resolution](#resolution)
50
+ - [Assets from Rails Engines](#assets-from-rails-engines)
50
51
  - [Thanks](#thanks)
51
52
  - [Development](#development)
52
53
 
@@ -237,6 +238,32 @@ body {
237
238
  }
238
239
  ```
239
240
 
241
+ ### Unbundling
242
+
243
+ Sometimes you don't want to bundle an import. For example, you want to ensure that only one instance of React is loaded. In this cases, you can use the `unbundle` prefix
244
+
245
+ ```js
246
+ import React from 'unbundle:react'
247
+ ```
248
+
249
+ This only works any bare and local imports.
250
+
251
+ You can also use the `unbundle` prefix in your import map, which ensures that all imports of a particular path is always unbundled:
252
+
253
+ ```json
254
+ {
255
+ "imports": {
256
+ "react": "unbundle:react"
257
+ }
258
+ }
259
+ ```
260
+
261
+ Then just import as normal:
262
+
263
+ ```js
264
+ import React from 'react'
265
+ ```
266
+
240
267
  ## Import Maps
241
268
 
242
269
  > **[WIP]**
@@ -644,6 +671,27 @@ class MyView < Proscenium::Phlex
644
671
  end
645
672
  ```
646
673
 
674
+ In your layouts, include `Proscenium::Phlex::AssetInclusions`, and call the `include_assets` helper.
675
+
676
+ ```ruby
677
+ class ApplicationLayout < Proscenium::Phlex
678
+ include Proscenium::Phlex::AssetInclusions
679
+
680
+ def template(&)
681
+ doctype
682
+ html do
683
+ head do
684
+ title { 'My Awesome App' }
685
+ include_assets
686
+ end
687
+ body(&)
688
+ end
689
+ end
690
+ end
691
+ ```
692
+
693
+ You can specifically include CCS and JS assets using the `include_stylesheets` and `include_javascripts` helpers, allowing you to control where they are included in the HTML.
694
+
647
695
  ### Side-loading
648
696
 
649
697
  Any Phlex class that inherits `Proscenium::Phlex` will automatically be [side-loaded](#side-loading).
@@ -18,10 +18,18 @@ module Proscenium::CssModule
18
18
  # Accepts one or more CSS class names, and transforms them into CSS module names.
19
19
  #
20
20
  # @param name [String,Symbol,Array<String,Symbol>]
21
+ # @return [String] the transformed CSS module names concatenated as a string.
21
22
  def css_module(*names)
22
23
  cssm.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
23
24
  end
24
25
 
26
+ # @param name [String,Symbol,Array<String,Symbol>]
27
+ # @return [String] the transformed CSS module names concatenated as a string.
28
+ def class_names(*names)
29
+ names = names.flatten.compact
30
+ cssm.class_names(*names).map { |name, _| name }.join(' ') unless names.empty?
31
+ end
32
+
25
33
  private
26
34
 
27
35
  def cssm
Binary file
@@ -79,14 +79,25 @@ module Proscenium
79
79
  def each_stylesheet(delete: false)
80
80
  return if imported.blank?
81
81
 
82
- blk = proc { |key, options| key.end_with?(*CSS_EXTENSIONS) && yield(key, options) }
82
+ blk = proc do |key, options|
83
+ if key.end_with?(*CSS_EXTENSIONS)
84
+ yield(key, options)
85
+ true
86
+ end
87
+ end
88
+
83
89
  delete ? imported.delete_if(&blk) : imported.each(&blk)
84
90
  end
85
91
 
86
92
  def each_javascript(delete: false)
87
93
  return if imported.blank?
88
94
 
89
- blk = proc { |key, options| key.end_with?(*JS_EXTENSIONS) && yield(key, options) }
95
+ blk = proc do |key, options|
96
+ if key.end_with?(*JS_EXTENSIONS)
97
+ yield(key, options)
98
+ true
99
+ end
100
+ end
90
101
  delete ? imported.delete_if(&blk) : imported.each(&blk)
91
102
  end
92
103
 
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
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
+ def include_stylesheets
9
+ comment { '[PROSCENIUM_STYLESHEETS]' }
10
+ end
11
+
12
+ def include_javascripts(defer_lazy_scripts: false)
13
+ comment { '[PROSCENIUM_JAVASCRIPTS]' }
14
+ !defer_lazy_scripts && include_lazy_javascripts
15
+ end
16
+
17
+ def include_lazy_javascripts
18
+ comment { '[PROSCENIUM_LAZY_SCRIPTS]' }
19
+ end
20
+
21
+ def include_assets(defer_lazy_scripts: false)
22
+ include_stylesheets
23
+ include_javascripts(defer_lazy_scripts: defer_lazy_scripts)
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
95
+ end
96
+ end
@@ -8,19 +8,11 @@ module Proscenium
8
8
 
9
9
  autoload :CssModules
10
10
  autoload :ReactComponent
11
+ autoload :AssetInclusions
11
12
 
12
- extend ::Phlex::Rails::HelperMacros
13
- include ::Phlex::Rails::Helpers::JavaScriptIncludeTag
14
- include ::Phlex::Rails::Helpers::StyleSheetLinkTag
15
13
  include Proscenium::SourcePath
16
14
  include CssModules
17
15
 
18
- define_output_helper :side_load_stylesheets # deprecated
19
- define_output_helper :include_stylesheets
20
- define_output_helper :side_load_javascripts # deprecated
21
- define_output_helper :include_javascripts
22
- define_output_helper :declare_lazy_scripts
23
-
24
16
  module Sideload
25
17
  def before_template
26
18
  Proscenium::SideLoad.sideload_inheritance_chain self
@@ -54,8 +54,8 @@ module Proscenium
54
54
 
55
55
  initializer 'proscenium.middleware' do |app|
56
56
  app.middleware.insert_after ActionDispatch::Static, Middleware
57
- # app.middleware.insert_after ActionDispatch::Static, Rack::ETag, 'no-cache'
58
- # app.middleware.insert_after ActionDispatch::Static, Rack::ConditionalGet
57
+ app.middleware.insert_after ActionDispatch::Static, Rack::ETag, 'no-cache'
58
+ app.middleware.insert_after ActionDispatch::Static, Rack::ConditionalGet
59
59
  end
60
60
 
61
61
  initializer 'proscenium.monkey_patches' do
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Proscenium
4
- VERSION = '0.11.0'
4
+ VERSION = '0.12.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proscenium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  platform: x86_64-linux
6
6
  authors:
7
7
  - Joel Moss
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-10-17 00:00:00.000000000 Z
11
+ date: 2023-11-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -111,6 +111,7 @@ files:
111
111
  - lib/proscenium/middleware/url.rb
112
112
  - lib/proscenium/monkey.rb
113
113
  - lib/proscenium/phlex.rb
114
+ - lib/proscenium/phlex/asset_inclusions.rb
114
115
  - lib/proscenium/phlex/css_modules.rb
115
116
  - lib/proscenium/phlex/react_component.rb
116
117
  - lib/proscenium/railtie.rb
@@ -148,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
148
149
  - !ruby/object:Gem::Version
149
150
  version: '0'
150
151
  requirements: []
151
- rubygems_version: 3.4.20
152
+ rubygems_version: 3.4.21
152
153
  signing_key:
153
154
  specification_version: 4
154
155
  summary: The engine powering your Rails frontend