( existingEntities: T[], prefix: string )
| 71 | * @returns Next available name (e.g., "Folder 3") |
| 72 | */ |
| 73 | export function generateIncrementalName<T extends NameableEntity>( |
| 74 | existingEntities: T[], |
| 75 | prefix: string |
| 76 | ): string { |
| 77 | const pattern = new RegExp(`^${prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')} (\\d+)$`) |
| 78 | |
| 79 | const existingNumbers = existingEntities |
| 80 | .map((entity) => entity.name.match(pattern)) |
| 81 | .filter((match) => match !== null) |
| 82 | .map((match) => Number.parseInt(match![1], 10)) |
| 83 | |
| 84 | const nextNumber = existingNumbers.length > 0 ? Math.max(...existingNumbers) + 1 : 1 |
| 85 | |
| 86 | return `${prefix} ${nextNumber}` |
| 87 | } |
| 88 | |
| 89 | /** |
| 90 | * Generates a random cosmos-themed workspace name |
no test coverage detected