view_component 3.12.1 → 3.23.2
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 +4 -4
- data/app/controllers/concerns/view_component/preview_actions.rb +8 -1
- data/app/helpers/preview_helper.rb +1 -1
- data/app/views/view_components/_preview_source.html.erb +1 -1
- data/docs/CHANGELOG.md +299 -5
- data/lib/rails/generators/abstract_generator.rb +9 -1
- data/lib/rails/generators/component/component_generator.rb +2 -1
- data/lib/rails/generators/component/templates/component.rb.tt +3 -2
- data/lib/rails/generators/erb/component_generator.rb +1 -1
- data/lib/rails/generators/preview/templates/component_preview.rb.tt +2 -0
- data/lib/rails/generators/rspec/templates/component_spec.rb.tt +1 -1
- data/lib/rails/generators/stimulus/component_generator.rb +8 -3
- data/lib/rails/generators/stimulus/templates/component_controller.ts.tt +9 -0
- data/lib/rails/generators/test_unit/templates/component_test.rb.tt +1 -1
- data/lib/view_component/base.rb +52 -59
- data/lib/view_component/collection.rb +18 -3
- data/lib/view_component/compiler.rb +164 -240
- data/lib/view_component/config.rb +26 -2
- data/lib/view_component/configurable.rb +17 -0
- data/lib/view_component/engine.rb +21 -11
- data/lib/view_component/errors.rb +7 -5
- data/lib/view_component/instrumentation.rb +1 -1
- data/lib/view_component/preview.rb +1 -1
- data/lib/view_component/rails/tasks/view_component.rake +8 -2
- data/lib/view_component/slotable.rb +28 -14
- data/lib/view_component/slotable_default.rb +20 -0
- data/lib/view_component/template.rb +134 -0
- data/lib/view_component/test_helpers.rb +29 -2
- data/lib/view_component/use_helpers.rb +32 -10
- data/lib/view_component/version.rb +2 -2
- metadata +112 -19
- data/lib/rails/generators/component/USAGE +0 -13
- data/lib/view_component/docs_builder_component.html.erb +0 -22
- data/lib/view_component/docs_builder_component.rb +0 -96
- data/lib/yard/mattr_accessor_handler.rb +0 -19
@@ -7,8 +7,14 @@ namespace :view_component do
|
|
7
7
|
# :nocov:
|
8
8
|
require "rails/code_statistics"
|
9
9
|
|
10
|
-
|
11
|
-
|
10
|
+
if Rails.root.join(ViewComponent::Base.view_component_path).directory?
|
11
|
+
::STATS_DIRECTORIES << ["ViewComponents", ViewComponent::Base.view_component_path]
|
12
|
+
end
|
13
|
+
|
14
|
+
if Rails.root.join("test/components").directory?
|
15
|
+
::STATS_DIRECTORIES << ["ViewComponent tests", "test/components"]
|
16
|
+
CodeStatistics::TEST_TYPES << "ViewComponent tests"
|
17
|
+
end
|
12
18
|
# :nocov:
|
13
19
|
end
|
14
20
|
end
|
@@ -89,11 +89,11 @@ module ViewComponent
|
|
89
89
|
end
|
90
90
|
ruby2_keywords(setter_method_name) if respond_to?(:ruby2_keywords, true)
|
91
91
|
|
92
|
-
define_method slot_name do
|
92
|
+
self::GeneratedSlotMethods.define_method slot_name do
|
93
93
|
get_slot(slot_name)
|
94
94
|
end
|
95
95
|
|
96
|
-
define_method :"#{slot_name}?" do
|
96
|
+
self::GeneratedSlotMethods.define_method :"#{slot_name}?" do
|
97
97
|
get_slot(slot_name).present?
|
98
98
|
end
|
99
99
|
|
@@ -176,11 +176,11 @@ module ViewComponent
|
|
176
176
|
end
|
177
177
|
end
|
178
178
|
|
179
|
-
define_method slot_name do
|
179
|
+
self::GeneratedSlotMethods.define_method slot_name do
|
180
180
|
get_slot(slot_name)
|
181
181
|
end
|
182
182
|
|
183
|
-
define_method :"#{slot_name}?" do
|
183
|
+
self::GeneratedSlotMethods.define_method :"#{slot_name}?" do
|
184
184
|
get_slot(slot_name).present?
|
185
185
|
end
|
186
186
|
|
@@ -199,19 +199,28 @@ module ViewComponent
|
|
199
199
|
end
|
200
200
|
end
|
201
201
|
|
202
|
-
# Clone slot configuration into child class
|
203
|
-
# see #test_slots_pollution
|
204
202
|
def inherited(child)
|
203
|
+
# Clone slot configuration into child class
|
204
|
+
# see #test_slots_pollution
|
205
205
|
child.registered_slots = registered_slots.clone
|
206
|
+
|
207
|
+
# Add a module for slot methods, allowing them to be overriden by the component class
|
208
|
+
# see #test_slot_name_can_be_overriden
|
209
|
+
unless child.const_defined?(:GeneratedSlotMethods, false)
|
210
|
+
generated_slot_methods = Module.new
|
211
|
+
child.const_set(:GeneratedSlotMethods, generated_slot_methods)
|
212
|
+
child.include generated_slot_methods
|
213
|
+
end
|
214
|
+
|
206
215
|
super
|
207
216
|
end
|
208
217
|
|
209
218
|
def register_polymorphic_slot(slot_name, types, collection:)
|
210
|
-
define_method(slot_name) do
|
219
|
+
self::GeneratedSlotMethods.define_method(slot_name) do
|
211
220
|
get_slot(slot_name)
|
212
221
|
end
|
213
222
|
|
214
|
-
define_method(:"#{slot_name}?") do
|
223
|
+
self::GeneratedSlotMethods.define_method(:"#{slot_name}?") do
|
215
224
|
get_slot(slot_name).present?
|
216
225
|
end
|
217
226
|
|
@@ -259,6 +268,15 @@ module ViewComponent
|
|
259
268
|
}
|
260
269
|
end
|
261
270
|
|
271
|
+
# Called by the compiler, as instance methods are not defined when slots are first registered
|
272
|
+
def register_default_slots
|
273
|
+
registered_slots.each do |slot_name, config|
|
274
|
+
config[:default_method] = instance_methods.find { |method_name| method_name == :"default_#{slot_name}" }
|
275
|
+
|
276
|
+
registered_slots[slot_name] = config
|
277
|
+
end
|
278
|
+
end
|
279
|
+
|
262
280
|
private
|
263
281
|
|
264
282
|
def register_slot(slot_name, **kwargs)
|
@@ -266,10 +284,7 @@ module ViewComponent
|
|
266
284
|
end
|
267
285
|
|
268
286
|
def define_slot(slot_name, collection:, callable:)
|
269
|
-
|
270
|
-
slot = {
|
271
|
-
collection: collection
|
272
|
-
}
|
287
|
+
slot = {collection: collection}
|
273
288
|
return slot unless callable
|
274
289
|
|
275
290
|
# If callable responds to `render_in`, we set it on the slot as a renderable
|
@@ -318,7 +333,6 @@ module ViewComponent
|
|
318
333
|
|
319
334
|
def raise_if_slot_registered(slot_name)
|
320
335
|
if registered_slots.key?(slot_name)
|
321
|
-
# TODO remove? This breaks overriding slots when slots are inherited
|
322
336
|
raise RedefinedSlotError.new(name, slot_name)
|
323
337
|
end
|
324
338
|
end
|
@@ -417,7 +431,7 @@ module ViewComponent
|
|
417
431
|
def set_polymorphic_slot(slot_name, poly_type = nil, *args, &block)
|
418
432
|
slot_definition = self.class.registered_slots[slot_name]
|
419
433
|
|
420
|
-
if !slot_definition[:collection] &&
|
434
|
+
if !slot_definition[:collection] && defined?(@__vc_set_slots) && @__vc_set_slots[slot_name]
|
421
435
|
raise ContentAlreadySetForPolymorphicSlotError.new(slot_name)
|
422
436
|
end
|
423
437
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module ViewComponent
|
2
|
+
module SlotableDefault
|
3
|
+
def get_slot(slot_name)
|
4
|
+
@__vc_set_slots ||= {}
|
5
|
+
|
6
|
+
return super unless !@__vc_set_slots[slot_name] && (default_method = registered_slots[slot_name][:default_method])
|
7
|
+
|
8
|
+
renderable_value = send(default_method)
|
9
|
+
slot = Slot.new(self)
|
10
|
+
|
11
|
+
if renderable_value.respond_to?(:render_in)
|
12
|
+
slot.__vc_component_instance = renderable_value
|
13
|
+
else
|
14
|
+
slot.__vc_content = renderable_value
|
15
|
+
end
|
16
|
+
|
17
|
+
slot
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ViewComponent
|
4
|
+
class Template
|
5
|
+
DataWithSource = Struct.new(:format, :identifier, :short_identifier, :type, keyword_init: true)
|
6
|
+
DataNoSource = Struct.new(:source, :identifier, :type, keyword_init: true)
|
7
|
+
|
8
|
+
attr_reader :variant, :this_format, :type
|
9
|
+
|
10
|
+
def initialize(
|
11
|
+
component:,
|
12
|
+
type:,
|
13
|
+
this_format: nil,
|
14
|
+
variant: nil,
|
15
|
+
lineno: nil,
|
16
|
+
path: nil,
|
17
|
+
extension: nil,
|
18
|
+
source: nil,
|
19
|
+
method_name: nil,
|
20
|
+
defined_on_self: true
|
21
|
+
)
|
22
|
+
@component = component
|
23
|
+
@type = type
|
24
|
+
@this_format = this_format
|
25
|
+
@variant = variant&.to_sym
|
26
|
+
@lineno = lineno
|
27
|
+
@path = path
|
28
|
+
@extension = extension
|
29
|
+
@source = source
|
30
|
+
@method_name = method_name
|
31
|
+
@defined_on_self = defined_on_self
|
32
|
+
|
33
|
+
@source_originally_nil = @source.nil?
|
34
|
+
|
35
|
+
@call_method_name =
|
36
|
+
if @method_name
|
37
|
+
@method_name
|
38
|
+
else
|
39
|
+
out = +"call"
|
40
|
+
out << "_#{normalized_variant_name}" if @variant.present?
|
41
|
+
out << "_#{@this_format}" if @this_format.present? && @this_format != ViewComponent::Base::VC_INTERNAL_DEFAULT_FORMAT
|
42
|
+
out
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def compile_to_component
|
47
|
+
if !inline_call?
|
48
|
+
@component.silence_redefinition_of_method(@call_method_name)
|
49
|
+
|
50
|
+
# rubocop:disable Style/EvalWithLocation
|
51
|
+
@component.class_eval <<-RUBY, @path, @lineno
|
52
|
+
def #{@call_method_name}
|
53
|
+
#{compiled_source}
|
54
|
+
end
|
55
|
+
RUBY
|
56
|
+
# rubocop:enable Style/EvalWithLocation
|
57
|
+
end
|
58
|
+
|
59
|
+
@component.define_method(safe_method_name, @component.instance_method(@call_method_name))
|
60
|
+
end
|
61
|
+
|
62
|
+
def safe_method_name_call
|
63
|
+
return safe_method_name unless inline_call?
|
64
|
+
|
65
|
+
"maybe_escape_html(#{safe_method_name}) " \
|
66
|
+
"{ Kernel.warn(\"WARNING: The #{@component} component rendered HTML-unsafe output. " \
|
67
|
+
"The output will be automatically escaped, but you may want to investigate.\") } "
|
68
|
+
end
|
69
|
+
|
70
|
+
def requires_compiled_superclass?
|
71
|
+
inline_call? && !defined_on_self?
|
72
|
+
end
|
73
|
+
|
74
|
+
def inline_call?
|
75
|
+
@type == :inline_call
|
76
|
+
end
|
77
|
+
|
78
|
+
def inline?
|
79
|
+
@type == :inline
|
80
|
+
end
|
81
|
+
|
82
|
+
def default_format?
|
83
|
+
@this_format == ViewComponent::Base::VC_INTERNAL_DEFAULT_FORMAT
|
84
|
+
end
|
85
|
+
|
86
|
+
def format
|
87
|
+
@this_format
|
88
|
+
end
|
89
|
+
|
90
|
+
def safe_method_name
|
91
|
+
"_#{@call_method_name}_#{@component.name.underscore.gsub("/", "__")}"
|
92
|
+
end
|
93
|
+
|
94
|
+
def normalized_variant_name
|
95
|
+
@variant.to_s.gsub("-", "__").gsub(".", "___")
|
96
|
+
end
|
97
|
+
|
98
|
+
def defined_on_self?
|
99
|
+
@defined_on_self
|
100
|
+
end
|
101
|
+
|
102
|
+
private
|
103
|
+
|
104
|
+
def source
|
105
|
+
if @source_originally_nil
|
106
|
+
# Load file each time we look up #source in case the file has been modified
|
107
|
+
File.read(@path)
|
108
|
+
else
|
109
|
+
@source
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def compiled_source
|
114
|
+
handler = ActionView::Template.handler_for_extension(@extension)
|
115
|
+
this_source = source
|
116
|
+
this_source.rstrip! if @component.strip_trailing_whitespace?
|
117
|
+
|
118
|
+
short_identifier = defined?(Rails.root) ? @path.sub("#{Rails.root}/", "") : @path
|
119
|
+
type = ActionView::Template::Types[@this_format]
|
120
|
+
|
121
|
+
if handler.method(:call).parameters.length > 1
|
122
|
+
handler.call(
|
123
|
+
DataWithSource.new(format: @this_format, identifier: @path, short_identifier: short_identifier, type: type),
|
124
|
+
this_source
|
125
|
+
)
|
126
|
+
# :nocov:
|
127
|
+
# TODO: Remove in v4
|
128
|
+
else
|
129
|
+
handler.call(DataNoSource.new(source: this_source, identifier: @path, type: type))
|
130
|
+
end
|
131
|
+
# :nocov:
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -14,6 +14,10 @@ module ViewComponent
|
|
14
14
|
def refute_component_rendered
|
15
15
|
assert_no_selector("body")
|
16
16
|
end
|
17
|
+
|
18
|
+
def assert_component_rendered
|
19
|
+
assert_selector("body")
|
20
|
+
end
|
17
21
|
rescue LoadError
|
18
22
|
# We don't have a test case for running an application without capybara installed.
|
19
23
|
# It's probably fine to leave this without coverage.
|
@@ -59,6 +63,16 @@ module ViewComponent
|
|
59
63
|
Nokogiri::HTML.fragment(@rendered_content)
|
60
64
|
end
|
61
65
|
|
66
|
+
# `JSON.parse`-d component output.
|
67
|
+
#
|
68
|
+
# ```ruby
|
69
|
+
# render_inline(MyJsonComponent.new)
|
70
|
+
# assert_equal(rendered_json["hello"], "world")
|
71
|
+
# ```
|
72
|
+
def rendered_json
|
73
|
+
JSON.parse(rendered_content)
|
74
|
+
end
|
75
|
+
|
62
76
|
# Render a preview inline. Internally sets `page` to be a `Capybara::Node::Simple`,
|
63
77
|
# allowing for Capybara assertions to be used:
|
64
78
|
#
|
@@ -141,7 +155,7 @@ module ViewComponent
|
|
141
155
|
# end
|
142
156
|
# ```
|
143
157
|
#
|
144
|
-
# @param klass [ActionController::Base] The controller to be used.
|
158
|
+
# @param klass [Class<ActionController::Base>] The controller to be used.
|
145
159
|
def with_controller_class(klass)
|
146
160
|
old_controller = defined?(@vc_test_controller) && @vc_test_controller
|
147
161
|
|
@@ -151,6 +165,19 @@ module ViewComponent
|
|
151
165
|
@vc_test_controller = old_controller
|
152
166
|
end
|
153
167
|
|
168
|
+
# Set format of the current request
|
169
|
+
#
|
170
|
+
# ```ruby
|
171
|
+
# with_format(:json) do
|
172
|
+
# render_inline(MyComponent.new)
|
173
|
+
# end
|
174
|
+
# ```
|
175
|
+
#
|
176
|
+
# @param format [Symbol] The format to be set for the provided block.
|
177
|
+
def with_format(format)
|
178
|
+
with_request_url("/", format: format) { yield }
|
179
|
+
end
|
180
|
+
|
154
181
|
# Set the URL of the current request (such as when using request-dependent path helpers):
|
155
182
|
#
|
156
183
|
# ```ruby
|
@@ -178,7 +205,7 @@ module ViewComponent
|
|
178
205
|
# @param full_path [String] The path to set for the current request.
|
179
206
|
# @param host [String] The host to set for the current request.
|
180
207
|
# @param method [String] The request method to set for the current request.
|
181
|
-
def with_request_url(full_path, host: nil, method: nil, format:
|
208
|
+
def with_request_url(full_path, host: nil, method: nil, format: ViewComponent::Base::VC_INTERNAL_DEFAULT_FORMAT)
|
182
209
|
old_request_host = vc_test_request.host
|
183
210
|
old_request_method = vc_test_request.request_method
|
184
211
|
old_request_path_info = vc_test_request.path_info
|
@@ -4,17 +4,39 @@ module ViewComponent::UseHelpers
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
class_methods do
|
7
|
-
def use_helpers(*args)
|
8
|
-
args.each
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
7
|
+
def use_helpers(*args, from: nil, prefix: false)
|
8
|
+
args.each { |helper_method| use_helper(helper_method, from: from, prefix: prefix) }
|
9
|
+
end
|
10
|
+
|
11
|
+
def use_helper(helper_method, from: nil, prefix: false)
|
12
|
+
helper_method_name = full_helper_method_name(helper_method, prefix: prefix, source: from)
|
13
|
+
|
14
|
+
class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
15
|
+
def #{helper_method_name}(*args, &block)
|
16
|
+
raise HelpersCalledBeforeRenderError if view_context.nil?
|
17
|
+
|
18
|
+
#{define_helper(helper_method: helper_method, source: from)}
|
19
|
+
end
|
20
|
+
RUBY
|
21
|
+
ruby2_keywords(helper_method_name) if respond_to?(:ruby2_keywords, true)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def full_helper_method_name(helper_method, prefix: false, source: nil)
|
27
|
+
return helper_method unless prefix.present?
|
28
|
+
|
29
|
+
if !!prefix == prefix
|
30
|
+
"#{source.to_s.underscore}_#{helper_method}"
|
31
|
+
else
|
32
|
+
"#{prefix}_#{helper_method}"
|
17
33
|
end
|
18
34
|
end
|
35
|
+
|
36
|
+
def define_helper(helper_method:, source:)
|
37
|
+
return "__vc_original_view_context.#{helper_method}(*args, &block)" unless source.present?
|
38
|
+
|
39
|
+
"#{source}.instance_method(:#{helper_method}).bind(self).call(*args, &block)"
|
40
|
+
end
|
19
41
|
end
|
20
42
|
end
|
metadata
CHANGED
@@ -1,14 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: view_component
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.23.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- ViewComponent Team
|
8
|
-
autorequire:
|
9
8
|
bindir: bin
|
10
9
|
cert_chain: []
|
11
|
-
date:
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
12
11
|
dependencies:
|
13
12
|
- !ruby/object:Gem::Dependency
|
14
13
|
name: activesupport
|
@@ -19,7 +18,7 @@ dependencies:
|
|
19
18
|
version: 5.2.0
|
20
19
|
- - "<"
|
21
20
|
- !ruby/object:Gem::Version
|
22
|
-
version: '8.
|
21
|
+
version: '8.1'
|
23
22
|
type: :runtime
|
24
23
|
prerelease: false
|
25
24
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +28,7 @@ dependencies:
|
|
29
28
|
version: 5.2.0
|
30
29
|
- - "<"
|
31
30
|
- !ruby/object:Gem::Version
|
32
|
-
version: '8.
|
31
|
+
version: '8.1'
|
33
32
|
- !ruby/object:Gem::Dependency
|
34
33
|
name: method_source
|
35
34
|
requirement: !ruby/object:Gem::Requirement
|
@@ -50,14 +49,28 @@ dependencies:
|
|
50
49
|
requirements:
|
51
50
|
- - "~>"
|
52
51
|
- !ruby/object:Gem::Version
|
53
|
-
version: '1
|
52
|
+
version: '1'
|
54
53
|
type: :runtime
|
55
54
|
prerelease: false
|
56
55
|
version_requirements: !ruby/object:Gem::Requirement
|
57
56
|
requirements:
|
58
57
|
- - "~>"
|
59
58
|
- !ruby/object:Gem::Version
|
60
|
-
version: '1
|
59
|
+
version: '1'
|
60
|
+
- !ruby/object:Gem::Dependency
|
61
|
+
name: allocation_stats
|
62
|
+
requirement: !ruby/object:Gem::Requirement
|
63
|
+
requirements:
|
64
|
+
- - "~>"
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 0.1.5
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: !ruby/object:Gem::Requirement
|
70
|
+
requirements:
|
71
|
+
- - "~>"
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: 0.1.5
|
61
74
|
- !ruby/object:Gem::Dependency
|
62
75
|
name: appraisal
|
63
76
|
requirement: !ruby/object:Gem::Requirement
|
@@ -310,6 +323,20 @@ dependencies:
|
|
310
323
|
- - '='
|
311
324
|
- !ruby/object:Gem::Version
|
312
325
|
version: 4.9.0
|
326
|
+
- !ruby/object:Gem::Dependency
|
327
|
+
name: sprockets-rails
|
328
|
+
requirement: !ruby/object:Gem::Requirement
|
329
|
+
requirements:
|
330
|
+
- - "~>"
|
331
|
+
- !ruby/object:Gem::Version
|
332
|
+
version: 3.4.2
|
333
|
+
type: :development
|
334
|
+
prerelease: false
|
335
|
+
version_requirements: !ruby/object:Gem::Requirement
|
336
|
+
requirements:
|
337
|
+
- - "~>"
|
338
|
+
- !ruby/object:Gem::Version
|
339
|
+
version: 3.4.2
|
313
340
|
- !ruby/object:Gem::Dependency
|
314
341
|
name: standard
|
315
342
|
requirement: !ruby/object:Gem::Requirement
|
@@ -367,19 +394,19 @@ dependencies:
|
|
367
394
|
- !ruby/object:Gem::Version
|
368
395
|
version: '5.1'
|
369
396
|
- !ruby/object:Gem::Dependency
|
370
|
-
name:
|
397
|
+
name: turbo-rails
|
371
398
|
requirement: !ruby/object:Gem::Requirement
|
372
399
|
requirements:
|
373
400
|
- - "~>"
|
374
401
|
- !ruby/object:Gem::Version
|
375
|
-
version:
|
402
|
+
version: '1'
|
376
403
|
type: :development
|
377
404
|
prerelease: false
|
378
405
|
version_requirements: !ruby/object:Gem::Requirement
|
379
406
|
requirements:
|
380
407
|
- - "~>"
|
381
408
|
- !ruby/object:Gem::Version
|
382
|
-
version:
|
409
|
+
version: '1'
|
383
410
|
- !ruby/object:Gem::Dependency
|
384
411
|
name: warning
|
385
412
|
requirement: !ruby/object:Gem::Requirement
|
@@ -464,8 +491,76 @@ dependencies:
|
|
464
491
|
- - ">="
|
465
492
|
- !ruby/object:Gem::Version
|
466
493
|
version: '0'
|
467
|
-
|
468
|
-
|
494
|
+
- !ruby/object:Gem::Dependency
|
495
|
+
name: base64
|
496
|
+
requirement: !ruby/object:Gem::Requirement
|
497
|
+
requirements:
|
498
|
+
- - ">="
|
499
|
+
- !ruby/object:Gem::Version
|
500
|
+
version: '0'
|
501
|
+
type: :development
|
502
|
+
prerelease: false
|
503
|
+
version_requirements: !ruby/object:Gem::Requirement
|
504
|
+
requirements:
|
505
|
+
- - ">="
|
506
|
+
- !ruby/object:Gem::Version
|
507
|
+
version: '0'
|
508
|
+
- !ruby/object:Gem::Dependency
|
509
|
+
name: bigdecimal
|
510
|
+
requirement: !ruby/object:Gem::Requirement
|
511
|
+
requirements:
|
512
|
+
- - ">="
|
513
|
+
- !ruby/object:Gem::Version
|
514
|
+
version: '0'
|
515
|
+
type: :development
|
516
|
+
prerelease: false
|
517
|
+
version_requirements: !ruby/object:Gem::Requirement
|
518
|
+
requirements:
|
519
|
+
- - ">="
|
520
|
+
- !ruby/object:Gem::Version
|
521
|
+
version: '0'
|
522
|
+
- !ruby/object:Gem::Dependency
|
523
|
+
name: drb
|
524
|
+
requirement: !ruby/object:Gem::Requirement
|
525
|
+
requirements:
|
526
|
+
- - ">="
|
527
|
+
- !ruby/object:Gem::Version
|
528
|
+
version: '0'
|
529
|
+
type: :development
|
530
|
+
prerelease: false
|
531
|
+
version_requirements: !ruby/object:Gem::Requirement
|
532
|
+
requirements:
|
533
|
+
- - ">="
|
534
|
+
- !ruby/object:Gem::Version
|
535
|
+
version: '0'
|
536
|
+
- !ruby/object:Gem::Dependency
|
537
|
+
name: mutex_m
|
538
|
+
requirement: !ruby/object:Gem::Requirement
|
539
|
+
requirements:
|
540
|
+
- - ">="
|
541
|
+
- !ruby/object:Gem::Version
|
542
|
+
version: '0'
|
543
|
+
type: :development
|
544
|
+
prerelease: false
|
545
|
+
version_requirements: !ruby/object:Gem::Requirement
|
546
|
+
requirements:
|
547
|
+
- - ">="
|
548
|
+
- !ruby/object:Gem::Version
|
549
|
+
version: '0'
|
550
|
+
- !ruby/object:Gem::Dependency
|
551
|
+
name: propshaft
|
552
|
+
requirement: !ruby/object:Gem::Requirement
|
553
|
+
requirements:
|
554
|
+
- - "~>"
|
555
|
+
- !ruby/object:Gem::Version
|
556
|
+
version: 1.1.0
|
557
|
+
type: :development
|
558
|
+
prerelease: false
|
559
|
+
version_requirements: !ruby/object:Gem::Requirement
|
560
|
+
requirements:
|
561
|
+
- - "~>"
|
562
|
+
- !ruby/object:Gem::Version
|
563
|
+
version: 1.1.0
|
469
564
|
executables: []
|
470
565
|
extensions: []
|
471
566
|
extra_rdoc_files: []
|
@@ -485,7 +580,6 @@ files:
|
|
485
580
|
- app/views/view_components/previews.html.erb
|
486
581
|
- docs/CHANGELOG.md
|
487
582
|
- lib/rails/generators/abstract_generator.rb
|
488
|
-
- lib/rails/generators/component/USAGE
|
489
583
|
- lib/rails/generators/component/component_generator.rb
|
490
584
|
- lib/rails/generators/component/templates/component.rb.tt
|
491
585
|
- lib/rails/generators/erb/component_generator.rb
|
@@ -501,6 +595,7 @@ files:
|
|
501
595
|
- lib/rails/generators/slim/templates/component.html.slim.tt
|
502
596
|
- lib/rails/generators/stimulus/component_generator.rb
|
503
597
|
- lib/rails/generators/stimulus/templates/component_controller.js.tt
|
598
|
+
- lib/rails/generators/stimulus/templates/component_controller.ts.tt
|
504
599
|
- lib/rails/generators/tailwindcss/component_generator.rb
|
505
600
|
- lib/rails/generators/tailwindcss/templates/component.html.erb.tt
|
506
601
|
- lib/rails/generators/test_unit/component_generator.rb
|
@@ -513,9 +608,8 @@ files:
|
|
513
608
|
- lib/view_component/compiler.rb
|
514
609
|
- lib/view_component/component_error.rb
|
515
610
|
- lib/view_component/config.rb
|
611
|
+
- lib/view_component/configurable.rb
|
516
612
|
- lib/view_component/deprecation.rb
|
517
|
-
- lib/view_component/docs_builder_component.html.erb
|
518
|
-
- lib/view_component/docs_builder_component.rb
|
519
613
|
- lib/view_component/engine.rb
|
520
614
|
- lib/view_component/errors.rb
|
521
615
|
- lib/view_component/inline_template.rb
|
@@ -530,15 +624,16 @@ files:
|
|
530
624
|
- lib/view_component/rendering_monkey_patch.rb
|
531
625
|
- lib/view_component/slot.rb
|
532
626
|
- lib/view_component/slotable.rb
|
627
|
+
- lib/view_component/slotable_default.rb
|
533
628
|
- lib/view_component/system_test_case.rb
|
534
629
|
- lib/view_component/system_test_helpers.rb
|
630
|
+
- lib/view_component/template.rb
|
535
631
|
- lib/view_component/test_case.rb
|
536
632
|
- lib/view_component/test_helpers.rb
|
537
633
|
- lib/view_component/translatable.rb
|
538
634
|
- lib/view_component/use_helpers.rb
|
539
635
|
- lib/view_component/version.rb
|
540
636
|
- lib/view_component/with_content_helper.rb
|
541
|
-
- lib/yard/mattr_accessor_handler.rb
|
542
637
|
homepage: https://viewcomponent.org
|
543
638
|
licenses:
|
544
639
|
- MIT
|
@@ -546,7 +641,6 @@ metadata:
|
|
546
641
|
allowed_push_host: https://rubygems.org
|
547
642
|
source_code_uri: https://github.com/viewcomponent/view_component
|
548
643
|
changelog_uri: https://github.com/ViewComponent/view_component/blob/main/docs/CHANGELOG.md
|
549
|
-
post_install_message:
|
550
644
|
rdoc_options: []
|
551
645
|
require_paths:
|
552
646
|
- lib
|
@@ -561,8 +655,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
561
655
|
- !ruby/object:Gem::Version
|
562
656
|
version: '0'
|
563
657
|
requirements: []
|
564
|
-
rubygems_version: 3.
|
565
|
-
signing_key:
|
658
|
+
rubygems_version: 3.6.8
|
566
659
|
specification_version: 4
|
567
660
|
summary: A framework for building reusable, testable & encapsulated view components
|
568
661
|
in Ruby on Rails.
|
@@ -1,13 +0,0 @@
|
|
1
|
-
Description:
|
2
|
-
============
|
3
|
-
Creates a new component and test.
|
4
|
-
Pass the component name, either CamelCased or under_scored, and an optional list of attributes as arguments.
|
5
|
-
|
6
|
-
Example:
|
7
|
-
========
|
8
|
-
bin/rails generate component Profile name age
|
9
|
-
|
10
|
-
creates a Profile component and test:
|
11
|
-
Component: app/components/profile_component.rb
|
12
|
-
Template: app/components/profile_component.html.erb
|
13
|
-
Test: test/components/profile_component_test.rb
|
@@ -1,22 +0,0 @@
|
|
1
|
-
---
|
2
|
-
layout: default
|
3
|
-
title: API reference
|
4
|
-
nav_order: 3
|
5
|
-
---
|
6
|
-
|
7
|
-
<!-- Warning: AUTO-GENERATED file, don't edit. Add code comments to your Ruby instead <3 -->
|
8
|
-
|
9
|
-
# API
|
10
|
-
|
11
|
-
<% @sections.each do |section| %>
|
12
|
-
## <%= section.heading %>
|
13
|
-
|
14
|
-
<% section.methods.each do |method| %>
|
15
|
-
### <%== render ViewComponent::DocsBuilderComponent::MethodDoc.new(method, section.show_types) %>
|
16
|
-
|
17
|
-
<% end %>
|
18
|
-
<% section.error_klasses.each do |error_klass| %>
|
19
|
-
### <%== render ViewComponent::DocsBuilderComponent::ErrorKlassDoc.new(error_klass, section.show_types) %>
|
20
|
-
|
21
|
-
<% end %>
|
22
|
-
<% end %>
|