proscenium 0.11.0.pre.9-x86_64-darwin → 0.11.0.pre.10-x86_64-darwin

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: 11a4ddf9e18d4a0e84b7e1e0bc4a97b34fa21b0006ba5eee34cff79761e51ead
4
- data.tar.gz: 5a7195f12faeab4e91015fcb1d758d13f3b76490f9ae599cd0afbdab87b63e00
3
+ metadata.gz: 2830fab8a04207b16ce26439994e8cb5ae6882a2f78e90f49faca58f1c3db2b4
4
+ data.tar.gz: 87549366f8decdda2fdcb5e63461fac3cff46e75fa4f1bc00661cf5d24b4552c
5
5
  SHA512:
6
- metadata.gz: ce2ee1789cb6035d1bd647c3cc638d233713b5d756533b420a154058e8c0974ecabcb4ee2f0172ee8d7ac4e073e5a697af885f3a1ae273bbef4679f31bf97c16
7
- data.tar.gz: 552ebbd157858654fe2c3f0c03e94351c44c21037f9450a1911bd4d0107e6f234f8ebd2ecad8d757401f96400d01eb1d2a69705f4111d0a92ac46b8667bd141d
6
+ metadata.gz: f134a7364fdb029e1c5f2195934ee57fd2111eefd0d3dcebd84651ce593be69d40ca50a3feca9104a3540947eadf6648160c19bb0976e1d68847fd5e91d43a76
7
+ data.tar.gz: fef4d6c37eefac4acc926793abb61ffff76936056ef8c9b619107b13034440900dceb5454bf59824886b5ee7988bfc2820d59023940f968d1cfb557699ad1a09
@@ -9,7 +9,8 @@ module Proscenium
9
9
  end
10
10
 
11
11
  def initialize(source_path)
12
- @source_path = source_path
12
+ return unless (@source_path = source_path)
13
+
13
14
  @source_path = Pathname.new(@source_path) unless @source_path.is_a?(Pathname)
14
15
  @source_path = @source_path.sub_ext(FILE_EXT) unless @source_path.to_s.end_with?(FILE_EXT)
15
16
  end
@@ -37,6 +38,7 @@ module Proscenium
37
38
  # @return [Array<String>] the transformed CSS module names.
38
39
  def class_names(*names, require_prefix: true)
39
40
  names.map do |name|
41
+ original_name = name.dup
40
42
  name = name.to_s if name.is_a?(Symbol)
41
43
 
42
44
  if name.include?('/')
@@ -50,25 +52,31 @@ module Proscenium
50
52
  path, name = name.split('@')
51
53
  end
52
54
 
53
- class_name! name, path: "#{path}#{FILE_EXT}"
55
+ class_name! name, original_name, path: "#{path}#{FILE_EXT}"
54
56
  elsif name.start_with?('@')
55
- class_name! name[1..]
57
+ class_name! name[1..], original_name
56
58
  else
57
- require_prefix ? name : class_name!(name)
59
+ require_prefix ? name : class_name!(name, original_name)
58
60
  end
59
61
  end
60
62
  end
61
63
 
62
- def class_name!(name, path: @source_path)
64
+ def class_name!(name, original_name, path: @source_path)
65
+ unless path
66
+ raise Proscenium::CssModule::TransformError.new(original_name, 'CSS module path not given')
67
+ end
68
+
63
69
  resolved_path = Resolver.resolve(path.to_s)
64
70
  digest = Importer.import(resolved_path)
65
71
 
66
- sname = name.to_s
67
- if sname.start_with?('_')
68
- "_#{sname[1..]}-#{digest}"
69
- else
70
- "#{sname}-#{digest}"
71
- end
72
+ transformed_name = name.to_s
73
+ transformed_name = if transformed_name.start_with?('_')
74
+ "_#{transformed_name[1..]}-#{digest}"
75
+ else
76
+ "#{transformed_name}-#{digest}"
77
+ end
78
+
79
+ [transformed_name, resolved_path]
72
80
  end
73
81
  end
74
82
  end
@@ -6,11 +6,20 @@ module Proscenium::CssModule
6
6
  autoload :Path
7
7
  autoload :Transformer
8
8
 
9
+ class TransformError < StandardError
10
+ def initialize(name, additional_msg = nil)
11
+ msg = "Failed to transform CSS module `#{name}`"
12
+ msg << ' - ' << additional_msg if additional_msg
13
+
14
+ super msg
15
+ end
16
+ end
17
+
9
18
  # Accepts one or more CSS class names, and transforms them into CSS module names.
10
19
  #
11
20
  # @param name [String,Symbol,Array<String,Symbol>]
12
21
  def css_module(*names)
13
- cssm.class_names(*names, require_prefix: false).join ' '
22
+ cssm.class_names(*names, require_prefix: false).map { |name, _| name }.join(' ')
14
23
  end
15
24
 
16
25
  private
Binary file
@@ -22,7 +22,9 @@ module Proscenium
22
22
  # @param name [String,Symbol,Array<String,Symbol>]
23
23
  def css_module(*names)
24
24
  path = Pathname.new(@lookup_context.find(@virtual_path).identifier).sub_ext('')
25
- CssModule::Transformer.new(path).class_names(*names, require_prefix: false).join ' '
25
+ CssModule::Transformer.new(path).class_names(*names, require_prefix: false).map do |name, _|
26
+ name
27
+ end.join(' ')
26
28
  end
27
29
 
28
30
  def include_stylesheets(**options)
@@ -6,6 +6,28 @@ module Proscenium
6
6
 
7
7
  def self.included(base)
8
8
  base.extend CssModule::Path
9
+ base.extend ClassMethods
10
+ end
11
+
12
+ module ClassMethods
13
+ # Set of CSS module paths that have been resolved after being transformed from 'class' HTML
14
+ # attributes. See #process_attributes. This is here because Phlex caches attributes. Which
15
+ # means while the CSS class names will be transformed, any resolved paths will be lost in
16
+ # subsequent requests.
17
+ attr_accessor :resolved_css_module_paths
18
+ end
19
+
20
+ def before_template
21
+ self.class.resolved_css_module_paths ||= Concurrent::Set.new
22
+ super
23
+ end
24
+
25
+ def after_template
26
+ self.class.resolved_css_module_paths.each do |path|
27
+ Proscenium::Importer.import path
28
+ end
29
+
30
+ super
9
31
  end
10
32
 
11
33
  # Resolve and side load any CSS modules in the "class" attributes, where a CSS module is a class
@@ -44,7 +66,11 @@ module Proscenium
44
66
  def process_attributes(**attributes)
45
67
  if attributes.key?(:class) && (attributes[:class] = tokens(attributes[:class])).include?('@')
46
68
  names = attributes[:class].is_a?(Array) ? attributes[:class] : attributes[:class].split
47
- attributes[:class] = cssm.class_names(*names)
69
+
70
+ attributes[:class] = cssm.class_names(*names).map do |name, path|
71
+ self.class.resolved_css_module_paths << path if path
72
+ name
73
+ end
48
74
  end
49
75
 
50
76
  attributes
@@ -6,7 +6,6 @@ module Proscenium
6
6
  class Phlex < ::Phlex::HTML
7
7
  extend ActiveSupport::Autoload
8
8
 
9
- autoload :Page
10
9
  autoload :CssModules
11
10
  autoload :ReactComponent
12
11
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Proscenium
4
- VERSION = '0.11.0.pre.9'
4
+ VERSION = '0.11.0.pre.10'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: proscenium
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0.pre.9
4
+ version: 0.11.0.pre.10
5
5
  platform: x86_64-darwin
6
6
  authors:
7
7
  - Joel Moss
@@ -112,7 +112,6 @@ files:
112
112
  - lib/proscenium/monkey.rb
113
113
  - lib/proscenium/phlex.rb
114
114
  - lib/proscenium/phlex/css_modules.rb
115
- - lib/proscenium/phlex/page.rb
116
115
  - lib/proscenium/phlex/react_component.rb
117
116
  - lib/proscenium/railtie.rb
118
117
  - lib/proscenium/react_componentable.rb
@@ -149,7 +148,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
148
  - !ruby/object:Gem::Version
150
149
  version: 1.3.1
151
150
  requirements: []
152
- rubygems_version: 3.4.19
151
+ rubygems_version: 3.4.20
153
152
  signing_key:
154
153
  specification_version: 4
155
154
  summary: The engine powering your Rails frontend
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'phlex/rails'
4
-
5
- # Include this in your view for additional logic for rendering a full HTML page, usually from a
6
- # controller.
7
- module Proscenium::Phlex::Page
8
- include Phlex::Rails::Helpers::CSPMetaTag
9
- include Phlex::Rails::Helpers::CSRFMetaTags
10
- include Phlex::Rails::Helpers::FaviconLinkTag
11
- include Phlex::Rails::Helpers::PreloadLinkTag
12
- include Phlex::Rails::Helpers::StyleSheetLinkTag
13
- include Phlex::Rails::Helpers::ActionCableMetaTag
14
- include Phlex::Rails::Helpers::AutoDiscoveryLinkTag
15
- include Phlex::Rails::Helpers::JavaScriptIncludeTag
16
- include Phlex::Rails::Helpers::JavaScriptImportMapTags
17
- include Phlex::Rails::Helpers::JavaScriptImportModuleTag
18
-
19
- def self.included(klass)
20
- klass.extend(Phlex::Rails::Layout::Interface)
21
- end
22
-
23
- def template(&block)
24
- doctype
25
- html do
26
- head
27
- body(&block)
28
- end
29
- end
30
-
31
- private
32
-
33
- def after_template
34
- super
35
- @_buffer.gsub!('<!-- [SIDE_LOAD_STYLESHEETS] -->', capture { include_stylesheets })
36
- end
37
-
38
- def page_title
39
- Rails.application.class.name.deconstantize
40
- end
41
-
42
- def head
43
- super do
44
- title { page_title }
45
-
46
- yield if block_given?
47
-
48
- csp_meta_tag
49
- csrf_meta_tags
50
-
51
- comment { '[SIDE_LOAD_STYLESHEETS]' }
52
- end
53
- end
54
-
55
- def body
56
- super do
57
- yield if block_given?
58
-
59
- include_javascripts type: :module, defer: true
60
- end
61
- end
62
- end