herb 0.10.4 → 0.11.0
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/Makefile +16 -6
- data/README.md +36 -119
- data/Rakefile +2 -11
- data/config/action_view_helpers/actioncable/action_cable_helper/action_cable_meta_tag.yml +12 -8
- data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy?.yml +9 -6
- data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy_nonce.yml +9 -6
- data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_path.yml +20 -12
- data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_url.yml +30 -18
- data/config/action_view_helpers/actionpack/request_forgery_protection/form_authenticity_token.yml +15 -9
- data/config/action_view_helpers/actionpack/request_forgery_protection/protect_against_forgery?.yml +9 -6
- data/config/action_view_helpers/actiontext/content_helper/render_action_text_content.yml +15 -9
- data/config/action_view_helpers/actiontext/content_helper/sanitize_action_text_content.yml +15 -9
- data/config/action_view_helpers/actiontext/tag_helper/rich_textarea_tag.yml +34 -22
- data/config/action_view_helpers/actionview/active_model_helper/error_message.yml +9 -6
- data/config/action_view_helpers/actionview/active_model_helper/error_wrapping.yml +9 -6
- data/config/action_view_helpers/actionview/active_model_helper/object.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/apply_stylesheet_media_default.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/audio_tag.yml +40 -27
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_discovery_link_tag.yml +37 -23
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_scripts.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_styles.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/favicon_link_tag.yml +32 -22
- data/config/action_view_helpers/actionview/asset_tag_helper/image_decoding.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/image_loading.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/image_tag.yml +67 -46
- data/config/action_view_helpers/actionview/asset_tag_helper/javascript_include_tag.yml +58 -39
- data/config/action_view_helpers/actionview/asset_tag_helper/picture_tag.yml +22 -14
- data/config/action_view_helpers/actionview/asset_tag_helper/preload_link_tag.yml +45 -30
- data/config/action_view_helpers/actionview/asset_tag_helper/preload_links_header.yml +9 -6
- data/config/action_view_helpers/actionview/asset_tag_helper/stylesheet_link_tag.yml +49 -30
- data/config/action_view_helpers/actionview/asset_tag_helper/video_tag.yml +53 -35
- data/config/action_view_helpers/actionview/asset_url_helper/asset_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/asset_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/audio_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/audio_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_extname.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_host.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_path.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/font_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/font_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/image_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/image_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/javascript_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/javascript_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/public_compute_asset_path.yml +9 -6
- data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_url.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/video_path.yml +16 -10
- data/config/action_view_helpers/actionview/asset_url_helper/video_url.yml +16 -10
- data/config/action_view_helpers/actionview/atom_feed_helper/atom_feed.yml +52 -27
- data/config/action_view_helpers/actionview/cache_helper/cache.yml +25 -15
- data/config/action_view_helpers/actionview/cache_helper/cache_fragment_name.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/cache_if.yml +20 -12
- data/config/action_view_helpers/actionview/cache_helper/cache_unless.yml +20 -12
- data/config/action_view_helpers/actionview/cache_helper/caching_predicate.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/digest_path_from_template.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/fragment_name_with_digest.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/read_fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/uncacheable.yml +9 -6
- data/config/action_view_helpers/actionview/cache_helper/write_fragment_for.yml +9 -6
- data/config/action_view_helpers/actionview/capture_helper/capture.yml +9 -6
- data/config/action_view_helpers/actionview/capture_helper/content_for.yml +20 -12
- data/config/action_view_helpers/actionview/capture_helper/content_for_predicate.yml +15 -9
- data/config/action_view_helpers/actionview/capture_helper/provide.yml +15 -9
- data/config/action_view_helpers/actionview/capture_helper/with_output_buffer.yml +9 -6
- data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prepend_content_exfiltration_prevention.yml +9 -6
- data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prevent_content_exfiltration.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/action_name.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/assign_controller.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller_name.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/controller_path.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/cookies.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/flash.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/headers.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/logger.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/params.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/request.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/request_forgery_protection_token.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/response.yml +9 -6
- data/config/action_view_helpers/actionview/controller_helper/session.yml +9 -6
- data/config/action_view_helpers/actionview/csp_helper/csp_meta_tag.yml +18 -11
- data/config/action_view_helpers/actionview/csrf_helper/csrf_meta_tags.yml +16 -10
- data/config/action_view_helpers/actionview/date_helper/date_select.yml +85 -51
- data/config/action_view_helpers/actionview/date_helper/datetime_select.yml +65 -39
- data/config/action_view_helpers/actionview/date_helper/distance_of_time_in_words.yml +30 -18
- data/config/action_view_helpers/actionview/date_helper/relative_time_in_words.yml +35 -21
- data/config/action_view_helpers/actionview/date_helper/select_date.yml +50 -30
- data/config/action_view_helpers/actionview/date_helper/select_datetime.yml +65 -39
- data/config/action_view_helpers/actionview/date_helper/select_day.yml +40 -24
- data/config/action_view_helpers/actionview/date_helper/select_hour.yml +50 -30
- data/config/action_view_helpers/actionview/date_helper/select_minute.yml +40 -24
- data/config/action_view_helpers/actionview/date_helper/select_month.yml +60 -36
- data/config/action_view_helpers/actionview/date_helper/select_second.yml +35 -21
- data/config/action_view_helpers/actionview/date_helper/select_time.yml +55 -33
- data/config/action_view_helpers/actionview/date_helper/select_year.yml +45 -27
- data/config/action_view_helpers/actionview/date_helper/time_ago_in_words.yml +21 -13
- data/config/action_view_helpers/actionview/date_helper/time_select.yml +60 -36
- data/config/action_view_helpers/actionview/date_helper/time_tag.yml +32 -20
- data/config/action_view_helpers/actionview/debug_helper/debug.yml +15 -9
- data/config/action_view_helpers/actionview/form_builder/button.yml +60 -0
- data/config/action_view_helpers/actionview/form_builder/submit.yml +48 -0
- data/config/action_view_helpers/actionview/form_helper/apply_form_for_options.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/checkbox.yml +41 -25
- data/config/action_view_helpers/actionview/form_helper/color_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/date_field.yml +35 -21
- data/config/action_view_helpers/actionview/form_helper/datetime_field.yml +41 -25
- data/config/action_view_helpers/actionview/form_helper/email_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/emitted_hidden_id.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/fields.yml +37 -18
- data/config/action_view_helpers/actionview/form_helper/fields_for.yml +33 -15
- data/config/action_view_helpers/actionview/form_helper/file_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/form_for.yml +45 -24
- data/config/action_view_helpers/actionview/form_helper/form_with.yml +56 -30
- data/config/action_view_helpers/actionview/form_helper/form_with_generates_ids.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/form_with_generates_remote_forms.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/hidden_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/label.yml +52 -27
- data/config/action_view_helpers/actionview/form_helper/month_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/multipart.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/multiple_file_field_include_hidden.yml +9 -6
- data/config/action_view_helpers/actionview/form_helper/number_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/password_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/radio_button.yml +30 -18
- data/config/action_view_helpers/actionview/form_helper/range_field.yml +45 -27
- data/config/action_view_helpers/actionview/form_helper/search_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/telephone_field.yml +26 -16
- data/config/action_view_helpers/actionview/form_helper/text_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/textarea.yml +31 -19
- data/config/action_view_helpers/actionview/form_helper/time_field.yml +40 -24
- data/config/action_view_helpers/actionview/form_helper/url_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_helper/week_field.yml +25 -15
- data/config/action_view_helpers/actionview/form_options_helper/collection_checkboxes.yml +58 -31
- data/config/action_view_helpers/actionview/form_options_helper/collection_radio_buttons.yml +57 -30
- data/config/action_view_helpers/actionview/form_options_helper/collection_select.yml +65 -39
- data/config/action_view_helpers/actionview/form_options_helper/grouped_collection_select.yml +65 -39
- data/config/action_view_helpers/actionview/form_options_helper/grouped_options_for_select.yml +35 -21
- data/config/action_view_helpers/actionview/form_options_helper/option_groups_from_collection_for_select.yml +40 -24
- data/config/action_view_helpers/actionview/form_options_helper/options_for_select.yml +20 -12
- data/config/action_view_helpers/actionview/form_options_helper/options_from_collection_for_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_options_helper/select.yml +60 -36
- data/config/action_view_helpers/actionview/form_options_helper/time_zone_options_for_select.yml +25 -15
- data/config/action_view_helpers/actionview/form_options_helper/time_zone_select.yml +50 -30
- data/config/action_view_helpers/actionview/form_options_helper/weekday_options_for_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_options_helper/weekday_select.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/button_tag.yml +39 -21
- data/config/action_view_helpers/actionview/form_tag_helper/checkbox_tag.yml +33 -21
- data/config/action_view_helpers/actionview/form_tag_helper/color_field_tag.yml +26 -17
- data/config/action_view_helpers/actionview/form_tag_helper/date_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/datetime_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/form_tag_helper/default_enforce_utf8.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/email_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/embed_authenticity_token_in_remote_forms.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/field_id.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/field_name.yml +30 -18
- data/config/action_view_helpers/actionview/form_tag_helper/field_set_tag.yml +23 -15
- data/config/action_view_helpers/actionview/form_tag_helper/file_field_tag.yml +35 -22
- data/config/action_view_helpers/actionview/form_tag_helper/form_tag.yml +38 -24
- data/config/action_view_helpers/actionview/form_tag_helper/hidden_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/image_submit_tag.yml +31 -21
- data/config/action_view_helpers/actionview/form_tag_helper/label_tag.yml +33 -17
- data/config/action_view_helpers/actionview/form_tag_helper/month_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/number_field_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/password_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/radio_button_tag.yml +32 -20
- data/config/action_view_helpers/actionview/form_tag_helper/range_field_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/search_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/select_tag.yml +47 -29
- data/config/action_view_helpers/actionview/form_tag_helper/submit_tag.yml +33 -21
- data/config/action_view_helpers/actionview/form_tag_helper/telephone_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/form_tag_helper/text_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/textarea_tag.yml +31 -20
- data/config/action_view_helpers/actionview/form_tag_helper/time_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/url_field_tag.yml +27 -17
- data/config/action_view_helpers/actionview/form_tag_helper/utf8_enforcer_tag.yml +9 -6
- data/config/action_view_helpers/actionview/form_tag_helper/week_field_tag.yml +28 -18
- data/config/action_view_helpers/actionview/javascript_helper/escape_javascript.yml +16 -10
- data/config/action_view_helpers/actionview/javascript_helper/javascript_cdata_section.yml +9 -6
- data/config/action_view_helpers/actionview/javascript_helper/javascript_tag.yml +41 -27
- data/config/action_view_helpers/actionview/number_helper/number_to_currency.yml +29 -18
- data/config/action_view_helpers/actionview/number_helper/number_to_human.yml +25 -15
- data/config/action_view_helpers/actionview/number_helper/number_to_human_size.yml +20 -12
- data/config/action_view_helpers/actionview/number_helper/number_to_percentage.yml +20 -12
- data/config/action_view_helpers/actionview/number_helper/number_to_phone.yml +33 -20
- data/config/action_view_helpers/actionview/number_helper/number_with_delimiter.yml +21 -13
- data/config/action_view_helpers/actionview/number_helper/number_with_precision.yml +25 -15
- data/config/action_view_helpers/actionview/output_safety_helper/raw.yml +15 -9
- data/config/action_view_helpers/actionview/output_safety_helper/safe_join.yml +20 -12
- data/config/action_view_helpers/actionview/output_safety_helper/to_sentence.yml +24 -15
- data/config/action_view_helpers/actionview/record_identifier/dom_class.yml +20 -12
- data/config/action_view_helpers/actionview/record_identifier/dom_id.yml +20 -12
- data/config/action_view_helpers/actionview/record_identifier/dom_target.yml +15 -9
- data/config/action_view_helpers/actionview/record_identifier/model_name_from_record_or_class.yml +9 -6
- data/config/action_view_helpers/actionview/rendering_helper/render.yml +108 -22
- data/config/action_view_helpers/actionview/sanitize_helper/sanitize.yml +25 -15
- data/config/action_view_helpers/actionview/sanitize_helper/sanitize_css.yml +15 -9
- data/config/action_view_helpers/actionview/sanitize_helper/sanitizer_vendor.yml +9 -6
- data/config/action_view_helpers/actionview/sanitize_helper/strip_links.yml +15 -9
- data/config/action_view_helpers/actionview/sanitize_helper/strip_tags.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/cdata_section.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/content_tag.yml +59 -38
- data/config/action_view_helpers/actionview/tag_helper/escape_once.yml +15 -9
- data/config/action_view_helpers/actionview/tag_helper/tag.yml +54 -31
- data/config/action_view_helpers/actionview/tag_helper/token_list.yml +16 -10
- data/config/action_view_helpers/actionview/text_helper/concat.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/current_cycle.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/cycle.yml +23 -14
- data/config/action_view_helpers/actionview/text_helper/excerpt.yml +33 -20
- data/config/action_view_helpers/actionview/text_helper/highlight.yml +37 -18
- data/config/action_view_helpers/actionview/text_helper/pluralize.yml +30 -18
- data/config/action_view_helpers/actionview/text_helper/reset_cycle.yml +15 -9
- data/config/action_view_helpers/actionview/text_helper/safe_concat.yml +9 -6
- data/config/action_view_helpers/actionview/text_helper/simple_format.yml +33 -20
- data/config/action_view_helpers/actionview/text_helper/truncate.yml +38 -23
- data/config/action_view_helpers/actionview/text_helper/word_wrap.yml +25 -15
- data/config/action_view_helpers/actionview/translation_helper/debug_missing_translation.yml +9 -6
- data/config/action_view_helpers/actionview/translation_helper/localize.yml +26 -16
- data/config/action_view_helpers/actionview/translation_helper/translate.yml +31 -19
- data/config/action_view_helpers/actionview/url_helper/button_to.yml +57 -33
- data/config/action_view_helpers/actionview/url_helper/button_to_generates_button_tag.yml +9 -6
- data/config/action_view_helpers/actionview/url_helper/current_page?.yml +25 -15
- data/config/action_view_helpers/actionview/url_helper/link_to.yml +76 -53
- data/config/action_view_helpers/actionview/url_helper/link_to_if.yml +54 -20
- data/config/action_view_helpers/actionview/url_helper/link_to_unless.yml +54 -20
- data/config/action_view_helpers/actionview/url_helper/link_to_unless_current.yml +49 -17
- data/config/action_view_helpers/actionview/url_helper/mail_to.yml +60 -34
- data/config/action_view_helpers/actionview/url_helper/phone_to.yml +40 -22
- data/config/action_view_helpers/actionview/url_helper/sms_to.yml +45 -25
- data/config/action_view_helpers/actionview/url_helper/url_for.yml +15 -9
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_import_module_tag.yml +32 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_module_preload_tags.yml +39 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_tags.yml +35 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_inline_importmap_tag.yml +32 -0
- data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_module_preload_tag.yml +35 -0
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload.yml +9 -6
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload_tag.yml +12 -8
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_method_tag.yml +17 -11
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_scroll_tag.yml +17 -11
- data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refreshes_with.yml +20 -12
- data/config/action_view_helpers/turbo-rails/frames_helper/turbo_frame_tag.yml +54 -33
- data/config/action_view_helpers/turbo-rails/includes_helper/turbo_include_tags.yml +9 -6
- data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_action_tag.yml +32 -20
- data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_refresh_tag.yml +18 -11
- data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream.yml +9 -6
- data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream_from.yml +28 -18
- data/config/html_elements.yml +597 -0
- data/config/options.yml +1 -0
- data/config/slots/components.yml +52 -0
- data/config/state/kind.yml +61 -0
- data/config/state/operators.yml +27 -0
- data/config/state/predicates.yml +39 -0
- data/config/state/transforms.yml +18 -0
- data/config/view_context_methods/actionview/base/annotate_rendered_view_with_filenames.yml +4 -4
- data/config/view_context_methods/actionview/base/assign.yml +4 -4
- data/config/view_context_methods/actionview/base/assigns.yml +4 -4
- data/config/view_context_methods/actionview/base/automatically_disable_submit_tag.yml +4 -4
- data/config/view_context_methods/actionview/base/compiled_method_container.yml +4 -4
- data/config/view_context_methods/actionview/base/config.yml +4 -4
- data/config/view_context_methods/actionview/base/default_form_builder.yml +4 -4
- data/config/view_context_methods/actionview/base/default_formats.yml +4 -4
- data/config/view_context_methods/actionview/base/field_error_proc.yml +4 -4
- data/config/view_context_methods/actionview/base/formats.yml +4 -4
- data/config/view_context_methods/actionview/base/in_rendering_context.yml +4 -4
- data/config/view_context_methods/actionview/base/locale.yml +4 -4
- data/config/view_context_methods/actionview/base/lookup_context.yml +4 -4
- data/config/view_context_methods/actionview/base/output_buffer.yml +4 -4
- data/config/view_context_methods/actionview/base/prefix_partial_path_with_controller_namespace.yml +4 -4
- data/config/view_context_methods/actionview/base/remove_hidden_field_autocomplete.yml +4 -4
- data/config/view_context_methods/actionview/base/streaming_completion_on_exception.yml +4 -4
- data/config/view_context_methods/actionview/base/view_flow.yml +4 -4
- data/config/view_context_methods/actionview/base/view_paths.yml +4 -4
- data/config/view_context_methods/actionview/base/view_renderer.yml +4 -4
- data/config/view_context_methods/actionview/template/local_assigns.yml +4 -4
- data/config/view_context_methods/activemodel/conversion/convert_to_model.yml +4 -4
- data/config/view_context_methods/activesupport/benchmarkable/benchmark.yml +4 -4
- data/config.yml +1240 -790
- data/exe/herb +2 -0
- data/ext/herb/error_helpers.c +355 -17
- data/ext/herb/error_helpers.h +1 -1
- data/ext/herb/extconf.rb +4 -2
- data/ext/herb/extension.c +137 -89
- data/ext/herb/extension_helpers.c +81 -42
- data/ext/herb/extension_helpers.h +4 -1
- data/ext/herb/nodes.c +826 -358
- data/ext/herb/nodes.h +3 -2
- data/ext/herb/parser_options_helpers.c +151 -0
- data/ext/herb/parser_options_helpers.h +14 -0
- data/herb.gemspec +2 -2
- data/lib/herb/action_view/helper_registry.rb +1358 -62
- data/lib/herb/analysis/partial_declaration.rb +140 -0
- data/lib/herb/analysis/partial_index.rb +189 -0
- data/lib/herb/analysis/partial_resolution.rb +161 -0
- data/lib/herb/analysis/partial_resolver.rb +144 -0
- data/lib/herb/analysis/project_index.rb +152 -0
- data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
- data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
- data/lib/herb/analysis/render_graph/builder.rb +376 -0
- data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
- data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
- data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
- data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
- data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
- data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
- data/lib/herb/analysis/render_graph.rb +285 -0
- data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
- data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
- data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
- data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
- data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
- data/lib/herb/analysis/ruby_locals_index.rb +165 -0
- data/lib/herb/analysis/ruby_reference.rb +67 -0
- data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
- data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
- data/lib/herb/analysis/template_dependencies.rb +562 -0
- data/lib/herb/ast/erb_render_node.rb +26 -94
- data/lib/herb/ast/helpers.rb +90 -10
- data/lib/herb/ast/herb_directive_node.rb +18 -0
- data/lib/herb/ast/node.rb +32 -2
- data/lib/herb/ast/nodes.rb +1342 -105
- data/lib/herb/backend.rb +73 -0
- data/lib/herb/bootstrap.rb +3 -7
- data/lib/herb/cli.rb +550 -32
- data/lib/herb/colors.rb +14 -0
- data/lib/herb/configuration.rb +71 -35
- data/lib/herb/defaults.yml +2 -1
- data/lib/herb/dev/assets.rb +57 -0
- data/lib/herb/dev/classifier.rb +84 -0
- data/lib/herb/dev/embedded.rb +27 -0
- data/lib/herb/dev/pipeline.rb +305 -0
- data/lib/herb/dev/protocol.rb +221 -0
- data/lib/herb/dev/runner.rb +175 -175
- data/lib/herb/dev/server.rb +89 -26
- data/lib/herb/dev/server_entry.rb +41 -6
- data/lib/herb/dev/watcher.rb +181 -0
- data/lib/herb/dev.rb +163 -0
- data/lib/herb/diagnostic/formatter.rb +88 -0
- data/lib/herb/diagnostic.rb +172 -0
- data/lib/herb/diff/operation.rb +36 -0
- data/lib/herb/diff/result.rb +62 -0
- data/lib/herb/diff.rb +10 -0
- data/lib/herb/engine/collector.rb +62 -0
- data/lib/herb/engine/compiler.rb +346 -108
- data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
- data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
- data/lib/herb/engine/component_tags/resolver.rb +32 -0
- data/lib/herb/engine/component_tags/visitor.rb +231 -0
- data/lib/herb/engine/css_inliner/inliner.rb +101 -0
- data/lib/herb/engine/css_inliner/visitor.rb +174 -0
- data/lib/herb/engine/errors.rb +122 -0
- data/lib/herb/engine/helpers.rb +82 -0
- data/lib/herb/engine/inline_render/inliner.rb +122 -0
- data/lib/herb/engine/inline_render/visitor.rb +267 -0
- data/lib/herb/engine/runtime/entry.rb +62 -0
- data/lib/herb/engine/runtime/error_page.rb +362 -0
- data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
- data/lib/herb/engine/runtime/journal/summary.rb +227 -0
- data/lib/herb/engine/runtime/journal.rb +379 -0
- data/lib/herb/engine/runtime/middleware.rb +212 -0
- data/lib/herb/engine/runtime/observations.rb +73 -0
- data/lib/herb/engine/runtime/report.rb +204 -0
- data/lib/herb/engine/runtime/session.rb +437 -0
- data/lib/herb/engine/runtime.rb +21 -0
- data/lib/herb/engine/scoped_style/channel.rb +66 -0
- data/lib/herb/engine/scoped_style/collector.rb +74 -0
- data/lib/herb/engine/scoped_style/visitor.rb +533 -0
- data/lib/herb/engine/slots/annotation.rb +98 -0
- data/lib/herb/engine/slots/bindings.rb +61 -0
- data/lib/herb/engine/slots/callee.rb +118 -0
- data/lib/herb/engine/slots/component_definitions.rb +67 -0
- data/lib/herb/engine/slots/components/async.rb +24 -0
- data/lib/herb/engine/slots/components/base.rb +132 -0
- data/lib/herb/engine/slots/components/deferred.rb +81 -0
- data/lib/herb/engine/slots/components/fallback.rb +27 -0
- data/lib/herb/engine/slots/components/fragment.rb +99 -0
- data/lib/herb/engine/slots/components/lazy.rb +24 -0
- data/lib/herb/engine/slots/components.rb +52 -0
- data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
- data/lib/herb/engine/slots/dependencies.rb +269 -0
- data/lib/herb/engine/slots/dynamics_compiler.rb +854 -0
- data/lib/herb/engine/slots/identifier.rb +35 -0
- data/lib/herb/engine/slots/manifest/channel.rb +74 -0
- data/lib/herb/engine/slots/manifest/collector.rb +75 -0
- data/lib/herb/engine/slots/markers.rb +128 -0
- data/lib/herb/engine/slots/render_bindings.rb +141 -0
- data/lib/herb/engine/slots/schema_compiler.rb +94 -0
- data/lib/herb/engine/slots/state_anchor.rb +94 -0
- data/lib/herb/engine/slots/state_compiler.rb +1326 -0
- data/lib/herb/engine/slots/state_directives.rb +854 -0
- data/lib/herb/engine/slots/state_kinds.rb +54 -0
- data/lib/herb/engine/slots/state_operators.rb +36 -0
- data/lib/herb/engine/slots/state_overrides.rb +79 -0
- data/lib/herb/engine/slots/state_predicates.rb +65 -0
- data/lib/herb/engine/slots/state_transforms.rb +42 -0
- data/lib/herb/engine/slots/statics.rb +185 -0
- data/lib/herb/engine/slots/subtree.rb +82 -0
- data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
- data/lib/herb/engine/slots/types.rb +42 -0
- data/lib/herb/engine/slots/visitor.rb +2256 -0
- data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
- data/lib/herb/engine/validators/base.rb +36 -0
- data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
- data/lib/herb/engine/validators/nesting_validator.rb +3 -3
- data/lib/herb/engine/validators/render_validator.rb +13 -33
- data/lib/herb/engine/validators/security_validator.rb +3 -17
- data/lib/herb/engine/validators.rb +43 -0
- data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
- data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
- data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
- data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
- data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
- data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
- data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
- data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
- data/lib/herb/engine.rb +218 -257
- data/lib/herb/ensure_installed.rb +43 -0
- data/lib/herb/errors.rb +646 -157
- data/lib/herb/fingerprint.rb +82 -0
- data/lib/herb/html/elements.rb +18 -0
- data/lib/herb/html/util.rb +21 -2
- data/lib/herb/lex_result.rb +0 -10
- data/lib/herb/locate.rb +163 -0
- data/lib/herb/location.rb +20 -0
- data/lib/herb/parse_result.rb +17 -11
- data/lib/herb/parser_options.rb +65 -46
- data/lib/herb/position.rb +19 -0
- data/lib/herb/prism_inspect.rb +1 -4
- data/lib/herb/project.rb +28 -15
- data/lib/herb/range.rb +5 -0
- data/lib/herb/result.rb +2 -2
- data/lib/herb/ruby_program.rb +110 -0
- data/lib/herb/source_path.rb +232 -0
- data/lib/herb/token.rb +14 -3
- data/lib/herb/version.rb +1 -1
- data/lib/herb/visitor/context/origin.rb +52 -0
- data/lib/herb/visitor/context/replacements.rb +59 -0
- data/lib/herb/visitor/context.rb +169 -0
- data/lib/herb/visitor/context_aware.rb +45 -0
- data/lib/herb/visitor/diagnostics.rb +148 -0
- data/lib/herb/visitor/experimental.rb +33 -0
- data/lib/herb/visitor/parser_option_requirements.rb +151 -0
- data/lib/herb/visitor/stack.rb +192 -0
- data/lib/herb/visitor.rb +47 -1
- data/lib/herb/warnings.rb +25 -0
- data/lib/herb.rb +74 -63
- data/sig/herb/action_view/helper_registry.rbs +82 -10
- data/sig/herb/analysis/partial_declaration.rbs +80 -0
- data/sig/herb/analysis/partial_index.rbs +66 -0
- data/sig/herb/analysis/partial_resolution.rbs +57 -0
- data/sig/herb/analysis/partial_resolver.rbs +76 -0
- data/sig/herb/analysis/project_index.rbs +57 -0
- data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
- data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
- data/sig/herb/analysis/render_graph/builder.rbs +180 -0
- data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
- data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
- data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
- data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
- data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
- data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
- data/sig/herb/analysis/render_graph.rbs +83 -0
- data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
- data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
- data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
- data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
- data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
- data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
- data/sig/herb/analysis/ruby_reference.rbs +28 -0
- data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
- data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
- data/sig/herb/analysis/template_dependencies.rbs +125 -0
- data/sig/herb/ast/erb_render_node.rbs +10 -2
- data/sig/herb/ast/helpers.rbs +31 -1
- data/sig/herb/ast/herb_directive_node.rbs +13 -0
- data/sig/herb/ast/node.rbs +9 -0
- data/sig/herb/ast/nodes.rbs +662 -89
- data/sig/herb/backend.rbs +52 -0
- data/sig/herb/colors.rbs +3 -0
- data/sig/herb/configuration.rbs +27 -3
- data/sig/herb/dev/assets.rbs +27 -0
- data/sig/herb/dev/classifier.rbs +57 -0
- data/sig/herb/dev/embedded.rbs +21 -0
- data/sig/herb/dev/pipeline.rbs +118 -0
- data/sig/herb/dev/protocol.rbs +78 -0
- data/sig/herb/dev/runner.rbs +61 -23
- data/sig/herb/dev/server.rbs +49 -22
- data/sig/herb/dev/server_entry.rbs +46 -21
- data/sig/herb/dev/watcher.rbs +84 -0
- data/sig/herb/dev.rbs +58 -0
- data/sig/herb/diagnostic/formatter.rbs +28 -0
- data/sig/herb/diagnostic.rbs +88 -0
- data/sig/herb/diff/operation.rbs +36 -0
- data/sig/herb/diff/result.rbs +36 -0
- data/sig/herb/diff.rbs +6 -0
- data/sig/herb/engine/collector.rbs +48 -0
- data/sig/herb/engine/compiler.rbs +62 -23
- data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
- data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
- data/sig/herb/engine/component_tags/resolver.rbs +25 -0
- data/sig/herb/engine/component_tags/visitor.rbs +69 -0
- data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
- data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
- data/sig/herb/engine/errors.rbs +68 -0
- data/sig/herb/engine/helpers.rbs +28 -0
- data/sig/herb/engine/inline_render/inliner.rbs +39 -0
- data/sig/herb/engine/inline_render/visitor.rbs +104 -0
- data/sig/herb/engine/runtime/entry.rbs +43 -0
- data/sig/herb/engine/runtime/error_page.rbs +115 -0
- data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
- data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
- data/sig/herb/engine/runtime/journal.rbs +126 -0
- data/sig/herb/engine/runtime/middleware.rbs +96 -0
- data/sig/herb/engine/runtime/observations.rbs +38 -0
- data/sig/herb/engine/runtime/report.rbs +97 -0
- data/sig/herb/engine/runtime/session.rbs +233 -0
- data/sig/herb/engine/runtime.rbs +14 -0
- data/sig/herb/engine/scoped_style/channel.rbs +45 -0
- data/sig/herb/engine/scoped_style/collector.rbs +45 -0
- data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
- data/sig/herb/engine/slots/annotation.rbs +72 -0
- data/sig/herb/engine/slots/bindings.rbs +34 -0
- data/sig/herb/engine/slots/callee.rbs +62 -0
- data/sig/herb/engine/slots/component_definitions.rbs +19 -0
- data/sig/herb/engine/slots/components/async.rbs +20 -0
- data/sig/herb/engine/slots/components/base.rbs +60 -0
- data/sig/herb/engine/slots/components/deferred.rbs +29 -0
- data/sig/herb/engine/slots/components/fallback.rbs +21 -0
- data/sig/herb/engine/slots/components/fragment.rbs +34 -0
- data/sig/herb/engine/slots/components/lazy.rbs +20 -0
- data/sig/herb/engine/slots/components.rbs +30 -0
- data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
- data/sig/herb/engine/slots/dependencies.rbs +94 -0
- data/sig/herb/engine/slots/dynamics_compiler.rbs +349 -0
- data/sig/herb/engine/slots/identifier.rbs +19 -0
- data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
- data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
- data/sig/herb/engine/slots/markers.rbs +85 -0
- data/sig/herb/engine/slots/render_bindings.rbs +69 -0
- data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
- data/sig/herb/engine/slots/state_anchor.rbs +41 -0
- data/sig/herb/engine/slots/state_compiler.rbs +258 -0
- data/sig/herb/engine/slots/state_directives.rbs +278 -0
- data/sig/herb/engine/slots/state_kinds.rbs +24 -0
- data/sig/herb/engine/slots/state_operators.rbs +19 -0
- data/sig/herb/engine/slots/state_overrides.rbs +33 -0
- data/sig/herb/engine/slots/state_predicates.rbs +16 -0
- data/sig/herb/engine/slots/state_transforms.rbs +15 -0
- data/sig/herb/engine/slots/statics.rbs +67 -0
- data/sig/herb/engine/slots/subtree.rbs +49 -0
- data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
- data/sig/herb/engine/slots/types.rbs +46 -0
- data/sig/herb/engine/slots/visitor.rbs +599 -0
- data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
- data/sig/herb/engine/validators/base.rbs +28 -0
- data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
- data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
- data/sig/herb/engine/validators/render_validator.rbs +2 -6
- data/sig/herb/engine/validators/security_validator.rbs +1 -3
- data/sig/herb/engine/validators.rbs +21 -0
- data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
- data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
- data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
- data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
- data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
- data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
- data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
- data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
- data/sig/herb/engine.rbs +47 -41
- data/sig/herb/ensure_installed.rbs +9 -0
- data/sig/herb/errors.rbs +293 -0
- data/sig/herb/fingerprint.rbs +37 -0
- data/sig/herb/html/elements.rbs +19 -0
- data/sig/herb/html/util.rbs +15 -1
- data/sig/herb/lex_result.rbs +0 -6
- data/sig/herb/locate.rbs +89 -0
- data/sig/herb/location.rbs +12 -0
- data/sig/herb/parse_result.rbs +10 -8
- data/sig/herb/parser_options.rbs +47 -21
- data/sig/herb/position.rbs +11 -0
- data/sig/herb/range.rbs +3 -0
- data/sig/herb/ruby_program.rbs +51 -0
- data/sig/herb/source_path.rbs +132 -0
- data/sig/herb/token.rbs +5 -2
- data/sig/herb/visitor/context/origin.rbs +51 -0
- data/sig/herb/visitor/context/replacements.rbs +39 -0
- data/sig/herb/visitor/context.rbs +83 -0
- data/sig/herb/visitor/context_aware.rbs +32 -0
- data/sig/herb/visitor/diagnostics.rbs +82 -0
- data/sig/herb/visitor/experimental.rbs +23 -0
- data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
- data/sig/herb/visitor/stack.rbs +91 -0
- data/sig/herb/visitor.rbs +22 -0
- data/sig/herb/warnings.rbs +10 -0
- data/sig/herb.rbs +27 -10
- data/sig/serialized_ast_errors.rbs +58 -1
- data/sig/serialized_ast_nodes.rbs +58 -2
- data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
- data/src/analyze/action_view/generated_handlers.c +37 -1
- data/src/analyze/action_view/generated_handlers.h +2 -1
- data/src/analyze/action_view/helper_registry.c +1353 -58
- data/src/analyze/action_view/registry.c +10 -17
- data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
- data/src/analyze/action_view/tag_helper_node_builders.c +57 -0
- data/src/analyze/action_view/tag_helpers.c +423 -93
- data/src/analyze/analyze.c +301 -64
- data/src/analyze/analyze_helpers.c +420 -23
- data/src/analyze/builders.c +79 -51
- data/src/analyze/conditional_elements.c +13 -8
- data/src/analyze/conditional_open_tags.c +11 -5
- data/src/analyze/control_type.c +16 -1
- data/src/analyze/herb_directives.c +701 -0
- data/src/analyze/invalid_structures.c +11 -7
- data/src/analyze/iteration_nodes.c +306 -0
- data/src/analyze/missing_end.c +116 -32
- data/src/analyze/parse_errors.c +8 -3
- data/src/analyze/postfix_conditionals.c +98 -63
- data/src/analyze/prism_annotate.c +13 -4
- data/src/analyze/render_nodes.c +345 -123
- data/src/analyze/strict_locals.c +30 -26
- data/src/analyze/ternary_conditionals.c +95 -70
- data/src/analyze/transform.c +43 -1
- data/src/ast/ast_node.c +3 -13
- data/src/ast/ast_nodes.c +911 -112
- data/src/ast/ast_pretty_print.c +161 -2
- data/src/diff/herb_diff.c +8 -0
- data/src/diff/herb_diff_attributes.c +1 -0
- data/src/diff/herb_diff_children.c +4 -3
- data/src/diff/herb_diff_helpers.c +7 -1
- data/src/diff/herb_diff_nodes.c +186 -71
- data/src/diff/herb_hash_tree.c +99 -1
- data/src/errors.c +1096 -128
- data/src/extract.c +30 -8
- data/src/herb.c +30 -11
- data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
- data/src/include/analyze/action_view/helper_registry.h +28 -4
- data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
- data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
- data/src/include/analyze/analyze.h +11 -0
- data/src/include/analyze/builders.h +16 -0
- data/src/include/analyze/helpers.h +23 -2
- data/src/include/analyze/herb_directive_kinds.h +41 -0
- data/src/include/analyze/herb_directives.h +14 -0
- data/src/include/analyze/iteration_nodes.h +11 -0
- data/src/include/analyze/prism_annotate.h +3 -3
- data/src/include/analyze/ternary_conditionals.h +2 -0
- data/src/include/ast/ast_node.h +1 -5
- data/src/include/ast/ast_nodes.h +76 -2
- data/src/include/ast/ast_pretty_print.h +1 -1
- data/src/include/diff/herb_diff.h +11 -0
- data/src/include/errors.h +156 -39
- data/src/include/extract.h +11 -0
- data/src/include/herb.h +6 -0
- data/src/include/lexer/erb_openers.h +29 -0
- data/src/include/lexer/lexer_peek_helpers.h +8 -1
- data/src/include/lexer/lexer_struct.h +4 -0
- data/src/include/lexer/token.h +3 -0
- data/src/include/lexer/token_struct.h +8 -6
- data/src/include/lib/hb_allocator.h +2 -1
- data/src/include/lib/hb_array.h +2 -0
- data/src/include/lib/hb_foreach.h +1 -1
- data/src/include/lib/hb_string.h +7 -0
- data/src/include/parser/dot_notation.h +1 -1
- data/src/include/parser/foreign_content_elements.h +32 -0
- data/src/include/parser/parser.h +16 -30
- data/src/include/parser/parser_helpers.h +13 -11
- data/src/include/parser/parser_options.h +41 -0
- data/src/include/prism/ruby_parser.h +6 -0
- data/src/include/util/html_elements.h +85 -0
- data/src/include/util/html_util.h +1 -0
- data/src/include/version.h +1 -1
- data/src/lexer/lexer_peek_helpers.c +15 -1
- data/src/lexer/token.c +83 -1
- data/src/lexer.c +196 -12
- data/src/lib/hb_allocator.c +2 -0
- data/src/lib/hb_array.c +26 -0
- data/src/lib/hb_string.c +26 -0
- data/src/main.c +1 -1
- data/src/parser/dot_notation.c +4 -3
- data/src/parser/match_tags.c +66 -1
- data/src/parser/parser_helpers.c +69 -37
- data/src/parser.c +606 -383
- data/src/parser_options_defaults.c +30 -0
- data/src/prism/prism_helpers.c +3 -0
- data/src/prism/ruby_parser.c +49 -0
- data/src/util/html_util.c +11 -58
- data/src/visitor.c +77 -1
- data/templates/ext/herb/error_helpers.c.erb +1 -1
- data/templates/ext/herb/nodes.c.erb +18 -13
- data/templates/ext/herb/nodes.h.erb +2 -1
- data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
- data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
- data/templates/java/nodes.c.erb +20 -16
- data/templates/java/nodes.h.erb +3 -2
- data/templates/java/org/herb/ParserOptions.java.erb +24 -0
- data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
- data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
- data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
- data/templates/java/parser_options_helpers.c.erb +45 -0
- data/templates/java/parser_options_helpers.h.erb +10 -0
- data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
- data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
- data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
- data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
- data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
- data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
- data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
- data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
- data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
- data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
- data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
- data/templates/javascript/packages/core/src/nodes.ts.erb +82 -19
- data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
- data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
- data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
- data/templates/javascript/packages/node/extension/nodes.cpp.erb +17 -12
- data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
- data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
- data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
- data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
- data/templates/lib/herb/ast/nodes.rb.erb +16 -6
- data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
- data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
- data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
- data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
- data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
- data/templates/lib/herb/errors.rb.erb +34 -6
- data/templates/lib/herb/html/elements.rb.erb +12 -0
- data/templates/lib/herb/parser_options.rb.erb +32 -0
- data/templates/lib/herb/visitor.rb.erb +7 -1
- data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
- data/templates/rust/src/action_view_helpers.rs.erb +38 -0
- data/templates/rust/src/ast/nodes.rs.erb +24 -31
- data/templates/rust/src/errors.rs.erb +1 -1
- data/templates/rust/src/nodes.rs.erb +58 -26
- data/templates/rust/src/parser_options.rs.erb +16 -0
- data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
- data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
- data/templates/rust/src/union_types.rs.erb +7 -1
- data/templates/rust/src/visitor.rs.erb +1 -1
- data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
- data/templates/src/analyze/missing_end.c.erb +13 -5
- data/templates/src/ast/ast_nodes.c.erb +41 -2
- data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
- data/templates/src/errors.c.erb +8 -3
- data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
- data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
- data/templates/src/include/errors.h.erb +3 -1
- data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
- data/templates/src/include/parser/parser_options.h.erb +21 -0
- data/templates/src/include/util/html_elements.h.erb +28 -0
- data/templates/src/parser_options_defaults.c.erb +9 -0
- data/templates/template.rb +564 -9
- data/templates/wasm/error_helpers.cpp.erb +4 -4
- data/templates/wasm/nodes.cpp.erb +12 -12
- data/templates/wasm/nodes.h.erb +3 -3
- data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
- data/templates/wasm/parser_options_helpers.h.erb +12 -0
- metadata +306 -27
- data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
- data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
- data/lib/herb/ast.rb +0 -7
- data/lib/herb/diff_operation.rb +0 -34
- data/lib/herb/diff_result.rb +0 -59
- data/lib/herb/engine/error_formatter.rb +0 -432
- data/lib/herb/engine/parser_error_overlay.rb +0 -773
- data/lib/herb/engine/validation_error_overlay.rb +0 -182
- data/lib/herb/engine/validation_errors.rb +0 -65
- data/lib/herb/engine/validator.rb +0 -80
- data/sig/herb/ast.rbs +0 -6
- data/sig/herb/diff_operation.rbs +0 -34
- data/sig/herb/diff_result.rbs +0 -34
- data/sig/herb/engine/debug.rbs +0 -38
- data/sig/herb/engine/error_formatter.rbs +0 -47
- data/sig/herb/engine/parser_error_overlay.rbs +0 -41
- data/sig/herb/engine/validation_error_overlay.rbs +0 -35
- data/sig/herb/engine/validation_errors.rbs +0 -45
- data/sig/herb/engine/validator.rbs +0 -41
- data/sig/herb_c_extension.rbs +0 -10
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/validators.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# The validators Herb ships, and one way to ask for the ones a project has switched on.
|
|
6
|
+
#
|
|
7
|
+
# Nothing here runs unless a caller asks for it. `Herb::Engine` compiles whatever passes it is
|
|
8
|
+
# given and holds no opinion about validation, so wanting the usual set means saying so:
|
|
9
|
+
#
|
|
10
|
+
# Herb::Engine.new(source, visitors: Herb::Engine::Validators.all(fatal: false))
|
|
11
|
+
#
|
|
12
|
+
# Reading which ones are switched on lives here rather than in the engine, so that a caller
|
|
13
|
+
# that already knows what it wants never has to consult configuration at all.
|
|
14
|
+
module Validators
|
|
15
|
+
ALL: Hash[Symbol, untyped]
|
|
16
|
+
|
|
17
|
+
# : (?fatal: bool, **untyped) -> Herb::Visitor::Stack
|
|
18
|
+
def self.all: (?fatal: bool, **untyped) -> Herb::Visitor::Stack
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Replaces omitted closing tags with explicit ones, so that the compiled output always
|
|
6
|
+
# contains a closing tag, even when the template omits it.
|
|
7
|
+
#
|
|
8
|
+
# This visitor is not loaded by default. Require it explicitly and pass it to the engine:
|
|
9
|
+
#
|
|
10
|
+
# require "herb/engine/visitors/auto_close_omitted_tags_visitor"
|
|
11
|
+
#
|
|
12
|
+
# Herb::Engine.new(source, visitors: [Herb::Engine::AutoCloseOmittedTagsVisitor.new])
|
|
13
|
+
class AutoCloseOmittedTagsVisitor < Herb::Visitor
|
|
14
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
15
|
+
def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
|
|
16
|
+
|
|
17
|
+
# : () -> String
|
|
18
|
+
def inspect: () -> String
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
# : (Herb::Token, Herb::Location) -> Herb::AST::HTMLCloseTagNode
|
|
23
|
+
def explicit_close_tag: (Herb::Token, Herb::Location) -> Herb::AST::HTMLCloseTagNode
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/visitors/content_for_visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Appends HTML to the end of every element matching a tag name, and optionally a set of
|
|
6
|
+
# attribute conditions, so that the compiled output always contains it before the
|
|
7
|
+
# element's closing tag.
|
|
8
|
+
#
|
|
9
|
+
# An attribute condition matches on `true` when the attribute is present, on `false` when
|
|
10
|
+
# it is absent, on a `Regexp` when the attribute value matches it, and on anything else
|
|
11
|
+
# when the attribute value is equal to it. An attribute whose value is built from ERB has
|
|
12
|
+
# no value known at compile time, so it only matches the `true` condition.
|
|
13
|
+
#
|
|
14
|
+
# This visitor is not loaded by default. Require it explicitly and pass it to the engine:
|
|
15
|
+
#
|
|
16
|
+
# require "herb/engine/visitors/content_for_visitor"
|
|
17
|
+
#
|
|
18
|
+
# Herb::Engine.new(source, visitors: [
|
|
19
|
+
# Herb::Engine::ContentForVisitor.new("<p>Footer</p>", tag_name: "main", attributes: { "id" => "content" })
|
|
20
|
+
# ])
|
|
21
|
+
class ContentForVisitor < Herb::Visitor
|
|
22
|
+
# : (String?, tag_name: String, ?attributes: Hash[untyped, untyped]) -> void
|
|
23
|
+
def initialize: (String?, tag_name: String, ?attributes: Hash[untyped, untyped]) -> void
|
|
24
|
+
|
|
25
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
26
|
+
def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
|
|
27
|
+
|
|
28
|
+
# : () -> String
|
|
29
|
+
def inspect: () -> String
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# : () -> Herb::AST::RubyLiteralNode
|
|
34
|
+
def content_node: () -> Herb::AST::RubyLiteralNode
|
|
35
|
+
|
|
36
|
+
# : (Herb::AST::HTMLElementNode) -> bool
|
|
37
|
+
def matches?: (Herb::AST::HTMLElementNode) -> bool
|
|
38
|
+
|
|
39
|
+
# : (Hash[String, String?], String, untyped) -> bool
|
|
40
|
+
def attribute_matches?: (Hash[String, String?], String, untyped) -> bool
|
|
41
|
+
|
|
42
|
+
# : (Herb::AST::HTMLElementNode) -> Hash[String, String?]
|
|
43
|
+
def element_attributes: (Herb::AST::HTMLElementNode) -> Hash[String, String?]
|
|
44
|
+
|
|
45
|
+
# : (Herb::AST::HTMLAttributeNode) -> String?
|
|
46
|
+
def attribute_name: (Herb::AST::HTMLAttributeNode) -> String?
|
|
47
|
+
|
|
48
|
+
# : (Herb::AST::HTMLAttributeNode) -> String?
|
|
49
|
+
def attribute_value: (Herb::AST::HTMLAttributeNode) -> String?
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
@@ -1,9 +1,22 @@
|
|
|
1
|
-
# Generated from lib/herb/engine/debug_visitor.rb with RBS::Inline
|
|
1
|
+
# Generated from lib/herb/engine/visitors/debug_visitor.rb with RBS::Inline
|
|
2
2
|
|
|
3
3
|
module Herb
|
|
4
4
|
class Engine
|
|
5
5
|
class DebugVisitor < Herb::Visitor
|
|
6
|
-
|
|
6
|
+
include Herb::Visitor::ContextAware
|
|
7
|
+
|
|
8
|
+
# : () -> bool
|
|
9
|
+
def self.reads_erb_source?: () -> bool
|
|
10
|
+
|
|
11
|
+
# `node` adds the render occurrence to every marker, which needs `InstrumentationVisitor` in the
|
|
12
|
+
# same stack to have anything to report. Without it the value is empty on every tag, so it is
|
|
13
|
+
# asked for rather than assumed.
|
|
14
|
+
#
|
|
15
|
+
# Herb::Engine.new(source, visitors: [
|
|
16
|
+
# Herb::Engine::DebugVisitor.new(node: true),
|
|
17
|
+
# Herb::Engine::InstrumentationVisitor.new
|
|
18
|
+
# ])
|
|
19
|
+
def initialize: (?node: untyped) -> untyped
|
|
7
20
|
|
|
8
21
|
def visit_document_node: (untyped node) -> untyped
|
|
9
22
|
|
|
@@ -21,19 +34,17 @@ module Herb
|
|
|
21
34
|
|
|
22
35
|
def visit_erb_block_node: (untyped node) -> untyped
|
|
23
36
|
|
|
24
|
-
|
|
37
|
+
def visit_erb_iteration_block_node: (untyped node) -> untyped
|
|
25
38
|
|
|
26
|
-
def
|
|
39
|
+
def inspect: () -> untyped
|
|
27
40
|
|
|
28
|
-
|
|
41
|
+
private
|
|
29
42
|
|
|
30
|
-
|
|
31
|
-
# : () -> Herb::Location
|
|
32
|
-
def dummy_location: () -> Herb::Location
|
|
43
|
+
def filename: () -> untyped
|
|
33
44
|
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def
|
|
45
|
+
def relative_file_path: () -> untyped
|
|
46
|
+
|
|
47
|
+
def wrap_all_erb_nodes: (untyped node) -> untyped
|
|
37
48
|
|
|
38
49
|
def replace_erb_nodes_recursive: (untyped node) -> untyped
|
|
39
50
|
|
|
@@ -45,9 +56,11 @@ module Herb
|
|
|
45
56
|
|
|
46
57
|
def add_debug_attributes_to_element: (untyped open_tag_node) -> untyped
|
|
47
58
|
|
|
48
|
-
def
|
|
59
|
+
def create_debug_node_attribute: () -> untyped
|
|
49
60
|
|
|
50
|
-
def
|
|
61
|
+
def current_node_erb: () -> untyped
|
|
62
|
+
|
|
63
|
+
def create_debug_attribute: (untyped name, untyped value) -> untyped
|
|
51
64
|
|
|
52
65
|
def create_debug_span_for_erb: (untyped erb_node) -> untyped
|
|
53
66
|
|
|
@@ -69,8 +82,6 @@ module Herb
|
|
|
69
82
|
|
|
70
83
|
def in_excluded_context?: () -> untyped
|
|
71
84
|
|
|
72
|
-
def erb_output?: (untyped opening) -> untyped
|
|
73
|
-
|
|
74
85
|
# TODO: Rewrite using Prism Nodes once available
|
|
75
86
|
def complex_rails_helper?: (untyped code) -> untyped
|
|
76
87
|
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/visitors/html_safe_assertions_visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Wraps the receiver of every `.html_safe` call in a template with a runtime assertion, so
|
|
6
|
+
# that marking a value as HTML-safe raises when the value contains HTML that the browser
|
|
7
|
+
# executes.
|
|
8
|
+
#
|
|
9
|
+
# This visitor is not loaded by default. Require it explicitly and pass it to the engine:
|
|
10
|
+
#
|
|
11
|
+
# require "herb/engine/visitors/html_safe_assertions_visitor"
|
|
12
|
+
#
|
|
13
|
+
# Herb::Engine.new(source, visitors: [Herb::Engine::HTMLSafeAssertionsVisitor.new])
|
|
14
|
+
#
|
|
15
|
+
# `<%= @user.bio.html_safe %>` then compiles as if the template had been written as:
|
|
16
|
+
#
|
|
17
|
+
# <%= ::Herb::Engine::Runtime::HTMLSafeAssertions.check(@user.bio, file: __FILE__, line: 1, column: 1, source: "<%= @user.bio.html_safe %>", mode: :raise).html_safe %>
|
|
18
|
+
#
|
|
19
|
+
# The assertion runs on every render, and the value keeps flowing through `.html_safe`
|
|
20
|
+
# unchanged. See `Herb::Engine::Runtime::HTMLSafeAssertions` for what counts as unsafe.
|
|
21
|
+
#
|
|
22
|
+
# The calls are found in the Prism program the parser attaches to the document, which the
|
|
23
|
+
# engine enables through `required_parser_option`. Parsing an AST for this visitor by hand
|
|
24
|
+
# needs the same option:
|
|
25
|
+
#
|
|
26
|
+
# Herb.parse(source, prism_program: true)
|
|
27
|
+
class HTMLSafeAssertionsVisitor < Herb::Visitor
|
|
28
|
+
include Herb::Visitor::ContextAware
|
|
29
|
+
|
|
30
|
+
RUNTIME: ::String
|
|
31
|
+
|
|
32
|
+
MAX_SOURCE_LENGTH: ::Integer
|
|
33
|
+
|
|
34
|
+
class MissingPrismProgramError < StandardError
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# : (?mode: Symbol, ?ignore: Array[Symbol], ?file_path: (String | ::Pathname)?) -> void
|
|
38
|
+
def initialize: (?mode: Symbol, ?ignore: Array[Symbol], ?file_path: (String | ::Pathname)?) -> void
|
|
39
|
+
|
|
40
|
+
# : (Herb::AST::DocumentNode) -> void
|
|
41
|
+
def visit_document_node: (Herb::AST::DocumentNode) -> void
|
|
42
|
+
|
|
43
|
+
# : (Herb::AST::Node) -> void
|
|
44
|
+
def visit_erb_node: (Herb::AST::Node) -> void
|
|
45
|
+
|
|
46
|
+
# : () -> String
|
|
47
|
+
def inspect: () -> String
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# : (Symbol) -> Symbol
|
|
52
|
+
def validated_mode: (Symbol) -> Symbol
|
|
53
|
+
|
|
54
|
+
# : (Array[Symbol]) -> Array[Symbol]
|
|
55
|
+
def validated_ignore: (Array[Symbol]) -> Array[Symbol]
|
|
56
|
+
|
|
57
|
+
# : (Herb::AST::DocumentNode) -> void
|
|
58
|
+
def add_assertions: (Herb::AST::DocumentNode) -> void
|
|
59
|
+
|
|
60
|
+
# : (Herb::AST::DocumentNode) -> Array[[Symbol, Prism::Location]]
|
|
61
|
+
def html_safe_targets: (Herb::AST::DocumentNode) -> Array[[ Symbol, Prism::Location ]]
|
|
62
|
+
|
|
63
|
+
# : (Prism::Node) -> [Symbol, Prism::Location]?
|
|
64
|
+
def target_for: (Prism::Node) -> [ Symbol, Prism::Location ]?
|
|
65
|
+
|
|
66
|
+
# : (Prism::CallNode) -> bool
|
|
67
|
+
def html_safe_call?: (Prism::CallNode) -> bool
|
|
68
|
+
|
|
69
|
+
# : (Prism::BlockArgumentNode) -> bool
|
|
70
|
+
def html_safe_symbol?: (Prism::BlockArgumentNode) -> bool
|
|
71
|
+
|
|
72
|
+
# : (untyped, Array[[Symbol, Prism::Location]]) -> void
|
|
73
|
+
def rewrite: (untyped, Array[[ Symbol, Prism::Location ]]) -> void
|
|
74
|
+
|
|
75
|
+
# : (Symbol, Prism::Location, Herb::Range) -> [Symbol, Integer, Integer]?
|
|
76
|
+
def local_target: (Symbol, Prism::Location, Herb::Range) -> [ Symbol, Integer, Integer ]?
|
|
77
|
+
|
|
78
|
+
# : (Array[[Symbol, Integer, Integer]], String) -> Array[[Integer, Integer, String]]
|
|
79
|
+
def edits: (Array[[ Symbol, Integer, Integer ]], String) -> Array[[ Integer, Integer, String ]]
|
|
80
|
+
|
|
81
|
+
# : (String, Integer, Integer, String) -> String
|
|
82
|
+
def splice: (String, Integer, Integer, String) -> String
|
|
83
|
+
|
|
84
|
+
# : (untyped) -> Herb::Token?
|
|
85
|
+
def content_token: (untyped) -> Herb::Token?
|
|
86
|
+
|
|
87
|
+
# : (untyped, String) -> String
|
|
88
|
+
def check_arguments: (untyped, String) -> String
|
|
89
|
+
|
|
90
|
+
# : () -> String
|
|
91
|
+
def file_argument: () -> String
|
|
92
|
+
|
|
93
|
+
# : (untyped, String) -> String
|
|
94
|
+
def erb_source: (untyped, String) -> String
|
|
95
|
+
|
|
96
|
+
# : (String) -> String
|
|
97
|
+
def truncate: (String) -> String
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/visitors/instrumentation_visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Wraps every ERB tag in a call that says which tag is rendering, so that whatever happens
|
|
6
|
+
# while it renders can be attributed to it rather than to the template as a whole.
|
|
7
|
+
#
|
|
8
|
+
# This is half of a mechanism and does nothing by itself. It supplies where, and something else
|
|
9
|
+
# has to supply what. A template compiled with it and rendered with nothing watching records no
|
|
10
|
+
# entries at all, and only costs a call per tag. What makes it worth having is anything that
|
|
11
|
+
# calls `Herb::Engine::Runtime::Session.observe` while a tag is rendering:
|
|
12
|
+
#
|
|
13
|
+
# require "herb/engine/visitors/instrumentation_visitor"
|
|
14
|
+
#
|
|
15
|
+
# engine = Herb::Engine.new(source, visitors: [Herb::Engine::InstrumentationVisitor.new])
|
|
16
|
+
#
|
|
17
|
+
# ActiveSupport::Notifications.subscribe("sql.active_record") do |*, payload|
|
|
18
|
+
# Herb::Engine::Runtime::Session.observe(:queries, payload[:sql]) unless payload[:cached]
|
|
19
|
+
# end
|
|
20
|
+
#
|
|
21
|
+
# session = Herb::Engine::Runtime::Session.capture { render(engine.src) }
|
|
22
|
+
#
|
|
23
|
+
# session.measure(:queries, origin: "Herb Engine", code: "sql-queries") do |queries|
|
|
24
|
+
# "#{queries.size} SQL queries"
|
|
25
|
+
# end
|
|
26
|
+
# #=> app/views/posts/_card.html.erb:7:8: [sql-queries] 3 SQL queries
|
|
27
|
+
#
|
|
28
|
+
# Nothing about that subscription is Herb's, which is the point. Because what gets watched is
|
|
29
|
+
# decided at render time rather than compiled in, adding a producer never means recompiling a
|
|
30
|
+
# template, and Herb never has to ship a class per thing worth watching.
|
|
31
|
+
#
|
|
32
|
+
# A tag that opens a block, or that assigns to a local, is framed from the outside rather than
|
|
33
|
+
# wrapped, because wrapping either one would change what the template means: a block would lose
|
|
34
|
+
# its body, and an assignment would bind inside the wrapper instead of the template.
|
|
35
|
+
class InstrumentationVisitor < Herb::Visitor
|
|
36
|
+
extend Herb::Visitor::Experimental
|
|
37
|
+
|
|
38
|
+
include Herb::Visitor::ContextAware
|
|
39
|
+
|
|
40
|
+
SESSION: ::String
|
|
41
|
+
|
|
42
|
+
ARRAY_PROPERTIES: untyped
|
|
43
|
+
|
|
44
|
+
NODE_PROPERTIES: untyped
|
|
45
|
+
|
|
46
|
+
ASSIGNMENT_NODES: untyped
|
|
47
|
+
|
|
48
|
+
# : () -> bool
|
|
49
|
+
def self.rewrites_erb_source?: () -> bool
|
|
50
|
+
|
|
51
|
+
# : (?capture_output: (bool | ^(String) -> boolish | Regexp | Array[untyped])?) -> void
|
|
52
|
+
def initialize: (?capture_output: (bool | ^(String) -> boolish | Regexp | Array[untyped])?) -> void
|
|
53
|
+
|
|
54
|
+
def visit_document_node: (untyped node) -> untyped
|
|
55
|
+
|
|
56
|
+
def inspect: () -> untyped
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
|
|
60
|
+
def frame_render: (untyped node) -> untyped
|
|
61
|
+
|
|
62
|
+
def instrument: (untyped node) -> untyped
|
|
63
|
+
|
|
64
|
+
def rewrite: (untyped nodes) -> untyped
|
|
65
|
+
|
|
66
|
+
# : (Herb::AST::Node, Herb::Visitor::Context::Origin::Entry) -> Array[Herb::AST::Node]
|
|
67
|
+
def rewrite_import: (Herb::AST::Node, Herb::Visitor::Context::Origin::Entry) -> Array[Herb::AST::Node]
|
|
68
|
+
|
|
69
|
+
# : (Herb::AST::Node) -> Array[Herb::AST::Node]
|
|
70
|
+
def rewrite_node: (Herb::AST::Node) -> Array[Herb::AST::Node]
|
|
71
|
+
|
|
72
|
+
# : (Herb::AST::Node, Herb::AST::Node) -> Herb::AST::Node
|
|
73
|
+
def replacing: (Herb::AST::Node, Herb::AST::Node) -> Herb::AST::Node
|
|
74
|
+
|
|
75
|
+
def framed?: (untyped node) -> untyped
|
|
76
|
+
|
|
77
|
+
def assignment?: (untyped node) -> untyped
|
|
78
|
+
|
|
79
|
+
def block?: (untyped node) -> untyped
|
|
80
|
+
|
|
81
|
+
def via: (untyped node) -> untyped
|
|
82
|
+
|
|
83
|
+
def wrapped_output: (untyped node) -> untyped
|
|
84
|
+
|
|
85
|
+
def captured?: (untyped node) -> untyped
|
|
86
|
+
|
|
87
|
+
def wrapped_statement: (untyped node) -> untyped
|
|
88
|
+
|
|
89
|
+
# : (String) -> bool
|
|
90
|
+
def spans_lines?: (String) -> bool
|
|
91
|
+
|
|
92
|
+
def enter_node: (untyped node) -> untyped
|
|
93
|
+
|
|
94
|
+
def leave_node: (untyped node) -> untyped
|
|
95
|
+
|
|
96
|
+
def enter_render_node: (untyped node, untyped file) -> untyped
|
|
97
|
+
|
|
98
|
+
def render_arguments: (untyped file) -> untyped
|
|
99
|
+
|
|
100
|
+
def digest_for: (untyped file) -> untyped
|
|
101
|
+
|
|
102
|
+
def leave_render_node: (untyped node) -> untyped
|
|
103
|
+
|
|
104
|
+
def position: (untyped node) -> untyped
|
|
105
|
+
|
|
106
|
+
def code: (untyped node) -> untyped
|
|
107
|
+
|
|
108
|
+
def erb_node: (untyped node, untyped opening, untyped code) -> untyped
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
end
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/visitors/optimize_visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Asks the parser to resolve Action View helpers into the markup they produce, so the compiler
|
|
6
|
+
# emits that markup directly instead of a call the renderer has to make. Passing it is the
|
|
7
|
+
# whole opt-in:
|
|
8
|
+
#
|
|
9
|
+
# Herb::Engine.new(source, visitors: [Herb::Engine::OptimizeVisitor.new])
|
|
10
|
+
#
|
|
11
|
+
# There is no check first for whether a template looks like it contains helpers, because a
|
|
12
|
+
# caller that added this has already answered that question.
|
|
13
|
+
#
|
|
14
|
+
# An output tag whose Ruby is a single string, integer, or float literal renders the same text
|
|
15
|
+
# every time, so the visitor folds it into the template text around it. `<%= "hello" %>`
|
|
16
|
+
# compiles to the text `hello`, with nothing left to evaluate when the template renders. The
|
|
17
|
+
# escaping the compiler would have arranged at render time is applied once here instead, by the
|
|
18
|
+
# same functions it would have called, so the fold produces byte for byte what the expression
|
|
19
|
+
# would have, in an attribute value and inside `<script>` or `<style>` just as in plain
|
|
20
|
+
# content. A caller that swapped one of those functions out through `escapefunc`, `attrfunc`,
|
|
21
|
+
# `jsfunc`, or `cssfunc` gets the fold only when the stock function leaves the value untouched,
|
|
22
|
+
# on the grounds that an escape function has nothing to do there either.
|
|
23
|
+
#
|
|
24
|
+
# A literal that spans lines, sits in a trimming tag, or renders nothing at all stays dynamic,
|
|
25
|
+
# so folding never moves another tag off the line it was written on and never changes how the
|
|
26
|
+
# whitespace around the tag is handled. Folding rewrites the ERB a template was written with,
|
|
27
|
+
# so a visitor that reads it, like `Slots::Visitor`, has to run earlier in the stack, and the
|
|
28
|
+
# stack raises when it does not.
|
|
29
|
+
#
|
|
30
|
+
# Its presence also lets the engine collapse a template that carries no Ruby into the single
|
|
31
|
+
# string literal it renders, skipping the buffer the compiler would otherwise build up. A
|
|
32
|
+
# template that was HTML to begin with qualifies, and so does one left fully static once the
|
|
33
|
+
# helpers above resolved to markup and the literal outputs folded into text. The collapse is
|
|
34
|
+
# held back when the caller drives the buffer itself through `preamble`, `postamble`, `bufval`,
|
|
35
|
+
# or `ensure`, and when a visitor recorded a diagnostic that the compiled template still needs
|
|
36
|
+
# to report.
|
|
37
|
+
#
|
|
38
|
+
# A template whose only Ruby is conditional chains over otherwise static markup collapses the
|
|
39
|
+
# same way, nesting included. `if`, `unless`, and `elsif` qualify, and so do `case` with its
|
|
40
|
+
# `when` branches and `case` matching with `in` patterns. Each render path becomes one frozen
|
|
41
|
+
# string literal holding everything that path renders, the markup around and between the
|
|
42
|
+
# conditionals included, and the compiled template is the chains themselves picking between
|
|
43
|
+
# them. The conditions compile onto the lines they were written on, so backtraces stay right.
|
|
44
|
+
# A chain without an `else` gets one that returns what the template renders without it, except
|
|
45
|
+
# a pattern matching chain, which keeps raising `NoMatchingPatternError` for a value no
|
|
46
|
+
# pattern accepts, the way it rendered before the collapse.
|
|
47
|
+
#
|
|
48
|
+
# The path literals repeat the markup the paths share, so the collapse steps back when they
|
|
49
|
+
# would hold more than `DUPLICATION_LIMIT` times the template's static bytes, and the buffer
|
|
50
|
+
# stays. A chain that sits beside another in the same scope keeps the buffer too.
|
|
51
|
+
#
|
|
52
|
+
# A template the collapse walks away from can still get its static subtrees. With
|
|
53
|
+
# `subtrees: true`, when the buffer stays, a chain whose branches are static collapses into a
|
|
54
|
+
# single append of the chain picking between path literals, the static text around it merged
|
|
55
|
+
# in, so a conditional attribute next to a dynamic one costs one append where it cost three.
|
|
56
|
+
# A chain the buffer already renders in one append is left as it was, and the duplication
|
|
57
|
+
# limit governs each subtree the way it governs the template. The pass trades compiled
|
|
58
|
+
# template bytes for fewer appends at render time, which is why it is the one pass that is
|
|
59
|
+
# off by default.
|
|
60
|
+
#
|
|
61
|
+
# Every other pass is on by default, and each can be left off on its own. `helpers: false` stops
|
|
62
|
+
# asking the parser to resolve helpers, `conditionals: false` stops asking it to unroll the
|
|
63
|
+
# postfix conditionals and ternaries it would have, `literals: false` keeps literal outputs
|
|
64
|
+
# dynamic, and `collapse: false` keeps the buffer for a template either collapse above would
|
|
65
|
+
# have compiled without one:
|
|
66
|
+
#
|
|
67
|
+
# Herb::Engine::OptimizeVisitor.new(literals: false, collapse: false)
|
|
68
|
+
#
|
|
69
|
+
# Turning a parser-side pass off only withdraws this visitor's request for the parser option
|
|
70
|
+
# behind it. A caller that asks for `action_view_helpers: true` through `parser_options` still
|
|
71
|
+
# gets the resolution the parser was asked for directly, and `verify` below still covers what
|
|
72
|
+
# it resolved. Unrolling is also part of how the parser resolves helpers, since a helper
|
|
73
|
+
# behind a modifier has to come out of it first, so a modifier keeps its written shape only
|
|
74
|
+
# once `helpers` is off too.
|
|
75
|
+
#
|
|
76
|
+
# Replacing a helper call with its markup is only the same thing as calling it while the helper
|
|
77
|
+
# is the one it was resolved against. An application that defines its own `content_tag` gets the
|
|
78
|
+
# stock markup instead, everywhere, with nothing at the call site to say so. `verify` compiles a
|
|
79
|
+
# check into the template that runs when it renders and reports a helper that has since been
|
|
80
|
+
# overwritten:
|
|
81
|
+
#
|
|
82
|
+
# Herb::Engine::OptimizeVisitor.new(verify: true)
|
|
83
|
+
#
|
|
84
|
+
# It costs a call per render and reports rather than corrects, so it earns its place in
|
|
85
|
+
# development and not in production. Compiling it in is the caller's decision for the same reason
|
|
86
|
+
# the optimization itself is.
|
|
87
|
+
class OptimizeVisitor < Herb::Visitor
|
|
88
|
+
extend Herb::Visitor::Experimental
|
|
89
|
+
|
|
90
|
+
include Herb::Visitor::ContextAware
|
|
91
|
+
|
|
92
|
+
SESSION: String
|
|
93
|
+
|
|
94
|
+
CODE: String
|
|
95
|
+
|
|
96
|
+
ORIGIN: String
|
|
97
|
+
|
|
98
|
+
OUTPUT_OPENINGS: Array[String]
|
|
99
|
+
|
|
100
|
+
CHILD_LISTS: Array[Symbol]
|
|
101
|
+
|
|
102
|
+
BRANCHLESS_KEYWORDS: Array[Symbol]
|
|
103
|
+
|
|
104
|
+
CHAIN_OPENINGS: Array[Symbol]
|
|
105
|
+
|
|
106
|
+
DUPLICATION_LIMIT: Integer
|
|
107
|
+
|
|
108
|
+
# : () -> Array[String]
|
|
109
|
+
def self.helper_sources: () -> Array[String]
|
|
110
|
+
|
|
111
|
+
# : () -> bool
|
|
112
|
+
def self.rewrites_erb_source?: () -> bool
|
|
113
|
+
|
|
114
|
+
# : (?helpers: bool, ?conditionals: bool, ?literals: bool, ?collapse: bool, ?subtrees: bool, ?verify: bool) -> void
|
|
115
|
+
def initialize: (?helpers: bool, ?conditionals: bool, ?literals: bool, ?collapse: bool, ?subtrees: bool, ?verify: bool) -> void
|
|
116
|
+
|
|
117
|
+
# : () -> Hash[Symbol, untyped]
|
|
118
|
+
def required_parser_options: () -> Hash[Symbol, untyped]
|
|
119
|
+
|
|
120
|
+
# : (Herb::AST::DocumentNode) -> void
|
|
121
|
+
def visit_document_node: (Herb::AST::DocumentNode) -> void
|
|
122
|
+
|
|
123
|
+
# : (Herb::AST::Node) -> void
|
|
124
|
+
def visit_node: (Herb::AST::Node) -> void
|
|
125
|
+
|
|
126
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
127
|
+
def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
|
|
128
|
+
|
|
129
|
+
# : (Herb::AST::HTMLConditionalElementNode) -> void
|
|
130
|
+
def visit_html_conditional_element_node: (Herb::AST::HTMLConditionalElementNode) -> void
|
|
131
|
+
|
|
132
|
+
# : (Herb::AST::HTMLAttributeValueNode) -> void
|
|
133
|
+
def visit_html_attribute_value_node: (Herb::AST::HTMLAttributeValueNode) -> void
|
|
134
|
+
|
|
135
|
+
# : (Herb::Engine, untyped) -> String?
|
|
136
|
+
def compile_static_body: (Herb::Engine, untyped) -> String?
|
|
137
|
+
|
|
138
|
+
# : () -> String
|
|
139
|
+
def inspect: () -> String
|
|
140
|
+
|
|
141
|
+
private
|
|
142
|
+
|
|
143
|
+
# : () -> Array[String]
|
|
144
|
+
def non_default_toggles: () -> Array[String]
|
|
145
|
+
|
|
146
|
+
# : (Herb::Engine, untyped) -> String?
|
|
147
|
+
def static_body: (Herb::Engine, untyped) -> String?
|
|
148
|
+
|
|
149
|
+
# : (Herb::Engine, Array[untyped]) -> void
|
|
150
|
+
def collapse_subtrees: (Herb::Engine, Array[untyped]) -> void
|
|
151
|
+
|
|
152
|
+
# : ((Herb::AST::HTMLElementNode | Herb::AST::HTMLConditionalElementNode)) -> Symbol?
|
|
153
|
+
def element_output_context: (Herb::AST::HTMLElementNode | Herb::AST::HTMLConditionalElementNode) -> Symbol?
|
|
154
|
+
|
|
155
|
+
# : (Symbol?) { () -> void } -> void
|
|
156
|
+
def with_output_context: (Symbol?) { () -> void } -> void
|
|
157
|
+
|
|
158
|
+
# : () -> Symbol
|
|
159
|
+
def current_output_context: () -> Symbol
|
|
160
|
+
|
|
161
|
+
# : (Herb::AST::Node?) -> Herb::AST::LiteralNode?
|
|
162
|
+
def folded_literal: (Herb::AST::Node?) -> Herb::AST::LiteralNode?
|
|
163
|
+
|
|
164
|
+
# : (String) -> String?
|
|
165
|
+
def literal_value: (String) -> String?
|
|
166
|
+
|
|
167
|
+
# : (String, String) -> String?
|
|
168
|
+
def output_text: (String, String) -> String?
|
|
169
|
+
|
|
170
|
+
# : (String, Symbol) { () -> String } -> String?
|
|
171
|
+
def escaped_output: (String, Symbol) { () -> String } -> String?
|
|
172
|
+
|
|
173
|
+
# : (String) -> bool
|
|
174
|
+
def escape_output?: (String) -> bool
|
|
175
|
+
|
|
176
|
+
# : (Herb::Engine, Array[untyped]) -> String?
|
|
177
|
+
def compile_static_branches: (Herb::Engine, Array[untyped]) -> String?
|
|
178
|
+
|
|
179
|
+
# : (Array[untyped]) -> Hash[Symbol, untyped]?
|
|
180
|
+
def branch_tree: (Array[untyped]) -> Hash[Symbol, untyped]?
|
|
181
|
+
|
|
182
|
+
# : (Array[untyped], Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
183
|
+
def tree_step: (Array[untyped], Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
184
|
+
|
|
185
|
+
# : (Symbol, String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
186
|
+
def tree_transition: (Symbol, String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
187
|
+
|
|
188
|
+
# : (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
189
|
+
def open_chain: (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
190
|
+
|
|
191
|
+
# : (String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
192
|
+
def open_case_chain: (String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
193
|
+
|
|
194
|
+
# : (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
195
|
+
def open_case_branch: (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
196
|
+
|
|
197
|
+
# : (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
198
|
+
def open_branch: (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
199
|
+
|
|
200
|
+
# : (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
201
|
+
def close_chain: (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
|
|
202
|
+
|
|
203
|
+
# : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]?
|
|
204
|
+
def container_chain: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]?
|
|
205
|
+
|
|
206
|
+
# : (Hash[Symbol, untyped]) -> [String, String]
|
|
207
|
+
def chain_surroundings: (Hash[Symbol, untyped]) -> [ String, String ]
|
|
208
|
+
|
|
209
|
+
# : (Hash[Symbol, untyped]) -> Array[String]
|
|
210
|
+
def container_paths: (Hash[Symbol, untyped]) -> Array[String]
|
|
211
|
+
|
|
212
|
+
# : (Array[String], Array[untyped]) -> bool
|
|
213
|
+
def within_duplication_limit?: (Array[String], Array[untyped]) -> bool
|
|
214
|
+
|
|
215
|
+
# : (Herb::Engine, Hash[Symbol, untyped], String, String, Hash[Symbol, Array[String?]]) -> void
|
|
216
|
+
def collect_leaf_literals: (Herb::Engine, Hash[Symbol, untyped], String, String, Hash[Symbol, Array[String?]]) -> void
|
|
217
|
+
|
|
218
|
+
# : (Herb::Engine, Array[untyped], Integer) -> [::Range[Integer], Array[untyped]]?
|
|
219
|
+
def chain_run_replacement: (Herb::Engine, Array[untyped], Integer) -> [ ::Range[Integer], Array[untyped] ]?
|
|
220
|
+
|
|
221
|
+
# : (Array[untyped], Integer) -> Integer?
|
|
222
|
+
def chain_end_index: (Array[untyped], Integer) -> Integer?
|
|
223
|
+
|
|
224
|
+
# : (Hash[Symbol, untyped]) -> bool
|
|
225
|
+
def nested_chain?: (Hash[Symbol, untyped]) -> bool
|
|
226
|
+
|
|
227
|
+
# : (String) -> Symbol?
|
|
228
|
+
def chain_keyword: (String) -> Symbol?
|
|
229
|
+
|
|
230
|
+
# : (Herb::Engine, Array[untyped], Hash[Symbol, untyped]) -> String
|
|
231
|
+
def render_static_branches: (Herb::Engine, Array[untyped], Hash[Symbol, untyped]) -> String
|
|
232
|
+
|
|
233
|
+
# : (String?, Herb::Location?) -> void
|
|
234
|
+
def collect: (String?, Herb::Location?) -> void
|
|
235
|
+
|
|
236
|
+
# : (Herb::AST::DocumentNode) -> Herb::AST::ERBContentNode
|
|
237
|
+
def check_node: (Herb::AST::DocumentNode) -> Herb::AST::ERBContentNode
|
|
238
|
+
|
|
239
|
+
# : (String, Herb::Location?) -> String
|
|
240
|
+
def check_for: (String, Herb::Location?) -> String
|
|
241
|
+
|
|
242
|
+
# : (String, String, Herb::Location?) -> String
|
|
243
|
+
def entry_for: (String, String, Herb::Location?) -> String
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|