directus
1import { getSimpleHash } from '@directus/utils';
2/**
3* Generate an index name for a given collection + fields combination.
4*
5* Is based on the default index name generation of knex, but limits the index to a maximum of 64
6* characters (the max length for MySQL and MariaDB).
7*
8* @see
9* https://github.com/knex/knex/blob/fff6eb15d7088d4198650a2c6e673dedaf3b8f36/lib/schema/tablecompiler.js#L282-L297
10*/
11export function getDefaultIndexName(
12type: 'unique' | 'foreign' | 'index',
13collection: string,
14fields: string | string[],
15): string {
16if (!Array.isArray(fields)) fields = fields ? [fields] : [];
17const table = collection.replace(/\.|-/g, '_');
18const indexName = (table + '_' + fields.join('_') + '_' + type).toLowerCase();
19
20if (indexName.length <= 60) return indexName;
21
22const suffix = `__${getSimpleHash(indexName)}_${type}`;
23const prefix = indexName.substring(0, 60 - suffix.length);
24
25return `${prefix}${suffix}`;
26}
27