From 5a42b66250784b5e66b6ee8f616129eae99a57df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?rogger=20andr=C3=A9=20valverde=20flores?= Date: Thu, 21 May 2020 22:06:58 -0500 Subject: [PATCH] fix(matcher): * should match at least one character --- src/Matcher.test.ts | 4 ++++ src/Matcher.ts | 31 +++++++------------------------ 2 files changed, 11 insertions(+), 24 deletions(-) diff --git a/src/Matcher.test.ts b/src/Matcher.test.ts index a859b3d..b66cc5c 100644 --- a/src/Matcher.test.ts +++ b/src/Matcher.test.ts @@ -22,12 +22,16 @@ describe('Matcher Class', () => { it('returns false', () => { expect(new Matcher('secrets:123').match('secrets:124')).toBe(false); + expect(new Matcher('secrets:123:*').match('secrets:123')).toBe(false); expect(new Matcher('secrets:123:*').match('secrets:124:something')).toBe( false ); expect( new Matcher('secrets:*:something').match('secrets:123:other') ).toBe(false); + expect( + new Matcher('secrets:*:something').match('secrets::something') + ).toBe(false); }); }); }); diff --git a/src/Matcher.ts b/src/Matcher.ts index 85ce2ea..5b2991d 100644 --- a/src/Matcher.ts +++ b/src/Matcher.ts @@ -4,13 +4,11 @@ export class Matcher { private readonly pattern: string; private readonly set: (string | RegExp)[]; private readonly empty: boolean; - private hasSpecialCharacter: boolean; constructor(pattern: string) { this.set = []; this.pattern = pattern.trim(); this.empty = !this.pattern ? true : false; - this.hasSpecialCharacter = false; const set = this.braceExpand(); this.set = set.map(val => this.parse(val)); @@ -41,34 +39,19 @@ export class Matcher { if (pattern.length > 1024 * 64) { throw new TypeError('pattern is too long'); } - let regExp, - re = ''; + let regExp; + let hasSpecialCharacter = false; if (pattern === '') return ''; - for ( - let i = 0, len = pattern.length, c; - i < len && (c = pattern.charAt(i)); - i++ - ) { - if (c === '*') { - this.hasSpecialCharacter = true; - re += '.*?'; - } else { - re += c; - } - } - - // if the re is not '' at this point, then we need to make sure - // it doesn't match against an empty path part. - // Otherwise a/* will match a/, which it should not. - if (re !== '' && this.hasSpecialCharacter) { - re = '(?=.)' + re; - } + const re = pattern.replace(/\*/g, () => { + hasSpecialCharacter = true; + return '.+?'; + }); // skip the regexp for non-* patterns // unescape anything in it, though, so that it'll be // an exact match. - if (!this.hasSpecialCharacter) { + if (!hasSpecialCharacter) { return pattern.replace(/\\(.)/g, '$1'); }