From f8861695774cc89cebb413ff59dacc71129ade71 Mon Sep 17 00:00:00 2001 From: Sahil Date: Thu, 29 Jun 2023 16:12:42 +0530 Subject: [PATCH] feat: added string util for easy translations Signed-off-by: Sahil --- chaoscenter/web/src/strings/String.tsx | 63 ++ .../web/src/strings/StringsContext.tsx | 18 + .../src/strings/StringsContextProvider.tsx | 24 + .../src/strings/__tests__/Strings.test.tsx | 152 ++++ chaoscenter/web/src/strings/index.ts | 4 + chaoscenter/web/src/strings/strings.en.yaml | 1 + chaoscenter/web/src/strings/types.ts | 794 ++++++++++++++++++ 7 files changed, 1056 insertions(+) create mode 100644 chaoscenter/web/src/strings/String.tsx create mode 100644 chaoscenter/web/src/strings/StringsContext.tsx create mode 100644 chaoscenter/web/src/strings/StringsContextProvider.tsx create mode 100644 chaoscenter/web/src/strings/__tests__/Strings.test.tsx create mode 100644 chaoscenter/web/src/strings/index.ts create mode 100644 chaoscenter/web/src/strings/strings.en.yaml create mode 100644 chaoscenter/web/src/strings/types.ts diff --git a/chaoscenter/web/src/strings/String.tsx b/chaoscenter/web/src/strings/String.tsx new file mode 100644 index 00000000000..bb1ca277f4e --- /dev/null +++ b/chaoscenter/web/src/strings/String.tsx @@ -0,0 +1,63 @@ +import React from 'react'; +import { get } from 'lodash-es'; +import { render } from 'mustache'; +import { useStringsContext, StringKeys } from './StringsContext'; + +export interface UseStringsReturn { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getString(key: StringKeys, vars?: Record): string; +} + +export function useStrings(): UseStringsReturn { + const { data: strings, getString } = useStringsContext(); + + return { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + getString(key: StringKeys, vars: Record = {}) { + if (typeof getString === 'function') { + return getString(key, vars); + } + + const template = get(strings, key); + + if (typeof template !== 'string') { + throw new Error(`No valid template with id "${key}" found in any namespace`); + } + + return render(template, { ...vars, $: strings }); + } + }; +} + +export interface StringProps extends React.DetailedHTMLProps, HTMLElement> { + stringID: StringKeys; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + vars?: Record; + useRichText?: boolean; + tagName: keyof JSX.IntrinsicElements; +} + +export function String(props: StringProps): React.ReactElement | null { + const { stringID, vars, useRichText, tagName: Tag, ...rest } = props; + const { getString } = useStrings(); + + try { + const text = getString(stringID, vars); + + return useRichText ? ( + + ) : ( + {text} + ); + } catch (e) { + if (process.env.NODE_ENV !== 'production') { + return {(e as any).message}; + } + + return null; + } +} + +String.defaultProps = { + tagName: 'span' +}; diff --git a/chaoscenter/web/src/strings/StringsContext.tsx b/chaoscenter/web/src/strings/StringsContext.tsx new file mode 100644 index 00000000000..c657f3872d2 --- /dev/null +++ b/chaoscenter/web/src/strings/StringsContext.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import type { StringsMap } from './types'; + +export type StringKeys = keyof StringsMap; + +export type { StringsMap }; + +export interface StringsContextValue { + data: StringsMap; + getString?(key: StringKeys, vars?: Record): string; +} + +export const StringsContext = React.createContext({} as StringsContextValue); + +export function useStringsContext(): StringsContextValue { + return React.useContext(StringsContext); +} diff --git a/chaoscenter/web/src/strings/StringsContextProvider.tsx b/chaoscenter/web/src/strings/StringsContextProvider.tsx new file mode 100644 index 00000000000..55837251638 --- /dev/null +++ b/chaoscenter/web/src/strings/StringsContextProvider.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import { StringsContext, StringsContextValue, StringsMap } from './StringsContext'; + +export interface StringsContextProviderProps extends Pick { + children: React.ReactNode; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + initialStrings?: Record; // temp prop for backward compatability +} + +export function StringsContextProvider(props: StringsContextProviderProps): React.ReactElement { + return ( + + {props.children} + + ); +} diff --git a/chaoscenter/web/src/strings/__tests__/Strings.test.tsx b/chaoscenter/web/src/strings/__tests__/Strings.test.tsx new file mode 100644 index 00000000000..661ca41b86c --- /dev/null +++ b/chaoscenter/web/src/strings/__tests__/Strings.test.tsx @@ -0,0 +1,152 @@ +import React from 'react'; +import { render } from '@testing-library/react'; +import { renderHook } from '@testing-library/react-hooks'; + +import { String, useStrings } from '../String'; +import { StringsContext } from '../StringsContext'; + +const value = { + data: { + a: { b: 'Test Value 1' }, + chaos: 'Chaos', + test: '{{ $.a.b }} in template', + test2: '{{ $.test }} again' + } +}; +describe('String tests', () => { + test('renders strings with simple id', () => { + const { container } = render( + + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + Chaos + +
+ `); + }); + + test('renders error when key not found', () => { + const { container } = render( + + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + Chaos + +
+ `); + }); + + test('renders strings with nested value', () => { + const { container } = render( + + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + Test Value 1 + +
+ `); + }); + + test('renders strings with self reference values', () => { + const { container } = render( + + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + Test Value 1 in template + +
+ `); + }); + + test('self reference only works for one level', () => { + const { container } = render( + + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + {{ $.a.b }} in template again + +
+ `); + }); +}); + +describe('useString tests', () => { + describe('getString', () => { + test('works with simple id', () => { + const wrapper = ({ children }: { children: React.ReactElement }): React.ReactElement => ( + {children} + ); + const { result } = renderHook(() => useStrings(), { wrapper }); + + expect(result.current.getString('chaos' as any)).toMatchInlineSnapshot(`"Chaos"`); + }); + + test('works with nested values', () => { + const wrapper = ({ children }: { children: React.ReactElement }): React.ReactElement => ( + {children} + ); + const { result } = renderHook(() => useStrings(), { wrapper }); + + expect(result.current.getString('a.b' as any)).toMatchInlineSnapshot(`"Test Value 1"`); + }); + + test('works with self reference values', () => { + const wrapper = ({ children }: { children: React.ReactElement }): React.ReactElement => ( + {children} + ); + const { result } = renderHook(() => useStrings(), { wrapper }); + + expect(result.current.getString('test' as any)).toMatchInlineSnapshot(`"Test Value 1 in template"`); + }); + + test('self reference works foor only one level', () => { + const wrapper = ({ children }: { children: React.ReactElement }): React.ReactElement => ( + {children} + ); + const { result } = renderHook(() => useStrings(), { wrapper }); + + expect(result.current.getString('test2' as any)).toMatchInlineSnapshot(`"{{ $.a.b }} in template again"`); + }); + }); + + test('Works with custom getString', () => { + const { container } = render( + key } as any}> + + + ); + + expect(container).toMatchInlineSnapshot(` +
+ + chaos.foo.bar.baz + +
+ `); + }); +}); diff --git a/chaoscenter/web/src/strings/index.ts b/chaoscenter/web/src/strings/index.ts new file mode 100644 index 00000000000..06c30678f29 --- /dev/null +++ b/chaoscenter/web/src/strings/index.ts @@ -0,0 +1,4 @@ +export { useStrings, String } from './String'; +export type { UseStringsReturn } from './String'; +export { useStringsContext, StringsContext } from './StringsContext'; +export type { StringKeys } from './StringsContext'; diff --git a/chaoscenter/web/src/strings/strings.en.yaml b/chaoscenter/web/src/strings/strings.en.yaml new file mode 100644 index 00000000000..d066f0de1a8 --- /dev/null +++ b/chaoscenter/web/src/strings/strings.en.yaml @@ -0,0 +1 @@ +litmus: litmus diff --git a/chaoscenter/web/src/strings/types.ts b/chaoscenter/web/src/strings/types.ts new file mode 100644 index 00000000000..ea07b592891 --- /dev/null +++ b/chaoscenter/web/src/strings/types.ts @@ -0,0 +1,794 @@ +/** +* This file is auto-generated. Please do not modify this file manually. +* Use the command `yarn strings` to regenerate this file. +*/ +export type PrimitiveObject = Record + +export interface StringsMap { + '404Error': unknown + 'FRI': unknown + 'MON': unknown + 'NASlash': unknown + 'SAT': unknown + 'SUN': unknown + 'THU': unknown + 'TUE': unknown + 'WED': unknown + 'aboutChaosCTL': unknown + 'accessToAllNamespaces': unknown + 'accessType': unknown + 'account': unknown + 'accountSettings': unknown + 'accountURL': unknown + 'actionItems': unknown + 'active': unknown + 'actualResilienceScore': unknown + 'add': unknown + 'addExperimentToChaosHub': unknown + 'addNewCluster': unknown + 'addNodeSelectorAgentDeployment': unknown + 'addProbe': unknown + 'addResilienceStep': unknown + 'addRow': unknown + 'addToChaosHub': unknown + 'addToTemplate': unknown + 'addTolerationAgentDeployment': unknown + 'addViewSummaryNotes': unknown + 'addtoHubLoading': unknown + 'advanced': unknown + 'advancedOptions': unknown + 'all': unknown + 'allChaosEnabled': unknown + 'allFaultsExecuted': unknown + 'allRuns': unknown + 'alreadyExists': PrimitiveObject<'value'> + 'appKind': unknown + 'appKindName': unknown + 'appLabel': unknown + 'appLabelName': unknown + 'appNameSpace': unknown + 'apply': unknown + 'applyChanges': unknown + 'at': unknown + 'atAGlance': unknown + 'authenticationType': unknown + 'averageResilienceScore': unknown + 'back': unknown + 'basic': unknown + 'blankCanvasDescription': unknown + 'blankCanvasTitle': unknown + 'blobLogsNotAvailable': unknown + 'cancel': unknown + 'cannotPushToDefault': unknown + 'cannotReRun': unknown + 'chaos': unknown + 'chaosComponentInstallation': unknown + 'chaosController': unknown + 'chaosEnableFailed': unknown + 'chaosEngineName': unknown + 'chaosEngineResult': unknown + 'chaosExperiment': unknown + 'chaosExperiments': unknown + 'chaosFaults': unknown + 'chaosHub': unknown + 'chaosHubExperiment': unknown + 'chaosHubFault': unknown + 'chaosHubNoExp': unknown + 'chaosHubNoFault': unknown + 'chaosHubNoSearchExperiment': PrimitiveObject<'searchTerm'> + 'chaosHubNoSearchFault': PrimitiveObject<'searchTerm'> + 'chaosHubReferenceFielPlaceholder': unknown + 'chaosHubStep1': unknown + 'chaosHubStep2': unknown + 'chaosHubStep3': unknown + 'chaosIncidentsDetected': unknown + 'chaosIncidentsDiscovered': unknown + 'chaosInfraVersionAvailable': PrimitiveObject<'version'> + 'chaosInfrastructureDesc': unknown + 'chaosInfrastructureDescription': unknown + 'chaosInfrastructureDetails': unknown + 'chaosInfrastructureLogs': unknown + 'chaosInfrastructureNamespace': unknown + 'chaosInfrastructureOverview': unknown + 'chaosInfrastructureSuccess': unknown + 'chaosInfrastructureText': unknown + 'chaosInfrastructures': unknown + 'chaosResultNotAvailable': unknown + 'chaosResults': unknown + 'chaosStudio': unknown + 'chaoshubDisconnectedWillSync': unknown + 'chaoshubs': unknown + 'checkConnection': unknown + 'checkLogs': unknown + 'checkStatus': unknown + 'chooseAccessType': unknown + 'chooseAuthenticationType': unknown + 'chooseHubAccess': unknown + 'clickDownload': unknown + 'clone': unknown + 'cloneExperiment': unknown + 'closeTuneConfirmation': unknown + 'closeTuneConfirmationDescription': unknown + 'clusterScopeDescription': unknown + 'clusterWide': unknown + 'clusterWideAccess': unknown + 'cmdDescription': unknown + 'cmdProbeDetails': unknown + 'cmdProbeTitle': unknown + 'collaborators': unknown + 'comingSoon': unknown + 'command': unknown + 'comparator': unknown + 'completed': unknown + 'configure': unknown + 'configureChaosInfrastructure': unknown + 'configureDetails': unknown + 'configureProperties': unknown + 'confirm': unknown + 'confirmText': unknown + 'connectChaosHub': unknown + 'connectHub': unknown + 'connectInfraKubernetes': unknown + 'connectInfraTooltip': unknown + 'connected': unknown + 'connectingChaosHub': unknown + 'connectionModal.method': unknown + 'connectionModal.options.option1.icon': unknown + 'connectionModal.options.option1.text': unknown + 'connectionModal.options.option2.icon': unknown + 'connectionModal.options.option2.text': unknown + 'connectionStatus': unknown + 'consoleLogs': unknown + 'continue': unknown + 'copyPrompt': unknown + 'copyPrompt1': unknown + 'copyPrompt2': unknown + 'crdCopyPrompt': unknown + 'createChaosExperiment': unknown + 'createNamespace': unknown + 'createRecurringSchedule': unknown + 'created': unknown + 'createdOn': unknown + 'creationTime': unknown + 'criteria': unknown + 'cronExpression': unknown + 'cronExpressionRequired': unknown + 'cronSelectOption': unknown + 'cronText': unknown + 'currentRun': unknown + 'currentUTCTime': unknown + 'customLabel': unknown + 'daily': unknown + 'dailyMessage': unknown + 'dateExecuted': unknown + 'dayOfMonthLabel': unknown + 'dayOfWeekLabel': unknown + 'degelateNotActive': unknown + 'delete': unknown + 'deleteChaosInfrastructure': unknown + 'deleteExperiment': unknown + 'deleteExperimentDesc': unknown + 'deleteExperimentHeading': unknown + 'deleteProbe': unknown + 'deleteProbeDesc': unknown + 'deleteProbeHeading': unknown + 'deleteSuccess': unknown + 'deployChaosInfrastructure': unknown + 'deployProbe': unknown + 'deploySetup': unknown + 'deployedOn': unknown + 'description': unknown + 'descriptionOptional': unknown + 'details': unknown + 'detailsAndProperties': unknown + 'disable': unknown + 'disableChaosInfrastructure': unknown + 'discard': unknown + 'discardExperiment': unknown + 'disconnectDescriptionClusterMode': unknown + 'disconnectDescriptionNamespaceMode': unknown + 'disconnected': unknown + 'done': unknown + 'download': unknown + 'downloadChaosInfrastructureManifest': unknown + 'downloadExperiment': unknown + 'downloadReportText': unknown + 'downloadRunReport': unknown + 'downloadSuccess': unknown + 'downloadYAML': unknown + 'downloadYAMLFile': unknown + 'downloadedSuccessfully': unknown + 'duration': unknown + 'edit': unknown + 'editChaosHub': unknown + 'editExperiment': unknown + 'editExperimentCopy': unknown + 'editExperimentOptions': unknown + 'editExperimentSame': unknown + 'editHubDescription': unknown + 'editInChaosStudio': unknown + 'editProbe': unknown + 'editSameExperimentDescription': unknown + 'editSameExperimentTitle': unknown + 'editYaml': unknown + 'editingChaosHub': unknown + 'effect': unknown + 'enableChaosInfraButton': unknown + 'enableChaosInfrastructure': unknown + 'enableChaosInfrastructureDesc': unknown + 'enableImageRegistryChanges': unknown + 'enableSSLCheck': unknown + 'enablingChaos': unknown + 'endTime': unknown + 'endedAt': unknown + 'endpoint': unknown + 'enterCustomCron': unknown + 'enterHubAccountURL': unknown + 'enterHubName': unknown + 'enterHubRepositoryBranch': unknown + 'enterHubRepositoryName': unknown + 'enterHubRepositoryURL': unknown + 'environment': unknown + 'environmentError': unknown + 'environments': unknown + 'error': unknown + 'errorApplyChanges': unknown + 'errorFetchName': unknown + 'executedBy': unknown + 'executedOn': unknown + 'executionDetails': unknown + 'executionError': unknown + 'executionHistory': unknown + 'executionOverview': unknown + 'executionStatus': unknown + 'exhausted': unknown + 'expCategory': unknown + 'expDesc': unknown + 'expName': unknown + 'expSaved': unknown + 'expectedResilienceScore': unknown + 'expectedResponseCode': unknown + 'experiment': unknown + 'experimentActivity': unknown + 'experimentBuilder': unknown + 'experimentDeleted': unknown + 'experimentDeletedSuccessfully': unknown + 'experimentID': unknown + 'experimentInFault': unknown + 'experimentIsRunning': unknown + 'experimentNamespace': unknown + 'experimentOverview': unknown + 'experimentPreview': unknown + 'experimentRunDetails': unknown + 'experimentRunID': unknown + 'experimentRuns': unknown + 'experimentStopSuccessMessage': unknown + 'experimentType': unknown + 'experiments': unknown + 'expressionBreakdown': unknown + 'failStep': unknown + 'failed': unknown + 'failedRuns': unknown + 'fault': unknown + 'faultActivity': unknown + 'faultConfiguration': unknown + 'faultDetails': unknown + 'faultShouldHaveAtleastOneProbe': unknown + 'faultSummary': unknown + 'faultVerdict': unknown + 'faults': unknown + 'faultsContained': unknown + 'faultsHaveProbeFailures': unknown + 'faultsLibrary': unknown + 'featureRestriction.experimentsPerMonthLevelUp': PrimitiveObject<'count' | 'experimentsLimit'> + 'featureRestriction.initialDeploymentsWarningActive': PrimitiveObject<'warningLimit'> + 'featureRestriction.resourceLevelUpFree': PrimitiveObject<'resourceLimit' | 'resourceName'> + 'featureRestriction.resourceLevelUpTeam': PrimitiveObject<'resourceLimit'> + 'featureRestriction.resourceOveruseEnterprise': unknown + 'fieldSelector': unknown + 'genericResourceNotFoundError': PrimitiveObject<'resource' | 'resourceID' | 'projectID'> + 'gitConnection': unknown + 'goBack': unknown + 'goChaosHome': unknown + 'greatJob': unknown + 'group': unknown + 'healthy': unknown + 'history': unknown + 'hostedOn': unknown + 'hostedOnAgent': unknown + 'hourly': unknown + 'hourlyMessage': unknown + 'hoursAnd': unknown + 'hoursLabel': unknown + 'hoverFaultToViewDetails': unknown + 'howToFindServiceAccount': unknown + 'howToUseExp': unknown + 'httpDescription': unknown + 'httpProbeDetails': unknown + 'httpProbeTitle': unknown + 'hubAccess': unknown + 'hubConnectedSuccessfully': unknown + 'hubDeletedSuccessfully': unknown + 'hubEditedSuccessfully': unknown + 'hubName': unknown + 'hubRepositoryBranch': unknown + 'hubRepositoryURL': unknown + 'id': unknown + 'idlowerCase': unknown + 'improveResilienceOfTheDeployedService': unknown + 'inactive': unknown + 'inactiveTooltip': unknown + 'infraName': unknown + 'infrastructure': unknown + 'infrastructureCommand': unknown + 'infrastructureRegistered': unknown + 'infrastructureStates': unknown + 'infrastructureType': unknown + 'initialDelaySeconds': unknown + 'insecureSkipVerify': unknown + 'installYaml': unknown + 'interval': unknown + 'intervalOptional': unknown + 'invalidSelection': unknown + 'invalidText': unknown + 'isRequired': PrimitiveObject<'field'> + 'issueSupport': unknown + 'k8sDescription': unknown + 'k8sProbeDetails': unknown + 'k8sProbeTitle': unknown + 'key': unknown + 'kubectl': unknown + 'kubernetes': unknown + 'kubernetesChaosInfrastructureClusterScopeDeleteStepTwo': unknown + 'kubernetesChaosInfrastructureDeleteStepOne': unknown + 'kubernetesChaosInfrastructureNamespaceScopeDeleteStepFour': unknown + 'kubernetesChaosInfrastructureNamespaceScopeDeleteStepThree': unknown + 'kubernetesChaosInfrastructureNamespaceScopeDeleteStepTwo': unknown + 'kubernetesClusterDetails': unknown + 'kubernetesInfrastructureDeleteCRDSNote': unknown + 'kubernetesInfrastructureDeleteNote': unknown + 'kubernetesPermissions.nameSpace': unknown + 'kubernetesPermissions.statefulSets': unknown + 'kubernetesPrerequisites': unknown + 'kubernetesSetupInstructions': unknown + 'labelSelector': unknown + 'lastHeartBeat': unknown + 'lastModified': unknown + 'lastResilienceScore': unknown + 'lastRun': unknown + 'lastSyncedAt': unknown + 'latestRun': unknown + 'latestRunFallbackText': unknown + 'launchExperiment': unknown + 'learnMore': unknown + 'letsGetStarted': unknown + 'litmus': unknown + 'litmusChaos': unknown + 'loading': unknown + 'logErrorMessage': unknown + 'loginDescription': unknown + 'logs': unknown + 'logsOptional': unknown + 'mainTitle': unknown + 'manifestDownloadUnsuccessful': unknown + 'manifestMissing': unknown + 'manual': unknown + 'manualInterruption': unknown + 'markRunAsComplete': unknown + 'markRunAsCompleteDescription': unknown + 'meetsExpectations': unknown + 'menuItems.deleteHub': unknown + 'menuItems.editHub': unknown + 'menuItems.syncHub': unknown + 'menuItems.viewHub': unknown + 'method': unknown + 'minute': unknown + 'minutesAfterTheHour': unknown + 'minutesLabel': unknown + 'minutesParentheses': unknown + 'mode': unknown + 'moduleName': unknown + 'monitorCluster': unknown + 'monitorNamespace': unknown + 'monthLabel': unknown + 'monthly': unknown + 'monthlyMessage': unknown + 'monthsParentheses': unknown + 'mostRecentDirection': unknown + 'mustBeInteger': PrimitiveObject<'field'> + 'mustBePositive': PrimitiveObject<'field'> + 'myProfile': unknown + 'na': unknown + 'name': unknown + 'nameIdDescriptionTags.descriptionPlaceholder': unknown + 'nameIdDescriptionTags.namePlaceholder': unknown + 'nameIdDescriptionTags.optionalField': PrimitiveObject<'name'> + 'nameIdDescriptionTags.tagsLabel': unknown + 'namespace': unknown + 'namespaceScopeDescription': unknown + 'namespaceWide': unknown + 'needAttention': unknown + 'newChaosExperiment': unknown + 'newChaosHub': unknown + 'newChaosInfrastructure': unknown + 'newExperiment': unknown + 'newProbe': unknown + 'newUpdates': unknown + 'newUserNoExperiments.subtitle': unknown + 'newUserNoExperiments.title': unknown + 'newUserNoInfra.title': unknown + 'next': unknown + 'nextRun': unknown + 'nextSelectChaosExperiments': unknown + 'noAnalysis': unknown + 'noChaosHubSelected': unknown + 'noChaosInfrastructure': unknown + 'noChaosInfrastructureFound': unknown + 'noClustersFound': unknown + 'noData.message': unknown + 'noData.title': unknown + 'noDataCV': unknown + 'noDataToDisplay': unknown + 'noExpFound': unknown + 'noExperimentFoundMatchingSearch': unknown + 'noExperimentSelected': unknown + 'noExperiments': unknown + 'noExperimentsAdded': unknown + 'noFaults': unknown + 'noFilteredActiveInfra': unknown + 'noFilteredData.subtitle': unknown + 'noFilteredData.title': unknown + 'noHealthyState': unknown + 'noKubernetesChaosInfrastructureFound': PrimitiveObject<'value'> + 'noLogs': unknown + 'noMonitoredService': unknown + 'noProbeDescription': unknown + 'noProbes': unknown + 'noProbesAvailable': unknown + 'noProbesFound.errorMessage': unknown + 'noProbesFound.message': unknown + 'noProbesFound.title': unknown + 'noProjectFoundMatchingSearch': PrimitiveObject<'searchTerm'> + 'noResultsFound': unknown + 'noRunsFound': unknown + 'noRunsFoundForThisExperiment': unknown + 'noTunables': unknown + 'noWorkflowRun': unknown + 'nodeSelector': unknown + 'nodeSelectorPlaceholderForKey': unknown + 'nodeSelectorPlaceholderForValue': unknown + 'nodeSelectorText': unknown + 'nonCronSelectOption': unknown + 'nonCronText': unknown + 'nonProd': unknown + 'notMeetsExpectations': unknown + 'notMeetsExpectationsInterventionNeeded': unknown + 'notes': unknown + 'numberOfExperiments': unknown + 'objective': unknown + 'objectives': unknown + 'observe': unknown + 'ofEvery': unknown + 'on': unknown + 'onThe': unknown + 'onThisPage': unknown + 'openInNewTab': unknown + 'operation': unknown + 'operator': unknown + 'optional': unknown + 'or': unknown + 'orderBy': unknown + 'organization': unknown + 'outOf': unknown + 'outOfSmall': unknown + 'overallNodeResult': unknown + 'overallResiliencyScore': unknown + 'overview': unknown + 'overwriteYaml': unknown + 'parallel': unknown + 'passed': unknown + 'passedRuns': unknown + 'pauseRun': unknown + 'pending': unknown + 'pendingTime': unknown + 'phase': unknown + 'platform': unknown + 'pleaseComplete': unknown + 'pleaseSelectLeastOneExperiment': unknown + 'points': unknown + 'pollingInterval': unknown + 'preProd': unknown + 'predefinedExperimentsNotFound': unknown + 'preview': unknown + 'private': unknown + 'probeConfiguration': unknown + 'probeDetails': unknown + 'probeMode': unknown + 'probeModes.Continuous': unknown + 'probeModes.EOT': unknown + 'probeModes.Edge': unknown + 'probeModes.OnChaos': unknown + 'probeModes.SOT': unknown + 'probeName': unknown + 'probeOverview': unknown + 'probePassedSuccessfully': unknown + 'probeProperties': unknown + 'probeResult': unknown + 'probeResultNotAvailable': unknown + 'probeResultsInPastRuns': unknown + 'probeStatus': unknown + 'probeSuccessPercentage': unknown + 'probeSummary': unknown + 'probeType': unknown + 'probeTypes.cmdProbe': unknown + 'probeTypes.httpProbe': unknown + 'probeTypes.k8sProbe': unknown + 'probeTypes.promProbe': unknown + 'probeValidation.body': unknown + 'probeValidation.command': unknown + 'probeValidation.contentType': unknown + 'probeValidation.criteria': unknown + 'probeValidation.endpoint': unknown + 'probeValidation.getCriteria': unknown + 'probeValidation.getResponseCode': unknown + 'probeValidation.interval': unknown + 'probeValidation.method': unknown + 'probeValidation.name': unknown + 'probeValidation.namespace': unknown + 'probeValidation.pollingInterval': unknown + 'probeValidation.postCriteria': unknown + 'probeValidation.postResponseCode': unknown + 'probeValidation.query': unknown + 'probeValidation.responseTimeout': unknown + 'probeValidation.retry': unknown + 'probeValidation.timeout': unknown + 'probeValidation.type': unknown + 'probeValidation.url': unknown + 'probeValidation.value': unknown + 'probes': unknown + 'probesArePassed': unknown + 'prod': unknown + 'project': unknown + 'promDescription': unknown + 'promProbeDetails': unknown + 'promProbeTitle': unknown + 'properties': unknown + 'provideTargetApplicationDetails': unknown + 'public': unknown + 'query': unknown + 'queryPath': unknown + 'ranAt': unknown + 'rbacDescription': PrimitiveObject<'permission'> + 'rbacHeader': unknown + 'reRunDesc': unknown + 'reRunExperiment': unknown + 'reRunSuccessful': unknown + 'readMore': unknown + 'recentExecutionResults': unknown + 'recentExecutions': unknown + 'recentExperimentRuns': unknown + 'recentlyUsed': unknown + 'recurringRun': unknown + 'recurringSchedule': unknown + 'referencedBy': unknown + 'registryName': unknown + 'report': unknown + 'reportGeneratedOn': PrimitiveObject<'dateNow' | 'timeNow'> + 'required': unknown + 'rerun': unknown + 'resetFilters': unknown + 'resilienceOverview': unknown + 'resilienceProbes': unknown + 'resilienceRate': unknown + 'resilienceScoreOverview': unknown + 'resilienceScoreTooltip': unknown + 'resilienceScoreTrends': unknown + 'resilienceStepCanHelpYou': unknown + 'resilienceTabDescription': unknown + 'resiliencyScore': unknown + 'resource': unknown + 'responseCode': unknown + 'responseTimeout': unknown + 'responseType': unknown + 'resultAfterExecution': unknown + 'resultMetExpectations': unknown + 'resultSummary': unknown + 'resultsMetExpectations': unknown + 'resultsSummary': unknown + 'retry': unknown + 'retryOptional': unknown + 'revertSchedule': unknown + 'revertScheduleText': unknown + 'run': unknown + 'runAllExperiment': unknown + 'runAt': unknown + 'runCommand': unknown + 'runCommands': unknown + 'runCreatedOn': unknown + 'runCreatedSuccessfully': unknown + 'runDailyAt': unknown + 'runDetails': unknown + 'runEvery': unknown + 'runHistory': unknown + 'runLogsNotAvailableYet': unknown + 'runMarkedAsCompleted': unknown + 'runNow': unknown + 'runOn': unknown + 'runOnSpecificDay': unknown + 'runOnSpecificDayMonth': unknown + 'running': unknown + 'runs': unknown + 'save': unknown + 'saveAndContinue': unknown + 'saveToChaosHub': unknown + 'saveToChaosHubSuccess': unknown + 'saveValues': unknown + 'schedule': unknown + 'scheduleType': unknown + 'scheduledBy': unknown + 'scheduledFor': unknown + 'scope': unknown + 'search': unknown + 'searchExperimentRunID': unknown + 'searchExperiments': unknown + 'searchForAProbe': unknown + 'searchForChaosFaults': unknown + 'searchForHub': unknown + 'searchForMonitoredServices': unknown + 'searchHub': unknown + 'secret': unknown + 'seeAllChaosHubs': unknown + 'seeAllChaosInfrastructures': unknown + 'seeAllEnvironments': unknown + 'seeAllFaults': unknown + 'selectAppKind': unknown + 'selectAppLabel': unknown + 'selectAppNamespace': unknown + 'selectChaosExperiment': unknown + 'selectChaosInfrastructure': unknown + 'selectChaosInfrastructureFormLabel': unknown + 'selectChaosInfrastructureType': unknown + 'selectDeployChaosInfrastructure': unknown + 'selectExperimentToViewDetails': unknown + 'selectExperiments': unknown + 'selectHub': unknown + 'selectHubFromList': unknown + 'selectHubHeader': unknown + 'selectProbes': unknown + 'selectProject': unknown + 'selectTimeframe': unknown + 'selectYourProbe': unknown + 'selectYourProbeType': unknown + 'selectedExperiments': unknown + 'sequence': unknown + 'serviceAccount': unknown + 'serviceAccountName': unknown + 'serviceHealthScore': unknown + 'setFaultWeights': unknown + 'setupChaosInfrastructures': unknown + 'setupProbe': unknown + 'setupProbeBtn': unknown + 'showLess': unknown + 'showingAll': unknown + 'showingLastRuns': unknown + 'signOut': unknown + 'singleRun': unknown + 'source': unknown + 'specificNamespaceAccess': unknown + 'stages': unknown + 'startBlankCanvasDescription': unknown + 'startBlankCanvasTitle': unknown + 'startTime': unknown + 'startWith': unknown + 'startedAt': unknown + 'startedOn': unknown + 'startingWith': unknown + 'status': unknown + 'statusCheck': unknown + 'stop': unknown + 'stopAllDesc': unknown + 'stopAllExp': unknown + 'stopAllHeading': unknown + 'stopExpRun': unknown + 'stopExpRunDesc': unknown + 'stopExpRuns': unknown + 'stopExperimentDesc': unknown + 'stopExperimentHeading': unknown + 'stopOnFailure': unknown + 'stopped': unknown + 'stoppedRuns': unknown + 'stoppedSuccessfully': unknown + 'succeeded': unknown + 'success': unknown + 'successSummary': unknown + 'suggestion1': unknown + 'summary': unknown + 'switchToBarChart': unknown + 'switchToLineChart': unknown + 'syncLatestRun': unknown + 'syncedSuccessfully': unknown + 'tags': unknown + 'target': unknown + 'targetApplication': unknown + 'targetInfrastructure': unknown + 'taskIDSuccess': unknown + 'templateFromChaosHubsDescription': unknown + 'templateFromChaosHubsTitle': unknown + 'templateFromProjectDescription': unknown + 'templateFromProjectTitle': unknown + 'testConnection': unknown + 'testSuccess': unknown + 'testingConnection': unknown + 'thisExperimentHasNoRuns': unknown + 'timeout': unknown + 'toleration.effectPlaceholder': unknown + 'toleration.keyPlaceholder': unknown + 'toleration.operatorPlaceholder': unknown + 'toleration.title': unknown + 'toleration.valuePlaceholder': unknown + 'tolerationSeconds': unknown + 'tolerationText': unknown + 'topology': unknown + 'total': unknown + 'totalChaosHubs': unknown + 'totalChaosInfrastructures': unknown + 'totalEnvironments': unknown + 'totalExp': unknown + 'totalExperiments': unknown + 'totalRuns': unknown + 'triggeredBy': unknown + 'troubleshooting': unknown + 'tuneFault': unknown + 'tuneFaultProperties': unknown + 'tuneFaultWeight': unknown + 'tuneWeight': unknown + 'type': unknown + 'unableToGetProbes': unknown + 'unhealthy': unknown + 'update': unknown + 'updatedAt': unknown + 'updatedBy': unknown + 'upgradeChaosInfrastructure': unknown + 'upgradeManifestDownloadedSuccessfully': unknown + 'uploadYAMLButton': unknown + 'uploadYAMLDescription': unknown + 'uploadYAMLDescriptionBuilder': unknown + 'uploadYAMLDragText': unknown + 'uploadYAMLTitle': unknown + 'uploadYAMLTitleBuilder': unknown + 'uploadYaml': unknown + 'url': unknown + 'useIntegerValue': unknown + 'useThisTemplate': unknown + 'validationError': unknown + 'value': unknown + 'valuePlaceholder': unknown + 'version': unknown + 'view': unknown + 'viewAllDefaultProperties': unknown + 'viewAllExperiments': unknown + 'viewAllRuns': unknown + 'viewDetailedExecution': unknown + 'viewExecution': unknown + 'viewExecutions': unknown + 'viewExperimentManifest': unknown + 'viewExperimentReport': unknown + 'viewInChaosModule': unknown + 'viewLastExecution': unknown + 'viewLessDefaultProperties': unknown + 'viewLogs': unknown + 'viewManifest': unknown + 'viewProbeDetails': unknown + 'viewProbeProperties': unknown + 'viewReport': unknown + 'viewRun': unknown + 'viewRunReport': unknown + 'viewRunReportForThisRun': unknown + 'warning': unknown + 'weekly': unknown + 'weeklyMessage': unknown + 'weightAdjustDescription': PrimitiveObject<'numberOfFaults' | 'experimentName'> + 'weightAdjustHeader': unknown + 'welcomeToLitmus': unknown + 'yearlyTabTitle': unknown +} \ No newline at end of file