proscenium 0.11.0-x86_64-darwin → 0.12.0-x86_64-darwin

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b812b42986598d6a15007e1e13d2adcb9d2cf0a1a0d21f6dcc31f55f09ca5442
4
- data.tar.gz: 8ba3f9efcdb2755711ac5e4a25fccb75c154ad20438cf81d9c958d64ede7e0b2
3
+ metadata.gz: 76d85fd732a66d80f8104ef66fbf03a77e81b9e68e45ccad767d0b8d3f814c3f
4
+ data.tar.gz: a47fd7886d8dd72b2efa104e77419ab20dec6a5c218efbca80bb5dfed42cc5d2
5
5
  SHA512:
6
- metadata.gz: 88fdbe402f861dba96f04e71a4fcf20cffd2ba2577f44596ee2957119f0861addb949d01e572c86ef8c46c4459d113e1e295b8e43cc53d0097b52f34c2731be0
7
- data.tar.gz: 9df8ac121aba7bcb468c9ec1a51c27bb20d17d844e7c1af8cf263485f378aae29bec94a11ec169d580e4f641c623f2339b808bf6273bbdfe03b5a747636b29d9
6
+ metadata.gz: cdf1abe3a0fee2178852ae24b685fb5c92db0c269460884f92d0c40ae634c2fdc4e1a8b7f412d86f8fc2bf660709a2f8776e21c7d97c52335deea7a001a41797
7
+ data.tar.gz: 54520808bdc76b4e3efa6e696e7eefcdbfae9610564820adbdeef781972bf6b37dc4181642d3e696a781c22f114c046582b1a95389f3bfc391dc1f8a3c11b551
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-darwin
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