From 96d8eb8828a3c154786e27e5296b89d118221674 Mon Sep 17 00:00:00 2001 From: Emily Samoylov <93456589+emilys314@users.noreply.github.com> Date: Fri, 14 Feb 2025 15:19:09 -0500 Subject: [PATCH] Allow hyphens and period for env var (#3759) --- .../connectionTypes/__tests__/utils.spec.ts | 7 ++++--- .../connectionTypes/fields/UriFormField.tsx | 2 +- frontend/src/concepts/connectionTypes/utils.ts | 2 +- .../connectionTypes/validationUtils.ts | 7 ++----- .../manage/ConnectionTypeDataFieldModal.tsx | 18 +++++++----------- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/frontend/src/concepts/connectionTypes/__tests__/utils.spec.ts b/frontend/src/concepts/connectionTypes/__tests__/utils.spec.ts index fe603ad839..36686e080e 100644 --- a/frontend/src/concepts/connectionTypes/__tests__/utils.spec.ts +++ b/frontend/src/concepts/connectionTypes/__tests__/utils.spec.ts @@ -258,13 +258,14 @@ describe('isValidEnvVar', () => { expect(isValidEnvVar('NAME')).toBe(true); expect(isValidEnvVar('UNDERSCORE_NAME')).toBe(true); expect(isValidEnvVar('has_digits_1234')).toBe(true); + expect(isValidEnvVar('.dockerconfigjson')).toBe(true); }); it('should be invalid env var', () => { - expect(isValidEnvVar('.dot')).toBe(false); - expect(isValidEnvVar('has-dash')).toBe(false); - expect(isValidEnvVar('1_digit_as_first_char')).toBe(false); expect(isValidEnvVar('has space')).toBe(false); + expect(isValidEnvVar('has+=')).toBe(false); + expect(isValidEnvVar('has!$@#*')).toBe(false); + expect(isValidEnvVar('')).toBe(false); }); }); diff --git a/frontend/src/concepts/connectionTypes/fields/UriFormField.tsx b/frontend/src/concepts/connectionTypes/fields/UriFormField.tsx index 43ca3d0ce7..034f3ba211 100644 --- a/frontend/src/concepts/connectionTypes/fields/UriFormField.tsx +++ b/frontend/src/concepts/connectionTypes/fields/UriFormField.tsx @@ -56,7 +56,7 @@ const UriFormField: React.FC> = ({ : (_e, v) => { onChange(v); if (!isValid) { - setIsValid(validateUrl(value)); + setIsValid(validateUrl(v)); } } } diff --git a/frontend/src/concepts/connectionTypes/utils.ts b/frontend/src/concepts/connectionTypes/utils.ts index b52a16a703..1f1eecee57 100644 --- a/frontend/src/concepts/connectionTypes/utils.ts +++ b/frontend/src/concepts/connectionTypes/utils.ts @@ -118,7 +118,7 @@ export const fieldNameToEnvVar = (name: string): string => { return allUppercase; }; -export const ENV_VAR_NAME_REGEX = new RegExp('^[_a-zA-Z][_a-zA-Z0-9]*$'); +export const ENV_VAR_NAME_REGEX = new RegExp('^[-_.a-zA-Z0-9]+$'); export const isValidEnvVar = (name: string): boolean => ENV_VAR_NAME_REGEX.test(name); export const isUriConnectionType = (connectionType: ConnectionTypeConfigMapObj): boolean => diff --git a/frontend/src/concepts/connectionTypes/validationUtils.ts b/frontend/src/concepts/connectionTypes/validationUtils.ts index 4d117a30ac..613ac9b47c 100644 --- a/frontend/src/concepts/connectionTypes/validationUtils.ts +++ b/frontend/src/concepts/connectionTypes/validationUtils.ts @@ -5,7 +5,7 @@ import { isDuplicateExtension, } from '~/concepts/connectionTypes/fields/fieldUtils'; import { ConnectionTypeFieldType } from '~/concepts/connectionTypes/types'; -import { ENV_VAR_NAME_REGEX, isConnectionTypeDataField } from '~/concepts/connectionTypes/utils'; +import { isConnectionTypeDataField } from '~/concepts/connectionTypes/utils'; const baseFieldSchema = z.object({ name: z.string().min(1, { message: 'Name is required' }), @@ -17,10 +17,7 @@ const baseFieldPropertiesSchema = z.object({ }); const baseDataFieldPropertiesSchema = baseFieldSchema.extend({ - envVar: z.string().regex(ENV_VAR_NAME_REGEX, { - message: - 'Must start with a letter or underscore. Valid characters include letters, numbers, and underscores ( _ ).', - }), + envVar: z.string(), required: z.boolean().optional(), }); diff --git a/frontend/src/pages/connectionTypes/manage/ConnectionTypeDataFieldModal.tsx b/frontend/src/pages/connectionTypes/manage/ConnectionTypeDataFieldModal.tsx index 57fb52d5fc..54842b6c3d 100644 --- a/frontend/src/pages/connectionTypes/manage/ConnectionTypeDataFieldModal.tsx +++ b/frontend/src/pages/connectionTypes/manage/ConnectionTypeDataFieldModal.tsx @@ -11,11 +11,7 @@ import { TextInput, } from '@patternfly/react-core'; import { Modal } from '@patternfly/react-core/deprecated'; -import { - ExclamationCircleIcon, - OutlinedQuestionCircleIcon, - WarningTriangleIcon, -} from '@patternfly/react-icons'; +import { OutlinedQuestionCircleIcon, WarningTriangleIcon } from '@patternfly/react-icons'; import DashboardModalFooter from '~/concepts/dashboard/DashboardModalFooter'; import { ConnectionTypeDataField, @@ -81,7 +77,7 @@ export const ConnectionTypeDataFieldModal: React.FC = ({ const isEnvVarValid = !envVar || isValidEnvVar(envVar); - const isValid = isPropertiesValid && !!name && !!envVar && isEnvVarValid; + const isValid = isPropertiesValid && !!name && !!envVar; // Cast from specific type to generic type // eslint-disable-next-line @typescript-eslint/consistent-type-assertions,@typescript-eslint/no-explicit-any @@ -183,16 +179,16 @@ export const ConnectionTypeDataFieldModal: React.FC = ({ setData('envVar', value); }} data-testid="field-env-var-input" - validated={!isEnvVarValid ? 'error' : isEnvVarConflict ? 'warning' : 'default'} + validated={!isEnvVarValid || isEnvVarConflict ? 'warning' : 'default'} /> } + variant={isEnvVarValid ? 'default' : 'warning'} + icon={isEnvVarValid ? undefined : } > - Must start with a letter or underscore. Valid characters include letters, numbers, - and underscores ( _ ). + For highest compatibility, field must consist of alphanumeric characters, ( - ), ( _ + ), or ( . ) {isEnvVarConflict ? (