@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
58 lines (57 loc) • 2.05 kB
JavaScript
import { getSimpleHash } from '@directus/utils';
import { customAlphabet } from 'nanoid/non-secure';
// Fallback to original random alias generator
const generateRandomAlias = customAlphabet('abcdefghijklmnopqrstuvwxyz', 5);
// Context-aware alias generator
export function generateAlias(context = '') {
if (context) {
return generateDeterministicAlias(context);
}
return generateRandomAlias();
}
// Create a deterministic alias for general query contexts
export function generateQueryAlias(table, query, path = '') {
const context = JSON.stringify({
table,
path,
sort: query.sort,
group: query.group,
aggregate: query.aggregate,
// Exclude: limit, offset, page, search, filter - these are execution parameters
// that don't affect the underlying query structure requiring aliases
});
return generateDeterministicAlias(context);
}
// Create a deterministic context for relational count aliases
export function generateRelationalQueryAlias(table, column, collectionName, options) {
const context = JSON.stringify({
table,
column,
collectionName,
filter: options?.relationalCountOptions?.query?.filter,
});
return generateDeterministicAlias(context);
}
// Create a deterministic alias for join contexts
export function generateJoinAlias(collection, path, relationType, parentFields = '') {
const context = JSON.stringify({
collection,
path: path.join('.'),
relationType,
parentFields,
});
return generateDeterministicAlias(context);
}
// Generate deterministic alias based on context
function generateDeterministicAlias(context = '') {
const hash = getSimpleHash(context);
const alphabet = 'abcdefghijklmnopqrstuvwxyz';
let result = '';
let num = parseInt(hash, 16);
// Generate 5 character alias
for (let i = 0; i < 5; i++) {
result += alphabet[num % alphabet.length];
num = Math.floor(num / alphabet.length);
}
return result;
}