From f34b24d12d6d504b38d31c9c9de55388dd19d347 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 21:54:22 +0100 Subject: [PATCH 1/7] refactor: group files by broad categories --- .../__tests__/any-of.test.ts | 28 ------- src/character-classes/__tests__/base.test.ts | 35 --------- .../__tests__/encoder.test.ts | 12 --- src/character-classes/any-of.ts | 14 ---- src/character-classes/base.ts | 21 ----- src/character-classes/encoder.ts | 33 -------- .../__tests__/capture.test.tsx | 6 +- .../__tests__/character-class.test.ts | 78 +++++++++++++++++++ .../{choiceOf.test.ts => choice-of.test.ts} | 6 +- .../__tests__/quantifiers.test.tsx} | 4 +- .../__tests__/repeat.test.tsx | 4 +- src/{ => components}/capture.ts | 4 +- src/components/character-class.ts | 66 ++++++++++++++++ src/components/{choiceOf.ts => choice-of.ts} | 8 +- .../base.ts => components/quantifiers.ts} | 12 +-- src/{quantifiers => components}/repeat.ts | 8 +- src/{ => components}/types.ts | 0 src/{ => encoder}/__tests__/encoder.test.tsx | 11 ++- src/{ => encoder}/encoder.ts | 20 ++--- src/{types-internal.ts => encoder/types.ts} | 14 ++-- src/index.ts | 26 +++++-- src/test-utils.ts | 2 +- src/utils.ts | 8 +- 23 files changed, 218 insertions(+), 202 deletions(-) delete mode 100644 src/character-classes/__tests__/any-of.test.ts delete mode 100644 src/character-classes/__tests__/base.test.ts delete mode 100644 src/character-classes/__tests__/encoder.test.ts delete mode 100644 src/character-classes/any-of.ts delete mode 100644 src/character-classes/base.ts delete mode 100644 src/character-classes/encoder.ts rename src/{ => components}/__tests__/capture.test.tsx (82%) create mode 100644 src/components/__tests__/character-class.test.ts rename src/components/__tests__/{choiceOf.test.ts => choice-of.test.ts} (89%) rename src/{quantifiers/__tests__/base.test.tsx => components/__tests__/quantifiers.test.tsx} (93%) rename src/{quantifiers => components}/__tests__/repeat.test.tsx (90%) rename src/{ => components}/capture.ts (72%) create mode 100644 src/components/character-class.ts rename src/components/{choiceOf.ts => choice-of.ts} (79%) rename src/{quantifiers/base.ts => components/quantifiers.ts} (82%) rename src/{quantifiers => components}/repeat.ts (71%) rename src/{ => components}/types.ts (100%) rename src/{ => encoder}/__tests__/encoder.test.tsx (91%) rename src/{ => encoder}/encoder.ts (74%) rename src/{types-internal.ts => encoder/types.ts} (64%) diff --git a/src/character-classes/__tests__/any-of.test.ts b/src/character-classes/__tests__/any-of.test.ts deleted file mode 100644 index 2b412ab..0000000 --- a/src/character-classes/__tests__/any-of.test.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { buildPattern } from '../..'; -import { oneOrMore } from '../../quantifiers/base'; -import { anyOf } from '../any-of'; - -test('"anyOf" base cases', () => { - expect(buildPattern(anyOf('a'))).toBe('a'); - expect(buildPattern(anyOf('abc'))).toBe('[abc]'); -}); - -test('"anyOf" in context', () => { - expect(buildPattern('x', anyOf('a'), 'x')).toBe('xax'); - expect(buildPattern('x', anyOf('abc'), 'x')).toBe('x[abc]x'); - expect(buildPattern('x', oneOrMore(anyOf('abc')), 'x')).toBe('x[abc]+x'); -}); - -test('"anyOf" escapes special characters', () => { - expect(buildPattern(anyOf('abc-+.'))).toBe('[-abc\\+\\.]'); -}); - -test('"anyOf" moves hyphen to the first position', () => { - expect(buildPattern(anyOf('a-bc'))).toBe('[-abc]'); -}); - -test('`anyOf` throws on empty text', () => { - expect(() => anyOf('')).toThrowErrorMatchingInlineSnapshot( - `"\`anyOf\` should received at least one character"` - ); -}); diff --git a/src/character-classes/__tests__/base.test.ts b/src/character-classes/__tests__/base.test.ts deleted file mode 100644 index 37b5861..0000000 --- a/src/character-classes/__tests__/base.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { buildPattern } from '../..'; -import { one } from '../../quantifiers/base'; -import { any, digit, whitespace, word } from '../base'; - -test('"whitespace" character class', () => { - expect(buildPattern(whitespace)).toEqual(`\\s`); - - expect(buildPattern(one('ab'), whitespace)).toEqual(`ab\\s`); - - expect(buildPattern(one('ab'), whitespace, one('c'))).toEqual(`ab\\sc`); -}); - -test('"digit" character class', () => { - expect(buildPattern(digit)).toEqual(`\\d`); - - expect(buildPattern(one('ab'), digit)).toEqual(`ab\\d`); - - expect(buildPattern(one('ab'), digit, one('c'))).toEqual(`ab\\dc`); -}); - -test('"word" character class', () => { - expect(buildPattern(word)).toEqual(`\\w`); - - expect(buildPattern(one('ab'), word)).toEqual(`ab\\w`); - - expect(buildPattern(one('ab'), word, one('c'))).toEqual(`ab\\wc`); -}); - -test('"any" character class', () => { - expect(buildPattern(any)).toEqual(`.`); - - expect(buildPattern(one('ab'), any)).toEqual(`ab.`); - - expect(buildPattern(one('ab'), any, one('c'))).toEqual(`ab.c`); -}); diff --git a/src/character-classes/__tests__/encoder.test.ts b/src/character-classes/__tests__/encoder.test.ts deleted file mode 100644 index 6b7ae77..0000000 --- a/src/character-classes/__tests__/encoder.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { encodeCharacterClass } from '../encoder'; - -test('buildPattern throws on empty text', () => { - expect(() => - encodeCharacterClass({ - type: 'characterClass', - characters: [], - }) - ).toThrowErrorMatchingInlineSnapshot( - `"Character class should contain at least one character"` - ); -}); diff --git a/src/character-classes/any-of.ts b/src/character-classes/any-of.ts deleted file mode 100644 index 23c0458..0000000 --- a/src/character-classes/any-of.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { CharacterClass } from '../types'; -import { escapeText } from '../utils'; - -export function anyOf(characters: string): CharacterClass { - const charactersArray = characters.split('').map(escapeText); - if (charactersArray.length === 0) { - throw new Error('`anyOf` should received at least one character'); - } - - return { - type: 'characterClass', - characters: charactersArray, - }; -} diff --git a/src/character-classes/base.ts b/src/character-classes/base.ts deleted file mode 100644 index e620ac6..0000000 --- a/src/character-classes/base.ts +++ /dev/null @@ -1,21 +0,0 @@ -import type { CharacterClass } from '../types'; - -export const any: CharacterClass = { - type: 'characterClass', - characters: ['.'], -}; - -export const whitespace: CharacterClass = { - type: 'characterClass', - characters: ['\\s'], -}; - -export const digit: CharacterClass = { - type: 'characterClass', - characters: ['\\d'], -}; - -export const word: CharacterClass = { - type: 'characterClass', - characters: ['\\w'], -}; diff --git a/src/character-classes/encoder.ts b/src/character-classes/encoder.ts deleted file mode 100644 index 62a3ff3..0000000 --- a/src/character-classes/encoder.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { CharacterClass } from '../types'; -import { EncoderPriority, type EncoderNode } from '../types-internal'; - -export function encodeCharacterClass({ - characters, -}: CharacterClass): EncoderNode { - if (characters.length === 0) { - throw new Error('Character class should contain at least one character'); - } - - if (characters.length === 1) { - return { - priority: EncoderPriority.Atom, - pattern: characters[0]!, - }; - } - - return { - priority: EncoderPriority.Atom, - pattern: `[${reorderHyphen(characters).join('')}]`, - }; -} - -// If passed characters includes hyphen (`-`) it need to be moved to -// first (or last) place in order to treat it as hyphen character and not a range. -// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes#types -function reorderHyphen(characters: string[]) { - if (characters.includes('-')) { - return ['-', ...characters.filter((c) => c !== '-')]; - } - - return characters; -} diff --git a/src/__tests__/capture.test.tsx b/src/components/__tests__/capture.test.tsx similarity index 82% rename from src/__tests__/capture.test.tsx rename to src/components/__tests__/capture.test.tsx index 4169b72..3ba05b8 100644 --- a/src/__tests__/capture.test.tsx +++ b/src/components/__tests__/capture.test.tsx @@ -1,7 +1,7 @@ -import { buildPattern } from '..'; +import { buildPattern } from '../..'; import { capture } from '../capture'; -import { oneOrMore } from '../quantifiers/base'; -import { execRegex } from '../test-utils'; +import { oneOrMore } from '../quantifiers'; +import { execRegex } from '../../test-utils'; test('"capture" base cases', () => { expect(buildPattern(capture('a'))).toBe('(a)'); diff --git a/src/components/__tests__/character-class.test.ts b/src/components/__tests__/character-class.test.ts new file mode 100644 index 0000000..ef80422 --- /dev/null +++ b/src/components/__tests__/character-class.test.ts @@ -0,0 +1,78 @@ +import { buildPattern } from '../..'; +import { one, oneOrMore } from '../quantifiers'; +import { + any, + anyOf, + digit, + encodeCharacterClass, + whitespace, + word, +} from '../character-class'; + +test('"whitespace" character class', () => { + expect(buildPattern(whitespace)).toEqual(`\\s`); + + expect(buildPattern(one('ab'), whitespace)).toEqual(`ab\\s`); + + expect(buildPattern(one('ab'), whitespace, one('c'))).toEqual(`ab\\sc`); +}); + +test('"digit" character class', () => { + expect(buildPattern(digit)).toEqual(`\\d`); + + expect(buildPattern(one('ab'), digit)).toEqual(`ab\\d`); + + expect(buildPattern(one('ab'), digit, one('c'))).toEqual(`ab\\dc`); +}); + +test('"word" character class', () => { + expect(buildPattern(word)).toEqual(`\\w`); + + expect(buildPattern(one('ab'), word)).toEqual(`ab\\w`); + + expect(buildPattern(one('ab'), word, one('c'))).toEqual(`ab\\wc`); +}); + +test('"any" character class', () => { + expect(buildPattern(any)).toEqual(`.`); + + expect(buildPattern(one('ab'), any)).toEqual(`ab.`); + + expect(buildPattern(one('ab'), any, one('c'))).toEqual(`ab.c`); +}); + +test('"anyOf" base cases', () => { + expect(buildPattern(anyOf('a'))).toBe('a'); + expect(buildPattern(anyOf('abc'))).toBe('[abc]'); +}); + +test('"anyOf" in context', () => { + expect(buildPattern('x', anyOf('a'), 'x')).toBe('xax'); + expect(buildPattern('x', anyOf('abc'), 'x')).toBe('x[abc]x'); + expect(buildPattern('x', oneOrMore(anyOf('abc')), 'x')).toBe('x[abc]+x'); +}); + +test('"anyOf" escapes special characters', () => { + expect(buildPattern(anyOf('abc-+.'))).toBe('[-abc\\+\\.]'); +}); + +test('"anyOf" moves hyphen to the first position', () => { + expect(buildPattern(anyOf('a-bc'))).toBe('[-abc]'); +}); + +test('`anyOf` throws on empty text', () => { + expect(() => anyOf('')).toThrowErrorMatchingInlineSnapshot( + `"\`anyOf\` should received at least one character"` + ); +}); + +test('buildPattern throws on empty text', () => { + expect(() => + encodeCharacterClass({ + type: 'characterClass', + characters: [], + }) + ).toThrowErrorMatchingInlineSnapshot( + `"Character class should contain at least one character"` + ); +}); diff --git a/src/components/__tests__/choiceOf.test.ts b/src/components/__tests__/choice-of.test.ts similarity index 89% rename from src/components/__tests__/choiceOf.test.ts rename to src/components/__tests__/choice-of.test.ts index 2ff500b..89aedde 100644 --- a/src/components/__tests__/choiceOf.test.ts +++ b/src/components/__tests__/choice-of.test.ts @@ -1,7 +1,7 @@ import { buildPattern } from '../..'; -import { oneOrMore, zeroOrMore } from '../../quantifiers/base'; -import { repeat } from '../../quantifiers/repeat'; -import { choiceOf } from '../choiceOf'; +import { oneOrMore, zeroOrMore } from '../quantifiers'; +import { repeat } from '../repeat'; +import { choiceOf } from '../choice-of'; test('"choiceOf" using basic strings', () => { expect(buildPattern(choiceOf('a'))).toEqual('a'); diff --git a/src/quantifiers/__tests__/base.test.tsx b/src/components/__tests__/quantifiers.test.tsx similarity index 93% rename from src/quantifiers/__tests__/base.test.tsx rename to src/components/__tests__/quantifiers.test.tsx index de1d3a3..45e0e54 100644 --- a/src/quantifiers/__tests__/base.test.tsx +++ b/src/components/__tests__/quantifiers.test.tsx @@ -1,6 +1,6 @@ import { buildPattern, buildRegex } from '../..'; -import { digit } from '../../character-classes/base'; -import { one, oneOrMore, optionally, zeroOrMore } from '../base'; +import { digit } from '../character-class'; +import { one, oneOrMore, optionally, zeroOrMore } from '../quantifiers'; test('"oneOrMore" quantifier', () => { expect(buildPattern(oneOrMore('a'))).toEqual('a+'); diff --git a/src/quantifiers/__tests__/repeat.test.tsx b/src/components/__tests__/repeat.test.tsx similarity index 90% rename from src/quantifiers/__tests__/repeat.test.tsx rename to src/components/__tests__/repeat.test.tsx index 9340ab5..4e08d11 100644 --- a/src/quantifiers/__tests__/repeat.test.tsx +++ b/src/components/__tests__/repeat.test.tsx @@ -1,6 +1,6 @@ import { buildPattern } from '../..'; -import { digit } from '../../character-classes/base'; -import { zeroOrMore, oneOrMore } from '../base'; +import { digit } from '../character-class'; +import { zeroOrMore, oneOrMore } from '../quantifiers'; import { repeat } from '../repeat'; test('"repeat" quantifier', () => { diff --git a/src/capture.ts b/src/components/capture.ts similarity index 72% rename from src/capture.ts rename to src/components/capture.ts index d474629..38fd83a 100644 --- a/src/capture.ts +++ b/src/components/capture.ts @@ -1,5 +1,5 @@ +import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; import type { Capture, RegexElement } from './types'; -import { EncoderPriority, type EncoderNode } from './types-internal'; export function capture(...children: RegexElement[]): Capture { return { @@ -11,6 +11,6 @@ export function capture(...children: RegexElement[]): Capture { export function encodeCapture(node: EncoderNode): EncoderNode { return { pattern: `(${node.pattern})`, - priority: EncoderPriority.Atom, + precedence: EncoderPrecedence.Atom, }; } diff --git a/src/components/character-class.ts b/src/components/character-class.ts new file mode 100644 index 0000000..a03b7e1 --- /dev/null +++ b/src/components/character-class.ts @@ -0,0 +1,66 @@ +import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { escapeText } from '../utils'; +import type { CharacterClass } from './types'; + +export const any: CharacterClass = { + type: 'characterClass', + characters: ['.'], +}; + +export const whitespace: CharacterClass = { + type: 'characterClass', + characters: ['\\s'], +}; + +export const digit: CharacterClass = { + type: 'characterClass', + characters: ['\\d'], +}; + +export const word: CharacterClass = { + type: 'characterClass', + characters: ['\\w'], +}; + +export function anyOf(characters: string): CharacterClass { + const charactersArray = characters.split('').map(escapeText); + if (charactersArray.length === 0) { + throw new Error('`anyOf` should received at least one character'); + } + + return { + type: 'characterClass', + characters: charactersArray, + }; +} + +export function encodeCharacterClass({ + characters, +}: CharacterClass): EncoderNode { + if (characters.length === 0) { + throw new Error('Character class should contain at least one character'); + } + + if (characters.length === 1) { + return { + precedence: EncoderPrecedence.Atom, + pattern: characters[0]!, + }; + } + + return { + precedence: EncoderPrecedence.Atom, + pattern: `[${reorderHyphen(characters).join('')}]`, + }; +} + +// If passed characters includes hyphen (`-`) it need to be moved to +// first (or last) place in order to treat it as hyphen character and not a range. +// See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions/Character_classes#types +function reorderHyphen(characters: string[]) { + if (characters.includes('-')) { + return ['-', ...characters.filter((c) => c !== '-')]; + } + + return characters; +} diff --git a/src/components/choiceOf.ts b/src/components/choice-of.ts similarity index 79% rename from src/components/choiceOf.ts rename to src/components/choice-of.ts index 0d1afa8..399024b 100644 --- a/src/components/choiceOf.ts +++ b/src/components/choice-of.ts @@ -1,9 +1,9 @@ -import type { ChoiceOf, RegexElement } from '../types'; import { - EncoderPriority, + EncoderPrecedence, type EncodeElement, type EncoderNode, -} from '../types-internal'; +} from '../encoder/types'; +import type { ChoiceOf, RegexElement } from './types'; export function choiceOf(...children: RegexElement[]): ChoiceOf { if (children.length === 0) { @@ -26,7 +26,7 @@ export function encodeChoiceOf( } return { - priority: EncoderPriority.Alternation, + precedence: EncoderPrecedence.Alternation, pattern: encodedNodes.map((n) => n.pattern).join('|'), }; } diff --git a/src/quantifiers/base.ts b/src/components/quantifiers.ts similarity index 82% rename from src/quantifiers/base.ts rename to src/components/quantifiers.ts index 7dda93a..d3157d4 100644 --- a/src/quantifiers/base.ts +++ b/src/components/quantifiers.ts @@ -1,12 +1,12 @@ +import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { toAtom } from '../utils'; import type { One, OneOrMore, Optionally, RegexElement, ZeroOrMore, -} from '../types'; -import { EncoderPriority, type EncoderNode } from '../types-internal'; -import { toAtom } from '../utils'; +} from './types'; export function one(...children: RegexElement[]): One { return { @@ -42,21 +42,21 @@ export function encodeOne(node: EncoderNode) { export function encodeOneOrMore(node: EncoderNode): EncoderNode { return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: `${toAtom(node)}+`, }; } export function encodeOptionally(node: EncoderNode): EncoderNode { return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: `${toAtom(node)}?`, }; } export function encodeZeroOrMore(node: EncoderNode): EncoderNode { return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: `${toAtom(node)}*`, }; } diff --git a/src/quantifiers/repeat.ts b/src/components/repeat.ts similarity index 71% rename from src/quantifiers/repeat.ts rename to src/components/repeat.ts index 76a17de..9754e1d 100644 --- a/src/quantifiers/repeat.ts +++ b/src/components/repeat.ts @@ -1,6 +1,6 @@ -import type { RegexElement, Repeat, RepeatConfig } from '../types'; -import { EncoderPriority, type EncoderNode } from '../types-internal'; +import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; import { toAtom } from '../utils'; +import type { RegexElement, Repeat, RepeatConfig } from './types'; export function repeat( config: RepeatConfig, @@ -23,13 +23,13 @@ export function encodeRepeat( ): EncoderNode { if ('count' in config) { return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: `${toAtom(node)}{${config.count}}`, }; } return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: `${toAtom(node)}{${config.min},${config?.max ?? ''}}`, }; } diff --git a/src/types.ts b/src/components/types.ts similarity index 100% rename from src/types.ts rename to src/components/types.ts diff --git a/src/__tests__/encoder.test.tsx b/src/encoder/__tests__/encoder.test.tsx similarity index 91% rename from src/__tests__/encoder.test.tsx rename to src/encoder/__tests__/encoder.test.tsx index 56fc975..c6093e5 100644 --- a/src/__tests__/encoder.test.tsx +++ b/src/encoder/__tests__/encoder.test.tsx @@ -1,6 +1,11 @@ -import { buildPattern, buildRegex } from '..'; -import { one, oneOrMore, optionally, zeroOrMore } from '../quantifiers/base'; -import { repeat } from '../quantifiers/repeat'; +import { buildPattern, buildRegex } from '../..'; +import { + one, + oneOrMore, + optionally, + zeroOrMore, +} from '../../components/quantifiers'; +import { repeat } from '../../components/repeat'; test('basic quantifies', () => { expect(buildPattern('a')).toEqual('a'); diff --git a/src/encoder.ts b/src/encoder/encoder.ts similarity index 74% rename from src/encoder.ts rename to src/encoder/encoder.ts index 6e31d42..ff3f76f 100644 --- a/src/encoder.ts +++ b/src/encoder/encoder.ts @@ -1,16 +1,16 @@ -import type { RegexElement } from './types'; -import { EncoderPriority, type EncoderNode } from './types-internal'; -import { encodeChoiceOf } from './components/choiceOf'; -import { encodeCharacterClass } from './character-classes/encoder'; +import type { RegexElement } from '../components/types'; +import { EncoderPrecedence, type EncoderNode } from './types'; +import { encodeCapture } from '../components/capture'; +import { encodeCharacterClass } from '../components/character-class'; +import { encodeChoiceOf } from '../components/choice-of'; import { encodeOne, encodeOneOrMore, encodeOptionally, encodeZeroOrMore, -} from './quantifiers/base'; -import { encodeRepeat } from './quantifiers/repeat'; -import { concatNodes, escapeText } from './utils'; -import { encodeCapture } from './capture'; +} from '../components/quantifiers'; +import { encodeRepeat } from '../components/repeat'; +import { concatNodes, escapeText } from '../utils'; export function encodeSequence(elements: RegexElement[]): EncoderNode { return concatNodes(elements.map((c) => encodeElement(c))); @@ -64,13 +64,13 @@ function encodeText(text: string): EncoderNode { if (text.length === 1) { return { - priority: EncoderPriority.Atom, + precedence: EncoderPrecedence.Atom, pattern: escapeText(text), }; } return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: escapeText(text), }; } diff --git a/src/types-internal.ts b/src/encoder/types.ts similarity index 64% rename from src/types-internal.ts rename to src/encoder/types.ts index 6496e82..74e4487 100644 --- a/src/types-internal.ts +++ b/src/encoder/types.ts @@ -1,29 +1,29 @@ -import type { RegexElement } from './types'; +import type { RegexElement } from '../components/types'; /** * Encoded regex pattern with information about its type (atom, sequence) */ export interface EncoderNode { + precedence: EncoderPrecedence; pattern: string; - priority: EncoderPriority; } /** - * Higher is more important. + * Order of precedence for regex operators. */ -export const EncoderPriority = { +export const EncoderPrecedence = { // Atoms: single characters, character classes (`\d`, `[a-z]`), // capturing and non-capturing groups (`()`) - Atom: 3, + Atom: 1, // Sequence of atoms, e.g., `abc` Sequence: 2, // Alteration (OR, `|`) expression, e.g., `a|b` - Alternation: 1, + Alternation: 3, } as const; type ValueOf = T[keyof T]; -type EncoderPriority = ValueOf; +type EncoderPrecedence = ValueOf; export type EncodeElement = (element: RegexElement) => EncoderNode; diff --git a/src/index.ts b/src/index.ts index 2d9c1ad..9a3f429 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,23 @@ -import type { RegexElement } from './types'; -import { encodeSequence } from './encoder'; +import type { RegexElement } from './components/types'; +import { encodeSequence } from './encoder/encoder'; -export type * from './types'; +export type * from './components/types'; -export { any, digit, whitespace, word } from './character-classes/base'; -export { anyOf } from './character-classes/any-of'; -export { one, oneOrMore, optionally, zeroOrMore } from './quantifiers/base'; -export { repeat } from './quantifiers/repeat'; -export { choiceOf } from './components/choiceOf'; +export { + any, + anyOf, + digit, + whitespace, + word, +} from './components/character-class'; +export { choiceOf } from './components/choice-of'; +export { + one, + oneOrMore, + optionally, + zeroOrMore, +} from './components/quantifiers'; +export { repeat } from './components/repeat'; /** * Generate RegExp object for elements. diff --git a/src/test-utils.ts b/src/test-utils.ts index a15e65c..fe019a3 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -1,5 +1,5 @@ import { buildRegex } from '.'; -import type { RegexElement } from './types'; +import type { RegexElement } from './components/types'; export function execRegex(text: string, elements: RegexElement[]) { const regex = buildRegex(...elements); diff --git a/src/utils.ts b/src/utils.ts index 4383111..c73b515 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,4 @@ -import { EncoderPriority, type EncoderNode } from './types-internal'; +import { EncoderPrecedence, type EncoderNode } from './encoder/types'; /** * Returns atomic pattern for given node. @@ -7,7 +7,7 @@ import { EncoderPriority, type EncoderNode } from './types-internal'; * @returns */ export function toAtom(node: EncoderNode): string { - if (node.priority === EncoderPriority.Atom) { + if (node.precedence === EncoderPrecedence.Atom) { return node.pattern; } @@ -20,10 +20,10 @@ export function concatNodes(nodes: EncoderNode[]): EncoderNode { } return { - priority: EncoderPriority.Sequence, + precedence: EncoderPrecedence.Sequence, pattern: nodes .map((n) => - n.priority < EncoderPriority.Sequence ? toAtom(n) : n.pattern + n.precedence > EncoderPrecedence.Sequence ? toAtom(n) : n.pattern ) .join(''), }; From 6451db2c0a9fc37d27c7f60278c1a8890a811f5b Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:05:19 +0100 Subject: [PATCH 2/7] refactor: cleanup types --- src/components/capture.ts | 2 +- src/components/choice-of.ts | 2 +- src/components/quantifiers.ts | 16 +++++++++++----- src/components/repeat.ts | 2 +- src/components/types.ts | 21 ++++++++------------- src/encoder/encoder.ts | 8 +++++--- src/encoder/types.ts | 2 +- src/index.ts | 6 ++++-- src/test-utils.ts | 10 ++++++++-- 9 files changed, 40 insertions(+), 29 deletions(-) diff --git a/src/components/capture.ts b/src/components/capture.ts index 38fd83a..535c48e 100644 --- a/src/components/capture.ts +++ b/src/components/capture.ts @@ -1,7 +1,7 @@ import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; import type { Capture, RegexElement } from './types'; -export function capture(...children: RegexElement[]): Capture { +export function capture(...children: Array): Capture { return { type: 'capture', children, diff --git a/src/components/choice-of.ts b/src/components/choice-of.ts index 399024b..e919796 100644 --- a/src/components/choice-of.ts +++ b/src/components/choice-of.ts @@ -5,7 +5,7 @@ import { } from '../encoder/types'; import type { ChoiceOf, RegexElement } from './types'; -export function choiceOf(...children: RegexElement[]): ChoiceOf { +export function choiceOf(...children: Array): ChoiceOf { if (children.length === 0) { throw new Error('`choiceOf` should receive at least one option'); } diff --git a/src/components/quantifiers.ts b/src/components/quantifiers.ts index d3157d4..44dde14 100644 --- a/src/components/quantifiers.ts +++ b/src/components/quantifiers.ts @@ -1,35 +1,41 @@ import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; import { toAtom } from '../utils'; import type { + RegexElement, One, OneOrMore, Optionally, - RegexElement, ZeroOrMore, } from './types'; -export function one(...children: RegexElement[]): One { +export function one(...children: Array): One { return { type: 'one', children, }; } -export function oneOrMore(...children: RegexElement[]): OneOrMore { +export function oneOrMore( + ...children: Array +): OneOrMore { return { type: 'oneOrMore', children, }; } -export function optionally(...children: RegexElement[]): Optionally { +export function optionally( + ...children: Array +): Optionally { return { type: 'optionally', children, }; } -export function zeroOrMore(...children: RegexElement[]): ZeroOrMore { +export function zeroOrMore( + ...children: Array +): ZeroOrMore { return { type: 'zeroOrMore', children, diff --git a/src/components/repeat.ts b/src/components/repeat.ts index 9754e1d..e8e6c31 100644 --- a/src/components/repeat.ts +++ b/src/components/repeat.ts @@ -4,7 +4,7 @@ import type { RegexElement, Repeat, RepeatConfig } from './types'; export function repeat( config: RepeatConfig, - ...children: RegexElement[] + ...children: Array ): Repeat { if (children.length === 0) { throw new Error('`repeat` should receive at least one element'); diff --git a/src/components/types.ts b/src/components/types.ts index 5679086..648b679 100644 --- a/src/components/types.ts +++ b/src/components/types.ts @@ -1,9 +1,4 @@ -export type RegexElement = - | string - | CharacterClass - | ChoiceOf - | Quantifier - | Capture; +export type RegexElement = Capture | CharacterClass | ChoiceOf | Quantifier; export type Quantifier = One | OneOrMore | Optionally | ZeroOrMore | Repeat; @@ -15,33 +10,33 @@ export type CharacterClass = { // Components export type ChoiceOf = { type: 'choiceOf'; - children: RegexElement[]; + children: Array; }; // Quantifiers export type One = { type: 'one'; - children: RegexElement[]; + children: Array; }; export type OneOrMore = { type: 'oneOrMore'; - children: RegexElement[]; + children: Array; }; export type Optionally = { type: 'optionally'; - children: RegexElement[]; + children: Array; }; export type ZeroOrMore = { type: 'zeroOrMore'; - children: RegexElement[]; + children: Array; }; export type Repeat = { type: 'repeat'; - children: RegexElement[]; + children: Array; config: RepeatConfig; }; @@ -50,5 +45,5 @@ export type RepeatConfig = { count: number } | { min: number; max?: number }; // Captures export type Capture = { type: 'capture'; - children: RegexElement[]; + children: Array; }; diff --git a/src/encoder/encoder.ts b/src/encoder/encoder.ts index ff3f76f..cabde3d 100644 --- a/src/encoder/encoder.ts +++ b/src/encoder/encoder.ts @@ -1,5 +1,4 @@ import type { RegexElement } from '../components/types'; -import { EncoderPrecedence, type EncoderNode } from './types'; import { encodeCapture } from '../components/capture'; import { encodeCharacterClass } from '../components/character-class'; import { encodeChoiceOf } from '../components/choice-of'; @@ -11,12 +10,15 @@ import { } from '../components/quantifiers'; import { encodeRepeat } from '../components/repeat'; import { concatNodes, escapeText } from '../utils'; +import { EncoderPrecedence, type EncoderNode } from './types'; -export function encodeSequence(elements: RegexElement[]): EncoderNode { +export function encodeSequence( + elements: Array +): EncoderNode { return concatNodes(elements.map((c) => encodeElement(c))); } -export function encodeElement(element: RegexElement): EncoderNode { +export function encodeElement(element: RegexElement | string): EncoderNode { if (typeof element === 'string') { return encodeText(element); } diff --git a/src/encoder/types.ts b/src/encoder/types.ts index 74e4487..8a9125a 100644 --- a/src/encoder/types.ts +++ b/src/encoder/types.ts @@ -26,4 +26,4 @@ export const EncoderPrecedence = { type ValueOf = T[keyof T]; type EncoderPrecedence = ValueOf; -export type EncodeElement = (element: RegexElement) => EncoderNode; +export type EncodeElement = (element: RegexElement | string) => EncoderNode; diff --git a/src/index.ts b/src/index.ts index 9a3f429..685d453 100644 --- a/src/index.ts +++ b/src/index.ts @@ -25,7 +25,7 @@ export { repeat } from './components/repeat'; * @param elements * @returns */ -export function buildRegex(...elements: RegexElement[]): RegExp { +export function buildRegex(...elements: Array): RegExp { const pattern = encodeSequence(elements).pattern; return new RegExp(pattern); } @@ -35,6 +35,8 @@ export function buildRegex(...elements: RegexElement[]): RegExp { * @param elements * @returns */ -export function buildPattern(...elements: RegexElement[]): string { +export function buildPattern( + ...elements: Array +): string { return encodeSequence(elements).pattern; } diff --git a/src/test-utils.ts b/src/test-utils.ts index fe019a3..493155f 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -1,12 +1,18 @@ import { buildRegex } from '.'; import type { RegexElement } from './components/types'; -export function execRegex(text: string, elements: RegexElement[]) { +export function execRegex( + text: string, + elements: Array +) { const regex = buildRegex(...elements); return [...regex.exec(text)!]; } -export function execRegexFull(text: string, elements: RegexElement[]) { +export function execRegexFull( + text: string, + elements: Array +) { const regex = buildRegex(...elements); return regex.exec(text)!; } From 2e4ef564e70f2237dd2a30620c2e5936f1357512 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:20:08 +0100 Subject: [PATCH 3/7] refactor: import sorting --- package.json | 14 ++- src/components/__tests__/repeat.test.tsx | 2 +- src/components/capture.ts | 2 +- src/components/character-class.ts | 2 +- src/components/choice-of.ts | 2 +- src/components/quantifiers.ts | 4 +- src/components/repeat.ts | 2 +- src/encoder/encoder.ts | 2 +- src/test-utils.ts | 2 +- src/utils.ts | 2 +- yarn.lock | 133 +++++++++++++++++++++-- 11 files changed, 147 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index 19e1b3f..7a9f5cc 100644 --- a/package.json +++ b/package.json @@ -49,6 +49,7 @@ "del-cli": "^5.0.0", "eslint": "^8.4.1", "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-prettier": "^4.0.0", "jest": "^28.1.1", "prettier": "^2.0.5", @@ -103,6 +104,9 @@ "@react-native", "prettier" ], + "plugins": [ + "import" + ], "rules": { "prettier/prettier": [ "error", @@ -113,7 +117,15 @@ "trailingComma": "es5", "useTabs": false } - ] + ], + "sort-imports": [ + "error", + { + "ignoreCase": true, + "ignoreDeclarationSort": true + } + ], + "import/order": "error" } }, "eslintIgnore": [ diff --git a/src/components/__tests__/repeat.test.tsx b/src/components/__tests__/repeat.test.tsx index 4e08d11..6118eaf 100644 --- a/src/components/__tests__/repeat.test.tsx +++ b/src/components/__tests__/repeat.test.tsx @@ -1,6 +1,6 @@ import { buildPattern } from '../..'; import { digit } from '../character-class'; -import { zeroOrMore, oneOrMore } from '../quantifiers'; +import { oneOrMore, zeroOrMore } from '../quantifiers'; import { repeat } from '../repeat'; test('"repeat" quantifier', () => { diff --git a/src/components/capture.ts b/src/components/capture.ts index 535c48e..52db38f 100644 --- a/src/components/capture.ts +++ b/src/components/capture.ts @@ -1,4 +1,4 @@ -import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { type EncoderNode, EncoderPrecedence } from '../encoder/types'; import type { Capture, RegexElement } from './types'; export function capture(...children: Array): Capture { diff --git a/src/components/character-class.ts b/src/components/character-class.ts index a03b7e1..7c6dbd3 100644 --- a/src/components/character-class.ts +++ b/src/components/character-class.ts @@ -1,4 +1,4 @@ -import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { type EncoderNode, EncoderPrecedence } from '../encoder/types'; import { escapeText } from '../utils'; import type { CharacterClass } from './types'; diff --git a/src/components/choice-of.ts b/src/components/choice-of.ts index e919796..9f21f31 100644 --- a/src/components/choice-of.ts +++ b/src/components/choice-of.ts @@ -1,7 +1,7 @@ import { - EncoderPrecedence, type EncodeElement, type EncoderNode, + EncoderPrecedence, } from '../encoder/types'; import type { ChoiceOf, RegexElement } from './types'; diff --git a/src/components/quantifiers.ts b/src/components/quantifiers.ts index 44dde14..1ba6816 100644 --- a/src/components/quantifiers.ts +++ b/src/components/quantifiers.ts @@ -1,10 +1,10 @@ -import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { type EncoderNode, EncoderPrecedence } from '../encoder/types'; import { toAtom } from '../utils'; import type { - RegexElement, One, OneOrMore, Optionally, + RegexElement, ZeroOrMore, } from './types'; diff --git a/src/components/repeat.ts b/src/components/repeat.ts index e8e6c31..17b53d0 100644 --- a/src/components/repeat.ts +++ b/src/components/repeat.ts @@ -1,4 +1,4 @@ -import { EncoderPrecedence, type EncoderNode } from '../encoder/types'; +import { type EncoderNode, EncoderPrecedence } from '../encoder/types'; import { toAtom } from '../utils'; import type { RegexElement, Repeat, RepeatConfig } from './types'; diff --git a/src/encoder/encoder.ts b/src/encoder/encoder.ts index cabde3d..5a586aa 100644 --- a/src/encoder/encoder.ts +++ b/src/encoder/encoder.ts @@ -10,7 +10,7 @@ import { } from '../components/quantifiers'; import { encodeRepeat } from '../components/repeat'; import { concatNodes, escapeText } from '../utils'; -import { EncoderPrecedence, type EncoderNode } from './types'; +import { type EncoderNode, EncoderPrecedence } from './types'; export function encodeSequence( elements: Array diff --git a/src/test-utils.ts b/src/test-utils.ts index 493155f..e9c8608 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -1,5 +1,5 @@ -import { buildRegex } from '.'; import type { RegexElement } from './components/types'; +import { buildRegex } from '.'; export function execRegex( text: string, diff --git a/src/utils.ts b/src/utils.ts index c73b515..a1ae03e 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,4 +1,4 @@ -import { EncoderPrecedence, type EncoderNode } from './encoder/types'; +import { type EncoderNode, EncoderPrecedence } from './encoder/types'; /** * Returns atomic pattern for given node. diff --git a/yarn.lock b/yarn.lock index a173b30..bcb5b33 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3149,6 +3149,13 @@ __metadata: languageName: node linkType: hard +"@types/json5@npm:^0.0.29": + version: 0.0.29 + resolution: "@types/json5@npm:0.0.29" + checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + languageName: node + linkType: hard + "@types/minimist@npm:^1.2.0, @types/minimist@npm:^1.2.2": version: 1.2.5 resolution: "@types/minimist@npm:1.2.5" @@ -3672,7 +3679,7 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.6": +"array-includes@npm:^3.1.6, array-includes@npm:^3.1.7": version: 3.1.7 resolution: "array-includes@npm:3.1.7" dependencies: @@ -3692,7 +3699,20 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.3.1": +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + es-shim-unscopables: ^1.0.0 + get-intrinsic: ^1.2.1 + checksum: 31f35d7b370c84db56484618132041a9af401b338f51899c2e78ef7690fbba5909ee7ca3c59a7192085b328cc0c68c6fd1f6d1553db01a689a589ae510f3966e + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.1, array.prototype.flat@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flat@npm:1.3.2" dependencies: @@ -3704,7 +3724,7 @@ __metadata: languageName: node linkType: hard -"array.prototype.flatmap@npm:^1.3.1": +"array.prototype.flatmap@npm:^1.3.1, array.prototype.flatmap@npm:^1.3.2": version: 1.3.2 resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: @@ -5106,6 +5126,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:^3.2.7": + version: 3.2.7 + resolution: "debug@npm:3.2.7" + dependencies: + ms: ^2.1.1 + checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + languageName: node + linkType: hard + "decamelize-keys@npm:^1.1.0": version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" @@ -5717,6 +5746,29 @@ __metadata: languageName: node linkType: hard +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" + dependencies: + debug: ^3.2.7 + is-core-module: ^2.13.0 + resolve: ^1.22.4 + checksum: 439b91271236b452d478d0522a44482e8c8540bf9df9bd744062ebb89ab45727a3acd03366a6ba2bdbcde8f9f718bab7fe8db64688aca75acf37e04eafd25e22 + languageName: node + linkType: hard + +"eslint-module-utils@npm:^2.8.0": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" + dependencies: + debug: ^3.2.7 + peerDependenciesMeta: + eslint: + optional: true + checksum: 74c6dfea7641ebcfe174be61168541a11a14aa8d72e515f5f09af55cd0d0862686104b0524aa4b8e0ce66418a44aa38a94d2588743db5fd07a6b49ffd16921d2 + languageName: node + linkType: hard + "eslint-plugin-eslint-comments@npm:^3.2.0": version: 3.2.0 resolution: "eslint-plugin-eslint-comments@npm:3.2.0" @@ -5742,6 +5794,33 @@ __metadata: languageName: node linkType: hard +"eslint-plugin-import@npm:^2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" + dependencies: + array-includes: ^3.1.7 + array.prototype.findlastindex: ^1.2.3 + array.prototype.flat: ^1.3.2 + array.prototype.flatmap: ^1.3.2 + debug: ^3.2.7 + doctrine: ^2.1.0 + eslint-import-resolver-node: ^0.3.9 + eslint-module-utils: ^2.8.0 + hasown: ^2.0.0 + is-core-module: ^2.13.1 + is-glob: ^4.0.3 + minimatch: ^3.1.2 + object.fromentries: ^2.0.7 + object.groupby: ^1.0.1 + object.values: ^1.1.7 + semver: ^6.3.1 + tsconfig-paths: ^3.15.0 + peerDependencies: + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: e65159aef808136d26d029b71c8c6e4cb5c628e65e5de77f1eb4c13a379315ae55c9c3afa847f43f4ff9df7e54515c77ffc6489c6a6f81f7dd7359267577468c + languageName: node + linkType: hard + "eslint-plugin-jest@npm:^26.5.3": version: 26.9.0 resolution: "eslint-plugin-jest@npm:26.9.0" @@ -7282,7 +7361,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -8574,6 +8653,17 @@ __metadata: languageName: node linkType: hard +"json5@npm:^1.0.2": + version: 1.0.2 + resolution: "json5@npm:1.0.2" + dependencies: + minimist: ^1.2.0 + bin: + json5: lib/cli.js + checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 + languageName: node + linkType: hard + "json5@npm:^2.2.1, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -9657,7 +9747,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -9936,7 +10026,7 @@ __metadata: languageName: node linkType: hard -"object.fromentries@npm:^2.0.6": +"object.fromentries@npm:^2.0.6, object.fromentries@npm:^2.0.7": version: 2.0.7 resolution: "object.fromentries@npm:2.0.7" dependencies: @@ -9947,6 +10037,18 @@ __metadata: languageName: node linkType: hard +"object.groupby@npm:^1.0.1": + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + checksum: d7959d6eaaba358b1608066fc67ac97f23ce6f573dc8fc661f68c52be165266fcb02937076aedb0e42722fdda0bdc0bbf74778196ac04868178888e9fd3b78b5 + languageName: node + linkType: hard + "object.hasown@npm:^1.1.2": version: 1.1.3 resolution: "object.hasown@npm:1.1.3" @@ -9957,7 +10059,7 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.6": +"object.values@npm:^1.1.6, object.values@npm:^1.1.7": version: 1.1.7 resolution: "object.values@npm:1.1.7" dependencies: @@ -11199,7 +11301,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0": +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -11225,7 +11327,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin": +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.4#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -12320,6 +12422,7 @@ __metadata: del-cli: ^5.0.0 eslint: ^8.4.1 eslint-config-prettier: ^8.5.0 + eslint-plugin-import: ^2.29.1 eslint-plugin-prettier: ^4.0.0 jest: ^28.1.1 prettier: ^2.0.5 @@ -12334,6 +12437,18 @@ __metadata: languageName: unknown linkType: soft +"tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" + dependencies: + "@types/json5": ^0.0.29 + json5: ^1.0.2 + minimist: ^1.2.6 + strip-bom: ^3.0.0 + checksum: 59f35407a390d9482b320451f52a411a256a130ff0e7543d18c6f20afab29ac19fbe55c360a93d6476213cc335a4d76ce90f67df54c4e9037f7d240920832201 + languageName: node + linkType: hard + "tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" From 3a18a7d9e11a4725acace1960e295d6316756974 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:24:50 +0100 Subject: [PATCH 4/7] refactor: self code review --- src/builders.ts | 24 ++++++++++++++++++++++++ src/index.ts | 28 +++------------------------- 2 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 src/builders.ts diff --git a/src/builders.ts b/src/builders.ts new file mode 100644 index 0000000..0f17bd5 --- /dev/null +++ b/src/builders.ts @@ -0,0 +1,24 @@ +import type { RegexElement } from './components/types'; +import { encodeSequence } from './encoder/encoder'; + +/** + * Generate RegExp object for elements. + * + * @param elements + * @returns + */ +export function buildRegex(...elements: Array): RegExp { + const pattern = encodeSequence(elements).pattern; + return new RegExp(pattern); +} + +/** + * Generate regex pattern for elements. + * @param elements + * @returns + */ +export function buildPattern( + ...elements: Array +): string { + return encodeSequence(elements).pattern; +} diff --git a/src/index.ts b/src/index.ts index 685d453..652875f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,8 +1,8 @@ -import type { RegexElement } from './components/types'; -import { encodeSequence } from './encoder/encoder'; - export type * from './components/types'; +export { buildPattern, buildRegex } from './builders'; + +export { capture } from './components/capture'; export { any, anyOf, @@ -18,25 +18,3 @@ export { zeroOrMore, } from './components/quantifiers'; export { repeat } from './components/repeat'; - -/** - * Generate RegExp object for elements. - * - * @param elements - * @returns - */ -export function buildRegex(...elements: Array): RegExp { - const pattern = encodeSequence(elements).pattern; - return new RegExp(pattern); -} - -/** - * Generate regex pattern for elements. - * @param elements - * @returns - */ -export function buildPattern( - ...elements: Array -): string { - return encodeSequence(elements).pattern; -} From ecf2e694ce580f4f2ccd41d1c1aeedbad6bd5e4d Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:30:20 +0100 Subject: [PATCH 5/7] refactor: self code review --- src/components/__tests__/capture.test.tsx | 2 +- src/components/__tests__/character-class.test.ts | 2 +- src/components/__tests__/choice-of.test.ts | 2 +- src/components/__tests__/quantifiers.test.tsx | 2 +- src/components/__tests__/repeat.test.tsx | 2 +- src/encoder/__tests__/encoder.test.tsx | 2 +- src/test-utils.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/__tests__/capture.test.tsx b/src/components/__tests__/capture.test.tsx index 3ba05b8..02b166d 100644 --- a/src/components/__tests__/capture.test.tsx +++ b/src/components/__tests__/capture.test.tsx @@ -1,4 +1,4 @@ -import { buildPattern } from '../..'; +import { buildPattern } from '../../builders'; import { capture } from '../capture'; import { oneOrMore } from '../quantifiers'; import { execRegex } from '../../test-utils'; diff --git a/src/components/__tests__/character-class.test.ts b/src/components/__tests__/character-class.test.ts index ef80422..68f47a4 100644 --- a/src/components/__tests__/character-class.test.ts +++ b/src/components/__tests__/character-class.test.ts @@ -1,4 +1,4 @@ -import { buildPattern } from '../..'; +import { buildPattern } from '../../builders'; import { one, oneOrMore } from '../quantifiers'; import { any, diff --git a/src/components/__tests__/choice-of.test.ts b/src/components/__tests__/choice-of.test.ts index 89aedde..3748dab 100644 --- a/src/components/__tests__/choice-of.test.ts +++ b/src/components/__tests__/choice-of.test.ts @@ -1,4 +1,4 @@ -import { buildPattern } from '../..'; +import { buildPattern } from '../../builders'; import { oneOrMore, zeroOrMore } from '../quantifiers'; import { repeat } from '../repeat'; import { choiceOf } from '../choice-of'; diff --git a/src/components/__tests__/quantifiers.test.tsx b/src/components/__tests__/quantifiers.test.tsx index 45e0e54..f2fdddb 100644 --- a/src/components/__tests__/quantifiers.test.tsx +++ b/src/components/__tests__/quantifiers.test.tsx @@ -1,4 +1,4 @@ -import { buildPattern, buildRegex } from '../..'; +import { buildPattern, buildRegex } from '../../builders'; import { digit } from '../character-class'; import { one, oneOrMore, optionally, zeroOrMore } from '../quantifiers'; diff --git a/src/components/__tests__/repeat.test.tsx b/src/components/__tests__/repeat.test.tsx index 6118eaf..0bb2225 100644 --- a/src/components/__tests__/repeat.test.tsx +++ b/src/components/__tests__/repeat.test.tsx @@ -1,4 +1,4 @@ -import { buildPattern } from '../..'; +import { buildPattern } from '../../builders'; import { digit } from '../character-class'; import { oneOrMore, zeroOrMore } from '../quantifiers'; import { repeat } from '../repeat'; diff --git a/src/encoder/__tests__/encoder.test.tsx b/src/encoder/__tests__/encoder.test.tsx index c6093e5..5867c20 100644 --- a/src/encoder/__tests__/encoder.test.tsx +++ b/src/encoder/__tests__/encoder.test.tsx @@ -1,4 +1,4 @@ -import { buildPattern, buildRegex } from '../..'; +import { buildPattern, buildRegex } from '../../builders'; import { one, oneOrMore, diff --git a/src/test-utils.ts b/src/test-utils.ts index e9c8608..bf48b3f 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -1,5 +1,5 @@ +import { buildRegex } from './builders'; import type { RegexElement } from './components/types'; -import { buildRegex } from '.'; export function execRegex( text: string, From 2cd44cd164e603393580e8745dae741bc0bf4a0a Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:31:50 +0100 Subject: [PATCH 6/7] refactor: remove dead code --- src/test-utils.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/test-utils.ts b/src/test-utils.ts index bf48b3f..cea4dde 100644 --- a/src/test-utils.ts +++ b/src/test-utils.ts @@ -8,11 +8,3 @@ export function execRegex( const regex = buildRegex(...elements); return [...regex.exec(text)!]; } - -export function execRegexFull( - text: string, - elements: Array -) { - const regex = buildRegex(...elements); - return regex.exec(text)!; -} From 270154de745688b6d76aed02f982c44031f53bd3 Mon Sep 17 00:00:00 2001 From: Maciej Jastrzebski Date: Sat, 16 Dec 2023 22:36:38 +0100 Subject: [PATCH 7/7] refactor: cleanup --- src/components/capture.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/capture.ts b/src/components/capture.ts index 52db38f..bb33e9e 100644 --- a/src/components/capture.ts +++ b/src/components/capture.ts @@ -10,7 +10,7 @@ export function capture(...children: Array): Capture { export function encodeCapture(node: EncoderNode): EncoderNode { return { - pattern: `(${node.pattern})`, precedence: EncoderPrecedence.Atom, + pattern: `(${node.pattern})`, }; }