{"_id":"super-regex","_rev":"4130083","name":"super-regex","description":"Make a regular expression time out if it takes too long to execute","dist-tags":{"latest":"1.1.0"},"maintainers":[{"name":"sindresorhus","email":""}],"time":{"modified":"2026-03-01T18:31:27.000Z","created":"2022-06-03T10:07:15.252Z","1.1.0":"2025-11-04T09:30:12.779Z","1.0.0":"2024-04-03T08:04:12.209Z","0.3.0":"2023-11-12T10:13:53.888Z","0.2.0":"2022-07-07T11:08:08.211Z","0.1.0":"2022-06-03T10:07:15.252Z"},"users":{},"author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"versions":{"1.1.0":{"name":"super-regex","version":"1.1.0","description":"Make a regular expression time out if it takes too long to execute","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":{"types":"./index.d.ts","default":"./index.js"},"sideEffects":false,"engines":{"node":">=18"},"scripts":{"test":"xo && node --test && tsd","benchmark":"node benchmark/index.js"},"keywords":["regex","regexp","regular","expression","timeout","time","out","cancel","expire","abort","redos","security","script","execute","async","asynchronous","worker","non-blocking"],"dependencies":{"function-timeout":"^1.0.1","make-asynchronous":"^1.0.1","time-span":"^5.1.0"},"devDependencies":{"tsd":"^0.31.0","xo":"^0.58.0"},"gitHead":"50f4b43a9e141b86ff7025c407596b5fed8ed965","types":"./index.d.ts","_id":"super-regex@1.1.0","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"homepage":"https://github.com/sindresorhus/super-regex#readme","_nodeVersion":"20.19.5","_npmVersion":"11.6.1","dist":{"shasum":"14b69b6374f7b3338db52ecd511dae97c27acf75","size":4942,"noattachment":false,"key":"/super-regex/-/super-regex-1.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/super-regex/download/super-regex-1.1.0.tgz"},"_npmUser":{"name":"sindresorhus","email":"sindresorhus@gmail.com"},"directories":{},"maintainers":[{"name":"sindresorhus","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/super-regex_1.1.0_1762248612588_0.37291710401512645"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2025-11-04T09:30:12.779Z","publish_time":1762248612779,"_source_registry_name":"default","_cnpm_publish_time":1762248612779},"1.0.0":{"name":"super-regex","version":"1.0.0","description":"Make a regular expression time out if it takes too long to execute","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":{"types":"./index.d.ts","default":"./index.js"},"sideEffects":false,"engines":{"node":">=18"},"scripts":{"test":"xo && ava && tsd","benchmark":"node benchmark/index.js"},"keywords":["regex","regexp","regular","expression","timeout","time","out","cancel","expire","abort","redos","security","script","execute"],"dependencies":{"function-timeout":"^1.0.1","time-span":"^5.1.0"},"devDependencies":{"ava":"^6.1.2","tsd":"^0.31.0","xo":"^0.58.0"},"types":"./index.d.ts","gitHead":"fba5633210483b33c26a106bf54a8e051d6fa8df","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"homepage":"https://github.com/sindresorhus/super-regex#readme","_id":"super-regex@1.0.0","_nodeVersion":"18.19.1","_npmVersion":"9.2.0","dist":{"shasum":"dd90d944a925a1083e7d8570919b21cb76e3d925","size":3054,"noattachment":false,"key":"/super-regex/-/super-regex-1.0.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/super-regex/download/super-regex-1.0.0.tgz"},"_npmUser":{"name":"sindresorhus","email":"sindresorhus@gmail.com"},"directories":{},"maintainers":[{"name":"sindresorhus","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/super-regex_1.0.0_1712131451947_0.7153223594159954"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2024-04-03T08:04:12.209Z","publish_time":1712131452209,"_source_registry_name":"default","_cnpm_publish_time":1712131452209},"0.3.0":{"name":"super-regex","version":"0.3.0","description":"Make a regular expression time out if it takes too long to execute","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":{"types":"./index.d.ts","default":"./index.js"},"sideEffects":false,"engines":{"node":">=18"},"scripts":{"test":"xo && ava && tsd","benchmark":"node benchmark/index.js"},"keywords":["regex","regexp","regular","expression","timeout","time","out","cancel","expire","abort","redos","security","script","execute"],"dependencies":{"function-timeout":"^1.0.1","time-span":"^5.1.0"},"devDependencies":{"ava":"^5.3.1","tsd":"^0.29.0","xo":"^0.56.0"},"types":"./index.d.ts","gitHead":"20370f196503b0775d95ed9e1cfc18190d0bc12b","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"homepage":"https://github.com/sindresorhus/super-regex#readme","_id":"super-regex@0.3.0","_nodeVersion":"18.18.2","_npmVersion":"9.2.0","dist":{"shasum":"ffbacf605bdde6e03cecf17d5f818c4c7a3662dc","size":3037,"noattachment":false,"key":"/super-regex/-/super-regex-0.3.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/super-regex/download/super-regex-0.3.0.tgz"},"_npmUser":{"name":"sindresorhus","email":"sindresorhus@gmail.com"},"directories":{},"maintainers":[{"name":"sindresorhus","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/super-regex_0.3.0_1699784033683_0.9400856325730906"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2023-11-12T10:13:53.888Z","publish_time":1699784033888,"_source_registry_name":"default","_cnpm_publish_time":1699784033888},"0.2.0":{"name":"super-regex","version":"0.2.0","description":"Make a regular expression time out if it takes too long to execute","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","types":"./index.d.ts","engines":{"node":">=14.16"},"scripts":{"test":"xo && ava && tsd"},"keywords":["regex","regexp","regular","expression","timeout","time","out","cancel","expire","abort","redos","security","script","execute"],"dependencies":{"clone-regexp":"^3.0.0","function-timeout":"^0.1.0","time-span":"^5.1.0"},"devDependencies":{"ava":"^4.3.0","tsd":"^0.20.0","xo":"^0.49.0"},"gitHead":"2ec23494aa3628d434cdcb6492afdcb0ba1a4062","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"homepage":"https://github.com/sindresorhus/super-regex#readme","_id":"super-regex@0.2.0","_nodeVersion":"14.19.3","_npmVersion":"8.3.2","dist":{"shasum":"dc1e071e55cdcf56930eb6271f73653a655b2642","size":3039,"noattachment":false,"key":"/super-regex/-/super-regex-0.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/super-regex/download/super-regex-0.2.0.tgz"},"_npmUser":{"name":"sindresorhus","email":"sindresorhus@gmail.com"},"directories":{},"maintainers":[{"name":"sindresorhus","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/super-regex_0.2.0_1657192087959_0.8323758941429744"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-07-07T11:43:16.559Z","publish_time":1657192088211,"_cnpm_publish_time":1657192088211},"0.1.0":{"name":"super-regex","version":"0.1.0","description":"Make a regular expression time out if it takes too long to execute","license":"MIT","repository":{"type":"git","url":"git+https://github.com/sindresorhus/super-regex.git"},"funding":"https://github.com/sponsors/sindresorhus","author":{"name":"Sindre Sorhus","email":"sindresorhus@gmail.com","url":"https://sindresorhus.com"},"type":"module","exports":"./index.js","types":"./index.d.ts","engines":{"node":">=14.16"},"scripts":{"test":"xo && ava && tsd"},"keywords":["regex","regexp","regular","expression","timeout","time","out","cancel","expire","abort","redos","security","script","execute"],"dependencies":{"clone-regexp":"^3.0.0","function-timeout":"^0.1.0"},"devDependencies":{"ava":"^4.3.0","tsd":"^0.20.0","xo":"^0.49.0"},"gitHead":"690235582ec311c062c429f282d83705b5f0de6c","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"homepage":"https://github.com/sindresorhus/super-regex#readme","_id":"super-regex@0.1.0","_nodeVersion":"14.19.2","_npmVersion":"8.3.2","dist":{"shasum":"7c15012feb1e26e6c64a333becffbd00fb6c6222","size":2603,"noattachment":false,"key":"/super-regex/-/super-regex-0.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/super-regex/download/super-regex-0.1.0.tgz"},"_npmUser":{"name":"sindresorhus","email":"sindresorhus@gmail.com"},"directories":{},"maintainers":[{"name":"sindresorhus","email":""}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/super-regex_0.1.0_1654250835033_0.318311709612211"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-06-05T12:50:11.462Z","publish_time":1654250835252,"_cnpm_publish_time":1654250835252}},"readme":"# super-regex\n\n> Make a regular expression time out if it takes too long to execute\n\nThis can be used to prevent [ReDoS vulnerabilities](https://en.wikipedia.org/wiki/ReDoS) when running a regular expression against untrusted user input.\n\nThis package also has a better API than the built-in regular expression methods. For example, none of the methods mutate the regex.\n\n**Synchronous methods** (`isMatch`, `firstMatch`, `matches`) use a timeout mechanism that only works in Node.js. In the browser, they will not time out.\n\n**Asynchronous methods** (`isMatchAsync`, `firstMatchAsync`, `matchesAsync`) run the regex in a worker thread and support timeout in both Node.js and browsers. They are especially useful for preventing ReDoS attacks in browser environments and for non-blocking execution in servers.\n\n## Install\n\n```sh\nnpm install super-regex\n```\n\n## Usage\n\n```js\nimport {isMatch} from 'super-regex';\n\nconsole.log(isMatch(/\\d+/, getUserInput(), {timeout: 1000}));\n```\n\n```js\nimport {isMatchAsync} from 'super-regex';\n\nconsole.log(await isMatchAsync(/\\d+/, getUserInput(), {timeout: 1000}));\n```\n\n## API\n\n### isMatch(regex, string, options?)\n\nReturns a boolean for whether the given `regex` matches the given `string`.\n\nIf the regex takes longer to match than the given timeout, it returns `false`.\n\n*This method is similar to [`RegExp#test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test), but differs in that the given `regex` is [never mutated, even when it has the `/g` flag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test#using_test_on_a_regex_with_the_global_flag).*\n\n### firstMatch(regex, string, options?)\n\nReturns the first `Match` or `undefined` if there was no match.\n\nIf the regex takes longer to match than the given timeout, it returns `undefined`.\n\n### matches(regex, string, options?)\n\nReturns an iterable of `Match`es.\n\nIf the regex takes longer to match than the given timeout, it returns an empty array.\n\n**The `regex` must have the `/g` flag.**\n\n### isMatchAsync(regex, string, options?)\n\nReturns a promise that resolves to a boolean for whether the given `regex` matches the given `string`.\n\nIf the regex takes longer to match than the given timeout, it returns `false`.\n\nThis method runs the regex in a worker thread, which allows it to time out in both Node.js and browsers. This is especially useful for preventing ReDoS attacks in browser environments.\n\n*This method is similar to [`RegExp#test`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test), but differs in that the given `regex` is [never mutated, even when it has the `/g` flag](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test#using_test_on_a_regex_with_the_global_flag).*\n\n```js\nimport {isMatchAsync} from 'super-regex';\n\nconsole.log(await isMatchAsync(/\\d+/, getUserInput(), {timeout: 1000}));\n```\n\n### firstMatchAsync(regex, string, options?)\n\nReturns a promise that resolves to the first match or `undefined` if there was no match.\n\nIf the regex takes longer to match than the given timeout, it returns `undefined`.\n\nThis method runs the regex in a worker thread, which allows it to time out in both Node.js and browsers. This is especially useful for preventing ReDoS attacks in browser environments.\n\n```js\nimport {firstMatchAsync} from 'super-regex';\n\nconsole.log(await firstMatchAsync(/\\d+/, getUserInput(), {timeout: 1000}));\n```\n\n### matchesAsync(regex, string, options?)\n\nReturns an async iterable of matches.\n\nIf the regex takes longer to match than the given timeout, it returns an empty iterable.\n\nThis method runs the regex in a worker thread, which allows it to time out in both Node.js and browsers. This is especially useful for preventing ReDoS attacks in browser environments.\n\n**The `regex` must have the `/g` flag.**\n\n```js\nimport {matchesAsync} from 'super-regex';\n\nfor await (const match of matchesAsync(/\\d+/g, getUserInput(), {timeout: 1000})) {\n\tconsole.log(match);\n}\n```\n\n#### options\n\nType: `object`\n\n##### timeout?\n\nType: `number` *(integer)*\n\nThe time in milliseconds to wait before timing out.\n\n##### throwOnTimeout?\n\nType: `boolean`\\\nDefault: `false`\n\nThrow a timeout error instead of returning a default value when the timeout is reached.\n\nThis lets you distinguish between “no match” and “timeout”.\n\nBy default, when a timeout occurs:\n- `isMatch()` returns `false`\n- `firstMatch()` returns `undefined`\n- `matches()` returns an empty array\n- `isMatchAsync()` returns `false`\n- `firstMatchAsync()` returns `undefined`\n- `matchesAsync()` returns an empty iterable\n\n##### matchTimeout?\n\nType: `number` *(integer)*\n\nOnly works in `matches()`.\n\nThe time in milliseconds to wait before timing out when searching for each match.\n\n### Match\n\n```ts\n{\n\tmatch: string;\n\tindex: number;\n\tgroups: string[];\n\tnamedGroups: {string: string}; // object with string values\n\tinput: string;\n}\n```\n\n## Related\n\n- [function-timeout](https://github.com/sindresorhus/function-timeout) - Make a synchronous function have a timeout\n","_attachments":{},"homepage":"https://github.com/sindresorhus/super-regex#readme","bugs":{"url":"https://github.com/sindresorhus/super-regex/issues"},"license":"MIT"}