class RailsToolViews::Component
An immutable renderer, schema, version, and authorization contract.
Constants
- CONTEXT
-
A ViewComponent opts into these by naming them as initializer keywords.
Attributes
Public Class Methods
# File lib/rails_tool_views/core.rb, line 191 def initialize(key, description:, schema:, partial: nil, component: nil, policy: nil, actions: {}, expose_to: [], version: "1") @key = key.to_s.freeze raise Error.new("INVALID_COMPONENT") unless @key.match?(/\A[a-z][a-z0-9_]{0,63}\z/) @description = Data.reference(description, code: "INVALID_COMPONENT") @version = Data.reference(version.to_s, code: "INVALID_COMPONENT") @schema = Schema.new(schema) if (!!partial == !!component) || (partial && (!partial.is_a?(String) || !partial.match?(/\A[a-zA-Z0-9_\/]+\z/))) || (component && (!component.is_a?(Class) || component.name.nil?)) raise Error.new("INVALID_RENDERER") end @partial, @component, @policy = partial&.dup&.freeze, component, policy keywords = component ? component.instance_method(:initialize).parameters.filter_map { |kind, name| name if %i[key keyreq].include?(kind) } : [] @context = (CONTEXT & keywords).freeze raise Error.new("INVALID_COMPONENT") if (@context.map(&:to_s) & @schema.json.fetch("properties", {}).keys).any? @expose_to = expose_to.map(&:to_sym).freeze @actions = actions.to_h do |name, definition| name = name.to_s.freeze raise Error.new("INVALID_ACTION") unless name.match?(/\A[a-z][a-z0-9_]{0,63}\z/) && (definition.keys - %i[schema policy handler]).empty? && definition[:handler].respond_to?(:call) [name, Action.new(key: name, schema: Schema.new(definition.fetch(:schema)), policy: definition[:policy], handler: definition[:handler]).freeze] end.freeze @digest = Data.digest(key: @key, version: @version, schema: @schema.json, renderer: @partial || @component.name, actions: @actions.transform_values { |action| action.schema.json }, contract_version: 1).freeze freeze end
Builds an immutable component with exactly one trusted renderer.