@herb-tools/node 0.8.10 → 0.9.1

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 (171) hide show
  1. package/binding.gyp +27 -8
  2. package/dist/herb-node.cjs +41 -12
  3. package/dist/herb-node.cjs.map +1 -1
  4. package/dist/herb-node.esm.js +8 -1
  5. package/dist/herb-node.esm.js.map +1 -1
  6. package/dist/types/node-backend.d.ts +3 -1
  7. package/extension/error_helpers.cpp +598 -73
  8. package/extension/error_helpers.h +20 -3
  9. package/extension/extension_helpers.cpp +40 -35
  10. package/extension/extension_helpers.h +2 -2
  11. package/extension/herb.cpp +194 -64
  12. package/extension/libherb/analyze/action_view/attribute_extraction_helpers.c +303 -0
  13. package/extension/libherb/analyze/action_view/attribute_extraction_helpers.h +36 -0
  14. package/extension/libherb/analyze/action_view/content_tag.c +78 -0
  15. package/extension/libherb/analyze/action_view/link_to.c +167 -0
  16. package/extension/libherb/analyze/action_view/registry.c +83 -0
  17. package/extension/libherb/analyze/action_view/tag.c +70 -0
  18. package/extension/libherb/analyze/action_view/tag_helper_handler.h +43 -0
  19. package/extension/libherb/analyze/action_view/tag_helper_node_builders.c +305 -0
  20. package/extension/libherb/analyze/action_view/tag_helper_node_builders.h +70 -0
  21. package/extension/libherb/analyze/action_view/tag_helpers.c +815 -0
  22. package/extension/libherb/analyze/action_view/tag_helpers.h +38 -0
  23. package/extension/libherb/analyze/action_view/turbo_frame_tag.c +88 -0
  24. package/extension/libherb/analyze/analyze.c +885 -0
  25. package/extension/libherb/{include → analyze}/analyze.h +14 -4
  26. package/extension/libherb/{analyzed_ruby.c → analyze/analyzed_ruby.c} +13 -11
  27. package/extension/libherb/{analyzed_ruby.h → analyze/analyzed_ruby.h} +3 -3
  28. package/extension/libherb/analyze/builders.c +343 -0
  29. package/extension/libherb/analyze/builders.h +27 -0
  30. package/extension/libherb/analyze/conditional_elements.c +594 -0
  31. package/extension/libherb/analyze/conditional_elements.h +9 -0
  32. package/extension/libherb/analyze/conditional_open_tags.c +640 -0
  33. package/extension/libherb/analyze/conditional_open_tags.h +9 -0
  34. package/extension/libherb/analyze/control_type.c +250 -0
  35. package/extension/libherb/analyze/control_type.h +14 -0
  36. package/extension/libherb/{analyze_helpers.c → analyze/helpers.c} +48 -23
  37. package/extension/libherb/{analyze_helpers.h → analyze/helpers.h} +4 -2
  38. package/extension/libherb/analyze/invalid_structures.c +193 -0
  39. package/extension/libherb/analyze/invalid_structures.h +11 -0
  40. package/extension/libherb/{analyze_missing_end.c → analyze/missing_end.c} +33 -22
  41. package/extension/libherb/analyze/parse_errors.c +84 -0
  42. package/extension/libherb/analyze/prism_annotate.c +399 -0
  43. package/extension/libherb/analyze/prism_annotate.h +16 -0
  44. package/extension/libherb/analyze/render_nodes.c +761 -0
  45. package/extension/libherb/analyze/render_nodes.h +11 -0
  46. package/extension/libherb/{analyze_transform.c → analyze/transform.c} +24 -3
  47. package/extension/libherb/ast_node.c +17 -7
  48. package/extension/libherb/ast_node.h +11 -5
  49. package/extension/libherb/ast_nodes.c +760 -388
  50. package/extension/libherb/ast_nodes.h +155 -39
  51. package/extension/libherb/ast_pretty_print.c +265 -7
  52. package/extension/libherb/ast_pretty_print.h +6 -1
  53. package/extension/libherb/element_source.h +3 -8
  54. package/extension/libherb/errors.c +1455 -520
  55. package/extension/libherb/errors.h +207 -56
  56. package/extension/libherb/extract.c +145 -49
  57. package/extension/libherb/extract.h +21 -5
  58. package/extension/libherb/herb.c +52 -34
  59. package/extension/libherb/herb.h +18 -6
  60. package/extension/libherb/herb_prism_node.h +13 -0
  61. package/extension/libherb/html_util.c +241 -12
  62. package/extension/libherb/html_util.h +7 -2
  63. package/extension/libherb/include/analyze/action_view/attribute_extraction_helpers.h +36 -0
  64. package/extension/libherb/include/analyze/action_view/tag_helper_handler.h +43 -0
  65. package/extension/libherb/include/analyze/action_view/tag_helper_node_builders.h +70 -0
  66. package/extension/libherb/include/analyze/action_view/tag_helpers.h +38 -0
  67. package/extension/libherb/{analyze.h → include/analyze/analyze.h} +14 -4
  68. package/extension/libherb/include/{analyzed_ruby.h → analyze/analyzed_ruby.h} +3 -3
  69. package/extension/libherb/include/analyze/builders.h +27 -0
  70. package/extension/libherb/include/analyze/conditional_elements.h +9 -0
  71. package/extension/libherb/include/analyze/conditional_open_tags.h +9 -0
  72. package/extension/libherb/include/analyze/control_type.h +14 -0
  73. package/extension/libherb/include/{analyze_helpers.h → analyze/helpers.h} +4 -2
  74. package/extension/libherb/include/analyze/invalid_structures.h +11 -0
  75. package/extension/libherb/include/analyze/prism_annotate.h +16 -0
  76. package/extension/libherb/include/analyze/render_nodes.h +11 -0
  77. package/extension/libherb/include/ast_node.h +11 -5
  78. package/extension/libherb/include/ast_nodes.h +155 -39
  79. package/extension/libherb/include/ast_pretty_print.h +6 -1
  80. package/extension/libherb/include/element_source.h +3 -8
  81. package/extension/libherb/include/errors.h +207 -56
  82. package/extension/libherb/include/extract.h +21 -5
  83. package/extension/libherb/include/herb.h +18 -6
  84. package/extension/libherb/include/herb_prism_node.h +13 -0
  85. package/extension/libherb/include/html_util.h +7 -2
  86. package/extension/libherb/include/io.h +3 -1
  87. package/extension/libherb/include/lex_helpers.h +29 -0
  88. package/extension/libherb/include/lexer.h +1 -1
  89. package/extension/libherb/include/lexer_peek_helpers.h +87 -13
  90. package/extension/libherb/include/lexer_struct.h +2 -0
  91. package/extension/libherb/include/location.h +2 -1
  92. package/extension/libherb/include/parser.h +28 -2
  93. package/extension/libherb/include/parser_helpers.h +19 -3
  94. package/extension/libherb/include/pretty_print.h +10 -5
  95. package/extension/libherb/include/prism_context.h +45 -0
  96. package/extension/libherb/include/prism_helpers.h +10 -7
  97. package/extension/libherb/include/prism_serialized.h +12 -0
  98. package/extension/libherb/include/token.h +16 -4
  99. package/extension/libherb/include/token_struct.h +10 -3
  100. package/extension/libherb/include/utf8.h +2 -1
  101. package/extension/libherb/include/util/hb_allocator.h +78 -0
  102. package/extension/libherb/include/util/hb_arena.h +6 -1
  103. package/extension/libherb/include/util/hb_arena_debug.h +12 -1
  104. package/extension/libherb/include/util/hb_array.h +7 -3
  105. package/extension/libherb/include/util/hb_buffer.h +6 -4
  106. package/extension/libherb/include/util/hb_foreach.h +79 -0
  107. package/extension/libherb/include/util/hb_narray.h +8 -4
  108. package/extension/libherb/include/util/hb_string.h +56 -9
  109. package/extension/libherb/include/util.h +6 -3
  110. package/extension/libherb/include/version.h +1 -1
  111. package/extension/libherb/io.c +3 -2
  112. package/extension/libherb/io.h +3 -1
  113. package/extension/libherb/lex_helpers.h +29 -0
  114. package/extension/libherb/lexer.c +42 -30
  115. package/extension/libherb/lexer.h +1 -1
  116. package/extension/libherb/lexer_peek_helpers.c +12 -74
  117. package/extension/libherb/lexer_peek_helpers.h +87 -13
  118. package/extension/libherb/lexer_struct.h +2 -0
  119. package/extension/libherb/location.c +2 -2
  120. package/extension/libherb/location.h +2 -1
  121. package/extension/libherb/main.c +53 -28
  122. package/extension/libherb/parser.c +784 -247
  123. package/extension/libherb/parser.h +28 -2
  124. package/extension/libherb/parser_helpers.c +110 -23
  125. package/extension/libherb/parser_helpers.h +19 -3
  126. package/extension/libherb/parser_match_tags.c +130 -49
  127. package/extension/libherb/pretty_print.c +29 -24
  128. package/extension/libherb/pretty_print.h +10 -5
  129. package/extension/libherb/prism_context.h +45 -0
  130. package/extension/libherb/prism_helpers.c +30 -27
  131. package/extension/libherb/prism_helpers.h +10 -7
  132. package/extension/libherb/prism_serialized.h +12 -0
  133. package/extension/libherb/ruby_parser.c +2 -0
  134. package/extension/libherb/token.c +151 -66
  135. package/extension/libherb/token.h +16 -4
  136. package/extension/libherb/token_matchers.c +0 -1
  137. package/extension/libherb/token_struct.h +10 -3
  138. package/extension/libherb/utf8.c +7 -6
  139. package/extension/libherb/utf8.h +2 -1
  140. package/extension/libherb/util/hb_allocator.c +341 -0
  141. package/extension/libherb/util/hb_allocator.h +78 -0
  142. package/extension/libherb/util/hb_arena.c +81 -56
  143. package/extension/libherb/util/hb_arena.h +6 -1
  144. package/extension/libherb/util/hb_arena_debug.c +32 -17
  145. package/extension/libherb/util/hb_arena_debug.h +12 -1
  146. package/extension/libherb/util/hb_array.c +30 -15
  147. package/extension/libherb/util/hb_array.h +7 -3
  148. package/extension/libherb/util/hb_buffer.c +17 -21
  149. package/extension/libherb/util/hb_buffer.h +6 -4
  150. package/extension/libherb/util/hb_foreach.h +79 -0
  151. package/extension/libherb/util/hb_narray.c +22 -7
  152. package/extension/libherb/util/hb_narray.h +8 -4
  153. package/extension/libherb/util/hb_string.c +49 -35
  154. package/extension/libherb/util/hb_string.h +56 -9
  155. package/extension/libherb/util.c +21 -11
  156. package/extension/libherb/util.h +6 -3
  157. package/extension/libherb/version.h +1 -1
  158. package/extension/libherb/visitor.c +68 -1
  159. package/extension/nodes.cpp +593 -6
  160. package/extension/nodes.h +10 -1
  161. package/package.json +12 -8
  162. package/src/node-backend.ts +11 -1
  163. package/dist/types/index-cjs.d.cts +0 -1
  164. package/extension/libherb/analyze.c +0 -1608
  165. package/extension/libherb/element_source.c +0 -12
  166. package/extension/libherb/include/util/hb_system.h +0 -9
  167. package/extension/libherb/util/hb_system.c +0 -30
  168. package/extension/libherb/util/hb_system.h +0 -9
  169. package/src/index-cjs.cts +0 -22
  170. /package/dist/types/{index-esm.d.mts → index.d.ts} +0 -0
  171. /package/src/{index-esm.mts → index.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  // NOTE: This file is generated by the templates/template.rb script and should not
2
- // be modified manually. See /Users/marcoroth/Development/herb-release-0.8.10/templates/javascript/packages/node/extension/nodes.cpp.erb
2
+ // be modified manually. See /Users/marcoroth/Development/herb-release-0.9.1/templates/javascript/packages/node/extension/nodes.cpp.erb
3
3
 
4
4
  #include <node_api.h>
5
5
  #include "error_helpers.h"
@@ -39,6 +39,29 @@ napi_value document_nodeNodeFromCStruct(napi_env env, AST_DOCUMENT_NODE_T* docum
39
39
  napi_value children = NodesArrayFromCArray(env, document_node->children);
40
40
  napi_set_named_property(env, result, "children", children);
41
41
 
42
+ /* prism_context is internal parser state, not exposed to JavaScript */
43
+ napi_value prism_context;
44
+ napi_get_null(env, &prism_context);
45
+ napi_set_named_property(env, result, "prism_context", prism_context);
46
+
47
+ napi_value prism_node;
48
+ if (document_node->prism_node.node != NULL && document_node->prism_node.parser != NULL) {
49
+ pm_buffer_t pm_buffer = { 0 };
50
+ pm_serialize(document_node->prism_node.parser, document_node->prism_node.node, &pm_buffer);
51
+
52
+ if (pm_buffer.length > 0) {
53
+ void* buffer_data;
54
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
55
+ } else {
56
+ napi_get_null(env, &prism_node);
57
+ }
58
+
59
+ pm_buffer_free(&pm_buffer);
60
+ } else {
61
+ napi_get_null(env, &prism_node);
62
+ }
63
+ napi_set_named_property(env, result, "prism_node", prism_node);
64
+
42
65
 
43
66
  return result;
44
67
  }
@@ -61,7 +84,7 @@ napi_value literal_nodeNodeFromCStruct(napi_env env, AST_LITERAL_NODE_T* literal
61
84
  napi_value errors = ErrorsArrayFromCArray(env, literal_node->base.errors);
62
85
  napi_set_named_property(env, result, "errors", errors);
63
86
 
64
- napi_value content = CreateString(env, literal_node->content);
87
+ napi_value content = CreateStringFromHbString(env, literal_node->content);
65
88
  napi_set_named_property(env, result, "content", content);
66
89
 
67
90
 
@@ -103,6 +126,38 @@ napi_value html_open_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_OPEN_TAG_NOD
103
126
  napi_set_named_property(env, result, "is_void", is_void);
104
127
 
105
128
 
129
+ return result;
130
+ }
131
+ napi_value html_conditional_open_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_CONDITIONAL_OPEN_TAG_NODE_T* html_conditional_open_tag_node) {
132
+ if (!html_conditional_open_tag_node) {
133
+ napi_value null_value;
134
+ napi_get_null(env, &null_value);
135
+ return null_value;
136
+ }
137
+
138
+ napi_value result;
139
+ napi_create_object(env, &result);
140
+
141
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&html_conditional_open_tag_node->base));
142
+ napi_set_named_property(env, result, "type", type);
143
+
144
+ napi_value location = CreateLocation(env, html_conditional_open_tag_node->base.location);
145
+ napi_set_named_property(env, result, "location", location);
146
+
147
+ napi_value errors = ErrorsArrayFromCArray(env, html_conditional_open_tag_node->base.errors);
148
+ napi_set_named_property(env, result, "errors", errors);
149
+
150
+ napi_value conditional = NodeFromCStruct(env, (AST_NODE_T*) html_conditional_open_tag_node->conditional);
151
+ napi_set_named_property(env, result, "conditional", conditional);
152
+
153
+ napi_value tag_name = CreateToken(env, html_conditional_open_tag_node->tag_name);
154
+ napi_set_named_property(env, result, "tag_name", tag_name);
155
+
156
+ napi_value is_void;
157
+ napi_get_boolean(env, html_conditional_open_tag_node->is_void, &is_void);
158
+ napi_set_named_property(env, result, "is_void", is_void);
159
+
160
+
106
161
  return result;
107
162
  }
108
163
  napi_value html_close_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_CLOSE_TAG_NODE_T* html_close_tag_node) {
@@ -137,6 +192,56 @@ napi_value html_close_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_CLOSE_TAG_N
137
192
  napi_set_named_property(env, result, "tag_closing", tag_closing);
138
193
 
139
194
 
195
+ return result;
196
+ }
197
+ napi_value html_omitted_close_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_OMITTED_CLOSE_TAG_NODE_T* html_omitted_close_tag_node) {
198
+ if (!html_omitted_close_tag_node) {
199
+ napi_value null_value;
200
+ napi_get_null(env, &null_value);
201
+ return null_value;
202
+ }
203
+
204
+ napi_value result;
205
+ napi_create_object(env, &result);
206
+
207
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&html_omitted_close_tag_node->base));
208
+ napi_set_named_property(env, result, "type", type);
209
+
210
+ napi_value location = CreateLocation(env, html_omitted_close_tag_node->base.location);
211
+ napi_set_named_property(env, result, "location", location);
212
+
213
+ napi_value errors = ErrorsArrayFromCArray(env, html_omitted_close_tag_node->base.errors);
214
+ napi_set_named_property(env, result, "errors", errors);
215
+
216
+ napi_value tag_name = CreateToken(env, html_omitted_close_tag_node->tag_name);
217
+ napi_set_named_property(env, result, "tag_name", tag_name);
218
+
219
+
220
+ return result;
221
+ }
222
+ napi_value html_virtual_close_tag_nodeNodeFromCStruct(napi_env env, AST_HTML_VIRTUAL_CLOSE_TAG_NODE_T* html_virtual_close_tag_node) {
223
+ if (!html_virtual_close_tag_node) {
224
+ napi_value null_value;
225
+ napi_get_null(env, &null_value);
226
+ return null_value;
227
+ }
228
+
229
+ napi_value result;
230
+ napi_create_object(env, &result);
231
+
232
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&html_virtual_close_tag_node->base));
233
+ napi_set_named_property(env, result, "type", type);
234
+
235
+ napi_value location = CreateLocation(env, html_virtual_close_tag_node->base.location);
236
+ napi_set_named_property(env, result, "location", location);
237
+
238
+ napi_value errors = ErrorsArrayFromCArray(env, html_virtual_close_tag_node->base.errors);
239
+ napi_set_named_property(env, result, "errors", errors);
240
+
241
+ napi_value tag_name = CreateToken(env, html_virtual_close_tag_node->tag_name);
242
+ napi_set_named_property(env, result, "tag_name", tag_name);
243
+
244
+
140
245
  return result;
141
246
  }
142
247
  napi_value html_element_nodeNodeFromCStruct(napi_env env, AST_HTML_ELEMENT_NODE_T* html_element_node) {
@@ -174,8 +279,54 @@ napi_value html_element_nodeNodeFromCStruct(napi_env env, AST_HTML_ELEMENT_NODE_
174
279
  napi_get_boolean(env, html_element_node->is_void, &is_void);
175
280
  napi_set_named_property(env, result, "is_void", is_void);
176
281
 
177
- napi_value source = CreateStringFromHbString(env, element_source_to_string(html_element_node->source));
178
- napi_set_named_property(env, result, "source", source);
282
+ napi_value element_source = CreateStringFromHbString(env, html_element_node->element_source);
283
+ napi_set_named_property(env, result, "element_source", element_source);
284
+
285
+
286
+ return result;
287
+ }
288
+ napi_value html_conditional_element_nodeNodeFromCStruct(napi_env env, AST_HTML_CONDITIONAL_ELEMENT_NODE_T* html_conditional_element_node) {
289
+ if (!html_conditional_element_node) {
290
+ napi_value null_value;
291
+ napi_get_null(env, &null_value);
292
+ return null_value;
293
+ }
294
+
295
+ napi_value result;
296
+ napi_create_object(env, &result);
297
+
298
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&html_conditional_element_node->base));
299
+ napi_set_named_property(env, result, "type", type);
300
+
301
+ napi_value location = CreateLocation(env, html_conditional_element_node->base.location);
302
+ napi_set_named_property(env, result, "location", location);
303
+
304
+ napi_value errors = ErrorsArrayFromCArray(env, html_conditional_element_node->base.errors);
305
+ napi_set_named_property(env, result, "errors", errors);
306
+
307
+ napi_value condition = CreateStringFromHbString(env, html_conditional_element_node->condition);
308
+ napi_set_named_property(env, result, "condition", condition);
309
+
310
+ napi_value open_conditional = NodeFromCStruct(env, (AST_NODE_T*) html_conditional_element_node->open_conditional);
311
+ napi_set_named_property(env, result, "open_conditional", open_conditional);
312
+
313
+ napi_value open_tag = NodeFromCStruct(env, (AST_NODE_T*) html_conditional_element_node->open_tag);
314
+ napi_set_named_property(env, result, "open_tag", open_tag);
315
+
316
+ napi_value body = NodesArrayFromCArray(env, html_conditional_element_node->body);
317
+ napi_set_named_property(env, result, "body", body);
318
+
319
+ napi_value close_tag = NodeFromCStruct(env, (AST_NODE_T*) html_conditional_element_node->close_tag);
320
+ napi_set_named_property(env, result, "close_tag", close_tag);
321
+
322
+ napi_value close_conditional = NodeFromCStruct(env, (AST_NODE_T*) html_conditional_element_node->close_conditional);
323
+ napi_set_named_property(env, result, "close_conditional", close_conditional);
324
+
325
+ napi_value tag_name = CreateToken(env, html_conditional_element_node->tag_name);
326
+ napi_set_named_property(env, result, "tag_name", tag_name);
327
+
328
+ napi_value element_source = CreateStringFromHbString(env, html_conditional_element_node->element_source);
329
+ napi_set_named_property(env, result, "element_source", element_source);
179
330
 
180
331
 
181
332
  return result;
@@ -269,6 +420,96 @@ napi_value html_attribute_nodeNodeFromCStruct(napi_env env, AST_HTML_ATTRIBUTE_N
269
420
  napi_set_named_property(env, result, "value", value);
270
421
 
271
422
 
423
+ return result;
424
+ }
425
+ napi_value ruby_literal_nodeNodeFromCStruct(napi_env env, AST_RUBY_LITERAL_NODE_T* ruby_literal_node) {
426
+ if (!ruby_literal_node) {
427
+ napi_value null_value;
428
+ napi_get_null(env, &null_value);
429
+ return null_value;
430
+ }
431
+
432
+ napi_value result;
433
+ napi_create_object(env, &result);
434
+
435
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&ruby_literal_node->base));
436
+ napi_set_named_property(env, result, "type", type);
437
+
438
+ napi_value location = CreateLocation(env, ruby_literal_node->base.location);
439
+ napi_set_named_property(env, result, "location", location);
440
+
441
+ napi_value errors = ErrorsArrayFromCArray(env, ruby_literal_node->base.errors);
442
+ napi_set_named_property(env, result, "errors", errors);
443
+
444
+ napi_value content = CreateStringFromHbString(env, ruby_literal_node->content);
445
+ napi_set_named_property(env, result, "content", content);
446
+
447
+
448
+ return result;
449
+ }
450
+ napi_value ruby_html_attributes_splat_nodeNodeFromCStruct(napi_env env, AST_RUBY_HTML_ATTRIBUTES_SPLAT_NODE_T* ruby_html_attributes_splat_node) {
451
+ if (!ruby_html_attributes_splat_node) {
452
+ napi_value null_value;
453
+ napi_get_null(env, &null_value);
454
+ return null_value;
455
+ }
456
+
457
+ napi_value result;
458
+ napi_create_object(env, &result);
459
+
460
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&ruby_html_attributes_splat_node->base));
461
+ napi_set_named_property(env, result, "type", type);
462
+
463
+ napi_value location = CreateLocation(env, ruby_html_attributes_splat_node->base.location);
464
+ napi_set_named_property(env, result, "location", location);
465
+
466
+ napi_value errors = ErrorsArrayFromCArray(env, ruby_html_attributes_splat_node->base.errors);
467
+ napi_set_named_property(env, result, "errors", errors);
468
+
469
+ napi_value content = CreateStringFromHbString(env, ruby_html_attributes_splat_node->content);
470
+ napi_set_named_property(env, result, "content", content);
471
+
472
+ napi_value prefix = CreateStringFromHbString(env, ruby_html_attributes_splat_node->prefix);
473
+ napi_set_named_property(env, result, "prefix", prefix);
474
+
475
+
476
+ return result;
477
+ }
478
+ napi_value erb_open_tag_nodeNodeFromCStruct(napi_env env, AST_ERB_OPEN_TAG_NODE_T* erb_open_tag_node) {
479
+ if (!erb_open_tag_node) {
480
+ napi_value null_value;
481
+ napi_get_null(env, &null_value);
482
+ return null_value;
483
+ }
484
+
485
+ napi_value result;
486
+ napi_create_object(env, &result);
487
+
488
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&erb_open_tag_node->base));
489
+ napi_set_named_property(env, result, "type", type);
490
+
491
+ napi_value location = CreateLocation(env, erb_open_tag_node->base.location);
492
+ napi_set_named_property(env, result, "location", location);
493
+
494
+ napi_value errors = ErrorsArrayFromCArray(env, erb_open_tag_node->base.errors);
495
+ napi_set_named_property(env, result, "errors", errors);
496
+
497
+ napi_value tag_opening = CreateToken(env, erb_open_tag_node->tag_opening);
498
+ napi_set_named_property(env, result, "tag_opening", tag_opening);
499
+
500
+ napi_value content = CreateToken(env, erb_open_tag_node->content);
501
+ napi_set_named_property(env, result, "content", content);
502
+
503
+ napi_value tag_closing = CreateToken(env, erb_open_tag_node->tag_closing);
504
+ napi_set_named_property(env, result, "tag_closing", tag_closing);
505
+
506
+ napi_value tag_name = CreateToken(env, erb_open_tag_node->tag_name);
507
+ napi_set_named_property(env, result, "tag_name", tag_name);
508
+
509
+ napi_value children = NodesArrayFromCArray(env, erb_open_tag_node->children);
510
+ napi_set_named_property(env, result, "children", children);
511
+
512
+
272
513
  return result;
273
514
  }
274
515
  napi_value html_text_nodeNodeFromCStruct(napi_env env, AST_HTML_TEXT_NODE_T* html_text_node) {
@@ -290,7 +531,7 @@ napi_value html_text_nodeNodeFromCStruct(napi_env env, AST_HTML_TEXT_NODE_T* htm
290
531
  napi_value errors = ErrorsArrayFromCArray(env, html_text_node->base.errors);
291
532
  napi_set_named_property(env, result, "errors", errors);
292
533
 
293
- napi_value content = CreateString(env, html_text_node->content);
534
+ napi_value content = CreateStringFromHbString(env, html_text_node->content);
294
535
  napi_set_named_property(env, result, "content", content);
295
536
 
296
537
 
@@ -473,6 +714,7 @@ napi_value erb_content_nodeNodeFromCStruct(napi_env env, AST_ERB_CONTENT_NODE_T*
473
714
  napi_value tag_closing = CreateToken(env, erb_content_node->tag_closing);
474
715
  napi_set_named_property(env, result, "tag_closing", tag_closing);
475
716
 
717
+ /* analyzed_ruby is internal parser state, not exposed to JavaScript */
476
718
  napi_value analyzed_ruby;
477
719
  napi_get_null(env, &analyzed_ruby);
478
720
  napi_set_named_property(env, result, "analyzed_ruby", analyzed_ruby);
@@ -485,6 +727,24 @@ napi_value erb_content_nodeNodeFromCStruct(napi_env env, AST_ERB_CONTENT_NODE_T*
485
727
  napi_get_boolean(env, erb_content_node->valid, &valid);
486
728
  napi_set_named_property(env, result, "valid", valid);
487
729
 
730
+ napi_value prism_node;
731
+ if (erb_content_node->prism_node.node != NULL && erb_content_node->prism_node.parser != NULL) {
732
+ pm_buffer_t pm_buffer = { 0 };
733
+ pm_serialize(erb_content_node->prism_node.parser, erb_content_node->prism_node.node, &pm_buffer);
734
+
735
+ if (pm_buffer.length > 0) {
736
+ void* buffer_data;
737
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
738
+ } else {
739
+ napi_get_null(env, &prism_node);
740
+ }
741
+
742
+ pm_buffer_free(&pm_buffer);
743
+ } else {
744
+ napi_get_null(env, &prism_node);
745
+ }
746
+ napi_set_named_property(env, result, "prism_node", prism_node);
747
+
488
748
 
489
749
  return result;
490
750
  }
@@ -589,6 +849,24 @@ napi_value erb_if_nodeNodeFromCStruct(napi_env env, AST_ERB_IF_NODE_T* erb_if_no
589
849
  }
590
850
  napi_set_named_property(env, result, "then_keyword", then_keyword);
591
851
 
852
+ napi_value prism_node;
853
+ if (erb_if_node->prism_node.node != NULL && erb_if_node->prism_node.parser != NULL) {
854
+ pm_buffer_t pm_buffer = { 0 };
855
+ pm_serialize(erb_if_node->prism_node.parser, erb_if_node->prism_node.node, &pm_buffer);
856
+
857
+ if (pm_buffer.length > 0) {
858
+ void* buffer_data;
859
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
860
+ } else {
861
+ napi_get_null(env, &prism_node);
862
+ }
863
+
864
+ pm_buffer_free(&pm_buffer);
865
+ } else {
866
+ napi_get_null(env, &prism_node);
867
+ }
868
+ napi_set_named_property(env, result, "prism_node", prism_node);
869
+
592
870
  napi_value statements = NodesArrayFromCArray(env, erb_if_node->statements);
593
871
  napi_set_named_property(env, result, "statements", statements);
594
872
 
@@ -629,6 +907,24 @@ napi_value erb_block_nodeNodeFromCStruct(napi_env env, AST_ERB_BLOCK_NODE_T* erb
629
907
  napi_value tag_closing = CreateToken(env, erb_block_node->tag_closing);
630
908
  napi_set_named_property(env, result, "tag_closing", tag_closing);
631
909
 
910
+ napi_value prism_node;
911
+ if (erb_block_node->prism_node.node != NULL && erb_block_node->prism_node.parser != NULL) {
912
+ pm_buffer_t pm_buffer = { 0 };
913
+ pm_serialize(erb_block_node->prism_node.parser, erb_block_node->prism_node.node, &pm_buffer);
914
+
915
+ if (pm_buffer.length > 0) {
916
+ void* buffer_data;
917
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
918
+ } else {
919
+ napi_get_null(env, &prism_node);
920
+ }
921
+
922
+ pm_buffer_free(&pm_buffer);
923
+ } else {
924
+ napi_get_null(env, &prism_node);
925
+ }
926
+ napi_set_named_property(env, result, "prism_node", prism_node);
927
+
632
928
  napi_value body = NodesArrayFromCArray(env, erb_block_node->body);
633
929
  napi_set_named_property(env, result, "body", body);
634
930
 
@@ -711,6 +1007,24 @@ napi_value erb_case_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_NODE_T* erb_c
711
1007
  napi_value children = NodesArrayFromCArray(env, erb_case_node->children);
712
1008
  napi_set_named_property(env, result, "children", children);
713
1009
 
1010
+ napi_value prism_node;
1011
+ if (erb_case_node->prism_node.node != NULL && erb_case_node->prism_node.parser != NULL) {
1012
+ pm_buffer_t pm_buffer = { 0 };
1013
+ pm_serialize(erb_case_node->prism_node.parser, erb_case_node->prism_node.node, &pm_buffer);
1014
+
1015
+ if (pm_buffer.length > 0) {
1016
+ void* buffer_data;
1017
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1018
+ } else {
1019
+ napi_get_null(env, &prism_node);
1020
+ }
1021
+
1022
+ pm_buffer_free(&pm_buffer);
1023
+ } else {
1024
+ napi_get_null(env, &prism_node);
1025
+ }
1026
+ napi_set_named_property(env, result, "prism_node", prism_node);
1027
+
714
1028
  napi_value conditions = NodesArrayFromCArray(env, erb_case_node->conditions);
715
1029
  napi_set_named_property(env, result, "conditions", conditions);
716
1030
 
@@ -754,6 +1068,24 @@ napi_value erb_case_match_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_MATCH_N
754
1068
  napi_value children = NodesArrayFromCArray(env, erb_case_match_node->children);
755
1069
  napi_set_named_property(env, result, "children", children);
756
1070
 
1071
+ napi_value prism_node;
1072
+ if (erb_case_match_node->prism_node.node != NULL && erb_case_match_node->prism_node.parser != NULL) {
1073
+ pm_buffer_t pm_buffer = { 0 };
1074
+ pm_serialize(erb_case_match_node->prism_node.parser, erb_case_match_node->prism_node.node, &pm_buffer);
1075
+
1076
+ if (pm_buffer.length > 0) {
1077
+ void* buffer_data;
1078
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1079
+ } else {
1080
+ napi_get_null(env, &prism_node);
1081
+ }
1082
+
1083
+ pm_buffer_free(&pm_buffer);
1084
+ } else {
1085
+ napi_get_null(env, &prism_node);
1086
+ }
1087
+ napi_set_named_property(env, result, "prism_node", prism_node);
1088
+
757
1089
  napi_value conditions = NodesArrayFromCArray(env, erb_case_match_node->conditions);
758
1090
  napi_set_named_property(env, result, "conditions", conditions);
759
1091
 
@@ -794,6 +1126,24 @@ napi_value erb_while_nodeNodeFromCStruct(napi_env env, AST_ERB_WHILE_NODE_T* erb
794
1126
  napi_value tag_closing = CreateToken(env, erb_while_node->tag_closing);
795
1127
  napi_set_named_property(env, result, "tag_closing", tag_closing);
796
1128
 
1129
+ napi_value prism_node;
1130
+ if (erb_while_node->prism_node.node != NULL && erb_while_node->prism_node.parser != NULL) {
1131
+ pm_buffer_t pm_buffer = { 0 };
1132
+ pm_serialize(erb_while_node->prism_node.parser, erb_while_node->prism_node.node, &pm_buffer);
1133
+
1134
+ if (pm_buffer.length > 0) {
1135
+ void* buffer_data;
1136
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1137
+ } else {
1138
+ napi_get_null(env, &prism_node);
1139
+ }
1140
+
1141
+ pm_buffer_free(&pm_buffer);
1142
+ } else {
1143
+ napi_get_null(env, &prism_node);
1144
+ }
1145
+ napi_set_named_property(env, result, "prism_node", prism_node);
1146
+
797
1147
  napi_value statements = NodesArrayFromCArray(env, erb_while_node->statements);
798
1148
  napi_set_named_property(env, result, "statements", statements);
799
1149
 
@@ -831,6 +1181,24 @@ napi_value erb_until_nodeNodeFromCStruct(napi_env env, AST_ERB_UNTIL_NODE_T* erb
831
1181
  napi_value tag_closing = CreateToken(env, erb_until_node->tag_closing);
832
1182
  napi_set_named_property(env, result, "tag_closing", tag_closing);
833
1183
 
1184
+ napi_value prism_node;
1185
+ if (erb_until_node->prism_node.node != NULL && erb_until_node->prism_node.parser != NULL) {
1186
+ pm_buffer_t pm_buffer = { 0 };
1187
+ pm_serialize(erb_until_node->prism_node.parser, erb_until_node->prism_node.node, &pm_buffer);
1188
+
1189
+ if (pm_buffer.length > 0) {
1190
+ void* buffer_data;
1191
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1192
+ } else {
1193
+ napi_get_null(env, &prism_node);
1194
+ }
1195
+
1196
+ pm_buffer_free(&pm_buffer);
1197
+ } else {
1198
+ napi_get_null(env, &prism_node);
1199
+ }
1200
+ napi_set_named_property(env, result, "prism_node", prism_node);
1201
+
834
1202
  napi_value statements = NodesArrayFromCArray(env, erb_until_node->statements);
835
1203
  napi_set_named_property(env, result, "statements", statements);
836
1204
 
@@ -868,6 +1236,24 @@ napi_value erb_for_nodeNodeFromCStruct(napi_env env, AST_ERB_FOR_NODE_T* erb_for
868
1236
  napi_value tag_closing = CreateToken(env, erb_for_node->tag_closing);
869
1237
  napi_set_named_property(env, result, "tag_closing", tag_closing);
870
1238
 
1239
+ napi_value prism_node;
1240
+ if (erb_for_node->prism_node.node != NULL && erb_for_node->prism_node.parser != NULL) {
1241
+ pm_buffer_t pm_buffer = { 0 };
1242
+ pm_serialize(erb_for_node->prism_node.parser, erb_for_node->prism_node.node, &pm_buffer);
1243
+
1244
+ if (pm_buffer.length > 0) {
1245
+ void* buffer_data;
1246
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1247
+ } else {
1248
+ napi_get_null(env, &prism_node);
1249
+ }
1250
+
1251
+ pm_buffer_free(&pm_buffer);
1252
+ } else {
1253
+ napi_get_null(env, &prism_node);
1254
+ }
1255
+ napi_set_named_property(env, result, "prism_node", prism_node);
1256
+
871
1257
  napi_value statements = NodesArrayFromCArray(env, erb_for_node->statements);
872
1258
  napi_set_named_property(env, result, "statements", statements);
873
1259
 
@@ -976,6 +1362,24 @@ napi_value erb_begin_nodeNodeFromCStruct(napi_env env, AST_ERB_BEGIN_NODE_T* erb
976
1362
  napi_value tag_closing = CreateToken(env, erb_begin_node->tag_closing);
977
1363
  napi_set_named_property(env, result, "tag_closing", tag_closing);
978
1364
 
1365
+ napi_value prism_node;
1366
+ if (erb_begin_node->prism_node.node != NULL && erb_begin_node->prism_node.parser != NULL) {
1367
+ pm_buffer_t pm_buffer = { 0 };
1368
+ pm_serialize(erb_begin_node->prism_node.parser, erb_begin_node->prism_node.node, &pm_buffer);
1369
+
1370
+ if (pm_buffer.length > 0) {
1371
+ void* buffer_data;
1372
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1373
+ } else {
1374
+ napi_get_null(env, &prism_node);
1375
+ }
1376
+
1377
+ pm_buffer_free(&pm_buffer);
1378
+ } else {
1379
+ napi_get_null(env, &prism_node);
1380
+ }
1381
+ napi_set_named_property(env, result, "prism_node", prism_node);
1382
+
979
1383
  napi_value statements = NodesArrayFromCArray(env, erb_begin_node->statements);
980
1384
  napi_set_named_property(env, result, "statements", statements);
981
1385
 
@@ -1030,6 +1434,24 @@ napi_value erb_unless_nodeNodeFromCStruct(napi_env env, AST_ERB_UNLESS_NODE_T* e
1030
1434
  }
1031
1435
  napi_set_named_property(env, result, "then_keyword", then_keyword);
1032
1436
 
1437
+ napi_value prism_node;
1438
+ if (erb_unless_node->prism_node.node != NULL && erb_unless_node->prism_node.parser != NULL) {
1439
+ pm_buffer_t pm_buffer = { 0 };
1440
+ pm_serialize(erb_unless_node->prism_node.parser, erb_unless_node->prism_node.node, &pm_buffer);
1441
+
1442
+ if (pm_buffer.length > 0) {
1443
+ void* buffer_data;
1444
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1445
+ } else {
1446
+ napi_get_null(env, &prism_node);
1447
+ }
1448
+
1449
+ pm_buffer_free(&pm_buffer);
1450
+ } else {
1451
+ napi_get_null(env, &prism_node);
1452
+ }
1453
+ napi_set_named_property(env, result, "prism_node", prism_node);
1454
+
1033
1455
  napi_value statements = NodesArrayFromCArray(env, erb_unless_node->statements);
1034
1456
  napi_set_named_property(env, result, "statements", statements);
1035
1457
 
@@ -1040,6 +1462,142 @@ napi_value erb_unless_nodeNodeFromCStruct(napi_env env, AST_ERB_UNLESS_NODE_T* e
1040
1462
  napi_set_named_property(env, result, "end_node", end_node);
1041
1463
 
1042
1464
 
1465
+ return result;
1466
+ }
1467
+ napi_value ruby_render_local_nodeNodeFromCStruct(napi_env env, AST_RUBY_RENDER_LOCAL_NODE_T* ruby_render_local_node) {
1468
+ if (!ruby_render_local_node) {
1469
+ napi_value null_value;
1470
+ napi_get_null(env, &null_value);
1471
+ return null_value;
1472
+ }
1473
+
1474
+ napi_value result;
1475
+ napi_create_object(env, &result);
1476
+
1477
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&ruby_render_local_node->base));
1478
+ napi_set_named_property(env, result, "type", type);
1479
+
1480
+ napi_value location = CreateLocation(env, ruby_render_local_node->base.location);
1481
+ napi_set_named_property(env, result, "location", location);
1482
+
1483
+ napi_value errors = ErrorsArrayFromCArray(env, ruby_render_local_node->base.errors);
1484
+ napi_set_named_property(env, result, "errors", errors);
1485
+
1486
+ napi_value name = CreateToken(env, ruby_render_local_node->name);
1487
+ napi_set_named_property(env, result, "name", name);
1488
+
1489
+ napi_value value = NodeFromCStruct(env, (AST_NODE_T*) ruby_render_local_node->value);
1490
+ napi_set_named_property(env, result, "value", value);
1491
+
1492
+
1493
+ return result;
1494
+ }
1495
+ napi_value erb_render_nodeNodeFromCStruct(napi_env env, AST_ERB_RENDER_NODE_T* erb_render_node) {
1496
+ if (!erb_render_node) {
1497
+ napi_value null_value;
1498
+ napi_get_null(env, &null_value);
1499
+ return null_value;
1500
+ }
1501
+
1502
+ napi_value result;
1503
+ napi_create_object(env, &result);
1504
+
1505
+ napi_value type = CreateStringFromHbString(env, ast_node_type_to_string(&erb_render_node->base));
1506
+ napi_set_named_property(env, result, "type", type);
1507
+
1508
+ napi_value location = CreateLocation(env, erb_render_node->base.location);
1509
+ napi_set_named_property(env, result, "location", location);
1510
+
1511
+ napi_value errors = ErrorsArrayFromCArray(env, erb_render_node->base.errors);
1512
+ napi_set_named_property(env, result, "errors", errors);
1513
+
1514
+ napi_value tag_opening = CreateToken(env, erb_render_node->tag_opening);
1515
+ napi_set_named_property(env, result, "tag_opening", tag_opening);
1516
+
1517
+ napi_value content = CreateToken(env, erb_render_node->content);
1518
+ napi_set_named_property(env, result, "content", content);
1519
+
1520
+ napi_value tag_closing = CreateToken(env, erb_render_node->tag_closing);
1521
+ napi_set_named_property(env, result, "tag_closing", tag_closing);
1522
+
1523
+ /* analyzed_ruby is internal parser state, not exposed to JavaScript */
1524
+ napi_value analyzed_ruby;
1525
+ napi_get_null(env, &analyzed_ruby);
1526
+ napi_set_named_property(env, result, "analyzed_ruby", analyzed_ruby);
1527
+
1528
+ napi_value prism_node;
1529
+ if (erb_render_node->prism_node.node != NULL && erb_render_node->prism_node.parser != NULL) {
1530
+ pm_buffer_t pm_buffer = { 0 };
1531
+ pm_serialize(erb_render_node->prism_node.parser, erb_render_node->prism_node.node, &pm_buffer);
1532
+
1533
+ if (pm_buffer.length > 0) {
1534
+ void* buffer_data;
1535
+ napi_create_buffer_copy(env, pm_buffer.length, pm_buffer.value, &buffer_data, &prism_node);
1536
+ } else {
1537
+ napi_get_null(env, &prism_node);
1538
+ }
1539
+
1540
+ pm_buffer_free(&pm_buffer);
1541
+ } else {
1542
+ napi_get_null(env, &prism_node);
1543
+ }
1544
+ napi_set_named_property(env, result, "prism_node", prism_node);
1545
+
1546
+ napi_value partial = CreateToken(env, erb_render_node->partial);
1547
+ napi_set_named_property(env, result, "partial", partial);
1548
+
1549
+ napi_value template_path = CreateToken(env, erb_render_node->template_path);
1550
+ napi_set_named_property(env, result, "template_path", template_path);
1551
+
1552
+ napi_value layout = CreateToken(env, erb_render_node->layout);
1553
+ napi_set_named_property(env, result, "layout", layout);
1554
+
1555
+ napi_value file = CreateToken(env, erb_render_node->file);
1556
+ napi_set_named_property(env, result, "file", file);
1557
+
1558
+ napi_value inline_template = CreateToken(env, erb_render_node->inline_template);
1559
+ napi_set_named_property(env, result, "inline_template", inline_template);
1560
+
1561
+ napi_value body = CreateToken(env, erb_render_node->body);
1562
+ napi_set_named_property(env, result, "body", body);
1563
+
1564
+ napi_value plain = CreateToken(env, erb_render_node->plain);
1565
+ napi_set_named_property(env, result, "plain", plain);
1566
+
1567
+ napi_value html = CreateToken(env, erb_render_node->html);
1568
+ napi_set_named_property(env, result, "html", html);
1569
+
1570
+ napi_value renderable = CreateToken(env, erb_render_node->renderable);
1571
+ napi_set_named_property(env, result, "renderable", renderable);
1572
+
1573
+ napi_value collection = CreateToken(env, erb_render_node->collection);
1574
+ napi_set_named_property(env, result, "collection", collection);
1575
+
1576
+ napi_value object = CreateToken(env, erb_render_node->object);
1577
+ napi_set_named_property(env, result, "object", object);
1578
+
1579
+ napi_value as_name = CreateToken(env, erb_render_node->as_name);
1580
+ napi_set_named_property(env, result, "as_name", as_name);
1581
+
1582
+ napi_value spacer_template = CreateToken(env, erb_render_node->spacer_template);
1583
+ napi_set_named_property(env, result, "spacer_template", spacer_template);
1584
+
1585
+ napi_value formats = CreateToken(env, erb_render_node->formats);
1586
+ napi_set_named_property(env, result, "formats", formats);
1587
+
1588
+ napi_value variants = CreateToken(env, erb_render_node->variants);
1589
+ napi_set_named_property(env, result, "variants", variants);
1590
+
1591
+ napi_value handlers = CreateToken(env, erb_render_node->handlers);
1592
+ napi_set_named_property(env, result, "handlers", handlers);
1593
+
1594
+ napi_value content_type = CreateToken(env, erb_render_node->content_type);
1595
+ napi_set_named_property(env, result, "content_type", content_type);
1596
+
1597
+ napi_value locals = NodesArrayFromCArray(env, erb_render_node->locals);
1598
+ napi_set_named_property(env, result, "locals", locals);
1599
+
1600
+
1043
1601
  return result;
1044
1602
  }
1045
1603
  napi_value erb_yield_nodeNodeFromCStruct(napi_env env, AST_ERB_YIELD_NODE_T* erb_yield_node) {
@@ -1121,11 +1679,13 @@ napi_value NodesArrayFromCArray(napi_env env, hb_array_T* array) {
1121
1679
  napi_create_array(env, &result);
1122
1680
 
1123
1681
  if (array) {
1682
+ uint32_t index = 0;
1683
+
1124
1684
  for (size_t i = 0; i < hb_array_size(array); i++) {
1125
1685
  AST_NODE_T* child_node = (AST_NODE_T*) hb_array_get(array, i);
1126
1686
  if (child_node) {
1127
1687
  napi_value js_child = NodeFromCStruct(env, child_node);
1128
- napi_set_element(env, result, i, js_child);
1688
+ napi_set_element(env, result, index++, js_child);
1129
1689
  }
1130
1690
  }
1131
1691
  }
@@ -1150,12 +1710,24 @@ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node) {
1150
1710
  case AST_HTML_OPEN_TAG_NODE:
1151
1711
  return html_open_tag_nodeNodeFromCStruct(env, (AST_HTML_OPEN_TAG_NODE_T*) node);
1152
1712
  break;
1713
+ case AST_HTML_CONDITIONAL_OPEN_TAG_NODE:
1714
+ return html_conditional_open_tag_nodeNodeFromCStruct(env, (AST_HTML_CONDITIONAL_OPEN_TAG_NODE_T*) node);
1715
+ break;
1153
1716
  case AST_HTML_CLOSE_TAG_NODE:
1154
1717
  return html_close_tag_nodeNodeFromCStruct(env, (AST_HTML_CLOSE_TAG_NODE_T*) node);
1155
1718
  break;
1719
+ case AST_HTML_OMITTED_CLOSE_TAG_NODE:
1720
+ return html_omitted_close_tag_nodeNodeFromCStruct(env, (AST_HTML_OMITTED_CLOSE_TAG_NODE_T*) node);
1721
+ break;
1722
+ case AST_HTML_VIRTUAL_CLOSE_TAG_NODE:
1723
+ return html_virtual_close_tag_nodeNodeFromCStruct(env, (AST_HTML_VIRTUAL_CLOSE_TAG_NODE_T*) node);
1724
+ break;
1156
1725
  case AST_HTML_ELEMENT_NODE:
1157
1726
  return html_element_nodeNodeFromCStruct(env, (AST_HTML_ELEMENT_NODE_T*) node);
1158
1727
  break;
1728
+ case AST_HTML_CONDITIONAL_ELEMENT_NODE:
1729
+ return html_conditional_element_nodeNodeFromCStruct(env, (AST_HTML_CONDITIONAL_ELEMENT_NODE_T*) node);
1730
+ break;
1159
1731
  case AST_HTML_ATTRIBUTE_VALUE_NODE:
1160
1732
  return html_attribute_value_nodeNodeFromCStruct(env, (AST_HTML_ATTRIBUTE_VALUE_NODE_T*) node);
1161
1733
  break;
@@ -1165,6 +1737,15 @@ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node) {
1165
1737
  case AST_HTML_ATTRIBUTE_NODE:
1166
1738
  return html_attribute_nodeNodeFromCStruct(env, (AST_HTML_ATTRIBUTE_NODE_T*) node);
1167
1739
  break;
1740
+ case AST_RUBY_LITERAL_NODE:
1741
+ return ruby_literal_nodeNodeFromCStruct(env, (AST_RUBY_LITERAL_NODE_T*) node);
1742
+ break;
1743
+ case AST_RUBY_HTML_ATTRIBUTES_SPLAT_NODE:
1744
+ return ruby_html_attributes_splat_nodeNodeFromCStruct(env, (AST_RUBY_HTML_ATTRIBUTES_SPLAT_NODE_T*) node);
1745
+ break;
1746
+ case AST_ERB_OPEN_TAG_NODE:
1747
+ return erb_open_tag_nodeNodeFromCStruct(env, (AST_ERB_OPEN_TAG_NODE_T*) node);
1748
+ break;
1168
1749
  case AST_HTML_TEXT_NODE:
1169
1750
  return html_text_nodeNodeFromCStruct(env, (AST_HTML_TEXT_NODE_T*) node);
1170
1751
  break;
@@ -1228,6 +1809,12 @@ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node) {
1228
1809
  case AST_ERB_UNLESS_NODE:
1229
1810
  return erb_unless_nodeNodeFromCStruct(env, (AST_ERB_UNLESS_NODE_T*) node);
1230
1811
  break;
1812
+ case AST_RUBY_RENDER_LOCAL_NODE:
1813
+ return ruby_render_local_nodeNodeFromCStruct(env, (AST_RUBY_RENDER_LOCAL_NODE_T*) node);
1814
+ break;
1815
+ case AST_ERB_RENDER_NODE:
1816
+ return erb_render_nodeNodeFromCStruct(env, (AST_ERB_RENDER_NODE_T*) node);
1817
+ break;
1231
1818
  case AST_ERB_YIELD_NODE:
1232
1819
  return erb_yield_nodeNodeFromCStruct(env, (AST_ERB_YIELD_NODE_T*) node);
1233
1820
  break;