proscenium 0.11.0.pre.13-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: a2d83ea21d1d8f0802797dfc2f8df120a8d5dd224fc0586a86583ebe6a4003b0
4
- data.tar.gz: 41a2048f4001060b52e6b58286bae9cc190e8a23750505722088b7ebcee90d01
3
+ metadata.gz: 8b1f55f355634fb97a5426b2c4c7cac21138cd0d92d3644d767f7865746fc1c6
4
+ data.tar.gz: a8ff6d75ba6e92654b1cd0f6d71e59bc976cb0194ae79c787e409defe78184cb
5
5
  SHA512:
6
- metadata.gz: 26c905bfb0aa1a519271474f36a8a3c8b98709f56a47e87ea94c323e690e44a45f056e41581ce0d13b32b0daba088fdc75254d12e9bdeaa361644757a8b94804
7
- data.tar.gz: e5e0347b3e9d4349a4eb4b6b5cc9bfd1eeb4fa96f81dee2380ecc7fbfb726e5071c08f4d977d47e0a17ccf54d445fd188c2220cb25f704a8759f65ae09e8c9a8
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
 
@@ -227,6 +228,42 @@ import utils from '/lib/utils'
227
228
  import constants from './constants'
228
229
  ```
229
230
 
231
+ ```css /app/views/layouts/application.css
232
+ @import '/lib/reset';
233
+ ```
234
+
235
+ ```css /lib/reset.css
236
+ body {
237
+ /* some styles... */
238
+ }
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
+
230
267
  ## Import Maps
231
268
 
232
269
  > **[WIP]**
@@ -634,6 +671,27 @@ class MyView < Proscenium::Phlex
634
671
  end
635
672
  ```
636
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
+
637
695
  ### Side-loading
638
696
 
639
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.pre.13'
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.pre.13
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-12 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
@@ -144,11 +145,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
144
145
  version: 2.7.0
145
146
  required_rubygems_version: !ruby/object:Gem::Requirement
146
147
  requirements:
147
- - - ">"
148
+ - - ">="
148
149
  - !ruby/object:Gem::Version
149
- version: 1.3.1
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