From 90d6c7c0ba5a36a6666d64218227e63e8c2c3f00 Mon Sep 17 00:00:00 2001 From: Thomas Heartman Date: Mon, 20 Nov 2023 12:42:24 +0100 Subject: [PATCH] chore: remove usage of feature naming pattern flag (#5364) In preparation for this feature going GA --- .../feature/FeatureForm/FeatureForm.tsx | 6 +- .../ProjectEnterpriseSettingsForm.tsx | 202 ++++++++---------- frontend/src/interfaces/uiConfig.ts | 1 - .../__snapshots__/create-config.test.ts.snap | 1 - .../export-import.e2e.test.ts | 1 - .../feature-toggle/feature-toggle-service.ts | 23 +- .../tests/feature-toggle-service.e2e.test.ts | 2 +- src/lib/types/experimental.ts | 5 - src/server-dev.ts | 1 - src/test/e2e/api/client/feature.e2e.test.ts | 1 - 10 files changed, 108 insertions(+), 135 deletions(-) diff --git a/frontend/src/component/feature/FeatureForm/FeatureForm.tsx b/frontend/src/component/feature/FeatureForm/FeatureForm.tsx index 2da886aa89..436c625e64 100644 --- a/frontend/src/component/feature/FeatureForm/FeatureForm.tsx +++ b/frontend/src/component/feature/FeatureForm/FeatureForm.tsx @@ -23,7 +23,6 @@ import React from 'react'; import { useAuthPermissions } from 'hooks/api/getters/useAuth/useAuthPermissions'; import { FeatureNamingType } from 'interfaces/project'; import { FeatureNamingPatternInfo } from '../FeatureNamingPatternInfo/FeatureNamingPatternInfo'; -import { useUiFlag } from 'hooks/useUiFlag'; interface IFeatureToggleForm { type: string; @@ -122,15 +121,12 @@ const FeatureForm: React.FC = ({ const navigate = useNavigate(); const { permissions } = useAuthPermissions(); const editable = mode !== 'Edit'; - const featureNamingPatternEnabled = useUiFlag('featureNamingPattern'); const renderToggleDescription = () => { return featureTypes.find((toggle) => toggle.id === type)?.description; }; - const displayFeatureNamingInfo = Boolean( - featureNamingPatternEnabled && featureNaming?.pattern, - ); + const displayFeatureNamingInfo = Boolean(featureNaming?.pattern); React.useEffect(() => { if (featureNaming?.pattern && validateToggleName && name) { diff --git a/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx b/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx index 559d04e590..41f54c664d 100644 --- a/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx +++ b/frontend/src/component/project/Project/ProjectEnterpriseSettingsForm/ProjectEnterpriseSettingsForm.tsx @@ -136,7 +136,6 @@ const ProjectEnterpriseSettingsForm: React.FC = clearErrors, }) => { const privateProjects = useUiFlag('privateProjects'); - const shouldShowFlagNaming = useUiFlag('featureNamingPattern'); const { setPreviousPattern, trackPattern } = useFeatureNamePatternTracking(); @@ -253,115 +252,104 @@ const ProjectEnterpriseSettingsForm: React.FC = options={projectModeOptions} /> - - - Feature flag naming pattern? - - - - -

- Define a{' '} - - JavaScript RegEx - {' '} - used to enforce feature flag names - within this project. The regex will be - surrounded by a leading ^{' '} - and a trailing $. -

-

- Leave it empty if you don’t want to add - a naming pattern. -

-
-
- - - ^ - - ), - endAdornment: ( - - $ - - ), - }} - type={'text'} - value={featureNamingPattern || ''} - error={Boolean(errors.featureNamingPattern)} - errorText={errors.featureNamingPattern} - onChange={(e) => - onSetFeatureNamingPattern( - e.target.value, - ) - } - /> - -

- The example and description will be - shown to users when they create a new - feature flag in this project. -

-
+ + + Feature flag naming pattern? + + + + +

+ Define a{' '} + + JavaScript RegEx + {' '} + used to enforce feature flag names within this + project. The regex will be surrounded by a + leading ^ and a trailing{' '} + $. +

+

+ Leave it empty if you don’t want to add a naming + pattern. +

+
+
+ + + ^ + + ), + endAdornment: ( + + $ + + ), + }} + type={'text'} + value={featureNamingPattern || ''} + error={Boolean(errors.featureNamingPattern)} + errorText={errors.featureNamingPattern} + onChange={(e) => + onSetFeatureNamingPattern(e.target.value) + } + /> + +

+ The example and description will be shown to + users when they create a new feature flag in + this project. +

+
- - onSetFeatureNamingExample( - e.target.value, - ) - } - /> - .. + + onSetFeatureNamingExample(e.target.value) + } + /> + .. The flag name should contain the project name, the feature name, and the ticket number, each separated by a dot.`} - multiline - minRows={5} - value={featureNamingDescription || ''} - onChange={(e) => - onSetFeatureNamingDescription( - e.target.value, - ) - } - /> -
-
- } - /> + multiline + minRows={5} + value={featureNamingDescription || ''} + onChange={(e) => + onSetFeatureNamingDescription(e.target.value) + } + /> +
+ {children} ); diff --git a/frontend/src/interfaces/uiConfig.ts b/frontend/src/interfaces/uiConfig.ts index ffb6884c5c..41be2d88d3 100644 --- a/frontend/src/interfaces/uiConfig.ts +++ b/frontend/src/interfaces/uiConfig.ts @@ -61,7 +61,6 @@ export type UiFlags = { customRootRolesKillSwitch?: boolean; strategyVariant?: boolean; lastSeenByEnvironment?: boolean; - featureNamingPattern?: boolean; doraMetrics?: boolean; variantTypeNumber?: boolean; privateProjects?: boolean; diff --git a/src/lib/__snapshots__/create-config.test.ts.snap b/src/lib/__snapshots__/create-config.test.ts.snap index 6cb1885dc1..4ea4c88925 100644 --- a/src/lib/__snapshots__/create-config.test.ts.snap +++ b/src/lib/__snapshots__/create-config.test.ts.snap @@ -84,7 +84,6 @@ exports[`should create default config 1`] = ` "doraMetrics": false, "embedProxy": true, "embedProxyFrontend": true, - "featureNamingPattern": false, "featureSearchAPI": false, "featureSearchFrontend": false, "featuresExportImport": true, diff --git a/src/lib/features/export-import-toggles/export-import.e2e.test.ts b/src/lib/features/export-import-toggles/export-import.e2e.test.ts index 9095b48ac1..06f49a6103 100644 --- a/src/lib/features/export-import-toggles/export-import.e2e.test.ts +++ b/src/lib/features/export-import-toggles/export-import.e2e.test.ts @@ -159,7 +159,6 @@ beforeAll(async () => { experimental: { flags: { featuresExportImport: true, - featureNamingPattern: true, dependentFeatures: true, }, }, diff --git a/src/lib/features/feature-toggle/feature-toggle-service.ts b/src/lib/features/feature-toggle/feature-toggle-service.ts index 9e665cde69..6a42310171 100644 --- a/src/lib/features/feature-toggle/feature-toggle-service.ts +++ b/src/lib/features/feature-toggle/feature-toggle-service.ts @@ -1168,22 +1168,21 @@ class FeatureToggleService { projectId: string, featureNames: string[], ): Promise { - if (this.flagResolver.isEnabled('featureNamingPattern')) { - const project = await this.projectStore.get(projectId); - const patternData = project.featureNaming; - const namingPattern = patternData?.pattern; + const project = await this.projectStore.get(projectId); + const patternData = project.featureNaming; + const namingPattern = patternData?.pattern; - if (namingPattern) { - const result = checkFeatureFlagNamesAgainstPattern( - featureNames, - namingPattern, - ); + if (namingPattern) { + const result = checkFeatureFlagNamesAgainstPattern( + featureNames, + namingPattern, + ); - if (result.state === 'invalid') { - return { ...result, featureNaming: patternData }; - } + if (result.state === 'invalid') { + return { ...result, featureNaming: patternData }; } } + return { state: 'valid' }; } diff --git a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts index 974c51c45e..0093f71b18 100644 --- a/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts +++ b/src/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.ts @@ -39,7 +39,7 @@ const irrelevantDate = new Date(); beforeAll(async () => { const config = createTestConfig({ experimental: { - flags: { featureNamingPattern: true, playgroundImprovements: true }, + flags: { playgroundImprovements: true }, }, }); db = await dbInit( diff --git a/src/lib/types/experimental.ts b/src/lib/types/experimental.ts index d6825d5eb7..7b5e15bccd 100644 --- a/src/lib/types/experimental.ts +++ b/src/lib/types/experimental.ts @@ -23,7 +23,6 @@ export type IFlagKey = | 'filterInvalidClientMetrics' | 'lastSeenByEnvironment' | 'customRootRolesKillSwitch' - | 'featureNamingPattern' | 'doraMetrics' | 'variantTypeNumber' | 'privateProjects' @@ -116,10 +115,6 @@ const flags: IFlags = { process.env.UNLEASH_EXPERIMENTAL_CUSTOM_ROOT_ROLES_KILL_SWITCH, false, ), - featureNamingPattern: parseEnvVarBoolean( - process.env.UNLEASH_EXPERIMENTAL_FEATURE_NAMING_PATTERN, - false, - ), doraMetrics: parseEnvVarBoolean( process.env.UNLEASH_EXPERIMENTAL_DORA_METRICS, false, diff --git a/src/server-dev.ts b/src/server-dev.ts index 5755f862a3..37271519ee 100644 --- a/src/server-dev.ts +++ b/src/server-dev.ts @@ -38,7 +38,6 @@ process.nextTick(async () => { anonymiseEventLog: false, responseTimeWithAppNameKillSwitch: false, lastSeenByEnvironment: true, - featureNamingPattern: true, doraMetrics: true, variantTypeNumber: true, privateProjects: true, diff --git a/src/test/e2e/api/client/feature.e2e.test.ts b/src/test/e2e/api/client/feature.e2e.test.ts index b2fe54eec0..c68de4738a 100644 --- a/src/test/e2e/api/client/feature.e2e.test.ts +++ b/src/test/e2e/api/client/feature.e2e.test.ts @@ -21,7 +21,6 @@ beforeAll(async () => { experimental: { flags: { strictSchemaValidation: true, - featureNamingPattern: true, dependentFeatures: true, }, },