@nasriya/overwatch
Advanced tools
+70
-38
@@ -21,47 +21,79 @@ "use strict"; | ||
| let inGroup = false; | ||
| let escaping = false; | ||
| for (let i = 0; i < glob.length; i++) { | ||
| const char = glob[i]; | ||
| if ('^$+?.()=!|'.includes(char)) { | ||
| // Handle escaped characters (e.g., \*, \?, \{, etc.) | ||
| if (escaping) { | ||
| re += '\\' + char; | ||
| escaping = false; | ||
| continue; | ||
| } | ||
| else if (char === '*') { | ||
| const prev = glob[i - 1]; | ||
| let starCount = 1; | ||
| while (glob[i + 1] === '*') { | ||
| i++; | ||
| starCount++; | ||
| if (char === '\\') { | ||
| escaping = true; | ||
| continue; | ||
| } | ||
| switch (char) { | ||
| case '/': | ||
| re += '\\/'; | ||
| break; | ||
| case '.': | ||
| case '+': | ||
| case '^': | ||
| case '$': | ||
| case '!': | ||
| case '=': | ||
| case '|': | ||
| case '(': | ||
| case ')': | ||
| re += '\\' + char; | ||
| break; | ||
| case '*': { | ||
| const prev = glob[i - 1]; | ||
| let starCount = 1; | ||
| while (glob[i + 1] === '*') { | ||
| i++; | ||
| starCount++; | ||
| } | ||
| const next = glob[i + 1]; | ||
| const isGlobstar = globstar && | ||
| starCount > 1 && | ||
| (prev === '/' || prev === undefined) && | ||
| (next === '/' || next === undefined); | ||
| if (isGlobstar) { | ||
| re += '((?:[^\\/]*(?:\\/|$))*)'; | ||
| if (next === '/') | ||
| i++; // skip slash after globstar | ||
| } | ||
| else { | ||
| re += '[^\\/]*'; | ||
| } | ||
| break; | ||
| } | ||
| const next = glob[i + 1]; | ||
| const isGlobstar = globstar && starCount > 1 && (prev === '/' || prev === undefined) && (next === '/' || next === undefined); | ||
| if (isGlobstar) { | ||
| re += '((?:[^\\/]*(?:\\/|$))*)'; | ||
| if (next === '/') | ||
| i++; // skip slash after globstar | ||
| } | ||
| else { | ||
| re += '[^\\/]*'; | ||
| } | ||
| case '?': | ||
| re += '.'; | ||
| break; | ||
| case '{': | ||
| inGroup = true; | ||
| re += '('; | ||
| break; | ||
| case '}': | ||
| inGroup = false; | ||
| re += ')'; | ||
| break; | ||
| case ',': | ||
| re += inGroup ? '|' : ','; | ||
| break; | ||
| // allow valid character classes (e.g., [jt]) | ||
| case '[': | ||
| case ']': | ||
| re += char; | ||
| break; | ||
| default: | ||
| re += char; | ||
| break; | ||
| } | ||
| else if (char === '?') { | ||
| re += '.'; | ||
| } | ||
| else if (char === '{') { | ||
| inGroup = true; | ||
| re += '('; | ||
| } | ||
| else if (char === '}') { | ||
| inGroup = false; | ||
| re += ')'; | ||
| } | ||
| else if (char === ',' && inGroup) { | ||
| re += '|'; | ||
| } | ||
| else if ('[]\\'.includes(char)) { | ||
| re += '\\' + char; | ||
| } | ||
| else { | ||
| re += char === '/' ? '\\/' : char; | ||
| } | ||
| } | ||
| return new RegExp(flags.includes('g') ? re : `^${re}$`, flags); | ||
| // Only anchor if not global, to behave like globs | ||
| const anchored = flags.includes('g') ? re : `^${re}$`; | ||
| return new RegExp(anchored, flags); | ||
| } | ||
@@ -68,0 +100,0 @@ /** |
+70
-38
@@ -16,47 +16,79 @@ import path from 'path'; | ||
| let inGroup = false; | ||
| let escaping = false; | ||
| for (let i = 0; i < glob.length; i++) { | ||
| const char = glob[i]; | ||
| if ('^$+?.()=!|'.includes(char)) { | ||
| // Handle escaped characters (e.g., \*, \?, \{, etc.) | ||
| if (escaping) { | ||
| re += '\\' + char; | ||
| escaping = false; | ||
| continue; | ||
| } | ||
| else if (char === '*') { | ||
| const prev = glob[i - 1]; | ||
| let starCount = 1; | ||
| while (glob[i + 1] === '*') { | ||
| i++; | ||
| starCount++; | ||
| if (char === '\\') { | ||
| escaping = true; | ||
| continue; | ||
| } | ||
| switch (char) { | ||
| case '/': | ||
| re += '\\/'; | ||
| break; | ||
| case '.': | ||
| case '+': | ||
| case '^': | ||
| case '$': | ||
| case '!': | ||
| case '=': | ||
| case '|': | ||
| case '(': | ||
| case ')': | ||
| re += '\\' + char; | ||
| break; | ||
| case '*': { | ||
| const prev = glob[i - 1]; | ||
| let starCount = 1; | ||
| while (glob[i + 1] === '*') { | ||
| i++; | ||
| starCount++; | ||
| } | ||
| const next = glob[i + 1]; | ||
| const isGlobstar = globstar && | ||
| starCount > 1 && | ||
| (prev === '/' || prev === undefined) && | ||
| (next === '/' || next === undefined); | ||
| if (isGlobstar) { | ||
| re += '((?:[^\\/]*(?:\\/|$))*)'; | ||
| if (next === '/') | ||
| i++; // skip slash after globstar | ||
| } | ||
| else { | ||
| re += '[^\\/]*'; | ||
| } | ||
| break; | ||
| } | ||
| const next = glob[i + 1]; | ||
| const isGlobstar = globstar && starCount > 1 && (prev === '/' || prev === undefined) && (next === '/' || next === undefined); | ||
| if (isGlobstar) { | ||
| re += '((?:[^\\/]*(?:\\/|$))*)'; | ||
| if (next === '/') | ||
| i++; // skip slash after globstar | ||
| } | ||
| else { | ||
| re += '[^\\/]*'; | ||
| } | ||
| case '?': | ||
| re += '.'; | ||
| break; | ||
| case '{': | ||
| inGroup = true; | ||
| re += '('; | ||
| break; | ||
| case '}': | ||
| inGroup = false; | ||
| re += ')'; | ||
| break; | ||
| case ',': | ||
| re += inGroup ? '|' : ','; | ||
| break; | ||
| // allow valid character classes (e.g., [jt]) | ||
| case '[': | ||
| case ']': | ||
| re += char; | ||
| break; | ||
| default: | ||
| re += char; | ||
| break; | ||
| } | ||
| else if (char === '?') { | ||
| re += '.'; | ||
| } | ||
| else if (char === '{') { | ||
| inGroup = true; | ||
| re += '('; | ||
| } | ||
| else if (char === '}') { | ||
| inGroup = false; | ||
| re += ')'; | ||
| } | ||
| else if (char === ',' && inGroup) { | ||
| re += '|'; | ||
| } | ||
| else if ('[]\\'.includes(char)) { | ||
| re += '\\' + char; | ||
| } | ||
| else { | ||
| re += char === '/' ? '\\/' : char; | ||
| } | ||
| } | ||
| return new RegExp(flags.includes('g') ? re : `^${re}$`, flags); | ||
| // Only anchor if not global, to behave like globs | ||
| const anchored = flags.includes('g') ? re : `^${re}$`; | ||
| return new RegExp(anchored, flags); | ||
| } | ||
@@ -63,0 +95,0 @@ /** |
+2
-2
| { | ||
| "name": "@nasriya/overwatch", | ||
| "version": "1.0.5", | ||
| "version": "1.0.6", | ||
| "description": "A high-performance, dependency-free file system watcher that monitors file and directory changes efficiently across platforms.", | ||
@@ -60,5 +60,5 @@ "keywords": [ | ||
| "@types/node": "^24.0.3", | ||
| "jest": "^30.0.0", | ||
| "jest": "^30.0.1", | ||
| "ts-jest": "^29.4.0" | ||
| } | ||
| } |
+1
-1
| [](https://nasriya.net) | ||
| # Overwatch. | ||
| [](https://github.com/nasriyasoftware/Overwatch?tab=License-1-ov-file)   [](link-to-your-status-page) | ||
| [](https://github.com/nasriyasoftware/Overwatch?tab=License-1-ov-file)     [](link-to-your-status-page) | ||
@@ -6,0 +6,0 @@ ##### Visit us at [www.nasriya.net](https://nasriya.net). |
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
118121
1.96%2607
2.52%