moduleLookbookclassPreviewEntity<EntityincludeEntityTreeNodeincludeFeatureChecksattr_reader:preview_class,:preview_class_name,:preview_methods,:file_path,:metadatadelegate:notes,:notes?,to: :metadatadefinitialize(code_object,preview_class)@preview_class=preview_class@preview_class_name=code_object.path@preview_methods=code_object.meths@file_path=Pathname(code_object.file)@metadata=PreviewMetadata.new(code_object)enddefid@id||=Utils.id(metadata.fetch(:id,lookup_path))enddefname@name||=Utils.name(File.basename(lookup_path))enddeflabelmetadata.fetch(:label,super)enddefhidden?returntrueifchildren.select(&:visible?).none?metadata.fetch(:hidden,super)enddefstatusmetadata.status(default: Lookbook.config.preview_default_status)enddefurl_paramcaseLookbook.config.preview_url_param.to_symwhen:uuiduuidwhen:named_uuid"#{name}_#{uuid}"elsenameendenddeflookup_pathdefault_lookup_path=preview_class_name.underscore.downcase.gsub("_component","").gsub("_preview","")directory_override=metadata.fetch(:location,metadata.fetch(:logical_path,nil))ifdirectory_override.nil?default_lookup_pathelseUtils.strip_slashes("#{directory_override}/#{default_lookup_path.split("/").last}")endenddefurl_pathpreview_page_path(self)enddefrelative_file_pathPathname.new(file_path).relative_path_from(Pathname.new(base_directory))enddefreadme_pathifdefault_readme_path.present?&&File.exist?(default_readme_path)default_readme_pathendenddefreadme_pageunlessreadme_path.nil?PreviewPageEntity.new(readme_path,File.read(readme_path),url_path: url_path,lookup_path: lookup_path,options: {label: label,title: title})endenddefdisplay_optionsDataObject.new(Inspector.display_options_defaults,metadata.display_options)enddeflayoutifmailer_preview?"layouts/lookbook/mailer_preview"elsepreview_class.instance_variable_get(:@layout)endenddefscenarios@scenarios||=beginpublic_methods=preview_class.public_instance_methods(false)method_objects=preview_methods.select{|m|public_methods.include?(m.name)}scenarios=method_objects.map.with_index(1)do|code_object,i|ScenarioEntity.new(code_object,self,default_priority: i)endscenarios.sort!endenddefinspector_targets@inspector_targets||=ifmailer_preview?scenarios.mapdo|scenario|InspectorTargetEntity.new(scenario.name,self,[scenario],default_priority: scenario.priority)endelsetargets=[]scenarios.each.with_index(1)do|scenario,i|ifscenario.group.nil?targets<<InspectorTargetEntity.new(scenario.name,self,[scenario],default_priority: scenario.priority)elsetarget_name=scenario.group.presence||name.pluralizetarget=targets.find{_1.name==Utils.name(target_name)}iftargettarget.scenarios<<scenarioelsetargets<<InspectorTargetEntity.new(target_name,self,[scenario],default_priority: i)end# Hidden so won't show in navigation but can still be accessed via it's URLtargets<<InspectorTargetEntity.new(scenario.name,self,[scenario],hidden: true)endendtargetsendenddefresolve_target(identifier)returnidentifierifidentifier.is_a?(InspectorTargetEntity)ifidentifier.is_a?(String)||identifier.is_a?(Symbol)inspector_targets.find{[_1.id,_1.uuid].include?(identifier.to_s)}elseraiseArgumentError,"Invalid preview target identifier"endenddefmailer_preview?action_mailer_available?&&preview_class.ancestors.include?(::ActionMailer::Preview)enddefparentifparent_lookup_path.present?Previews.directories.find_or_add(parent_lookup_path,File.dirname(file_path))endenddefchildren@children||=inspector_targets.sortenddefto_h{entity: "preview",id: id,uuid: uuid,name: name,label: label,hidden: hidden?,lookup_path: lookup_path,url_path: url_path,file_path: file_path,scenarios: scenarios.map(&:to_h)}endprivatedefdefault_readme_pathpreview_basename=File.basename(file_path)page_extensions_glob="{#{Lookbook.config.page_extensions.join(",")}}"readme_path=Dir["#{preview_basename}.#{page_extensions_glob}"].firstPathname(readme_path)ifreadme_pathenddefbase_directory@base_directory||=begindirectories=Previews.preview_paths.map(&:to_s).sort_by{|path|path.split("/").size}.reversedirectories.find{|dir|file_path.to_s.start_with?(dir)}endendendend