[fix] Support non latin characters in schema names (#5063)

Fixes #4943

## How was it tested?
Local (front + /metadata)
Unit tests for utils

---------

Co-authored-by: Weiko <corentin@twenty.com>
This commit is contained in:
Marie
2024-04-23 13:37:29 +02:00
committed by GitHub
parent 824786ff04
commit ff39ba5a15
16 changed files with 236 additions and 13 deletions

View File

@ -0,0 +1,57 @@
import { formatMetadataLabelToMetadataNameOrThrows } from '~/pages/settings/data-model/utils/format-metadata-label-to-name.util';
const VALID_STRING_PATTERN = /^[a-zA-Z][a-zA-Z0-9 ]*$/;
describe('formatMetadataLabelToMetadataNameOrThrows', () => {
it('leaves strings unchanged if only latin characters', () => {
const input = 'testName';
expect(
formatMetadataLabelToMetadataNameOrThrows(input).match(
VALID_STRING_PATTERN,
)?.length,
).toBe(1);
expect(formatMetadataLabelToMetadataNameOrThrows(input)).toEqual(input);
});
it('leaves strings unchanged if only latin characters and digits', () => {
const input = 'testName123';
expect(
formatMetadataLabelToMetadataNameOrThrows(input).match(
VALID_STRING_PATTERN,
)?.length,
).toBe(1);
expect(formatMetadataLabelToMetadataNameOrThrows(input)).toEqual(input);
});
it('format strings with non latin characters', () => {
const input = 'בְרִבְרִ';
const expected = 'bRibRi';
expect(
formatMetadataLabelToMetadataNameOrThrows(input).match(
VALID_STRING_PATTERN,
)?.length,
).toBe(1);
expect(formatMetadataLabelToMetadataNameOrThrows(input)).toEqual(expected);
});
it('format strings with mixed characters', () => {
const input = 'aa2בְרִבְרִ';
const expected = 'aa2BRibRi';
expect(
formatMetadataLabelToMetadataNameOrThrows(input).match(
VALID_STRING_PATTERN,
)?.length,
).toBe(1);
expect(formatMetadataLabelToMetadataNameOrThrows(input)).toEqual(expected);
});
it('throws error if could not format', () => {
const input = '$$$***';
expect(() => formatMetadataLabelToMetadataNameOrThrows(input)).toThrow();
});
});

View File

@ -0,0 +1,26 @@
import toCamelCase from 'lodash.camelcase';
import { slugify, transliterate } from 'transliteration';
import { isDefined } from '~/utils/isDefined';
const VALID_STRING_PATTERN = /^[a-zA-Z][a-zA-Z0-9 ]*$/;
export const formatMetadataLabelToMetadataNameOrThrows = (
string: string,
): string => {
let formattedString = string;
if (isDefined(formattedString.match(VALID_STRING_PATTERN))) {
return toCamelCase(formattedString);
}
formattedString = toCamelCase(
slugify(transliterate(formattedString, { trim: true })),
);
if (!formattedString.match(VALID_STRING_PATTERN)) {
throw new Error(`"${string}" is not a valid name`);
}
return formattedString;
};