From 96bc09df6b6de7dc4e79730494cd9c5e25396667 Mon Sep 17 00:00:00 2001 From: Siddharth Date: Fri, 21 May 2021 12:44:31 +0530 Subject: [PATCH 1/4] Worked on tests --- src/__tests__/index.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index edd87e7..7ad6b73 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -54,5 +54,5 @@ it('should build regexes properly', () => { May not match everything because extensions are (mostly) letters */ [a-z0-9](?:[a-z0-9-]*[a-z0-9])? - ${'g'}`).toStrictEqual(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z\d!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z\d](?:[a-z\d-]*[a-z\d])?\.)+[a-z\d](?:[a-z\d-]*[a-z\d])?/g); + ${'g'}`).toStrictEqual(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g); }); From 70fee9e6f13de4367e708c452548f9bafd0babad Mon Sep 17 00:00:00 2001 From: Siddharth Date: Fri, 21 May 2021 13:10:06 +0530 Subject: [PATCH 2/4] Add support for interpolating regexes --- src/index.ts | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 41e4c7a..2cd4db2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -20,11 +20,11 @@ */ /** - * Clean a string (remove comments, whitespace, extra stuff in other template literals and such) + * Clean a string (remove comments, whitespace, etc.) * @param piece the string to clean - * @returns string + * @returns {string} th cleaned string */ -export function clean(piece: string) { +export function clean(piece: string): string { // Funny how we don't use our own functions to build our own regexes return piece // Get rid of any escaped (`) tildes @@ -37,13 +37,29 @@ export function clean(piece: string) { .replace(/\n\s*/g, ''); } -export function regex({raw}: TemplateStringsArray, ...interpolations: string[]) { +/** + * Parse an object to make it embeddable within an object + * @param interpol the interpolation to parse5 + * @returns {string} The stringified regex + */ +function parse(interpol: any): string { + if (interpol instanceof RegExp) return interpol.source; + else return interpol.toString() +} + +/** + * Convert a string to a regex + * @param param0 The template strings array + * @param interpolations the interpolations + * @returns {RegExp} The parsed regex + */ +export function regex({raw}: TemplateStringsArray, ...interpolations: any[]): RegExp { const flags: string | undefined = raw[raw.length - 1] ? undefined : interpolations.pop(); /* eslint-disable-next-line unicorn/no-array-reduce */ return new RegExp(interpolations.reduce( (regexp, insert, index) => { - return `${regexp}${insert}${clean(raw[index + 1])}`; + return `${regexp}${parse(insert)}${clean(raw[index + 1])}`; }, clean(raw[0]) ), flags); -} +} \ No newline at end of file From a2dc141844ae62a22739d33f8005443ae16bec32 Mon Sep 17 00:00:00 2001 From: Siddharth Date: Fri, 21 May 2021 14:56:03 +0530 Subject: [PATCH 3/4] Fixed interpolation of regexes --- src/index.ts | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/index.ts b/src/index.ts index 2cd4db2..d633d77 100644 --- a/src/index.ts +++ b/src/index.ts @@ -43,8 +43,7 @@ export function clean(piece: string): string { * @returns {string} The stringified regex */ function parse(interpol: any): string { - if (interpol instanceof RegExp) return interpol.source; - else return interpol.toString() + return interpol instanceof RegExp ? interpol.source : [interpol].join(); } /** @@ -54,12 +53,12 @@ function parse(interpol: any): string { * @returns {RegExp} The parsed regex */ export function regex({raw}: TemplateStringsArray, ...interpolations: any[]): RegExp { - const flags: string | undefined = raw[raw.length - 1] ? undefined : interpolations.pop(); + const flags = raw[raw.length - 1] ? '' : parse(interpolations.pop()); /* eslint-disable-next-line unicorn/no-array-reduce */ return new RegExp(interpolations.reduce( (regexp, insert, index) => { - return `${regexp}${parse(insert)}${clean(raw[index + 1])}`; + return `${parse(regexp)}${parse(insert)}${clean(raw[index + 1])}`; }, clean(raw[0]) - ), flags); -} \ No newline at end of file + ) as string, flags); +} From 9d72a02a2787958f741ad0ae759b1ca3dd27a2e4 Mon Sep 17 00:00:00 2001 From: Siddharth Date: Fri, 21 May 2021 14:56:19 +0530 Subject: [PATCH 4/4] Tested interpolation of regexes --- src/__tests__/index.test.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 7ad6b73..ab5809f 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -11,6 +11,13 @@ it('should build regexes properly', () => { \s+ `).toStrictEqual(/\d+\s+/); + expect(regex` + // Here's an interpolation + ${/\d+\s/g} + /* Here's a nested regex call */ + ${regex`.*`} + `).toStrictEqual(/\d+\s.*/); + expect(regex` // Here's an interpolation