1
1
declare module 'regexp-tree/ast' {
2
- export type AstClass =
3
- | 'Char'
4
- | 'ClassRange'
5
- | 'CharacterClass'
6
- | 'Alternative'
7
- | 'Disjunction'
8
- | 'Group'
9
- | 'Backreference'
10
- | 'Repetition'
11
- | 'Quantifier'
12
- | 'Assertion'
13
- | 'RegExp' ;
14
-
15
- interface Base < T > {
2
+ export interface AstClassMap {
3
+ 'RegExp' : AstRegExp ;
4
+ 'Disjunction' : Disjunction ;
5
+ 'Alternative' : Alternative ;
6
+ 'Assertion' : Assertion ;
7
+ 'Char' : Char ;
8
+ 'CharacterClass' : CharacterClass ;
9
+ 'ClassRange' : ClassRange ;
10
+ 'Backreference' : Backreference ;
11
+ 'Group' : Group ;
12
+ 'Repetition' : Repetition ;
13
+ 'Quantifier' : Quantifier ;
14
+ }
15
+
16
+ export type AstClass = keyof AstClassMap ;
17
+ export type AstNode = AstClassMap [ AstClass ] ;
18
+
19
+ export interface Base < T extends AstClass > {
16
20
type : T ;
17
21
loc ?: {
18
22
source : string ;
@@ -32,7 +36,9 @@ declare module 'regexp-tree/ast' {
32
36
kind : 'meta' | 'control' | 'hex' | 'decimal' | 'oct' | 'unicode' ;
33
37
}
34
38
35
- export type Char = SimpleChar | SpecialChar ;
39
+ export type Char =
40
+ | SimpleChar
41
+ | SpecialChar ;
36
42
37
43
export interface ClassRange extends Base < 'ClassRange' > {
38
44
from : Char ;
@@ -64,7 +70,9 @@ declare module 'regexp-tree/ast' {
64
70
expression : Expression | null ;
65
71
}
66
72
67
- export type Group = CapturingGroup | NoncapturingGroup ;
73
+ export type Group =
74
+ | CapturingGroup
75
+ | NoncapturingGroup ;
68
76
69
77
export interface NumericBackreference extends Base < 'Backreference' > {
70
78
kind : 'number' ;
@@ -78,7 +86,9 @@ declare module 'regexp-tree/ast' {
78
86
reference : string ;
79
87
}
80
88
81
- export type Backreference = NumericBackreference | NamedBackreference ;
89
+ export type Backreference =
90
+ | NumericBackreference
91
+ | NamedBackreference ;
82
92
83
93
export interface Repetition extends Base < 'Repetition' > {
84
94
expression : Expression ;
@@ -97,7 +107,9 @@ declare module 'regexp-tree/ast' {
97
107
greedy : boolean ;
98
108
}
99
109
100
- export type Quantifier = SimpleQuantifier | RangeQuantifier ;
110
+ export type Quantifier =
111
+ | SimpleQuantifier
112
+ | RangeQuantifier ;
101
113
102
114
export interface SimpleAssertion extends Base < 'Assertion' > {
103
115
kind : '^' | '$' | '\\b' | '\\B' ;
@@ -109,7 +121,9 @@ declare module 'regexp-tree/ast' {
109
121
assertion : Expression | null ;
110
122
}
111
123
112
- export type Assertion = SimpleAssertion | LookaroundAssertion ;
124
+ export type Assertion =
125
+ | SimpleAssertion
126
+ | LookaroundAssertion ;
113
127
114
128
export type Expression =
115
129
| Char
@@ -128,14 +142,151 @@ declare module 'regexp-tree/ast' {
128
142
}
129
143
130
144
declare module 'regexp-tree' {
131
- import { AstRegExp } from 'regexp-tree/ast'
132
- interface ParserOptions {
145
+ import {
146
+ AstRegExp ,
147
+ AstNode ,
148
+ AstClass ,
149
+ AstClassMap
150
+ } from 'regexp-tree/ast'
151
+
152
+ export interface ParserOptions {
133
153
captureLocations ?: boolean ;
134
154
}
135
155
136
- export function parse ( s : string | RegExp , options ?: ParserOptions ) : AstRegExp ;
156
+ /**
157
+ * Parses a regexp string, producing an AST.
158
+ *
159
+ * @param regexp a regular expression in different formats: string, AST, RegExp.
160
+ * @param options parsing options for this parse call.
161
+ */
162
+ export function parse ( regexp : string | RegExp , options ?: ParserOptions ) : AstRegExp ;
137
163
138
- export function generate ( ast : AstRegExp ) : string ;
164
+ /**
165
+ * Generates a RegExp string from an AST.
166
+ */
167
+ export function generate ( ast : AstNode | null | undefined ) : string ;
139
168
169
+ /**
170
+ * Creates a RegExp object from a regexp string.
171
+ */
140
172
export function toRegExp ( regexp : string ) : RegExp ;
141
- }
173
+
174
+ export interface NodePath < T extends AstNode = AstNode > {
175
+ node : T ;
176
+ parent : AstNode | null ;
177
+ parentPath : NodePath | null ;
178
+ property : string | null ;
179
+ index : number | null ;
180
+ getParent ( ) : NodePath | null ;
181
+ getChild ( n ?: number ) : NodePath | null ;
182
+ getPreviousSibling ( ) : NodePath | null ;
183
+ getNextSibling ( ) : NodePath | null ;
184
+ setChild < T extends AstNode > ( node : T | null , index ?: number | null , property ?: string | null ) : NodePath < T > | null ;
185
+ appendChild < T extends AstNode > ( node : T | null , property ?: string | null ) : NodePath < T > | null ;
186
+ insertChildAt < T extends AstNode > ( node : T | null , index : number , property ?: string | null ) : void ;
187
+ replace < T extends AstNode > ( node : T ) : NodePath < T > | null ;
188
+ update ( nodeProps : Partial < T > ) : void ;
189
+ remove ( ) : void ;
190
+ isRemoved ( ) : boolean ;
191
+ hasEqualSource ( path : NodePath < T > ) : boolean ;
192
+ jsonEncode ( options ?: { format ?: string | number , useLoc ?: boolean } ) : string ;
193
+ }
194
+
195
+ export type NodeTraversalCallback < T extends AstNode = AstNode > = ( node : T , parent : NodePath | null , property ?: string , index ?: number ) => void | boolean ;
196
+
197
+ export interface NodeTraversalCallbacks < T extends AstNode = AstNode > {
198
+ pre ?: NodeTraversalCallback < T > ;
199
+ post ?: NodeTraversalCallback < T > ;
200
+ }
201
+
202
+ export type SpecificNodeTraversalHandlers = {
203
+ [ P in AstClass ] ?: NodeTraversalCallback < AstClassMap [ P ] > | NodeTraversalCallbacks < AstClassMap [ P ] > ;
204
+ } ;
205
+
206
+ export interface NodeTraversalHandlers < T extends AstNode = AstNode > extends SpecificNodeTraversalHandlers {
207
+ '*' ?: NodeTraversalCallback ;
208
+ shouldRun ?( ast : T ) : boolean ;
209
+ init ?( ast : T ) : void ;
210
+ }
211
+
212
+ export type TraversalCallback < T extends AstNode = AstNode > = ( path : NodePath < T > ) => void | boolean ;
213
+
214
+ export interface TraversalCallbacks < T extends AstNode = AstNode > {
215
+ pre ?: TraversalCallback < T > ;
216
+ post ?: TraversalCallback < T > ;
217
+ }
218
+
219
+ export type SpecificTraversalHandlers = {
220
+ [ P in AstClass ] ?: TraversalCallback < AstClassMap [ P ] > | TraversalCallbacks < AstClassMap [ P ] > ;
221
+ } ;
222
+
223
+ export interface TraversalHandlers < T extends AstNode = AstNode > extends SpecificTraversalHandlers {
224
+ '*' ?: TraversalCallback ;
225
+ shouldRun ?( ast : T ) : boolean ;
226
+ init ?( ast : T ) : void ;
227
+ }
228
+
229
+ /**
230
+ * Traverses a RegExp AST.
231
+ *
232
+ * @param handlers Each `handler` is an object containing handler function for needed
233
+ * node types. The value for a node type may also be an object with functions pre and post.
234
+ * This enables more context-aware analyses, e.g. measuring star height.
235
+ *
236
+ * @example
237
+ * regexpTree.traverse(ast, {
238
+ * onChar(node) {
239
+ * ...
240
+ * },
241
+ * });
242
+ */
243
+ export function traverse < T extends AstNode > ( ast : T , handlers : NodeTraversalHandlers < T > | ReadonlyArray < NodeTraversalHandlers < T > > , options : { asNodes : true } ) : void ;
244
+ export function traverse < T extends AstNode > ( ast : T , handlers : TraversalHandlers < T > | ReadonlyArray < TraversalHandlers < T > > , options ?: { asNodes ?: false } ) : void ;
245
+
246
+ export type TransformHandlers < T extends AstNode = AstNode > = TraversalHandlers < T > ;
247
+
248
+ export class TransformResult < T extends AstNode , E = unknown > {
249
+ private _ast ;
250
+ private _source ;
251
+ private _string ;
252
+ private _regexp ;
253
+ private _extra ;
254
+ constructor ( ast : T , extra ?: E ) ;
255
+ getAST ( ) : T ;
256
+ setExtra ( extra : E ) : void ;
257
+ getExtra ( ) : E ;
258
+ toRegExp ( ) : RegExp ;
259
+ getSource ( ) : string ;
260
+ getFlags ( ) : string ;
261
+ toString ( ) : string ;
262
+ }
263
+
264
+ /**
265
+ * Transforms a regular expression.
266
+ *
267
+ * A regexp can be passed in different formats (string, regexp or AST),
268
+ * applying a set of transformations. It is a convenient wrapper
269
+ * on top of "parse-traverse-generate" tool chain.
270
+ */
271
+ export function transform < T extends AstNode > ( ast : T , handlers : TraversalHandlers < T > | ReadonlyArray < TraversalHandlers < T > > ) : TransformResult < T > ;
272
+ export function transform ( regexp : string | RegExp , handlers : TransformHandlers < AstRegExp > | ReadonlyArray < TransformHandlers < AstRegExp > > ) : TransformResult < AstRegExp > ;
273
+
274
+ /**
275
+ * Optimizes a regular expression by replacing some
276
+ * sub-expressions with their idiomatic patterns.
277
+ */
278
+ export function optimize < T extends AstNode > ( ast : T , whitelist ?: string [ ] ) : TransformResult < T > ;
279
+ export function optimize ( regexp : string | RegExp , whitelist ?: string [ ] ) : TransformResult < AstRegExp > ;
280
+
281
+ /**
282
+ * Translates a regular expression in new syntax or in new format
283
+ * into equivalent expressions in old syntax.
284
+ */
285
+ export function compatTranspile < T extends AstNode > ( ast : T , whitelist ?: string [ ] ) : TransformResult < T > ;
286
+ export function compatTranspile ( regexp : string | RegExp , whitelist ?: string [ ] ) : TransformResult < AstRegExp > ;
287
+
288
+ /**
289
+ * Executes a regular expression on a string.
290
+ */
291
+ export function exec ( re : string | RegExp , string : string ) : RegExpExecArray ;
292
+ }
0 commit comments