From 04adcc133c5ac22def1a3187a71777eed971fd6e Mon Sep 17 00:00:00 2001 From: Lucas Garfield Date: Wed, 14 May 2025 17:45:09 -0500 Subject: [PATCH 01/31] Wizard: add AAP step --- playwright/Customizations/AAP.spec.ts | 214 ++++++++++++++++++ playwright/test.spec.ts | 5 + .../CreateImageWizard/CreateImageWizard.tsx | 25 +- .../CreateImageWizard/ValidatedInput.tsx | 6 +- .../steps/AAP/components/AAPRegistration.tsx | 178 +++++++++++++++ .../CreateImageWizard/steps/AAP/index.tsx | 18 ++ .../steps/Review/ReviewStep.tsx | 21 ++ .../steps/Review/ReviewStepTextLists.tsx | 43 ++++ .../utilities/requestMapper.ts | 70 +++++- .../utilities/useValidation.tsx | 62 +++++ .../CreateImageWizard/validators.ts | 82 +++++++ src/store/wizardSlice.ts | 55 ++++- .../Blueprints/ImportBlueprintModal.test.tsx | 3 + .../steps/Oscap/Compliance.test.tsx | 2 + .../steps/Services/Services.test.tsx | 4 +- src/test/setup.ts | 2 + 16 files changed, 776 insertions(+), 14 deletions(-) create mode 100644 playwright/Customizations/AAP.spec.ts create mode 100644 src/Components/CreateImageWizard/steps/AAP/components/AAPRegistration.tsx create mode 100644 src/Components/CreateImageWizard/steps/AAP/index.tsx diff --git a/playwright/Customizations/AAP.spec.ts b/playwright/Customizations/AAP.spec.ts new file mode 100644 index 00000000..f550257c --- /dev/null +++ b/playwright/Customizations/AAP.spec.ts @@ -0,0 +1,214 @@ +import { expect } from '@playwright/test'; +import { v4 as uuidv4 } from 'uuid'; + +import { test } from '../fixtures/customizations'; +import { isHosted } from '../helpers/helpers'; +import { ensureAuthenticated } from '../helpers/login'; +import { + ibFrame, + navigateToLandingPage, + navigateToOptionalSteps, +} from '../helpers/navHelpers'; +import { + createBlueprint, + deleteBlueprint, + exportBlueprint, + fillInDetails, + fillInImageOutputGuest, + importBlueprint, + registerLater, +} from '../helpers/wizardHelpers'; + +const validCallbackUrl = + 'https://controller.url/api/controller/v2/job_templates/9/callback/'; +const validHttpCallbackUrl = + 'http://controller.url/api/controller/v2/job_templates/9/callback/'; +const validHostConfigKey = 'hostconfigkey'; +const validCertificate = `-----BEGIN CERTIFICATE----- +MIIDXTCCAkWgAwIBAgIJAOEzx5ezZ9EIMA0GCSqGSIb3DQEBCwUAMEUxCzAJBgNV +BAYTAklOMQswCQYDVQQIDAJLUjEMMAoGA1UEBwwDS1JHMRAwDgYDVQQKDAdUZXN0 +IENBMB4XDTI1MDUxNTEyMDAwMFoXDTI2MDUxNTEyMDAwMFowRTELMAkGA1UEBhMC +SU4xCzAJBgNVBAgMAktSMQwwCgYDVQQHDANSR0sxEDAOBgNVBAoMB1Rlc3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC+R4gfN5pyJQo5qBTTtN+7 +eE9CSXZJ8SVVaE3U54IgqQoqsSoBY5QtExy7v5C6l6mW4E6dzK/JecmvTTO/BvlG +A5k2hxB6bOQxtxYwfgElH+RFWN9P4xxhtEiQgHoG1rDfnXuDJk1U3YEkCQELUebz +fF3EIDU1yR0Sz2bA+Sl2VXe8og1MEZfytq8VZUVltxtn2PfW7zI5gOllBR2sKeUc +K6h8HXN7qMgfEvsLIXxTw7fU/zA3ibcxfRCl3m6QhF8hwRh6F9Wtz2s8hCzGegV5 +z0M39nY7X8C3GZQ4Ly8v8DdY+FbEix7K3SSBRbWtdPfAHRFlX9Er2Wf8DAr7O2hH +AgMBAAGjUDBOMB0GA1UdDgQWBBTXXz2eIDgK+BhzDUAGzptn0OMcpDAfBgNVHSME +GDAWgBTXXz2eIDgK+BhzDUAGzptn0OMcpDAMBgNVHRMEBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQAoUgY4jsuBMB3el9cc7JS2rcOhhJzn47Hj2UANfJq52g5lbjo7 +XDc7Wb3VDcV+1LzjdzayT1qO1WzHb6FDPW9L9f6h4s8lj6MvJ+xhOWgD11srdIt3 +vbQaQW4zDfeVRcKXzqbcUX8BLXAdzJPqVwZ+Z4EDjYrJ7lF9k+IqfZm0MsYX7el9 +kvdRHbLuF4Q0sZ05CXMFkhM0Ulhu4MZ+1FcsQa7nWfZzTmbjHOuWJPB4z5WwrB7z +U8YYvWJ3qxToWGbATqJxkRKGGqLrNrmwcfzgPqkpuCRYi0Kky6gJ1RvL+DRopY9x +uD+ckf3oH2wYAB6RpPRMkfVxe7lGMvq/yEZ6 +-----END CERTIFICATE-----`; +const invalidCertificate = `-----BEGIN CERTIFICATE----- +ThisIs*Not+Valid/Base64== +-----END CERTIFICATE-----`; + +test('Create a blueprint with AAP registration customization', async ({ + page, + cleanup, +}) => { + const blueprintName = 'test-' + uuidv4(); + + // Skip entirely in Cockpit/on-premise where AAP customization is unavailable + test.skip(!isHosted(), 'AAP customization is not available in the plugin'); + + // Delete the blueprint after the run fixture + await cleanup.add(() => deleteBlueprint(page, blueprintName)); + await ensureAuthenticated(page); + + // Navigate to IB landing page and get the frame + await navigateToLandingPage(page); + const frame = await ibFrame(page); + + await test.step('Navigate to optional steps in Wizard', async () => { + await navigateToOptionalSteps(frame); + await registerLater(frame); + }); + + await test.step('Select and fill the AAP step with valid configuration', async () => { + await frame + .getByRole('button', { name: 'Ansible Automation Platform' }) + .click(); + await frame + .getByRole('textbox', { name: 'ansible callback url' }) + .fill(validCallbackUrl); + await frame + .getByRole('textbox', { name: 'host config key' }) + .fill(validHostConfigKey); + await frame + .getByRole('textbox', { name: 'File upload' }) + .fill(validCertificate); + await expect(frame.getByRole('button', { name: 'Next' })).toBeEnabled(); + }); + + await test.step('Test TLS confirmation checkbox for HTTPS URLs', async () => { + // TLS confirmation checkbox should appear for HTTPS URLs + await expect( + frame.getByRole('checkbox', { + name: 'Insecure', + }), + ).toBeVisible(); + + // Check TLS confirmation and verify CA input is hidden + await frame + .getByRole('checkbox', { + name: 'Insecure', + }) + .check(); + await expect( + frame.getByRole('textbox', { name: 'File upload' }), + ).toBeHidden(); + + await frame + .getByRole('checkbox', { + name: 'Insecure', + }) + .uncheck(); + + await expect( + frame.getByRole('textbox', { name: 'File upload' }), + ).toBeVisible(); + }); + + await test.step('Test certificate validation', async () => { + await frame.getByRole('textbox', { name: 'File upload' }).clear(); + await frame + .getByRole('textbox', { name: 'File upload' }) + .fill(invalidCertificate); + await expect(frame.getByText(/Certificate.*is not valid/)).toBeVisible(); + + await frame.getByRole('textbox', { name: 'File upload' }).clear(); + await frame + .getByRole('textbox', { name: 'File upload' }) + .fill(validCertificate); + + await expect(frame.getByText('Certificate was uploaded')).toBeVisible(); + }); + + await test.step('Test HTTP URL behavior', async () => { + await frame.getByRole('textbox', { name: 'ansible callback url' }).clear(); + await frame + .getByRole('textbox', { name: 'ansible callback url' }) + .fill(validHttpCallbackUrl); + + // TLS confirmation checkbox should NOT appear for HTTP URLs + await expect( + frame.getByRole('checkbox', { + name: 'Insecure', + }), + ).toBeHidden(); + await expect( + frame.getByRole('textbox', { name: 'File upload' }), + ).toBeVisible(); + + await frame.getByRole('textbox', { name: 'ansible callback url' }).clear(); + await frame + .getByRole('textbox', { name: 'ansible callback url' }) + .fill(validCallbackUrl); + }); + + await test.step('Complete AAP configuration and proceed to review', async () => { + await frame.getByRole('button', { name: 'Review and finish' }).click(); + }); + + await test.step('Fill the BP details', async () => { + await fillInDetails(frame, blueprintName); + }); + + await test.step('Create BP', async () => { + await createBlueprint(frame, blueprintName); + }); + + await test.step('Edit BP and verify AAP configuration persists', async () => { + await frame.getByRole('button', { name: 'Edit blueprint' }).click(); + await frame.getByLabel('Revisit Ansible Automation Platform step').click(); + + await expect( + frame.getByRole('textbox', { name: 'ansible callback url' }), + ).toHaveValue(validCallbackUrl); + await expect( + frame.getByRole('textbox', { name: 'host config key' }), + ).toHaveValue(validHostConfigKey); + await expect( + frame.getByRole('textbox', { name: 'File upload' }), + ).toHaveValue(validCertificate); + + await frame.getByRole('button', { name: 'Review and finish' }).click(); + await frame + .getByRole('button', { name: 'Save changes to blueprint' }) + .click(); + }); + // This is for hosted service only as these features are not available in cockpit plugin + await test.step('Export BP', async (step) => { + step.skip(!isHosted(), 'Exporting is not available in the plugin'); + await exportBlueprint(page, blueprintName); + }); + + await test.step('Import BP', async (step) => { + step.skip(!isHosted(), 'Importing is not available in the plugin'); + await importBlueprint(page, blueprintName); + }); + + await test.step('Review imported BP', async (step) => { + step.skip(!isHosted(), 'Importing is not available in the plugin'); + await fillInImageOutputGuest(page); + await page + .getByRole('button', { name: 'Ansible Automation Platform' }) + .click(); + await expect( + page.getByRole('textbox', { name: 'ansible callback url' }), + ).toHaveValue(validCallbackUrl); + await expect( + page.getByRole('textbox', { name: 'host config key' }), + ).toBeEmpty(); + await expect( + page.getByRole('textbox', { name: 'File upload' }), + ).toHaveValue(validCertificate); + await page.getByRole('button', { name: 'Cancel' }).click(); + }); +}); diff --git a/playwright/test.spec.ts b/playwright/test.spec.ts index cea02c9e..6538c09e 100644 --- a/playwright/test.spec.ts +++ b/playwright/test.spec.ts @@ -72,6 +72,11 @@ test.describe.serial('test', () => { frame.getByRole('heading', { name: 'Systemd services' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); + if (isHosted()) { + frame.getByRole('heading', { name: 'Ansible Automation Platform' }); + await frame.getByRole('button', { name: 'Next', exact: true }).click(); + } + if (isHosted()) { frame.getByRole('heading', { name: 'First boot configuration' }); await frame.getByRole('button', { name: 'Next', exact: true }).click(); diff --git a/src/Components/CreateImageWizard/CreateImageWizard.tsx b/src/Components/CreateImageWizard/CreateImageWizard.tsx index a2e529d3..ade9e016 100644 --- a/src/Components/CreateImageWizard/CreateImageWizard.tsx +++ b/src/Components/CreateImageWizard/CreateImageWizard.tsx @@ -15,6 +15,7 @@ import { WizardStepType } from '@patternfly/react-core/dist/esm/components/Wizar import useChrome from '@redhat-cloud-services/frontend-components/useChrome'; import { useNavigate, useSearchParams } from 'react-router-dom'; +import AAPStep from './steps/AAP'; import DetailsStep from './steps/Details'; import FileSystemStep from './steps/FileSystem'; import { FileSystemContext } from './steps/FileSystem/components/FileSystemTable'; @@ -40,6 +41,7 @@ import UsersStep from './steps/Users'; import { getHostArch, getHostDistro } from './utilities/getHostInfo'; import { useHasSpecificTargetOnly } from './utilities/hasSpecificTargetOnly'; import { + useAAPValidation, useDetailsValidation, useFilesystemValidation, useFirewallValidation, @@ -197,6 +199,7 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { // Feature flags const complianceEnabled = useFlag('image-builder.compliance.enabled'); + const isAAPRegistrationEnabled = useFlag('image-builder.aap.enabled'); // IMPORTANT: Ensure the wizard starts with a fresh initial state useEffect(() => { @@ -283,6 +286,8 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { const firewallValidation = useFirewallValidation(); // Services const servicesValidation = useServicesValidation(); + // AAP + const aapValidation = useAAPValidation(); // Firstboot const firstBootValidation = useFirstBootValidation(); // Details @@ -293,8 +298,10 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { const hasWslTargetOnly = useHasSpecificTargetOnly('wsl'); let startIndex = 1; // default index + const JUMP_TO_REVIEW_STEP = 23; + if (isEdit) { - startIndex = 22; + startIndex = JUMP_TO_REVIEW_STEP; } const [wasRegisterVisited, setWasRegisterVisited] = useState(false); @@ -655,6 +662,22 @@ const CreateImageWizard = ({ isEdit }: CreateImageWizardProps) => { > , + + } + > + + , @@ -138,6 +138,7 @@ export const ValidatedInput = ({ value, placeholder, onChange, + ...props }: ValidatedTextInputPropTypes) => { const [isPristine, setIsPristine] = useState(!value ? true : false); @@ -164,6 +165,7 @@ export const ValidatedInput = ({ aria-label={ariaLabel || ''} onBlur={handleBlur} placeholder={placeholder || ''} + {...props} /> {!isPristine && !validator(value) && ( diff --git a/src/Components/CreateImageWizard/steps/AAP/components/AAPRegistration.tsx b/src/Components/CreateImageWizard/steps/AAP/components/AAPRegistration.tsx new file mode 100644 index 00000000..f4a78844 --- /dev/null +++ b/src/Components/CreateImageWizard/steps/AAP/components/AAPRegistration.tsx @@ -0,0 +1,178 @@ +import React from 'react'; + +import { + Checkbox, + DropEvent, + FileUpload, + FormGroup, + FormHelperText, + HelperText, + HelperTextItem, +} from '@patternfly/react-core'; + +import { useAppDispatch, useAppSelector } from '../../../../../store/hooks'; +import { + changeAapCallbackUrl, + changeAapHostConfigKey, + changeAapTlsCertificateAuthority, + changeAapTlsConfirmation, + selectAapCallbackUrl, + selectAapHostConfigKey, + selectAapTlsCertificateAuthority, + selectAapTlsConfirmation, +} from '../../../../../store/wizardSlice'; +import { useAAPValidation } from '../../../utilities/useValidation'; +import { ValidatedInputAndTextArea } from '../../../ValidatedInput'; +import { validateMultipleCertificates } from '../../../validators'; + +const AAPRegistration = () => { + const dispatch = useAppDispatch(); + const callbackUrl = useAppSelector(selectAapCallbackUrl); + const hostConfigKey = useAppSelector(selectAapHostConfigKey); + const tlsCertificateAuthority = useAppSelector( + selectAapTlsCertificateAuthority, + ); + const tlsConfirmation = useAppSelector(selectAapTlsConfirmation); + const [isRejected, setIsRejected] = React.useState(false); + const stepValidation = useAAPValidation(); + + const isHttpsUrl = callbackUrl?.toLowerCase().startsWith('https://') || false; + const shouldShowCaInput = !isHttpsUrl || (isHttpsUrl && !tlsConfirmation); + + const validated = stepValidation.errors['certificate'] + ? 'error' + : stepValidation.errors['certificate'] === undefined && + tlsCertificateAuthority && + validateMultipleCertificates(tlsCertificateAuthority).validCertificates + .length > 0 + ? 'success' + : 'default'; + + const handleCallbackUrlChange = (value: string) => { + dispatch(changeAapCallbackUrl(value)); + }; + + const handleHostConfigKeyChange = (value: string) => { + dispatch(changeAapHostConfigKey(value)); + }; + + const handleClear = () => { + dispatch(changeAapTlsCertificateAuthority('')); + }; + + const handleTextChange = ( + _event: React.ChangeEvent, + value: string, + ) => { + dispatch(changeAapTlsCertificateAuthority(value)); + setIsRejected(false); + }; + + const handleDataChange = (_: DropEvent, value: string) => { + dispatch(changeAapTlsCertificateAuthority(value)); + setIsRejected(false); + }; + + const handleFileRejected = () => { + dispatch(changeAapTlsCertificateAuthority('')); + setIsRejected(true); + }; + + const handleTlsConfirmationChange = (checked: boolean) => { + dispatch(changeAapTlsConfirmation(checked)); + }; + + return ( + <> + + handleCallbackUrlChange(value.trim())} + ariaLabel='ansible callback url' + isRequired + stepValidation={stepValidation} + fieldName='callbackUrl' + /> + + + + handleHostConfigKeyChange(value.trim())} + ariaLabel='host config key' + isRequired + stepValidation={stepValidation} + fieldName='hostConfigKey' + /> + + + {shouldShowCaInput && ( + + + + + + {isRejected + ? 'Must be a .PEM/.CER/.CRT file' + : validated === 'error' + ? stepValidation.errors['certificate'] + : validated === 'success' + ? 'Certificate was uploaded' + : 'Drag and drop a valid certificate file or upload one'} + + + + + )} + {isHttpsUrl && ( + + handleTlsConfirmationChange(checked)} + /> + {stepValidation.errors['tlsConfirmation'] && ( + + + + {stepValidation.errors['tlsConfirmation']} + + + + )} + + )} + + ); +}; + +export default AAPRegistration; diff --git a/src/Components/CreateImageWizard/steps/AAP/index.tsx b/src/Components/CreateImageWizard/steps/AAP/index.tsx new file mode 100644 index 00000000..7dbe0275 --- /dev/null +++ b/src/Components/CreateImageWizard/steps/AAP/index.tsx @@ -0,0 +1,18 @@ +import React from 'react'; + +import { Form, Title } from '@patternfly/react-core'; + +import AAPRegistration from './components/AAPRegistration'; + +const AAPStep = () => { + return ( +
+ + Ansible Automation Platform + + + + ); +}; + +export default AAPStep; diff --git a/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx b/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx index f1c3a5e6..630a7fa1 100644 --- a/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx +++ b/src/Components/CreateImageWizard/steps/Review/ReviewStep.tsx @@ -25,6 +25,7 @@ import { KernelList, LocaleList, OscapList, + RegisterAapList, RegisterLaterList, RegisterNowList, RegisterSatelliteList, @@ -42,6 +43,7 @@ import isRhel from '../../../../../src/Utilities/isRhel'; import { targetOptions } from '../../../../constants'; import { useAppSelector } from '../../../../store/hooks'; import { + selectAapRegistration, selectBlueprintDescription, selectBlueprintName, selectCompliancePolicyID, @@ -65,6 +67,7 @@ import { useHasSpecificTargetOnly } from '../../utilities/hasSpecificTargetOnly' const Review = () => { const { goToStepById } = useWizardContext(); + const aapRegistration = useAppSelector(selectAapRegistration); const blueprintName = useAppSelector(selectBlueprintName); const blueprintDescription = useAppSelector(selectBlueprintDescription); const distribution = useAppSelector(selectDistribution); @@ -83,6 +86,7 @@ const Review = () => { const users = useAppSelector(selectUsers); const kernel = useAppSelector(selectKernel); + const [isExpandedAap, setIsExpandedAap] = useState(true); const [isExpandedImageOutput, setIsExpandedImageOutput] = useState(true); const [isExpandedTargetEnvs, setIsExpandedTargetEnvs] = useState(true); const [isExpandedFSC, setIsExpandedFSC] = useState(true); @@ -101,6 +105,8 @@ const Review = () => { const [isExpandableFirstBoot, setIsExpandedFirstBoot] = useState(true); const [isExpandedUsers, setIsExpandedUsers] = useState(true); + const onToggleAap = (isExpandedAap: boolean) => + setIsExpandedAap(isExpandedAap); const onToggleImageOutput = (isExpandedImageOutput: boolean) => setIsExpandedImageOutput(isExpandedImageOutput); const onToggleTargetEnvs = (isExpandedTargetEnvs: boolean) => @@ -499,6 +505,21 @@ const Review = () => { )} + {aapRegistration.callbackUrl && ( + onToggleAap(isExpandableAap)} + isExpanded={isExpandedAap} + isIndented + data-testid='aap-expandable' + > + + + )} {!process.env.IS_ON_PREMISE && ( { ); }; +export const RegisterAapList = () => { + const callbackUrl = useAppSelector(selectAapCallbackUrl); + const hostConfigKey = useAppSelector(selectAapHostConfigKey); + const tlsCertificateAuthority = useAppSelector( + selectAapTlsCertificateAuthority, + ); + const skipTlsVerification = useAppSelector(selectAapTlsConfirmation); + + const getTlsStatus = () => { + if (skipTlsVerification) { + return 'Insecure (TLS verification skipped)'; + } + return tlsCertificateAuthority ? 'Configured' : 'None'; + }; + + return ( + + + + Ansible Callback URL + + + {callbackUrl || 'None'} + + + Host Config Key + + + {hostConfigKey || 'None'} + + + TLS Certificate + + {getTlsStatus()} + + + ); +}; + export const RegisterNowList = () => { const activationKey = useAppSelector(selectActivationKey); const registrationType = useAppSelector(selectRegistrationType); diff --git a/src/Components/CreateImageWizard/utilities/requestMapper.ts b/src/Components/CreateImageWizard/utilities/requestMapper.ts index ef7f1d87..bdb4e589 100644 --- a/src/Components/CreateImageWizard/utilities/requestMapper.ts +++ b/src/Components/CreateImageWizard/utilities/requestMapper.ts @@ -23,6 +23,7 @@ import { CockpitUploadTypes, } from '../../../store/cockpit/types'; import { + AapRegistration, AwsUploadRequestOptions, AzureUploadRequestOptions, BlueprintExportResponse, @@ -49,6 +50,11 @@ import { ApiRepositoryImportResponseRead } from '../../../store/service/contentS import { ComplianceType, initialState, + RegistrationType, + selectAapCallbackUrl, + selectAapHostConfigKey, + selectAapTlsCertificateAuthority, + selectAapTlsConfirmation, selectActivationKey, selectArchitecture, selectAwsAccountId, @@ -387,14 +393,7 @@ export const mapRequestToState = (request: BlueprintResponse): wizardState => { baseUrl: request.customizations.subscription?.['base-url'] || '', }, registration: { - registrationType: - request.customizations?.subscription && isRhel(request.distribution) - ? request.customizations.subscription.rhc - ? 'register-now-rhc' - : 'register-now-insights' - : getSatelliteCommand(request.customizations.files) - ? 'register-satellite' - : 'register-later', + registrationType: getRegistrationType(request), activationKey: isRhel(request.distribution) ? request.customizations.subscription?.['activation-key'] : undefined, @@ -403,6 +402,15 @@ export const mapRequestToState = (request: BlueprintResponse): wizardState => { caCert: request.customizations.cacerts?.pem_certs[0], }, }, + aapRegistration: { + callbackUrl: + request.customizations?.aap_registration?.ansible_callback_url, + hostConfigKey: request.customizations?.aap_registration?.host_config_key, + tlsCertificateAuthority: + request.customizations?.aap_registration?.tls_certificate_authority, + skipTlsVerification: + request.customizations?.aap_registration?.skip_tls_verification, + }, ...commonRequestToState(request), }; }; @@ -452,6 +460,15 @@ export const mapExportRequestToState = ( }, env: initialState.env, registration: initialState.registration, + aapRegistration: { + callbackUrl: + request.customizations?.aap_registration?.ansible_callback_url, + hostConfigKey: request.customizations?.aap_registration?.host_config_key, + tlsCertificateAuthority: + request.customizations?.aap_registration?.tls_certificate_authority, + skipTlsVerification: + request.customizations?.aap_registration?.skip_tls_verification, + }, ...commonRequestToState(blueprintResponse), }; }; @@ -461,6 +478,24 @@ const getFirstBootScript = (files?: File[]): string => { return firstBootFile?.data ? atob(firstBootFile.data) : ''; }; +const getAapRegistration = (state: RootState): AapRegistration | undefined => { + const callbackUrl = selectAapCallbackUrl(state); + const hostConfigKey = selectAapHostConfigKey(state); + const tlsCertificateAuthority = selectAapTlsCertificateAuthority(state); + const skipTlsVerification = selectAapTlsConfirmation(state); + + if (!callbackUrl && !hostConfigKey && !tlsCertificateAuthority) { + return undefined; + } + + return { + ansible_callback_url: callbackUrl || '', + host_config_key: hostConfigKey || '', + tls_certificate_authority: tlsCertificateAuthority || undefined, + skip_tls_verification: skipTlsVerification || undefined, + }; +}; + const getImageRequests = ( state: RootState, ): ImageRequest[] | CockpitImageRequest[] => { @@ -482,6 +517,24 @@ const getImageRequests = ( })); }; +const getRegistrationType = (request: BlueprintResponse): RegistrationType => { + const subscription = request.customizations.subscription; + const distribution = request.distribution; + const files = request.customizations.files; + + if (subscription && isRhel(distribution)) { + if (subscription.rhc) { + return 'register-now-rhc'; + } else { + return 'register-now-insights'; + } + } else if (getSatelliteCommand(files)) { + return 'register-satellite'; + } else { + return 'register-later'; + } +}; + const getSatelliteCommand = (files?: File[]): string => { const satelliteCommandFile = files?.find( (file) => file.path === SATELLITE_PATH, @@ -642,6 +695,7 @@ const getCustomizations = (state: RootState, orgID: string): Customizations => { pem_certs: [satCert], } : undefined, + aap_registration: getAapRegistration(state), }; }; diff --git a/src/Components/CreateImageWizard/utilities/useValidation.tsx b/src/Components/CreateImageWizard/utilities/useValidation.tsx index 70023391..1d43e7d0 100644 --- a/src/Components/CreateImageWizard/utilities/useValidation.tsx +++ b/src/Components/CreateImageWizard/utilities/useValidation.tsx @@ -11,6 +11,10 @@ import { useAppSelector } from '../../../store/hooks'; import { BlueprintsResponse } from '../../../store/imageBuilderApi'; import { useShowActivationKeyQuery } from '../../../store/rhsmApi'; import { + selectAapCallbackUrl, + selectAapHostConfigKey, + selectAapTlsCertificateAuthority, + selectAapTlsConfirmation, selectActivationKey, selectBlueprintDescription, selectBlueprintId, @@ -54,6 +58,8 @@ import { isSshKeyValid, isUserGroupValid, isUserNameValid, + isValidUrl, + validateMultipleCertificates, } from '../validators'; export type StepValidation = { @@ -205,6 +211,62 @@ export function useRegistrationValidation(): StepValidation { return { errors: {}, disabledNext: false }; } +export function useAAPValidation(): StepValidation { + const errors: Record = {}; + const callbackUrl = useAppSelector(selectAapCallbackUrl); + const hostConfigKey = useAppSelector(selectAapHostConfigKey); + const tlsCertificateAuthority = useAppSelector( + selectAapTlsCertificateAuthority, + ); + const tlsConfirmation = useAppSelector(selectAapTlsConfirmation); + + if (!callbackUrl && !hostConfigKey && !tlsCertificateAuthority) { + return { errors: {}, disabledNext: false }; + } + if (!callbackUrl || callbackUrl.trim() === '') { + errors.callbackUrl = 'Ansible Callback URL is required'; + } else if (!isValidUrl(callbackUrl)) { + errors.callbackUrl = 'Callback URL must be a valid URL'; + } + + if (!hostConfigKey || hostConfigKey.trim() === '') { + errors.hostConfigKey = 'Host Config Key is required'; + } + + if (tlsCertificateAuthority && tlsCertificateAuthority.trim() !== '') { + const validation = validateMultipleCertificates(tlsCertificateAuthority); + if (validation.errors.length > 0) { + errors.certificate = validation.errors.join(' '); + } else if (validation.validCertificates.length === 0) { + errors.certificate = 'No valid certificates found in the input.'; + } + } + + if (callbackUrl && callbackUrl.trim() !== '') { + const isHttpsUrl = callbackUrl.toLowerCase().startsWith('https://'); + + // If URL is HTTP, require TLS certificate + if ( + !isHttpsUrl && + (!tlsCertificateAuthority || tlsCertificateAuthority.trim() === '') + ) { + errors.certificate = 'HTTP URL requires a custom TLS certificate'; + return { errors, disabledNext: true }; + } + + // For HTTPS URL, if the TLS confirmation is not checked, require certificate + if ( + !tlsConfirmation && + (!tlsCertificateAuthority || tlsCertificateAuthority.trim() === '') + ) { + errors.certificate = + 'HTTPS URL requires either a custom TLS certificate or confirmation that no custom certificate is needed'; + } + } + + return { errors, disabledNext: Object.keys(errors).length > 0 }; +} + export function useFilesystemValidation(): StepValidation { const mode = useAppSelector(selectFileSystemConfigurationType); const partitions = useAppSelector(selectPartitions); diff --git a/src/Components/CreateImageWizard/validators.ts b/src/Components/CreateImageWizard/validators.ts index b5e971b2..686f846b 100644 --- a/src/Components/CreateImageWizard/validators.ts +++ b/src/Components/CreateImageWizard/validators.ts @@ -138,3 +138,85 @@ export const isServiceValid = (service: string) => { /[a-zA-Z]+/.test(service) // contains at least one letter ); }; + +export const isValidUrl = (url: string): boolean => { + try { + const parsedUrl = new URL(url); + + const isHttpOrHttps = ['http:', 'https:'].includes(parsedUrl.protocol); + const hostname = parsedUrl.hostname; + const hasValidDomain = + /^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}(?:\.[a-zA-Z]{2,})*$/.test(hostname); + + return isHttpOrHttps && hasValidDomain; + } catch { + return false; + } +}; + +export const isValidCA = (ca: string) => { + if (!ca || typeof ca !== 'string') return false; + + const trimmed = ca.trim(); + + const pemPattern = + /^-----BEGIN CERTIFICATE-----[\r\n]+([\s\S]*?)[\r\n]+-----END CERTIFICATE-----$/; + + if (!pemPattern.test(trimmed)) { + return false; + } + + const match = trimmed.match(pemPattern); + if (!match || !match[1]) { + return false; + } + + const base64Content = match[1].replace(/[\r\n\s]/g, ''); + + const base64Pattern = /^[A-Za-z0-9+/]+(=*)$/; + return base64Pattern.test(base64Content) && base64Content.length > 0; +}; + +export const parseMultipleCertificates = (input: string): string[] => { + if (!input || typeof input !== 'string') return []; + + const blockPattern = + /-----BEGIN CERTIFICATE-----[\s\S]*?(?=-----BEGIN CERTIFICATE-----|$)/g; + + const matches = input.match(blockPattern); + return matches ? matches.map((m) => m.trim()) : []; +}; + +export const validateMultipleCertificates = ( + input: string, +): { + certificates: string[]; + validCertificates: string[]; + invalidCertificates: string[]; + errors: string[]; +} => { + const certificates = parseMultipleCertificates(input); + const validCertificates: string[] = []; + const invalidCertificates: string[] = []; + const errors: string[] = []; + + if (certificates.length === 0 && input.trim() !== '') { + errors.push( + 'No valid certificate format found. Certificates must be in PEM/DER/CER format.', + ); + return { certificates, validCertificates, invalidCertificates, errors }; + } + + certificates.forEach((cert, index) => { + if (isValidCA(cert)) { + validCertificates.push(cert); + } else { + invalidCertificates.push(cert); + errors.push( + `Certificate ${index + 1} is not valid. Must be in PEM/DER/CER format.`, + ); + } + }); + + return { certificates, validCertificates, invalidCertificates, errors }; +}; diff --git a/src/store/wizardSlice.ts b/src/store/wizardSlice.ts index 2fde3b5a..ebb85bb2 100644 --- a/src/store/wizardSlice.ts +++ b/src/store/wizardSlice.ts @@ -44,7 +44,8 @@ export type RegistrationType = | 'register-now' | 'register-now-insights' | 'register-now-rhc' - | 'register-satellite'; + | 'register-satellite' + | 'register-aap'; export type ComplianceType = 'openscap' | 'compliance'; @@ -89,6 +90,12 @@ export type wizardState = { architecture: ImageRequest['architecture']; distribution: Distributions; imageTypes: ImageTypes[]; + aapRegistration: { + callbackUrl: string | undefined; + hostConfigKey: string | undefined; + tlsCertificateAuthority: string | undefined; + skipTlsVerification: boolean | undefined; + }; aws: { accountId: string; shareMethod: AwsShareMethod; @@ -189,6 +196,12 @@ export const initialState: wizardState = { architecture: X86_64, distribution: RHEL_10, imageTypes: [], + aapRegistration: { + callbackUrl: undefined, + hostConfigKey: undefined, + tlsCertificateAuthority: undefined, + skipTlsVerification: undefined, + }, aws: { accountId: '', shareMethod: 'sources', @@ -376,6 +389,26 @@ export const selectSatelliteCaCertificate = (state: RootState) => { return state.wizard.registration.satelliteRegistration.caCert; }; +export const selectAapRegistration = (state: RootState) => { + return state.wizard.aapRegistration; +}; + +export const selectAapCallbackUrl = (state: RootState) => { + return state.wizard.aapRegistration?.callbackUrl; +}; + +export const selectAapHostConfigKey = (state: RootState) => { + return state.wizard.aapRegistration?.hostConfigKey; +}; + +export const selectAapTlsCertificateAuthority = (state: RootState) => { + return state.wizard.aapRegistration?.tlsCertificateAuthority; +}; + +export const selectAapTlsConfirmation = (state: RootState) => { + return state.wizard.aapRegistration?.skipTlsVerification; +}; + export const selectComplianceProfileID = (state: RootState) => { return state.wizard.compliance.profileID; }; @@ -627,6 +660,22 @@ export const wizardSlice = createSlice({ changeSatelliteCaCertificate: (state, action: PayloadAction) => { state.registration.satelliteRegistration.caCert = action.payload; }, + changeAapCallbackUrl: (state, action: PayloadAction) => { + state.aapRegistration.callbackUrl = action.payload; + }, + + changeAapHostConfigKey: (state, action: PayloadAction) => { + state.aapRegistration.hostConfigKey = action.payload; + }, + changeAapTlsCertificateAuthority: ( + state, + action: PayloadAction, + ) => { + state.aapRegistration.tlsCertificateAuthority = action.payload; + }, + changeAapTlsConfirmation: (state, action: PayloadAction) => { + state.aapRegistration.skipTlsVerification = action.payload; + }, changeActivationKey: ( state, action: PayloadAction, @@ -1230,6 +1279,10 @@ export const { changeTimezone, changeSatelliteRegistrationCommand, changeSatelliteCaCertificate, + changeAapCallbackUrl, + changeAapHostConfigKey, + changeAapTlsCertificateAuthority, + changeAapTlsConfirmation, addNtpServer, removeNtpServer, changeHostname, diff --git a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx index c2d58300..ef2dc56e 100644 --- a/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx +++ b/src/test/Components/Blueprints/ImportBlueprintModal.test.tsx @@ -714,6 +714,9 @@ describe('Import modal', () => { ), ); + // AAP + await clickNext(); + // Firstboot await clickNext(); expect( diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx index 26d78723..9b438ad2 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Compliance.test.tsx @@ -24,6 +24,8 @@ vi.mock('@unleash/proxy-client-react', () => ({ switch (flag) { case 'image-builder.compliance.enabled': return true; + case 'image-builder.aap.enabled': + return true; default: return false; } diff --git a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx index 4a97876a..bdfac014 100644 --- a/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Services/Services.test.tsx @@ -109,12 +109,12 @@ describe('Step Services', () => { router = undefined; }); - test('clicking Next loads First boot script', async () => { + test('clicking Next loads Ansible Automation Platform', async () => { await renderCreateMode(); await goToServicesStep(); await clickNext(); await screen.findByRole('heading', { - name: 'First boot configuration', + name: 'Ansible Automation Platform', }); }); diff --git a/src/test/setup.ts b/src/test/setup.ts index 067ab8d1..e15d20b7 100644 --- a/src/test/setup.ts +++ b/src/test/setup.ts @@ -64,6 +64,8 @@ vi.mock('@unleash/proxy-client-react', () => ({ return true; case 'image-builder.templates.enabled': return true; + case 'image-builder.aap.enabled': + return true; default: return false; } From 42b16bafd855c588fc9903dd0bb423303088c6a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Aug 2025 08:35:40 +0000 Subject: [PATCH 02/31] build(deps): bump @patternfly/react-core from 6.3.0 to 6.3.1 Bumps [@patternfly/react-core](https://github.com/patternfly/patternfly-react) from 6.3.0 to 6.3.1. - [Release notes](https://github.com/patternfly/patternfly-react/releases) - [Commits](https://github.com/patternfly/patternfly-react/compare/@patternfly/react-core@6.3.0...@patternfly/react-core@6.3.1) --- updated-dependencies: - dependency-name: "@patternfly/react-core" dependency-version: 6.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 100 ++++++++-------------------------------------- package.json | 2 +- 2 files changed, 18 insertions(+), 84 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8aa706ba..2a943df8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@ltd/j-toml": "1.38.0", "@patternfly/patternfly": "6.3.0", "@patternfly/react-code-editor": "6.3.1", - "@patternfly/react-core": "6.3.0", + "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", "@redhat-cloud-services/frontend-components": "7.0.3", "@redhat-cloud-services/frontend-components-notifications": "6.1.3", @@ -3777,7 +3777,7 @@ "license": "MIT", "dependencies": { "@monaco-editor/react": "^4.6.0", - "@patternfly/react-core": "^6.3.1", + "@patternfly/react-core": "6.3.1", "@patternfly/react-icons": "^6.3.1", "@patternfly/react-styles": "^6.3.1", "react-dropzone": "14.3.5", @@ -3788,24 +3788,6 @@ "react-dom": "^17 || ^18 || ^19" } }, - "node_modules/@patternfly/react-code-editor/node_modules/@patternfly/react-core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", - "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", - "license": "MIT", - "dependencies": { - "@patternfly/react-icons": "^6.3.1", - "@patternfly/react-styles": "^6.3.1", - "@patternfly/react-tokens": "^6.3.1", - "focus-trap": "7.6.4", - "react-dropzone": "^14.3.5", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "react": "^17 || ^18 || ^19", - "react-dom": "^17 || ^18 || ^19" - } - }, "node_modules/@patternfly/react-component-groups": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@patternfly/react-component-groups/-/react-component-groups-6.1.0.tgz", @@ -3824,14 +3806,14 @@ } }, "node_modules/@patternfly/react-core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.0.tgz", - "integrity": "sha512-TM+pLwLd5DzaDlOQhqeju9H9QUFQypQiNwXQLNIxOV5r3fmKh4NTp2Av/8WmFkpCj8mejDOfp4TNxoU1zdjCkQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", + "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", "license": "MIT", "dependencies": { - "@patternfly/react-icons": "^6.3.0", - "@patternfly/react-styles": "^6.3.0", - "@patternfly/react-tokens": "^6.3.0", + "@patternfly/react-icons": "^6.3.1", + "@patternfly/react-styles": "^6.3.1", + "@patternfly/react-tokens": "^6.3.1", "focus-trap": "7.6.4", "react-dropzone": "^14.3.5", "tslib": "^2.8.1" @@ -3863,7 +3845,7 @@ "integrity": "sha512-ZndBbPcMr/vInP5eELRe9m7MWzRoejRAhWx+25xOdjVAd31/CmMK1nBgZk4QAXaWjH1P+uZaZYsTgr/FMTte2g==", "license": "MIT", "dependencies": { - "@patternfly/react-core": "^6.3.1", + "@patternfly/react-core": "6.3.1", "@patternfly/react-icons": "6.3.1", "@patternfly/react-styles": "^6.3.1", "@patternfly/react-tokens": "^6.3.1", @@ -3875,24 +3857,6 @@ "react-dom": "^17 || ^18 || ^19" } }, - "node_modules/@patternfly/react-table/node_modules/@patternfly/react-core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", - "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", - "license": "MIT", - "dependencies": { - "@patternfly/react-icons": "6.3.1", - "@patternfly/react-styles": "^6.3.1", - "@patternfly/react-tokens": "^6.3.1", - "focus-trap": "7.6.4", - "react-dropzone": "^14.3.5", - "tslib": "^2.8.1" - }, - "peerDependencies": { - "react": "^17 || ^18 || ^19", - "react-dom": "^17 || ^18 || ^19" - } - }, "node_modules/@patternfly/react-tokens": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/@patternfly/react-tokens/-/react-tokens-6.3.1.tgz", @@ -22985,26 +22949,11 @@ "integrity": "sha512-lzrION96CR2G3ASjE++dX/dExH08HVcCLXbHdmiiTL4eHfbqXt4edDc+UX619XrbaccJBE+BxNNGKyO8bgpKRg==", "requires": { "@monaco-editor/react": "^4.6.0", - "@patternfly/react-core": "^6.3.1", + "@patternfly/react-core": "6.3.1", "@patternfly/react-icons": "^6.3.1", "@patternfly/react-styles": "^6.3.1", "react-dropzone": "14.3.5", "tslib": "^2.8.1" - }, - "dependencies": { - "@patternfly/react-core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", - "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", - "requires": { - "@patternfly/react-icons": "^6.3.1", - "@patternfly/react-styles": "^6.3.1", - "@patternfly/react-tokens": "^6.3.1", - "focus-trap": "7.6.4", - "react-dropzone": "^14.3.5", - "tslib": "^2.8.1" - } - } } }, "@patternfly/react-component-groups": { @@ -23020,13 +22969,13 @@ } }, "@patternfly/react-core": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.0.tgz", - "integrity": "sha512-TM+pLwLd5DzaDlOQhqeju9H9QUFQypQiNwXQLNIxOV5r3fmKh4NTp2Av/8WmFkpCj8mejDOfp4TNxoU1zdjCkQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", + "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", "requires": { - "@patternfly/react-icons": "^6.3.0", - "@patternfly/react-styles": "^6.3.0", - "@patternfly/react-tokens": "^6.3.0", + "@patternfly/react-icons": "^6.3.1", + "@patternfly/react-styles": "^6.3.1", + "@patternfly/react-tokens": "^6.3.1", "focus-trap": "7.6.4", "react-dropzone": "^14.3.5", "tslib": "^2.8.1" @@ -23048,27 +22997,12 @@ "resolved": "https://registry.npmjs.org/@patternfly/react-table/-/react-table-6.3.1.tgz", "integrity": "sha512-ZndBbPcMr/vInP5eELRe9m7MWzRoejRAhWx+25xOdjVAd31/CmMK1nBgZk4QAXaWjH1P+uZaZYsTgr/FMTte2g==", "requires": { - "@patternfly/react-core": "^6.3.1", + "@patternfly/react-core": "6.3.1", "@patternfly/react-icons": "6.3.1", "@patternfly/react-styles": "^6.3.1", "@patternfly/react-tokens": "^6.3.1", "lodash": "^4.17.21", "tslib": "^2.8.1" - }, - "dependencies": { - "@patternfly/react-core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@patternfly/react-core/-/react-core-6.3.1.tgz", - "integrity": "sha512-1qV20nU4M6PA28qnikH9fPLQlkteaZZToFlATjBNBw7aUI6zIvj7U0akkHz8raWcfHAI+tAzGV7dfKjiv035/g==", - "requires": { - "@patternfly/react-icons": "6.3.1", - "@patternfly/react-styles": "^6.3.1", - "@patternfly/react-tokens": "^6.3.1", - "focus-trap": "7.6.4", - "react-dropzone": "^14.3.5", - "tslib": "^2.8.1" - } - } } }, "@patternfly/react-tokens": { diff --git a/package.json b/package.json index 865bf33f..805925d9 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "@ltd/j-toml": "1.38.0", "@patternfly/patternfly": "6.3.0", "@patternfly/react-code-editor": "6.3.1", - "@patternfly/react-core": "6.3.0", + "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", "@redhat-cloud-services/frontend-components": "7.0.3", "@redhat-cloud-services/frontend-components-notifications": "6.1.3", From bf77501eea975410674d0936ed766c2dd4f243ab Mon Sep 17 00:00:00 2001 From: Michal Gold Date: Wed, 13 Aug 2025 12:43:19 +0300 Subject: [PATCH 03/31] Wizard: Display customized policy rules in review summary Previously, when a user selected a compliance policy with tailored rules, the review page always showed the default profile customizations instead of the policy-specific customizations. Root cause: OscapProfileInformation component was only using the profile endpoint (/oscap/{distribution}/{profile}/customizations) which returns base profile rules, not the policy endpoint (/oscap/{policy}/{distribution}/policy_customizations) which returns customized rules. Changes: - Add useGetOscapCustomizationsForPolicyQuery export to backendApi - Implement dual data fetching in OscapProfileInformation: * Profile endpoint: for description and reference ID * Policy endpoint: for customized packages, services, kernel args Fixes the compliance policy customization display bug where edited policy rules were not reflected in the image build summary. Add unit tests for compliance policy customizations Fix profile description title --- .../components/OscapProfileInformation.tsx | 64 +++++++++++++++---- .../steps/Oscap/components/PolicySelector.tsx | 12 ++-- src/store/backendApi.ts | 6 ++ .../steps/Oscap/Oscap.test.tsx | 26 ++++++++ src/test/fixtures/compliance.ts | 14 +++- src/test/fixtures/oscap.ts | 16 +++-- 6 files changed, 115 insertions(+), 23 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx index d8aa0102..a2d8a404 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/OscapProfileInformation.tsx @@ -8,7 +8,10 @@ import { Spinner, } from '@patternfly/react-core'; -import { useGetOscapCustomizationsQuery } from '../../../../../store/backendApi'; +import { + useGetComplianceCustomizationsQuery, + useGetOscapCustomizationsQuery, +} from '../../../../../store/backendApi'; import { PolicyRead, usePolicyQuery } from '../../../../../store/complianceApi'; import { useAppDispatch, useAppSelector } from '../../../../../store/hooks'; import { OpenScapProfile } from '../../../../../store/imageBuilderApi'; @@ -16,6 +19,7 @@ import { changeCompliance, selectCompliancePolicyID, selectComplianceProfileID, + selectComplianceType, selectDistribution, selectFips, } from '../../../../../store/wizardSlice'; @@ -31,12 +35,29 @@ export const OscapProfileInformation = ({ const release = useAppSelector(selectDistribution); const compliancePolicyID = useAppSelector(selectCompliancePolicyID); const complianceProfileID = useAppSelector(selectComplianceProfileID); + const complianceType = useAppSelector(selectComplianceType); const fips = useAppSelector(selectFips); + const { + data: oscapPolicyInfo, + isFetching: isFetchingOscapPolicyInfo, + isSuccess: isSuccessOscapPolicyInfo, + error: policyError, + } = useGetComplianceCustomizationsQuery( + { + distribution: release, + policy: compliancePolicyID!, + }, + { + skip: !compliancePolicyID || !!process.env.IS_ON_PREMISE, + }, + ); + const { data: oscapProfileInfo, isFetching: isFetchingOscapProfileInfo, isSuccess: isSuccessOscapProfileInfo, + error: profileError, } = useGetOscapCustomizationsQuery( { distribution: release, @@ -48,6 +69,20 @@ export const OscapProfileInformation = ({ }, ); + const customizationData = + compliancePolicyID && oscapPolicyInfo ? oscapPolicyInfo : oscapProfileInfo; + const profileMetadata = oscapProfileInfo; + const isPolicyDataLoading = compliancePolicyID + ? isFetchingOscapPolicyInfo + : false; + const isFetchingOscapData = isPolicyDataLoading || isFetchingOscapProfileInfo; + const isPolicyDataSuccess = compliancePolicyID + ? isSuccessOscapPolicyInfo + : true; + const isSuccessOscapData = isPolicyDataSuccess && isSuccessOscapProfileInfo; + const hasCriticalError = profileError || (compliancePolicyID && policyError); + const shouldShowData = isSuccessOscapData && !hasCriticalError; + const { data: policyInfo, isFetching: isFetchingPolicyInfo, @@ -74,23 +109,28 @@ export const OscapProfileInformation = ({ policyTitle: pol.title, }), ); - }, [isSuccessPolicyInfo]); + }, [isSuccessPolicyInfo, dispatch, policyInfo]); - const oscapProfile = oscapProfileInfo?.openscap as OpenScapProfile; + const oscapProfile = profileMetadata?.openscap as OpenScapProfile | undefined; return ( <> - {(isFetchingOscapProfileInfo || isFetchingPolicyInfo) && ( - + {(isFetchingOscapData || isFetchingPolicyInfo) && } + {hasCriticalError && ( + + Unable to load compliance information. Please try again. + )} - {isSuccessOscapProfileInfo && ( + {shouldShowData && ( <> - Profile description + {complianceType === 'compliance' + ? 'Policy description' + : 'Profile description'} {oscapProfile?.profile_description} @@ -116,7 +156,7 @@ export const OscapProfileInformation = ({ - {(oscapProfileInfo?.packages ?? []).join(', ')} + {(customizationData?.packages ?? []).join(', ')} @@ -129,7 +169,7 @@ export const OscapProfileInformation = ({ - {oscapProfileInfo?.kernel?.append} + {customizationData?.kernel?.append} @@ -142,7 +182,7 @@ export const OscapProfileInformation = ({ - {(oscapProfileInfo?.services?.enabled ?? []).join(' ')} + {(customizationData?.services?.enabled ?? []).join(' ')} @@ -155,8 +195,8 @@ export const OscapProfileInformation = ({ - {(oscapProfileInfo?.services?.disabled ?? []) - .concat(oscapProfileInfo?.services?.masked ?? []) + {(customizationData?.services?.disabled ?? []) + .concat(customizationData?.services?.masked ?? []) .join(' ')} diff --git a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx index 5e2cf9c8..6f407aec 100644 --- a/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx +++ b/src/Components/CreateImageWizard/steps/Oscap/components/PolicySelector.tsx @@ -10,15 +10,15 @@ import { import { useSelectorHandlers } from './useSelectorHandlers'; +import { + useGetComplianceCustomizationsQuery, + useLazyGetComplianceCustomizationsQuery, +} from '../../../../../store/backendApi'; import { PolicyRead, usePoliciesQuery, } from '../../../../../store/complianceApi'; import { useAppDispatch, useAppSelector } from '../../../../../store/hooks'; -import { - useGetOscapCustomizationsForPolicyQuery, - useLazyGetOscapCustomizationsForPolicyQuery, -} from '../../../../../store/imageBuilderApi'; import { changeCompliance, changeFileSystemConfigurationType, @@ -97,7 +97,7 @@ const PolicySelector = () => { filter: `os_major_version=${majorVersion}`, }); - const { data: currentProfileData } = useGetOscapCustomizationsForPolicyQuery( + const { data: currentProfileData } = useGetComplianceCustomizationsQuery( { distribution: release, policy: policyID!, @@ -105,7 +105,7 @@ const PolicySelector = () => { { skip: !policyID }, ); - const [trigger] = useLazyGetOscapCustomizationsForPolicyQuery(); + const [trigger] = useLazyGetComplianceCustomizationsQuery(); useEffect(() => { if (!policies || policies.data === undefined) { diff --git a/src/store/backendApi.ts b/src/store/backendApi.ts index 55e94173..6fa85557 100644 --- a/src/store/backendApi.ts +++ b/src/store/backendApi.ts @@ -43,6 +43,12 @@ export const useLazyGetOscapCustomizationsQuery = process.env.IS_ON_PREMISE ? cockpitQueries.useLazyGetOscapCustomizationsQuery : serviceQueries.useLazyGetOscapCustomizationsQuery; +export const useGetComplianceCustomizationsQuery = + serviceQueries.useGetOscapCustomizationsForPolicyQuery; + +export const useLazyGetComplianceCustomizationsQuery = + serviceQueries.useLazyGetOscapCustomizationsForPolicyQuery; + export const useComposeBlueprintMutation = process.env.IS_ON_PREMISE ? cockpitQueries.useComposeBlueprintMutation : serviceQueries.useComposeBlueprintMutation; diff --git a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx index 6feb8098..90a3b183 100644 --- a/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Oscap/Oscap.test.tsx @@ -332,4 +332,30 @@ describe('OpenSCAP edit mode', () => { user.click(selectedBtn); await screen.findByText('neovim'); }); + + test('customized policy shows only non-removed rules', async () => { + const { oscapCustomizations, oscapCustomizationsPolicy } = await import( + '../../../../fixtures/oscap' + ); + + const profileId = 'xccdf_org.ssgproject.content_profile_cis_workstation_l1'; + const normalProfile = oscapCustomizations(profileId); + expect(normalProfile.packages).toEqual(['aide', 'neovim']); + const customPolicy = oscapCustomizationsPolicy('custom-policy-123'); + expect(customPolicy.packages).toEqual(['neovim']); + await renderCreateMode(); + await selectRhel9(); + await selectGuestImageTarget(); + await goToOscapStep(); + await selectProfile(); + + await waitFor(() => { + expect(screen.getByText(/aide, neovim/i)).toBeInTheDocument(); + }); + + expect(customPolicy.packages).not.toContain('aide'); + expect(customPolicy.packages).toContain('neovim'); + expect(normalProfile.packages).toContain('aide'); + expect(normalProfile.packages).toContain('neovim'); + }); }); diff --git a/src/test/fixtures/compliance.ts b/src/test/fixtures/compliance.ts index 5556352f..83afabd7 100644 --- a/src/test/fixtures/compliance.ts +++ b/src/test/fixtures/compliance.ts @@ -36,8 +36,20 @@ export const mockPolicies = { profile_title: 'DISA STIG with GUI for Red Hat Enterprise Linux 8', ref_id: 'xccdf_org.ssgproject.content_profile_stig_gui', }, + { + id: 'custom-policy-123', + title: 'Custom CIS Policy (Partial Rules)', + description: 'A customized policy where user removed some rules', + compliance_threshold: 100, + total_system_count: 5, + type: 'policy', + os_major_version: 8, + profile_title: + 'Custom CIS Red Hat Enterprise Linux 8 Benchmark for Level 1 - Workstation', + ref_id: 'xccdf_org.ssgproject.content_profile_cis_workstation_l1', + }, ], meta: { - total: 3, + total: 4, }, }; diff --git a/src/test/fixtures/oscap.ts b/src/test/fixtures/oscap.ts index 6f807460..de50ce9b 100644 --- a/src/test/fixtures/oscap.ts +++ b/src/test/fixtures/oscap.ts @@ -124,9 +124,17 @@ export const oscapCustomizationsPolicy = ( ): GetOscapCustomizationsApiResponse => { const policyData = mockPolicies.data.find((p) => p.id === policy); const customizations = oscapCustomizations(policyData!.ref_id); - // filter out a single package to simulate the customizations being tailored - customizations.packages = customizations.packages!.filter( - (p) => p !== 'aide', - ); + + // Simulate different levels of customization based on policy + if (policy === 'custom-policy-123') { + // This policy has user-customized rules - only neovim remains + customizations.packages = ['neovim']; // User removed aide package + } else { + // Other policies: filter out a single package to simulate basic customizations + customizations.packages = customizations.packages!.filter( + (p) => p !== 'aide', + ); + } + return customizations; }; From f6f6e584498042dc17ea136eac286e9561897958 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Aug 2025 04:43:46 +0000 Subject: [PATCH 04/31] build(deps): bump @patternfly/patternfly from 6.3.0 to 6.3.1 Bumps [@patternfly/patternfly](https://github.com/patternfly/patternfly) from 6.3.0 to 6.3.1. - [Release notes](https://github.com/patternfly/patternfly/releases) - [Changelog](https://github.com/patternfly/patternfly/blob/main/release.config.js) - [Commits](https://github.com/patternfly/patternfly/compare/v6.3.0...v6.3.1) --- updated-dependencies: - dependency-name: "@patternfly/patternfly" dependency-version: 6.3.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2a943df8..2959c253 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "hasInstallScript": true, "dependencies": { "@ltd/j-toml": "1.38.0", - "@patternfly/patternfly": "6.3.0", + "@patternfly/patternfly": "6.3.1", "@patternfly/react-code-editor": "6.3.1", "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", @@ -3765,9 +3765,9 @@ } }, "node_modules/@patternfly/patternfly": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.3.0.tgz", - "integrity": "sha512-I/Z0uuaVYfv9QqNAP2/iCGUGhUb0idatNTfFLQk0VnUi2hSMgznDogvAjmlVtZu2DW0P0FymS0oo5EjL+uW6Dg==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.3.1.tgz", + "integrity": "sha512-O/lTo5EHKzer/HNzqMQOQEAMG7izDDkEHpAeJ5+sGaeQ/maB3RK7sQsOPS4DjrnMxt4/cC6LogK2mowlbf1j5Q==", "license": "MIT" }, "node_modules/@patternfly/react-code-editor": { @@ -22939,9 +22939,9 @@ "optional": true }, "@patternfly/patternfly": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.3.0.tgz", - "integrity": "sha512-I/Z0uuaVYfv9QqNAP2/iCGUGhUb0idatNTfFLQk0VnUi2hSMgznDogvAjmlVtZu2DW0P0FymS0oo5EjL+uW6Dg==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@patternfly/patternfly/-/patternfly-6.3.1.tgz", + "integrity": "sha512-O/lTo5EHKzer/HNzqMQOQEAMG7izDDkEHpAeJ5+sGaeQ/maB3RK7sQsOPS4DjrnMxt4/cC6LogK2mowlbf1j5Q==" }, "@patternfly/react-code-editor": { "version": "6.3.1", diff --git a/package.json b/package.json index 805925d9..8859fe67 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ }, "dependencies": { "@ltd/j-toml": "1.38.0", - "@patternfly/patternfly": "6.3.0", + "@patternfly/patternfly": "6.3.1", "@patternfly/react-code-editor": "6.3.1", "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", From 54e413f4591ede84e5562c4216c01a1526f6a659 Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Thu, 14 Aug 2025 14:48:25 +0200 Subject: [PATCH 05/31] Wizard: fix overflowing bp name Truncate the name of a bp if it's too long and does not fit the Blueprint card on landing page. Not sure truncating is what we want tho. Fixes #3034 --- src/Components/Blueprints/BlueprintCard.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Components/Blueprints/BlueprintCard.tsx b/src/Components/Blueprints/BlueprintCard.tsx index 7a2ddb95..7bb47aad 100644 --- a/src/Components/Blueprints/BlueprintCard.tsx +++ b/src/Components/Blueprints/BlueprintCard.tsx @@ -8,6 +8,7 @@ import { CardHeader, CardTitle, Spinner, + Truncate, } from '@patternfly/react-core'; import { useDeleteBPWithNotification as useDeleteBlueprintMutation } from '../../Hooks'; @@ -54,7 +55,7 @@ const BlueprintCard = ({ blueprint }: blueprintProps) => { {isLoading && blueprint.id === selectedBlueprintId && ( )} - {blueprint.name} + {blueprint.description} From 3e2e9dcaa60388be97af2c8bcc789ecd3ddd5cb6 Mon Sep 17 00:00:00 2001 From: "red-hat-konflux[bot]" <126015336+red-hat-konflux[bot]@users.noreply.github.com> Date: Sat, 16 Aug 2025 08:27:16 +0000 Subject: [PATCH 06/31] chore(deps): update konflux references Signed-off-by: red-hat-konflux <126015336+red-hat-konflux[bot]@users.noreply.github.com> --- .tekton/image-builder-frontend-pull-request.yaml | 8 ++++---- .tekton/image-builder-frontend-push.yaml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.tekton/image-builder-frontend-pull-request.yaml b/.tekton/image-builder-frontend-pull-request.yaml index 2f7c1683..111fde6d 100644 --- a/.tekton/image-builder-frontend-pull-request.yaml +++ b/.tekton/image-builder-frontend-pull-request.yaml @@ -194,7 +194,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:76bc23ca84c6b31251fee267f417ed262d9ea49655e942d1978149e137295bb0 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:ce5f2485d759221444357fe38276be876fc54531651e50dcfc0f84b34909d760 - name: kind value: task resolver: bundles @@ -238,7 +238,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:09ca1ce263bb686b08187a3b836f6a5bd54875e8596105e4d7d816d57caf55a0 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:7782cb7462130de8e8839a58dd15ed78e50938d718b51375267679c6044b4367 - name: kind value: task resolver: bundles @@ -413,7 +413,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:4bafcaab0f0c998a89a1cc33bdbbf74f39eea52e6c0e43013c356a322f94940f + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:1f151e00f7fc427654b7b76045a426bb02fe650d192ffe147a304d2184787e38 - name: kind value: task resolver: bundles @@ -503,7 +503,7 @@ spec: - name: name value: push-dockerfile - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:5446102f233991bdc73451201adf361766d45c638f3d89f19121ae1c2ba8bf17 + value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:d5cb22a833be51dd72a872cac8bfbe149e8ad34da7cb48a643a1e613447a1f9d - name: kind value: task resolver: bundles diff --git a/.tekton/image-builder-frontend-push.yaml b/.tekton/image-builder-frontend-push.yaml index 81f634d3..ff7ad971 100644 --- a/.tekton/image-builder-frontend-push.yaml +++ b/.tekton/image-builder-frontend-push.yaml @@ -191,7 +191,7 @@ spec: - name: name value: prefetch-dependencies - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:76bc23ca84c6b31251fee267f417ed262d9ea49655e942d1978149e137295bb0 + value: quay.io/konflux-ci/tekton-catalog/task-prefetch-dependencies:0.2@sha256:ce5f2485d759221444357fe38276be876fc54531651e50dcfc0f84b34909d760 - name: kind value: task resolver: bundles @@ -235,7 +235,7 @@ spec: - name: name value: buildah - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:09ca1ce263bb686b08187a3b836f6a5bd54875e8596105e4d7d816d57caf55a0 + value: quay.io/konflux-ci/tekton-catalog/task-buildah:0.4@sha256:7782cb7462130de8e8839a58dd15ed78e50938d718b51375267679c6044b4367 - name: kind value: task resolver: bundles @@ -410,7 +410,7 @@ spec: - name: name value: ecosystem-cert-preflight-checks - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:4bafcaab0f0c998a89a1cc33bdbbf74f39eea52e6c0e43013c356a322f94940f + value: quay.io/konflux-ci/tekton-catalog/task-ecosystem-cert-preflight-checks:0.2@sha256:1f151e00f7fc427654b7b76045a426bb02fe650d192ffe147a304d2184787e38 - name: kind value: task resolver: bundles @@ -500,7 +500,7 @@ spec: - name: name value: push-dockerfile - name: bundle - value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:5446102f233991bdc73451201adf361766d45c638f3d89f19121ae1c2ba8bf17 + value: quay.io/konflux-ci/tekton-catalog/task-push-dockerfile:0.1@sha256:d5cb22a833be51dd72a872cac8bfbe149e8ad34da7cb48a643a1e613447a1f9d - name: kind value: task resolver: bundles From 04f0528701fff8606b5081ecf7a9c96e85f38d08 Mon Sep 17 00:00:00 2001 From: regexowl Date: Fri, 15 Aug 2025 09:23:54 +0200 Subject: [PATCH 07/31] devDeps: Bump stylelint deps This bumps stylelint-config-recommended-scss from 15.0.1 to 16.0.0 and stylelint from 16.23.0 to 16.23.1, these need to be bumped together --- package-lock.json | 52 +++++++++++++++++++++++------------------------ package.json | 4 ++-- 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2959c253..0ac5980f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -90,8 +90,8 @@ "redux-mock-store": "1.5.5", "sass": "1.90.0", "sass-loader": "16.0.5", - "stylelint": "16.23.0", - "stylelint-config-recommended-scss": "15.0.1", + "stylelint": "16.23.1", + "stylelint-config-recommended-scss": "16.0.0", "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", @@ -18142,9 +18142,9 @@ "license": "MIT" }, "node_modules/stylelint": { - "version": "16.23.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.0.tgz", - "integrity": "sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==", + "version": "16.23.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", + "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", "dev": true, "funding": [ { @@ -18205,9 +18205,9 @@ } }, "node_modules/stylelint-config-recommended": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", - "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", + "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", "dev": true, "funding": [ { @@ -18224,26 +18224,26 @@ "node": ">=18.12.0" }, "peerDependencies": { - "stylelint": "^16.16.0" + "stylelint": "^16.23.0" } }, "node_modules/stylelint-config-recommended-scss": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-15.0.1.tgz", - "integrity": "sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.0.tgz", + "integrity": "sha512-Vh09MlGgKUwgHwuTQXPI6CbwMgXEUpjv+6EpVhZtHkGUJY7yFIoJby3Wcjd12rvdp6xOMdMIKU48Qu6KwZK+mw==", "dev": true, "license": "MIT", "dependencies": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^16.0.0", - "stylelint-scss": "^6.12.0" + "stylelint-config-recommended": "^17.0.0", + "stylelint-scss": "^6.12.1" }, "engines": { "node": ">=20" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^16.16.0" + "stylelint": "^16.23.1" }, "peerDependenciesMeta": { "postcss": { @@ -32063,9 +32063,9 @@ } }, "stylelint": { - "version": "16.23.0", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.0.tgz", - "integrity": "sha512-69T5aS2LUY306ekt1Q1oaSPwz/jaG9HjyMix3UMrai1iEbuOafBe2Dh8xlyczrxFAy89qcKyZWWtc42XLx3Bbw==", + "version": "16.23.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.23.1.tgz", + "integrity": "sha512-dNvDTsKV1U2YtiUDfe9d2gp902veFeo3ecCWdGlmLm2WFrAV0+L5LoOj/qHSBABQwMsZPJwfC4bf39mQm1S5zw==", "dev": true, "requires": { "@csstools/css-parser-algorithms": "^3.0.5", @@ -32155,21 +32155,21 @@ } }, "stylelint-config-recommended": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-16.0.0.tgz", - "integrity": "sha512-4RSmPjQegF34wNcK1e1O3Uz91HN8P1aFdFzio90wNK9mjgAI19u5vsU868cVZboKzCaa5XbpvtTzAAGQAxpcXA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", + "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", "dev": true, "requires": {} }, "stylelint-config-recommended-scss": { - "version": "15.0.1", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-15.0.1.tgz", - "integrity": "sha512-V24bxkNkFGggqPVJlP9iXaBabwSGEG7QTz+PyxrRtjPkcF+/NsWtB3tKYvFYEmczRkWiIEfuFMhGpJFj9Fxe6Q==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.0.tgz", + "integrity": "sha512-Vh09MlGgKUwgHwuTQXPI6CbwMgXEUpjv+6EpVhZtHkGUJY7yFIoJby3Wcjd12rvdp6xOMdMIKU48Qu6KwZK+mw==", "dev": true, "requires": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^16.0.0", - "stylelint-scss": "^6.12.0" + "stylelint-config-recommended": "^17.0.0", + "stylelint-scss": "^6.12.1" } }, "stylelint-scss": { diff --git a/package.json b/package.json index 8859fe67..12a1e63c 100644 --- a/package.json +++ b/package.json @@ -88,8 +88,8 @@ "redux-mock-store": "1.5.5", "sass": "1.90.0", "sass-loader": "16.0.5", - "stylelint": "16.23.0", - "stylelint-config-recommended-scss": "15.0.1", + "stylelint": "16.23.1", + "stylelint-config-recommended-scss": "16.0.0", "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", From 3e5c5dca76882943057e607076496263b0c5000a Mon Sep 17 00:00:00 2001 From: regexowl Date: Fri, 15 Aug 2025 09:05:40 +0200 Subject: [PATCH 08/31] devDeps: Bump typescript deps This bumps @typescript-eslint/eslint-plugin and @typescript-eslint/parser from 8.39.0 to 8.39.1 These need to be bumped in tandem. --- package-lock.json | 458 +++++++++++++++++++++++----------------------- package.json | 4 +- 2 files changed, 231 insertions(+), 231 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0ac5980f..1084355c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,8 +53,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", "@vitejs/plugin-react": "4.7.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", @@ -5799,17 +5799,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", + "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/type-utils": "8.39.1", + "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5823,20 +5823,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.0", + "@typescript-eslint/parser": "^8.39.1", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "engines": { @@ -5851,14 +5851,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5869,9 +5869,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "license": "MIT", "engines": { @@ -5886,9 +5886,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true, "license": "MIT", "engines": { @@ -5900,16 +5900,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -5929,16 +5929,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5953,13 +5953,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6020,16 +6020,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", + "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4" }, "engines": { @@ -6045,14 +6045,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "engines": { @@ -6067,14 +6067,14 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6085,9 +6085,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "license": "MIT", "engines": { @@ -6102,9 +6102,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true, "license": "MIT", "engines": { @@ -6116,16 +6116,16 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6145,13 +6145,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -6259,15 +6259,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", + "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6284,14 +6284,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" }, "engines": { @@ -6306,14 +6306,14 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6324,9 +6324,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "license": "MIT", "engines": { @@ -6341,9 +6341,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true, "license": "MIT", "engines": { @@ -6355,16 +6355,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6384,16 +6384,16 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6408,13 +6408,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -24228,16 +24228,16 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.0.tgz", - "integrity": "sha512-bhEz6OZeUR+O/6yx9Jk6ohX6H9JSFTaiY0v9/PuKT3oGK0rn0jNplLmyFUGV+a9gfYnVNwGDwS/UkLIuXNb2Rw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", + "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/type-utils": "8.39.0", - "@typescript-eslint/utils": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/type-utils": "8.39.1", + "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -24245,49 +24245,49 @@ }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "requires": {} }, "@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -24297,24 +24297,24 @@ } }, "@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" } }, "@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" } }, @@ -24346,62 +24346,62 @@ } }, "@typescript-eslint/parser": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.0.tgz", - "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", + "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "requires": {} }, "@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -24411,12 +24411,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" } }, @@ -24470,62 +24470,62 @@ "requires": {} }, "@typescript-eslint/type-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.0.tgz", - "integrity": "sha512-6B3z0c1DXVT2vYA9+z9axjtc09rqKUPRmijD5m9iv8iQpHBRYRMBcgxSiKTZKm6FwWw1/cI4v6em35OsKCiN5Q==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", + "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0", - "@typescript-eslint/utils": "8.39.0", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1", + "@typescript-eslint/utils": "8.39.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "dependencies": { "@typescript-eslint/project-service": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.0.tgz", - "integrity": "sha512-CTzJqaSq30V/Z2Og9jogzZt8lJRR5TKlAdXmWgdu4hgcC9Kww5flQ+xFvMxIBWVNdxJO7OifgdOK4PokMIWPew==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", + "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.0", - "@typescript-eslint/types": "^8.39.0", + "@typescript-eslint/tsconfig-utils": "^8.39.1", + "@typescript-eslint/types": "^8.39.1", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.0.tgz", - "integrity": "sha512-8QOzff9UKxOh6npZQ/4FQu4mjdOCGSdO3p44ww0hk8Vu+IGbg0tB/H1LcTARRDzGCC8pDGbh2rissBuuoPgH8A==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", + "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0" + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.0.tgz", - "integrity": "sha512-Fd3/QjmFV2sKmvv3Mrj8r6N8CryYiCS8Wdb/6/rgOXAWGcFuc+VkQuG28uk/4kVNVZBQuuDHEDUpo/pQ32zsIQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", + "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", "dev": true, "requires": {} }, "@typescript-eslint/types": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.0.tgz", - "integrity": "sha512-ArDdaOllnCj3yn/lzKn9s0pBQYmmyme/v1HbGIGB0GB/knFI3fWMHloC+oYTJW46tVbYnGKTMDK4ah1sC2v0Kg==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", + "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.0.tgz", - "integrity": "sha512-ndWdiflRMvfIgQRpckQQLiB5qAKQ7w++V4LlCHwp62eym1HLB/kw7D9f2e8ytONls/jt89TEasgvb+VwnRprsw==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", + "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.39.0", - "@typescript-eslint/tsconfig-utils": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/visitor-keys": "8.39.0", + "@typescript-eslint/project-service": "8.39.1", + "@typescript-eslint/tsconfig-utils": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/visitor-keys": "8.39.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -24535,24 +24535,24 @@ } }, "@typescript-eslint/utils": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.0.tgz", - "integrity": "sha512-4GVSvNA0Vx1Ktwvf4sFE+exxJ3QGUorQG1/A5mRfRNZtkBT2xrA/BCO2H0eALx/PnvCS6/vmYwRdDA41EoffkQ==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", + "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.0", - "@typescript-eslint/types": "8.39.0", - "@typescript-eslint/typescript-estree": "8.39.0" + "@typescript-eslint/scope-manager": "8.39.1", + "@typescript-eslint/types": "8.39.1", + "@typescript-eslint/typescript-estree": "8.39.1" } }, "@typescript-eslint/visitor-keys": { - "version": "8.39.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.0.tgz", - "integrity": "sha512-ldgiJ+VAhQCfIjeOgu8Kj5nSxds0ktPOSO9p4+0VDH2R2pLvQraaM5Oen2d7NxzMCm+Sn/vJT+mv2H5u6b/3fA==", + "version": "8.39.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", + "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.0", + "@typescript-eslint/types": "8.39.1", "eslint-visitor-keys": "^4.2.1" } }, diff --git a/package.json b/package.json index 12a1e63c..e3184030 100644 --- a/package.json +++ b/package.json @@ -51,8 +51,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.39.0", - "@typescript-eslint/parser": "8.39.0", + "@typescript-eslint/eslint-plugin": "8.39.1", + "@typescript-eslint/parser": "8.39.1", "@vitejs/plugin-react": "4.7.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", From bc3288a83eeec1255b46513ea8b17dd8a3b5c92f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 07:04:57 +0000 Subject: [PATCH 09/31] build(deps-dev): bump eslint-plugin-prettier from 5.5.3 to 5.5.4 Bumps [eslint-plugin-prettier](https://github.com/prettier/eslint-plugin-prettier) from 5.5.3 to 5.5.4. - [Release notes](https://github.com/prettier/eslint-plugin-prettier/releases) - [Changelog](https://github.com/prettier/eslint-plugin-prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/eslint-plugin-prettier/compare/v5.5.3...v5.5.4) --- updated-dependencies: - dependency-name: eslint-plugin-prettier dependency-version: 5.5.4 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1084355c..d97bd90c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -69,7 +69,7 @@ "eslint-plugin-jest-dom": "5.5.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-playwright": "2.2.2", - "eslint-plugin-prettier": "5.5.3", + "eslint-plugin-prettier": "5.5.4", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-redux": "4.2.2", @@ -10290,9 +10290,9 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", - "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "license": "MIT", "dependencies": { @@ -27112,9 +27112,9 @@ } }, "eslint-plugin-prettier": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.3.tgz", - "integrity": "sha512-NAdMYww51ehKfDyDhv59/eIItUVzU0Io9H2E8nHNGKEeeqlnci+1gCvrHib6EmZdf6GxF+LCV5K7UC65Ezvw7w==", + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", "dev": true, "requires": { "prettier-linter-helpers": "^1.0.0", diff --git a/package.json b/package.json index e3184030..814b4a76 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "eslint-plugin-jest-dom": "5.5.0", "eslint-plugin-jsx-a11y": "6.10.2", "eslint-plugin-playwright": "2.2.2", - "eslint-plugin-prettier": "5.5.3", + "eslint-plugin-prettier": "5.5.4", "eslint-plugin-react": "7.37.5", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-redux": "4.2.2", From 63f55c74083912e7aff089c95aa9057c2d7cfbb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 07:01:41 +0000 Subject: [PATCH 10/31] build(deps-dev): bump eslint from 9.32.0 to 9.33.0 Bumps [eslint](https://github.com/eslint/eslint) from 9.32.0 to 9.33.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v9.32.0...v9.33.0) --- updated-dependencies: - dependency-name: eslint dependency-version: 9.33.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 89 ++++++++++++++++++++++++++++------------------- package.json | 2 +- 2 files changed, 55 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index d97bd90c..57f54e28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "chartjs-plugin-annotation": "3.1.0", "copy-webpack-plugin": "13.0.0", "css-loader": "7.1.2", - "eslint": "9.32.0", + "eslint": "9.33.0", "eslint-plugin-disable-autofix": "5.0.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jest-dom": "5.5.0", @@ -3016,9 +3016,9 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -3026,9 +3026,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -3147,13 +3147,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" }, "engines": { @@ -9955,20 +9955,20 @@ } }, "node_modules/eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -10495,6 +10495,19 @@ "node": ">=10" } }, + "node_modules/eslint/node_modules/@eslint/js": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "dev": true, @@ -22476,15 +22489,15 @@ } }, "@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", "dev": true }, "@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", "dev": true, "requires": { "@types/json-schema": "^7.0.15" @@ -22565,12 +22578,12 @@ "dev": true }, "@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", "dev": true, "requires": { - "@eslint/core": "^0.15.1", + "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, @@ -26830,19 +26843,19 @@ } }, "eslint": { - "version": "9.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.32.0.tgz", - "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.33.0.tgz", + "integrity": "sha512-TS9bTNIryDzStCpJN93aC5VRSW3uTx9sClUn4B87pwiCaJh220otoI0X8mJKr+VcPtniMdN8GKjlwgWGUv5ZKA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.32.0", - "@eslint/plugin-kit": "^0.3.4", + "@eslint/js": "9.33.0", + "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -26872,6 +26885,12 @@ "optionator": "^0.9.3" }, "dependencies": { + "@eslint/js": { + "version": "9.33.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.33.0.tgz", + "integrity": "sha512-5K1/mKhWaMfreBGJTwval43JJmkip0RmM+3+IuqupeSKNC/Th2Kc7ucaq5ovTSra/OOKB9c58CGSz3QMVbWt0A==", + "dev": true + }, "ajv": { "version": "6.12.6", "dev": true, diff --git a/package.json b/package.json index 814b4a76..79c06735 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "chartjs-plugin-annotation": "3.1.0", "copy-webpack-plugin": "13.0.0", "css-loader": "7.1.2", - "eslint": "9.32.0", + "eslint": "9.33.0", "eslint-plugin-disable-autofix": "5.0.1", "eslint-plugin-import": "2.32.0", "eslint-plugin-jest-dom": "5.5.0", From 4b188a03935b1a7ba731d1ecf4f5a4dd89e61166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Aug 2025 09:43:42 +0000 Subject: [PATCH 11/31] build(deps): bump @sentry/webpack-plugin from 4.1.0 to 4.1.1 Bumps [@sentry/webpack-plugin](https://github.com/getsentry/sentry-javascript-bundler-plugins) from 4.1.0 to 4.1.1. - [Release notes](https://github.com/getsentry/sentry-javascript-bundler-plugins/releases) - [Changelog](https://github.com/getsentry/sentry-javascript-bundler-plugins/blob/main/CHANGELOG.md) - [Commits](https://github.com/getsentry/sentry-javascript-bundler-plugins/compare/4.1.0...4.1.1) --- updated-dependencies: - dependency-name: "@sentry/webpack-plugin" dependency-version: 4.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package-lock.json | 186 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 94 insertions(+), 94 deletions(-) diff --git a/package-lock.json b/package-lock.json index 57f54e28..ca86cef5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@redhat-cloud-services/frontend-components-utilities": "7.0.3", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", - "@sentry/webpack-plugin": "4.1.0", + "@sentry/webpack-plugin": "4.1.1", "@unleash/proxy-client-react": "5.0.1", "classnames": "2.5.1", "jwt-decode": "4.0.0", @@ -4789,9 +4789,9 @@ } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.0.tgz", - "integrity": "sha512-UkcnqC7Bp9ODyoBN7BKcRotd1jz/I2vyruE/qjNfRC7UnP+jIRItUWYaXxQPON1fTw+N+egKdByk0M1y2OPv/Q==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.1.tgz", + "integrity": "sha512-HUpqrCK7zDVojTV6KL6BO9ZZiYrEYQqvYQrscyMsq04z+WCupXaH6YEliiNRvreR8DBJgdsG3lBRpebhUGmvfA==", "license": "MIT", "engines": { "node": ">= 14" @@ -4817,13 +4817,13 @@ } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.1.0.tgz", - "integrity": "sha512-/5XBtCF6M+9frEXrrvfSWOdOC2q6I1L7oY7qbUVegNkp3kYVGihNZZnJIXGzo9rmwnA0IV7jI3o0pF/HDRqPeA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.1.1.tgz", + "integrity": "sha512-Hx9RgXaD1HEYmL5aYoWwCKkVvPp4iklwfD9mvmdpQtcwLg6b6oLnPVDQaOry1ak6Pxt8smlrWcKy4IiKASlvig==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "4.1.0", + "@sentry/babel-plugin-component-annotate": "4.1.1", "@sentry/cli": "^2.51.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -4878,9 +4878,9 @@ } }, "node_modules/@sentry/cli": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.51.1.tgz", - "integrity": "sha512-FU+54kNcKJABU0+ekvtnoXHM9zVrDe1zXVFbQT7mS0On0m1P0zFRGdzbnWe2XzpzuEAJXtK6aog/W+esRU9AIA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.52.0.tgz", + "integrity": "sha512-PXyo7Yv7+rVMSBGZfI/eFEzzhiKedTs25sDCjz4a3goAZ/F5R5tn3MKq30pnze5wNnoQmLujAa0uUjfNcWP+uQ==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -4897,20 +4897,20 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.51.1", - "@sentry/cli-linux-arm": "2.51.1", - "@sentry/cli-linux-arm64": "2.51.1", - "@sentry/cli-linux-i686": "2.51.1", - "@sentry/cli-linux-x64": "2.51.1", - "@sentry/cli-win32-arm64": "2.51.1", - "@sentry/cli-win32-i686": "2.51.1", - "@sentry/cli-win32-x64": "2.51.1" + "@sentry/cli-darwin": "2.52.0", + "@sentry/cli-linux-arm": "2.52.0", + "@sentry/cli-linux-arm64": "2.52.0", + "@sentry/cli-linux-i686": "2.52.0", + "@sentry/cli-linux-x64": "2.52.0", + "@sentry/cli-win32-arm64": "2.52.0", + "@sentry/cli-win32-i686": "2.52.0", + "@sentry/cli-win32-x64": "2.52.0" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.51.1.tgz", - "integrity": "sha512-R1u8IQdn/7Rr8sf6bVVr0vJT4OqwCFdYsS44Y3OoWGVJW2aAQTWRJOTlV4ueclVLAyUQzmgBjfR8AtiUhd/M5w==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.52.0.tgz", + "integrity": "sha512-ieQs/p4yTHT27nBzy0wtAb8BSISfWlpXdgsACcwXimYa36NJRwyCqgOXUaH/BYiTdwWSHpuANbUHGJW6zljzxw==", "license": "BSD-3-Clause", "optional": true, "os": [ @@ -4921,9 +4921,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.51.1.tgz", - "integrity": "sha512-Klro17OmSSKOOSaxVKBBNPXet2+HrIDZUTSp8NRl4LQsIubdc1S/aQ79cH/g52Muwzpl3aFwPxyXw+46isfEgA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.52.0.tgz", + "integrity": "sha512-tWMLU+hj+iip5Akx+S76biAOE1eMMWTDq8c0MqMv/ahHgb6/HiVngMcUsp59Oz3EczJGbTkcnS3vRTDodEcMDw==", "cpu": [ "arm" ], @@ -4939,9 +4939,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.51.1.tgz", - "integrity": "sha512-nvA/hdhsw4bKLhslgbBqqvETjXwN1FVmwHLOrRvRcejDO6zeIKUElDiL5UOjGG0NC+62AxyNw5ri8Wzp/7rg9Q==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.52.0.tgz", + "integrity": "sha512-RxT5uzxjCkcvplmx0bavJIEYerRex2Rg/2RAVBdVvWLKFOcmeerTn/VVxPZVuDIVMVyjlZsteWPYwfUm+Ia3wQ==", "cpu": [ "arm64" ], @@ -4957,9 +4957,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.51.1.tgz", - "integrity": "sha512-jp4TmR8VXBdT9dLo6mHniQHN0xKnmJoPGVz9h9VDvO2Vp/8o96rBc555D4Am5wJOXmfuPlyjGcmwHlB3+kQRWw==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.52.0.tgz", + "integrity": "sha512-sKcJmIg7QWFtlNU5Bs5OZprwdIzzyYMRpFkWioPZ4TE82yvP1+2SAX31VPUlTx+7NLU6YVEWNwvSxh8LWb7iOw==", "cpu": [ "x86", "ia32" @@ -4976,9 +4976,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.51.1.tgz", - "integrity": "sha512-JuLt0MXM2KHNFmjqXjv23sly56mJmUQzGBWktkpY3r+jE08f5NLKPd5wQ6W/SoLXGIOKnwLz0WoUg7aBVyQdeQ==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.52.0.tgz", + "integrity": "sha512-aPZ7bP02zGkuEqTiOAm4np/ggfgtzrq4ti1Xze96Csi/DV3820SCfLrPlsvcvnqq7x69IL9cI3kXjdEpgrfGxw==", "cpu": [ "x64" ], @@ -4994,9 +4994,9 @@ } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.51.1.tgz", - "integrity": "sha512-PiwjTdIFDazTQCTyDCutiSkt4omggYSKnO3HE1+LDjElsFrWY9pJs4fU3D40WAyE2oKu0MarjNH/WxYGdqEAlg==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.52.0.tgz", + "integrity": "sha512-90hrB5XdwJVhRpCmVrEcYoKW8nl5/V9OfVvOGeKUPvUkApLzvsInK74FYBZEVyAn1i/NdUv+Xk9q2zqUGK1aLQ==", "cpu": [ "arm64" ], @@ -5010,9 +5010,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.51.1.tgz", - "integrity": "sha512-TMvZZpeiI2HmrDFNVQ0uOiTuYKvjEGOZdmUxe3WlhZW82A/2Oka7sQ24ljcOovbmBOj5+fjCHRUMYvLMCWiysA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.52.0.tgz", + "integrity": "sha512-HXlSE4CaLylNrELx4KVmOQjV5bURCNuky6sjCWiTH7HyDqHEak2Rk8iLE0JNLj5RETWMvmaZnZZFfmyGlY1opg==", "cpu": [ "x86", "ia32" @@ -5027,9 +5027,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.51.1.tgz", - "integrity": "sha512-v2hreYUPPTNK1/N7+DeX7XBN/zb7p539k+2Osf0HFyVBaoUC3Y3+KBwSf4ASsnmgTAK7HCGR+X0NH1vP+icw4w==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.52.0.tgz", + "integrity": "sha512-hJT0C3FwHk1Mt9oFqcci88wbO1D+yAWUL8J29HEGM5ZAqlhdh7sAtPDIC3P2LceUJOjnXihow47Bkj62juatIQ==", "cpu": [ "x64" ], @@ -5107,12 +5107,12 @@ } }, "node_modules/@sentry/webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.1.0.tgz", - "integrity": "sha512-YqfDfyGAuT/9YW1kgAPfD7kGUKQCh1E5co+qMdToxi/Mz4xsWJY02rFS5GrJixYktYJfSMze8NiRr89yJMxYHw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.1.1.tgz", + "integrity": "sha512-2gFWcQMW1HdJDo/7rADeFs9crkH02l+mW4O1ORbxSjuegauyp1W8SBe7EfPoXbUmLdA3zwnpIxEXjjQpP5Etzg==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "4.1.0", + "@sentry/bundler-plugin-core": "4.1.1", "unplugin": "1.0.1", "uuid": "^9.0.0" }, @@ -23581,9 +23581,9 @@ } }, "@sentry/babel-plugin-component-annotate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.0.tgz", - "integrity": "sha512-UkcnqC7Bp9ODyoBN7BKcRotd1jz/I2vyruE/qjNfRC7UnP+jIRItUWYaXxQPON1fTw+N+egKdByk0M1y2OPv/Q==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.1.1.tgz", + "integrity": "sha512-HUpqrCK7zDVojTV6KL6BO9ZZiYrEYQqvYQrscyMsq04z+WCupXaH6YEliiNRvreR8DBJgdsG3lBRpebhUGmvfA==" }, "@sentry/browser": { "version": "7.120.3", @@ -23601,12 +23601,12 @@ } }, "@sentry/bundler-plugin-core": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.1.0.tgz", - "integrity": "sha512-/5XBtCF6M+9frEXrrvfSWOdOC2q6I1L7oY7qbUVegNkp3kYVGihNZZnJIXGzo9rmwnA0IV7jI3o0pF/HDRqPeA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.1.1.tgz", + "integrity": "sha512-Hx9RgXaD1HEYmL5aYoWwCKkVvPp4iklwfD9mvmdpQtcwLg6b6oLnPVDQaOry1ak6Pxt8smlrWcKy4IiKASlvig==", "requires": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "4.1.0", + "@sentry/babel-plugin-component-annotate": "4.1.1", "@sentry/cli": "^2.51.0", "dotenv": "^16.3.1", "find-up": "^5.0.0", @@ -23642,18 +23642,18 @@ } }, "@sentry/cli": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.51.1.tgz", - "integrity": "sha512-FU+54kNcKJABU0+ekvtnoXHM9zVrDe1zXVFbQT7mS0On0m1P0zFRGdzbnWe2XzpzuEAJXtK6aog/W+esRU9AIA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.52.0.tgz", + "integrity": "sha512-PXyo7Yv7+rVMSBGZfI/eFEzzhiKedTs25sDCjz4a3goAZ/F5R5tn3MKq30pnze5wNnoQmLujAa0uUjfNcWP+uQ==", "requires": { - "@sentry/cli-darwin": "2.51.1", - "@sentry/cli-linux-arm": "2.51.1", - "@sentry/cli-linux-arm64": "2.51.1", - "@sentry/cli-linux-i686": "2.51.1", - "@sentry/cli-linux-x64": "2.51.1", - "@sentry/cli-win32-arm64": "2.51.1", - "@sentry/cli-win32-i686": "2.51.1", - "@sentry/cli-win32-x64": "2.51.1", + "@sentry/cli-darwin": "2.52.0", + "@sentry/cli-linux-arm": "2.52.0", + "@sentry/cli-linux-arm64": "2.52.0", + "@sentry/cli-linux-i686": "2.52.0", + "@sentry/cli-linux-x64": "2.52.0", + "@sentry/cli-win32-arm64": "2.52.0", + "@sentry/cli-win32-i686": "2.52.0", + "@sentry/cli-win32-x64": "2.52.0", "https-proxy-agent": "^5.0.0", "node-fetch": "^2.6.7", "progress": "^2.0.3", @@ -23662,51 +23662,51 @@ } }, "@sentry/cli-darwin": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.51.1.tgz", - "integrity": "sha512-R1u8IQdn/7Rr8sf6bVVr0vJT4OqwCFdYsS44Y3OoWGVJW2aAQTWRJOTlV4ueclVLAyUQzmgBjfR8AtiUhd/M5w==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.52.0.tgz", + "integrity": "sha512-ieQs/p4yTHT27nBzy0wtAb8BSISfWlpXdgsACcwXimYa36NJRwyCqgOXUaH/BYiTdwWSHpuANbUHGJW6zljzxw==", "optional": true }, "@sentry/cli-linux-arm": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.51.1.tgz", - "integrity": "sha512-Klro17OmSSKOOSaxVKBBNPXet2+HrIDZUTSp8NRl4LQsIubdc1S/aQ79cH/g52Muwzpl3aFwPxyXw+46isfEgA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.52.0.tgz", + "integrity": "sha512-tWMLU+hj+iip5Akx+S76biAOE1eMMWTDq8c0MqMv/ahHgb6/HiVngMcUsp59Oz3EczJGbTkcnS3vRTDodEcMDw==", "optional": true }, "@sentry/cli-linux-arm64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.51.1.tgz", - "integrity": "sha512-nvA/hdhsw4bKLhslgbBqqvETjXwN1FVmwHLOrRvRcejDO6zeIKUElDiL5UOjGG0NC+62AxyNw5ri8Wzp/7rg9Q==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.52.0.tgz", + "integrity": "sha512-RxT5uzxjCkcvplmx0bavJIEYerRex2Rg/2RAVBdVvWLKFOcmeerTn/VVxPZVuDIVMVyjlZsteWPYwfUm+Ia3wQ==", "optional": true }, "@sentry/cli-linux-i686": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.51.1.tgz", - "integrity": "sha512-jp4TmR8VXBdT9dLo6mHniQHN0xKnmJoPGVz9h9VDvO2Vp/8o96rBc555D4Am5wJOXmfuPlyjGcmwHlB3+kQRWw==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.52.0.tgz", + "integrity": "sha512-sKcJmIg7QWFtlNU5Bs5OZprwdIzzyYMRpFkWioPZ4TE82yvP1+2SAX31VPUlTx+7NLU6YVEWNwvSxh8LWb7iOw==", "optional": true }, "@sentry/cli-linux-x64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.51.1.tgz", - "integrity": "sha512-JuLt0MXM2KHNFmjqXjv23sly56mJmUQzGBWktkpY3r+jE08f5NLKPd5wQ6W/SoLXGIOKnwLz0WoUg7aBVyQdeQ==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.52.0.tgz", + "integrity": "sha512-aPZ7bP02zGkuEqTiOAm4np/ggfgtzrq4ti1Xze96Csi/DV3820SCfLrPlsvcvnqq7x69IL9cI3kXjdEpgrfGxw==", "optional": true }, "@sentry/cli-win32-arm64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.51.1.tgz", - "integrity": "sha512-PiwjTdIFDazTQCTyDCutiSkt4omggYSKnO3HE1+LDjElsFrWY9pJs4fU3D40WAyE2oKu0MarjNH/WxYGdqEAlg==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.52.0.tgz", + "integrity": "sha512-90hrB5XdwJVhRpCmVrEcYoKW8nl5/V9OfVvOGeKUPvUkApLzvsInK74FYBZEVyAn1i/NdUv+Xk9q2zqUGK1aLQ==", "optional": true }, "@sentry/cli-win32-i686": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.51.1.tgz", - "integrity": "sha512-TMvZZpeiI2HmrDFNVQ0uOiTuYKvjEGOZdmUxe3WlhZW82A/2Oka7sQ24ljcOovbmBOj5+fjCHRUMYvLMCWiysA==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.52.0.tgz", + "integrity": "sha512-HXlSE4CaLylNrELx4KVmOQjV5bURCNuky6sjCWiTH7HyDqHEak2Rk8iLE0JNLj5RETWMvmaZnZZFfmyGlY1opg==", "optional": true }, "@sentry/cli-win32-x64": { - "version": "2.51.1", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.51.1.tgz", - "integrity": "sha512-v2hreYUPPTNK1/N7+DeX7XBN/zb7p539k+2Osf0HFyVBaoUC3Y3+KBwSf4ASsnmgTAK7HCGR+X0NH1vP+icw4w==", + "version": "2.52.0", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.52.0.tgz", + "integrity": "sha512-hJT0C3FwHk1Mt9oFqcci88wbO1D+yAWUL8J29HEGM5ZAqlhdh7sAtPDIC3P2LceUJOjnXihow47Bkj62juatIQ==", "optional": true }, "@sentry/core": { @@ -23754,11 +23754,11 @@ } }, "@sentry/webpack-plugin": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.1.0.tgz", - "integrity": "sha512-YqfDfyGAuT/9YW1kgAPfD7kGUKQCh1E5co+qMdToxi/Mz4xsWJY02rFS5GrJixYktYJfSMze8NiRr89yJMxYHw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.1.1.tgz", + "integrity": "sha512-2gFWcQMW1HdJDo/7rADeFs9crkH02l+mW4O1ORbxSjuegauyp1W8SBe7EfPoXbUmLdA3zwnpIxEXjjQpP5Etzg==", "requires": { - "@sentry/bundler-plugin-core": "4.1.0", + "@sentry/bundler-plugin-core": "4.1.1", "unplugin": "1.0.1", "uuid": "^9.0.0" }, diff --git a/package.json b/package.json index 79c06735..9cc2a007 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@redhat-cloud-services/frontend-components-utilities": "7.0.3", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", - "@sentry/webpack-plugin": "4.1.0", + "@sentry/webpack-plugin": "4.1.1", "@unleash/proxy-client-react": "5.0.1", "classnames": "2.5.1", "jwt-decode": "4.0.0", From 090544c333cdd4aef0ffaf138f361742d453c87b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Mon, 11 Aug 2025 16:06:21 +0200 Subject: [PATCH 12/31] Launch: implement guidance for AWS (HMS-9002) This commit adds launch modal for guiding users through launching an AWS instance from their image. As the launch service will be decommissioned, the flag shall be turned on, the code will later be cleaned up and the Provisioning wizard removed. --- src/Components/ImagesTable/Instance.tsx | 23 ++++- src/Components/Launch/AWSLaunchModal.tsx | 104 +++++++++++++++++++++++ 2 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 src/Components/Launch/AWSLaunchModal.tsx diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index 5d11cfdf..c876a6a5 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -54,7 +54,9 @@ import { isOciUploadStatus, } from '../../store/typeGuards'; import { resolveRelPath } from '../../Utilities/path'; +import { useFlag } from '../../Utilities/useGetEnvironment'; import useProvisioningPermissions from '../../Utilities/useProvisioningPermissions'; +import { AWSLaunchModal } from '../Launch/AWSLaunchModal'; type CloudInstancePropTypes = { compose: ComposesResponseItem; @@ -97,6 +99,7 @@ const ProvisioningLink = ({ compose, composeStatus, }: ProvisioningLinkPropTypes) => { + const launchEofFlag = useFlag('image-builder.launcheof'); const [userData, setUserData] = useState(undefined); const { analytics, auth } = useChrome(); @@ -111,7 +114,7 @@ const ProvisioningLink = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const [wizardOpen, setWizardOpen] = useState(false); + const [isModalOpen, setIsModalOpen] = useState(false); const [exposedScalprumModule, error] = useLoadModule( { scope: 'provisioning', @@ -182,7 +185,7 @@ const ProvisioningLink = ({ account_id: userData?.identity.internal?.account_id || 'Not found', }); - setWizardOpen(true); + setIsModalOpen(true); }} > Launch @@ -202,6 +205,10 @@ const ProvisioningLink = ({ ); + const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => { + setIsModalOpen(!isModalOpen); + }; + return ( <> @@ -209,7 +216,15 @@ const ProvisioningLink = ({ compose.blueprint_version !== selectedBlueprintVersion ? buttonWithTooltip : btn} - {wizardOpen && ( + {launchEofFlag && isModalOpen && provider === 'aws' && ( + + )} + {!launchEofFlag && isModalOpen && ( setWizardOpen(false)} + onClose={() => setIsModalOpen(false)} image={{ name: compose.image_name || compose.id, id: compose.id, diff --git a/src/Components/Launch/AWSLaunchModal.tsx b/src/Components/Launch/AWSLaunchModal.tsx new file mode 100644 index 00000000..c33fe0b0 --- /dev/null +++ b/src/Components/Launch/AWSLaunchModal.tsx @@ -0,0 +1,104 @@ +import React from 'react'; + +import { + Button, + List, + ListComponent, + ListItem, + Modal, + ModalBody, + ModalFooter, + ModalHeader, + ModalVariant, + OrderType, +} from '@patternfly/react-core'; +import { ExternalLinkAltIcon } from '@patternfly/react-icons'; + +import { + ComposesResponseItem, + ComposeStatus, +} from '../../store/imageBuilderApi'; +import { isAwsUploadRequestOptions } from '../../store/typeGuards'; + +type LaunchProps = { + isOpen: boolean; + handleModalToggle: (event: KeyboardEvent | React.MouseEvent) => void; + compose: ComposesResponseItem; + composeStatus: ComposeStatus | undefined; +}; + +export const AWSLaunchModal = ({ + isOpen, + handleModalToggle, + compose, + composeStatus, +}: LaunchProps) => { + const options = compose.request.image_requests[0].upload_request.options; + + if (!isAwsUploadRequestOptions(options)) { + throw TypeError( + `Error: options must be of type AwsUploadRequestOptions, not ${typeof options}.`, + ); + } + + const amiId = + composeStatus?.image_status.status === 'success' && + composeStatus.image_status.upload_status?.options && + 'ami' in composeStatus.image_status.upload_status.options + ? composeStatus.image_status.upload_status.options.ami + : ''; + + return ( + + + + + + Navigate to the{' '} + {' '} + located on your AWS console. + + + Copy the image to make it a permanent copy in your account. +
+ Shared with Account{' '} + + {options.share_with_accounts?.[0]} + +
+ AMI ID: {amiId} +
+ Launch image as an instance. + + Connect to it via SSH using the following username:{' '} + ec2-user + +
+
+ + + +
+ ); +}; From af19251f171ea5101ed361ca9faf45cdb9dc135b Mon Sep 17 00:00:00 2001 From: Katarina Sieklova Date: Mon, 18 Aug 2025 15:06:16 +0200 Subject: [PATCH 13/31] build(deps): bump @redhat-cloud-services/frontend-components-notifications from 6.1.3 to 6.1.5 --- package-lock.json | 182 +++++----------------------------------------- package.json | 3 +- 2 files changed, 20 insertions(+), 165 deletions(-) diff --git a/package-lock.json b/package-lock.json index ca86cef5..f72fbe23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,9 @@ "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", "@redhat-cloud-services/frontend-components": "7.0.3", - "@redhat-cloud-services/frontend-components-notifications": "6.1.3", + "@redhat-cloud-services/frontend-components-notifications": "6.1.5", "@redhat-cloud-services/frontend-components-utilities": "7.0.3", + "@redhat-cloud-services/types": "3.0.1", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", "@sentry/webpack-plugin": "4.1.1", @@ -4151,13 +4152,13 @@ } }, "node_modules/@redhat-cloud-services/frontend-components-notifications": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-6.1.3.tgz", - "integrity": "sha512-GeLVfH+e6M8CLehk4U3LVoUzQ7G2pyw3SY6I8R/WBaYfBuwqBhWRHiHt/bTE+VzZo5yfBsnbKQ59JWNpYniDvA==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-6.1.5.tgz", + "integrity": "sha512-CanlpBYpIKzLQZCD0Q3J5KezN0bCEeNW/rFclBPJ2CXuiyIwB0o0KRg6yfoF33V95LrDg1J3Q2DNHl8GhS+/mg==", "license": "Apache-2.0", "dependencies": { - "@redhat-cloud-services/frontend-components": "^6.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^6.0.0" + "@redhat-cloud-services/frontend-components": "^7.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^7.0.0" }, "peerDependencies": { "@patternfly/react-core": "^6.0.0", @@ -4166,82 +4167,6 @@ "react-dom": "^18.2.0" } }, - "node_modules/@redhat-cloud-services/frontend-components-notifications/node_modules/@redhat-cloud-services/frontend-components": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-6.1.1.tgz", - "integrity": "sha512-p6nqk6pLL8nnxxIzfyQd5K6yW4EBqNZlAlgWmgSttwuuPAzHTDHFtutTvtCMK/hzlyfTnyGgjRMe2TL+wXrEcQ==", - "license": "Apache-2.0", - "dependencies": { - "@patternfly/react-component-groups": "^6.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", - "@redhat-cloud-services/types": "^2.0.0", - "@scalprum/core": "^0.8.1", - "@scalprum/react-core": "^0.9.1", - "classnames": "^2.2.5", - "sanitize-html": "^2.13.1" - }, - "peerDependencies": { - "@patternfly/react-core": "^6.0.0", - "@patternfly/react-icons": "^6.0.0", - "@patternfly/react-table": "^6.0.0", - "@patternfly/react-tokens": "^6.0.0", - "lodash": "^4.17.15", - "prop-types": "^15.6.2", - "react": "^18.2.0", - "react-content-loader": "^6.2.0", - "react-dom": "^18.2.0", - "react-redux": "^7.0.0 || ^8.0.0 || ^9.0.0", - "react-router-dom": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/@redhat-cloud-services/frontend-components-notifications/node_modules/@redhat-cloud-services/frontend-components-utilities": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-6.1.1.tgz", - "integrity": "sha512-ETaL9dUOyxrqjJx+QcxI5pBmDOShC6voJINlU4afhelJBfam01oMQxQYB1aPFKs2JmBDbYgT2fgT/6s/1FJS0Q==", - "license": "Apache-2.0", - "dependencies": { - "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", - "@redhat-cloud-services/types": "^2.0.0", - "@sentry/browser": "^7.119.1", - "awesome-debounce-promise": "^2.1.0", - "axios": "^0.28.1 || ^1.7.0", - "commander": "^2.20.3", - "mkdirp": "^1.0.4", - "p-map": "^7.0.2", - "react-content-loader": "^6.2.0" - }, - "peerDependencies": { - "@patternfly/react-core": "^6.0.0", - "@patternfly/react-table": "^6.0.0", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-redux": "^7.0.0 || ^8.0.0 || ^9.0.0", - "react-router-dom": "^5.0.0 || ^6.0.0" - } - }, - "node_modules/@redhat-cloud-services/frontend-components-notifications/node_modules/@redhat-cloud-services/rbac-client": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", - "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", - "license": "Apache-2.0", - "dependencies": { - "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", - "axios": "^1.7.2", - "tslib": "^2.6.2" - } - }, - "node_modules/@redhat-cloud-services/frontend-components-notifications/node_modules/p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@redhat-cloud-services/frontend-components-utilities": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-7.0.3.tgz", @@ -4267,12 +4192,6 @@ "react-router-dom": "^5.0.0 || ^6.0.0" } }, - "node_modules/@redhat-cloud-services/frontend-components-utilities/node_modules/@redhat-cloud-services/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", - "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==", - "license": "Apache-2.0" - }, "node_modules/@redhat-cloud-services/frontend-components-utilities/node_modules/p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -4285,12 +4204,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@redhat-cloud-services/frontend-components/node_modules/@redhat-cloud-services/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", - "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==", - "license": "Apache-2.0" - }, "node_modules/@redhat-cloud-services/javascript-clients-shared": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/@redhat-cloud-services/javascript-clients-shared/-/javascript-clients-shared-1.2.7.tgz", @@ -4346,9 +4259,9 @@ } }, "node_modules/@redhat-cloud-services/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-2.0.0.tgz", - "integrity": "sha512-T9KvjntxMtRkNcyYCKB9OktIy7hhy24Y4n1nDZgGsysSnfWOrnmsrLUI7pyrwqsRVzjIjI3oYf7qH7DE5LcFag==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", + "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==", "license": "Apache-2.0" }, "node_modules/@reduxjs/toolkit": { @@ -23088,13 +23001,6 @@ "@scalprum/react-core": "^0.9.1", "classnames": "^2.2.5", "sanitize-html": "^2.13.1" - }, - "dependencies": { - "@redhat-cloud-services/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", - "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==" - } } }, "@redhat-cloud-services/frontend-components-config": { @@ -23205,59 +23111,12 @@ } }, "@redhat-cloud-services/frontend-components-notifications": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-6.1.3.tgz", - "integrity": "sha512-GeLVfH+e6M8CLehk4U3LVoUzQ7G2pyw3SY6I8R/WBaYfBuwqBhWRHiHt/bTE+VzZo5yfBsnbKQ59JWNpYniDvA==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-notifications/-/frontend-components-notifications-6.1.5.tgz", + "integrity": "sha512-CanlpBYpIKzLQZCD0Q3J5KezN0bCEeNW/rFclBPJ2CXuiyIwB0o0KRg6yfoF33V95LrDg1J3Q2DNHl8GhS+/mg==", "requires": { - "@redhat-cloud-services/frontend-components": "^6.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^6.0.0" - }, - "dependencies": { - "@redhat-cloud-services/frontend-components": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components/-/frontend-components-6.1.1.tgz", - "integrity": "sha512-p6nqk6pLL8nnxxIzfyQd5K6yW4EBqNZlAlgWmgSttwuuPAzHTDHFtutTvtCMK/hzlyfTnyGgjRMe2TL+wXrEcQ==", - "requires": { - "@patternfly/react-component-groups": "^6.0.0", - "@redhat-cloud-services/frontend-components-utilities": "^6.0.0", - "@redhat-cloud-services/types": "^2.0.0", - "@scalprum/core": "^0.8.1", - "@scalprum/react-core": "^0.9.1", - "classnames": "^2.2.5", - "sanitize-html": "^2.13.1" - } - }, - "@redhat-cloud-services/frontend-components-utilities": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/frontend-components-utilities/-/frontend-components-utilities-6.1.1.tgz", - "integrity": "sha512-ETaL9dUOyxrqjJx+QcxI5pBmDOShC6voJINlU4afhelJBfam01oMQxQYB1aPFKs2JmBDbYgT2fgT/6s/1FJS0Q==", - "requires": { - "@redhat-cloud-services/rbac-client": "^1.0.111 || 2.x", - "@redhat-cloud-services/types": "^2.0.0", - "@sentry/browser": "^7.119.1", - "awesome-debounce-promise": "^2.1.0", - "axios": "^0.28.1 || ^1.7.0", - "commander": "^2.20.3", - "mkdirp": "^1.0.4", - "p-map": "^7.0.2", - "react-content-loader": "^6.2.0" - } - }, - "@redhat-cloud-services/rbac-client": { - "version": "2.2.11", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/rbac-client/-/rbac-client-2.2.11.tgz", - "integrity": "sha512-3LLW5XtBMqcdlYJ4lAFo7MaGnHXUBP01O3kty4ocU69EPjiip6/Gtj83vAx5hkgAWX9h6ZEntTDeDuU/ZfGdKQ==", - "requires": { - "@redhat-cloud-services/javascript-clients-shared": "^1.2.4", - "axios": "^1.7.2", - "tslib": "^2.6.2" - } - }, - "p-map": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", - "integrity": "sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==" - } + "@redhat-cloud-services/frontend-components": "^7.0.0", + "@redhat-cloud-services/frontend-components-utilities": "^7.0.0" } }, "@redhat-cloud-services/frontend-components-utilities": { @@ -23276,11 +23135,6 @@ "react-content-loader": "^6.2.0" }, "dependencies": { - "@redhat-cloud-services/types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", - "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==" - }, "p-map": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz", @@ -23330,9 +23184,9 @@ } }, "@redhat-cloud-services/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-2.0.0.tgz", - "integrity": "sha512-T9KvjntxMtRkNcyYCKB9OktIy7hhy24Y4n1nDZgGsysSnfWOrnmsrLUI7pyrwqsRVzjIjI3oYf7qH7DE5LcFag==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@redhat-cloud-services/types/-/types-3.0.1.tgz", + "integrity": "sha512-GXw72DDOtKCkl2NlqkjGYVWjfm81LSA75jzbdMqKuefkxMvV4SsA0uNcauGiqZKUhq20RlNz3xBlKF3lvsfD1Q==" }, "@reduxjs/toolkit": { "version": "2.8.2", diff --git a/package.json b/package.json index 9cc2a007..0edb6015 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,9 @@ "@patternfly/react-core": "6.3.1", "@patternfly/react-table": "6.3.1", "@redhat-cloud-services/frontend-components": "7.0.3", - "@redhat-cloud-services/frontend-components-notifications": "6.1.3", + "@redhat-cloud-services/frontend-components-notifications": "6.1.5", "@redhat-cloud-services/frontend-components-utilities": "7.0.3", + "@redhat-cloud-services/types": "3.0.1", "@reduxjs/toolkit": "2.8.2", "@scalprum/react-core": "0.9.5", "@sentry/webpack-plugin": "4.1.1", From a9d2ba59a867b57638ac601becc05640e7761c38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Mon, 11 Aug 2025 16:06:21 +0200 Subject: [PATCH 14/31] Launch: implement guidance for GCP (HMS-9004) This commit adds launch modal for guiding users through launching a GCP instance from their image. This commit also adds unique image name in the command in the clipboard. That way, users can rebuild the image more times without worrying about duplicate names. This guidance should be as helpful to users as possible, so even if they are able to create their own image name here, we chose it for them for the sake of simplicity. --- src/Components/ImagesTable/ImageDetails.tsx | 2 +- src/Components/ImagesTable/Instance.tsx | 9 + src/Components/Launch/GcpLaunchModal.tsx | 169 ++++++++++++++++++ .../Launch/useGenerateDefaultName.ts | 34 ++++ 4 files changed, 213 insertions(+), 1 deletion(-) create mode 100644 src/Components/Launch/GcpLaunchModal.tsx create mode 100644 src/Components/Launch/useGenerateDefaultName.ts diff --git a/src/Components/ImagesTable/ImageDetails.tsx b/src/Components/ImagesTable/ImageDetails.tsx index d46b7263..809b0394 100644 --- a/src/Components/ImagesTable/ImageDetails.tsx +++ b/src/Components/ImagesTable/ImageDetails.tsx @@ -119,7 +119,7 @@ const AwsSourceName = ({ id }: AwsSourceNamePropTypes) => { return ; }; -const parseGcpSharedWith = ( +export const parseGcpSharedWith = ( sharedWith: GcpUploadRequestOptions['share_with_accounts'], ) => { if (sharedWith) { diff --git a/src/Components/ImagesTable/Instance.tsx b/src/Components/ImagesTable/Instance.tsx index c876a6a5..4af6f5e9 100644 --- a/src/Components/ImagesTable/Instance.tsx +++ b/src/Components/ImagesTable/Instance.tsx @@ -57,6 +57,7 @@ import { resolveRelPath } from '../../Utilities/path'; import { useFlag } from '../../Utilities/useGetEnvironment'; import useProvisioningPermissions from '../../Utilities/useProvisioningPermissions'; import { AWSLaunchModal } from '../Launch/AWSLaunchModal'; +import { GcpLaunchModal } from '../Launch/GcpLaunchModal'; type CloudInstancePropTypes = { compose: ComposesResponseItem; @@ -224,6 +225,14 @@ const ProvisioningLink = ({ composeStatus={composeStatus} /> )} + {launchEofFlag && isModalOpen && provider === 'gcp' && ( + + )} {!launchEofFlag && isModalOpen && ( void; + compose: ComposesResponseItem; + composeStatus: ComposeStatus | undefined; +}; + +export const GcpLaunchModal = ({ + isOpen, + handleModalToggle, + compose, + composeStatus, +}: LaunchProps) => { + const [customerProjectId, setCustomerProjectId] = useState(''); + + const statusOptions = composeStatus?.image_status.upload_status?.options; + const composeOptions = + compose.request.image_requests[0].upload_request.options; + + if ( + (statusOptions && !isGcpUploadStatus(statusOptions)) || + !isGcpUploadRequestOptions(composeOptions) + ) { + throw TypeError( + `Error: options must be of type GcpUploadRequestOptions, not ${typeof statusOptions}.`, + ); + } + + const imageName = statusOptions?.image_name; + const projectId = statusOptions?.project_id; + if (!imageName || !projectId) { + throw TypeError( + `Error: Image name not found, unable to generate a command to copy ${typeof statusOptions}.`, + ); + } + const uniqueImageName = generateDefaultName(imageName); + const authorizeString = + composeOptions.share_with_accounts && + composeOptions.share_with_accounts.length === 1 + ? `Authorize gcloud CLI to the following + account: ${parseGcpSharedWith(composeOptions.share_with_accounts)}.` + : composeOptions.share_with_accounts + ? `Authorize gcloud CLI to use one of the following + accounts: ${parseGcpSharedWith(composeOptions.share_with_accounts)}.` + : 'Authorize gcloud CLI to use the account that the image is shared with.'; + const installationCommand = `sudo dnf install google-cloud-cli`; + const createImage = `gcloud compute images create ${uniqueImageName} --source-image=${imageName} --source-image-project=${projectId} --project=${ + customerProjectId || '' + }`; + const createInstance = `gcloud compute instances create ${uniqueImageName} --image=${uniqueImageName} --project=${ + customerProjectId || '' + }`; + return ( + + + + + + Install the gcloud CLI. See the{' '} + + documentation. + + {installationCommand} + + + {authorizeString} + + Enter your GCP project ID, and run the command to create the image + in your project. + setCustomerProjectId(value)} + aria-label='Project ID input' + placeholder='Project ID' + /> + + {createImage} + + + + Create an instance of your image by either accessing the{' '} + {' '} + or by running the following command: + + {createInstance} + + + + + + + + + ); +}; diff --git a/src/Components/Launch/useGenerateDefaultName.ts b/src/Components/Launch/useGenerateDefaultName.ts new file mode 100644 index 00000000..ac7a2cc6 --- /dev/null +++ b/src/Components/Launch/useGenerateDefaultName.ts @@ -0,0 +1,34 @@ +export const generateDefaultName = (imageName: string) => { + const date = new Date(); + const day = date.getDate().toString().padStart(2, '0'); + const month = (date.getMonth() + 1).toString().padStart(2, '0'); + const year = date.getFullYear().toString(); + const hours = date.getHours().toString().padStart(2, '0'); + const minutes = date.getMinutes().toString().padStart(2, '0'); + + const dateTimeString = `${month}${day}${year}-${hours}${minutes}`; + + // gcloud images are valid in the form of: (?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?) + let newBlueprintName = imageName + .toLowerCase() + .replace(/[^a-z0-9-]/g, '-') + .replace(/-{2,}/g, '-') + .replace(/^-+|-+$/g, ''); + + if (!/^[a-z]/.test(newBlueprintName)) { + newBlueprintName = 'i' + newBlueprintName; + } + + const maxLength = 63; + const uniquePartLength = dateTimeString.length + 1; + const baseNameMaxLength = maxLength - uniquePartLength; + if (newBlueprintName.length > baseNameMaxLength) { + newBlueprintName = newBlueprintName.substring(0, baseNameMaxLength); + } + + while (newBlueprintName.endsWith('-')) { + newBlueprintName = newBlueprintName.slice(0, -1); + } + + return `${newBlueprintName}-${dateTimeString}`; +}; From b0393a5f4ff551ac8fb579a4aa07c891585c608b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 14:14:01 +0000 Subject: [PATCH 15/31] build(deps-dev): bump typescript-eslint from 8.38.0 to 8.40.0 Bumps [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint) from 8.38.0 to 8.40.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.40.0/packages/typescript-eslint) --- updated-dependencies: - dependency-name: typescript-eslint dependency-version: 8.40.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 260 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 131 insertions(+), 131 deletions(-) diff --git a/package-lock.json b/package-lock.json index f72fbe23..19bf3fde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -96,7 +96,7 @@ "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", - "typescript-eslint": "8.38.0", + "typescript-eslint": "8.40.0", "uuid": "11.1.0", "vitest": "3.2.4", "vitest-canvas-mock": "0.3.3", @@ -6115,14 +6115,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", + "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", + "@typescript-eslint/tsconfig-utils": "^8.40.0", + "@typescript-eslint/types": "^8.40.0", "debug": "^4.3.4" }, "engines": { @@ -6133,18 +6133,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", + "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6155,9 +6155,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", + "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", "dev": true, "license": "MIT", "engines": { @@ -6168,7 +6168,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/type-utils": { @@ -6378,9 +6378,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", + "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", "dev": true, "license": "MIT", "engines": { @@ -6392,16 +6392,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", + "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/project-service": "8.40.0", + "@typescript-eslint/tsconfig-utils": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -6417,7 +6417,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { @@ -6447,16 +6447,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.40.0.tgz", + "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -6467,17 +6467,17 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", + "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/types": "8.40.0", "eslint-visitor-keys": "^4.2.1" }, "engines": { @@ -19239,16 +19239,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", - "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.40.0.tgz", + "integrity": "sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.38.0", - "@typescript-eslint/parser": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0" + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -19259,21 +19259,21 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -19287,22 +19287,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.38.0", + "@typescript-eslint/parser": "^8.40.0", "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" }, "engines": { @@ -19314,19 +19314,19 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -19339,7 +19339,7 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.0.0" } }, "node_modules/typescript-eslint/node_modules/ignore": { @@ -24309,30 +24309,30 @@ } }, "@typescript-eslint/project-service": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz", - "integrity": "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", + "integrity": "sha512-/A89vz7Wf5DEXsGVvcGdYKbVM9F7DyFXj52lNYUDS1L9yJfqjW/fIp5PgMuEJL/KeqVTe2QSbXAGUZljDUpArw==", "dev": true, "requires": { - "@typescript-eslint/tsconfig-utils": "^8.38.0", - "@typescript-eslint/types": "^8.38.0", + "@typescript-eslint/tsconfig-utils": "^8.40.0", + "@typescript-eslint/types": "^8.40.0", "debug": "^4.3.4" } }, "@typescript-eslint/scope-manager": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz", - "integrity": "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.40.0.tgz", + "integrity": "sha512-y9ObStCcdCiZKzwqsE8CcpyuVMwRouJbbSrNuThDpv16dFAj429IkM6LNb1dZ2m7hK5fHyzNcErZf7CEeKXR4w==", "dev": true, "requires": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0" + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0" } }, "@typescript-eslint/tsconfig-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz", - "integrity": "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.40.0.tgz", + "integrity": "sha512-jtMytmUaG9d/9kqSl/W3E3xaWESo4hFDxAIHGVW/WKKtQhesnRIJSAJO6XckluuJ6KDB5woD1EiqknriCtAmcw==", "dev": true, "requires": {} }, @@ -24445,21 +24445,21 @@ } }, "@typescript-eslint/types": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz", - "integrity": "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.40.0.tgz", + "integrity": "sha512-ETdbFlgbAmXHyFPwqUIYrfc12ArvpBhEVgGAxVYSwli26dn8Ko+lIo4Su9vI9ykTZdJn+vJprs/0eZU0YMAEQg==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz", - "integrity": "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.40.0.tgz", + "integrity": "sha512-k1z9+GJReVVOkc1WfVKs1vBrR5MIKKbdAjDTPvIK3L8De6KbFfPFt6BKpdkdk7rZS2GtC/m6yI5MYX+UsuvVYQ==", "dev": true, "requires": { - "@typescript-eslint/project-service": "8.38.0", - "@typescript-eslint/tsconfig-utils": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/project-service": "8.40.0", + "@typescript-eslint/tsconfig-utils": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -24484,24 +24484,24 @@ } }, "@typescript-eslint/utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz", - "integrity": "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.40.0.tgz", + "integrity": "sha512-Cgzi2MXSZyAUOY+BFwGs17s7ad/7L+gKt6Y8rAVVWS+7o6wrjeFN4nVfTpbE25MNcxyJ+iYUXflbs2xR9h4UBg==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0" + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0" } }, "@typescript-eslint/visitor-keys": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz", - "integrity": "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.40.0.tgz", + "integrity": "sha512-8CZ47QwalyRjsypfwnbI3hKy5gJDPmrkLjkgMxhi0+DZZ2QNx2naS6/hWoVYUHU7LU2zleF68V9miaVZvhFfTA==", "dev": true, "requires": { - "@typescript-eslint/types": "8.38.0", + "@typescript-eslint/types": "8.40.0", "eslint-visitor-keys": "^4.2.1" }, "dependencies": { @@ -32662,28 +32662,28 @@ "dev": true }, "typescript-eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.38.0.tgz", - "integrity": "sha512-FsZlrYK6bPDGoLeZRuvx2v6qrM03I0U0SnfCLPs/XCCPCFD80xU9Pg09H/K+XFa68uJuZo7l/Xhs+eDRg2l3hg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.40.0.tgz", + "integrity": "sha512-Xvd2l+ZmFDPEt4oj1QEXzA4A2uUK6opvKu3eGN9aGjB8au02lIVcLyi375w94hHyejTOmzIU77L8ol2sRg9n7Q==", "dev": true, "requires": { - "@typescript-eslint/eslint-plugin": "8.38.0", - "@typescript-eslint/parser": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0" + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0" }, "dependencies": { "@typescript-eslint/eslint-plugin": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz", - "integrity": "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/type-utils": "8.38.0", - "@typescript-eslint/utils": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -32691,27 +32691,27 @@ } }, "@typescript-eslint/parser": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz", - "integrity": "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.38.0", - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/visitor-keys": "8.38.0", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" } }, "@typescript-eslint/type-utils": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz", - "integrity": "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "requires": { - "@typescript-eslint/types": "8.38.0", - "@typescript-eslint/typescript-estree": "8.38.0", - "@typescript-eslint/utils": "8.38.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" } diff --git a/package.json b/package.json index 0edb6015..171dba95 100644 --- a/package.json +++ b/package.json @@ -94,7 +94,7 @@ "ts-node": "10.9.2", "ts-patch": "3.3.0", "typescript": "5.8.3", - "typescript-eslint": "8.38.0", + "typescript-eslint": "8.40.0", "uuid": "11.1.0", "vitest": "3.2.4", "vitest-canvas-mock": "0.3.3", From e0dd33fdc9e6b495e50cd73d70a7a249639bd425 Mon Sep 17 00:00:00 2001 From: schutzbot Date: Wed, 20 Aug 2025 08:35:04 +0000 Subject: [PATCH 16/31] Post release version bump [skip ci] --- cockpit/cockpit-image-builder.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cockpit/cockpit-image-builder.spec b/cockpit/cockpit-image-builder.spec index 213d9af1..85988df4 100644 --- a/cockpit/cockpit-image-builder.spec +++ b/cockpit/cockpit-image-builder.spec @@ -1,5 +1,5 @@ Name: cockpit-image-builder -Version: 74 +Version: 75 Release: 1%{?dist} Summary: Image builder plugin for Cockpit From 0e7f5d9e7baecf016ee3b28a34fa614d27d67062 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Thu, 14 Aug 2025 13:17:31 +0200 Subject: [PATCH 17/31] plans: add gating tests This tmt[0] test runs the playwright tests as gating tests. Having the gating tests upstream avoids duplication across fedora and centos dist-git repositories, and running them upstream should keep them in working order. Only add x86_64 for now, the aarch runners seem to be a bit too slow. [0]: https://tmt.readthedocs.io/en/stable/index.html --- .fmf/version | 1 + packit.yaml | 10 +++++++++- plans/all.fmf | 14 ++++++++++++++ schutzbot/playwright.fmf | 8 ++++++++ schutzbot/playwright_tests.sh | 35 +++++++++++++++++++---------------- 5 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 .fmf/version create mode 100644 plans/all.fmf create mode 100644 schutzbot/playwright.fmf diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 00000000..d00491fd --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/packit.yaml b/packit.yaml index bd019940..2cbf432b 100644 --- a/packit.yaml +++ b/packit.yaml @@ -16,6 +16,15 @@ srpm_build_deps: - npm jobs: + - job: tests + identifier: self + trigger: pull_request + tmt_plan: /plans/all/main + targets: + - centos-stream-10 + - fedora-41 + - fedora-42 + - job: copr_build trigger: pull_request targets: &build_targets @@ -24,7 +33,6 @@ jobs: - centos-stream-10 - centos-stream-10-aarch64 - fedora-all - - fedora-all-aarch64 - job: copr_build trigger: commit diff --git a/plans/all.fmf b/plans/all.fmf new file mode 100644 index 00000000..66deae89 --- /dev/null +++ b/plans/all.fmf @@ -0,0 +1,14 @@ +summary: cockpit-image-builder playwright tests +prepare: + how: install + package: + - cockpit-image-builder +discover: + how: fmf +execute: + how: tmt + +/main: + summary: playwright tests + discover+: + test: /schutzbot/playwright diff --git a/schutzbot/playwright.fmf b/schutzbot/playwright.fmf new file mode 100644 index 00000000..bbc5721a --- /dev/null +++ b/schutzbot/playwright.fmf @@ -0,0 +1,8 @@ +summary: run playwright tests +test: ./playwright_tests.sh +require: + - cockpit-image-builder + - podman + - nodejs + - nodejs-npm +duration: 30m diff --git a/schutzbot/playwright_tests.sh b/schutzbot/playwright_tests.sh index d6a5a87f..2ad039e4 100755 --- a/schutzbot/playwright_tests.sh +++ b/schutzbot/playwright_tests.sh @@ -1,16 +1,16 @@ #!/bin/bash set -euo pipefail -# As playwright isn't supported on fedora/el, install dependencies -# beforehand. -sudo dnf install -y \ - alsa-lib \ - libXrandr-devel \ - libXdamage-devel \ - libXcomposite-devel \ - at-spi2-atk-devel \ - cups \ - atk +TMT_SOURCE_DIR=${TMT_SOURCE_DIR:-} +if [ -n "$TMT_SOURCE_DIR" ]; then + # Move to the directory with sources + cd "${TMT_SOURCE_DIR}/cockpit-image-builder" + npm ci +elif [ "${CI:-}" != "true" ]; then + # packit drops us into the schutzbot directory + cd ../ + npm ci +fi sudo systemctl enable --now cockpit.socket @@ -19,10 +19,13 @@ sudo usermod -aG wheel admin echo "admin ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee "/etc/sudoers.d/admin-nopasswd" function upload_artifacts { - mkdir -p /tmp/artifacts/extra-screenshots - USER="$(whoami)" - sudo chown -R "$USER:$USER" playwright-report - mv playwright-report /tmp/artifacts/ + if [ -n "${TMT_TEST_DATA:-}" ]; then + mv playwright-report "$TMT_TEST_DATA"/playwright-report + else + USER="$(whoami)" + sudo chown -R "$USER:$USER" playwright-report + mv playwright-report /tmp/artifacts/ + fi } trap upload_artifacts EXIT @@ -73,8 +76,8 @@ sudo podman run \ -e "CI=true" \ -e "PLAYWRIGHT_USER=admin" \ -e "PLAYWRIGHT_PASSWORD=foobar" \ - -e "CURRENTS_PROJECT_ID=$CURRENTS_PROJECT_ID" \ - -e "CURRENTS_RECORD_KEY=$CURRENTS_RECORD_KEY" \ + -e "CURRENTS_PROJECT_ID=${CURRENTS_PROJECT_ID:-}" \ + -e "CURRENTS_RECORD_KEY=${CURRENTS_RECORD_KEY:-}" \ --net=host \ -v "$PWD:/tests" \ -v '/etc:/etc' \ From fa0560ac4d9216ce87dc700288201b7414d97488 Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Tue, 19 Aug 2025 12:46:50 +0200 Subject: [PATCH 18/31] playwright: wait until distro and arch have been initialized On-prem the distro and architecture are set after the wizard has been opened. This triggers a reload of the image types and makes the tests very flaky. --- playwright/helpers/helpers.ts | 43 ++++++++++++++++++++++++++++++++ playwright/helpers/navHelpers.ts | 11 ++++++-- schutzbot/playwright_tests.sh | 1 + 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/playwright/helpers/helpers.ts b/playwright/helpers/helpers.ts index 33291ac0..9b086de7 100644 --- a/playwright/helpers/helpers.ts +++ b/playwright/helpers/helpers.ts @@ -1,3 +1,6 @@ +import { execSync } from 'child_process'; +import { readFileSync } from 'node:fs'; + import { expect, type Page } from '@playwright/test'; export const togglePreview = async (page: Page) => { @@ -42,3 +45,43 @@ export const closePopupsIfExist = async (page: Page) => { }); } }; + +// copied over from constants +const ON_PREM_RELEASES = new Map([ + ['centos-10', 'CentOS Stream 10'], + ['fedora-41', 'Fedora Linux 41'], + ['fedora-42', 'Fedora Linux 42'], + ['rhel-10', 'Red Hat Enterprise Linux (RHEL) 10'], +]); + +/* eslint-disable @typescript-eslint/no-explicit-any */ +export const getHostDistroName = (): string => { + const osRelData = readFileSync('/etc/os-release'); + const lines = osRelData + .toString('utf-8') + .split('\n') + .filter((l) => l !== ''); + const osRel = {}; + + for (const l of lines) { + const lineData = l.split('='); + (osRel as any)[lineData[0]] = lineData[1].replace(/"/g, ''); + } + + // strip minor version from rhel + const distro = ON_PREM_RELEASES.get( + `${(osRel as any)['ID']}-${(osRel as any)['VERSION_ID'].split('.')[0]}`, + ); + + if (distro === undefined) { + /* eslint-disable no-console */ + console.error('getHostDistroName failed, os-release config:', osRel); + throw new Error('getHostDistroName failed, distro undefined'); + } + + return distro; +}; + +export const getHostArch = (): string => { + return execSync('uname -m').toString('utf-8').replace(/\s/g, ''); +}; diff --git a/playwright/helpers/navHelpers.ts b/playwright/helpers/navHelpers.ts index 40c1007c..0fa6fe1d 100644 --- a/playwright/helpers/navHelpers.ts +++ b/playwright/helpers/navHelpers.ts @@ -1,6 +1,6 @@ -import type { FrameLocator, Page } from '@playwright/test'; +import { expect, FrameLocator, Page } from '@playwright/test'; -import { isHosted } from './helpers'; +import { getHostArch, getHostDistroName, isHosted } from './helpers'; /** * Opens the wizard, fills out the "Image Output" step, and navigates to the optional steps @@ -8,6 +8,13 @@ import { isHosted } from './helpers'; */ export const navigateToOptionalSteps = async (page: Page | FrameLocator) => { await page.getByRole('button', { name: 'Create image blueprint' }).click(); + if (!isHosted()) { + // wait until the distro and architecture aligns with the host + await expect(page.getByTestId('release_select')).toHaveText( + getHostDistroName(), + ); + await expect(page.getByTestId('arch_select')).toHaveText(getHostArch()); + } await page.getByRole('checkbox', { name: 'Virtualization' }).click(); await page.getByRole('button', { name: 'Next' }).click(); }; diff --git a/schutzbot/playwright_tests.sh b/schutzbot/playwright_tests.sh index 2ad039e4..052faed2 100755 --- a/schutzbot/playwright_tests.sh +++ b/schutzbot/playwright_tests.sh @@ -81,6 +81,7 @@ sudo podman run \ --net=host \ -v "$PWD:/tests" \ -v '/etc:/etc' \ + -v '/etc/os-release:/etc/os-release' \ --privileged \ --rm \ --init \ From 957700adccb3a9dff131172ee1eb7a95cc34e52f Mon Sep 17 00:00:00 2001 From: Sanne Raymaekers Date: Tue, 19 Aug 2025 16:16:36 +0200 Subject: [PATCH 19/31] .gitlab-ci.yml: switch to rhel-10.1 nightly --- .gitlab-ci.yml | 3 +-- schutzbot/terraform | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0948c85c..9cbc9f7a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -32,8 +32,7 @@ test: - RUNNER: - aws/fedora-41-x86_64 - aws/fedora-42-x86_64 - - aws/rhel-9.6-nightly-x86_64 - - aws/rhel-10.0-nightly-x86_64 + - aws/rhel-10.1-nightly-x86_64 INTERNAL_NETWORK: ["true"] finish: diff --git a/schutzbot/terraform b/schutzbot/terraform index 9a64fd4c..a3ddc921 100644 --- a/schutzbot/terraform +++ b/schutzbot/terraform @@ -1 +1 @@ -7b4735d287dd0950e0a6f47dde65b62b0f239da1 +cf0a810fd3b75fa27139746c4dfe72222e13dcba From 0d917c3cd81f93e54bc672f75ab98c70f2c276ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 06:54:49 +0000 Subject: [PATCH 20/31] build(deps-dev): bump @types/node from 24.1.0 to 24.3.0 Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.1.0 to 24.3.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-version: 24.3.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package-lock.json | 30 +++++++++++++++--------------- package.json | 2 +- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/package-lock.json b/package-lock.json index 19bf3fde..f4c24492 100644 --- a/package-lock.json +++ b/package-lock.json @@ -49,7 +49,7 @@ "@testing-library/jest-dom": "6.6.4", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.1.0", + "@types/node": "24.3.0", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", @@ -5577,12 +5577,12 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "node_modules/@types/node-forge": { @@ -19390,9 +19390,9 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -23977,11 +23977,11 @@ "dev": true }, "@types/node": { - "version": "24.1.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz", - "integrity": "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==", + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.0.tgz", + "integrity": "sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==", "requires": { - "undici-types": "~7.8.0" + "undici-types": "~7.10.0" } }, "@types/node-forge": { @@ -32748,9 +32748,9 @@ } }, "undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==" + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", + "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==" }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.1", diff --git a/package.json b/package.json index 171dba95..1ddc2ef3 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@testing-library/jest-dom": "6.6.4", "@testing-library/react": "16.3.0", "@testing-library/user-event": "14.6.1", - "@types/node": "24.1.0", + "@types/node": "24.3.0", "@types/react": "18.3.12", "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", From 0b96c64c930b23a592d69537108d9d3dcb7ad19d Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 20 Aug 2025 14:20:07 +0100 Subject: [PATCH 21/31] devDeps: Bump typescript deps This bumps @typescript-eslint/eslint-plugin and @typescript-eslint/parser from 8.40.0 to 8.40.0. These need to be bumped in tandem. --- package-lock.json | 995 ++-------------------------------------------- package.json | 4 +- 2 files changed, 45 insertions(+), 954 deletions(-) diff --git a/package-lock.json b/package-lock.json index f4c24492..d593079a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -54,8 +54,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.39.1", - "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", "@vitejs/plugin-react": "4.7.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", @@ -5712,17 +5712,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", - "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/type-utils": "8.39.1", - "@typescript-eslint/utils": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -5736,166 +5736,11 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.39.1", + "@typescript-eslint/parser": "^8.40.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", @@ -5906,19 +5751,6 @@ "node": ">= 4" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -5933,16 +5765,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", - "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" }, "engines": { @@ -5957,163 +5789,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/@typescript-eslint/project-service": { "version": "8.40.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.40.0.tgz", @@ -6172,15 +5847,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", - "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -6196,174 +5871,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -19262,109 +18769,6 @@ "typescript": ">=4.8.4 <6.0.0" } }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", - "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/type-utils": "8.40.0", - "@typescript-eslint/utils": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.40.0", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/parser": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", - "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/@typescript-eslint/type-utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", - "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/utils": "8.40.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <6.0.0" - } - }, - "node_modules/typescript-eslint/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/typescript-eslint/node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.12" - }, - "peerDependencies": { - "typescript": ">=4.8.4" - } - }, "node_modules/ufo": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", @@ -24095,114 +23499,28 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.39.1.tgz", - "integrity": "sha512-yYegZ5n3Yr6eOcqgj2nJH8cH/ZZgF+l0YIdKILSDjYFRjgYQMgv/lRjV5Z7Up04b9VYUondt8EPMqg7kTWgJ2g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", + "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/type-utils": "8.39.1", - "@typescript-eslint/utils": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/type-utils": "8.40.0", + "@typescript-eslint/utils": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "dependencies": { - "@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "requires": {} - }, - "@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - } - }, - "@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - } - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, "ignore": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.4.tgz", "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "dev": true }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true - }, "ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -24213,99 +23531,16 @@ } }, "@typescript-eslint/parser": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.39.1.tgz", - "integrity": "sha512-pUXGCuHnnKw6PyYq93lLRiZm3vjuslIy7tus1lIQTYVK9bL8XBgJnCWm8a0KcTtHC84Yya1Q6rtll+duSMj0dg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", + "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", + "@typescript-eslint/scope-manager": "8.40.0", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/visitor-keys": "8.40.0", "debug": "^4.3.4" - }, - "dependencies": { - "@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "requires": {} - }, - "@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - } - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true - }, - "ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "requires": {} - } } }, "@typescript-eslint/project-service": { @@ -24337,104 +23572,18 @@ "requires": {} }, "@typescript-eslint/type-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.39.1.tgz", - "integrity": "sha512-gu9/ahyatyAdQbKeHnhT4R+y3YLtqqHyvkfDxaBYk97EcbfChSJXyaJnIL3ygUv7OuZatePHmQvuH5ru0lnVeA==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", + "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", "dev": true, "requires": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1", - "@typescript-eslint/utils": "8.39.1", + "@typescript-eslint/types": "8.40.0", + "@typescript-eslint/typescript-estree": "8.40.0", + "@typescript-eslint/utils": "8.40.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "dependencies": { - "@typescript-eslint/project-service": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.39.1.tgz", - "integrity": "sha512-8fZxek3ONTwBu9ptw5nCKqZOSkXshZB7uAxuFF0J/wTMkKydjXCzqqga7MlFMpHi9DoG4BadhmTkITBcg8Aybw==", - "dev": true, - "requires": { - "@typescript-eslint/tsconfig-utils": "^8.39.1", - "@typescript-eslint/types": "^8.39.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.39.1.tgz", - "integrity": "sha512-RkBKGBrjgskFGWuyUGz/EtD8AF/GW49S21J8dvMzpJitOF1slLEbbHnNEtAHtnDAnx8qDEdRrULRnWVx27wGBw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1" - } - }, - "@typescript-eslint/tsconfig-utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.39.1.tgz", - "integrity": "sha512-ePUPGVtTMR8XMU2Hee8kD0Pu4NDE1CN9Q1sxGSGd/mbOtGZDM7pnhXNJnzW63zk/q+Z54zVzj44HtwXln5CvHA==", - "dev": true, - "requires": {} - }, - "@typescript-eslint/types": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.39.1.tgz", - "integrity": "sha512-7sPDKQQp+S11laqTrhHqeAbsCfMkwJMrV7oTDvtDds4mEofJYir414bYKUEb8YPUm9QL3U+8f6L6YExSoAGdQw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.39.1.tgz", - "integrity": "sha512-EKkpcPuIux48dddVDXyQBlKdeTPMmALqBUbEk38McWv0qVEZwOpVJBi7ugK5qVNgeuYjGNQxrrnoM/5+TI/BPw==", - "dev": true, - "requires": { - "@typescript-eslint/project-service": "8.39.1", - "@typescript-eslint/tsconfig-utils": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/visitor-keys": "8.39.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" - } - }, - "@typescript-eslint/utils": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.39.1.tgz", - "integrity": "sha512-VF5tZ2XnUSTuiqZFXCZfZs1cgkdd3O/sSYmdo2EpSyDlC86UM/8YytTmKnehOW3TGAlivqTDT6bS87B/GQ/jyg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.39.1", - "@typescript-eslint/types": "8.39.1", - "@typescript-eslint/typescript-estree": "8.39.1" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "8.39.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.39.1.tgz", - "integrity": "sha512-W8FQi6kEh2e8zVhQ0eeRnxdvIoOkAp/CPAahcNio6nO9dsIwb9b34z90KOlheoyuVf6LSOEdjlkxSkapNEc+4A==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.39.1", - "eslint-visitor-keys": "^4.2.1" - } - }, - "eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true - }, - "semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "dev": true - }, "ts-api-utils": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", @@ -32671,64 +31820,6 @@ "@typescript-eslint/parser": "8.40.0", "@typescript-eslint/typescript-estree": "8.40.0", "@typescript-eslint/utils": "8.40.0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.40.0.tgz", - "integrity": "sha512-w/EboPlBwnmOBtRbiOvzjD+wdiZdgFeo17lkltrtn7X37vagKKWJABvyfsJXTlHe6XBzugmYgd4A4nW+k8Mixw==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/type-utils": "8.40.0", - "@typescript-eslint/utils": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - } - }, - "@typescript-eslint/parser": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.40.0.tgz", - "integrity": "sha512-jCNyAuXx8dr5KJMkecGmZ8KI61KBUhkCob+SD+C+I5+Y1FWI2Y3QmY4/cxMCC5WAsZqoEtEETVhUiUMIGCf6Bw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "8.40.0", - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/visitor-keys": "8.40.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/type-utils": { - "version": "8.40.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.40.0.tgz", - "integrity": "sha512-eE60cK4KzAc6ZrzlJnflXdrMqOBaugeukWICO2rB0KNvwdIMaEaYiywwHMzA1qFpTxrLhN9Lp4E/00EgWcD3Ow==", - "dev": true, - "requires": { - "@typescript-eslint/types": "8.40.0", - "@typescript-eslint/typescript-estree": "8.40.0", - "@typescript-eslint/utils": "8.40.0", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" - } - }, - "ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true - }, - "ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", - "dev": true, - "requires": {} - } } }, "ufo": { diff --git a/package.json b/package.json index 1ddc2ef3..6ab83430 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "@types/react-dom": "18.3.1", "@types/react-redux": "7.1.34", "@types/uuid": "10.0.0", - "@typescript-eslint/eslint-plugin": "8.39.1", - "@typescript-eslint/parser": "8.39.1", + "@typescript-eslint/eslint-plugin": "8.40.0", + "@typescript-eslint/parser": "8.40.0", "@vitejs/plugin-react": "4.7.0", "@vitest/coverage-v8": "3.2.4", "babel-loader": "10.0.0", From 4d783537fb3cfe1176c439a7a7c2f7cbf9875c43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Wed, 20 Aug 2025 11:29:17 +0200 Subject: [PATCH 22/31] Launch: implement guidance for Oracle (HMS-9004) This commit adds launch modal for guiding users through launching a Oracle instance from their image. It provides a link to Oracle's cloud and a link for importing the image on the user's side. --- src/Components/ImagesTable/ImagesTable.tsx | 9 +- src/Components/Launch/OciLaunchModal.tsx | 139 +++++++++++++++++++++ 2 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/Components/Launch/OciLaunchModal.tsx diff --git a/src/Components/ImagesTable/ImagesTable.tsx b/src/Components/ImagesTable/ImagesTable.tsx index 32782d3a..09e4b8d7 100644 --- a/src/Components/ImagesTable/ImagesTable.tsx +++ b/src/Components/ImagesTable/ImagesTable.tsx @@ -26,6 +26,7 @@ import { } from '@patternfly/react-table'; import useChrome from '@redhat-cloud-services/frontend-components/useChrome'; import { ChromeUser } from '@redhat-cloud-services/types'; +import { useFlag } from '@unleash/proxy-client-react'; import { useDispatch } from 'react-redux'; import { NavigateFunction, useNavigate } from 'react-router-dom'; @@ -87,6 +88,7 @@ import { timestampToDisplayString, timestampToDisplayStringDetailed, } from '../../Utilities/time'; +import { OciLaunchModal } from '../Launch/OciLaunchModal'; const ImagesTable = () => { const [page, setPage] = useState(1); @@ -403,13 +405,18 @@ type OciRowPropTypes = { }; const OciRow = ({ compose, rowIndex }: OciRowPropTypes) => { + const launchEofFlag = useFlag('image-builder.launcheof'); const daysToExpiration = Math.floor( computeHoursToExpiration(compose.created_at) / 24, ); const isExpired = daysToExpiration >= OCI_STORAGE_EXPIRATION_TIME_IN_DAYS; const details = ; - const instance = ; + const instance = launchEofFlag ? ( + + ) : ( + + ); const status = ( { + const [isModalOpen, setIsModalOpen] = useState(false); + const { data, isSuccess, isFetching } = useGetComposeStatusQuery({ + composeId: compose.id, + }); + + const navigate = useNavigate(); + if (!isSuccess) { + return ; + } + + const options = data?.image_status.upload_status?.options; + + if (options && !isOciUploadStatus(options)) { + throw TypeError( + `Error: options must be of type OciUploadStatus, not ${typeof options}.`, + ); + } + + if (isExpired) { + return ( + + ); + } + + const handleModalToggle = () => { + setIsModalOpen(!isModalOpen); + }; + + return ( + + + + + + + + Navigate to the{' '} + {' '} + page. + + + Select{' '} + Import image, + and enter the Object Storage URL of the image. + {!isFetching && ( + + {options?.url || ''} + + )} + {isFetching && } + + + After the image is available, click on{' '} + Create instance. + + + + + + + + + ); +}; From 44c3674072f3d0d4fe147c374b63e3dcabcc0a80 Mon Sep 17 00:00:00 2001 From: Gianluca Zuccarelli Date: Wed, 20 Aug 2025 14:51:52 +0100 Subject: [PATCH 23/31] devDeps: Bump msw from 2.10.4 to 2.10.5 This bumps msw from 2.10.4 to 2.10.5 --- package-lock.json | 14 +++++++------- package.json | 2 +- src/mockServiceWorker.js | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index d593079a..c8b41f90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -83,7 +83,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.10.4", + "msw": "2.10.5", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", @@ -13730,9 +13730,9 @@ "license": "MIT" }, "node_modules/msw": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.4.tgz", - "integrity": "sha512-6R1or/qyele7q3RyPwNuvc0IxO8L8/Aim6Sz5ncXEgcWUNxSKE+udriTOWHtpMwmfkLYlacA2y7TIx4cL5lgHA==", + "version": "2.10.5", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.5.tgz", + "integrity": "sha512-0EsQCrCI1HbhpBWd89DvmxY6plmvrM96b0sCIztnvcNHQbXn5vqwm1KlXslo6u4wN9LFGLC1WFjjgljcQhe40A==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -28622,9 +28622,9 @@ "version": "2.1.3" }, "msw": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.4.tgz", - "integrity": "sha512-6R1or/qyele7q3RyPwNuvc0IxO8L8/Aim6Sz5ncXEgcWUNxSKE+udriTOWHtpMwmfkLYlacA2y7TIx4cL5lgHA==", + "version": "2.10.5", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.10.5.tgz", + "integrity": "sha512-0EsQCrCI1HbhpBWd89DvmxY6plmvrM96b0sCIztnvcNHQbXn5vqwm1KlXslo6u4wN9LFGLC1WFjjgljcQhe40A==", "dev": true, "requires": { "@bundled-es-modules/cookie": "^2.0.1", diff --git a/package.json b/package.json index 6ab83430..a262b49f 100644 --- a/package.json +++ b/package.json @@ -81,7 +81,7 @@ "madge": "8.0.0", "mini-css-extract-plugin": "2.9.2", "moment": "2.30.1", - "msw": "2.10.4", + "msw": "2.10.5", "npm-run-all": "4.1.5", "path-browserify": "1.0.1", "postcss-scss": "4.0.9", diff --git a/src/mockServiceWorker.js b/src/mockServiceWorker.js index be4527c7..723b0714 100644 --- a/src/mockServiceWorker.js +++ b/src/mockServiceWorker.js @@ -7,7 +7,7 @@ * - Please do NOT modify this file. */ -const PACKAGE_VERSION = '2.10.4' +const PACKAGE_VERSION = '2.10.5' const INTEGRITY_CHECKSUM = 'f5825c521429caf22a4dd13b66e243af' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() From a5aa15cbcb711c10d472cf348eca4ed41e2554c4 Mon Sep 17 00:00:00 2001 From: Michal Gold Date: Mon, 28 Jul 2025 11:40:26 +0300 Subject: [PATCH 24/31] Wizard: Resolve row reordering issue on selection and expansion - Fix issue when clicking the expandable arrow or selecting a package checkbox in the Packages step it caused unexpected row reordering. - Updated sorting logic to ensure that selecting a package with a specific stream groups all related module streams together at the top. - Ensured that rows expand in place and selection does not affect row position. - Add unit test as well --- .../steps/Packages/Packages.tsx | 129 +++++++++--------- .../steps/Packages/Packages.test.tsx | 117 ++++++++++++++++ src/test/fixtures/packages.ts | 58 ++++++++ 3 files changed, 239 insertions(+), 65 deletions(-) diff --git a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx index f067d16c..8106fd4b 100644 --- a/src/Components/CreateImageWizard/steps/Packages/Packages.tsx +++ b/src/Components/CreateImageWizard/steps/Packages/Packages.tsx @@ -50,6 +50,7 @@ import { Thead, Tr, } from '@patternfly/react-table'; +import { orderBy } from 'lodash'; import { useDispatch } from 'react-redux'; import CustomHelperText from './components/CustomHelperText'; @@ -66,7 +67,6 @@ import { } from '../../../../constants'; import { useGetArchitecturesQuery } from '../../../../store/backendApi'; import { - ApiPackageSourcesResponse, ApiRepositoryResponseRead, ApiSearchRpmResponse, useCreateRepositoryMutation, @@ -700,7 +700,7 @@ const Packages = () => { ); } - const unpackedData: IBPackageWithRepositoryInfo[] = + let unpackedData: IBPackageWithRepositoryInfo[] = combinedPackageData.flatMap((item) => { // Spread modules into separate rows by application stream if (item.sources) { @@ -724,13 +724,16 @@ const Packages = () => { }); // group by name, but sort by application stream in descending order - unpackedData.sort((a, b) => { - if (a.name === b.name) { - return (b.stream ?? '').localeCompare(a.stream ?? ''); - } else { - return a.name.localeCompare(b.name); - } - }); + unpackedData = orderBy( + unpackedData, + [ + 'name', + (pkg) => pkg.stream || '', + (pkg) => pkg.repository || '', + (pkg) => pkg.module_name || '', + ], + ['asc', 'desc', 'asc', 'asc'], + ); if (toggleSelected === 'toggle-available') { if (activeTabKey === Repos.INCLUDED) { @@ -866,8 +869,6 @@ const Packages = () => { dispatch(addPackage(pkg)); if (pkg.type === 'module') { setActiveStream(pkg.stream || ''); - setActiveSortIndex(2); - setPage(1); dispatch( addModule({ name: pkg.module_name || '', @@ -993,7 +994,18 @@ const Packages = () => { } }; - const initialExpandedPkgs: IBPackageWithRepositoryInfo[] = []; + const getPackageUniqueKey = (pkg: IBPackageWithRepositoryInfo): string => { + try { + if (!pkg || !pkg.name) { + return `invalid_${Date.now()}`; + } + return `${pkg.name}_${pkg.stream || 'none'}_${pkg.module_name || 'none'}_${pkg.repository || 'unknown'}`; + } catch { + return `error_${Date.now()}`; + } + }; + + const initialExpandedPkgs: string[] = []; const [expandedPkgs, setExpandedPkgs] = useState(initialExpandedPkgs); const setPkgExpanded = ( @@ -1001,12 +1013,13 @@ const Packages = () => { isExpanding: boolean, ) => setExpandedPkgs((prevExpanded) => { - const otherExpandedPkgs = prevExpanded.filter((p) => p.name !== pkg.name); - return isExpanding ? [...otherExpandedPkgs, pkg] : otherExpandedPkgs; + const pkgKey = getPackageUniqueKey(pkg); + const otherExpandedPkgs = prevExpanded.filter((key) => key !== pkgKey); + return isExpanding ? [...otherExpandedPkgs, pkgKey] : otherExpandedPkgs; }); const isPkgExpanded = (pkg: IBPackageWithRepositoryInfo) => - expandedPkgs.includes(pkg); + expandedPkgs.includes(getPackageUniqueKey(pkg)); const initialExpandedGroups: GroupWithRepositoryInfo['name'][] = []; const [expandedGroups, setExpandedGroups] = useState(initialExpandedGroups); @@ -1030,51 +1043,37 @@ const Packages = () => { 'asc' | 'desc' >('asc'); - const getSortableRowValues = ( - pkg: IBPackageWithRepositoryInfo, - ): (string | number | ApiPackageSourcesResponse[] | undefined)[] => { - return [pkg.name, pkg.summary, pkg.stream, pkg.end_date, pkg.repository]; - }; + const sortedPackages = useMemo(() => { + if (!transformedPackages || !Array.isArray(transformedPackages)) { + return []; + } - let sortedPackages = transformedPackages; - sortedPackages = transformedPackages.sort((a, b) => { - const aValue = getSortableRowValues(a)[activeSortIndex]; - const bValue = getSortableRowValues(b)[activeSortIndex]; - if (typeof aValue === 'number') { - // Numeric sort - if (activeSortDirection === 'asc') { - return (aValue as number) - (bValue as number); - } - return (bValue as number) - (aValue as number); - } - // String sort - // if active stream is set, sort it to the top - if (aValue === activeStream) { - return -1; - } - if (bValue === activeStream) { - return 1; - } - if (activeSortDirection === 'asc') { - // handle packages with undefined stream - if (!aValue) { - return -1; - } - if (!bValue) { - return 1; - } - return (aValue as string).localeCompare(bValue as string); - } else { - // handle packages with undefined stream - if (!aValue) { - return 1; - } - if (!bValue) { - return -1; - } - return (bValue as string).localeCompare(aValue as string); - } - }); + return orderBy( + transformedPackages, + [ + // Active stream packages first (if activeStream is set) + (pkg) => (activeStream && pkg.stream === activeStream ? 0 : 1), + // Then by name + 'name', + // Then by stream version (descending) + (pkg) => { + if (!pkg.stream) return ''; + const parts = pkg.stream + .split('.') + .map((part) => parseInt(part, 10) || 0); + // Convert to string with zero-padding for proper sorting + return parts.map((p) => p.toString().padStart(10, '0')).join('.'); + }, + // Then by end date (nulls last) + (pkg) => pkg.end_date || '9999-12-31', + // Then by repository + (pkg) => pkg.repository || '', + // Finally by module name + (pkg) => pkg.module_name || '', + ], + ['asc', 'asc', 'desc', 'asc', 'asc', 'asc'], + ); + }, [transformedPackages, activeStream]); const getSortParams = (columnIndex: number) => ({ sortBy: { @@ -1100,14 +1099,14 @@ const Packages = () => { (module) => module.name === pkg.name, ); isSelected = - packages.some((p) => p.name === pkg.name) && !isModuleWithSameName; + packages.some((p) => p.name === pkg.name && p.stream === pkg.stream) && + !isModuleWithSameName; } if (pkg.type === 'module') { - // the package is selected if it's added to the packages state - // and its module stream matches one in enabled_modules + // the package is selected if its module stream matches one in enabled_modules isSelected = - packages.some((p) => p.name === pkg.name) && + packages.some((p) => p.name === pkg.name && p.stream === pkg.stream) && modules.some( (m) => m.name === pkg.module_name && m.stream === pkg.stream, ); @@ -1208,7 +1207,7 @@ const Packages = () => { .slice(computeStart(), computeEnd()) .map((grp, rowIndex) => ( @@ -1308,7 +1307,7 @@ const Packages = () => { .slice(computeStart(), computeEnd()) .map((pkg, rowIndex) => ( diff --git a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx index 85a2a12e..42fecc29 100644 --- a/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx +++ b/src/test/Components/CreateImageWizard/steps/Packages/Packages.test.tsx @@ -513,6 +513,123 @@ describe('Step Packages', () => { expect(secondAppStreamRow).toBeDisabled(); expect(secondAppStreamRow).not.toBeChecked(); }); + + test('module selection sorts selected stream to top while maintaining alphabetical order', async () => { + const user = userEvent.setup(); + + await renderCreateMode(); + await goToPackagesStep(); + await typeIntoSearchBox('sortingTest'); + + await screen.findAllByText('alphaModule'); + await screen.findAllByText('betaModule'); + await screen.findAllByText('gammaModule'); + + let rows = await screen.findAllByRole('row'); + rows.shift(); + expect(rows).toHaveLength(6); + + expect(rows[0]).toHaveTextContent('alphaModule'); + expect(rows[0]).toHaveTextContent('3.0'); + expect(rows[1]).toHaveTextContent('alphaModule'); + expect(rows[1]).toHaveTextContent('2.0'); + expect(rows[2]).toHaveTextContent('betaModule'); + expect(rows[2]).toHaveTextContent('4.0'); + expect(rows[3]).toHaveTextContent('betaModule'); + expect(rows[3]).toHaveTextContent('2.0'); + + // Select betaModule with stream 2.0 (row index 3) + const betaModule20Checkbox = await screen.findByRole('checkbox', { + name: /select row 3/i, + }); + + await waitFor(() => user.click(betaModule20Checkbox)); + expect(betaModule20Checkbox).toBeChecked(); + + // After selection, the active stream (2.0) should be prioritized + // All modules with stream 2.0 should move to the top, maintaining alphabetical order + rows = await screen.findAllByRole('row'); + rows.shift(); + expect(rows[0]).toHaveTextContent('alphaModule'); + expect(rows[0]).toHaveTextContent('2.0'); + expect(rows[1]).toHaveTextContent('betaModule'); + expect(rows[1]).toHaveTextContent('2.0'); + expect(rows[2]).toHaveTextContent('gammaModule'); + expect(rows[2]).toHaveTextContent('2.0'); + expect(rows[3]).toHaveTextContent('alphaModule'); + expect(rows[3]).toHaveTextContent('3.0'); + expect(rows[4]).toHaveTextContent('betaModule'); + expect(rows[4]).toHaveTextContent('4.0'); + expect(rows[5]).toHaveTextContent('gammaModule'); + expect(rows[5]).toHaveTextContent('1.5'); + + // Verify that only the selected module is checked + const updatedBetaModule20Checkbox = await screen.findByRole('checkbox', { + name: /select row 1/i, // betaModule 2.0 is now at position 1 + }); + expect(updatedBetaModule20Checkbox).toBeChecked(); + + // Verify that only one checkbox is checked + const allCheckboxes = await screen.findAllByRole('checkbox', { + name: /select row [0-9]/i, + }); + const checkedCheckboxes = allCheckboxes.filter( + (cb) => (cb as HTMLInputElement).checked, + ); + expect(checkedCheckboxes).toHaveLength(1); + expect(checkedCheckboxes[0]).toBe(updatedBetaModule20Checkbox); + }); + + test('unselecting a module does not cause jumping but may reset sort to default', async () => { + const user = userEvent.setup(); + + await renderCreateMode(); + await goToPackagesStep(); + await selectCustomRepo(); + await typeIntoSearchBox('sortingTest'); + await screen.findAllByText('betaModule'); + const betaModule20Checkbox = await screen.findByRole('checkbox', { + name: /select row 3/i, + }); + await waitFor(() => user.click(betaModule20Checkbox)); + expect(betaModule20Checkbox).toBeChecked(); + let rows = await screen.findAllByRole('row'); + rows.shift(); + expect(rows[0]).toHaveTextContent('alphaModule'); + expect(rows[0]).toHaveTextContent('2.0'); + expect(rows[1]).toHaveTextContent('betaModule'); + expect(rows[1]).toHaveTextContent('2.0'); + + const updatedBetaModule20Checkbox = await screen.findByRole('checkbox', { + name: /select row 1/i, + }); + await waitFor(() => user.click(updatedBetaModule20Checkbox)); + expect(updatedBetaModule20Checkbox).not.toBeChecked(); + + // After unselection, the sort may reset to default or stay the same + // The important thing is that we don't get jumping/reordering during the interaction + rows = await screen.findAllByRole('row'); + rows.shift(); // Remove header row + const allCheckboxes = await screen.findAllByRole('checkbox', { + name: /select row [0-9]/i, + }); + const checkedCheckboxes = allCheckboxes.filter( + (cb) => (cb as HTMLInputElement).checked, + ); + expect(checkedCheckboxes).toHaveLength(0); + + // The key test: the table should have a consistent, predictable order + // Either the original alphabetical order OR the stream-sorted order + // What we don't want is jumping around during the selection/unselection process + expect(rows).toHaveLength(6); // Still have all 6 modules + const moduleNames = rows.map((row) => { + const match = row.textContent?.match(/(\w+Module)/); + return match ? match[1] : ''; + }); + expect(moduleNames).toContain('alphaModule'); + expect(moduleNames).toContain('betaModule'); + expect(moduleNames).toContain('gammaModule'); + }); }); }); diff --git a/src/test/fixtures/packages.ts b/src/test/fixtures/packages.ts index 0f494415..08aefb20 100644 --- a/src/test/fixtures/packages.ts +++ b/src/test/fixtures/packages.ts @@ -75,6 +75,64 @@ export const mockSourcesPackagesResults = ( }, ]; } + if (search === 'sortingTest') { + return [ + { + package_name: 'alphaModule', + summary: 'Alpha module for sorting tests', + package_sources: [ + { + name: 'alphaModule', + type: 'module', + stream: '2.0', + end_date: '2025-12-01', + }, + { + name: 'alphaModule', + type: 'module', + stream: '3.0', + end_date: '2027-12-01', + }, + ], + }, + { + package_name: 'betaModule', + summary: 'Beta module for sorting tests', + package_sources: [ + { + name: 'betaModule', + type: 'module', + stream: '2.0', + end_date: '2025-06-01', + }, + { + name: 'betaModule', + type: 'module', + stream: '4.0', + end_date: '2028-06-01', + }, + ], + }, + { + package_name: 'gammaModule', + summary: 'Gamma module for sorting tests', + package_sources: [ + { + name: 'gammaModule', + type: 'module', + stream: '2.0', + end_date: '2025-08-01', + }, + { + name: 'gammaModule', + type: 'module', + stream: '1.5', + end_date: '2026-08-01', + }, + ], + }, + ]; + } if (search === 'mock') { return [ { From e61cb99f1bc96ce3e3af1f0f9abc756c5a287f64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Anna=20V=C3=ADtov=C3=A1?= Date: Mon, 11 Aug 2025 16:06:21 +0200 Subject: [PATCH 25/31] Launch: implement guidance for Azure (HMS-9003) This commit adds launch modal for guiding users through launching an Azure instance from their image. As the launch service will be decommissioned, the flag shall be turned on, the code will later be cleaned up and the Provisioning wizard removed. --- src/Components/ImagesTable/ImagesTable.tsx | 9 +- src/Components/Launch/AzureLaunchModal.tsx | 116 +++++++++++++++++++++ src/Components/Launch/OciLaunchModal.tsx | 2 +- 3 files changed, 125 insertions(+), 2 deletions(-) create mode 100644 src/Components/Launch/AzureLaunchModal.tsx diff --git a/src/Components/ImagesTable/ImagesTable.tsx b/src/Components/ImagesTable/ImagesTable.tsx index 09e4b8d7..8c9118a1 100644 --- a/src/Components/ImagesTable/ImagesTable.tsx +++ b/src/Components/ImagesTable/ImagesTable.tsx @@ -88,6 +88,7 @@ import { timestampToDisplayString, timestampToDisplayStringDetailed, } from '../../Utilities/time'; +import { AzureLaunchModal } from '../Launch/AzureLaunchModal'; import { OciLaunchModal } from '../Launch/OciLaunchModal'; const ImagesTable = () => { @@ -384,8 +385,14 @@ type AzureRowPropTypes = { }; const AzureRow = ({ compose, rowIndex }: AzureRowPropTypes) => { + const launchEofFlag = useFlag('image-builder.launcheof'); + const details = ; - const instance = ; + const instance = launchEofFlag ? ( + + ) : ( + + ); const status = ; return ( diff --git a/src/Components/Launch/AzureLaunchModal.tsx b/src/Components/Launch/AzureLaunchModal.tsx new file mode 100644 index 00000000..8cfba072 --- /dev/null +++ b/src/Components/Launch/AzureLaunchModal.tsx @@ -0,0 +1,116 @@ +import React, { Fragment, useState } from 'react'; + +import { + Button, + List, + ListComponent, + ListItem, + Modal, + ModalBody, + ModalFooter, + ModalHeader, + ModalVariant, + OrderType, + Skeleton, +} from '@patternfly/react-core'; +import { ExternalLinkAltIcon } from '@patternfly/react-icons'; + +import { + ComposesResponseItem, + useGetComposeStatusQuery, +} from '../../store/imageBuilderApi'; +import { isAzureUploadStatus } from '../../store/typeGuards'; + +type LaunchProps = { + compose: ComposesResponseItem; +}; + +export const AzureLaunchModal = ({ compose }: LaunchProps) => { + const [isModalOpen, setIsModalOpen] = useState(false); + const { data, isSuccess, isFetching } = useGetComposeStatusQuery({ + composeId: compose.id, + }); + + if (!isSuccess) { + return ; + } + + const options = data?.image_status.upload_status?.options; + + if (options && !isAzureUploadStatus(options)) { + throw TypeError( + `Error: options must be of type AzureUploadStatus, not ${typeof options}.`, + ); + } + + const handleModalToggle = (_event: KeyboardEvent | React.MouseEvent) => { + setIsModalOpen(!isModalOpen); + }; + + return ( + + + + + + + + + Locate{' '} + {!isFetching && ( + + {options?.image_name}{' '} + + )} + {isFetching && } + in the{' '} + + . + + + Create a Virtual Machine (VM) by using the image. +
+ Note: Review the{' '} + + Availability Zone + {' '} + and the Size to + meet your requirements. Adjust these settings as needed. +
+
+
+ + + +
+
+ ); +}; diff --git a/src/Components/Launch/OciLaunchModal.tsx b/src/Components/Launch/OciLaunchModal.tsx index 8d9f93d6..fa129be3 100644 --- a/src/Components/Launch/OciLaunchModal.tsx +++ b/src/Components/Launch/OciLaunchModal.tsx @@ -72,7 +72,7 @@ export const OciLaunchModal = ({ isExpired, compose }: LaunchProps) => {