proscenium 0.11.0.pre.9-x86_64-darwin → 0.11.0.pre.11-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: bbaa1085da775617ff05dd56b98b9596a269ce6dbdcbf2022298b805ba60d9d1
4
+ data.tar.gz: 12cba17bddc0b42ef9e9352a816711ab4dca1ee8b2c1090c95774aaf32772c1f
5
5
  SHA512:
6
- metadata.gz: ce2ee1789cb6035d1bd647c3cc638d233713b5d756533b420a154058e8c0974ecabcb4ee2f0172ee8d7ac4e073e5a697af885f3a1ae273bbef4679f31bf97c16
7
- data.tar.gz: 552ebbd157858654fe2c3f0c03e94351c44c21037f9450a1911bd4d0107e6f234f8ebd2ecad8d757401f96400d01eb1d2a69705f4111d0a92ac46b8667bd141d
6
+ metadata.gz: c8f0ca2517304db1a98e07f86b6f170de1a798e73044914974dc9997b8ef9475f71926466ed40f035b02bafba2b35206dcbefb66573c82def82e6c36ffb9a8e1
7
+ data.tar.gz: 5c575c1788cd624ed78d358e4d5a01158a532f6e16676d86fa267aadd7eb6300684f6a9cbf9038e43dd849af81de6b0459c533323def4cd9cdbc3a354c457bad
@@ -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)
@@ -75,10 +77,14 @@ module Proscenium
75
77
 
76
78
  if extract_lazy_scripts
77
79
  content_for :proscenium_lazy_scripts do
78
- javascript_tag "window.prosceniumLazyScripts = #{scripts.to_json}"
80
+ tag.script type: 'application/json', id: 'prosceniumLazyScripts' do
81
+ raw scripts.to_json
82
+ end
79
83
  end
80
84
  else
81
- out << javascript_tag("window.prosceniumLazyScripts = #{scripts.to_json}")
85
+ out << tag.script(type: 'application/json', id: 'prosceniumLazyScripts') do
86
+ raw scripts.to_json
87
+ end
82
88
  end
83
89
  else
84
90
  Importer.each_javascript(delete: true) do |path, _|
@@ -1,7 +1,16 @@
1
- const elements = document.querySelectorAll("[data-proscenium-component-path]");
1
+ window.Proscenium = window.Proscenium || { lazyScripts: {} };
2
+
3
+ const element = document.querySelector("#prosceniumLazyScripts");
4
+ if (element) {
5
+ const scripts = JSON.parse(element.text);
6
+ window.Proscenium.lazyScripts = {
7
+ ...window.Proscenium.lazyScripts,
8
+ ...scripts,
9
+ };
10
+ }
2
11
 
3
- // Initialize only if there are components.
4
- elements.length > 0 && init();
12
+ const elements = document.querySelectorAll("[data-proscenium-component-path]");
13
+ elements.length > 0 && init(elements);
5
14
 
6
15
  function init() {
7
16
  /**
@@ -20,12 +29,12 @@ function init() {
20
29
  // For testing and simulation of slow connections.
21
30
  // const sim = new Promise((resolve) => setTimeout(resolve, 5000));
22
31
 
23
- if (!(path in window.prosceniumLazyScripts)) {
24
- throw `[proscenium/react/manager] Cannot load component ${path} (not found in prosceniumLazyScripts)`;
32
+ if (!window.Proscenium.lazyScripts[path]) {
33
+ throw `[proscenium/react/manager] Cannot load component ${path} (not found in Proscenium.lazyScripts)`;
25
34
  }
26
35
 
27
36
  const react = import("@proscenium/react-manager/react");
28
- const Component = import(window.prosceniumLazyScripts[path].outpath);
37
+ const Component = import(window.Proscenium.lazyScripts[path].outpath);
29
38
 
30
39
  const forwardChildren =
31
40
  "prosceniumComponentForwardChildren" in element.dataset &&
@@ -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.11'
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.9
4
+ version: 0.11.0.pre.11
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-05 00:00:00.000000000 Z
11
+ date: 2023-10-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -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