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,349 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/dynamics_compiler.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# Compiles a template into Ruby that returns its dynamic values rather than its HTML.
|
|
7
|
+
#
|
|
8
|
+
# `Herb::Engine` answers "what does this template render". This answers "what did the template
|
|
9
|
+
# evaluate to render it", which is the half that changes when state changes:
|
|
10
|
+
#
|
|
11
|
+
# require "herb/engine/slots/dynamics_compiler"
|
|
12
|
+
#
|
|
13
|
+
# source = Herb::Engine::Slots::DynamicsCompiler.new(%(<h1><%= @title %></h1>)).src
|
|
14
|
+
# view.instance_eval(source)
|
|
15
|
+
# #=> { template: "app/views/posts/index.html.erb", version: "fd3dfd36", slots: { 0 => "Hello" } }
|
|
16
|
+
#
|
|
17
|
+
# The names follow Phoenix LiveView, which splits a rendered template into its `static` strings
|
|
18
|
+
# and its `dynamic` values for the same reason. A template's statics never change between
|
|
19
|
+
# renders, so anything re-rendering on a state change only has to send the dynamics.
|
|
20
|
+
#
|
|
21
|
+
# This is a separate compiler rather than an option on `Herb::Engine` because that class is a
|
|
22
|
+
# drop-in for `Erubi::Engine` and has to keep answering the way Erubi does.
|
|
23
|
+
#
|
|
24
|
+
# ## Values name the template they came from
|
|
25
|
+
#
|
|
26
|
+
# An index means nothing on its own, because it is a position in one template's numbering, and
|
|
27
|
+
# it means something else in the next template. So the values arrive wrapped in the identifier
|
|
28
|
+
# and version `Visitor` gave the markers, which is the same pair the page carries in
|
|
29
|
+
# `<!--herb-region:ID:VERSION-->`. A client holding both can tell that they were compiled
|
|
30
|
+
# together, and a version that no longer matches says the indices cannot be trusted.
|
|
31
|
+
#
|
|
32
|
+
# ## The shape follows the template, not the render
|
|
33
|
+
#
|
|
34
|
+
# Every insertion point owns an index, decided while compiling and the same on every render.
|
|
35
|
+
# Control flow owns one too, because what it decided is itself a value that changes:
|
|
36
|
+
#
|
|
37
|
+
# <% if admin? %><%= secret %><% else %><%= public %><% end %>
|
|
38
|
+
# #=> { 0 => { branch: 0, slots: { 1 => "s" } } } when admin?
|
|
39
|
+
# #=> { 0 => { branch: 1, slots: { 2 => "p" } } } otherwise
|
|
40
|
+
#
|
|
41
|
+
# Both branches keep their own indices, so a condition flipping changes which indices are
|
|
42
|
+
# present and never what an index means.
|
|
43
|
+
#
|
|
44
|
+
# ## Absent means it did not run
|
|
45
|
+
#
|
|
46
|
+
# A key is missing when the code that would have filled it never ran, which is the same thing
|
|
47
|
+
# the rendered markup says by not being there. Nothing has to be sent about a branch that was
|
|
48
|
+
# not taken, and nothing can be learned about one either.
|
|
49
|
+
#
|
|
50
|
+
# A conditional and a collection are always present, because both are evaluated on every render
|
|
51
|
+
# even when they produce nothing. A conditional that matched no branch is `{ branch: nil }` and
|
|
52
|
+
# an empty collection is `{ items: {} }`, both of which the client has to be told.
|
|
53
|
+
#
|
|
54
|
+
# ## Collections group by item
|
|
55
|
+
#
|
|
56
|
+
# A collection holds its items in render order, each item carrying the slots inside it:
|
|
57
|
+
#
|
|
58
|
+
# <% users.each do |user| %><%= user.first %> <%= user.last %><% end %>
|
|
59
|
+
# #=> { 0 => { items: { 1 => { 1 => "Marco", 2 => "Roth" },
|
|
60
|
+
# 2 => { 1 => "Joe", 2 => "Doe" } } } }
|
|
61
|
+
#
|
|
62
|
+
# Grouping the other way would give one list per slot and leave the client to zip them back
|
|
63
|
+
# together, which it cannot do once an item is inserted rather than appended.
|
|
64
|
+
#
|
|
65
|
+
# An item is keyed by the key its template declares, through `herb-key` or `id` or a
|
|
66
|
+
# `<%# herb:key %>` directive, which is what makes it survive being reordered. `Visitor`
|
|
67
|
+
# decides what that key is and this evaluates it, so an item arrives under the same key the
|
|
68
|
+
# marker around it carries. A collection that declares none falls back to position.
|
|
69
|
+
#
|
|
70
|
+
# ## A partial keeps its own values
|
|
71
|
+
#
|
|
72
|
+
# `<%= render "posts/card" %>` evaluates to that partial's own values, so the slot holding it
|
|
73
|
+
# holds a whole payload rather than a string:
|
|
74
|
+
#
|
|
75
|
+
# { template: "index.html.erb", version: "a1b2c3d4",
|
|
76
|
+
# slots: { 0 => { template: "_card.html.erb", version: "e5f6a7b8", slots: { 0 => "Marco" } } } }
|
|
77
|
+
#
|
|
78
|
+
# Nothing else would work, because the partial numbers its slots in its own template and the
|
|
79
|
+
# page marks them out as their own region. Coercing it to a string would flatten a partial's
|
|
80
|
+
# values into the markup they were meant to replace, and a partial rendering a partial is
|
|
81
|
+
# ordinary, so this nests as deeply as the template does.
|
|
82
|
+
#
|
|
83
|
+
# ## Escaping
|
|
84
|
+
#
|
|
85
|
+
# A value carries the escaping of the place it was written, because that is where it is going
|
|
86
|
+
# back to. The same expression is escaped differently in an attribute, in a `<script>`, and in
|
|
87
|
+
# text, so the tree is left intact and the compiler decides as it normally would.
|
|
88
|
+
#
|
|
89
|
+
# ## Blocks
|
|
90
|
+
#
|
|
91
|
+
# A tag that takes a block, such as `<%= form_with do |f| %>`, owns an entry holding everything
|
|
92
|
+
# the block rendered, because the helper wraps that output in markup of its own that only the
|
|
93
|
+
# helper can produce. What the template wrote inside the block keeps its own indices alongside:
|
|
94
|
+
#
|
|
95
|
+
# <%= form_with(model: @user) do |f| %><%= f.label %><% end %>
|
|
96
|
+
# #=> { 0 => "<form>Name</form>", 1 => "Name" }
|
|
97
|
+
#
|
|
98
|
+
# So a caller that can address slot 1 sends a value, and one that cannot falls back to slot 0
|
|
99
|
+
# and the whole block. Slot 1 is inside slot 0, which the client already has to reason about
|
|
100
|
+
# for conditionals and collections.
|
|
101
|
+
#
|
|
102
|
+
# A block yielding more than once is the exception, since one index cannot stand for the several
|
|
103
|
+
# values its interior took. `each` and the other iterations are compiled as collections for that
|
|
104
|
+
# reason, and a helper that yields repeatedly reports the last value its interior took.
|
|
105
|
+
class DynamicsCompiler < Herb::Engine
|
|
106
|
+
BUFFER: String
|
|
107
|
+
|
|
108
|
+
BLOCK_BUFFER: String
|
|
109
|
+
|
|
110
|
+
SLOT_BUFFER: String
|
|
111
|
+
|
|
112
|
+
SCOPE_BUFFER: String
|
|
113
|
+
|
|
114
|
+
ITEMS_BUFFER: String
|
|
115
|
+
|
|
116
|
+
KEY_BUFFER: String
|
|
117
|
+
|
|
118
|
+
OCCURRENCE_BUFFER: String
|
|
119
|
+
|
|
120
|
+
BRANCHING_NODES: Array[String]
|
|
121
|
+
|
|
122
|
+
class Compiler < Herb::Engine::Compiler
|
|
123
|
+
# : (untyped, ?Hash[Symbol, untyped]) -> void
|
|
124
|
+
def initialize: (untyped, ?Hash[Symbol, untyped]) -> void
|
|
125
|
+
|
|
126
|
+
# : (untyped) -> void
|
|
127
|
+
def visit_html_attribute_node: (untyped) -> void
|
|
128
|
+
|
|
129
|
+
# : (untyped) -> void
|
|
130
|
+
def visit_html_element_node: (untyped) -> void
|
|
131
|
+
|
|
132
|
+
# : (untyped) -> void
|
|
133
|
+
def visit_erb_content_node: (untyped) -> void
|
|
134
|
+
|
|
135
|
+
# : (untyped) -> void
|
|
136
|
+
def visit_erb_yield_node: (untyped) -> void
|
|
137
|
+
|
|
138
|
+
# : (untyped) -> void
|
|
139
|
+
def visit_erb_render_node: (untyped) -> void
|
|
140
|
+
|
|
141
|
+
# : (untyped) { () -> void } -> void
|
|
142
|
+
def visit_erb_control_node: (untyped) { () -> void } -> void
|
|
143
|
+
|
|
144
|
+
# : (untyped) -> void
|
|
145
|
+
def visit_erb_if_node: (untyped) -> void
|
|
146
|
+
|
|
147
|
+
# : (untyped) -> void
|
|
148
|
+
def visit_erb_unless_node: (untyped) -> void
|
|
149
|
+
|
|
150
|
+
# : (untyped) -> void
|
|
151
|
+
def visit_erb_case_node: (untyped) -> void
|
|
152
|
+
|
|
153
|
+
# : (untyped) -> void
|
|
154
|
+
def visit_erb_case_match_node: (untyped) -> void
|
|
155
|
+
|
|
156
|
+
# : (untyped) -> void
|
|
157
|
+
def visit_erb_iteration_block_node: (untyped) -> void
|
|
158
|
+
|
|
159
|
+
# : (untyped) -> void
|
|
160
|
+
def visit_erb_for_node: (untyped) -> void
|
|
161
|
+
|
|
162
|
+
# : (untyped) -> void
|
|
163
|
+
def visit_erb_while_node: (untyped) -> void
|
|
164
|
+
|
|
165
|
+
# : (untyped) -> void
|
|
166
|
+
def visit_erb_until_node: (untyped) -> void
|
|
167
|
+
|
|
168
|
+
# : (untyped) -> void
|
|
169
|
+
def visit_erb_block_node: (untyped) -> void
|
|
170
|
+
|
|
171
|
+
# : () -> void
|
|
172
|
+
def generate_output: () -> void
|
|
173
|
+
|
|
174
|
+
private
|
|
175
|
+
|
|
176
|
+
# : (untyped) -> Integer?
|
|
177
|
+
def claim: (untyped) -> Integer?
|
|
178
|
+
|
|
179
|
+
# : (String) -> void
|
|
180
|
+
def add_expression: (String) -> void
|
|
181
|
+
|
|
182
|
+
# : (String) -> void
|
|
183
|
+
def add_expression_escaped: (String) -> void
|
|
184
|
+
|
|
185
|
+
# : (untyped) -> bool
|
|
186
|
+
def output_block?: (untyped) -> bool
|
|
187
|
+
|
|
188
|
+
# : (untyped) -> bool
|
|
189
|
+
def branch?: (untyped) -> bool
|
|
190
|
+
|
|
191
|
+
# : (Integer) -> Integer
|
|
192
|
+
def next_branch: (Integer) -> Integer
|
|
193
|
+
|
|
194
|
+
# : (untyped) { () -> void } -> void
|
|
195
|
+
def conditional: (untyped) { () -> void } -> void
|
|
196
|
+
|
|
197
|
+
# : (untyped, Integer) -> void
|
|
198
|
+
def own_branches: (untyped, Integer) -> void
|
|
199
|
+
|
|
200
|
+
# : (untyped) { (Integer?) -> void } -> void
|
|
201
|
+
def collection: (untyped) { (Integer?) -> void } -> void
|
|
202
|
+
|
|
203
|
+
# : (Integer?) { () -> void } -> void
|
|
204
|
+
def item: (Integer?) { () -> void } -> void
|
|
205
|
+
|
|
206
|
+
# : (Integer) -> String?
|
|
207
|
+
def item_key: (Integer) -> String?
|
|
208
|
+
|
|
209
|
+
# : (untyped, Symbol) -> void
|
|
210
|
+
def iteration: (untyped, Symbol) -> void
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
class Prune < Herb::Visitor
|
|
214
|
+
# : (Visitor, Integer) -> void
|
|
215
|
+
def initialize: (Visitor, Integer) -> void
|
|
216
|
+
|
|
217
|
+
# : (untyped) -> void
|
|
218
|
+
def visit_document_node: (untyped) -> void
|
|
219
|
+
|
|
220
|
+
private
|
|
221
|
+
|
|
222
|
+
# : (untyped, untyped) -> void
|
|
223
|
+
def keep: (untyped, untyped) -> void
|
|
224
|
+
|
|
225
|
+
# : (untyped, untyped) -> bool
|
|
226
|
+
def contains?: (untyped, untyped) -> bool
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
attr_reader slot_visitor: Visitor
|
|
230
|
+
|
|
231
|
+
# : (String, ?Hash[Symbol, untyped]) -> void
|
|
232
|
+
def initialize: (String, ?Hash[Symbol, untyped]) -> void
|
|
233
|
+
|
|
234
|
+
# : () -> untyped
|
|
235
|
+
def compiler_class: () -> untyped
|
|
236
|
+
|
|
237
|
+
# : (String) -> void
|
|
238
|
+
def add_text: (String) -> void
|
|
239
|
+
|
|
240
|
+
# : (Symbol, *untyped) -> void
|
|
241
|
+
def add_scope: (Symbol, *untyped) -> void
|
|
242
|
+
|
|
243
|
+
# : (String, Symbol?, Integer?, bool, ?nested: bool) -> void
|
|
244
|
+
def add_dynamic: (String, Symbol?, Integer?, bool, ?nested: bool) -> void
|
|
245
|
+
|
|
246
|
+
# : (Integer) -> bool
|
|
247
|
+
def boolean_presence?: (Integer) -> bool
|
|
248
|
+
|
|
249
|
+
# : (String, Integer?, bool) -> void
|
|
250
|
+
def add_dynamic_block: (String, Integer?, bool) -> void
|
|
251
|
+
|
|
252
|
+
# : (String, ?escaped: bool) -> void
|
|
253
|
+
def add_expression_block_end: (String, ?escaped: bool) -> void
|
|
254
|
+
|
|
255
|
+
# : () -> String
|
|
256
|
+
def inspect: () -> String
|
|
257
|
+
|
|
258
|
+
private
|
|
259
|
+
|
|
260
|
+
# : (String) -> void
|
|
261
|
+
def add_postamble: (String) -> void
|
|
262
|
+
|
|
263
|
+
# : () -> String
|
|
264
|
+
def region_seeds: () -> String
|
|
265
|
+
|
|
266
|
+
# : () -> void
|
|
267
|
+
def capture_occurrence: () -> void
|
|
268
|
+
|
|
269
|
+
# : () -> String
|
|
270
|
+
def current_scope: () -> String
|
|
271
|
+
|
|
272
|
+
# : (Integer) -> void
|
|
273
|
+
def scope_open_conditional: (Integer) -> void
|
|
274
|
+
|
|
275
|
+
# : (Integer, Integer) -> void
|
|
276
|
+
def scope_branch: (Integer, Integer) -> void
|
|
277
|
+
|
|
278
|
+
# : (Integer, Integer) -> String?
|
|
279
|
+
def payload_statics: (Integer, Integer) -> String?
|
|
280
|
+
|
|
281
|
+
# : () -> bool
|
|
282
|
+
def server_mode?: () -> bool
|
|
283
|
+
|
|
284
|
+
# : (Integer, Integer) -> bool
|
|
285
|
+
def withheld?: (Integer, Integer) -> bool
|
|
286
|
+
|
|
287
|
+
# : (Integer) -> String?
|
|
288
|
+
def item_statics: (Integer) -> String?
|
|
289
|
+
|
|
290
|
+
# : () -> Hash[String, String]
|
|
291
|
+
def branch_statics: () -> Hash[String, String]
|
|
292
|
+
|
|
293
|
+
# : (Integer) -> void
|
|
294
|
+
def scope_close_conditional: (Integer) -> void
|
|
295
|
+
|
|
296
|
+
# : (Integer) -> void
|
|
297
|
+
def scope_open_collection: (Integer) -> void
|
|
298
|
+
|
|
299
|
+
# : (Integer, ?String?) -> void
|
|
300
|
+
def scope_item_begin: (Integer, ?String?) -> void
|
|
301
|
+
|
|
302
|
+
# : (Integer) -> void
|
|
303
|
+
def scope_item_end: (Integer) -> void
|
|
304
|
+
|
|
305
|
+
# : (Integer) -> bool
|
|
306
|
+
def keyed?: (Integer) -> bool
|
|
307
|
+
|
|
308
|
+
# : (Integer) -> String
|
|
309
|
+
def item_seeds: (Integer) -> String
|
|
310
|
+
|
|
311
|
+
# : (Integer) -> void
|
|
312
|
+
def scope_close_collection: (Integer) -> void
|
|
313
|
+
|
|
314
|
+
# : (Integer, String) -> void
|
|
315
|
+
def scope_open_keyed: (Integer, String) -> void
|
|
316
|
+
|
|
317
|
+
# : (Integer) -> void
|
|
318
|
+
def scope_close_keyed: (Integer) -> void
|
|
319
|
+
|
|
320
|
+
# : (Integer) -> void
|
|
321
|
+
def leave_scope: (Integer) -> void
|
|
322
|
+
|
|
323
|
+
# : (String, Symbol?, bool) -> String
|
|
324
|
+
def dynamic_value: (String, Symbol?, bool) -> String
|
|
325
|
+
|
|
326
|
+
# : (Integer, String) -> String
|
|
327
|
+
def assignment: (Integer, String) -> String
|
|
328
|
+
|
|
329
|
+
# : (Integer) -> bool
|
|
330
|
+
def interpolated?: (Integer) -> bool
|
|
331
|
+
|
|
332
|
+
# : (String) -> void
|
|
333
|
+
def add_block_dynamic: (String) -> void
|
|
334
|
+
|
|
335
|
+
# : () -> void
|
|
336
|
+
def scope_part_open: () -> void
|
|
337
|
+
|
|
338
|
+
# : (Integer) -> void
|
|
339
|
+
def scope_part_close: (Integer) -> void
|
|
340
|
+
|
|
341
|
+
# : () -> void
|
|
342
|
+
def open_block: () -> void
|
|
343
|
+
|
|
344
|
+
# : () -> void
|
|
345
|
+
def close_block: () -> void
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
end
|
|
349
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/identifier.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# What a template is called on the wire. Markers, the values payload and the dependency map all
|
|
7
|
+
# name a template, and they only name the same one when they all follow this rule.
|
|
8
|
+
class Identifier
|
|
9
|
+
STRATEGIES: Array[Symbol]
|
|
10
|
+
|
|
11
|
+
# : ((Symbol | ^(String) -> String)) -> void
|
|
12
|
+
def initialize: (Symbol | ^(String) -> String) -> void
|
|
13
|
+
|
|
14
|
+
# : (String) -> String
|
|
15
|
+
def call: (String) -> String
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/manifest/channel.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
module Manifest
|
|
7
|
+
# What every template on a page said about itself, collected once however many times those
|
|
8
|
+
# templates rendered.
|
|
9
|
+
#
|
|
10
|
+
# A template compiled with `deliver: :hoist` registers here as it renders:
|
|
11
|
+
#
|
|
12
|
+
# ::Herb::Engine::Slots::Manifest::Channel.record("app/views/posts/_card.html.erb:a1b2c3d4", "{...}")
|
|
13
|
+
#
|
|
14
|
+
# It is a channel on the session the page is collecting into, so it registers itself the first
|
|
15
|
+
# time anything records, and nothing in `Report` or `Session` has to know it exists. A manifest
|
|
16
|
+
# is decided when a file is compiled, so the first template to record a version says everything
|
|
17
|
+
# there is to say about it and every later rendering costs nothing.
|
|
18
|
+
class Channel
|
|
19
|
+
NAME: Symbol
|
|
20
|
+
|
|
21
|
+
ATTRIBUTE: String
|
|
22
|
+
|
|
23
|
+
ANCHOR: Symbol
|
|
24
|
+
|
|
25
|
+
# : (String, String) -> void
|
|
26
|
+
def self.record: (String, String) -> void
|
|
27
|
+
|
|
28
|
+
# : () -> void
|
|
29
|
+
def initialize: () -> void
|
|
30
|
+
|
|
31
|
+
# : (String, String) -> void
|
|
32
|
+
def add: (String, String) -> void
|
|
33
|
+
|
|
34
|
+
# : () -> Hash[String, String]
|
|
35
|
+
def manifests: () -> Hash[String, String]
|
|
36
|
+
|
|
37
|
+
# : () -> Symbol
|
|
38
|
+
def anchor: () -> Symbol
|
|
39
|
+
|
|
40
|
+
# : () -> bool
|
|
41
|
+
def empty?: () -> bool
|
|
42
|
+
|
|
43
|
+
# : () -> String
|
|
44
|
+
def to_html: () -> String
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/manifest/collector.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
module Manifest
|
|
7
|
+
# What a set of templates says about itself, gathered without rendering any of them.
|
|
8
|
+
#
|
|
9
|
+
# A manifest is decided when a file is compiled, so everything a page needs to know about
|
|
10
|
+
# its templates is knowable ahead of time. This compiles each file for that and nothing
|
|
11
|
+
# else, which is what makes it possible to write the manifests into an asset and have
|
|
12
|
+
# templates carry none of them:
|
|
13
|
+
#
|
|
14
|
+
# collector = Herb::Engine::Slots::Manifest::Collector.new(project_path: root)
|
|
15
|
+
#
|
|
16
|
+
# collector.add("app/views/posts/_card.html.erb")
|
|
17
|
+
# collector.add("app/views/posts/index.html.erb")
|
|
18
|
+
#
|
|
19
|
+
# collector.to_json #=> the one file those templates add up to
|
|
20
|
+
#
|
|
21
|
+
# Which files to give it, and where the asset goes, is the job of whatever integrates Herb
|
|
22
|
+
# with a framework. This knows how to compile and what to keep.
|
|
23
|
+
class Collector < Engine::Collector
|
|
24
|
+
# : (?identifier: untyped?, ?project_path: (String | Pathname)?, **untyped) -> void
|
|
25
|
+
def initialize: (?identifier: untyped?, ?project_path: (String | Pathname)?, **untyped) -> void
|
|
26
|
+
|
|
27
|
+
# : ((String | Pathname), ?String?) -> String?
|
|
28
|
+
def add: (String | Pathname, ?String?) -> String?
|
|
29
|
+
|
|
30
|
+
# : () -> Hash[String, Hash[String, untyped]]
|
|
31
|
+
def manifests: () -> Hash[String, Hash[String, untyped]]
|
|
32
|
+
|
|
33
|
+
# : () -> bool
|
|
34
|
+
def empty?: () -> bool
|
|
35
|
+
|
|
36
|
+
# : () -> String
|
|
37
|
+
def to_json: () -> String
|
|
38
|
+
|
|
39
|
+
# : () -> String
|
|
40
|
+
def inspect: () -> String
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/markers.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
class Markers
|
|
7
|
+
DEFAULT_TYPE: Symbol
|
|
8
|
+
|
|
9
|
+
ITEM_STATICS: String
|
|
10
|
+
|
|
11
|
+
SEED_VALUE_TYPES: String
|
|
12
|
+
|
|
13
|
+
PREFIX: String
|
|
14
|
+
|
|
15
|
+
COMMENT: Regexp
|
|
16
|
+
|
|
17
|
+
# : (String) -> bool
|
|
18
|
+
def self.marker?: (String) -> bool
|
|
19
|
+
|
|
20
|
+
# : (String) -> String
|
|
21
|
+
def self.seeds_expression: (String) -> String
|
|
22
|
+
|
|
23
|
+
# : (Integer, Symbol) -> String
|
|
24
|
+
def slot_open: (Integer, Symbol) -> String
|
|
25
|
+
|
|
26
|
+
# : (Array[[Integer, Symbol, String?]]) -> String
|
|
27
|
+
def element_anchors: (Array[[ Integer, Symbol, String? ]]) -> String
|
|
28
|
+
|
|
29
|
+
# : (Integer) -> String
|
|
30
|
+
def slot_close: (Integer) -> String
|
|
31
|
+
|
|
32
|
+
# : (Integer, Integer | String) -> String
|
|
33
|
+
def branch: (Integer, Integer | String) -> String
|
|
34
|
+
|
|
35
|
+
# : (Integer, Integer | String) -> String
|
|
36
|
+
def statics_key: (Integer, Integer | String) -> String
|
|
37
|
+
|
|
38
|
+
# : (Integer) -> String
|
|
39
|
+
def item_statics_key: (Integer) -> String
|
|
40
|
+
|
|
41
|
+
# : () -> String
|
|
42
|
+
def seeds_open_prefix: () -> String
|
|
43
|
+
|
|
44
|
+
# : () -> String
|
|
45
|
+
def seeds_open_suffix: () -> String
|
|
46
|
+
|
|
47
|
+
# : (Integer) -> String
|
|
48
|
+
def keyed_open_prefix: (Integer) -> String
|
|
49
|
+
|
|
50
|
+
# : () -> String
|
|
51
|
+
def keyed_open_suffix: () -> String
|
|
52
|
+
|
|
53
|
+
# : (Integer) -> String
|
|
54
|
+
def item_open_prefix: (Integer) -> String
|
|
55
|
+
|
|
56
|
+
# : () -> String
|
|
57
|
+
def item_open_suffix: () -> String
|
|
58
|
+
|
|
59
|
+
# : (Integer) -> String
|
|
60
|
+
def item_close: (Integer) -> String
|
|
61
|
+
|
|
62
|
+
# : (String, String) -> String
|
|
63
|
+
def region_open_prefix: (String, String) -> String
|
|
64
|
+
|
|
65
|
+
# : () -> String
|
|
66
|
+
def region_open_suffix: () -> String
|
|
67
|
+
|
|
68
|
+
# : (String) -> String
|
|
69
|
+
def region_close: (String) -> String
|
|
70
|
+
|
|
71
|
+
# : (String, String) -> String
|
|
72
|
+
def statics_open: (String, String) -> String
|
|
73
|
+
|
|
74
|
+
# : () -> String
|
|
75
|
+
def statics_close: () -> String
|
|
76
|
+
|
|
77
|
+
# : () -> String
|
|
78
|
+
def manifests_open: () -> String
|
|
79
|
+
|
|
80
|
+
# : () -> String
|
|
81
|
+
def manifests_close: () -> String
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/render_bindings.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# Reads the `state:` entries off a render call and answers the call without them.
|
|
7
|
+
#
|
|
8
|
+
# The parser already took the hash apart into one declaration node per entry, with the
|
|
9
|
+
# kind it would give a `herb:state` default, so a value the parser calls bare is a
|
|
10
|
+
# candidate for a binding to one of the caller's states and anything else is a seed.
|
|
11
|
+
# The splice works on the argument's location, turned into an index into the tag's
|
|
12
|
+
# content, so the stripped call is the original source minus exactly the `state:`
|
|
13
|
+
# argument and the comma that carried it.
|
|
14
|
+
module RenderBindings
|
|
15
|
+
BARE_IDENTIFIER: Regexp
|
|
16
|
+
|
|
17
|
+
SPLAT: String
|
|
18
|
+
|
|
19
|
+
REFUSED: Hash[Symbol, String]
|
|
20
|
+
|
|
21
|
+
class Entry < Data
|
|
22
|
+
attr_reader name(): String
|
|
23
|
+
|
|
24
|
+
attr_reader source(): String
|
|
25
|
+
|
|
26
|
+
attr_reader candidate(): String?
|
|
27
|
+
|
|
28
|
+
attr_reader kind(): Symbol
|
|
29
|
+
|
|
30
|
+
attr_reader location(): Herb::Location?
|
|
31
|
+
|
|
32
|
+
def self.new: (String name, String source, String? candidate, Symbol kind, Herb::Location? location) -> instance
|
|
33
|
+
| (name: String, source: String, candidate: String?, kind: Symbol, location: Herb::Location?) -> instance
|
|
34
|
+
|
|
35
|
+
def self.members: () -> [ :name, :source, :candidate, :kind, :location ]
|
|
36
|
+
|
|
37
|
+
def members: () -> [ :name, :source, :candidate, :kind, :location ]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
class Analysis < Data
|
|
41
|
+
attr_reader entries(): Array[Entry]
|
|
42
|
+
|
|
43
|
+
attr_reader stripped(): String
|
|
44
|
+
|
|
45
|
+
attr_reader problems(): Array[[ String, String, Herb::Location? ]]
|
|
46
|
+
|
|
47
|
+
def self.new: (Array[Entry] entries, String stripped, Array[[ String, String, Herb::Location? ]] problems) -> instance
|
|
48
|
+
| (entries: Array[Entry], stripped: String, problems: Array[[ String, String, Herb::Location? ]]) -> instance
|
|
49
|
+
|
|
50
|
+
def self.members: () -> [ :entries, :stripped, :problems ]
|
|
51
|
+
|
|
52
|
+
def members: () -> [ :entries, :stripped, :problems ]
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# : (untyped) -> Analysis?
|
|
56
|
+
def self.analyze: (untyped) -> Analysis?
|
|
57
|
+
|
|
58
|
+
# : (untyped, Array[Entry], Array[[String, String, Herb::Location?]]) -> void
|
|
59
|
+
def self.collect: (untyped, Array[Entry], Array[[ String, String, Herb::Location? ]]) -> void
|
|
60
|
+
|
|
61
|
+
# : (untyped, Herb::Location) -> String?
|
|
62
|
+
def self.strip: (untyped, Herb::Location) -> String?
|
|
63
|
+
|
|
64
|
+
# : (untyped, Herb::Position) -> Integer?
|
|
65
|
+
def self.index_in: (untyped, Herb::Position) -> Integer?
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
# Generated from lib/herb/engine/slots/schema_compiler.rb with RBS::Inline
|
|
2
|
+
|
|
3
|
+
module Herb
|
|
4
|
+
class Engine
|
|
5
|
+
module Slots
|
|
6
|
+
# Compiles a template into what a browser needs to know about its slots, without
|
|
7
|
+
# rendering anything.
|
|
8
|
+
#
|
|
9
|
+
# Slot identity depends on every visitor that runs before the slot visitor, and only
|
|
10
|
+
# the host knows its stack, so the host hands one over and this runs it. The stack
|
|
11
|
+
# arrives as a builder returning fresh visitors, because a visitor is stateful and the
|
|
12
|
+
# statics need a second compile:
|
|
13
|
+
#
|
|
14
|
+
# result = Herb::Engine::Slots::SchemaCompiler.call(
|
|
15
|
+
# source,
|
|
16
|
+
# filename: "app/views/posts/index.html.erb",
|
|
17
|
+
# mode: :client,
|
|
18
|
+
# visitors: -> { [Herb::Engine::Validators::SecurityValidator.new(fatal: false)] }
|
|
19
|
+
# )
|
|
20
|
+
#
|
|
21
|
+
# result.version #=> "5d1e0c77"
|
|
22
|
+
# result.manifest #=> what the page's manifest says
|
|
23
|
+
# result.static_markup #=> the markup with every slot as an empty marker pair
|
|
24
|
+
#
|
|
25
|
+
# A nil `mode` means slots are off for this template. The stack still runs so its
|
|
26
|
+
# diagnostics still flow, and everything slot-shaped comes back nil.
|
|
27
|
+
class SchemaCompiler
|
|
28
|
+
class Result < Data
|
|
29
|
+
attr_reader mode(): Symbol?
|
|
30
|
+
|
|
31
|
+
attr_reader manifest(): Hash[String, untyped]?
|
|
32
|
+
|
|
33
|
+
attr_reader version(): String?
|
|
34
|
+
|
|
35
|
+
attr_reader slot_entries(): Array[Hash[Symbol, untyped]]?
|
|
36
|
+
|
|
37
|
+
attr_reader statics(): Hash[String, String]?
|
|
38
|
+
|
|
39
|
+
attr_reader static_markup(): String?
|
|
40
|
+
|
|
41
|
+
attr_reader diagnostics(): Array[Herb::Diagnostic]
|
|
42
|
+
|
|
43
|
+
def self.new: (Symbol? mode, Hash[String, untyped]? manifest, String? version, Array[Hash[Symbol, untyped]]? slot_entries, Hash[String, String]? statics, String? static_markup, Array[Herb::Diagnostic] diagnostics) -> instance
|
|
44
|
+
| (mode: Symbol?, manifest: Hash[String, untyped]?, version: String?, slot_entries: Array[Hash[Symbol, untyped]]?, statics: Hash[String, String]?, static_markup: String?, diagnostics: Array[Herb::Diagnostic]) -> instance
|
|
45
|
+
|
|
46
|
+
def self.members: () -> [ :mode, :manifest, :version, :slot_entries, :statics, :static_markup, :diagnostics ]
|
|
47
|
+
|
|
48
|
+
def members: () -> [ :mode, :manifest, :version, :slot_entries, :statics, :static_markup, :diagnostics ]
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# : (String, filename: String, mode: Symbol?, ?visitors: ^() -> Array[::Herb::Visitor], ?engine: singleton(::Herb::Engine), ?options: Hash[Symbol, untyped]) -> Result
|
|
52
|
+
def self.call: (String, filename: String, mode: Symbol?, ?visitors: ^() -> Array[::Herb::Visitor], ?engine: singleton(::Herb::Engine), ?options: Hash[Symbol, untyped]) -> Result
|
|
53
|
+
|
|
54
|
+
# : (singleton(::Herb::Engine), String, String, Array[::Herb::Visitor], Hash[Symbol, untyped]) -> void
|
|
55
|
+
def self.compile: (singleton(::Herb::Engine), String, String, Array[::Herb::Visitor], Hash[Symbol, untyped]) -> void
|
|
56
|
+
|
|
57
|
+
# : (Array[::Herb::Visitor]) -> Array[Herb::Diagnostic]
|
|
58
|
+
def self.collect: (Array[::Herb::Visitor]) -> Array[Herb::Diagnostic]
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|