view_component_devtools 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2af7b0e20aeaa0d3d3e75c5255b567050c2425b73d95819c539eff4ea289bfaf
4
- data.tar.gz: 7653f7e096b59b3629a591610e814917c55d8ebac86a760993eb204fe61e1714
3
+ metadata.gz: bf5b2619905340a6dd2b5e8bc564172c9a49441a6353d48e36619585abb190b3
4
+ data.tar.gz: c5fc0d7882588e18739448c3cc147d3a10a4e0c93fdad4c0a8a5406fe65958b4
5
5
  SHA512:
6
- metadata.gz: d05d4d3bc6e21473251b807f4680ce8a551c5d9de5bc195f37be2e730aaea7b19598ced8b9b948f5a1637ab108fb7818b869b82b9a06ffd6ecf83281649818ab
7
- data.tar.gz: 309af696584ad38c6bed98e5210707c480401f355e66ece9f4183e88ba5555f65542bea0d77ea556384f548a6a51cf833adf72517d397747a0d4b1e706763b87
6
+ metadata.gz: cd02547ecaca8df7483794ee934f9b7374821fd10df047028e9739d43277207c7b1aa3cb10b92f5ae5da91f43497b84f232d61669042a30d6d2fe1bdb08288a0
7
+ data.tar.gz: d3f7f7a4000c3fe7527bdd87de585806d4e8fb559d1e3970e9900d884495e817a4d537fe98b3a740d9387effcf9d1ac558a93c25182bf1cb70728009a1e64a8a
@@ -1,7 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/string/output_safety"
4
+ require "base64"
5
+
3
6
  module ViewComponentDevtools
4
7
  module Component
8
+ MARKER_PREFIX = "view-component-devtools"
9
+
5
10
  def self.included(base)
6
11
  base.extend(ClassMethods)
7
12
  end
@@ -13,18 +18,37 @@ module ViewComponentDevtools
13
18
  end
14
19
 
15
20
  def view_component_devtools_prop_names
16
- declared = @view_component_devtools_props || []
21
+ declared = (@view_component_devtools_props || []).select do |name|
22
+ directly_defined_zero_argument_method?(name)
23
+ end
17
24
  inferred = component_initializer&.parameters&.filter_map do |kind, name|
18
- name if %i[req opt keyreq key].include?(kind)
25
+ name if %i[req opt keyreq key].include?(kind) && directly_defined_attribute_reader?(name)
19
26
  end || []
20
27
 
21
- (declared + inferred).uniq.select do |name|
22
- directly_defined_reader?(name)
23
- end
28
+ (declared + inferred).uniq
24
29
  end
25
30
 
26
31
  private
27
32
 
33
+ def attr(*names)
34
+ result = super
35
+ reader_names = names.last == true || names.last == false ? names[0...-1] : names
36
+ track_attribute_readers(reader_names)
37
+ result
38
+ end
39
+
40
+ def attr_accessor(*names)
41
+ result = super
42
+ track_attribute_readers(names)
43
+ result
44
+ end
45
+
46
+ def attr_reader(*names)
47
+ result = super
48
+ track_attribute_readers(names)
49
+ result
50
+ end
51
+
28
52
  def component_initializer
29
53
  return unless private_instance_methods(false).include?(:initialize) ||
30
54
  protected_instance_methods(false).include?(:initialize) ||
@@ -33,12 +57,26 @@ module ViewComponentDevtools
33
57
  instance_method(:initialize)
34
58
  end
35
59
 
36
- def directly_defined_reader?(name)
60
+ def directly_defined_attribute_reader?(name)
61
+ reader = (@view_component_devtools_attribute_readers || {})[name]
62
+ return false unless reader
63
+ return false unless directly_defined_zero_argument_method?(name)
64
+
65
+ instance_method(name) == reader
66
+ end
67
+
68
+ def directly_defined_zero_argument_method?(name)
37
69
  return false unless public_instance_methods(false).include?(name)
38
70
 
39
71
  method = instance_method(name)
40
- method.parameters.none? do |kind, _|
41
- %i[req keyreq].include?(kind)
72
+ method.owner == self && method.arity.zero?
73
+ end
74
+
75
+ def track_attribute_readers(names)
76
+ @view_component_devtools_attribute_readers ||= {}
77
+ names.each do |name|
78
+ name = name.to_sym
79
+ @view_component_devtools_attribute_readers[name] = instance_method(name)
42
80
  end
43
81
  end
44
82
  end
@@ -54,7 +92,15 @@ module ViewComponentDevtools
54
92
  end
55
93
  }
56
94
 
57
- State.with_component(metadata) { super }
95
+ rendered = State.with_component(metadata) { super }
96
+ component_id = metadata[:devtools_id]
97
+ return rendered unless component_id
98
+
99
+ marker_id = Base64.strict_encode64(component_id)
100
+ start_marker = "<!--#{MARKER_PREFIX}:start:#{marker_id}-->".html_safe
101
+ end_marker = "<!--#{MARKER_PREFIX}:end:#{marker_id}-->".html_safe
102
+
103
+ start_marker + rendered.to_s.html_safe + end_marker
58
104
  end
59
105
 
60
106
  private
@@ -106,8 +106,11 @@ module ViewComponentDevtools
106
106
  @component_count += 1
107
107
  metadata = component_stack.last
108
108
  metadata = nil unless metadata&.fetch(:name, nil) == payload[:name]
109
+ id = "#{request_id}:#{@component_count}"
110
+ metadata[:devtools_id] = id if metadata
111
+
109
112
  {
110
- id: "#{request_id}:#{@component_count}",
113
+ id:,
111
114
  name: payload[:name] || metadata&.fetch(:name, nil) || "AnonymousComponent",
112
115
  sourceLocation: payload[:identifier] || metadata&.fetch(:source_location, nil),
113
116
  templateLocation: payload[:view_identifier],
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ViewComponentDevtools
4
- VERSION = "0.1.2"
4
+ VERSION = "0.1.3"
5
5
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: view_component_devtools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ViewComponent DevTools contributors
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2026-08-11 00:00:00.000000000 Z
10
+ date: 2026-08-12 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: activesupport