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.
Files changed (784) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +16 -6
  3. data/README.md +36 -119
  4. data/Rakefile +2 -11
  5. data/config/action_view_helpers/actioncable/action_cable_helper/action_cable_meta_tag.yml +12 -8
  6. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy?.yml +9 -6
  7. data/config/action_view_helpers/actionpack/content_security_policy/content_security_policy_nonce.yml +9 -6
  8. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_path.yml +20 -12
  9. data/config/action_view_helpers/actionpack/polymorphic_routes/polymorphic_url.yml +30 -18
  10. data/config/action_view_helpers/actionpack/request_forgery_protection/form_authenticity_token.yml +15 -9
  11. data/config/action_view_helpers/actionpack/request_forgery_protection/protect_against_forgery?.yml +9 -6
  12. data/config/action_view_helpers/actiontext/content_helper/render_action_text_content.yml +15 -9
  13. data/config/action_view_helpers/actiontext/content_helper/sanitize_action_text_content.yml +15 -9
  14. data/config/action_view_helpers/actiontext/tag_helper/rich_textarea_tag.yml +34 -22
  15. data/config/action_view_helpers/actionview/active_model_helper/error_message.yml +9 -6
  16. data/config/action_view_helpers/actionview/active_model_helper/error_wrapping.yml +9 -6
  17. data/config/action_view_helpers/actionview/active_model_helper/object.yml +9 -6
  18. data/config/action_view_helpers/actionview/asset_tag_helper/apply_stylesheet_media_default.yml +9 -6
  19. data/config/action_view_helpers/actionview/asset_tag_helper/audio_tag.yml +40 -27
  20. data/config/action_view_helpers/actionview/asset_tag_helper/auto_discovery_link_tag.yml +37 -23
  21. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce.yml +9 -6
  22. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_scripts.yml +9 -6
  23. data/config/action_view_helpers/actionview/asset_tag_helper/auto_include_nonce_for_styles.yml +9 -6
  24. data/config/action_view_helpers/actionview/asset_tag_helper/favicon_link_tag.yml +32 -22
  25. data/config/action_view_helpers/actionview/asset_tag_helper/image_decoding.yml +9 -6
  26. data/config/action_view_helpers/actionview/asset_tag_helper/image_loading.yml +9 -6
  27. data/config/action_view_helpers/actionview/asset_tag_helper/image_tag.yml +67 -46
  28. data/config/action_view_helpers/actionview/asset_tag_helper/javascript_include_tag.yml +58 -39
  29. data/config/action_view_helpers/actionview/asset_tag_helper/picture_tag.yml +22 -14
  30. data/config/action_view_helpers/actionview/asset_tag_helper/preload_link_tag.yml +45 -30
  31. data/config/action_view_helpers/actionview/asset_tag_helper/preload_links_header.yml +9 -6
  32. data/config/action_view_helpers/actionview/asset_tag_helper/stylesheet_link_tag.yml +49 -30
  33. data/config/action_view_helpers/actionview/asset_tag_helper/video_tag.yml +53 -35
  34. data/config/action_view_helpers/actionview/asset_url_helper/asset_path.yml +16 -10
  35. data/config/action_view_helpers/actionview/asset_url_helper/asset_url.yml +16 -10
  36. data/config/action_view_helpers/actionview/asset_url_helper/audio_path.yml +16 -10
  37. data/config/action_view_helpers/actionview/asset_url_helper/audio_url.yml +16 -10
  38. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_extname.yml +9 -6
  39. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_host.yml +9 -6
  40. data/config/action_view_helpers/actionview/asset_url_helper/compute_asset_path.yml +9 -6
  41. data/config/action_view_helpers/actionview/asset_url_helper/font_path.yml +16 -10
  42. data/config/action_view_helpers/actionview/asset_url_helper/font_url.yml +16 -10
  43. data/config/action_view_helpers/actionview/asset_url_helper/image_path.yml +16 -10
  44. data/config/action_view_helpers/actionview/asset_url_helper/image_url.yml +16 -10
  45. data/config/action_view_helpers/actionview/asset_url_helper/javascript_path.yml +16 -10
  46. data/config/action_view_helpers/actionview/asset_url_helper/javascript_url.yml +16 -10
  47. data/config/action_view_helpers/actionview/asset_url_helper/public_compute_asset_path.yml +9 -6
  48. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_path.yml +16 -10
  49. data/config/action_view_helpers/actionview/asset_url_helper/stylesheet_url.yml +16 -10
  50. data/config/action_view_helpers/actionview/asset_url_helper/video_path.yml +16 -10
  51. data/config/action_view_helpers/actionview/asset_url_helper/video_url.yml +16 -10
  52. data/config/action_view_helpers/actionview/atom_feed_helper/atom_feed.yml +52 -27
  53. data/config/action_view_helpers/actionview/cache_helper/cache.yml +25 -15
  54. data/config/action_view_helpers/actionview/cache_helper/cache_fragment_name.yml +9 -6
  55. data/config/action_view_helpers/actionview/cache_helper/cache_if.yml +20 -12
  56. data/config/action_view_helpers/actionview/cache_helper/cache_unless.yml +20 -12
  57. data/config/action_view_helpers/actionview/cache_helper/caching_predicate.yml +9 -6
  58. data/config/action_view_helpers/actionview/cache_helper/digest_path_from_template.yml +9 -6
  59. data/config/action_view_helpers/actionview/cache_helper/fragment_for.yml +9 -6
  60. data/config/action_view_helpers/actionview/cache_helper/fragment_name_with_digest.yml +9 -6
  61. data/config/action_view_helpers/actionview/cache_helper/read_fragment_for.yml +9 -6
  62. data/config/action_view_helpers/actionview/cache_helper/uncacheable.yml +9 -6
  63. data/config/action_view_helpers/actionview/cache_helper/write_fragment_for.yml +9 -6
  64. data/config/action_view_helpers/actionview/capture_helper/capture.yml +9 -6
  65. data/config/action_view_helpers/actionview/capture_helper/content_for.yml +20 -12
  66. data/config/action_view_helpers/actionview/capture_helper/content_for_predicate.yml +15 -9
  67. data/config/action_view_helpers/actionview/capture_helper/provide.yml +15 -9
  68. data/config/action_view_helpers/actionview/capture_helper/with_output_buffer.yml +9 -6
  69. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prepend_content_exfiltration_prevention.yml +9 -6
  70. data/config/action_view_helpers/actionview/content_exfiltration_prevention_helper/prevent_content_exfiltration.yml +9 -6
  71. data/config/action_view_helpers/actionview/controller_helper/action_name.yml +9 -6
  72. data/config/action_view_helpers/actionview/controller_helper/assign_controller.yml +9 -6
  73. data/config/action_view_helpers/actionview/controller_helper/controller.yml +9 -6
  74. data/config/action_view_helpers/actionview/controller_helper/controller_name.yml +9 -6
  75. data/config/action_view_helpers/actionview/controller_helper/controller_path.yml +9 -6
  76. data/config/action_view_helpers/actionview/controller_helper/cookies.yml +9 -6
  77. data/config/action_view_helpers/actionview/controller_helper/flash.yml +9 -6
  78. data/config/action_view_helpers/actionview/controller_helper/headers.yml +9 -6
  79. data/config/action_view_helpers/actionview/controller_helper/logger.yml +9 -6
  80. data/config/action_view_helpers/actionview/controller_helper/params.yml +9 -6
  81. data/config/action_view_helpers/actionview/controller_helper/request.yml +9 -6
  82. data/config/action_view_helpers/actionview/controller_helper/request_forgery_protection_token.yml +9 -6
  83. data/config/action_view_helpers/actionview/controller_helper/response.yml +9 -6
  84. data/config/action_view_helpers/actionview/controller_helper/session.yml +9 -6
  85. data/config/action_view_helpers/actionview/csp_helper/csp_meta_tag.yml +18 -11
  86. data/config/action_view_helpers/actionview/csrf_helper/csrf_meta_tags.yml +16 -10
  87. data/config/action_view_helpers/actionview/date_helper/date_select.yml +85 -51
  88. data/config/action_view_helpers/actionview/date_helper/datetime_select.yml +65 -39
  89. data/config/action_view_helpers/actionview/date_helper/distance_of_time_in_words.yml +30 -18
  90. data/config/action_view_helpers/actionview/date_helper/relative_time_in_words.yml +35 -21
  91. data/config/action_view_helpers/actionview/date_helper/select_date.yml +50 -30
  92. data/config/action_view_helpers/actionview/date_helper/select_datetime.yml +65 -39
  93. data/config/action_view_helpers/actionview/date_helper/select_day.yml +40 -24
  94. data/config/action_view_helpers/actionview/date_helper/select_hour.yml +50 -30
  95. data/config/action_view_helpers/actionview/date_helper/select_minute.yml +40 -24
  96. data/config/action_view_helpers/actionview/date_helper/select_month.yml +60 -36
  97. data/config/action_view_helpers/actionview/date_helper/select_second.yml +35 -21
  98. data/config/action_view_helpers/actionview/date_helper/select_time.yml +55 -33
  99. data/config/action_view_helpers/actionview/date_helper/select_year.yml +45 -27
  100. data/config/action_view_helpers/actionview/date_helper/time_ago_in_words.yml +21 -13
  101. data/config/action_view_helpers/actionview/date_helper/time_select.yml +60 -36
  102. data/config/action_view_helpers/actionview/date_helper/time_tag.yml +32 -20
  103. data/config/action_view_helpers/actionview/debug_helper/debug.yml +15 -9
  104. data/config/action_view_helpers/actionview/form_builder/button.yml +60 -0
  105. data/config/action_view_helpers/actionview/form_builder/submit.yml +48 -0
  106. data/config/action_view_helpers/actionview/form_helper/apply_form_for_options.yml +9 -6
  107. data/config/action_view_helpers/actionview/form_helper/checkbox.yml +41 -25
  108. data/config/action_view_helpers/actionview/form_helper/color_field.yml +25 -15
  109. data/config/action_view_helpers/actionview/form_helper/date_field.yml +35 -21
  110. data/config/action_view_helpers/actionview/form_helper/datetime_field.yml +41 -25
  111. data/config/action_view_helpers/actionview/form_helper/email_field.yml +25 -15
  112. data/config/action_view_helpers/actionview/form_helper/emitted_hidden_id.yml +9 -6
  113. data/config/action_view_helpers/actionview/form_helper/fields.yml +37 -18
  114. data/config/action_view_helpers/actionview/form_helper/fields_for.yml +33 -15
  115. data/config/action_view_helpers/actionview/form_helper/file_field.yml +45 -27
  116. data/config/action_view_helpers/actionview/form_helper/form_for.yml +45 -24
  117. data/config/action_view_helpers/actionview/form_helper/form_with.yml +56 -30
  118. data/config/action_view_helpers/actionview/form_helper/form_with_generates_ids.yml +9 -6
  119. data/config/action_view_helpers/actionview/form_helper/form_with_generates_remote_forms.yml +9 -6
  120. data/config/action_view_helpers/actionview/form_helper/hidden_field.yml +25 -15
  121. data/config/action_view_helpers/actionview/form_helper/label.yml +52 -27
  122. data/config/action_view_helpers/actionview/form_helper/month_field.yml +25 -15
  123. data/config/action_view_helpers/actionview/form_helper/multipart.yml +9 -6
  124. data/config/action_view_helpers/actionview/form_helper/multiple_file_field_include_hidden.yml +9 -6
  125. data/config/action_view_helpers/actionview/form_helper/number_field.yml +45 -27
  126. data/config/action_view_helpers/actionview/form_helper/password_field.yml +25 -15
  127. data/config/action_view_helpers/actionview/form_helper/radio_button.yml +30 -18
  128. data/config/action_view_helpers/actionview/form_helper/range_field.yml +45 -27
  129. data/config/action_view_helpers/actionview/form_helper/search_field.yml +25 -15
  130. data/config/action_view_helpers/actionview/form_helper/telephone_field.yml +26 -16
  131. data/config/action_view_helpers/actionview/form_helper/text_field.yml +25 -15
  132. data/config/action_view_helpers/actionview/form_helper/textarea.yml +31 -19
  133. data/config/action_view_helpers/actionview/form_helper/time_field.yml +40 -24
  134. data/config/action_view_helpers/actionview/form_helper/url_field.yml +25 -15
  135. data/config/action_view_helpers/actionview/form_helper/week_field.yml +25 -15
  136. data/config/action_view_helpers/actionview/form_options_helper/collection_checkboxes.yml +58 -31
  137. data/config/action_view_helpers/actionview/form_options_helper/collection_radio_buttons.yml +57 -30
  138. data/config/action_view_helpers/actionview/form_options_helper/collection_select.yml +65 -39
  139. data/config/action_view_helpers/actionview/form_options_helper/grouped_collection_select.yml +65 -39
  140. data/config/action_view_helpers/actionview/form_options_helper/grouped_options_for_select.yml +35 -21
  141. data/config/action_view_helpers/actionview/form_options_helper/option_groups_from_collection_for_select.yml +40 -24
  142. data/config/action_view_helpers/actionview/form_options_helper/options_for_select.yml +20 -12
  143. data/config/action_view_helpers/actionview/form_options_helper/options_from_collection_for_select.yml +30 -18
  144. data/config/action_view_helpers/actionview/form_options_helper/select.yml +60 -36
  145. data/config/action_view_helpers/actionview/form_options_helper/time_zone_options_for_select.yml +25 -15
  146. data/config/action_view_helpers/actionview/form_options_helper/time_zone_select.yml +50 -30
  147. data/config/action_view_helpers/actionview/form_options_helper/weekday_options_for_select.yml +30 -18
  148. data/config/action_view_helpers/actionview/form_options_helper/weekday_select.yml +30 -18
  149. data/config/action_view_helpers/actionview/form_tag_helper/button_tag.yml +39 -21
  150. data/config/action_view_helpers/actionview/form_tag_helper/checkbox_tag.yml +33 -21
  151. data/config/action_view_helpers/actionview/form_tag_helper/color_field_tag.yml +26 -17
  152. data/config/action_view_helpers/actionview/form_tag_helper/date_field_tag.yml +27 -17
  153. data/config/action_view_helpers/actionview/form_tag_helper/datetime_field_tag.yml +28 -18
  154. data/config/action_view_helpers/actionview/form_tag_helper/default_enforce_utf8.yml +9 -6
  155. data/config/action_view_helpers/actionview/form_tag_helper/email_field_tag.yml +27 -17
  156. data/config/action_view_helpers/actionview/form_tag_helper/embed_authenticity_token_in_remote_forms.yml +9 -6
  157. data/config/action_view_helpers/actionview/form_tag_helper/field_id.yml +30 -18
  158. data/config/action_view_helpers/actionview/form_tag_helper/field_name.yml +30 -18
  159. data/config/action_view_helpers/actionview/form_tag_helper/field_set_tag.yml +23 -15
  160. data/config/action_view_helpers/actionview/form_tag_helper/file_field_tag.yml +35 -22
  161. data/config/action_view_helpers/actionview/form_tag_helper/form_tag.yml +38 -24
  162. data/config/action_view_helpers/actionview/form_tag_helper/hidden_field_tag.yml +27 -17
  163. data/config/action_view_helpers/actionview/form_tag_helper/image_submit_tag.yml +31 -21
  164. data/config/action_view_helpers/actionview/form_tag_helper/label_tag.yml +33 -17
  165. data/config/action_view_helpers/actionview/form_tag_helper/month_field_tag.yml +27 -17
  166. data/config/action_view_helpers/actionview/form_tag_helper/number_field_tag.yml +47 -29
  167. data/config/action_view_helpers/actionview/form_tag_helper/password_field_tag.yml +27 -17
  168. data/config/action_view_helpers/actionview/form_tag_helper/radio_button_tag.yml +32 -20
  169. data/config/action_view_helpers/actionview/form_tag_helper/range_field_tag.yml +47 -29
  170. data/config/action_view_helpers/actionview/form_tag_helper/search_field_tag.yml +27 -17
  171. data/config/action_view_helpers/actionview/form_tag_helper/select_tag.yml +47 -29
  172. data/config/action_view_helpers/actionview/form_tag_helper/submit_tag.yml +33 -21
  173. data/config/action_view_helpers/actionview/form_tag_helper/telephone_field_tag.yml +28 -18
  174. data/config/action_view_helpers/actionview/form_tag_helper/text_field_tag.yml +27 -17
  175. data/config/action_view_helpers/actionview/form_tag_helper/textarea_tag.yml +31 -20
  176. data/config/action_view_helpers/actionview/form_tag_helper/time_field_tag.yml +27 -17
  177. data/config/action_view_helpers/actionview/form_tag_helper/url_field_tag.yml +27 -17
  178. data/config/action_view_helpers/actionview/form_tag_helper/utf8_enforcer_tag.yml +9 -6
  179. data/config/action_view_helpers/actionview/form_tag_helper/week_field_tag.yml +28 -18
  180. data/config/action_view_helpers/actionview/javascript_helper/escape_javascript.yml +16 -10
  181. data/config/action_view_helpers/actionview/javascript_helper/javascript_cdata_section.yml +9 -6
  182. data/config/action_view_helpers/actionview/javascript_helper/javascript_tag.yml +41 -27
  183. data/config/action_view_helpers/actionview/number_helper/number_to_currency.yml +29 -18
  184. data/config/action_view_helpers/actionview/number_helper/number_to_human.yml +25 -15
  185. data/config/action_view_helpers/actionview/number_helper/number_to_human_size.yml +20 -12
  186. data/config/action_view_helpers/actionview/number_helper/number_to_percentage.yml +20 -12
  187. data/config/action_view_helpers/actionview/number_helper/number_to_phone.yml +33 -20
  188. data/config/action_view_helpers/actionview/number_helper/number_with_delimiter.yml +21 -13
  189. data/config/action_view_helpers/actionview/number_helper/number_with_precision.yml +25 -15
  190. data/config/action_view_helpers/actionview/output_safety_helper/raw.yml +15 -9
  191. data/config/action_view_helpers/actionview/output_safety_helper/safe_join.yml +20 -12
  192. data/config/action_view_helpers/actionview/output_safety_helper/to_sentence.yml +24 -15
  193. data/config/action_view_helpers/actionview/record_identifier/dom_class.yml +20 -12
  194. data/config/action_view_helpers/actionview/record_identifier/dom_id.yml +20 -12
  195. data/config/action_view_helpers/actionview/record_identifier/dom_target.yml +15 -9
  196. data/config/action_view_helpers/actionview/record_identifier/model_name_from_record_or_class.yml +9 -6
  197. data/config/action_view_helpers/actionview/rendering_helper/render.yml +108 -22
  198. data/config/action_view_helpers/actionview/sanitize_helper/sanitize.yml +25 -15
  199. data/config/action_view_helpers/actionview/sanitize_helper/sanitize_css.yml +15 -9
  200. data/config/action_view_helpers/actionview/sanitize_helper/sanitizer_vendor.yml +9 -6
  201. data/config/action_view_helpers/actionview/sanitize_helper/strip_links.yml +15 -9
  202. data/config/action_view_helpers/actionview/sanitize_helper/strip_tags.yml +15 -9
  203. data/config/action_view_helpers/actionview/tag_helper/cdata_section.yml +15 -9
  204. data/config/action_view_helpers/actionview/tag_helper/content_tag.yml +59 -38
  205. data/config/action_view_helpers/actionview/tag_helper/escape_once.yml +15 -9
  206. data/config/action_view_helpers/actionview/tag_helper/tag.yml +54 -31
  207. data/config/action_view_helpers/actionview/tag_helper/token_list.yml +16 -10
  208. data/config/action_view_helpers/actionview/text_helper/concat.yml +15 -9
  209. data/config/action_view_helpers/actionview/text_helper/current_cycle.yml +15 -9
  210. data/config/action_view_helpers/actionview/text_helper/cycle.yml +23 -14
  211. data/config/action_view_helpers/actionview/text_helper/excerpt.yml +33 -20
  212. data/config/action_view_helpers/actionview/text_helper/highlight.yml +37 -18
  213. data/config/action_view_helpers/actionview/text_helper/pluralize.yml +30 -18
  214. data/config/action_view_helpers/actionview/text_helper/reset_cycle.yml +15 -9
  215. data/config/action_view_helpers/actionview/text_helper/safe_concat.yml +9 -6
  216. data/config/action_view_helpers/actionview/text_helper/simple_format.yml +33 -20
  217. data/config/action_view_helpers/actionview/text_helper/truncate.yml +38 -23
  218. data/config/action_view_helpers/actionview/text_helper/word_wrap.yml +25 -15
  219. data/config/action_view_helpers/actionview/translation_helper/debug_missing_translation.yml +9 -6
  220. data/config/action_view_helpers/actionview/translation_helper/localize.yml +26 -16
  221. data/config/action_view_helpers/actionview/translation_helper/translate.yml +31 -19
  222. data/config/action_view_helpers/actionview/url_helper/button_to.yml +57 -33
  223. data/config/action_view_helpers/actionview/url_helper/button_to_generates_button_tag.yml +9 -6
  224. data/config/action_view_helpers/actionview/url_helper/current_page?.yml +25 -15
  225. data/config/action_view_helpers/actionview/url_helper/link_to.yml +76 -53
  226. data/config/action_view_helpers/actionview/url_helper/link_to_if.yml +54 -20
  227. data/config/action_view_helpers/actionview/url_helper/link_to_unless.yml +54 -20
  228. data/config/action_view_helpers/actionview/url_helper/link_to_unless_current.yml +49 -17
  229. data/config/action_view_helpers/actionview/url_helper/mail_to.yml +60 -34
  230. data/config/action_view_helpers/actionview/url_helper/phone_to.yml +40 -22
  231. data/config/action_view_helpers/actionview/url_helper/sms_to.yml +45 -25
  232. data/config/action_view_helpers/actionview/url_helper/url_for.yml +15 -9
  233. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_import_module_tag.yml +32 -0
  234. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_module_preload_tags.yml +39 -0
  235. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_importmap_tags.yml +35 -0
  236. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_inline_importmap_tag.yml +32 -0
  237. data/config/action_view_helpers/importmap-rails/importmap_tags_helper/javascript_module_preload_tag.yml +35 -0
  238. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache.yml +9 -6
  239. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_cache_tag.yml +12 -8
  240. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview.yml +9 -6
  241. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_exempts_page_from_preview_tag.yml +12 -8
  242. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload.yml +9 -6
  243. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_page_requires_reload_tag.yml +12 -8
  244. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_method_tag.yml +17 -11
  245. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refresh_scroll_tag.yml +17 -11
  246. data/config/action_view_helpers/turbo-rails/drive_helper/turbo_refreshes_with.yml +20 -12
  247. data/config/action_view_helpers/turbo-rails/frames_helper/turbo_frame_tag.yml +54 -33
  248. data/config/action_view_helpers/turbo-rails/includes_helper/turbo_include_tags.yml +9 -6
  249. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_action_tag.yml +32 -20
  250. data/config/action_view_helpers/turbo-rails/streams_action_helper/turbo_stream_refresh_tag.yml +18 -11
  251. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream.yml +9 -6
  252. data/config/action_view_helpers/turbo-rails/streams_helper/turbo_stream_from.yml +28 -18
  253. data/config/html_elements.yml +597 -0
  254. data/config/options.yml +1 -0
  255. data/config/slots/components.yml +52 -0
  256. data/config/state/kind.yml +61 -0
  257. data/config/state/operators.yml +27 -0
  258. data/config/state/predicates.yml +39 -0
  259. data/config/state/transforms.yml +18 -0
  260. data/config/view_context_methods/actionview/base/annotate_rendered_view_with_filenames.yml +4 -4
  261. data/config/view_context_methods/actionview/base/assign.yml +4 -4
  262. data/config/view_context_methods/actionview/base/assigns.yml +4 -4
  263. data/config/view_context_methods/actionview/base/automatically_disable_submit_tag.yml +4 -4
  264. data/config/view_context_methods/actionview/base/compiled_method_container.yml +4 -4
  265. data/config/view_context_methods/actionview/base/config.yml +4 -4
  266. data/config/view_context_methods/actionview/base/default_form_builder.yml +4 -4
  267. data/config/view_context_methods/actionview/base/default_formats.yml +4 -4
  268. data/config/view_context_methods/actionview/base/field_error_proc.yml +4 -4
  269. data/config/view_context_methods/actionview/base/formats.yml +4 -4
  270. data/config/view_context_methods/actionview/base/in_rendering_context.yml +4 -4
  271. data/config/view_context_methods/actionview/base/locale.yml +4 -4
  272. data/config/view_context_methods/actionview/base/lookup_context.yml +4 -4
  273. data/config/view_context_methods/actionview/base/output_buffer.yml +4 -4
  274. data/config/view_context_methods/actionview/base/prefix_partial_path_with_controller_namespace.yml +4 -4
  275. data/config/view_context_methods/actionview/base/remove_hidden_field_autocomplete.yml +4 -4
  276. data/config/view_context_methods/actionview/base/streaming_completion_on_exception.yml +4 -4
  277. data/config/view_context_methods/actionview/base/view_flow.yml +4 -4
  278. data/config/view_context_methods/actionview/base/view_paths.yml +4 -4
  279. data/config/view_context_methods/actionview/base/view_renderer.yml +4 -4
  280. data/config/view_context_methods/actionview/template/local_assigns.yml +4 -4
  281. data/config/view_context_methods/activemodel/conversion/convert_to_model.yml +4 -4
  282. data/config/view_context_methods/activesupport/benchmarkable/benchmark.yml +4 -4
  283. data/config.yml +1240 -790
  284. data/exe/herb +2 -0
  285. data/ext/herb/error_helpers.c +355 -17
  286. data/ext/herb/error_helpers.h +1 -1
  287. data/ext/herb/extconf.rb +4 -2
  288. data/ext/herb/extension.c +137 -89
  289. data/ext/herb/extension_helpers.c +81 -42
  290. data/ext/herb/extension_helpers.h +4 -1
  291. data/ext/herb/nodes.c +826 -358
  292. data/ext/herb/nodes.h +3 -2
  293. data/ext/herb/parser_options_helpers.c +151 -0
  294. data/ext/herb/parser_options_helpers.h +14 -0
  295. data/herb.gemspec +2 -2
  296. data/lib/herb/action_view/helper_registry.rb +1358 -62
  297. data/lib/herb/analysis/partial_declaration.rb +140 -0
  298. data/lib/herb/analysis/partial_index.rb +189 -0
  299. data/lib/herb/analysis/partial_resolution.rb +161 -0
  300. data/lib/herb/analysis/partial_resolver.rb +144 -0
  301. data/lib/herb/analysis/project_index.rb +152 -0
  302. data/lib/herb/{action_view → analysis}/render_analyzer.rb +287 -77
  303. data/lib/herb/analysis/render_graph/ancestor_chain.rb +27 -0
  304. data/lib/herb/analysis/render_graph/builder.rb +376 -0
  305. data/lib/herb/analysis/render_graph/call_frame.rb +9 -0
  306. data/lib/herb/analysis/render_graph/call_site_location.rb +23 -0
  307. data/lib/herb/analysis/render_graph/inferred_signature.rb +21 -0
  308. data/lib/herb/analysis/render_graph/partial_call_site.rb +40 -0
  309. data/lib/herb/analysis/render_graph/partial_context.rb +46 -0
  310. data/lib/herb/analysis/render_graph/template_roots.rb +31 -0
  311. data/lib/herb/analysis/render_graph.rb +285 -0
  312. data/lib/herb/analysis/ruby_locals_index/local.rb +25 -0
  313. data/lib/herb/analysis/ruby_locals_index/named_reference.rb +22 -0
  314. data/lib/herb/analysis/ruby_locals_index/offset_table.rb +44 -0
  315. data/lib/herb/analysis/ruby_locals_index/reference_collector.rb +80 -0
  316. data/lib/herb/analysis/ruby_locals_index/state_locals.rb +49 -0
  317. data/lib/herb/analysis/ruby_locals_index.rb +165 -0
  318. data/lib/herb/analysis/ruby_reference.rb +67 -0
  319. data/lib/herb/analysis/template_dependencies/dependency_collector.rb +179 -0
  320. data/lib/herb/analysis/template_dependencies/node_dependency_collector.rb +309 -0
  321. data/lib/herb/analysis/template_dependencies.rb +562 -0
  322. data/lib/herb/ast/erb_render_node.rb +26 -94
  323. data/lib/herb/ast/helpers.rb +90 -10
  324. data/lib/herb/ast/herb_directive_node.rb +18 -0
  325. data/lib/herb/ast/node.rb +32 -2
  326. data/lib/herb/ast/nodes.rb +1342 -105
  327. data/lib/herb/backend.rb +73 -0
  328. data/lib/herb/bootstrap.rb +3 -7
  329. data/lib/herb/cli.rb +550 -32
  330. data/lib/herb/colors.rb +14 -0
  331. data/lib/herb/configuration.rb +71 -35
  332. data/lib/herb/defaults.yml +2 -1
  333. data/lib/herb/dev/assets.rb +57 -0
  334. data/lib/herb/dev/classifier.rb +84 -0
  335. data/lib/herb/dev/embedded.rb +27 -0
  336. data/lib/herb/dev/pipeline.rb +305 -0
  337. data/lib/herb/dev/protocol.rb +221 -0
  338. data/lib/herb/dev/runner.rb +175 -175
  339. data/lib/herb/dev/server.rb +89 -26
  340. data/lib/herb/dev/server_entry.rb +41 -6
  341. data/lib/herb/dev/watcher.rb +181 -0
  342. data/lib/herb/dev.rb +163 -0
  343. data/lib/herb/diagnostic/formatter.rb +88 -0
  344. data/lib/herb/diagnostic.rb +172 -0
  345. data/lib/herb/diff/operation.rb +36 -0
  346. data/lib/herb/diff/result.rb +62 -0
  347. data/lib/herb/diff.rb +10 -0
  348. data/lib/herb/engine/collector.rb +62 -0
  349. data/lib/herb/engine/compiler.rb +346 -108
  350. data/lib/herb/engine/component_tags/constant_resolver.rb +28 -0
  351. data/lib/herb/engine/component_tags/partial_resolver.rb +54 -0
  352. data/lib/herb/engine/component_tags/resolver.rb +32 -0
  353. data/lib/herb/engine/component_tags/visitor.rb +231 -0
  354. data/lib/herb/engine/css_inliner/inliner.rb +101 -0
  355. data/lib/herb/engine/css_inliner/visitor.rb +174 -0
  356. data/lib/herb/engine/errors.rb +122 -0
  357. data/lib/herb/engine/helpers.rb +82 -0
  358. data/lib/herb/engine/inline_render/inliner.rb +122 -0
  359. data/lib/herb/engine/inline_render/visitor.rb +267 -0
  360. data/lib/herb/engine/runtime/entry.rb +62 -0
  361. data/lib/herb/engine/runtime/error_page.rb +362 -0
  362. data/lib/herb/engine/runtime/html_safe_assertions.rb +217 -0
  363. data/lib/herb/engine/runtime/journal/summary.rb +227 -0
  364. data/lib/herb/engine/runtime/journal.rb +379 -0
  365. data/lib/herb/engine/runtime/middleware.rb +212 -0
  366. data/lib/herb/engine/runtime/observations.rb +73 -0
  367. data/lib/herb/engine/runtime/report.rb +204 -0
  368. data/lib/herb/engine/runtime/session.rb +437 -0
  369. data/lib/herb/engine/runtime.rb +21 -0
  370. data/lib/herb/engine/scoped_style/channel.rb +66 -0
  371. data/lib/herb/engine/scoped_style/collector.rb +74 -0
  372. data/lib/herb/engine/scoped_style/visitor.rb +533 -0
  373. data/lib/herb/engine/slots/annotation.rb +98 -0
  374. data/lib/herb/engine/slots/bindings.rb +61 -0
  375. data/lib/herb/engine/slots/callee.rb +118 -0
  376. data/lib/herb/engine/slots/component_definitions.rb +67 -0
  377. data/lib/herb/engine/slots/components/async.rb +24 -0
  378. data/lib/herb/engine/slots/components/base.rb +132 -0
  379. data/lib/herb/engine/slots/components/deferred.rb +81 -0
  380. data/lib/herb/engine/slots/components/fallback.rb +27 -0
  381. data/lib/herb/engine/slots/components/fragment.rb +99 -0
  382. data/lib/herb/engine/slots/components/lazy.rb +24 -0
  383. data/lib/herb/engine/slots/components.rb +52 -0
  384. data/lib/herb/engine/slots/dependencies/channel.rb +72 -0
  385. data/lib/herb/engine/slots/dependencies.rb +269 -0
  386. data/lib/herb/engine/slots/dynamics_compiler.rb +854 -0
  387. data/lib/herb/engine/slots/identifier.rb +35 -0
  388. data/lib/herb/engine/slots/manifest/channel.rb +74 -0
  389. data/lib/herb/engine/slots/manifest/collector.rb +75 -0
  390. data/lib/herb/engine/slots/markers.rb +128 -0
  391. data/lib/herb/engine/slots/render_bindings.rb +141 -0
  392. data/lib/herb/engine/slots/schema_compiler.rb +94 -0
  393. data/lib/herb/engine/slots/state_anchor.rb +94 -0
  394. data/lib/herb/engine/slots/state_compiler.rb +1326 -0
  395. data/lib/herb/engine/slots/state_directives.rb +854 -0
  396. data/lib/herb/engine/slots/state_kinds.rb +54 -0
  397. data/lib/herb/engine/slots/state_operators.rb +36 -0
  398. data/lib/herb/engine/slots/state_overrides.rb +79 -0
  399. data/lib/herb/engine/slots/state_predicates.rb +65 -0
  400. data/lib/herb/engine/slots/state_transforms.rb +42 -0
  401. data/lib/herb/engine/slots/statics.rb +185 -0
  402. data/lib/herb/engine/slots/subtree.rb +82 -0
  403. data/lib/herb/engine/slots/subtree_compiler.rb +255 -0
  404. data/lib/herb/engine/slots/types.rb +42 -0
  405. data/lib/herb/engine/slots/visitor.rb +2256 -0
  406. data/lib/herb/engine/validators/accessibility_validator.rb +3 -3
  407. data/lib/herb/engine/validators/base.rb +36 -0
  408. data/lib/herb/engine/validators/generator_template_validator.rb +39 -0
  409. data/lib/herb/engine/validators/nesting_validator.rb +3 -3
  410. data/lib/herb/engine/validators/render_validator.rb +13 -33
  411. data/lib/herb/engine/validators/security_validator.rb +3 -17
  412. data/lib/herb/engine/validators.rb +43 -0
  413. data/lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb +48 -0
  414. data/lib/herb/engine/visitors/content_for_visitor.rb +127 -0
  415. data/lib/herb/engine/{debug_visitor.rb → visitors/debug_visitor.rb} +121 -93
  416. data/lib/herb/engine/visitors/html_safe_assertions_visitor.rb +281 -0
  417. data/lib/herb/engine/visitors/instrumentation_visitor.rb +290 -0
  418. data/lib/herb/engine/visitors/optimize_visitor.rb +728 -0
  419. data/lib/herb/engine/visitors/remove_comments_visitor.rb +106 -0
  420. data/lib/herb/engine/visitors/source_attribution_visitor.rb +177 -0
  421. data/lib/herb/engine.rb +218 -257
  422. data/lib/herb/ensure_installed.rb +43 -0
  423. data/lib/herb/errors.rb +646 -157
  424. data/lib/herb/fingerprint.rb +82 -0
  425. data/lib/herb/html/elements.rb +18 -0
  426. data/lib/herb/html/util.rb +21 -2
  427. data/lib/herb/lex_result.rb +0 -10
  428. data/lib/herb/locate.rb +163 -0
  429. data/lib/herb/location.rb +20 -0
  430. data/lib/herb/parse_result.rb +17 -11
  431. data/lib/herb/parser_options.rb +65 -46
  432. data/lib/herb/position.rb +19 -0
  433. data/lib/herb/prism_inspect.rb +1 -4
  434. data/lib/herb/project.rb +28 -15
  435. data/lib/herb/range.rb +5 -0
  436. data/lib/herb/result.rb +2 -2
  437. data/lib/herb/ruby_program.rb +110 -0
  438. data/lib/herb/source_path.rb +232 -0
  439. data/lib/herb/token.rb +14 -3
  440. data/lib/herb/version.rb +1 -1
  441. data/lib/herb/visitor/context/origin.rb +52 -0
  442. data/lib/herb/visitor/context/replacements.rb +59 -0
  443. data/lib/herb/visitor/context.rb +169 -0
  444. data/lib/herb/visitor/context_aware.rb +45 -0
  445. data/lib/herb/visitor/diagnostics.rb +148 -0
  446. data/lib/herb/visitor/experimental.rb +33 -0
  447. data/lib/herb/visitor/parser_option_requirements.rb +151 -0
  448. data/lib/herb/visitor/stack.rb +192 -0
  449. data/lib/herb/visitor.rb +47 -1
  450. data/lib/herb/warnings.rb +25 -0
  451. data/lib/herb.rb +74 -63
  452. data/sig/herb/action_view/helper_registry.rbs +82 -10
  453. data/sig/herb/analysis/partial_declaration.rbs +80 -0
  454. data/sig/herb/analysis/partial_index.rbs +66 -0
  455. data/sig/herb/analysis/partial_resolution.rbs +57 -0
  456. data/sig/herb/analysis/partial_resolver.rbs +76 -0
  457. data/sig/herb/analysis/project_index.rbs +57 -0
  458. data/sig/herb/{action_view → analysis}/render_analyzer.rbs +25 -4
  459. data/sig/herb/analysis/render_graph/ancestor_chain.rbs +22 -0
  460. data/sig/herb/analysis/render_graph/builder.rbs +180 -0
  461. data/sig/herb/analysis/render_graph/call_frame.rbs +26 -0
  462. data/sig/herb/analysis/render_graph/call_site_location.rbs +28 -0
  463. data/sig/herb/analysis/render_graph/inferred_signature.rbs +27 -0
  464. data/sig/herb/analysis/render_graph/partial_call_site.rbs +36 -0
  465. data/sig/herb/analysis/render_graph/partial_context.rbs +31 -0
  466. data/sig/herb/analysis/render_graph/template_roots.rbs +32 -0
  467. data/sig/herb/analysis/render_graph.rbs +83 -0
  468. data/sig/herb/analysis/ruby_locals_index/local.rbs +21 -0
  469. data/sig/herb/analysis/ruby_locals_index/named_reference.rbs +20 -0
  470. data/sig/herb/analysis/ruby_locals_index/offset_table.rbs +26 -0
  471. data/sig/herb/analysis/ruby_locals_index/reference_collector.rbs +40 -0
  472. data/sig/herb/analysis/ruby_locals_index/state_locals.rbs +19 -0
  473. data/sig/herb/analysis/ruby_locals_index.rbs +62 -0
  474. data/sig/herb/analysis/ruby_reference.rbs +28 -0
  475. data/sig/herb/analysis/template_dependencies/dependency_collector.rbs +52 -0
  476. data/sig/herb/analysis/template_dependencies/node_dependency_collector.rbs +81 -0
  477. data/sig/herb/analysis/template_dependencies.rbs +125 -0
  478. data/sig/herb/ast/erb_render_node.rbs +10 -2
  479. data/sig/herb/ast/helpers.rbs +31 -1
  480. data/sig/herb/ast/herb_directive_node.rbs +13 -0
  481. data/sig/herb/ast/node.rbs +9 -0
  482. data/sig/herb/ast/nodes.rbs +662 -89
  483. data/sig/herb/backend.rbs +52 -0
  484. data/sig/herb/colors.rbs +3 -0
  485. data/sig/herb/configuration.rbs +27 -3
  486. data/sig/herb/dev/assets.rbs +27 -0
  487. data/sig/herb/dev/classifier.rbs +57 -0
  488. data/sig/herb/dev/embedded.rbs +21 -0
  489. data/sig/herb/dev/pipeline.rbs +118 -0
  490. data/sig/herb/dev/protocol.rbs +78 -0
  491. data/sig/herb/dev/runner.rbs +61 -23
  492. data/sig/herb/dev/server.rbs +49 -22
  493. data/sig/herb/dev/server_entry.rbs +46 -21
  494. data/sig/herb/dev/watcher.rbs +84 -0
  495. data/sig/herb/dev.rbs +58 -0
  496. data/sig/herb/diagnostic/formatter.rbs +28 -0
  497. data/sig/herb/diagnostic.rbs +88 -0
  498. data/sig/herb/diff/operation.rbs +36 -0
  499. data/sig/herb/diff/result.rbs +36 -0
  500. data/sig/herb/diff.rbs +6 -0
  501. data/sig/herb/engine/collector.rbs +48 -0
  502. data/sig/herb/engine/compiler.rbs +62 -23
  503. data/sig/herb/engine/component_tags/constant_resolver.rbs +19 -0
  504. data/sig/herb/engine/component_tags/partial_resolver.rbs +30 -0
  505. data/sig/herb/engine/component_tags/resolver.rbs +25 -0
  506. data/sig/herb/engine/component_tags/visitor.rbs +69 -0
  507. data/sig/herb/engine/css_inliner/inliner.rbs +65 -0
  508. data/sig/herb/engine/css_inliner/visitor.rbs +87 -0
  509. data/sig/herb/engine/errors.rbs +68 -0
  510. data/sig/herb/engine/helpers.rbs +28 -0
  511. data/sig/herb/engine/inline_render/inliner.rbs +39 -0
  512. data/sig/herb/engine/inline_render/visitor.rbs +104 -0
  513. data/sig/herb/engine/runtime/entry.rbs +43 -0
  514. data/sig/herb/engine/runtime/error_page.rbs +115 -0
  515. data/sig/herb/engine/runtime/html_safe_assertions.rbs +99 -0
  516. data/sig/herb/engine/runtime/journal/summary.rbs +172 -0
  517. data/sig/herb/engine/runtime/journal.rbs +126 -0
  518. data/sig/herb/engine/runtime/middleware.rbs +96 -0
  519. data/sig/herb/engine/runtime/observations.rbs +38 -0
  520. data/sig/herb/engine/runtime/report.rbs +97 -0
  521. data/sig/herb/engine/runtime/session.rbs +233 -0
  522. data/sig/herb/engine/runtime.rbs +14 -0
  523. data/sig/herb/engine/scoped_style/channel.rbs +45 -0
  524. data/sig/herb/engine/scoped_style/collector.rbs +45 -0
  525. data/sig/herb/engine/scoped_style/visitor.rbs +220 -0
  526. data/sig/herb/engine/slots/annotation.rbs +72 -0
  527. data/sig/herb/engine/slots/bindings.rbs +34 -0
  528. data/sig/herb/engine/slots/callee.rbs +62 -0
  529. data/sig/herb/engine/slots/component_definitions.rbs +19 -0
  530. data/sig/herb/engine/slots/components/async.rbs +20 -0
  531. data/sig/herb/engine/slots/components/base.rbs +60 -0
  532. data/sig/herb/engine/slots/components/deferred.rbs +29 -0
  533. data/sig/herb/engine/slots/components/fallback.rbs +21 -0
  534. data/sig/herb/engine/slots/components/fragment.rbs +34 -0
  535. data/sig/herb/engine/slots/components/lazy.rbs +20 -0
  536. data/sig/herb/engine/slots/components.rbs +30 -0
  537. data/sig/herb/engine/slots/dependencies/channel.rbs +51 -0
  538. data/sig/herb/engine/slots/dependencies.rbs +94 -0
  539. data/sig/herb/engine/slots/dynamics_compiler.rbs +349 -0
  540. data/sig/herb/engine/slots/identifier.rbs +19 -0
  541. data/sig/herb/engine/slots/manifest/channel.rbs +49 -0
  542. data/sig/herb/engine/slots/manifest/collector.rbs +45 -0
  543. data/sig/herb/engine/slots/markers.rbs +85 -0
  544. data/sig/herb/engine/slots/render_bindings.rbs +69 -0
  545. data/sig/herb/engine/slots/schema_compiler.rbs +62 -0
  546. data/sig/herb/engine/slots/state_anchor.rbs +41 -0
  547. data/sig/herb/engine/slots/state_compiler.rbs +258 -0
  548. data/sig/herb/engine/slots/state_directives.rbs +278 -0
  549. data/sig/herb/engine/slots/state_kinds.rbs +24 -0
  550. data/sig/herb/engine/slots/state_operators.rbs +19 -0
  551. data/sig/herb/engine/slots/state_overrides.rbs +33 -0
  552. data/sig/herb/engine/slots/state_predicates.rbs +16 -0
  553. data/sig/herb/engine/slots/state_transforms.rbs +15 -0
  554. data/sig/herb/engine/slots/statics.rbs +67 -0
  555. data/sig/herb/engine/slots/subtree.rbs +49 -0
  556. data/sig/herb/engine/slots/subtree_compiler.rbs +130 -0
  557. data/sig/herb/engine/slots/types.rbs +46 -0
  558. data/sig/herb/engine/slots/visitor.rbs +599 -0
  559. data/sig/herb/engine/validators/accessibility_validator.rbs +1 -1
  560. data/sig/herb/engine/validators/base.rbs +28 -0
  561. data/sig/herb/engine/validators/generator_template_validator.rbs +19 -0
  562. data/sig/herb/engine/validators/nesting_validator.rbs +1 -1
  563. data/sig/herb/engine/validators/render_validator.rbs +2 -6
  564. data/sig/herb/engine/validators/security_validator.rbs +1 -3
  565. data/sig/herb/engine/validators.rbs +21 -0
  566. data/sig/herb/engine/visitors/auto_close_omitted_tags_visitor.rbs +26 -0
  567. data/sig/herb/engine/visitors/content_for_visitor.rbs +52 -0
  568. data/sig/herb/engine/{debug_visitor.rbs → visitors/debug_visitor.rbs} +26 -15
  569. data/sig/herb/engine/visitors/html_safe_assertions_visitor.rbs +100 -0
  570. data/sig/herb/engine/visitors/instrumentation_visitor.rbs +111 -0
  571. data/sig/herb/engine/visitors/optimize_visitor.rbs +246 -0
  572. data/sig/herb/engine/visitors/remove_comments_visitor.rbs +66 -0
  573. data/sig/herb/engine/visitors/source_attribution_visitor.rbs +90 -0
  574. data/sig/herb/engine.rbs +47 -41
  575. data/sig/herb/ensure_installed.rbs +9 -0
  576. data/sig/herb/errors.rbs +293 -0
  577. data/sig/herb/fingerprint.rbs +37 -0
  578. data/sig/herb/html/elements.rbs +19 -0
  579. data/sig/herb/html/util.rbs +15 -1
  580. data/sig/herb/lex_result.rbs +0 -6
  581. data/sig/herb/locate.rbs +89 -0
  582. data/sig/herb/location.rbs +12 -0
  583. data/sig/herb/parse_result.rbs +10 -8
  584. data/sig/herb/parser_options.rbs +47 -21
  585. data/sig/herb/position.rbs +11 -0
  586. data/sig/herb/range.rbs +3 -0
  587. data/sig/herb/ruby_program.rbs +51 -0
  588. data/sig/herb/source_path.rbs +132 -0
  589. data/sig/herb/token.rbs +5 -2
  590. data/sig/herb/visitor/context/origin.rbs +51 -0
  591. data/sig/herb/visitor/context/replacements.rbs +39 -0
  592. data/sig/herb/visitor/context.rbs +83 -0
  593. data/sig/herb/visitor/context_aware.rbs +32 -0
  594. data/sig/herb/visitor/diagnostics.rbs +82 -0
  595. data/sig/herb/visitor/experimental.rbs +23 -0
  596. data/sig/herb/visitor/parser_option_requirements.rbs +76 -0
  597. data/sig/herb/visitor/stack.rbs +91 -0
  598. data/sig/herb/visitor.rbs +22 -0
  599. data/sig/herb/warnings.rbs +10 -0
  600. data/sig/herb.rbs +27 -10
  601. data/sig/serialized_ast_errors.rbs +58 -1
  602. data/sig/serialized_ast_nodes.rbs +58 -2
  603. data/src/analyze/action_view/attribute_extraction_helpers.c +73 -36
  604. data/src/analyze/action_view/generated_handlers.c +37 -1
  605. data/src/analyze/action_view/generated_handlers.h +2 -1
  606. data/src/analyze/action_view/helper_registry.c +1353 -58
  607. data/src/analyze/action_view/registry.c +10 -17
  608. data/src/analyze/action_view/stylesheet_link_tag.c +40 -0
  609. data/src/analyze/action_view/tag_helper_node_builders.c +57 -0
  610. data/src/analyze/action_view/tag_helpers.c +423 -93
  611. data/src/analyze/analyze.c +301 -64
  612. data/src/analyze/analyze_helpers.c +420 -23
  613. data/src/analyze/builders.c +79 -51
  614. data/src/analyze/conditional_elements.c +13 -8
  615. data/src/analyze/conditional_open_tags.c +11 -5
  616. data/src/analyze/control_type.c +16 -1
  617. data/src/analyze/herb_directives.c +701 -0
  618. data/src/analyze/invalid_structures.c +11 -7
  619. data/src/analyze/iteration_nodes.c +306 -0
  620. data/src/analyze/missing_end.c +116 -32
  621. data/src/analyze/parse_errors.c +8 -3
  622. data/src/analyze/postfix_conditionals.c +98 -63
  623. data/src/analyze/prism_annotate.c +13 -4
  624. data/src/analyze/render_nodes.c +345 -123
  625. data/src/analyze/strict_locals.c +30 -26
  626. data/src/analyze/ternary_conditionals.c +95 -70
  627. data/src/analyze/transform.c +43 -1
  628. data/src/ast/ast_node.c +3 -13
  629. data/src/ast/ast_nodes.c +911 -112
  630. data/src/ast/ast_pretty_print.c +161 -2
  631. data/src/diff/herb_diff.c +8 -0
  632. data/src/diff/herb_diff_attributes.c +1 -0
  633. data/src/diff/herb_diff_children.c +4 -3
  634. data/src/diff/herb_diff_helpers.c +7 -1
  635. data/src/diff/herb_diff_nodes.c +186 -71
  636. data/src/diff/herb_hash_tree.c +99 -1
  637. data/src/errors.c +1096 -128
  638. data/src/extract.c +30 -8
  639. data/src/herb.c +30 -11
  640. data/src/include/analyze/action_view/attribute_extraction_helpers.h +1 -1
  641. data/src/include/analyze/action_view/helper_registry.h +28 -4
  642. data/src/include/analyze/action_view/tag_helper_handler.h +1 -1
  643. data/src/include/analyze/action_view/tag_helper_node_builders.h +7 -0
  644. data/src/include/analyze/analyze.h +11 -0
  645. data/src/include/analyze/builders.h +16 -0
  646. data/src/include/analyze/helpers.h +23 -2
  647. data/src/include/analyze/herb_directive_kinds.h +41 -0
  648. data/src/include/analyze/herb_directives.h +14 -0
  649. data/src/include/analyze/iteration_nodes.h +11 -0
  650. data/src/include/analyze/prism_annotate.h +3 -3
  651. data/src/include/analyze/ternary_conditionals.h +2 -0
  652. data/src/include/ast/ast_node.h +1 -5
  653. data/src/include/ast/ast_nodes.h +76 -2
  654. data/src/include/ast/ast_pretty_print.h +1 -1
  655. data/src/include/diff/herb_diff.h +11 -0
  656. data/src/include/errors.h +156 -39
  657. data/src/include/extract.h +11 -0
  658. data/src/include/herb.h +6 -0
  659. data/src/include/lexer/erb_openers.h +29 -0
  660. data/src/include/lexer/lexer_peek_helpers.h +8 -1
  661. data/src/include/lexer/lexer_struct.h +4 -0
  662. data/src/include/lexer/token.h +3 -0
  663. data/src/include/lexer/token_struct.h +8 -6
  664. data/src/include/lib/hb_allocator.h +2 -1
  665. data/src/include/lib/hb_array.h +2 -0
  666. data/src/include/lib/hb_foreach.h +1 -1
  667. data/src/include/lib/hb_string.h +7 -0
  668. data/src/include/parser/dot_notation.h +1 -1
  669. data/src/include/parser/foreign_content_elements.h +32 -0
  670. data/src/include/parser/parser.h +16 -30
  671. data/src/include/parser/parser_helpers.h +13 -11
  672. data/src/include/parser/parser_options.h +41 -0
  673. data/src/include/prism/ruby_parser.h +6 -0
  674. data/src/include/util/html_elements.h +85 -0
  675. data/src/include/util/html_util.h +1 -0
  676. data/src/include/version.h +1 -1
  677. data/src/lexer/lexer_peek_helpers.c +15 -1
  678. data/src/lexer/token.c +83 -1
  679. data/src/lexer.c +196 -12
  680. data/src/lib/hb_allocator.c +2 -0
  681. data/src/lib/hb_array.c +26 -0
  682. data/src/lib/hb_string.c +26 -0
  683. data/src/main.c +1 -1
  684. data/src/parser/dot_notation.c +4 -3
  685. data/src/parser/match_tags.c +66 -1
  686. data/src/parser/parser_helpers.c +69 -37
  687. data/src/parser.c +606 -383
  688. data/src/parser_options_defaults.c +30 -0
  689. data/src/prism/prism_helpers.c +3 -0
  690. data/src/prism/ruby_parser.c +49 -0
  691. data/src/util/html_util.c +11 -58
  692. data/src/visitor.c +77 -1
  693. data/templates/ext/herb/error_helpers.c.erb +1 -1
  694. data/templates/ext/herb/nodes.c.erb +18 -13
  695. data/templates/ext/herb/nodes.h.erb +2 -1
  696. data/templates/ext/herb/parser_options_helpers.c.erb +69 -0
  697. data/templates/ext/herb/parser_options_helpers.h.erb +11 -0
  698. data/templates/java/nodes.c.erb +20 -16
  699. data/templates/java/nodes.h.erb +3 -2
  700. data/templates/java/org/herb/ParserOptions.java.erb +24 -0
  701. data/templates/java/org/herb/ast/HelperRegistry.java.erb +67 -31
  702. data/templates/java/org/herb/ast/HelperType.java.erb +29 -0
  703. data/templates/java/org/herb/ast/Nodes.java.erb +11 -7
  704. data/templates/java/parser_options_helpers.c.erb +45 -0
  705. data/templates/java/parser_options_helpers.h.erb +10 -0
  706. data/templates/javascript/packages/client/src/state-kinds.ts.erb +49 -0
  707. data/templates/javascript/packages/client/src/state-operators.ts.erb +15 -0
  708. data/templates/javascript/packages/client/src/state-predicates.ts.erb +27 -0
  709. data/templates/javascript/packages/client/src/state-transforms.ts.erb +19 -0
  710. data/templates/javascript/packages/core/src/action-view-helpers.ts.erb +47 -0
  711. data/templates/javascript/packages/core/src/built-in-components.ts.erb +67 -0
  712. data/templates/javascript/packages/core/src/errors.ts.erb +9 -3
  713. data/templates/javascript/packages/core/src/foreign-content-elements.ts.erb +18 -0
  714. data/templates/javascript/packages/core/src/html-constants.ts.erb +32 -0
  715. data/templates/javascript/packages/core/src/html-elements.ts.erb +41 -0
  716. data/templates/javascript/packages/core/src/node-type-guards.ts.erb +11 -7
  717. data/templates/javascript/packages/core/src/nodes.ts.erb +82 -19
  718. data/templates/javascript/packages/core/src/parser-options.ts.erb +41 -0
  719. data/templates/javascript/packages/core/src/visitor.ts.erb +1 -1
  720. data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +3 -3
  721. data/templates/javascript/packages/node/extension/nodes.cpp.erb +17 -12
  722. data/templates/javascript/packages/node/extension/nodes.h.erb +3 -3
  723. data/templates/javascript/packages/node/extension/parser_options_helpers.cpp.erb +41 -0
  724. data/templates/javascript/packages/node/extension/parser_options_helpers.h.erb +12 -0
  725. data/templates/lib/herb/action_view/helper_registry.rb.erb +77 -3
  726. data/templates/lib/herb/ast/nodes.rb.erb +16 -6
  727. data/templates/lib/herb/engine/slots/component_definitions.rb.erb +38 -0
  728. data/templates/lib/herb/engine/slots/state_kinds.rb.erb +37 -0
  729. data/templates/lib/herb/engine/slots/state_operators.rb.erb +26 -0
  730. data/templates/lib/herb/engine/slots/state_predicates.rb.erb +39 -0
  731. data/templates/lib/herb/engine/slots/state_transforms.rb.erb +27 -0
  732. data/templates/lib/herb/errors.rb.erb +34 -6
  733. data/templates/lib/herb/html/elements.rb.erb +12 -0
  734. data/templates/lib/herb/parser_options.rb.erb +32 -0
  735. data/templates/lib/herb/visitor.rb.erb +7 -1
  736. data/templates/rust/herb-printer/src/printer_visitor.rs.erb +14 -0
  737. data/templates/rust/src/action_view_helpers.rs.erb +38 -0
  738. data/templates/rust/src/ast/nodes.rs.erb +24 -31
  739. data/templates/rust/src/errors.rs.erb +1 -1
  740. data/templates/rust/src/nodes.rs.erb +58 -26
  741. data/templates/rust/src/parser_options.rs.erb +16 -0
  742. data/templates/rust/src/prism/generated_deserialize.rs.erb +109 -0
  743. data/templates/rust/src/prism/generated_prettyprint.rs.erb +153 -0
  744. data/templates/rust/src/union_types.rs.erb +7 -1
  745. data/templates/rust/src/visitor.rs.erb +1 -1
  746. data/templates/src/analyze/action_view/helper_registry.c.erb +22 -0
  747. data/templates/src/analyze/missing_end.c.erb +13 -5
  748. data/templates/src/ast/ast_nodes.c.erb +41 -2
  749. data/templates/src/diff/herb_diff_nodes.c.erb +44 -8
  750. data/templates/src/errors.c.erb +8 -3
  751. data/templates/src/include/analyze/action_view/helper_registry.h.erb +19 -0
  752. data/templates/src/include/analyze/herb_directive_kinds.h.erb +25 -0
  753. data/templates/src/include/errors.h.erb +3 -1
  754. data/templates/src/include/parser/foreign_content_elements.h.erb +23 -0
  755. data/templates/src/include/parser/parser_options.h.erb +21 -0
  756. data/templates/src/include/util/html_elements.h.erb +28 -0
  757. data/templates/src/parser_options_defaults.c.erb +9 -0
  758. data/templates/template.rb +564 -9
  759. data/templates/wasm/error_helpers.cpp.erb +4 -4
  760. data/templates/wasm/nodes.cpp.erb +12 -12
  761. data/templates/wasm/nodes.h.erb +3 -3
  762. data/templates/wasm/parser_options_helpers.cpp.erb +25 -0
  763. data/templates/wasm/parser_options_helpers.h.erb +12 -0
  764. metadata +306 -27
  765. data/config/action_view_helpers/actionview/form_helper/button.yml +0 -38
  766. data/config/action_view_helpers/actionview/form_helper/submit.yml +0 -35
  767. data/lib/herb/ast.rb +0 -7
  768. data/lib/herb/diff_operation.rb +0 -34
  769. data/lib/herb/diff_result.rb +0 -59
  770. data/lib/herb/engine/error_formatter.rb +0 -432
  771. data/lib/herb/engine/parser_error_overlay.rb +0 -773
  772. data/lib/herb/engine/validation_error_overlay.rb +0 -182
  773. data/lib/herb/engine/validation_errors.rb +0 -65
  774. data/lib/herb/engine/validator.rb +0 -80
  775. data/sig/herb/ast.rbs +0 -6
  776. data/sig/herb/diff_operation.rbs +0 -34
  777. data/sig/herb/diff_result.rbs +0 -34
  778. data/sig/herb/engine/debug.rbs +0 -38
  779. data/sig/herb/engine/error_formatter.rbs +0 -47
  780. data/sig/herb/engine/parser_error_overlay.rbs +0 -41
  781. data/sig/herb/engine/validation_error_overlay.rbs +0 -35
  782. data/sig/herb/engine/validation_errors.rbs +0 -45
  783. data/sig/herb/engine/validator.rbs +0 -41
  784. data/sig/herb_c_extension.rbs +0 -10
@@ -0,0 +1,21 @@
1
+ # Generated from lib/herb/engine/validators.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # The validators Herb ships, and one way to ask for the ones a project has switched on.
6
+ #
7
+ # Nothing here runs unless a caller asks for it. `Herb::Engine` compiles whatever passes it is
8
+ # given and holds no opinion about validation, so wanting the usual set means saying so:
9
+ #
10
+ # Herb::Engine.new(source, visitors: Herb::Engine::Validators.all(fatal: false))
11
+ #
12
+ # Reading which ones are switched on lives here rather than in the engine, so that a caller
13
+ # that already knows what it wants never has to consult configuration at all.
14
+ module Validators
15
+ ALL: Hash[Symbol, untyped]
16
+
17
+ # : (?fatal: bool, **untyped) -> Herb::Visitor::Stack
18
+ def self.all: (?fatal: bool, **untyped) -> Herb::Visitor::Stack
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,26 @@
1
+ # Generated from lib/herb/engine/visitors/auto_close_omitted_tags_visitor.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # Replaces omitted closing tags with explicit ones, so that the compiled output always
6
+ # contains a closing tag, even when the template omits it.
7
+ #
8
+ # This visitor is not loaded by default. Require it explicitly and pass it to the engine:
9
+ #
10
+ # require "herb/engine/visitors/auto_close_omitted_tags_visitor"
11
+ #
12
+ # Herb::Engine.new(source, visitors: [Herb::Engine::AutoCloseOmittedTagsVisitor.new])
13
+ class AutoCloseOmittedTagsVisitor < Herb::Visitor
14
+ # : (Herb::AST::HTMLElementNode) -> void
15
+ def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
16
+
17
+ # : () -> String
18
+ def inspect: () -> String
19
+
20
+ private
21
+
22
+ # : (Herb::Token, Herb::Location) -> Herb::AST::HTMLCloseTagNode
23
+ def explicit_close_tag: (Herb::Token, Herb::Location) -> Herb::AST::HTMLCloseTagNode
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,52 @@
1
+ # Generated from lib/herb/engine/visitors/content_for_visitor.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # Appends HTML to the end of every element matching a tag name, and optionally a set of
6
+ # attribute conditions, so that the compiled output always contains it before the
7
+ # element's closing tag.
8
+ #
9
+ # An attribute condition matches on `true` when the attribute is present, on `false` when
10
+ # it is absent, on a `Regexp` when the attribute value matches it, and on anything else
11
+ # when the attribute value is equal to it. An attribute whose value is built from ERB has
12
+ # no value known at compile time, so it only matches the `true` condition.
13
+ #
14
+ # This visitor is not loaded by default. Require it explicitly and pass it to the engine:
15
+ #
16
+ # require "herb/engine/visitors/content_for_visitor"
17
+ #
18
+ # Herb::Engine.new(source, visitors: [
19
+ # Herb::Engine::ContentForVisitor.new("<p>Footer</p>", tag_name: "main", attributes: { "id" => "content" })
20
+ # ])
21
+ class ContentForVisitor < Herb::Visitor
22
+ # : (String?, tag_name: String, ?attributes: Hash[untyped, untyped]) -> void
23
+ def initialize: (String?, tag_name: String, ?attributes: Hash[untyped, untyped]) -> void
24
+
25
+ # : (Herb::AST::HTMLElementNode) -> void
26
+ def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
27
+
28
+ # : () -> String
29
+ def inspect: () -> String
30
+
31
+ private
32
+
33
+ # : () -> Herb::AST::RubyLiteralNode
34
+ def content_node: () -> Herb::AST::RubyLiteralNode
35
+
36
+ # : (Herb::AST::HTMLElementNode) -> bool
37
+ def matches?: (Herb::AST::HTMLElementNode) -> bool
38
+
39
+ # : (Hash[String, String?], String, untyped) -> bool
40
+ def attribute_matches?: (Hash[String, String?], String, untyped) -> bool
41
+
42
+ # : (Herb::AST::HTMLElementNode) -> Hash[String, String?]
43
+ def element_attributes: (Herb::AST::HTMLElementNode) -> Hash[String, String?]
44
+
45
+ # : (Herb::AST::HTMLAttributeNode) -> String?
46
+ def attribute_name: (Herb::AST::HTMLAttributeNode) -> String?
47
+
48
+ # : (Herb::AST::HTMLAttributeNode) -> String?
49
+ def attribute_value: (Herb::AST::HTMLAttributeNode) -> String?
50
+ end
51
+ end
52
+ end
@@ -1,9 +1,22 @@
1
- # Generated from lib/herb/engine/debug_visitor.rb with RBS::Inline
1
+ # Generated from lib/herb/engine/visitors/debug_visitor.rb with RBS::Inline
2
2
 
3
3
  module Herb
4
4
  class Engine
5
5
  class DebugVisitor < Herb::Visitor
6
- def initialize: (?file_path: untyped, ?project_path: untyped) -> untyped
6
+ include Herb::Visitor::ContextAware
7
+
8
+ # : () -> bool
9
+ def self.reads_erb_source?: () -> bool
10
+
11
+ # `node` adds the render occurrence to every marker, which needs `InstrumentationVisitor` in the
12
+ # same stack to have anything to report. Without it the value is empty on every tag, so it is
13
+ # asked for rather than assumed.
14
+ #
15
+ # Herb::Engine.new(source, visitors: [
16
+ # Herb::Engine::DebugVisitor.new(node: true),
17
+ # Herb::Engine::InstrumentationVisitor.new
18
+ # ])
19
+ def initialize: (?node: untyped) -> untyped
7
20
 
8
21
  def visit_document_node: (untyped node) -> untyped
9
22
 
@@ -21,19 +34,17 @@ module Herb
21
34
 
22
35
  def visit_erb_block_node: (untyped node) -> untyped
23
36
 
24
- private
37
+ def visit_erb_iteration_block_node: (untyped node) -> untyped
25
38
 
26
- def calculate_relative_path: () -> untyped
39
+ def inspect: () -> untyped
27
40
 
28
- def wrap_all_erb_nodes: (untyped node) -> untyped
41
+ private
29
42
 
30
- # Creates a dummy location for AST nodes that don't need real location info
31
- # : () -> Herb::Location
32
- def dummy_location: () -> Herb::Location
43
+ def filename: () -> untyped
33
44
 
34
- # Creates a dummy range for tokens that don't need real range info
35
- # : () -> Herb::Range
36
- def dummy_range: () -> Herb::Range
45
+ def relative_file_path: () -> untyped
46
+
47
+ def wrap_all_erb_nodes: (untyped node) -> untyped
37
48
 
38
49
  def replace_erb_nodes_recursive: (untyped node) -> untyped
39
50
 
@@ -45,9 +56,11 @@ module Herb
45
56
 
46
57
  def add_debug_attributes_to_element: (untyped open_tag_node) -> untyped
47
58
 
48
- def create_debug_attribute: (untyped name, untyped value) -> untyped
59
+ def create_debug_node_attribute: () -> untyped
49
60
 
50
- def create_token: (untyped type, untyped value) -> untyped
61
+ def current_node_erb: () -> untyped
62
+
63
+ def create_debug_attribute: (untyped name, untyped value) -> untyped
51
64
 
52
65
  def create_debug_span_for_erb: (untyped erb_node) -> untyped
53
66
 
@@ -69,8 +82,6 @@ module Herb
69
82
 
70
83
  def in_excluded_context?: () -> untyped
71
84
 
72
- def erb_output?: (untyped opening) -> untyped
73
-
74
85
  # TODO: Rewrite using Prism Nodes once available
75
86
  def complex_rails_helper?: (untyped code) -> untyped
76
87
 
@@ -0,0 +1,100 @@
1
+ # Generated from lib/herb/engine/visitors/html_safe_assertions_visitor.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # Wraps the receiver of every `.html_safe` call in a template with a runtime assertion, so
6
+ # that marking a value as HTML-safe raises when the value contains HTML that the browser
7
+ # executes.
8
+ #
9
+ # This visitor is not loaded by default. Require it explicitly and pass it to the engine:
10
+ #
11
+ # require "herb/engine/visitors/html_safe_assertions_visitor"
12
+ #
13
+ # Herb::Engine.new(source, visitors: [Herb::Engine::HTMLSafeAssertionsVisitor.new])
14
+ #
15
+ # `<%= @user.bio.html_safe %>` then compiles as if the template had been written as:
16
+ #
17
+ # <%= ::Herb::Engine::Runtime::HTMLSafeAssertions.check(@user.bio, file: __FILE__, line: 1, column: 1, source: "<%= @user.bio.html_safe %>", mode: :raise).html_safe %>
18
+ #
19
+ # The assertion runs on every render, and the value keeps flowing through `.html_safe`
20
+ # unchanged. See `Herb::Engine::Runtime::HTMLSafeAssertions` for what counts as unsafe.
21
+ #
22
+ # The calls are found in the Prism program the parser attaches to the document, which the
23
+ # engine enables through `required_parser_option`. Parsing an AST for this visitor by hand
24
+ # needs the same option:
25
+ #
26
+ # Herb.parse(source, prism_program: true)
27
+ class HTMLSafeAssertionsVisitor < Herb::Visitor
28
+ include Herb::Visitor::ContextAware
29
+
30
+ RUNTIME: ::String
31
+
32
+ MAX_SOURCE_LENGTH: ::Integer
33
+
34
+ class MissingPrismProgramError < StandardError
35
+ end
36
+
37
+ # : (?mode: Symbol, ?ignore: Array[Symbol], ?file_path: (String | ::Pathname)?) -> void
38
+ def initialize: (?mode: Symbol, ?ignore: Array[Symbol], ?file_path: (String | ::Pathname)?) -> void
39
+
40
+ # : (Herb::AST::DocumentNode) -> void
41
+ def visit_document_node: (Herb::AST::DocumentNode) -> void
42
+
43
+ # : (Herb::AST::Node) -> void
44
+ def visit_erb_node: (Herb::AST::Node) -> void
45
+
46
+ # : () -> String
47
+ def inspect: () -> String
48
+
49
+ private
50
+
51
+ # : (Symbol) -> Symbol
52
+ def validated_mode: (Symbol) -> Symbol
53
+
54
+ # : (Array[Symbol]) -> Array[Symbol]
55
+ def validated_ignore: (Array[Symbol]) -> Array[Symbol]
56
+
57
+ # : (Herb::AST::DocumentNode) -> void
58
+ def add_assertions: (Herb::AST::DocumentNode) -> void
59
+
60
+ # : (Herb::AST::DocumentNode) -> Array[[Symbol, Prism::Location]]
61
+ def html_safe_targets: (Herb::AST::DocumentNode) -> Array[[ Symbol, Prism::Location ]]
62
+
63
+ # : (Prism::Node) -> [Symbol, Prism::Location]?
64
+ def target_for: (Prism::Node) -> [ Symbol, Prism::Location ]?
65
+
66
+ # : (Prism::CallNode) -> bool
67
+ def html_safe_call?: (Prism::CallNode) -> bool
68
+
69
+ # : (Prism::BlockArgumentNode) -> bool
70
+ def html_safe_symbol?: (Prism::BlockArgumentNode) -> bool
71
+
72
+ # : (untyped, Array[[Symbol, Prism::Location]]) -> void
73
+ def rewrite: (untyped, Array[[ Symbol, Prism::Location ]]) -> void
74
+
75
+ # : (Symbol, Prism::Location, Herb::Range) -> [Symbol, Integer, Integer]?
76
+ def local_target: (Symbol, Prism::Location, Herb::Range) -> [ Symbol, Integer, Integer ]?
77
+
78
+ # : (Array[[Symbol, Integer, Integer]], String) -> Array[[Integer, Integer, String]]
79
+ def edits: (Array[[ Symbol, Integer, Integer ]], String) -> Array[[ Integer, Integer, String ]]
80
+
81
+ # : (String, Integer, Integer, String) -> String
82
+ def splice: (String, Integer, Integer, String) -> String
83
+
84
+ # : (untyped) -> Herb::Token?
85
+ def content_token: (untyped) -> Herb::Token?
86
+
87
+ # : (untyped, String) -> String
88
+ def check_arguments: (untyped, String) -> String
89
+
90
+ # : () -> String
91
+ def file_argument: () -> String
92
+
93
+ # : (untyped, String) -> String
94
+ def erb_source: (untyped, String) -> String
95
+
96
+ # : (String) -> String
97
+ def truncate: (String) -> String
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,111 @@
1
+ # Generated from lib/herb/engine/visitors/instrumentation_visitor.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # Wraps every ERB tag in a call that says which tag is rendering, so that whatever happens
6
+ # while it renders can be attributed to it rather than to the template as a whole.
7
+ #
8
+ # This is half of a mechanism and does nothing by itself. It supplies where, and something else
9
+ # has to supply what. A template compiled with it and rendered with nothing watching records no
10
+ # entries at all, and only costs a call per tag. What makes it worth having is anything that
11
+ # calls `Herb::Engine::Runtime::Session.observe` while a tag is rendering:
12
+ #
13
+ # require "herb/engine/visitors/instrumentation_visitor"
14
+ #
15
+ # engine = Herb::Engine.new(source, visitors: [Herb::Engine::InstrumentationVisitor.new])
16
+ #
17
+ # ActiveSupport::Notifications.subscribe("sql.active_record") do |*, payload|
18
+ # Herb::Engine::Runtime::Session.observe(:queries, payload[:sql]) unless payload[:cached]
19
+ # end
20
+ #
21
+ # session = Herb::Engine::Runtime::Session.capture { render(engine.src) }
22
+ #
23
+ # session.measure(:queries, origin: "Herb Engine", code: "sql-queries") do |queries|
24
+ # "#{queries.size} SQL queries"
25
+ # end
26
+ # #=> app/views/posts/_card.html.erb:7:8: [sql-queries] 3 SQL queries
27
+ #
28
+ # Nothing about that subscription is Herb's, which is the point. Because what gets watched is
29
+ # decided at render time rather than compiled in, adding a producer never means recompiling a
30
+ # template, and Herb never has to ship a class per thing worth watching.
31
+ #
32
+ # A tag that opens a block, or that assigns to a local, is framed from the outside rather than
33
+ # wrapped, because wrapping either one would change what the template means: a block would lose
34
+ # its body, and an assignment would bind inside the wrapper instead of the template.
35
+ class InstrumentationVisitor < Herb::Visitor
36
+ extend Herb::Visitor::Experimental
37
+
38
+ include Herb::Visitor::ContextAware
39
+
40
+ SESSION: ::String
41
+
42
+ ARRAY_PROPERTIES: untyped
43
+
44
+ NODE_PROPERTIES: untyped
45
+
46
+ ASSIGNMENT_NODES: untyped
47
+
48
+ # : () -> bool
49
+ def self.rewrites_erb_source?: () -> bool
50
+
51
+ # : (?capture_output: (bool | ^(String) -> boolish | Regexp | Array[untyped])?) -> void
52
+ def initialize: (?capture_output: (bool | ^(String) -> boolish | Regexp | Array[untyped])?) -> void
53
+
54
+ def visit_document_node: (untyped node) -> untyped
55
+
56
+ def inspect: () -> untyped
57
+
58
+ private
59
+
60
+ def frame_render: (untyped node) -> untyped
61
+
62
+ def instrument: (untyped node) -> untyped
63
+
64
+ def rewrite: (untyped nodes) -> untyped
65
+
66
+ # : (Herb::AST::Node, Herb::Visitor::Context::Origin::Entry) -> Array[Herb::AST::Node]
67
+ def rewrite_import: (Herb::AST::Node, Herb::Visitor::Context::Origin::Entry) -> Array[Herb::AST::Node]
68
+
69
+ # : (Herb::AST::Node) -> Array[Herb::AST::Node]
70
+ def rewrite_node: (Herb::AST::Node) -> Array[Herb::AST::Node]
71
+
72
+ # : (Herb::AST::Node, Herb::AST::Node) -> Herb::AST::Node
73
+ def replacing: (Herb::AST::Node, Herb::AST::Node) -> Herb::AST::Node
74
+
75
+ def framed?: (untyped node) -> untyped
76
+
77
+ def assignment?: (untyped node) -> untyped
78
+
79
+ def block?: (untyped node) -> untyped
80
+
81
+ def via: (untyped node) -> untyped
82
+
83
+ def wrapped_output: (untyped node) -> untyped
84
+
85
+ def captured?: (untyped node) -> untyped
86
+
87
+ def wrapped_statement: (untyped node) -> untyped
88
+
89
+ # : (String) -> bool
90
+ def spans_lines?: (String) -> bool
91
+
92
+ def enter_node: (untyped node) -> untyped
93
+
94
+ def leave_node: (untyped node) -> untyped
95
+
96
+ def enter_render_node: (untyped node, untyped file) -> untyped
97
+
98
+ def render_arguments: (untyped file) -> untyped
99
+
100
+ def digest_for: (untyped file) -> untyped
101
+
102
+ def leave_render_node: (untyped node) -> untyped
103
+
104
+ def position: (untyped node) -> untyped
105
+
106
+ def code: (untyped node) -> untyped
107
+
108
+ def erb_node: (untyped node, untyped opening, untyped code) -> untyped
109
+ end
110
+ end
111
+ end
@@ -0,0 +1,246 @@
1
+ # Generated from lib/herb/engine/visitors/optimize_visitor.rb with RBS::Inline
2
+
3
+ module Herb
4
+ class Engine
5
+ # Asks the parser to resolve Action View helpers into the markup they produce, so the compiler
6
+ # emits that markup directly instead of a call the renderer has to make. Passing it is the
7
+ # whole opt-in:
8
+ #
9
+ # Herb::Engine.new(source, visitors: [Herb::Engine::OptimizeVisitor.new])
10
+ #
11
+ # There is no check first for whether a template looks like it contains helpers, because a
12
+ # caller that added this has already answered that question.
13
+ #
14
+ # An output tag whose Ruby is a single string, integer, or float literal renders the same text
15
+ # every time, so the visitor folds it into the template text around it. `<%= "hello" %>`
16
+ # compiles to the text `hello`, with nothing left to evaluate when the template renders. The
17
+ # escaping the compiler would have arranged at render time is applied once here instead, by the
18
+ # same functions it would have called, so the fold produces byte for byte what the expression
19
+ # would have, in an attribute value and inside `<script>` or `<style>` just as in plain
20
+ # content. A caller that swapped one of those functions out through `escapefunc`, `attrfunc`,
21
+ # `jsfunc`, or `cssfunc` gets the fold only when the stock function leaves the value untouched,
22
+ # on the grounds that an escape function has nothing to do there either.
23
+ #
24
+ # A literal that spans lines, sits in a trimming tag, or renders nothing at all stays dynamic,
25
+ # so folding never moves another tag off the line it was written on and never changes how the
26
+ # whitespace around the tag is handled. Folding rewrites the ERB a template was written with,
27
+ # so a visitor that reads it, like `Slots::Visitor`, has to run earlier in the stack, and the
28
+ # stack raises when it does not.
29
+ #
30
+ # Its presence also lets the engine collapse a template that carries no Ruby into the single
31
+ # string literal it renders, skipping the buffer the compiler would otherwise build up. A
32
+ # template that was HTML to begin with qualifies, and so does one left fully static once the
33
+ # helpers above resolved to markup and the literal outputs folded into text. The collapse is
34
+ # held back when the caller drives the buffer itself through `preamble`, `postamble`, `bufval`,
35
+ # or `ensure`, and when a visitor recorded a diagnostic that the compiled template still needs
36
+ # to report.
37
+ #
38
+ # A template whose only Ruby is conditional chains over otherwise static markup collapses the
39
+ # same way, nesting included. `if`, `unless`, and `elsif` qualify, and so do `case` with its
40
+ # `when` branches and `case` matching with `in` patterns. Each render path becomes one frozen
41
+ # string literal holding everything that path renders, the markup around and between the
42
+ # conditionals included, and the compiled template is the chains themselves picking between
43
+ # them. The conditions compile onto the lines they were written on, so backtraces stay right.
44
+ # A chain without an `else` gets one that returns what the template renders without it, except
45
+ # a pattern matching chain, which keeps raising `NoMatchingPatternError` for a value no
46
+ # pattern accepts, the way it rendered before the collapse.
47
+ #
48
+ # The path literals repeat the markup the paths share, so the collapse steps back when they
49
+ # would hold more than `DUPLICATION_LIMIT` times the template's static bytes, and the buffer
50
+ # stays. A chain that sits beside another in the same scope keeps the buffer too.
51
+ #
52
+ # A template the collapse walks away from can still get its static subtrees. With
53
+ # `subtrees: true`, when the buffer stays, a chain whose branches are static collapses into a
54
+ # single append of the chain picking between path literals, the static text around it merged
55
+ # in, so a conditional attribute next to a dynamic one costs one append where it cost three.
56
+ # A chain the buffer already renders in one append is left as it was, and the duplication
57
+ # limit governs each subtree the way it governs the template. The pass trades compiled
58
+ # template bytes for fewer appends at render time, which is why it is the one pass that is
59
+ # off by default.
60
+ #
61
+ # Every other pass is on by default, and each can be left off on its own. `helpers: false` stops
62
+ # asking the parser to resolve helpers, `conditionals: false` stops asking it to unroll the
63
+ # postfix conditionals and ternaries it would have, `literals: false` keeps literal outputs
64
+ # dynamic, and `collapse: false` keeps the buffer for a template either collapse above would
65
+ # have compiled without one:
66
+ #
67
+ # Herb::Engine::OptimizeVisitor.new(literals: false, collapse: false)
68
+ #
69
+ # Turning a parser-side pass off only withdraws this visitor's request for the parser option
70
+ # behind it. A caller that asks for `action_view_helpers: true` through `parser_options` still
71
+ # gets the resolution the parser was asked for directly, and `verify` below still covers what
72
+ # it resolved. Unrolling is also part of how the parser resolves helpers, since a helper
73
+ # behind a modifier has to come out of it first, so a modifier keeps its written shape only
74
+ # once `helpers` is off too.
75
+ #
76
+ # Replacing a helper call with its markup is only the same thing as calling it while the helper
77
+ # is the one it was resolved against. An application that defines its own `content_tag` gets the
78
+ # stock markup instead, everywhere, with nothing at the call site to say so. `verify` compiles a
79
+ # check into the template that runs when it renders and reports a helper that has since been
80
+ # overwritten:
81
+ #
82
+ # Herb::Engine::OptimizeVisitor.new(verify: true)
83
+ #
84
+ # It costs a call per render and reports rather than corrects, so it earns its place in
85
+ # development and not in production. Compiling it in is the caller's decision for the same reason
86
+ # the optimization itself is.
87
+ class OptimizeVisitor < Herb::Visitor
88
+ extend Herb::Visitor::Experimental
89
+
90
+ include Herb::Visitor::ContextAware
91
+
92
+ SESSION: String
93
+
94
+ CODE: String
95
+
96
+ ORIGIN: String
97
+
98
+ OUTPUT_OPENINGS: Array[String]
99
+
100
+ CHILD_LISTS: Array[Symbol]
101
+
102
+ BRANCHLESS_KEYWORDS: Array[Symbol]
103
+
104
+ CHAIN_OPENINGS: Array[Symbol]
105
+
106
+ DUPLICATION_LIMIT: Integer
107
+
108
+ # : () -> Array[String]
109
+ def self.helper_sources: () -> Array[String]
110
+
111
+ # : () -> bool
112
+ def self.rewrites_erb_source?: () -> bool
113
+
114
+ # : (?helpers: bool, ?conditionals: bool, ?literals: bool, ?collapse: bool, ?subtrees: bool, ?verify: bool) -> void
115
+ def initialize: (?helpers: bool, ?conditionals: bool, ?literals: bool, ?collapse: bool, ?subtrees: bool, ?verify: bool) -> void
116
+
117
+ # : () -> Hash[Symbol, untyped]
118
+ def required_parser_options: () -> Hash[Symbol, untyped]
119
+
120
+ # : (Herb::AST::DocumentNode) -> void
121
+ def visit_document_node: (Herb::AST::DocumentNode) -> void
122
+
123
+ # : (Herb::AST::Node) -> void
124
+ def visit_node: (Herb::AST::Node) -> void
125
+
126
+ # : (Herb::AST::HTMLElementNode) -> void
127
+ def visit_html_element_node: (Herb::AST::HTMLElementNode) -> void
128
+
129
+ # : (Herb::AST::HTMLConditionalElementNode) -> void
130
+ def visit_html_conditional_element_node: (Herb::AST::HTMLConditionalElementNode) -> void
131
+
132
+ # : (Herb::AST::HTMLAttributeValueNode) -> void
133
+ def visit_html_attribute_value_node: (Herb::AST::HTMLAttributeValueNode) -> void
134
+
135
+ # : (Herb::Engine, untyped) -> String?
136
+ def compile_static_body: (Herb::Engine, untyped) -> String?
137
+
138
+ # : () -> String
139
+ def inspect: () -> String
140
+
141
+ private
142
+
143
+ # : () -> Array[String]
144
+ def non_default_toggles: () -> Array[String]
145
+
146
+ # : (Herb::Engine, untyped) -> String?
147
+ def static_body: (Herb::Engine, untyped) -> String?
148
+
149
+ # : (Herb::Engine, Array[untyped]) -> void
150
+ def collapse_subtrees: (Herb::Engine, Array[untyped]) -> void
151
+
152
+ # : ((Herb::AST::HTMLElementNode | Herb::AST::HTMLConditionalElementNode)) -> Symbol?
153
+ def element_output_context: (Herb::AST::HTMLElementNode | Herb::AST::HTMLConditionalElementNode) -> Symbol?
154
+
155
+ # : (Symbol?) { () -> void } -> void
156
+ def with_output_context: (Symbol?) { () -> void } -> void
157
+
158
+ # : () -> Symbol
159
+ def current_output_context: () -> Symbol
160
+
161
+ # : (Herb::AST::Node?) -> Herb::AST::LiteralNode?
162
+ def folded_literal: (Herb::AST::Node?) -> Herb::AST::LiteralNode?
163
+
164
+ # : (String) -> String?
165
+ def literal_value: (String) -> String?
166
+
167
+ # : (String, String) -> String?
168
+ def output_text: (String, String) -> String?
169
+
170
+ # : (String, Symbol) { () -> String } -> String?
171
+ def escaped_output: (String, Symbol) { () -> String } -> String?
172
+
173
+ # : (String) -> bool
174
+ def escape_output?: (String) -> bool
175
+
176
+ # : (Herb::Engine, Array[untyped]) -> String?
177
+ def compile_static_branches: (Herb::Engine, Array[untyped]) -> String?
178
+
179
+ # : (Array[untyped]) -> Hash[Symbol, untyped]?
180
+ def branch_tree: (Array[untyped]) -> Hash[Symbol, untyped]?
181
+
182
+ # : (Array[untyped], Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
183
+ def tree_step: (Array[untyped], Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
184
+
185
+ # : (Symbol, String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
186
+ def tree_transition: (Symbol, String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
187
+
188
+ # : (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
189
+ def open_chain: (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
190
+
191
+ # : (String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
192
+ def open_case_chain: (String, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
193
+
194
+ # : (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
195
+ def open_case_branch: (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
196
+
197
+ # : (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
198
+ def open_branch: (Symbol, Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
199
+
200
+ # : (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
201
+ def close_chain: (Array[Hash[Symbol, untyped]], Array[Hash[Symbol, untyped]]) -> untyped
202
+
203
+ # : (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]?
204
+ def container_chain: (Hash[Symbol, untyped]) -> Hash[Symbol, untyped]?
205
+
206
+ # : (Hash[Symbol, untyped]) -> [String, String]
207
+ def chain_surroundings: (Hash[Symbol, untyped]) -> [ String, String ]
208
+
209
+ # : (Hash[Symbol, untyped]) -> Array[String]
210
+ def container_paths: (Hash[Symbol, untyped]) -> Array[String]
211
+
212
+ # : (Array[String], Array[untyped]) -> bool
213
+ def within_duplication_limit?: (Array[String], Array[untyped]) -> bool
214
+
215
+ # : (Herb::Engine, Hash[Symbol, untyped], String, String, Hash[Symbol, Array[String?]]) -> void
216
+ def collect_leaf_literals: (Herb::Engine, Hash[Symbol, untyped], String, String, Hash[Symbol, Array[String?]]) -> void
217
+
218
+ # : (Herb::Engine, Array[untyped], Integer) -> [::Range[Integer], Array[untyped]]?
219
+ def chain_run_replacement: (Herb::Engine, Array[untyped], Integer) -> [ ::Range[Integer], Array[untyped] ]?
220
+
221
+ # : (Array[untyped], Integer) -> Integer?
222
+ def chain_end_index: (Array[untyped], Integer) -> Integer?
223
+
224
+ # : (Hash[Symbol, untyped]) -> bool
225
+ def nested_chain?: (Hash[Symbol, untyped]) -> bool
226
+
227
+ # : (String) -> Symbol?
228
+ def chain_keyword: (String) -> Symbol?
229
+
230
+ # : (Herb::Engine, Array[untyped], Hash[Symbol, untyped]) -> String
231
+ def render_static_branches: (Herb::Engine, Array[untyped], Hash[Symbol, untyped]) -> String
232
+
233
+ # : (String?, Herb::Location?) -> void
234
+ def collect: (String?, Herb::Location?) -> void
235
+
236
+ # : (Herb::AST::DocumentNode) -> Herb::AST::ERBContentNode
237
+ def check_node: (Herb::AST::DocumentNode) -> Herb::AST::ERBContentNode
238
+
239
+ # : (String, Herb::Location?) -> String
240
+ def check_for: (String, Herb::Location?) -> String
241
+
242
+ # : (String, String, Herb::Location?) -> String
243
+ def entry_for: (String, String, Herb::Location?) -> String
244
+ end
245
+ end
246
+ end