Add label matcher validation to support UTF-8 characters
This commit is contained in:
+39
-2
@@ -49,6 +49,38 @@ export interface AmRoutesExpandedFormProps {
|
|||||||
defaults?: Partial<FormAmRoute>;
|
defaults?: Partial<FormAmRoute>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function unwrapQuotes(value: string): { unquoted: string; hasQuotes: boolean } {
|
||||||
|
if (value.startsWith('"') && value.endsWith('"')) {
|
||||||
|
return { unquoted: value.slice(1, -1), hasQuotes: true };
|
||||||
|
}
|
||||||
|
return { unquoted: value, hasQuotes: false };
|
||||||
|
}
|
||||||
|
|
||||||
|
const matcherValueValidator = {
|
||||||
|
containsReservedCharacter: (value: string) => {
|
||||||
|
const { unquoted, hasQuotes } = unwrapQuotes(value);
|
||||||
|
const reservedCharacters = ['{', '}', '!', '=', '~', '\\', '"'];
|
||||||
|
|
||||||
|
// Reserved characters are allowed ONLY IF wrapped in quotes
|
||||||
|
if (hasQuotes) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return reservedCharacters.some((char) => unquoted.includes(char)) ? 'Contains reserved character.' : true;
|
||||||
|
},
|
||||||
|
containsUnescapedCharacters: (value: string) => {
|
||||||
|
const unescapedQuotesRegex = /(?<!\\)"/g;
|
||||||
|
const unescapedBackslashRegex = /(?<!\\)\\[^\\"]/g;
|
||||||
|
const { unquoted } = unwrapQuotes(value);
|
||||||
|
|
||||||
|
return unescapedQuotesRegex.test(unquoted)
|
||||||
|
? 'Contains unescaped double quotes.'
|
||||||
|
: unescapedBackslashRegex.test(unquoted)
|
||||||
|
? 'Contains unescaped backslash.'
|
||||||
|
: true;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
export const AmRoutesExpandedForm = ({
|
export const AmRoutesExpandedForm = ({
|
||||||
actionButtons,
|
actionButtons,
|
||||||
receivers,
|
receivers,
|
||||||
@@ -105,7 +137,9 @@ export const AmRoutesExpandedForm = ({
|
|||||||
error={errors.object_matchers?.[index]?.name?.message}
|
error={errors.object_matchers?.[index]?.name?.message}
|
||||||
>
|
>
|
||||||
<Input
|
<Input
|
||||||
{...register(`object_matchers.${index}.name`, { required: 'Field is required' })}
|
{...register(`object_matchers.${index}.name`, {
|
||||||
|
required: 'Field is required',
|
||||||
|
})}
|
||||||
defaultValue={field.name}
|
defaultValue={field.name}
|
||||||
placeholder="label"
|
placeholder="label"
|
||||||
autoFocus
|
autoFocus
|
||||||
@@ -134,7 +168,10 @@ export const AmRoutesExpandedForm = ({
|
|||||||
error={errors.object_matchers?.[index]?.value?.message}
|
error={errors.object_matchers?.[index]?.value?.message}
|
||||||
>
|
>
|
||||||
<Input
|
<Input
|
||||||
{...register(`object_matchers.${index}.value`, { required: 'Field is required' })}
|
{...register(`object_matchers.${index}.value`, {
|
||||||
|
required: 'Field is required',
|
||||||
|
validate: matcherValueValidator,
|
||||||
|
})}
|
||||||
defaultValue={field.value}
|
defaultValue={field.value}
|
||||||
placeholder="value"
|
placeholder="value"
|
||||||
/>
|
/>
|
||||||
|
|||||||
Reference in New Issue
Block a user