proscenium 0.11.0-x86_64-linux → 0.13.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: 8b06b3f27b0e88ebb7099a1808384cddb0571d3076ad837639da2a35961c1d54
4
+ data.tar.gz: 70f56abacaed489a8811632e80cd7e8c35a79299f3a2a92b7f2a37bf317f46dd
5
5
  SHA512:
6
- metadata.gz: 127ef4f1d15c73aca068cd303c3a59685f9ed762e9e56bc2624800fa8cfac890ee2d7ab9b3420029eb3f15049e02ad015954f06cf5c5bb72343461a438e14fb1
7
- data.tar.gz: 6e9875c9cbe9b26310fd2373b875c9c87c36b12c06790f6b7a150b84b6ea74c2d5e2e401b643e2447b5a2f8092704543e6861470f608768b8fcc2af670f8c23d
6
+ metadata.gz: 8f6752edbf44f243a3b81f852f5d825ea206140fbf2b2d595834ed9af7b8780284370cd4ab643f44f4ed030996a9d0a3afc2ebe71affc70557f3b6e156531f17
7
+ data.tar.gz: 46751b69cdbfc67faf5964f360e8b66a1fbb34958368a1fbb48bdc67c93a63b177c8c5daedd86f39101dd2e2f269a878277b3b8a979f1b8e121efe0c5bac9af3
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]**
@@ -525,6 +552,13 @@ css_module 'mypackage/button@big_button'
525
552
  # => "big_button"
526
553
  ```
527
554
 
555
+ `css_module` also accepts a `path` keyword argument, which allows you to specify the path to the CSS
556
+ file. Note that this will use the given path for all class names passed to that instance of `css_module`.
557
+
558
+ ```ruby
559
+ css_module :my_module_name, path: Rails.root.join('app/components/button.css')
560
+ ```
561
+
528
562
  #### In your JavaScript
529
563
 
530
564
  Importing a CSS module from JS will automatically append the stylesheet to the document's head. And the result of the import will be an object of CSS class to module names.
@@ -644,6 +678,27 @@ class MyView < Proscenium::Phlex
644
678
  end
645
679
  ```
646
680
 
681
+ In your layouts, include `Proscenium::Phlex::AssetInclusions`, and call the `include_assets` helper.
682
+
683
+ ```ruby
684
+ class ApplicationLayout < Proscenium::Phlex
685
+ include Proscenium::Phlex::AssetInclusions
686
+
687
+ def template(&)
688
+ doctype
689
+ html do
690
+ head do
691
+ title { 'My Awesome App' }
692
+ include_assets
693
+ end
694
+ body(&)
695
+ end
696
+ end
697
+ end
698
+ ```
699
+
700
+ 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.
701
+
647
702
  ### Side-loading
648
703
 
649
704
  Any Phlex class that inherits `Proscenium::Phlex` will automatically be [side-loaded](#side-loading).
@@ -18,8 +18,20 @@ 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
- def css_module(*names)
22
- cssm.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
21
+ # @param path [Pathname] the path to the CSS module file to use for the transformation.
22
+ # @return [String] the transformed CSS module names concatenated as a string.
23
+ def css_module(*names, path: nil)
24
+ transformer = path.nil? ? cssm : Transformer.new(path)
25
+ transformer.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
26
+ end
27
+
28
+ # @param name [String,Symbol,Array<String,Symbol>]
29
+ # @param path [Pathname] the path to the CSS file to use for the transformation.
30
+ # @return [String] the transformed CSS module names concatenated as a string.
31
+ def class_names(*names, path: nil)
32
+ names = names.flatten.compact
33
+ transformer = path.nil? ? cssm : Transformer.new(path)
34
+ transformer.class_names(*names).map { |name, _| name }.join(' ') unless names.empty?
23
35
  end
24
36
 
25
37
  private
Binary file
@@ -20,11 +20,24 @@ module Proscenium
20
20
  #
21
21
  # @see CssModule::Transformer#class_names
22
22
  # @param name [String,Symbol,Array<String,Symbol>]
23
- def css_module(*names)
24
- path = Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
25
- CssModule::Transformer.new(path).class_names(*names, require_prefix: false).map do |name, _|
26
- name
27
- end.join(' ')
23
+ # @param path [Pathname] the path to the CSS module file to use for the transformation.
24
+ # @return [String] the transformed CSS module names concatenated as a string.
25
+ def css_module(*names, path: nil)
26
+ path ||= Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
27
+ CssModule::Transformer.new(path).class_names(*names, require_prefix: false)
28
+ .map { |name, _| name }.join(' ')
29
+ end
30
+
31
+ # @param name [String,Symbol,Array<String,Symbol>]
32
+ # @param path [Pathname] the path to the CSS file to use for the transformation.
33
+ # @return [String] the transformed CSS module names concatenated as a string.
34
+ def class_names(*names, path: nil)
35
+ names = names.flatten.compact
36
+
37
+ return if names.empty?
38
+
39
+ path ||= Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
40
+ CssModule::Transformer.new(path).class_names(*names).map { |name, _| name }.join(' ')
28
41
  end
29
42
 
30
43
  def include_stylesheets(**options)
@@ -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.13.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.13.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-17 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.22
152
153
  signing_key:
153
154
  specification_version: 4
154
155
  summary: The engine powering your Rails frontend