proscenium 0.11.0.pre.8-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: aec72bb2fdbfb6fdc6862af4a350188e6a1a851be686cff124b528fa4764a659
4
- data.tar.gz: 657d521ec0f5b6baea484baf80495114c58421eee7a20d11cb2ce264b32e1515
3
+ metadata.gz: 2830fab8a04207b16ce26439994e8cb5ae6882a2f78e90f49faca58f1c3db2b4
4
+ data.tar.gz: 87549366f8decdda2fdcb5e63461fac3cff46e75fa4f1bc00661cf5d24b4552c
5
5
  SHA512:
6
- metadata.gz: 689f2dc2829a7260c13a5881941da8ecc4c7b8c16a89d572ab297872be5118ca7a2b4c667ddc218a8f352bcc03a0802bb08f52b65fdaf136dea9aa1b422b2f2e
7
- data.tar.gz: 8ed0cb3e9ed37e60b0782346032ad2036266e7a58e761ed0accbc927afc91732bfc83eaafa18487ad90fdb6876bac9302f651eb8732b2c2862c3579f2a11607d
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?('/')
@@ -44,33 +46,37 @@ module Proscenium
44
46
  # Scoped bare specifier (eg. "@scoped/package/lib/button@default").
45
47
  _, path, name = name.split('@')
46
48
  path = "@#{path}"
47
- elsif name.start_with?('/')
48
- # Local path with leading slash.
49
- path, name = name[1..].split('@')
50
49
  else
51
- # Bare specifier (eg. "mypackage/lib/button@default").
50
+ # Local path (eg. /some/path/to/button@default") or bare specifier (eg.
51
+ # "mypackage/lib/button@default").
52
52
  path, name = name.split('@')
53
53
  end
54
54
 
55
- class_name! name, path: "#{path}#{FILE_EXT}"
55
+ class_name! name, original_name, path: "#{path}#{FILE_EXT}"
56
56
  elsif name.start_with?('@')
57
- class_name! name[1..]
57
+ class_name! name[1..], original_name
58
58
  else
59
- require_prefix ? name : class_name!(name)
59
+ require_prefix ? name : class_name!(name, original_name)
60
60
  end
61
61
  end
62
62
  end
63
63
 
64
- 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
+
65
69
  resolved_path = Resolver.resolve(path.to_s)
66
70
  digest = Importer.import(resolved_path)
67
71
 
68
- sname = name.to_s
69
- if sname.start_with?('_')
70
- "_#{sname[1..]}-#{digest}"
71
- else
72
- "#{sname}-#{digest}"
73
- 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]
74
80
  end
75
81
  end
76
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.8'
4
+ VERSION = '0.11.0.pre.10'
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.8
4
+ version: 0.11.0.pre.10
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-09-25 00:00:00.000000000 Z
11
+ date: 2023-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -36,14 +36,14 @@ dependencies:
36
36
  requirements:
37
37
  - - "~>"
38
38
  - !ruby/object:Gem::Version
39
- version: 1.15.5
39
+ version: 1.16.3
40
40
  type: :runtime
41
41
  prerelease: false
42
42
  version_requirements: !ruby/object:Gem::Requirement
43
43
  requirements:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
- version: 1.15.5
46
+ version: 1.16.3
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: oj
49
49
  requirement: !ruby/object:Gem::Requirement
@@ -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