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,233 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/runtime/session.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Runtime
|
|
6
|
+
# Where everything found while a page renders collects, so that findings from separate
|
|
7
|
+
# producers end up in one payload rather than one channel each.
|
|
8
|
+
#
|
|
9
|
+
# Anything can record into the session that is open, without knowing whether one is open or who
|
|
10
|
+
# else is recording:
|
|
11
|
+
#
|
|
12
|
+
# Herb::Engine::Runtime::Session.record(diagnostic)
|
|
13
|
+
#
|
|
14
|
+
# A scoped session is one somebody opened deliberately, which is what a request or a test does.
|
|
15
|
+
# Outside of one, recording still works and collects into a session nobody reads, so a producer
|
|
16
|
+
# never has to guard its own calls.
|
|
17
|
+
class Session
|
|
18
|
+
class Measurement < Data
|
|
19
|
+
attr_reader key(): untyped
|
|
20
|
+
|
|
21
|
+
attr_reader origin(): untyped
|
|
22
|
+
|
|
23
|
+
attr_reader code(): untyped
|
|
24
|
+
|
|
25
|
+
attr_reader message(): untyped
|
|
26
|
+
|
|
27
|
+
attr_reader description(): untyped
|
|
28
|
+
|
|
29
|
+
attr_reader kind(): untyped
|
|
30
|
+
|
|
31
|
+
attr_reader per(): untyped
|
|
32
|
+
|
|
33
|
+
attr_reader block(): untyped
|
|
34
|
+
|
|
35
|
+
def self.new: (untyped key, untyped origin, untyped code, untyped message, untyped description, untyped kind, untyped per, untyped block) -> instance
|
|
36
|
+
| (key: untyped, origin: untyped, code: untyped, message: untyped, description: untyped, kind: untyped, per: untyped, block: untyped) -> instance
|
|
37
|
+
|
|
38
|
+
def self.members: () -> [ :key, :origin, :code, :message, :description, :kind, :per, :block ]
|
|
39
|
+
|
|
40
|
+
def members: () -> [ :key, :origin, :code, :message, :description, :kind, :per, :block ]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
STATE_KEY: Symbol
|
|
44
|
+
|
|
45
|
+
RACTOR_KEY: Symbol
|
|
46
|
+
|
|
47
|
+
THREAD_KEY: Symbol
|
|
48
|
+
|
|
49
|
+
attr_reader report: Herb::Engine::Runtime::Report
|
|
50
|
+
|
|
51
|
+
attr_reader previous: Session?
|
|
52
|
+
|
|
53
|
+
# : () -> Session?
|
|
54
|
+
def self.stored: () -> Session?
|
|
55
|
+
|
|
56
|
+
# : (Session?) -> void
|
|
57
|
+
def self.store: (Session?) -> void
|
|
58
|
+
|
|
59
|
+
# : () -> Session
|
|
60
|
+
def self.current: () -> Session
|
|
61
|
+
|
|
62
|
+
# : [T] () { () -> T } -> Session
|
|
63
|
+
def self.capture: [T] () { () -> T } -> Session
|
|
64
|
+
|
|
65
|
+
# : () -> Session
|
|
66
|
+
def self.open: () -> Session
|
|
67
|
+
|
|
68
|
+
# : () -> Session?
|
|
69
|
+
def self.close: () -> Session?
|
|
70
|
+
|
|
71
|
+
# : (Herb::Diagnostic) -> Herb::Diagnostic
|
|
72
|
+
def self.record: (Herb::Diagnostic) -> Herb::Diagnostic
|
|
73
|
+
|
|
74
|
+
def self.record_compile_diagnostics: (untyped template, untyped entries) -> untyped
|
|
75
|
+
|
|
76
|
+
# : (String) -> void
|
|
77
|
+
def self.read_source: (String) -> void
|
|
78
|
+
|
|
79
|
+
# : [T] (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) { () -> T } -> T
|
|
80
|
+
def self.at: [T] (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) { () -> T } -> T
|
|
81
|
+
|
|
82
|
+
# : (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) -> void
|
|
83
|
+
def self.enter: (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) -> void
|
|
84
|
+
|
|
85
|
+
# : [T] (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) { () -> T } -> T
|
|
86
|
+
def self.output: [T] (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) { () -> T } -> T
|
|
87
|
+
|
|
88
|
+
# : () -> void
|
|
89
|
+
def self.leave: () -> void
|
|
90
|
+
|
|
91
|
+
# : [T] (String?, ?String?) { () -> T } -> T
|
|
92
|
+
def self.render: [T] (String?, ?String?) { () -> T } -> T
|
|
93
|
+
|
|
94
|
+
# : (String?, ?String?) -> String
|
|
95
|
+
def self.enter_render: (String?, ?String?) -> String
|
|
96
|
+
|
|
97
|
+
# : () -> void
|
|
98
|
+
def self.leave_render: () -> void
|
|
99
|
+
|
|
100
|
+
# : () -> String?
|
|
101
|
+
def self.current_node: () -> String?
|
|
102
|
+
|
|
103
|
+
# : (Symbol, untyped, origin: String) -> void
|
|
104
|
+
def self.annotate: (Symbol, untyped, origin: String) -> void
|
|
105
|
+
|
|
106
|
+
# : (Symbol, untyped) -> void
|
|
107
|
+
def self.observe: (Symbol, untyped) -> void
|
|
108
|
+
|
|
109
|
+
# : () -> Array[Array[untyped]]
|
|
110
|
+
def self.stack: () -> Array[Array[untyped]]
|
|
111
|
+
|
|
112
|
+
# : (String, String?) -> void
|
|
113
|
+
def self.source: (String, String?) -> void
|
|
114
|
+
|
|
115
|
+
# : () -> bool
|
|
116
|
+
def self.scoped?: () -> bool
|
|
117
|
+
|
|
118
|
+
# : (Symbol, origin: String, ?code: String?, ?message: String?, ?description: (^(Array[untyped]) -> String)?, ?kind: Symbol, ?per: Symbol) { (Array[untyped]) -> String } -> void
|
|
119
|
+
def self.measurement: (Symbol, origin: String, ?code: String?, ?message: String?, ?description: (^(Array[untyped]) -> String)?, ?kind: Symbol, ?per: Symbol) { (Array[untyped]) -> String } -> void
|
|
120
|
+
|
|
121
|
+
# : () -> Array[Herb::Engine::Runtime::Session::Measurement]
|
|
122
|
+
def self.measurements: () -> Array[Herb::Engine::Runtime::Session::Measurement]
|
|
123
|
+
|
|
124
|
+
# : () -> void
|
|
125
|
+
def self.clear_measurements: () -> void
|
|
126
|
+
|
|
127
|
+
# : () -> void
|
|
128
|
+
def self.reset!: () -> void
|
|
129
|
+
|
|
130
|
+
# : (?scoped: bool, ?report: Herb::Engine::Runtime::Report?, ?previous: Session?) -> void
|
|
131
|
+
def initialize: (?scoped: bool, ?report: Herb::Engine::Runtime::Report?, ?previous: Session?) -> void
|
|
132
|
+
|
|
133
|
+
# : () -> bool
|
|
134
|
+
def scoped?: () -> bool
|
|
135
|
+
|
|
136
|
+
# : (Herb::Diagnostic) -> Herb::Diagnostic
|
|
137
|
+
def record: (Herb::Diagnostic) -> Herb::Diagnostic
|
|
138
|
+
|
|
139
|
+
# : (String, String?) -> void
|
|
140
|
+
def source: (String, String?) -> void
|
|
141
|
+
|
|
142
|
+
# : (Symbol) { () -> untyped } -> untyped
|
|
143
|
+
def channel: (Symbol) { () -> untyped } -> untyped
|
|
144
|
+
|
|
145
|
+
# : () -> Array[Herb::Diagnostic]
|
|
146
|
+
def diagnostics: () -> Array[Herb::Diagnostic]
|
|
147
|
+
|
|
148
|
+
# : () -> bool
|
|
149
|
+
def empty?: () -> bool
|
|
150
|
+
|
|
151
|
+
# : (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) -> void
|
|
152
|
+
def enter: (String?, Integer, Integer, ?Symbol?, ?end_line: Integer?, ?end_column: Integer?) -> void
|
|
153
|
+
|
|
154
|
+
# : () -> void
|
|
155
|
+
def leave: () -> void
|
|
156
|
+
|
|
157
|
+
# Every tag still rendering, innermost first, the way `caller` reads.
|
|
158
|
+
#
|
|
159
|
+
# A tag that renders a partial is still open while the partial renders, so once more than one
|
|
160
|
+
# template is instrumented this is a render stack across all of them and not just within one.
|
|
161
|
+
# Only the innermost frame is what an observation is filed under, so anything wanting the rest
|
|
162
|
+
# has to take it while it still exists:
|
|
163
|
+
#
|
|
164
|
+
# ActiveSupport::Notifications.subscribe("sql.active_record") do |*, payload|
|
|
165
|
+
# Herb::Engine::Runtime::Session.observe(:queries, { sql: payload[:sql], stack: Herb::Engine::Runtime::Session.stack })
|
|
166
|
+
# end
|
|
167
|
+
#
|
|
168
|
+
# Taking it costs an array per observation, which is why it is offered rather than recorded.
|
|
169
|
+
# : () -> Array[Array[untyped]]
|
|
170
|
+
def stack: () -> Array[Array[untyped]]
|
|
171
|
+
|
|
172
|
+
# Filed under the render it happened in, not only the position it happened at.
|
|
173
|
+
#
|
|
174
|
+
# A partial rendered three times has one tag at one position, so keying on position alone
|
|
175
|
+
# merges all three into one entry reading "3 queries" at one place. That reads as one slow
|
|
176
|
+
# tag when the finding is a tag that runs once per item, which is the thing worth noticing.
|
|
177
|
+
# : (Symbol, untyped) -> void
|
|
178
|
+
def observe: (Symbol, untyped) -> void
|
|
179
|
+
|
|
180
|
+
# One render of one template, which is what a node in the payload is.
|
|
181
|
+
#
|
|
182
|
+
# A template rendered three times is three nodes, because what gets said about it is said
|
|
183
|
+
# about an occurrence and not about the file. The id is minted here so there is exactly one
|
|
184
|
+
# of them per occurrence, rather than one per producer that wants to name it.
|
|
185
|
+
#
|
|
186
|
+
# The tag that is open when a render starts is the tag that started it, so the call site
|
|
187
|
+
# comes for free. Without it the tree would say a partial rendered twice under one parent but
|
|
188
|
+
# not from where, which `stack` can say and a payload built from the tree alone could not.
|
|
189
|
+
# : (String?, ?String?) -> String
|
|
190
|
+
def enter_render: (String?, ?String?) -> String
|
|
191
|
+
|
|
192
|
+
# : () -> void
|
|
193
|
+
def leave_render: () -> void
|
|
194
|
+
|
|
195
|
+
# : () -> String?
|
|
196
|
+
def current_node: () -> String?
|
|
197
|
+
|
|
198
|
+
# : (Symbol, untyped, origin: String) -> void
|
|
199
|
+
def annotate: (Symbol, untyped, origin: String) -> void
|
|
200
|
+
|
|
201
|
+
# : () -> Array[Herb::Engine::Runtime::Entry]
|
|
202
|
+
def entries: () -> Array[Herb::Engine::Runtime::Entry]
|
|
203
|
+
|
|
204
|
+
# : () -> Array[Herb::Diagnostic]
|
|
205
|
+
def apply_measurements: () -> Array[Herb::Diagnostic]
|
|
206
|
+
|
|
207
|
+
# Turns what was observed under one key into one diagnostic per tag that saw any.
|
|
208
|
+
#
|
|
209
|
+
# ActiveSupport::Notifications.subscribe("sql.active_record") do |*, payload|
|
|
210
|
+
# Herb::Engine::Runtime::Session.observe(:queries, payload[:sql]) unless payload[:cached]
|
|
211
|
+
# end
|
|
212
|
+
#
|
|
213
|
+
# session.measure(:queries, origin: "Herb Engine", code: "sql-queries") do |queries|
|
|
214
|
+
# "#{queries.size} SQL queries"
|
|
215
|
+
# end
|
|
216
|
+
#
|
|
217
|
+
# A count is a measurement rather than a fault, so what comes out carries a badge and no
|
|
218
|
+
# severity. Three queries at one tag is worth showing every time and worth worrying about
|
|
219
|
+
# only sometimes, and which of those it is depends on what the tag is for. Reporting it as a
|
|
220
|
+
# warning would make that call on the reader's behalf and get it wrong often enough to train
|
|
221
|
+
# them to ignore it.
|
|
222
|
+
#
|
|
223
|
+
# : (Symbol, origin: String, ?code: String?, ?message: String?, ?description: (^(Array[untyped]) -> String)?, ?kind: Symbol, ?per: Symbol) { (Array[untyped]) -> String } -> Array[Herb::Diagnostic]
|
|
224
|
+
def measure: (Symbol, origin: String, ?code: String?, ?message: String?, ?description: (^(Array[untyped]) -> String)?, ?kind: Symbol, ?per: Symbol) { (Array[untyped]) -> String } -> Array[Herb::Diagnostic]
|
|
225
|
+
|
|
226
|
+
private
|
|
227
|
+
|
|
228
|
+
# : (Symbol, Symbol) -> Array[[Herb::Engine::Runtime::Entry, Array[untyped]]]
|
|
229
|
+
def measurable: (Symbol, Symbol) -> Array[[ Herb::Engine::Runtime::Entry, Array[untyped] ]]
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/runtime.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
# Everything a compiled template talks to while it renders.
|
|
6
|
+
#
|
|
7
|
+
# A constant under here is named by generated Ruby, so an application serving templates that
|
|
8
|
+
# were compiled ahead of time needs this and nothing else the engine ships:
|
|
9
|
+
#
|
|
10
|
+
# require "herb/engine/runtime"
|
|
11
|
+
module Runtime
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/scoped_style/channel.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module ScopedStyle
|
|
6
|
+
# The CSS every scoped block on a page narrowed, collected once however many times the files
|
|
7
|
+
# holding them rendered.
|
|
8
|
+
#
|
|
9
|
+
# A template compiled with `deliver: :hoist` registers here as it renders:
|
|
10
|
+
#
|
|
11
|
+
# ::Herb::Engine::ScopedStyle::Channel.record("data-herb-scope-1a2b3c4d", ".title[data-herb-scope-1a2b3c4d]{color:red}")
|
|
12
|
+
#
|
|
13
|
+
# It is a channel on the session the page is collecting into, so it registers itself the first
|
|
14
|
+
# time anything records, and nothing in `Report` or `Session` has to know it exists.
|
|
15
|
+
class Channel
|
|
16
|
+
NAME: Symbol
|
|
17
|
+
|
|
18
|
+
ATTRIBUTE: String
|
|
19
|
+
|
|
20
|
+
ANCHOR: Symbol
|
|
21
|
+
|
|
22
|
+
# : (String, String) -> void
|
|
23
|
+
def self.record: (String, String) -> void
|
|
24
|
+
|
|
25
|
+
# : () -> void
|
|
26
|
+
def initialize: () -> void
|
|
27
|
+
|
|
28
|
+
# : (String, String) -> void
|
|
29
|
+
def add: (String, String) -> void
|
|
30
|
+
|
|
31
|
+
# : () -> Hash[String, String]
|
|
32
|
+
def styles: () -> Hash[String, String]
|
|
33
|
+
|
|
34
|
+
# : () -> Symbol
|
|
35
|
+
def anchor: () -> Symbol
|
|
36
|
+
|
|
37
|
+
# : () -> bool
|
|
38
|
+
def empty?: () -> bool
|
|
39
|
+
|
|
40
|
+
# : () -> String
|
|
41
|
+
def to_html: () -> String
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/scoped_style/collector.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module ScopedStyle
|
|
6
|
+
# The CSS a set of templates scoped, gathered without rendering any of them.
|
|
7
|
+
#
|
|
8
|
+
# A scope and its CSS are decided when a file is compiled, so everything a stylesheet needs is
|
|
9
|
+
# knowable ahead of time. This compiles each file for that and nothing else, which is what makes
|
|
10
|
+
# it possible to write the CSS into an asset and have templates emit none of it:
|
|
11
|
+
#
|
|
12
|
+
# collector = Herb::Engine::ScopedStyle::Collector.new(transform: transform, project_path: root)
|
|
13
|
+
#
|
|
14
|
+
# collector.add("app/views/posts/_card.html.erb")
|
|
15
|
+
# collector.add("app/views/posts/index.html.erb")
|
|
16
|
+
#
|
|
17
|
+
# collector.to_css #=> the one stylesheet those files add up to
|
|
18
|
+
#
|
|
19
|
+
# Which files to give it, and where the stylesheet goes, is the job of whatever integrates Herb
|
|
20
|
+
# with a framework. This knows how to compile and what to keep.
|
|
21
|
+
class Collector < Engine::Collector
|
|
22
|
+
# : (transform: untyped, ?project_path: (String | Pathname)?, **untyped) -> void
|
|
23
|
+
def initialize: (transform: untyped, ?project_path: (String | Pathname)?, **untyped) -> void
|
|
24
|
+
|
|
25
|
+
# : ((String | Pathname), ?String?) -> Array[String]
|
|
26
|
+
def add: (String | Pathname, ?String?) -> Array[String]
|
|
27
|
+
|
|
28
|
+
# : () -> Hash[String, String]
|
|
29
|
+
def styles: () -> Hash[String, String]
|
|
30
|
+
|
|
31
|
+
# : () -> Hash[String, Array[String]]
|
|
32
|
+
def files: () -> Hash[String, Array[String]]
|
|
33
|
+
|
|
34
|
+
# : () -> bool
|
|
35
|
+
def empty?: () -> bool
|
|
36
|
+
|
|
37
|
+
# : () -> String
|
|
38
|
+
def to_css: () -> String
|
|
39
|
+
|
|
40
|
+
# : () -> String
|
|
41
|
+
def inspect: () -> String
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/scoped_style/visitor.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module ScopedStyle
|
|
6
|
+
# Scopes a `<style scoped>` block to the markup written in the same file.
|
|
7
|
+
#
|
|
8
|
+
# require "herb/engine/scoped_style/visitor"
|
|
9
|
+
#
|
|
10
|
+
# Herb::Engine.new(source, filename: path, visitors: [
|
|
11
|
+
# Herb::Engine::ScopedStyle::Visitor.new(transform: transform)
|
|
12
|
+
# ])
|
|
13
|
+
#
|
|
14
|
+
# A file holding a scoped block is given a scope attribute, and the block's selectors are
|
|
15
|
+
# rewritten to require it. There is no single root element to write, because a file is scoped
|
|
16
|
+
# as a whole. A file with five sibling roots and a file with none behave the same way.
|
|
17
|
+
#
|
|
18
|
+
# Every element the file wrote carries the attribute, and every rule is narrowed by it. Markup the
|
|
19
|
+
# file rendered carries a scope of its own or none, so a block reaches what the file wrote and
|
|
20
|
+
# nothing else, whatever is nested inside it.
|
|
21
|
+
#
|
|
22
|
+
# Narrowing by ancestor would cost fewer attributes, and cannot be had. An element inside a nested
|
|
23
|
+
# scope is still a descendant of the one outside it, and CSS has no way to say otherwise, so only
|
|
24
|
+
# an attribute on the element itself tells them apart.
|
|
25
|
+
#
|
|
26
|
+
# A file is scoped as a whole, so markup an inlined partial brought with it belongs to the
|
|
27
|
+
# partial and not to the template it landed in. `Herb::Visitor::Context::Origin` is what says so, which
|
|
28
|
+
# is why this has to run after `InlineRenderVisitor` and before `Slots::Visitor`, whose parked
|
|
29
|
+
# markup a client rebuilds from and which therefore has to already carry the attribute.
|
|
30
|
+
#
|
|
31
|
+
# Rewriting the selectors is somebody else's job. `transform` is anything answering `call` with
|
|
32
|
+
# the block's CSS and the selector to narrow it by:
|
|
33
|
+
#
|
|
34
|
+
# transform.call(".title { color: red }", scope: "[data-herb-scope-1a2b3c4d]")
|
|
35
|
+
# #=> ".title[data-herb-scope-1a2b3c4d] { color: red }"
|
|
36
|
+
#
|
|
37
|
+
# Anything the return value answers to `warnings` is reported, because CSS a transform kept
|
|
38
|
+
# without acting on it is CSS that does nothing once the page is rendered.
|
|
39
|
+
#
|
|
40
|
+
# `LightningCSS::Transformer` answers that, so it can be handed over as it is:
|
|
41
|
+
#
|
|
42
|
+
# Herb::Engine::ScopedStyle::Visitor.new(transform: LightningCSS::Transformer.new(minify: true))
|
|
43
|
+
#
|
|
44
|
+
# `scope` is the selector each rule has to be narrowed by, appended to what the rule already
|
|
45
|
+
# matches.
|
|
46
|
+
#
|
|
47
|
+
# Lightning CSS is what narrows a block unless something else is given, so `transform` is for
|
|
48
|
+
# narrowing it some other way. Without one at all, which is a machine with no `lightningcss` on
|
|
49
|
+
# it, a block is left exactly as it was written and reported. Scoping the markup while
|
|
50
|
+
# leaving the CSS alone would turn a scoped block into a global one. A `transform` that raises
|
|
51
|
+
# is treated the same way, so CSS nobody can read costs the block it was written in and not the
|
|
52
|
+
# whole template.
|
|
53
|
+
#
|
|
54
|
+
# `deliver` says where the narrowed CSS goes. `:inline` leaves the block where it was written,
|
|
55
|
+
# which needs nothing else installed and writes the block again on every render of the file it
|
|
56
|
+
# was written in. `:hoist` takes the block out and registers the CSS with the session the page
|
|
57
|
+
# is collecting into, which writes it once however many times the file renders, and needs
|
|
58
|
+
# `Herb::Engine::Runtime::Middleware` to put it on the page.
|
|
59
|
+
class Visitor < Herb::Visitor
|
|
60
|
+
extend Herb::Visitor::Experimental
|
|
61
|
+
|
|
62
|
+
include Herb::Visitor::ContextAware
|
|
63
|
+
|
|
64
|
+
include Herb::Visitor::Diagnostics
|
|
65
|
+
|
|
66
|
+
ARRAY_PROPERTIES: Array[Symbol]
|
|
67
|
+
|
|
68
|
+
NODE_PROPERTIES: Array[Symbol]
|
|
69
|
+
|
|
70
|
+
ATTRIBUTE_PREFIX: String
|
|
71
|
+
|
|
72
|
+
SCOPED_ATTRIBUTE: String
|
|
73
|
+
|
|
74
|
+
ANCHOR_ATTRIBUTE: String
|
|
75
|
+
|
|
76
|
+
UNSCOPABLE_ELEMENTS: Array[String]
|
|
77
|
+
|
|
78
|
+
OPEN_TAGS: Array[untyped]
|
|
79
|
+
|
|
80
|
+
DELIVERIES: Array[Symbol]
|
|
81
|
+
|
|
82
|
+
DIGEST_LENGTH: Integer
|
|
83
|
+
|
|
84
|
+
class Pending < Data
|
|
85
|
+
attr_reader node(): untyped
|
|
86
|
+
|
|
87
|
+
attr_reader open_tag(): untyped
|
|
88
|
+
|
|
89
|
+
attr_reader attribute(): untyped
|
|
90
|
+
|
|
91
|
+
attr_reader css(): untyped
|
|
92
|
+
|
|
93
|
+
attr_reader file(): untyped
|
|
94
|
+
|
|
95
|
+
attr_reader container(): untyped
|
|
96
|
+
|
|
97
|
+
def self.new: (untyped node, untyped open_tag, untyped attribute, untyped css, untyped file, untyped container) -> instance
|
|
98
|
+
| (node: untyped, open_tag: untyped, attribute: untyped, css: untyped, file: untyped, container: untyped) -> instance
|
|
99
|
+
|
|
100
|
+
def self.members: () -> [ :node, :open_tag, :attribute, :css, :file, :container ]
|
|
101
|
+
|
|
102
|
+
def members: () -> [ :node, :open_tag, :attribute, :css, :file, :container ]
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# : () -> bool
|
|
106
|
+
def self.rewrites_style_blocks?: () -> bool
|
|
107
|
+
|
|
108
|
+
# : (?transform: untyped, ?deliver: Symbol) -> void
|
|
109
|
+
def initialize: (?transform: untyped, ?deliver: Symbol) -> void
|
|
110
|
+
|
|
111
|
+
# : () -> Hash[String, String]
|
|
112
|
+
def styles: () -> Hash[String, String]
|
|
113
|
+
|
|
114
|
+
# : (Herb::AST::DocumentNode) -> void
|
|
115
|
+
def visit_document_node: (Herb::AST::DocumentNode) -> void
|
|
116
|
+
|
|
117
|
+
# : (Herb::AST::ERBBlockNode) -> void
|
|
118
|
+
def visit_erb_block_node: (Herb::AST::ERBBlockNode) -> void
|
|
119
|
+
|
|
120
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
121
|
+
def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
|
|
122
|
+
|
|
123
|
+
# : () -> String
|
|
124
|
+
def inspect: () -> String
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
|
|
128
|
+
# : () -> String
|
|
129
|
+
def current_file: () -> String
|
|
130
|
+
|
|
131
|
+
# : (Herb::AST::Node) -> Herb::Visitor::Context::Origin::Entry?
|
|
132
|
+
def enter: (Herb::AST::Node) -> Herb::Visitor::Context::Origin::Entry?
|
|
133
|
+
|
|
134
|
+
# : () -> void
|
|
135
|
+
def leave: () -> void
|
|
136
|
+
|
|
137
|
+
# : (Herb::AST::Node, ?Array[untyped]?) -> void
|
|
138
|
+
def collect: (Herb::AST::Node, ?Array[untyped]?) -> void
|
|
139
|
+
|
|
140
|
+
# : (Herb::AST::Node, Symbol) -> untyped
|
|
141
|
+
def property_of: (Herb::AST::Node, Symbol) -> untyped
|
|
142
|
+
|
|
143
|
+
# : (Herb::AST::HTMLElementNode, Array[untyped]?) -> void
|
|
144
|
+
def scope_style: (Herb::AST::HTMLElementNode, Array[untyped]?) -> void
|
|
145
|
+
|
|
146
|
+
# : () -> void
|
|
147
|
+
def narrow: () -> void
|
|
148
|
+
|
|
149
|
+
# : (Pending, String) -> String?
|
|
150
|
+
def narrowed_css: (Pending, String) -> String?
|
|
151
|
+
|
|
152
|
+
# : (Pending, String, String) -> void
|
|
153
|
+
def place: (Pending, String, String) -> void
|
|
154
|
+
|
|
155
|
+
# : (Pending) -> Integer?
|
|
156
|
+
def position_of: (Pending) -> Integer?
|
|
157
|
+
|
|
158
|
+
# : (String, String) -> Herb::AST::ERBContentNode
|
|
159
|
+
def register_node: (String, String) -> Herb::AST::ERBContentNode
|
|
160
|
+
|
|
161
|
+
# : (String) -> Herb::AST::HTMLAttributeNode
|
|
162
|
+
def anchor_node: (String) -> Herb::AST::HTMLAttributeNode
|
|
163
|
+
|
|
164
|
+
# : (Herb::AST::HTMLOpenTagNode, Herb::AST::HTMLAttributeNode, Herb::AST::HTMLAttributeNode) -> void
|
|
165
|
+
def replace_attribute: (Herb::AST::HTMLOpenTagNode, Herb::AST::HTMLAttributeNode, Herb::AST::HTMLAttributeNode) -> void
|
|
166
|
+
|
|
167
|
+
# : (Herb::AST::HTMLOpenTagNode, Herb::AST::HTMLAttributeNode) -> void
|
|
168
|
+
def remove_attribute: (Herb::AST::HTMLOpenTagNode, Herb::AST::HTMLAttributeNode) -> void
|
|
169
|
+
|
|
170
|
+
# : (Herb::AST::HTMLOpenTagNode) -> Herb::AST::HTMLAttributeNode?
|
|
171
|
+
def scoped_attribute: (Herb::AST::HTMLOpenTagNode) -> Herb::AST::HTMLAttributeNode?
|
|
172
|
+
|
|
173
|
+
# : (Herb::AST::HTMLAttributeNode) -> String?
|
|
174
|
+
def attribute_name: (Herb::AST::HTMLAttributeNode) -> String?
|
|
175
|
+
|
|
176
|
+
# : (Herb::AST::HTMLElementNode) -> String?
|
|
177
|
+
def static_css: (Herb::AST::HTMLElementNode) -> String?
|
|
178
|
+
|
|
179
|
+
# : (Herb::AST::HTMLElementNode) -> bool
|
|
180
|
+
def scopable_file?: (Herb::AST::HTMLElementNode) -> bool
|
|
181
|
+
|
|
182
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
183
|
+
def dynamic_style: (Herb::AST::HTMLElementNode) -> void
|
|
184
|
+
|
|
185
|
+
# : (Herb::AST::HTMLElementNode) -> void
|
|
186
|
+
def untransformed_style: (Herb::AST::HTMLElementNode) -> void
|
|
187
|
+
|
|
188
|
+
# : () -> untyped
|
|
189
|
+
def default_transform: () -> untyped
|
|
190
|
+
|
|
191
|
+
# : (Herb::AST::HTMLElementNode, StandardError, String) -> nil
|
|
192
|
+
def untransformable_style: (Herb::AST::HTMLElementNode, StandardError, String) -> nil
|
|
193
|
+
|
|
194
|
+
# : (Herb::AST::HTMLElementNode, untyped, String) -> void
|
|
195
|
+
def warned_style: (Herb::AST::HTMLElementNode, untyped, String) -> void
|
|
196
|
+
|
|
197
|
+
# : (String) -> String
|
|
198
|
+
def scope_selector: (String) -> String
|
|
199
|
+
|
|
200
|
+
# : (String) -> String
|
|
201
|
+
def scope_for: (String) -> String
|
|
202
|
+
|
|
203
|
+
# : (untyped) -> Array[untyped]?
|
|
204
|
+
def attribute_children: (untyped) -> Array[untyped]?
|
|
205
|
+
|
|
206
|
+
# : (Herb::AST::HTMLElementNode) -> bool
|
|
207
|
+
def scopable?: (Herb::AST::HTMLElementNode) -> bool
|
|
208
|
+
|
|
209
|
+
# : (String) -> Herb::AST::HTMLAttributeNode
|
|
210
|
+
def attribute_node: (String) -> Herb::AST::HTMLAttributeNode
|
|
211
|
+
|
|
212
|
+
# : (String) -> Herb::AST::LiteralNode
|
|
213
|
+
def literal_node: (String) -> Herb::AST::LiteralNode
|
|
214
|
+
|
|
215
|
+
# : () -> void
|
|
216
|
+
def report_empty_scopes: () -> void
|
|
217
|
+
end
|
|
218
|
+
end
|
|
219
|
+
end
|
|
220
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/annotation.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# What the visitor knows about one slot while it is still reading the template.
|
|
7
|
+
#
|
|
8
|
+
# A slot's index is its address, and an address cannot be handed out until it is known which
|
|
9
|
+
# slots survive: collapsing an invariant conditional drops one and merges the branches behind
|
|
10
|
+
# it. So the walk records annotations, which carry no index and can be marked as it learns
|
|
11
|
+
# more, and only the final pass turns the survivors into numbered slots.
|
|
12
|
+
class Annotation
|
|
13
|
+
attr_reader node: untyped
|
|
14
|
+
|
|
15
|
+
attr_accessor type: Symbol
|
|
16
|
+
|
|
17
|
+
attr_reader node_path: Array[Integer]
|
|
18
|
+
|
|
19
|
+
attr_accessor expression: String?
|
|
20
|
+
|
|
21
|
+
attr_accessor attribute: String?
|
|
22
|
+
|
|
23
|
+
attr_reader key_source: Symbol?
|
|
24
|
+
|
|
25
|
+
attr_reader key_expression: String?
|
|
26
|
+
|
|
27
|
+
attr_reader tag: String?
|
|
28
|
+
|
|
29
|
+
attr_reader scope: untyped
|
|
30
|
+
|
|
31
|
+
attr_reader depth: Integer
|
|
32
|
+
|
|
33
|
+
attr_accessor index: Integer?
|
|
34
|
+
|
|
35
|
+
attr_accessor name: String?
|
|
36
|
+
|
|
37
|
+
attr_accessor dropped: bool
|
|
38
|
+
|
|
39
|
+
attr_accessor merged_into: Annotation?
|
|
40
|
+
|
|
41
|
+
attr_reader covered: Array[Annotation]
|
|
42
|
+
|
|
43
|
+
# : (node: untyped, type: Symbol, node_path: Array[Integer], expression: String?, attribute: String?, key_source: Symbol?, key_expression: String?, tag: String?, scope: untyped, depth: Integer) -> void
|
|
44
|
+
def initialize: (node: untyped, type: Symbol, node_path: Array[Integer], expression: String?, attribute: String?, key_source: Symbol?, key_expression: String?, tag: String?, scope: untyped, depth: Integer) -> void
|
|
45
|
+
|
|
46
|
+
# : () -> bool
|
|
47
|
+
def gone?: () -> bool
|
|
48
|
+
|
|
49
|
+
# : () -> Annotation
|
|
50
|
+
def survivor: () -> Annotation
|
|
51
|
+
|
|
52
|
+
# : () -> bool
|
|
53
|
+
def structural?: () -> bool
|
|
54
|
+
|
|
55
|
+
# : () -> bool
|
|
56
|
+
def attribute?: () -> bool
|
|
57
|
+
|
|
58
|
+
# : () -> bool
|
|
59
|
+
def anchored?: () -> bool
|
|
60
|
+
|
|
61
|
+
# : () -> bool
|
|
62
|
+
def nameable?: () -> bool
|
|
63
|
+
|
|
64
|
+
# : () -> bool
|
|
65
|
+
def valued?: () -> bool
|
|
66
|
+
|
|
67
|
+
# : (Integer) -> untyped
|
|
68
|
+
def to_slot: (Integer) -> untyped
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/bindings.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# The state values a render call hands the partial it renders.
|
|
7
|
+
#
|
|
8
|
+
# A caller's compile rewrites `render "card", state: { open: modal_open }` into a call
|
|
9
|
+
# wrapped by `with`, so the values travel on a stack the partial's own state assignments
|
|
10
|
+
# read through `StateOverrides.resolve`. Two tables ride on every frame. A bound value
|
|
11
|
+
# aliases the partial's state to the caller's and wins over anything a client sent, since
|
|
12
|
+
# the client cannot tell two render sites of one partial apart. A seeded value only sets
|
|
13
|
+
# the partial's starting point, so a client that has since written the state wins over it.
|
|
14
|
+
#
|
|
15
|
+
# The stack lives in fiber storage, which a child fiber or thread inherits, so a render
|
|
16
|
+
# that streams or captures still sees the frames its caller pushed.
|
|
17
|
+
module Bindings
|
|
18
|
+
KEY: Symbol
|
|
19
|
+
|
|
20
|
+
class UncoercibleSeedError < StandardError
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# : (String, ?bound: Hash[String, untyped], ?seeded: Hash[String, untyped]) { () -> untyped } -> untyped
|
|
24
|
+
def self.with: (String, ?bound: Hash[String, untyped], ?seeded: Hash[String, untyped]) { () -> untyped } -> untyped
|
|
25
|
+
|
|
26
|
+
# : (String) -> Hash[Symbol, Hash[String, untyped]]?
|
|
27
|
+
def self.current: (String) -> Hash[Symbol, Hash[String, untyped]]?
|
|
28
|
+
|
|
29
|
+
# : (String, String, untyped) -> void
|
|
30
|
+
def self.check_seed: (String, String, untyped) -> void
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|