From ca95a8e9f63860864e9dbd40fd0301a8f7289ed9 Mon Sep 17 00:00:00 2001 From: Serious-senpai <57554044+Serious-senpai@users.noreply.github.com> Date: Wed, 16 Apr 2025 04:15:08 +0000 Subject: [PATCH] Fix maximum call stack size error --- packages/glob/__tests__/internal-globber.test.ts | 16 ++++++++++++++++ packages/glob/src/internal-globber.ts | 11 +++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/packages/glob/__tests__/internal-globber.test.ts b/packages/glob/__tests__/internal-globber.test.ts index 4b9d22ad13..08d314a401 100644 --- a/packages/glob/__tests__/internal-globber.test.ts +++ b/packages/glob/__tests__/internal-globber.test.ts @@ -50,6 +50,22 @@ describe('globber', () => { } }) + it('captures large number of files', async () => { + const root = path.join(getTestTemp(), 'large-number-of-files') + await fs.mkdir(root, {recursive: true}) + + const promises: Promise[] = [] + for (let i = 0; i < 150000; i++) { + promises.push( + fs.writeFile(path.join(root, `item-${i}.txt`), 'test file content') + ) + } + + await Promise.all(promises) + const itemPaths = await glob(`${root}${path.sep}*`) + expect(itemPaths.length).toEqual(150000) + }) + it('defaults to followSymbolicLinks=true', async () => { // Create the following layout: // diff --git a/packages/glob/src/internal-globber.ts b/packages/glob/src/internal-globber.ts index 7f56b9b5c2..ac1b26a6b9 100644 --- a/packages/glob/src/internal-globber.ts +++ b/packages/glob/src/internal-globber.ts @@ -146,10 +146,13 @@ export class DefaultGlobber implements Globber { // Push the child items in reverse const childLevel = item.level + 1 - const childItems = (await fs.promises.readdir(item.path)).map( - x => new SearchState(path.join(item.path, x), childLevel) - ) - stack.push(...childItems.reverse()) + const childItems = await fs.promises.readdir(item.path) + + for (let i = childItems.length - 1; i >= 0; i--) { + stack.push( + new SearchState(path.join(item.path, childItems[i]), childLevel) + ) + } } // File else if (match & MatchKind.File) {