Skip to content

Commit da6fd06

Browse files
Merge pull request #185 from rbuckton/improvedTypes
Improve types for regexp-tree
2 parents 5e745ed + 4310920 commit da6fd06

File tree

1 file changed

+175
-24
lines changed

1 file changed

+175
-24
lines changed

index.d.ts

Lines changed: 175 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,22 @@
11
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> {
1620
type: T;
1721
loc?: {
1822
source: string;
@@ -32,7 +36,9 @@ declare module 'regexp-tree/ast' {
3236
kind: 'meta' | 'control' | 'hex' | 'decimal' | 'oct' | 'unicode';
3337
}
3438

35-
export type Char = SimpleChar | SpecialChar;
39+
export type Char =
40+
| SimpleChar
41+
| SpecialChar;
3642

3743
export interface ClassRange extends Base<'ClassRange'> {
3844
from: Char;
@@ -64,7 +70,9 @@ declare module 'regexp-tree/ast' {
6470
expression: Expression | null;
6571
}
6672

67-
export type Group = CapturingGroup | NoncapturingGroup;
73+
export type Group =
74+
| CapturingGroup
75+
| NoncapturingGroup;
6876

6977
export interface NumericBackreference extends Base<'Backreference'> {
7078
kind: 'number';
@@ -78,7 +86,9 @@ declare module 'regexp-tree/ast' {
7886
reference: string;
7987
}
8088

81-
export type Backreference = NumericBackreference | NamedBackreference;
89+
export type Backreference =
90+
| NumericBackreference
91+
| NamedBackreference;
8292

8393
export interface Repetition extends Base<'Repetition'> {
8494
expression: Expression;
@@ -97,7 +107,9 @@ declare module 'regexp-tree/ast' {
97107
greedy: boolean;
98108
}
99109

100-
export type Quantifier = SimpleQuantifier | RangeQuantifier;
110+
export type Quantifier =
111+
| SimpleQuantifier
112+
| RangeQuantifier;
101113

102114
export interface SimpleAssertion extends Base<'Assertion'> {
103115
kind: '^' | '$' | '\\b' | '\\B';
@@ -109,7 +121,9 @@ declare module 'regexp-tree/ast' {
109121
assertion: Expression | null;
110122
}
111123

112-
export type Assertion = SimpleAssertion | LookaroundAssertion;
124+
export type Assertion =
125+
| SimpleAssertion
126+
| LookaroundAssertion;
113127

114128
export type Expression =
115129
| Char
@@ -128,14 +142,151 @@ declare module 'regexp-tree/ast' {
128142
}
129143

130144
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 {
133153
captureLocations?: boolean;
134154
}
135155

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;
137163

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;
139168

169+
/**
170+
* Creates a RegExp object from a regexp string.
171+
*/
140172
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

Comments
 (0)