{"_id":"@philiprehberger/safe-regex","_rev":"3-a92dab1425ccf5c42a603f25dfb86ddd","name":"@philiprehberger/safe-regex","dist-tags":{"latest":"0.1.2"},"versions":{"0.1.0":{"name":"@philiprehberger/safe-regex","version":"0.1.0","keywords":["regex","safe","redos","security","validate","escape"],"author":{"name":"philiprehberger"},"license":"MIT","_id":"@philiprehberger/safe-regex@0.1.0","maintainers":[{"name":"reverendphilip","email":"me@philiprehberger.com"},{"name":"scopeforged","email":"administrator@scopeforged.com"}],"homepage":"https://github.com/philiprehberger/ts-safe-regex#readme","bugs":{"url":"https://github.com/philiprehberger/ts-safe-regex/issues"},"dist":{"shasum":"b9ea861b3610457de1a6a539f7a94f77f5eeea9a","tarball":"https://registry.npmjs.org/@philiprehberger/safe-regex/-/safe-regex-0.1.0.tgz","fileCount":9,"integrity":"sha512-oJEL8cE+XVoARiG6LaTDTLyYjsrrBLhhy8T/9a9eVgoHtTMKBHq/XcMhcijjGZQXi709to5JTf98YUPYiyFWmA==","signatures":[{"sig":"MEYCIQC2bIVbm8kq3Px4aZlTol0FwYSapksGO1haLwhu8pJutAIhAKxj1bEINQC0OAI0cseZ40S9n5fUM9ui8iw4aP22mJ8Q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22048},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"a7030760e42ff6fdbf38e3a23941801199735101","scripts":{"dev":"tsup --watch","test":"node --test","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"reverendphilip","email":"me@philiprehberger.com"},"repository":{"url":"git+https://github.com/philiprehberger/ts-safe-regex.git","type":"git"},"_npmVersion":"10.8.2","description":"Validate and sanitize regular expressions to prevent ReDoS attacks","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safe-regex_0.1.0_1774145216064_0.22559088677582206","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@philiprehberger/safe-regex","version":"0.1.1","keywords":["regex","safe","redos","security","validate","escape"],"author":{"name":"Philip Rehberger"},"license":"MIT","_id":"@philiprehberger/safe-regex@0.1.1","maintainers":[{"name":"reverendphilip","email":"me@philiprehberger.com"},{"name":"scopeforged","email":"administrator@scopeforged.com"}],"homepage":"https://github.com/philiprehberger/ts-safe-regex#readme","bugs":{"url":"https://github.com/philiprehberger/ts-safe-regex/issues"},"dist":{"shasum":"455713b55453c6b4160910f118ae968cf4fc0246","tarball":"https://registry.npmjs.org/@philiprehberger/safe-regex/-/safe-regex-0.1.1.tgz","fileCount":9,"integrity":"sha512-BEP4WjR9xSMn3Iy/seo6RH2obdePjciz3FyOOWni8pE41a22E8TFWOVZ1qDcYm9AQlfTkuHMBzV2QxnWaVyoMQ==","signatures":[{"sig":"MEQCIGN7m0myxoJvQfpMC6G6QfwGRzUSXUiuTuq+qvtdoXM7AiBStxa92MhaARjcjAJp8M1cwUuvkwR0tsDpJyUqvepIwA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":22038},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18.0.0"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"gitHead":"0f2b693165af5935857319d9c26534978adfaa17","scripts":{"dev":"tsup --watch","test":"node --test","build":"tsup","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"_npmUser":{"name":"reverendphilip","email":"me@philiprehberger.com"},"repository":{"url":"git+https://github.com/philiprehberger/ts-safe-regex.git","type":"git"},"_npmVersion":"10.8.2","description":"Validate and sanitize regular expressions to prevent ReDoS attacks","directories":{},"sideEffects":false,"_nodeVersion":"20.20.1","_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_npmOperationalInternal":{"tmp":"tmp/safe-regex_0.1.1_1774242310121_0.36217450273322593","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@philiprehberger/safe-regex","version":"0.1.2","description":"Validate and sanitize regular expressions to prevent ReDoS attacks","type":"module","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"sideEffects":false,"scripts":{"build":"tsup","dev":"tsup --watch","typecheck":"tsc --noEmit","test":"node --test","prepublishOnly":"npm run build"},"keywords":["regex","safe","redos","security","validate","escape"],"author":{"name":"Philip Rehberger"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/philiprehberger/ts-safe-regex.git"},"bugs":{"url":"https://github.com/philiprehberger/ts-safe-regex/issues"},"homepage":"https://github.com/philiprehberger/ts-safe-regex#readme","engines":{"node":">=18.0.0"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0"},"_id":"@philiprehberger/safe-regex@0.1.2","gitHead":"6a973593668a13d10ed991fbd668a2bc58ccabe3","_nodeVersion":"20.20.1","_npmVersion":"10.8.2","dist":{"integrity":"sha512-pWZMQ63gHohFWgqRyTT2sctQkuTUcHbrrqvTvWM/oDlHt3kmHjxTzwfO/c7bU7Q8Fl+Y1sw2b+7HMkNvGC3DFQ==","shasum":"aba887cb4022359b16bcbbeae0222cc8fe9e9f90","tarball":"https://registry.npmjs.org/@philiprehberger/safe-regex/-/safe-regex-0.1.2.tgz","fileCount":9,"unpackedSize":22759,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDsBKCMYTeUESk1CZ43DhiO4af1hqCQtsvqdVaj4gsihwIgHMimMc6om9Bc3HJPEqzzL0MVS0nn92a+GYH2smdFJXA="}]},"_npmUser":{"name":"reverendphilip","email":"me@philiprehberger.com"},"directories":{},"maintainers":[{"name":"reverendphilip","email":"me@philiprehberger.com"},{"name":"scopeforged","email":"administrator@scopeforged.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/safe-regex_0.1.2_1775068715426_0.10488766643580338"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-22T02:06:55.915Z","modified":"2026-04-01T18:38:35.683Z","0.1.0":"2026-03-22T02:06:56.286Z","0.1.1":"2026-03-23T05:05:10.256Z","0.1.2":"2026-04-01T18:38:35.556Z"},"bugs":{"url":"https://github.com/philiprehberger/ts-safe-regex/issues"},"author":{"name":"Philip Rehberger"},"license":"MIT","homepage":"https://github.com/philiprehberger/ts-safe-regex#readme","keywords":["regex","safe","redos","security","validate","escape"],"repository":{"type":"git","url":"git+https://github.com/philiprehberger/ts-safe-regex.git"},"description":"Validate and sanitize regular expressions to prevent ReDoS attacks","maintainers":[{"name":"reverendphilip","email":"me@philiprehberger.com"},{"name":"scopeforged","email":"administrator@scopeforged.com"}],"readme":"# @philiprehberger/safe-regex\n\n[![CI](https://github.com/philiprehberger/ts-safe-regex/actions/workflows/ci.yml/badge.svg)](https://github.com/philiprehberger/ts-safe-regex/actions/workflows/ci.yml)\n[![npm version](https://img.shields.io/npm/v/@philiprehberger/safe-regex.svg)](https://www.npmjs.com/package/@philiprehberger/safe-regex)\n[![Last updated](https://img.shields.io/github/last-commit/philiprehberger/ts-safe-regex)](https://github.com/philiprehberger/ts-safe-regex/commits/main)\n\nValidate and sanitize regular expressions to prevent ReDoS attacks.\n\n## Installation\n\n```bash\nnpm install @philiprehberger/safe-regex\n```\n\n## Usage\n\n```ts\nimport { isSafe, safeParse, escape } from '@philiprehberger/safe-regex';\n\nisSafe('abc');\n// => true\n\nisSafe('(a+)+');\n// => false (nested quantifier — catastrophic backtracking)\n\nconst regex = safeParse('abc', 'i');\n// => /abc/i\n\nconst unsafe = safeParse('(a+)+');\n// => null\n\nescape('hello.world');\n// => \"hello\\\\.world\"\n\nescape('a+b*c?');\n// => \"a\\\\+b\\\\*c\\\\?\"\n```\n\n## API\n\n### `isSafe(input: string | RegExp): boolean`\n\nCheck whether a regular expression is safe from ReDoS attacks. Detects nested quantifiers and overlapping alternations that cause catastrophic backtracking.\n\n### `safeParse(str: string, flags?: string): RegExp | null`\n\nCompile a regex string into a `RegExp` only if it passes safety checks. Returns `null` if the pattern is unsafe or invalid.\n\n### `escape(str: string): string`\n\nEscape all regex special characters in a string so it can be used as a literal match: `. * + ? ^ $ { } ( ) | [ ] \\`\n\n## Development\n\n```bash\nnpm install\nnpm run build\nnpm test\n```\n\n## Support\n\nIf you find this project useful:\n\n⭐ [Star the repo](https://github.com/philiprehberger/ts-safe-regex)\n\n🐛 [Report issues](https://github.com/philiprehberger/ts-safe-regex/issues?q=is%3Aissue+is%3Aopen+label%3Abug)\n\n💡 [Suggest features](https://github.com/philiprehberger/ts-safe-regex/issues?q=is%3Aissue+is%3Aopen+label%3Aenhancement)\n\n❤️ [Sponsor development](https://github.com/sponsors/philiprehberger)\n\n🌐 [All Open Source Projects](https://philiprehberger.com/open-source-packages)\n\n💻 [GitHub Profile](https://github.com/philiprehberger)\n\n🔗 [LinkedIn Profile](https://www.linkedin.com/in/philiprehberger)\n\n## License\n\n[MIT](LICENSE)\n","readmeFilename":"README.md"}