From 7fbeaadf22bc5b771863f2488173dd3357ac82ff Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Fri, 27 Jun 2025 08:36:36 -0700 Subject: [PATCH] refactor: switch to tinyglobby --- package.json | 3 +- packages/cli-clean/package.json | 2 +- packages/cli-clean/src/clean.ts | 7 ++-- packages/cli-config-android/package.json | 4 +-- .../src/config/findComponentDescriptors.ts | 6 ++-- .../src/config/findManifest.ts | 5 +-- .../src/config/findPackageClassName.ts | 6 ++-- packages/cli-config-apple/package.json | 2 +- .../src/config/findAllPodfilePaths.ts | 5 +-- .../src/config/findPodspec.ts | 7 ++-- packages/cli-config/package.json | 1 - packages/cli-link-assets/package.json | 2 +- .../helpers/font/androidFontAssetHelpers.ts | 5 +-- scripts/build.js | 6 ++-- scripts/linkPackages.js | 6 ++-- yarn.lock | 34 +++++++++++++------ 16 files changed, 61 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 0980069c2..117250db1 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "@types/glob": "^7.1.1", "@types/jest": "^26.0.15", "@types/node": "^20.0.0", + "@types/picomatch": "^4.0.2", "babel-jest": "^26.6.2", "babel-plugin-module-resolver": "^3.2.0", "chalk": "^4.1.2", @@ -41,7 +42,6 @@ "eslint-plugin-ft-flow": "^2.0.1", "eslint-plugin-import": "^2.25.3", "execa": "^5.0.0", - "fast-glob": "^3.3.2", "husky": "^8.0.2", "jest": "^26.6.2", "jest-circus": "^26.6.2", @@ -53,6 +53,7 @@ "prettier": "2.8.8", "slash": "^3.0.0", "string-length": "^2.0.0", + "tinyglobby": "^0.2.15", "typescript": "^5.2.0" }, "lint-staged": { diff --git a/packages/cli-clean/package.json b/packages/cli-clean/package.json index ba1c932e0..74235180b 100644 --- a/packages/cli-clean/package.json +++ b/packages/cli-clean/package.json @@ -11,7 +11,7 @@ "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "tinyglobby": "^0.2.15" }, "files": [ "build", diff --git a/packages/cli-clean/src/clean.ts b/packages/cli-clean/src/clean.ts index dfc8df2c7..aecac444a 100644 --- a/packages/cli-clean/src/clean.ts +++ b/packages/cli-clean/src/clean.ts @@ -6,7 +6,7 @@ import {existsSync as fileExists, rm} from 'fs'; import os from 'os'; import path from 'path'; import {promisify} from 'util'; -import glob from 'fast-glob'; +import glob from 'tinyglobby'; type Args = { include?: string; @@ -38,7 +38,10 @@ function isDirectoryPattern(directory: string): boolean { export async function cleanDir(directory: string): Promise { try { if (isDirectoryPattern(directory)) { - const directories = await glob.async(directory, {onlyFiles: false}); + const directories = await glob.glob(directory, { + onlyFiles: false, + expandDirectories: false, + }); for (const dir of directories) { await rmAsync(dir, rmAsyncOptions); diff --git a/packages/cli-config-android/package.json b/packages/cli-config-android/package.json index 19048d3d3..7daa6b90a 100644 --- a/packages/cli-config-android/package.json +++ b/packages/cli-config-android/package.json @@ -9,8 +9,8 @@ "dependencies": { "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1" + "fast-xml-parser": "^4.4.1", + "tinyglobby": "^0.2.15" }, "files": [ "build", diff --git a/packages/cli-config-android/src/config/findComponentDescriptors.ts b/packages/cli-config-android/src/config/findComponentDescriptors.ts index b86b38c95..9b1d754c6 100644 --- a/packages/cli-config-android/src/config/findComponentDescriptors.ts +++ b/packages/cli-config-android/src/config/findComponentDescriptors.ts @@ -1,6 +1,6 @@ import fs from 'fs'; import path from 'path'; -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import {extractComponentDescriptors} from './extractComponentDescriptors'; import {unixifyPaths} from '@react-native-community/cli-tools'; @@ -18,9 +18,9 @@ export function findComponentDescriptors(packageRoot: string) { const globPattern = jsSrcsDir ? `${jsSrcsDir}/**/*{.js,.jsx,.ts,.tsx}` : '**/*{.js,.jsx,.ts,.tsx}'; - const files = glob.sync(globPattern, { + const files = glob.globSync(globPattern, { cwd: unixifyPaths(packageRoot), - onlyFiles: true, + expandDirectories: false, ignore: ['**/node_modules/**'], }); const codegenComponent = files diff --git a/packages/cli-config-android/src/config/findManifest.ts b/packages/cli-config-android/src/config/findManifest.ts index ed284b962..e75e5a86d 100644 --- a/packages/cli-config-android/src/config/findManifest.ts +++ b/packages/cli-config-android/src/config/findManifest.ts @@ -6,13 +6,14 @@ * */ -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import path from 'path'; import {unixifyPaths} from '@react-native-community/cli-tools'; export default function findManifest(folder: string) { - let manifestPaths = glob.sync('**/AndroidManifest.xml', { + let manifestPaths = glob.globSync('**/AndroidManifest.xml', { cwd: unixifyPaths(folder), + expandDirectories: false, ignore: [ '**/build/**', '**/debug/**', diff --git a/packages/cli-config-android/src/config/findPackageClassName.ts b/packages/cli-config-android/src/config/findPackageClassName.ts index 6a72848b7..b023e1e17 100644 --- a/packages/cli-config-android/src/config/findPackageClassName.ts +++ b/packages/cli-config-android/src/config/findPackageClassName.ts @@ -7,7 +7,7 @@ */ import fs from 'fs'; -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import path from 'path'; import {unixifyPaths} from '@react-native-community/cli-tools'; @@ -23,9 +23,9 @@ export function getMainActivityFiles( patternArray.push('.java', '.kt'); } - return glob.sync(`**/*{${patternArray.join(',')}}`, { + return glob.globSync(`**/*{${patternArray.join(',')}}`, { cwd: unixifyPaths(folder), - onlyFiles: true, + expandDirectories: false, ignore: ['**/.cxx/**'], }); } diff --git a/packages/cli-config-apple/package.json b/packages/cli-config-apple/package.json index 432ef1342..0c6a149a1 100644 --- a/packages/cli-config-apple/package.json +++ b/packages/cli-config-apple/package.json @@ -10,7 +10,7 @@ "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "tinyglobby": "^0.2.15" }, "devDependencies": { "@react-native-community/cli-types": "20.0.2", diff --git a/packages/cli-config-apple/src/config/findAllPodfilePaths.ts b/packages/cli-config-apple/src/config/findAllPodfilePaths.ts index 610dc4a29..49aeeac98 100644 --- a/packages/cli-config-apple/src/config/findAllPodfilePaths.ts +++ b/packages/cli-config-apple/src/config/findAllPodfilePaths.ts @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. * */ -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import {unixifyPaths} from '@react-native-community/cli-tools'; // These folders will be excluded from search to speed it up @@ -14,8 +14,9 @@ const GLOB_EXCLUDE_PATTERN = [ ]; export default function findAllPodfilePaths(cwd: string) { - return glob.sync('**/Podfile', { + return glob.globSync('**/Podfile', { cwd: unixifyPaths(cwd), + expandDirectories: false, ignore: GLOB_EXCLUDE_PATTERN, // Stop unbounded globbing and infinite loops for projects // with deeply nested subdirectories. The most likely result diff --git a/packages/cli-config-apple/src/config/findPodspec.ts b/packages/cli-config-apple/src/config/findPodspec.ts index 666da0a35..1f5fddfdb 100644 --- a/packages/cli-config-apple/src/config/findPodspec.ts +++ b/packages/cli-config-apple/src/config/findPodspec.ts @@ -1,9 +1,12 @@ -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import path from 'path'; import {unixifyPaths} from '@react-native-community/cli-tools'; export default function findPodspec(folder: string): string | null { - const podspecs = glob.sync('*.podspec', {cwd: unixifyPaths(folder)}); + const podspecs = glob.globSync('*.podspec', { + cwd: unixifyPaths(folder), + expandDirectories: false, + }); if (podspecs.length === 0) { return null; diff --git a/packages/cli-config/package.json b/packages/cli-config/package.json index c6125e26b..8bab6cca6 100644 --- a/packages/cli-config/package.json +++ b/packages/cli-config/package.json @@ -12,7 +12,6 @@ "chalk": "^4.1.2", "cosmiconfig": "^9.0.0", "deepmerge": "^4.3.0", - "fast-glob": "^3.3.2", "joi": "^17.2.1" }, "files": [ diff --git a/packages/cli-link-assets/package.json b/packages/cli-link-assets/package.json index 06b62a0d1..922b0876b 100644 --- a/packages/cli-link-assets/package.json +++ b/packages/cli-link-assets/package.json @@ -14,10 +14,10 @@ "@react-native-community/cli-platform-ios": "20.0.2", "@react-native-community/cli-tools": "20.0.2", "chalk": "^4.1.2", - "fast-glob": "^3.3.2", "fast-xml-parser": "^4.4.1", "opentype.js": "^1.3.4", "plist": "^3.1.0", + "tinyglobby": "^0.2.15", "xcode": "^3.0.1" }, "files": [ diff --git a/packages/cli-link-assets/src/tools/helpers/font/androidFontAssetHelpers.ts b/packages/cli-link-assets/src/tools/helpers/font/androidFontAssetHelpers.ts index 1862effcb..4e4cdc72e 100644 --- a/packages/cli-link-assets/src/tools/helpers/font/androidFontAssetHelpers.ts +++ b/packages/cli-link-assets/src/tools/helpers/font/androidFontAssetHelpers.ts @@ -2,7 +2,7 @@ import {isProjectUsingKotlin} from '@react-native-community/cli-platform-android import {CLIError, logger} from '@react-native-community/cli-tools'; import {XMLBuilder, XMLParser} from 'fast-xml-parser'; import fs from 'fs-extra'; -import glob from 'fast-glob'; +import glob from 'tinyglobby'; import OpenType from 'opentype.js'; import path from 'path'; @@ -77,8 +77,9 @@ function convertToAndroidResourceName(str: string) { function getProjectFilePath(rootPath: string, name: string) { const isUsingKotlin = isProjectUsingKotlin(rootPath); const ext = isUsingKotlin ? 'kt' : 'java'; - const filePath = glob.sync( + const filePath = glob.globSync( path.join(rootPath, `app/src/main/java/**/${name}.${ext}`), + {expandDirectories: false}, )[0]; return filePath; } diff --git a/scripts/build.js b/scripts/build.js index 9fbad060a..b66f16964 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -20,7 +20,7 @@ const fs = require('fs'); const path = require('path'); -const glob = require('fast-glob'); +const glob = require('tinyglobby'); const babel = require('@babel/core'); const chalk = require('chalk'); const micromatch = require('micromatch'); @@ -55,9 +55,7 @@ function getBuildPath(file, buildFolder) { function buildNodePackage(p) { const srcDir = path.resolve(p, SRC_DIR); const pattern = path.resolve(srcDir, '**/*'); - const files = glob.sync(pattern, { - nodir: true, - }); + const files = glob.globSync(pattern, {expandDirectories: false}); process.stdout.write(adjustToTerminalWidth(`${path.basename(p)}\n`)); diff --git a/scripts/linkPackages.js b/scripts/linkPackages.js index c0658cd1c..3852612fe 100644 --- a/scripts/linkPackages.js +++ b/scripts/linkPackages.js @@ -1,9 +1,11 @@ const execa = require('execa'); const chalk = require('chalk'); const path = require('path'); -const glob = require('fast-glob'); +const glob = require('tinyglobby'); -const projects = glob.sync('packages/*/package.json'); +const projects = glob.globSync('packages/*/package.json', { + expandDirectories: false, +}); projects.forEach((project) => { const cwd = path.dirname(project); diff --git a/yarn.lock b/yarn.lock index 35e62f0f4..60c02f423 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2255,6 +2255,11 @@ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== +"@types/picomatch@^4.0.2": + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/picomatch/-/picomatch-4.0.2.tgz#85a232bafed4121527cbf70c0ef461b46b2cc10b" + integrity sha512-qHHxQ+P9PysNEGbALT8f8YOSHW0KJu6l2xU8DYY0fu/EmGxXdVnuTLvFUvBgPJMSqXq29SYHveejeAha+4AYgA== + "@types/plist@^3.0.5": version "3.0.5" resolved "https://registry.yarnpkg.com/@types/plist/-/plist-3.0.5.tgz#9a0c49c0f9886c8c8696a7904dd703f6284036e0" @@ -4783,17 +4788,6 @@ fast-glob@^3.2.9, fast-glob@^3.3.1: merge2 "^1.3.0" micromatch "^4.0.4" -fast-glob@^3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" - integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" - merge2 "^1.3.0" - micromatch "^4.0.4" - fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" @@ -4825,6 +4819,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -8521,6 +8520,11 @@ picomatch@^2.0.4, picomatch@^2.0.7, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== + pidtree@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -10048,6 +10052,14 @@ tiny-inflate@^1.0.3: resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"