Skip to content

Commit e51c687

Browse files
committed
refactor: cleanup and optimizing types
1 parent 725e4d9 commit e51c687

12 files changed

+74
-78
lines changed

src/__tests__/characterClasses.test.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
import { any, digit, whitespace, word } from '../characterClasses';
1+
import { any, digit, whitespace, word } from '../character-classes';
22
import { buildPattern } from '../compiler';
3-
import { one } from '../quantifiers';
3+
import { one } from '../quantifiers/base';
44

55
test('"whitespace" character class', () => {
66
expect(buildPattern(whitespace)).toEqual(`\\s`);

src/__tests__/compiler.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { buildPattern, buildRegex } from '../compiler';
2-
import { oneOrMore, optionally, one, zeroOrMore, repeat } from '../quantifiers';
2+
import { oneOrMore, optionally, one, zeroOrMore } from '../quantifiers/base';
3+
import { repeat } from '../quantifiers/repeat';
34

45
test('basic quantifies', () => {
56
expect(buildPattern('a')).toEqual('a');

src/__tests__/quantifiers.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { one, oneOrMore, optionally, zeroOrMore } from '../quantifiers';
1+
import { one, oneOrMore, optionally, zeroOrMore } from '../quantifiers/base';
22
import { buildPattern, buildRegex } from '../compiler';
33

44
test('"oneOrMore" quantifier', () => {

src/__tests__/repeat.test.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { buildPattern } from '../compiler';
2-
import { repeat, zeroOrMore, oneOrMore } from '../quantifiers';
2+
import { zeroOrMore, oneOrMore } from '../quantifiers/base';
3+
import { repeat } from '../quantifiers/repeat';
34

45
test('"repeat" quantifier', () => {
56
expect(buildPattern('a', repeat({ min: 1, max: 5 }, 'b'))).toEqual('ab{1,5}');

src/character-classes.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import type {
2+
Any,
3+
CharacterClass,
4+
Digit,
5+
RegexElement,
6+
Whitespace,
7+
Word,
8+
} from './types';
9+
10+
export const whitespace: Whitespace = { type: 'whitespace' };
11+
export const digit: Digit = { type: 'digit' };
12+
export const word: Word = { type: 'word' };
13+
export const any: Any = { type: 'any' };
14+
15+
export const characterClasses = {
16+
whitespace: '\\s',
17+
digit: '\\d',
18+
word: '\\w',
19+
any: '.',
20+
} as const satisfies Record<string, string>;
21+
22+
export function isCharacterClass(
23+
element: Exclude<RegexElement, string>
24+
): element is CharacterClass {
25+
return element.type in characterClasses;
26+
}

src/characterClasses.ts

Lines changed: 0 additions & 17 deletions
This file was deleted.

src/compiler.ts

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { RegexElement } from './types';
2-
import { compilers as quantifiers } from './quantifiers';
2+
import { characterClasses, isCharacterClass } from './character-classes';
3+
import { baseQuantifiers, isBaseQuantifier } from './quantifiers/base';
34
import { compileRepeat } from './quantifiers/repeat';
4-
import { compilers as characterClasses } from './characterClasses';
55

66
/**
77
* Generate RegExp object for elements.
@@ -29,31 +29,26 @@ function compileList(elements: RegexElement[]): string {
2929
return elements.map((c) => compileSingle(c)).join('');
3030
}
3131

32-
function compileSingle(elements: RegexElement): string {
33-
if (typeof elements === 'string') {
34-
return elements;
32+
function compileSingle(element: RegexElement): string {
33+
if (typeof element === 'string') {
34+
return element;
3535
}
3636

37-
if (!('children' in elements)) {
38-
const characterCompiler = characterClasses[elements.type];
39-
40-
if (!characterCompiler) {
41-
throw new Error(`Unknown character type ${elements.type}`);
42-
}
43-
44-
return characterCompiler;
37+
if (isCharacterClass(element)) {
38+
return characterClasses[element.type];
4539
}
4640

47-
const compiledChildren = compileList(elements.children);
41+
const compiledChildren = compileList(element.children);
4842

49-
if (elements.type === 'repeat') {
50-
return compileRepeat(elements.config, compiledChildren);
43+
if (element.type === 'repeat') {
44+
return compileRepeat(element.config, compiledChildren);
5145
}
5246

53-
const elementCompiler = quantifiers[elements.type];
54-
if (!elementCompiler) {
55-
throw new Error(`Unknown elements type ${elements.type}`);
47+
if (isBaseQuantifier(element)) {
48+
const compiler = baseQuantifiers[element.type];
49+
return compiler(compiledChildren);
5650
}
5751

58-
return elementCompiler(compiledChildren);
52+
// @ts-expect-error User passed incorrect type
53+
throw new Error(`Unknown elements type ${element.type}`);
5954
}

src/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
export type * from './types';
22

3-
export { whitespace } from './characterClasses';
3+
export { whitespace } from './character-classes';
44
export { buildRegex, buildPattern } from './compiler';
5-
export { oneOrMore, optionally } from './quantifiers';
5+
export { oneOrMore, optionally } from './quantifiers/base';

src/quantifiers/index.ts renamed to src/quantifiers/base.ts

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import type {
22
One,
33
OneOrMore,
44
Optionally,
5+
Quantifier,
56
RegexElement,
6-
Repeat,
7-
RepeatConfig,
87
ZeroOrMore,
98
} from '../types';
10-
import type { CompilerMap } from '../types-internal';
119
import { wrapGroup } from '../utils';
1210

1311
export function oneOrMore(...children: RegexElement[]): OneOrMore {
@@ -38,20 +36,15 @@ export function zeroOrMore(...children: RegexElement[]): ZeroOrMore {
3836
};
3937
}
4038

41-
export function repeat(
42-
config: RepeatConfig,
43-
...children: RegexElement[]
44-
): Repeat {
45-
return {
46-
type: 'repeat',
47-
children,
48-
config,
49-
};
50-
}
51-
52-
export const compilers = {
39+
export const baseQuantifiers = {
5340
one: (compiledChildren) => compiledChildren,
5441
oneOrMore: (compiledChildren) => `${wrapGroup(compiledChildren)}+`,
5542
optionally: (compiledChildren) => `${wrapGroup(compiledChildren)}?`,
5643
zeroOrMore: (compiledChildren) => `${wrapGroup(compiledChildren)}*`,
57-
} satisfies CompilerMap;
44+
} as const satisfies Record<string, (compiledChildren: string) => string>;
45+
46+
export function isBaseQuantifier(
47+
element: Exclude<RegexElement, string>
48+
): element is Quantifier {
49+
return element.type in baseQuantifiers;
50+
}

src/quantifiers/repeat.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
import type { RepeatConfig } from '../types';
1+
import type { RegexElement, Repeat, RepeatConfig } from '../types';
22
import { wrapGroup } from '../utils';
33

4+
export function repeat(
5+
config: RepeatConfig,
6+
...children: RegexElement[]
7+
): Repeat {
8+
return {
9+
type: 'repeat',
10+
children,
11+
config,
12+
};
13+
}
14+
415
export function compileRepeat(
516
config: RepeatConfig,
617
compiledChildren: string

src/types-internal.ts

Lines changed: 0 additions & 6 deletions
This file was deleted.

src/types.ts

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,13 @@
1-
export type RegexElement = string | RegexCharacterClass | RegexQuantifier;
1+
export type RegexElement = string | CharacterClass | Quantifier;
22

3-
export type RegexCharacterClass = Whitespace | Digit | Word | Any;
3+
export type CharacterClass = Whitespace | Digit | Word | Any;
44

5-
export type RegexQuantifier =
6-
| One
7-
| OneOrMore
8-
| Optionally
9-
| ZeroOrMore
10-
| Repeat;
5+
export type Quantifier = One | OneOrMore | Optionally | ZeroOrMore | Repeat;
116

127
// Character classes
138
export type Whitespace = { type: 'whitespace' };
14-
159
export type Digit = { type: 'digit' };
16-
1710
export type Word = { type: 'word' };
18-
1911
export type Any = { type: 'any' };
2012

2113
// Quantifiers

0 commit comments

Comments
 (0)