@herb-tools/node 0.1.0 → 0.2.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.
- package/CHANGELOG.md +8 -0
- package/dist/herb-node.esm.js +1 -1
- package/extension/extension_helpers.cpp +2 -3
- package/extension/herb.cpp +9 -0
- package/extension/libherb/analyze.c +138 -43
- package/extension/libherb/analyze.h +39 -0
- package/extension/libherb/analyze_helpers.c +44 -1
- package/extension/libherb/analyze_helpers.h +49 -0
- package/extension/libherb/analyzed_ruby.c +10 -1
- package/extension/libherb/analyzed_ruby.h +36 -0
- package/extension/libherb/array.h +33 -0
- package/extension/libherb/ast_node.h +35 -0
- package/extension/libherb/ast_nodes.c +103 -1
- package/extension/libherb/ast_nodes.h +335 -0
- package/extension/libherb/ast_pretty_print.c +60 -0
- package/extension/libherb/ast_pretty_print.h +17 -0
- package/extension/libherb/buffer.c +60 -27
- package/extension/libherb/buffer.h +39 -0
- package/extension/libherb/errors.h +125 -0
- package/extension/libherb/extract.c +57 -20
- package/extension/libherb/extract.h +20 -0
- package/extension/libherb/herb.h +32 -0
- package/extension/libherb/html_util.h +13 -0
- package/extension/libherb/include/analyze.h +3 -0
- package/extension/libherb/include/analyze_helpers.h +6 -0
- package/extension/libherb/include/analyzed_ruby.h +3 -0
- package/extension/libherb/include/ast_nodes.h +32 -0
- package/extension/libherb/include/buffer.h +5 -2
- package/extension/libherb/include/lexer_peek_helpers.h +2 -2
- package/extension/libherb/include/macros.h +2 -2
- package/extension/libherb/include/version.h +1 -1
- package/extension/libherb/io.h +9 -0
- package/extension/libherb/json.h +28 -0
- package/extension/libherb/lexer.c +1 -1
- package/extension/libherb/lexer.h +13 -0
- package/extension/libherb/lexer_peek_helpers.h +23 -0
- package/extension/libherb/lexer_struct.h +32 -0
- package/extension/libherb/location.h +25 -0
- package/extension/libherb/macros.h +10 -0
- package/extension/libherb/main.c +1 -1
- package/extension/libherb/memory.h +12 -0
- package/extension/libherb/parser.c +17 -7
- package/extension/libherb/parser.h +22 -0
- package/extension/libherb/parser_helpers.h +33 -0
- package/extension/libherb/position.h +22 -0
- package/extension/libherb/pretty_print.h +53 -0
- package/extension/libherb/prism_helpers.h +18 -0
- package/extension/libherb/range.h +23 -0
- package/extension/libherb/ruby_parser.h +6 -0
- package/extension/libherb/token.c +1 -1
- package/extension/libherb/token.h +25 -0
- package/extension/libherb/token_matchers.h +21 -0
- package/extension/libherb/token_struct.h +51 -0
- package/extension/libherb/util.c +3 -1
- package/extension/libherb/util.h +25 -0
- package/extension/libherb/version.h +6 -0
- package/extension/libherb/visitor.c +36 -0
- package/extension/libherb/visitor.h +11 -0
- package/extension/nodes.cpp +117 -0
- package/extension/nodes.h +3 -0
- package/package.json +11 -20
|
@@ -199,6 +199,31 @@ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NO
|
|
|
199
199
|
|
|
200
200
|
} break;
|
|
201
201
|
|
|
202
|
+
case AST_ERB_CASE_MATCH_NODE: {
|
|
203
|
+
const AST_ERB_CASE_MATCH_NODE_T* erb_case_match_node = ((const AST_ERB_CASE_MATCH_NODE_T *) node);
|
|
204
|
+
|
|
205
|
+
if (erb_case_match_node->children != NULL) {
|
|
206
|
+
for (size_t index = 0; index < array_size(erb_case_match_node->children); index++) {
|
|
207
|
+
herb_visit_node(array_get(erb_case_match_node->children, index), visitor, data);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
if (erb_case_match_node->conditions != NULL) {
|
|
212
|
+
for (size_t index = 0; index < array_size(erb_case_match_node->conditions); index++) {
|
|
213
|
+
herb_visit_node(array_get(erb_case_match_node->conditions, index), visitor, data);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
if (erb_case_match_node->else_clause != NULL) {
|
|
218
|
+
herb_visit_node((AST_NODE_T *) erb_case_match_node->else_clause, visitor, data);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
if (erb_case_match_node->end_node != NULL) {
|
|
222
|
+
herb_visit_node((AST_NODE_T *) erb_case_match_node->end_node, visitor, data);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
} break;
|
|
226
|
+
|
|
202
227
|
case AST_ERB_WHILE_NODE: {
|
|
203
228
|
const AST_ERB_WHILE_NODE_T* erb_while_node = ((const AST_ERB_WHILE_NODE_T *) node);
|
|
204
229
|
|
|
@@ -316,6 +341,17 @@ void herb_visit_child_nodes(const AST_NODE_T *node, bool (*visitor)(const AST_NO
|
|
|
316
341
|
|
|
317
342
|
} break;
|
|
318
343
|
|
|
344
|
+
case AST_ERB_IN_NODE: {
|
|
345
|
+
const AST_ERB_IN_NODE_T* erb_in_node = ((const AST_ERB_IN_NODE_T *) node);
|
|
346
|
+
|
|
347
|
+
if (erb_in_node->statements != NULL) {
|
|
348
|
+
for (size_t index = 0; index < array_size(erb_in_node->statements); index++) {
|
|
349
|
+
herb_visit_node(array_get(erb_in_node->statements, index), visitor, data);
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
} break;
|
|
354
|
+
|
|
319
355
|
default: break;
|
|
320
356
|
}
|
|
321
357
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#ifndef HERB_VISITOR_H
|
|
2
|
+
#define HERB_VISITOR_H
|
|
3
|
+
|
|
4
|
+
#include "array.h"
|
|
5
|
+
#include "ast_node.h"
|
|
6
|
+
#include "ast_nodes.h"
|
|
7
|
+
|
|
8
|
+
void herb_visit_node(const AST_NODE_T* node, bool (*visitor)(const AST_NODE_T*, void*), void* data);
|
|
9
|
+
void herb_visit_child_nodes(const AST_NODE_T* node, bool (*visitor)(const AST_NODE_T* node, void* data), void* data);
|
|
10
|
+
|
|
11
|
+
#endif
|
package/extension/nodes.cpp
CHANGED
|
@@ -675,6 +675,49 @@ napi_value erb_case_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_NODE_T* erb_c
|
|
|
675
675
|
napi_set_named_property(env, result, "end_node", end_node);
|
|
676
676
|
|
|
677
677
|
|
|
678
|
+
return result;
|
|
679
|
+
}
|
|
680
|
+
napi_value erb_case_match_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_MATCH_NODE_T* erb_case_match_node) {
|
|
681
|
+
if (!erb_case_match_node) {
|
|
682
|
+
napi_value null_value;
|
|
683
|
+
napi_get_null(env, &null_value);
|
|
684
|
+
return null_value;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
napi_value result;
|
|
688
|
+
napi_create_object(env, &result);
|
|
689
|
+
|
|
690
|
+
napi_value type = CreateString(env, ast_node_type_to_string(&erb_case_match_node->base));
|
|
691
|
+
napi_set_named_property(env, result, "type", type);
|
|
692
|
+
|
|
693
|
+
napi_value location = CreateLocation(env, erb_case_match_node->base.location);
|
|
694
|
+
napi_set_named_property(env, result, "location", location);
|
|
695
|
+
|
|
696
|
+
napi_value errors = ErrorsArrayFromCArray(env, erb_case_match_node->base.errors);
|
|
697
|
+
napi_set_named_property(env, result, "errors", errors);
|
|
698
|
+
|
|
699
|
+
napi_value tag_opening = CreateToken(env, erb_case_match_node->tag_opening);
|
|
700
|
+
napi_set_named_property(env, result, "tag_opening", tag_opening);
|
|
701
|
+
|
|
702
|
+
napi_value content = CreateToken(env, erb_case_match_node->content);
|
|
703
|
+
napi_set_named_property(env, result, "content", content);
|
|
704
|
+
|
|
705
|
+
napi_value tag_closing = CreateToken(env, erb_case_match_node->tag_closing);
|
|
706
|
+
napi_set_named_property(env, result, "tag_closing", tag_closing);
|
|
707
|
+
|
|
708
|
+
napi_value children = NodesArrayFromCArray(env, erb_case_match_node->children);
|
|
709
|
+
napi_set_named_property(env, result, "children", children);
|
|
710
|
+
|
|
711
|
+
napi_value conditions = NodesArrayFromCArray(env, erb_case_match_node->conditions);
|
|
712
|
+
napi_set_named_property(env, result, "conditions", conditions);
|
|
713
|
+
|
|
714
|
+
napi_value else_clause = NodeFromCStruct(env, (AST_NODE_T*) erb_case_match_node->else_clause);
|
|
715
|
+
napi_set_named_property(env, result, "else_clause", else_clause);
|
|
716
|
+
|
|
717
|
+
napi_value end_node = NodeFromCStruct(env, (AST_NODE_T*) erb_case_match_node->end_node);
|
|
718
|
+
napi_set_named_property(env, result, "end_node", end_node);
|
|
719
|
+
|
|
720
|
+
|
|
678
721
|
return result;
|
|
679
722
|
}
|
|
680
723
|
napi_value erb_while_nodeNodeFromCStruct(napi_env env, AST_ERB_WHILE_NODE_T* erb_while_node) {
|
|
@@ -943,6 +986,71 @@ napi_value erb_unless_nodeNodeFromCStruct(napi_env env, AST_ERB_UNLESS_NODE_T* e
|
|
|
943
986
|
napi_set_named_property(env, result, "end_node", end_node);
|
|
944
987
|
|
|
945
988
|
|
|
989
|
+
return result;
|
|
990
|
+
}
|
|
991
|
+
napi_value erb_yield_nodeNodeFromCStruct(napi_env env, AST_ERB_YIELD_NODE_T* erb_yield_node) {
|
|
992
|
+
if (!erb_yield_node) {
|
|
993
|
+
napi_value null_value;
|
|
994
|
+
napi_get_null(env, &null_value);
|
|
995
|
+
return null_value;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
napi_value result;
|
|
999
|
+
napi_create_object(env, &result);
|
|
1000
|
+
|
|
1001
|
+
napi_value type = CreateString(env, ast_node_type_to_string(&erb_yield_node->base));
|
|
1002
|
+
napi_set_named_property(env, result, "type", type);
|
|
1003
|
+
|
|
1004
|
+
napi_value location = CreateLocation(env, erb_yield_node->base.location);
|
|
1005
|
+
napi_set_named_property(env, result, "location", location);
|
|
1006
|
+
|
|
1007
|
+
napi_value errors = ErrorsArrayFromCArray(env, erb_yield_node->base.errors);
|
|
1008
|
+
napi_set_named_property(env, result, "errors", errors);
|
|
1009
|
+
|
|
1010
|
+
napi_value tag_opening = CreateToken(env, erb_yield_node->tag_opening);
|
|
1011
|
+
napi_set_named_property(env, result, "tag_opening", tag_opening);
|
|
1012
|
+
|
|
1013
|
+
napi_value content = CreateToken(env, erb_yield_node->content);
|
|
1014
|
+
napi_set_named_property(env, result, "content", content);
|
|
1015
|
+
|
|
1016
|
+
napi_value tag_closing = CreateToken(env, erb_yield_node->tag_closing);
|
|
1017
|
+
napi_set_named_property(env, result, "tag_closing", tag_closing);
|
|
1018
|
+
|
|
1019
|
+
|
|
1020
|
+
return result;
|
|
1021
|
+
}
|
|
1022
|
+
napi_value erb_in_nodeNodeFromCStruct(napi_env env, AST_ERB_IN_NODE_T* erb_in_node) {
|
|
1023
|
+
if (!erb_in_node) {
|
|
1024
|
+
napi_value null_value;
|
|
1025
|
+
napi_get_null(env, &null_value);
|
|
1026
|
+
return null_value;
|
|
1027
|
+
}
|
|
1028
|
+
|
|
1029
|
+
napi_value result;
|
|
1030
|
+
napi_create_object(env, &result);
|
|
1031
|
+
|
|
1032
|
+
napi_value type = CreateString(env, ast_node_type_to_string(&erb_in_node->base));
|
|
1033
|
+
napi_set_named_property(env, result, "type", type);
|
|
1034
|
+
|
|
1035
|
+
napi_value location = CreateLocation(env, erb_in_node->base.location);
|
|
1036
|
+
napi_set_named_property(env, result, "location", location);
|
|
1037
|
+
|
|
1038
|
+
napi_value errors = ErrorsArrayFromCArray(env, erb_in_node->base.errors);
|
|
1039
|
+
napi_set_named_property(env, result, "errors", errors);
|
|
1040
|
+
|
|
1041
|
+
napi_value tag_opening = CreateToken(env, erb_in_node->tag_opening);
|
|
1042
|
+
napi_set_named_property(env, result, "tag_opening", tag_opening);
|
|
1043
|
+
|
|
1044
|
+
napi_value content = CreateToken(env, erb_in_node->content);
|
|
1045
|
+
napi_set_named_property(env, result, "content", content);
|
|
1046
|
+
|
|
1047
|
+
napi_value tag_closing = CreateToken(env, erb_in_node->tag_closing);
|
|
1048
|
+
napi_set_named_property(env, result, "tag_closing", tag_closing);
|
|
1049
|
+
|
|
1050
|
+
napi_value statements = NodesArrayFromCArray(env, erb_in_node->statements);
|
|
1051
|
+
napi_set_named_property(env, result, "statements", statements);
|
|
1052
|
+
|
|
1053
|
+
|
|
946
1054
|
return result;
|
|
947
1055
|
}
|
|
948
1056
|
|
|
@@ -1031,6 +1139,9 @@ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node) {
|
|
|
1031
1139
|
case AST_ERB_CASE_NODE:
|
|
1032
1140
|
return erb_case_nodeNodeFromCStruct(env, (AST_ERB_CASE_NODE_T*) node);
|
|
1033
1141
|
break;
|
|
1142
|
+
case AST_ERB_CASE_MATCH_NODE:
|
|
1143
|
+
return erb_case_match_nodeNodeFromCStruct(env, (AST_ERB_CASE_MATCH_NODE_T*) node);
|
|
1144
|
+
break;
|
|
1034
1145
|
case AST_ERB_WHILE_NODE:
|
|
1035
1146
|
return erb_while_nodeNodeFromCStruct(env, (AST_ERB_WHILE_NODE_T*) node);
|
|
1036
1147
|
break;
|
|
@@ -1052,6 +1163,12 @@ napi_value NodeFromCStruct(napi_env env, AST_NODE_T* node) {
|
|
|
1052
1163
|
case AST_ERB_UNLESS_NODE:
|
|
1053
1164
|
return erb_unless_nodeNodeFromCStruct(env, (AST_ERB_UNLESS_NODE_T*) node);
|
|
1054
1165
|
break;
|
|
1166
|
+
case AST_ERB_YIELD_NODE:
|
|
1167
|
+
return erb_yield_nodeNodeFromCStruct(env, (AST_ERB_YIELD_NODE_T*) node);
|
|
1168
|
+
break;
|
|
1169
|
+
case AST_ERB_IN_NODE:
|
|
1170
|
+
return erb_in_nodeNodeFromCStruct(env, (AST_ERB_IN_NODE_T*) node);
|
|
1171
|
+
break;
|
|
1055
1172
|
default:
|
|
1056
1173
|
napi_value null_value;
|
|
1057
1174
|
napi_get_null(env, &null_value);
|
package/extension/nodes.h
CHANGED
|
@@ -33,6 +33,7 @@ napi_value erb_if_nodeNodeFromCStruct(napi_env env, AST_ERB_IF_NODE_T* erb_if_no
|
|
|
33
33
|
napi_value erb_block_nodeNodeFromCStruct(napi_env env, AST_ERB_BLOCK_NODE_T* erb_block_node);
|
|
34
34
|
napi_value erb_when_nodeNodeFromCStruct(napi_env env, AST_ERB_WHEN_NODE_T* erb_when_node);
|
|
35
35
|
napi_value erb_case_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_NODE_T* erb_case_node);
|
|
36
|
+
napi_value erb_case_match_nodeNodeFromCStruct(napi_env env, AST_ERB_CASE_MATCH_NODE_T* erb_case_match_node);
|
|
36
37
|
napi_value erb_while_nodeNodeFromCStruct(napi_env env, AST_ERB_WHILE_NODE_T* erb_while_node);
|
|
37
38
|
napi_value erb_until_nodeNodeFromCStruct(napi_env env, AST_ERB_UNTIL_NODE_T* erb_until_node);
|
|
38
39
|
napi_value erb_for_nodeNodeFromCStruct(napi_env env, AST_ERB_FOR_NODE_T* erb_for_node);
|
|
@@ -40,5 +41,7 @@ napi_value erb_rescue_nodeNodeFromCStruct(napi_env env, AST_ERB_RESCUE_NODE_T* e
|
|
|
40
41
|
napi_value erb_ensure_nodeNodeFromCStruct(napi_env env, AST_ERB_ENSURE_NODE_T* erb_ensure_node);
|
|
41
42
|
napi_value erb_begin_nodeNodeFromCStruct(napi_env env, AST_ERB_BEGIN_NODE_T* erb_begin_node);
|
|
42
43
|
napi_value erb_unless_nodeNodeFromCStruct(napi_env env, AST_ERB_UNLESS_NODE_T* erb_unless_node);
|
|
44
|
+
napi_value erb_yield_nodeNodeFromCStruct(napi_env env, AST_ERB_YIELD_NODE_T* erb_yield_node);
|
|
45
|
+
napi_value erb_in_nodeNodeFromCStruct(napi_env env, AST_ERB_IN_NODE_T* erb_in_node);
|
|
43
46
|
|
|
44
47
|
#endif
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@herb-tools/node",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://herb-tools.dev",
|
|
@@ -24,16 +24,17 @@
|
|
|
24
24
|
}
|
|
25
25
|
},
|
|
26
26
|
"scripts": {
|
|
27
|
-
"install": "yarn vendor
|
|
27
|
+
"install": "yarn vendor && node-pre-gyp install --fallback-to-build",
|
|
28
28
|
"dev": "rollup -c -w",
|
|
29
|
-
"build": "yarn rebuild",
|
|
29
|
+
"build": "yarn templates && yarn vendor && yarn rebuild",
|
|
30
30
|
"build:javascript": "rollup -c",
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
31
|
+
"templates": "rake templates",
|
|
32
|
+
"revendor": "yarn clean && yarn templates && yarn vendor",
|
|
33
|
+
"vendor": "node ./bin/vendor.cjs",
|
|
34
|
+
"rebuild": "node-pre-gyp rebuild && yarn build:javascript",
|
|
34
35
|
"configure": "node-pre-gyp configure",
|
|
35
36
|
"package": "node-pre-gyp package",
|
|
36
|
-
"clean": "node-pre-gyp clean && rimraf dist/ && rimraf extension/libherb/ && rimraf
|
|
37
|
+
"clean": "node-pre-gyp clean && rimraf dist/ && rimraf build/ && rimraf extension/libherb/ && rimraf extension/prism/",
|
|
37
38
|
"test": "vitest run",
|
|
38
39
|
"test:watch": "vitest --watch",
|
|
39
40
|
"prepublishOnly": "yarn clean && yarn build && yarn test"
|
|
@@ -46,20 +47,10 @@
|
|
|
46
47
|
"host": "https://github.com/marcoroth/herb/releases/download/"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
49
|
-
"@herb-tools/core": "0.
|
|
50
|
-
"@mapbox/node-pre-gyp": "^2.0.0"
|
|
51
|
-
},
|
|
52
|
-
"devDependencies": {
|
|
53
|
-
"@rollup/plugin-json": "^6.1.0",
|
|
54
|
-
"@rollup/plugin-node-resolve": "^16.0.1",
|
|
55
|
-
"@rollup/plugin-typescript": "^12.1.2",
|
|
50
|
+
"@herb-tools/core": "0.2.0",
|
|
51
|
+
"@mapbox/node-pre-gyp": "^2.0.0",
|
|
56
52
|
"node-addon-api": "^5.1.0",
|
|
57
|
-
"node-pre-gyp-github": "^2.0.0"
|
|
58
|
-
"rimraf": "^6.0.1",
|
|
59
|
-
"rollup": "^4.35.0",
|
|
60
|
-
"tslib": "^2.8.1",
|
|
61
|
-
"typescript": "^5.8.2",
|
|
62
|
-
"vitest": "^3.0.0"
|
|
53
|
+
"node-pre-gyp-github": "^2.0.0"
|
|
63
54
|
},
|
|
64
55
|
"files": [
|
|
65
56
|
"package.json",
|