From 8c21c94c08b32ad803dd906abefc609341ea4134 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 | 2 +- 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 | 60 ++++++++++++++----- 16 files changed, 83 insertions(+), 43 deletions(-) diff --git a/package.json b/package.json index bae3b2680..16e80d0f0 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,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 +52,7 @@ "prettier": "2.8.8", "slash": "^3.0.0", "string-length": "^2.0.0", + "tinyglobby": "^0.2.14", "typescript": "^5.2.0" }, "resolutions": { diff --git a/packages/cli-clean/package.json b/packages/cli-clean/package.json index 8eab37c5f..d902305ec 100644 --- a/packages/cli-clean/package.json +++ b/packages/cli-clean/package.json @@ -11,7 +11,7 @@ "@react-native-community/cli-tools": "19.0.0", "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "tinyglobby": "^0.2.14" }, "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 862d75b5a..f6fb691fd 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": "19.0.0", "chalk": "^4.1.2", - "fast-glob": "^3.3.2", - "fast-xml-parser": "^4.4.1" + "fast-xml-parser": "^4.4.1", + "tinyglobby": "^0.2.14" }, "files": [ "build", diff --git a/packages/cli-config-android/src/config/findComponentDescriptors.ts b/packages/cli-config-android/src/config/findComponentDescriptors.ts index cb4fe5afd..da86c18af 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 dd8b36050..b70161995 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 9438c3852..32a40dadf 100644 --- a/packages/cli-config-apple/package.json +++ b/packages/cli-config-apple/package.json @@ -10,7 +10,7 @@ "@react-native-community/cli-tools": "19.0.0", "chalk": "^4.1.2", "execa": "^5.0.0", - "fast-glob": "^3.3.2" + "tinyglobby": "^0.2.14" }, "devDependencies": { "@react-native-community/cli-types": "19.0.0", 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 1a2b23a30..b5a64ceaa 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 49f436d91..6dfa3d83d 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": "19.0.0", "@react-native-community/cli-tools": "19.0.0", "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.14", "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 b2e69f3bc..77185282d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4769,17 +4769,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" @@ -4811,6 +4800,11 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fdir@^6.4.4: + version "6.4.6" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.4.6.tgz#2b268c0232697063111bbf3f64810a2a741ba281" + integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== + figures@3.2.0, figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -8507,6 +8501,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.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" + integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== + pidtree@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.6.0.tgz#90ad7b6d42d5841e69e0a2419ef38f8883aa057c" @@ -9701,7 +9700,16 @@ string-natural-compare@^3.0.1: resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -9796,7 +9804,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -9817,6 +9825,13 @@ strip-ansi@^5.0.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -10009,6 +10024,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.14: + version "0.2.14" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d" + integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== + dependencies: + fdir "^6.4.4" + picomatch "^4.0.2" + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10665,7 +10688,7 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -10683,6 +10706,15 @@ wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"