Skip to content

Commit 2e57e55

Browse files
limit number of attempts to generated suggested app name
1 parent 5c4971f commit 2e57e55

File tree

2 files changed

+53
-1
lines changed

2 files changed

+53
-1
lines changed

packages/cli-kit/src/public/node/fs.test.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,29 @@ describe('makeDirectoryWithRandomName', () => {
219219
})
220220
})
221221

222+
test('returns an empty string if unable to generate an available name', async () => {
223+
await inTemporaryDirectory(async (tmpDir) => {
224+
// Given
225+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('taken')
226+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('directory')
227+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('taken')
228+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('directory')
229+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('taken')
230+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('directory')
231+
232+
const content = 'test'
233+
const filePath = joinPath(tmpDir, 'taken-directory-app')
234+
await writeFile(filePath, content)
235+
236+
// When
237+
const got = await generateRandomNameForSubdirectory({suffix: 'app', directory: tmpDir})
238+
239+
// Then
240+
expect(got).toEqual('')
241+
expect(takeRandomFromArray).toHaveBeenCalledTimes(6)
242+
})
243+
})
244+
222245
test('rerolls the name if an invalid name is produced', async () => {
223246
await inTemporaryDirectory(async (tmpDir) => {
224247
// Given
@@ -239,6 +262,29 @@ describe('makeDirectoryWithRandomName', () => {
239262
expect(takeRandomFromArray).toHaveBeenCalledTimes(4)
240263
})
241264
})
265+
266+
test('returns an empty string if unable to generate a valid name', async () => {
267+
await inTemporaryDirectory(async (tmpDir) => {
268+
// Given
269+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('invalid')
270+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('name')
271+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('invalid')
272+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('name')
273+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('invalid')
274+
vi.mocked(takeRandomFromArray).mockReturnValueOnce('name')
275+
276+
// When
277+
const got = await generateRandomNameForSubdirectory({
278+
suffix: 'app',
279+
directory: tmpDir,
280+
isValidName: (name: string) => name !== 'invalid-name-app',
281+
})
282+
283+
// Then
284+
expect(got).toEqual('')
285+
expect(takeRandomFromArray).toHaveBeenCalledTimes(6)
286+
})
287+
})
242288
})
243289

244290
describe('readFileSync', () => {

packages/cli-kit/src/public/node/fs.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,10 @@ interface GenerateRandomDirectoryOptions {
469469
/** Type of word to use for random name. */
470470
family?: RandomNameFamily
471471

472-
/** Criteria predicate for generated name */
472+
/** Used to to track how many attempts have been made to generate the name. */
473+
attempts?: number
474+
475+
/** Predicate for validating the generated name. */
473476
isValidName?: (name: string) => boolean
474477
}
475478

@@ -483,6 +486,9 @@ const defaultIsValidName = () => true
483486
* @returns It returns the name of the directory.
484487
*/
485488
export async function generateRandomNameForSubdirectory(options: GenerateRandomDirectoryOptions): Promise<string> {
489+
options.attempts = (options.attempts || 0) + 1
490+
if (options.attempts > 3) return ''
491+
486492
const generated = `${getRandomName(options.family ?? 'business')}-${options.suffix}`
487493

488494
const validName = (options.isValidName ?? defaultIsValidName)(generated)

0 commit comments

Comments
 (0)