herb 0.7.1-arm-linux-musl → 0.7.3-arm-linux-musl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Makefile +2 -0
- data/README.md +1 -1
- data/Rakefile +46 -1
- data/config.yml +714 -0
- data/ext/herb/error_helpers.c +27 -27
- data/ext/herb/extconf.rb +2 -1
- data/ext/herb/extension.c +6 -6
- data/ext/herb/extension_helpers.c +3 -3
- data/ext/herb/nodes.c +35 -35
- data/herb.gemspec +3 -0
- data/lib/herb/3.0/herb.so +0 -0
- data/lib/herb/3.1/herb.so +0 -0
- data/lib/herb/3.2/herb.so +0 -0
- data/lib/herb/3.3/herb.so +0 -0
- data/lib/herb/3.4/herb.so +0 -0
- data/lib/herb/engine/debug_visitor.rb +41 -21
- data/lib/herb/engine.rb +20 -6
- data/lib/herb/version.rb +1 -1
- data/sig/herb/engine/debug_visitor.rbs +3 -3
- data/sig/herb/engine.rbs +5 -0
- data/src/analyze.c +5 -9
- data/src/analyze_helpers.c +17 -6
- data/src/include/pretty_print.h +1 -1
- data/src/include/version.h +1 -1
- data/src/parser.c +6 -9
- data/src/pretty_print.c +1 -1
- data/templates/ext/herb/error_helpers.c.erb +85 -0
- data/templates/ext/herb/error_helpers.h.erb +12 -0
- data/templates/ext/herb/nodes.c.erb +90 -0
- data/templates/ext/herb/nodes.h.erb +9 -0
- data/templates/javascript/packages/core/src/errors.ts.erb +193 -0
- data/templates/javascript/packages/core/src/node-type-guards.ts.erb +325 -0
- data/templates/javascript/packages/core/src/nodes.ts.erb +414 -0
- data/templates/javascript/packages/core/src/visitor.ts.erb +29 -0
- data/templates/javascript/packages/node/extension/error_helpers.cpp.erb +113 -0
- data/templates/javascript/packages/node/extension/error_helpers.h.erb +17 -0
- data/templates/javascript/packages/node/extension/nodes.cpp.erb +111 -0
- data/templates/javascript/packages/node/extension/nodes.h.erb +17 -0
- data/templates/lib/herb/ast/nodes.rb.erb +117 -0
- data/templates/lib/herb/errors.rb.erb +106 -0
- data/templates/lib/herb/visitor.rb.erb +28 -0
- data/templates/sig/serialized_ast_errors.rbs.erb +10 -0
- data/templates/sig/serialized_ast_nodes.rbs.erb +10 -0
- data/templates/src/ast_nodes.c.erb +145 -0
- data/templates/src/ast_pretty_print.c.erb +97 -0
- data/templates/src/errors.c.erb +245 -0
- data/templates/src/include/ast_nodes.h.erb +46 -0
- data/templates/src/include/ast_pretty_print.h.erb +14 -0
- data/templates/src/include/errors.h.erb +58 -0
- data/templates/src/visitor.c.erb +47 -0
- data/templates/template.rb +406 -0
- data/templates/wasm/error_helpers.cpp.erb +93 -0
- data/templates/wasm/error_helpers.h.erb +15 -0
- data/templates/wasm/nodes.cpp.erb +79 -0
- data/templates/wasm/nodes.h.erb +15 -0
- data/vendor/prism/Rakefile +75 -0
- data/vendor/prism/config.yml +4713 -0
- data/vendor/prism/include/prism/ast.h +8190 -0
- data/vendor/prism/include/prism/defines.h +260 -0
- data/vendor/prism/include/prism/diagnostic.h +455 -0
- data/vendor/prism/include/prism/encoding.h +283 -0
- data/vendor/prism/include/prism/node.h +129 -0
- data/vendor/prism/include/prism/options.h +482 -0
- data/vendor/prism/include/prism/pack.h +163 -0
- data/vendor/prism/include/prism/parser.h +933 -0
- data/vendor/prism/include/prism/prettyprint.h +34 -0
- data/vendor/prism/include/prism/regexp.h +43 -0
- data/vendor/prism/include/prism/static_literals.h +121 -0
- data/vendor/prism/include/prism/util/pm_buffer.h +236 -0
- data/vendor/prism/include/prism/util/pm_char.h +204 -0
- data/vendor/prism/include/prism/util/pm_constant_pool.h +218 -0
- data/vendor/prism/include/prism/util/pm_integer.h +130 -0
- data/vendor/prism/include/prism/util/pm_list.h +103 -0
- data/vendor/prism/include/prism/util/pm_memchr.h +29 -0
- data/vendor/prism/include/prism/util/pm_newline_list.h +113 -0
- data/vendor/prism/include/prism/util/pm_string.h +200 -0
- data/vendor/prism/include/prism/util/pm_strncasecmp.h +32 -0
- data/vendor/prism/include/prism/util/pm_strpbrk.h +46 -0
- data/vendor/prism/include/prism/version.h +29 -0
- data/vendor/prism/include/prism.h +408 -0
- data/vendor/prism/src/diagnostic.c +848 -0
- data/vendor/prism/src/encoding.c +5235 -0
- data/vendor/prism/src/node.c +8676 -0
- data/vendor/prism/src/options.c +328 -0
- data/vendor/prism/src/pack.c +509 -0
- data/vendor/prism/src/prettyprint.c +8941 -0
- data/vendor/prism/src/prism.c +23302 -0
- data/vendor/prism/src/regexp.c +790 -0
- data/vendor/prism/src/serialize.c +2268 -0
- data/vendor/prism/src/static_literals.c +617 -0
- data/vendor/prism/src/token_type.c +703 -0
- data/vendor/prism/src/util/pm_buffer.c +357 -0
- data/vendor/prism/src/util/pm_char.c +318 -0
- data/vendor/prism/src/util/pm_constant_pool.c +342 -0
- data/vendor/prism/src/util/pm_integer.c +670 -0
- data/vendor/prism/src/util/pm_list.c +49 -0
- data/vendor/prism/src/util/pm_memchr.c +35 -0
- data/vendor/prism/src/util/pm_newline_list.c +125 -0
- data/vendor/prism/src/util/pm_string.c +383 -0
- data/vendor/prism/src/util/pm_strncasecmp.c +36 -0
- data/vendor/prism/src/util/pm_strpbrk.c +206 -0
- data/vendor/prism/templates/ext/prism/api_node.c.erb +282 -0
- data/vendor/prism/templates/include/prism/ast.h.erb +226 -0
- data/vendor/prism/templates/include/prism/diagnostic.h.erb +130 -0
- data/vendor/prism/templates/java/org/prism/AbstractNodeVisitor.java.erb +22 -0
- data/vendor/prism/templates/java/org/prism/Loader.java.erb +434 -0
- data/vendor/prism/templates/java/org/prism/Nodes.java.erb +403 -0
- data/vendor/prism/templates/javascript/src/deserialize.js.erb +448 -0
- data/vendor/prism/templates/javascript/src/nodes.js.erb +197 -0
- data/vendor/prism/templates/javascript/src/visitor.js.erb +78 -0
- data/vendor/prism/templates/lib/prism/compiler.rb.erb +43 -0
- data/vendor/prism/templates/lib/prism/dispatcher.rb.erb +103 -0
- data/vendor/prism/templates/lib/prism/dot_visitor.rb.erb +189 -0
- data/vendor/prism/templates/lib/prism/dsl.rb.erb +133 -0
- data/vendor/prism/templates/lib/prism/inspect_visitor.rb.erb +131 -0
- data/vendor/prism/templates/lib/prism/mutation_compiler.rb.erb +19 -0
- data/vendor/prism/templates/lib/prism/node.rb.erb +515 -0
- data/vendor/prism/templates/lib/prism/reflection.rb.erb +136 -0
- data/vendor/prism/templates/lib/prism/serialize.rb.erb +602 -0
- data/vendor/prism/templates/lib/prism/visitor.rb.erb +55 -0
- data/vendor/prism/templates/rbi/prism/dsl.rbi.erb +68 -0
- data/vendor/prism/templates/rbi/prism/node.rbi.erb +164 -0
- data/vendor/prism/templates/rbi/prism/visitor.rbi.erb +18 -0
- data/vendor/prism/templates/sig/prism/_private/dot_visitor.rbs.erb +45 -0
- data/vendor/prism/templates/sig/prism/dsl.rbs.erb +31 -0
- data/vendor/prism/templates/sig/prism/mutation_compiler.rbs.erb +7 -0
- data/vendor/prism/templates/sig/prism/node.rbs.erb +132 -0
- data/vendor/prism/templates/sig/prism/visitor.rbs.erb +17 -0
- data/vendor/prism/templates/sig/prism.rbs.erb +89 -0
- data/vendor/prism/templates/src/diagnostic.c.erb +523 -0
- data/vendor/prism/templates/src/node.c.erb +333 -0
- data/vendor/prism/templates/src/prettyprint.c.erb +166 -0
- data/vendor/prism/templates/src/serialize.c.erb +406 -0
- data/vendor/prism/templates/src/token_type.c.erb +369 -0
- data/vendor/prism/templates/template.rb +689 -0
- metadata +112 -2
@@ -0,0 +1,325 @@
|
|
1
|
+
import type { Node, NodeType, ERBNode } from "./nodes.js"
|
2
|
+
|
3
|
+
import { Token } from "./token.js"
|
4
|
+
import { ParseResult } from "./parse-result.js"
|
5
|
+
|
6
|
+
import {
|
7
|
+
<%- nodes.each_with_index do |node, index| -%>
|
8
|
+
<%= node.name %>,
|
9
|
+
<%- end -%>
|
10
|
+
} from "./nodes.js"
|
11
|
+
|
12
|
+
/**
|
13
|
+
* Type guard functions for AST nodes.
|
14
|
+
* These functions provide type checking by combining both instanceof
|
15
|
+
* checks and type string comparisons for maximum reliability across different
|
16
|
+
* runtime scenarios (e.g., serialized/deserialized nodes).
|
17
|
+
*/
|
18
|
+
|
19
|
+
<%- nodes.each do |node| -%>
|
20
|
+
/**
|
21
|
+
* Checks if a node is a <%= node.name %>
|
22
|
+
*/
|
23
|
+
export function is<%= node.name %>(node: Node): node is <%= node.name %> {
|
24
|
+
return node instanceof <%= node.name %> || node.type === "<%= node.type %>" || (node.constructor as any).type === "<%= node.type %>"
|
25
|
+
}
|
26
|
+
|
27
|
+
<%- end -%>
|
28
|
+
/**
|
29
|
+
* Convenience type guards for common node categories
|
30
|
+
*/
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Checks if a node is any HTML node type
|
34
|
+
*/
|
35
|
+
export function isHTMLNode(node: Node): boolean {
|
36
|
+
<%- html_nodes = nodes.select { |n| n.name.start_with?("HTML") } -%>
|
37
|
+
return <%= html_nodes.map { |n| "is#{n.name}(node)" }.join(" ||\n ") %>
|
38
|
+
}
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Checks if a node is any ERB node type
|
42
|
+
*/
|
43
|
+
export function isERBNode(node: Node): node is ERBNode {
|
44
|
+
<%- erb_nodes = nodes.select { |n| n.name.start_with?("ERB") } -%>
|
45
|
+
return <%= erb_nodes.map { |n| "is#{n.name}(node)" }.join(" ||\n ") %>
|
46
|
+
}
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Map of node classes to their corresponding type guard functions
|
50
|
+
*
|
51
|
+
* @example
|
52
|
+
* const guard = NODE_TYPE_GUARDS[HTMLTextNode]
|
53
|
+
*
|
54
|
+
* if (guard(node)) {
|
55
|
+
* // node is HTMLTextNode
|
56
|
+
* }
|
57
|
+
*/
|
58
|
+
export const NODE_TYPE_GUARDS = new Map<new (...args: any[]) => Node, (node: Node) => boolean>([
|
59
|
+
<%- nodes.each_with_index do |node, index| -%>
|
60
|
+
[<%= node.name %>, is<%= node.name %>],
|
61
|
+
<%- end -%>
|
62
|
+
])
|
63
|
+
|
64
|
+
/**
|
65
|
+
* Map of AST node type strings to their corresponding type guard functions
|
66
|
+
*
|
67
|
+
* @example
|
68
|
+
* const guard = AST_TYPE_GUARDS["AST_HTML_TEXT_NODE"]
|
69
|
+
*
|
70
|
+
* if (guard(node)) {
|
71
|
+
* // node is HTMLTextNode
|
72
|
+
* }
|
73
|
+
*/
|
74
|
+
export const AST_TYPE_GUARDS = new Map<NodeType, (node: Node) => boolean>([
|
75
|
+
<%- nodes.each_with_index do |node, index| -%>
|
76
|
+
["<%= node.type %>", is<%= node.name %>],
|
77
|
+
<%- end -%>
|
78
|
+
])
|
79
|
+
|
80
|
+
type NodeTypeToClass = {
|
81
|
+
<%- nodes.each do |node| -%>
|
82
|
+
"<%= node.type %>": <%= node.name %>;
|
83
|
+
<%- end -%>
|
84
|
+
}
|
85
|
+
|
86
|
+
type ClassToInstance<T> = T extends new (...args: any[]) => infer R ? R : never
|
87
|
+
|
88
|
+
/**
|
89
|
+
* Checks if a node matches any of the provided type identifiers with proper type narrowing
|
90
|
+
* Supports AST type strings, node classes, or type guard functions
|
91
|
+
*
|
92
|
+
* @example
|
93
|
+
* if (isAnyOf(node, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
|
94
|
+
* // node is narrowed to HTMLTextNode | LiteralNode
|
95
|
+
* }
|
96
|
+
*
|
97
|
+
* @example
|
98
|
+
* if (isAnyOf(node, HTMLTextNode, LiteralNode)) {
|
99
|
+
* // node is narrowed to HTMLTextNode | LiteralNode
|
100
|
+
* }
|
101
|
+
*/
|
102
|
+
|
103
|
+
export function isAnyOf(node: Node, ...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>): boolean {
|
104
|
+
return types.some(type => {
|
105
|
+
if (typeof type === 'string') {
|
106
|
+
return isNode(node, type)
|
107
|
+
} else if (typeof type === 'function' && type.prototype && type.prototype.constructor === type && NODE_TYPE_GUARDS.has(type as new (...args: any[]) => Node)) {
|
108
|
+
return isNode(node, type as new (...args: any[]) => Node)
|
109
|
+
} else if (typeof type === 'function') {
|
110
|
+
return (type as (node: Node) => boolean)(node)
|
111
|
+
} else {
|
112
|
+
return false
|
113
|
+
}
|
114
|
+
})
|
115
|
+
}
|
116
|
+
|
117
|
+
/**
|
118
|
+
* Checks if a node does NOT match any of the provided type identifiers
|
119
|
+
* Supports AST type strings, node classes, or type guard functions
|
120
|
+
* This is the logical inverse of isAnyOf
|
121
|
+
*
|
122
|
+
* @example
|
123
|
+
* if (isNoneOf(node, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
|
124
|
+
* // node is neither HTMLTextNode nor LiteralNode
|
125
|
+
* }
|
126
|
+
*
|
127
|
+
* @example
|
128
|
+
* if (isNoneOf(node, HTMLTextNode, LiteralNode)) {
|
129
|
+
* // node is neither HTMLTextNode nor LiteralNode
|
130
|
+
* }
|
131
|
+
*
|
132
|
+
* @example
|
133
|
+
* if (isNoneOf(node, isHTMLTextNode, isLiteralNode)) {
|
134
|
+
* // node is neither HTMLTextNode nor LiteralNode
|
135
|
+
* }
|
136
|
+
*/
|
137
|
+
export function isNoneOf(
|
138
|
+
node: Node,
|
139
|
+
...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
|
140
|
+
): boolean {
|
141
|
+
return !isAnyOf(node, ...types)
|
142
|
+
}
|
143
|
+
|
144
|
+
/**
|
145
|
+
* Checks if ALL nodes in an array match any of the provided type identifiers
|
146
|
+
* Supports AST type strings, node classes, or type guard functions
|
147
|
+
* Provides type narrowing for the array when true
|
148
|
+
*
|
149
|
+
* @example
|
150
|
+
* if (areAllOfType(nodes, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")) {
|
151
|
+
* // nodes is narrowed to (HTMLTextNode | LiteralNode)[]
|
152
|
+
* }
|
153
|
+
*
|
154
|
+
* @example
|
155
|
+
* if (areAllOfType(nodes, HTMLTextNode, LiteralNode)) {
|
156
|
+
* // nodes is narrowed to (HTMLTextNode | LiteralNode)[]
|
157
|
+
* }
|
158
|
+
*
|
159
|
+
* @example
|
160
|
+
* if (areAllOfType(nodes, isHTMLTextNode, isLiteralNode)) {
|
161
|
+
* // all nodes are either HTMLTextNode or LiteralNode
|
162
|
+
* }
|
163
|
+
*/
|
164
|
+
|
165
|
+
export function areAllOfType<T extends NodeType[]>(
|
166
|
+
nodes: Node[],
|
167
|
+
...types: T
|
168
|
+
): nodes is NodeTypeToClass[T[number]][]
|
169
|
+
|
170
|
+
export function areAllOfType<T extends (new (...args: any[]) => Node)[]>(
|
171
|
+
nodes: Node[],
|
172
|
+
...types: T
|
173
|
+
): nodes is ClassToInstance<T[number]>[]
|
174
|
+
|
175
|
+
export function areAllOfType(
|
176
|
+
nodes: Node[],
|
177
|
+
...types: Array<(node: Node) => boolean>
|
178
|
+
): boolean
|
179
|
+
|
180
|
+
export function areAllOfType(
|
181
|
+
nodes: Node[],
|
182
|
+
...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
|
183
|
+
): boolean {
|
184
|
+
return nodes.every(node => isAnyOf(node, ...types))
|
185
|
+
}
|
186
|
+
|
187
|
+
/**
|
188
|
+
* Filters an array of nodes to only include nodes matching any of the provided type identifiers
|
189
|
+
* Supports AST type strings, node classes, or type guard functions
|
190
|
+
* Returns a properly typed array of the filtered nodes
|
191
|
+
*
|
192
|
+
* @example
|
193
|
+
* const filtered = filterNodes(nodes, "AST_HTML_TEXT_NODE", "AST_LITERAL_NODE")
|
194
|
+
* // filtered is typed as (HTMLTextNode | LiteralNode)[]
|
195
|
+
*
|
196
|
+
* @example
|
197
|
+
* const filtered = filterNodes(nodes, HTMLTextNode, LiteralNode)
|
198
|
+
* // filtered is typed as (HTMLTextNode | LiteralNode)[]
|
199
|
+
*
|
200
|
+
* @example
|
201
|
+
* const filtered = filterNodes(nodes, isHTMLTextNode, isLiteralNode)
|
202
|
+
* // filtered contains only HTMLTextNode or LiteralNode instances
|
203
|
+
*
|
204
|
+
* @example
|
205
|
+
* const filtered = filterNodes(nodes, "AST_LITERAL_NODE", HTMLTextNode, isERBContentNode)
|
206
|
+
* // filtered contains only LiteralNode, HTMLTextNode, or ERBContentNode instances
|
207
|
+
*/
|
208
|
+
|
209
|
+
export function filterNodes<T extends NodeType[]>(
|
210
|
+
nodes: Node[] | undefined | null,
|
211
|
+
...types: T
|
212
|
+
): NodeTypeToClass[T[number]][]
|
213
|
+
|
214
|
+
export function filterNodes<T extends (new (...args: any[]) => Node)[]>(
|
215
|
+
nodes: Node[] | undefined | null,
|
216
|
+
...types: T
|
217
|
+
): ClassToInstance<T[number]>[]
|
218
|
+
|
219
|
+
export function filterNodes(
|
220
|
+
nodes: Node[] | undefined | null,
|
221
|
+
...types: Array<(node: Node) => boolean>
|
222
|
+
): Node[]
|
223
|
+
|
224
|
+
export function filterNodes(
|
225
|
+
nodes: Node[] | undefined | null,
|
226
|
+
...types: Array<NodeType | (new (...args: any[]) => Node) | ((node: Node) => boolean)>
|
227
|
+
): Node[] {
|
228
|
+
if (!nodes) return []
|
229
|
+
|
230
|
+
return nodes.filter(node => isAnyOf(node, ...types))
|
231
|
+
}
|
232
|
+
|
233
|
+
/**
|
234
|
+
* Checks if a node matches a specific type identifier with proper type narrowing
|
235
|
+
* Supports AST type strings or node classes
|
236
|
+
*
|
237
|
+
* @example
|
238
|
+
* if (isNode(node, "AST_HTML_TEXT_NODE")) {
|
239
|
+
* // node is narrowed to HTMLTextNode
|
240
|
+
* }
|
241
|
+
*
|
242
|
+
* @example
|
243
|
+
* if (isNode(node, HTMLTextNode)) {
|
244
|
+
* // node is narrowed to HTMLTextNode
|
245
|
+
* }
|
246
|
+
*/
|
247
|
+
|
248
|
+
export function isNode<T extends NodeType>(
|
249
|
+
node: Node | null | undefined,
|
250
|
+
type: T
|
251
|
+
): node is NodeTypeToClass[T]
|
252
|
+
|
253
|
+
export function isNode<T extends new (...args: any[]) => Node>(
|
254
|
+
node: Node | null | undefined,
|
255
|
+
type: T
|
256
|
+
): node is ClassToInstance<T>
|
257
|
+
|
258
|
+
export function isNode(
|
259
|
+
node: Node | null | undefined,
|
260
|
+
type: NodeType | (new (...args: any[]) => Node)
|
261
|
+
): boolean {
|
262
|
+
if (!node) return false
|
263
|
+
|
264
|
+
if (typeof type === 'string') {
|
265
|
+
const guard = AST_TYPE_GUARDS.get(type)
|
266
|
+
|
267
|
+
return guard ? guard(node) : false
|
268
|
+
} else if (typeof type === 'function') {
|
269
|
+
const guard = NODE_TYPE_GUARDS.get(type as new (...args: any[]) => Node)
|
270
|
+
|
271
|
+
return guard ? guard(node) : false
|
272
|
+
} else {
|
273
|
+
return false
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
export function isToken(object: any): object is Token {
|
278
|
+
return (object instanceof Token) || (object?.constructor?.name === "Token" && "value" in object) || (object as any).type?.startsWith('TOKEN_')
|
279
|
+
}
|
280
|
+
|
281
|
+
export function isParseResult(object: any): object is ParseResult {
|
282
|
+
return (object instanceof ParseResult) || (object?.constructor?.name === "ParseResult" && "value" in object)
|
283
|
+
}
|
284
|
+
|
285
|
+
/**
|
286
|
+
* Checks if a node has children (contains other nodes)
|
287
|
+
*/
|
288
|
+
export function hasChildren(node: Node): boolean {
|
289
|
+
return isDocumentNode(node) ||
|
290
|
+
isHTMLOpenTagNode(node) ||
|
291
|
+
isHTMLCloseTagNode(node) ||
|
292
|
+
isHTMLElementNode(node) ||
|
293
|
+
isHTMLAttributeValueNode(node) ||
|
294
|
+
isHTMLAttributeNameNode(node) ||
|
295
|
+
isHTMLCommentNode(node) ||
|
296
|
+
isHTMLDoctypeNode(node) ||
|
297
|
+
isERBElseNode(node) ||
|
298
|
+
isERBIfNode(node) ||
|
299
|
+
isERBBlockNode(node) ||
|
300
|
+
isERBWhenNode(node) ||
|
301
|
+
isERBCaseNode(node) ||
|
302
|
+
isERBCaseMatchNode(node) ||
|
303
|
+
isERBWhileNode(node) ||
|
304
|
+
isERBUntilNode(node) ||
|
305
|
+
isERBForNode(node) ||
|
306
|
+
isERBRescueNode(node) ||
|
307
|
+
isERBEnsureNode(node) ||
|
308
|
+
isERBBeginNode(node) ||
|
309
|
+
isERBUnlessNode(node) ||
|
310
|
+
isERBInNode(node)
|
311
|
+
}
|
312
|
+
|
313
|
+
/**
|
314
|
+
* Filter functions for extracting specific node types from arrays
|
315
|
+
*/
|
316
|
+
|
317
|
+
<%- nodes.each do |node| -%>
|
318
|
+
/**
|
319
|
+
* Filters an array of nodes to only include <%= node.name %> nodes
|
320
|
+
*/
|
321
|
+
export function filter<%= node.name %>s(nodes: Node[]): <%= node.name %>[] {
|
322
|
+
return nodes.filter(is<%= node.name %>) as <%= node.name %>[]
|
323
|
+
}
|
324
|
+
|
325
|
+
<%- end -%>
|