Skip to content

Commit de06af1

Browse files
fix: prevent embedding any (.) in charClass (#86)
1 parent 6a0beba commit de06af1

File tree

4 files changed

+15
-15
lines changed

4 files changed

+15
-15
lines changed

src/constructs/__tests__/character-class.test.ts

+2-6
Original file line numberDiff line numberDiff line change
@@ -90,22 +90,18 @@ test('`charClass` throws on negated arguments', () => {
9090
});
9191

9292
test('`charClass` joins character escapes', () => {
93-
expect(charClass(any)).toEqualRegex(/./);
9493
expect(charClass(word)).toEqualRegex(/\w/);
9594
expect(charClass(digit)).toEqualRegex(/\d/);
9695
expect(charClass(whitespace)).toEqualRegex(/\s/);
9796
expect(charClass(nonWord)).toEqualRegex(/\W/);
9897
expect(charClass(nonDigit)).toEqualRegex(/\D/);
9998
expect(charClass(nonWhitespace)).toEqualRegex(/\S/);
10099

101-
expect(charClass(any, whitespace)).toEqualRegex(/[.\s]/);
102-
expect(charClass(any, nonWhitespace)).toEqualRegex(/[.\S]/);
100+
expect(charClass(whitespace, nonWhitespace)).toEqualRegex(/[\s\S]/);
103101

104102
expect(charClass(word, whitespace)).toEqualRegex(/[\w\s]/);
105-
expect(charClass(any, word, digit)).toEqualRegex(/[.\w\d]/);
106-
107103
expect(charClass(word, digit, whitespace)).toEqualRegex(/[\w\d\s]/);
108-
expect(charClass(any, word, digit, whitespace)).toEqualRegex(/[.\w\d\s]/);
104+
expect(charClass(word, nonDigit)).toEqualRegex(/[\w\D]/);
109105
});
110106

111107
test('`charRange` pattern', () => {

src/constructs/character-class.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,13 @@ export interface CharacterRange {
1818
end: string;
1919
}
2020

21-
export const any: CharacterClass = {
22-
type: 'characterClass',
23-
escape: '.',
24-
chars: [],
25-
ranges: [],
26-
isNegated: false,
27-
encode: encodeCharacterClass,
21+
/**
22+
* Matches any single character.
23+
* Cannot be used as a part of character class.
24+
*/
25+
export const any: EncodeResult = {
26+
precedence: 'atom',
27+
pattern: '.',
2828
};
2929

3030
export const digit: CharacterClass = {

src/encoder/encoder.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ function encodeNode(element: RegexElement): EncodeResult {
2020
return encodeRegExp(element);
2121
}
2222

23-
if (typeof element.encode !== 'function') {
23+
if (typeof element === 'object' && 'pattern' in element) {
24+
return element;
25+
}
26+
27+
if (typeof element === 'object' && typeof element.encode !== 'function') {
2428
throw new Error(`\`encodeNode\`: unknown element type ${element.type}`);
2529
}
2630

src/types.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export type RegexSequence = RegexElement[] | RegexElement;
1212
/**
1313
* Fundamental building block of a regular expression, defined as either a regex construct or a string.
1414
*/
15-
export type RegexElement = RegexConstruct | string | RegExp;
15+
export type RegexElement = RegexConstruct | EncodeResult | string | RegExp;
1616

1717
/**
1818
* Common interface for all regex constructs like character classes, quantifiers, and anchors.

0 commit comments

Comments
 (0)