From a96ceb319770cd34dbd887157a9b9dd90da1a30c Mon Sep 17 00:00:00 2001 From: Tomasz Misiukiewicz Date: Fri, 12 Jan 2024 10:02:12 +0100 Subject: [PATCH] fix cleaning metro cache --- packages/cli-clean/package.json | 6 ++- .../cli-clean/src/__tests__/clean.test.ts | 31 +++++++++++++++- packages/cli-clean/src/clean.ts | 37 ++++++++++++++++--- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/packages/cli-clean/package.json b/packages/cli-clean/package.json index 1a0a512ed..105db2909 100644 --- a/packages/cli-clean/package.json +++ b/packages/cli-clean/package.json @@ -10,7 +10,8 @@ "dependencies": { "@react-native-community/cli-tools": "13.4.0", "chalk": "^4.1.2", - "execa": "^5.0.0" + "execa": "^5.0.0", + "glob": "^7.1.3" }, "files": [ "build", @@ -19,7 +20,8 @@ ], "devDependencies": { "@react-native-community/cli-types": "13.4.0", - "@types/prompts": "^2.4.4" + "@types/prompts": "^2.4.4", + "@types/glob": "^7.1.1" }, "homepage": "https://github.com/react-native-community/cli/tree/main/packages/cli-clean", "repository": { diff --git a/packages/cli-clean/src/__tests__/clean.test.ts b/packages/cli-clean/src/__tests__/clean.test.ts index a7833718c..022f805ca 100644 --- a/packages/cli-clean/src/__tests__/clean.test.ts +++ b/packages/cli-clean/src/__tests__/clean.test.ts @@ -1,11 +1,19 @@ import execa from 'execa'; import os from 'os'; import prompts from 'prompts'; -import {clean} from '../clean'; +import {clean, cleanDir} from '../clean'; +import {cleanup, getTempDirectory, writeFiles} from '../../../../jest/helpers'; +import fs from 'fs'; + +const DIR = getTempDirectory('temp-cache'); jest.mock('execa', () => jest.fn()); jest.mock('prompts', () => jest.fn()); +afterEach(() => { + cleanup(DIR); +}); + describe('clean', () => { const mockConfig: any = {}; @@ -48,4 +56,25 @@ describe('clean', () => { expect.anything(), ); }); + + it('should remove paths defined with patterns', async () => { + writeFiles(DIR, { + 'metro-cache/cache.txt': 'cache file', + 'metro-zxcvbnm/cache.txt': 'cache file', + }); + + await cleanDir(`${DIR}/metro-*`); + + expect(fs.readdirSync(DIR)).toEqual([]); + }); + + it('should remove paths defined without patterns', async () => { + writeFiles(DIR, { + 'metro-cache/cache.txt': 'cache file', + }); + + await cleanDir(`${DIR}/metro-cache`); + + expect(fs.readdirSync(DIR)).toEqual([]); + }); }); diff --git a/packages/cli-clean/src/clean.ts b/packages/cli-clean/src/clean.ts index 5a7d52785..5924ee347 100644 --- a/packages/cli-clean/src/clean.ts +++ b/packages/cli-clean/src/clean.ts @@ -1,4 +1,4 @@ -import {getLoader, prompt} from '@react-native-community/cli-tools'; +import {getLoader, logger, prompt} from '@react-native-community/cli-tools'; import type {Config as CLIConfig} from '@react-native-community/cli-types'; import chalk from 'chalk'; import execa from 'execa'; @@ -6,6 +6,7 @@ import {existsSync as fileExists, rm} from 'fs'; import os from 'os'; import path from 'path'; import {promisify} from 'util'; +import glob from 'glob'; type Args = { include?: string; @@ -28,13 +29,37 @@ type CleanGroups = { const DEFAULT_GROUPS = ['metro', 'watchman']; const rmAsync = promisify(rm); +const rmAsyncOptions = {maxRetries: 3, recursive: true, force: true}; -function cleanDir(directory: string): Promise { - if (!fileExists(directory)) { - return Promise.resolve(); - } +function isDirectoryPattern(directory: string): boolean { + return directory.endsWith('*') || directory.endsWith('?'); +} + +export async function cleanDir(directory: string): Promise { + try { + if (isDirectoryPattern(directory)) { + const directories = await new Promise((resolve, reject) => { + glob(directory, {}, (err, foundDirectories) => { + if (err) { + reject(err); + } else { + resolve(foundDirectories); + } + }); + }); - return rmAsync(directory, {maxRetries: 3, recursive: true, force: true}); + for (const dir of directories) { + await rmAsync(dir, rmAsyncOptions); + } + } else { + if (!fileExists(directory)) { + return; + } + await rmAsync(directory, rmAsyncOptions); + } + } catch (error) { + logger.error(`An error occurred while cleaning the directory: ${error}`); + } } async function promptForCaches(