diff --git a/.eslintrc.js b/.eslintrc.js index e234e033cd2..3a76355f2ed 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -44,6 +44,7 @@ module.exports = { 'no-underscore-dangle': 'off', 'promise/always-return': 'off', 'promise/catch-or-return': 'off', + 'promise/no-nesting': 'off', }, }, { diff --git a/cypress.config.ts b/cypress.config.ts index 0f8ee3fc286..cbecc0d4537 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -16,6 +16,7 @@ import { toggleFeatureFlag, } from './cypress/helpers/cypressTasks/dynamo/dynamo-helpers'; import { overrideIdleTimeouts } from './cypress/local-only/support/idleLogoutHelpers'; +import { parsePdf } from './cypress/local-only/support/helpers.ts'; import { unzipFile } from './cypress/helpers/file/unzip-file'; import { waitForNoce } from './cypress/helpers/cypressTasks/wait-for-noce'; import { waitForPractitionerEmailUpdate } from './cypress/helpers/cypressTasks/wait-for-practitioner-email-update'; @@ -60,6 +61,9 @@ export default defineConfig({ getUserByEmail(email: string) { return getUserByEmail(email); }, + parsePdf({ filePath }) { + return parsePdf({ filePath }); + }, table(message) { console.table(message); return null; diff --git a/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-grants-e-access.cy.ts b/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-grants-e-access.cy.ts index 1aa5f2305d0..0718530bf6c 100644 --- a/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-grants-e-access.cy.ts +++ b/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-grants-e-access.cy.ts @@ -216,7 +216,7 @@ describe('Admissions Clerk Grants E-Access', () => { getCypressEnv().defaultAccountPass, ); cy.get('[data-testid="change-password-button"]').click(); - cy.get('[data-testid="open-cases-count"]'); + cy.get('[data-testid="petition-welcome-text"]'); createAndServePaperPetition().then(({ docketNumber }) => { cy.login('admissionsclerk1'); cy.get('[data-testid="messages-banner"]'); diff --git a/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-updates-practitioner-email.cy.ts b/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-updates-practitioner-email.cy.ts index e720875f053..e4cec15fe69 100644 --- a/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-updates-practitioner-email.cy.ts +++ b/cypress/deployed-and-local/integration/caseDetail/parties/admissions-clerk-updates-practitioner-email.cy.ts @@ -61,7 +61,7 @@ describe('Admissions Clerk Updates Practitioner Email', () => { getCypressEnv().defaultAccountPass, ); cy.get('[data-testid="change-password-button"]').click(); - cy.get('[data-testid="open-cases-count"]'); + cy.get('[data-testid="petition-welcome-text"]'); logout(); loginAsAdmissionsClerk(); @@ -146,7 +146,7 @@ describe('Admissions Clerk Updates Practitioner Email', () => { getCypressEnv().defaultAccountPass, ); cy.get('[data-testid="change-password-button"]').click(); - cy.get('[data-testid="open-cases-count"]'); + cy.get('[data-testid="petition-welcome-text"]'); createAndServePaperPetition().then(({ docketNumber }) => { cy.login('admissionsclerk1'); diff --git a/cypress/helpers/fileAPetition/create-and-serve-paper-petition.ts b/cypress/helpers/fileAPetition/create-and-serve-paper-petition.ts index 9780a655748..383069a8f7c 100644 --- a/cypress/helpers/fileAPetition/create-and-serve-paper-petition.ts +++ b/cypress/helpers/fileAPetition/create-and-serve-paper-petition.ts @@ -1,8 +1,29 @@ +import { ProcedureType } from '../../../shared/src/business/entities/EntityConstants'; import { loginAsPetitionsClerk1 } from '../authentication/login-as-helpers'; export function createAndServePaperPetition( - options = { yearReceived: '2020' }, -) { + { + procedureType = 'Regular', + trialLocation = 'Birmingham, Alabama', + yearReceived = '2020', + }: Partial<{ + yearReceived: string; + procedureType: ProcedureType; + trialLocation: string; + }> = { + procedureType: 'Regular', + trialLocation: 'Birmingham, Alabama', + yearReceived: '2020', + }, +): Cypress.Chainable<{ + docketNumber: string; + documentsCreated: { + eventCode: string; + index: number; + servedTo: string; + }[]; + name: string; +}> { const name = 'rick james ' + Date.now(); loginAsPetitionsClerk1(); cy.get('[data-testid="inbox-tab-content"]').should('exist'); @@ -22,10 +43,11 @@ export function createAndServePaperPetition( cy.get('[data-testid="phone"]').type('n/a'); cy.get('#tab-case-info > .button-text').click(); cy.get('#date-received-picker').clear(); - cy.get('#date-received-picker').type(`01/02/${options.yearReceived}`); + cy.get('#date-received-picker').type(`01/02/${yearReceived}`); cy.get('#mailing-date').clear(); cy.get('#mailing-date').type('01/02/2019'); - cy.get('[data-testid="preferred-trial-city"]').select('Birmingham, Alabama'); + cy.get(`[data-testid="procedure-type-${procedureType}-radio"]`).click(); + cy.get('[data-testid="preferred-trial-city"]').select(trialLocation); cy.get( ':nth-child(9) > .usa-fieldset > :nth-child(3) > .usa-radio__label', ).click(); diff --git a/cypress/helpers/fileAPetition/petitioner-creates-electronic-case-updated.ts b/cypress/helpers/fileAPetition/petitioner-creates-electronic-case-updated.ts index 5530ccbf537..65ba60fb082 100644 --- a/cypress/helpers/fileAPetition/petitioner-creates-electronic-case-updated.ts +++ b/cypress/helpers/fileAPetition/petitioner-creates-electronic-case-updated.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../shared/src/business/entities/EntityConstants'; import { uploadFile } from '../file/upload-file'; export function petitionerCreatesElectronicCaseUpdated( @@ -26,8 +27,9 @@ export function petitionerCreatesElectronicCaseUpdated( cy.get('[data-testid="redaction-acknowledgement-label"]').click(); cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="step-4-next-button"]').click(); @@ -119,8 +121,9 @@ export function petitionerAttemptsToUploadCorruptPdfUpdated() { cy.get('[data-testid="redaction-acknowledgement-label"]').click(); cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="step-4-next-button"]').click(); @@ -170,8 +173,9 @@ export function petitionerCreatesElectronicCaseWithSpouseUpdated( cy.get('[data-testid="redaction-acknowledgement-label"]').click(); cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="step-4-next-button"]').click(); @@ -221,8 +225,9 @@ export function petitionerCreatesElectronicCaseWithDeceasedSpouseUpdated( cy.get('[data-testid="redaction-acknowledgement-label"]').click(); cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="step-4-next-button"]').click(); diff --git a/cypress/helpers/fileAPetition/petitioner-creates-electronic-case.ts b/cypress/helpers/fileAPetition/petitioner-creates-electronic-case.ts index be024036098..4896d0a17b6 100644 --- a/cypress/helpers/fileAPetition/petitioner-creates-electronic-case.ts +++ b/cypress/helpers/fileAPetition/petitioner-creates-electronic-case.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../shared/src/business/entities/EntityConstants'; import { petitionerAttemptsToUploadCorruptPdfUpdated, petitionerCreatesElectronicCaseForBusinessUpdated, @@ -31,8 +32,9 @@ export function petitionerCreatesElectronicCaseWithDeceasedSpouseOld( cy.get('[data-testid="phone"]').type('1111111111'); cy.get('[data-testid="use-same-address-above-label"]').click(); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); cy.get('[data-testid="file-petition"]').click(); @@ -111,8 +113,9 @@ export function petitionerCreatesElectronicCaseWithSpouseOld( cy.get('[data-testid="phone"]').type('1111111111'); cy.get('[data-testid="use-same-address-above-label"]').click(); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); cy.get('[data-testid="file-petition"]').click(); @@ -160,8 +163,9 @@ function petitionerCreatesElectronicCaseOld(primaryFilerName = 'John') { cy.get('[data-testid="phone"]').type('1111111111'); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); @@ -204,8 +208,9 @@ export function petitionerCreatesElectronicCaseForBusinessOld() { uploadFile('corporate-disclosure-file'); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); @@ -259,8 +264,9 @@ export function privatePractitionerCreatesElectronicCaseForBusiness() { uploadFile('corporate-disclosure-file'); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); @@ -313,8 +319,9 @@ export function petitionerAttemptsToUploadCorruptPdfOld() { cy.get('[data-testid="phone"]').type('1111111111'); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); diff --git a/cypress/helpers/fileAPetition/practitioner-creates-electronic-case.ts b/cypress/helpers/fileAPetition/practitioner-creates-electronic-case.ts index 4c7141b07bc..7ecb0501bc0 100644 --- a/cypress/helpers/fileAPetition/practitioner-creates-electronic-case.ts +++ b/cypress/helpers/fileAPetition/practitioner-creates-electronic-case.ts @@ -1,6 +1,19 @@ +import { PROCEDURE_TYPES_MAP } from '../../../shared/src/business/entities/EntityConstants'; +import { petitionerCreatesElectronicCaseUpdated } from './petitioner-creates-electronic-case-updated'; import { uploadFile } from '../file/upload-file'; export function practitionerCreatesElectronicCase() { + return cy + .task('getFeatureFlagValue', { flag: 'updated-petition-flow' }) + .then(updatedFlow => { + if (updatedFlow) { + return petitionerCreatesElectronicCaseUpdated(); + } + return practitionerCreatesElectronicCaseOld(); + }); +} + +export function practitionerCreatesElectronicCaseOld() { cy.get('[data-testid="file-a-petition"]').click(); uploadFile('stin-file'); cy.get('[data-testid="complete-step-1"]').click(); @@ -20,8 +33,9 @@ export function practitionerCreatesElectronicCase() { cy.get('[data-testid="phone"]').type('1111111111'); cy.get('[data-testid="use-same-address-above-label"]').click(); cy.get('[data-testid="complete-step-3"]').click(); - cy.get('[data-testid="procedure-type-1"]').click(); - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('[data-testid="preferred-trial-city"]').select('Mobile, Alabama'); cy.get('[data-testid="complete-step-4"]').click(); cy.get('[data-testid="file-petition"]').click(); diff --git a/cypress/local-only/support/helpers.ts b/cypress/local-only/support/helpers.ts index c758553e832..13ba3ce1810 100644 --- a/cypress/local-only/support/helpers.ts +++ b/cypress/local-only/support/helpers.ts @@ -1,26 +1,6 @@ -/* eslint-disable */ -/** - * @param b64Data - * @param contentType - * @param sliceSize - */ -export function b64toBlob(b64Data, contentType, sliceSize) { - contentType = contentType || ''; - sliceSize = sliceSize || 512; - const byteCharacters = atob(b64Data); - const byteArrays = []; - for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { - const slice = byteCharacters.slice(offset, offset + sliceSize); - const byteNumbers = new Array(slice.length); - for (let i = 0; i < slice.length; i++) { - byteNumbers[i] = slice.charCodeAt(i); - } - byteArrays.push(new Uint8Array(byteNumbers)); - } - const blob = new Blob(byteArrays, { type: contentType }); - blob.lastModifiedDate = new Date(); - return blob; -} +import * as pdfjsLib from 'pdfjs-dist/legacy/build/pdf'; +import fs from 'fs'; +pdfjsLib.GlobalWorkerOptions.workerSrc = './pdf.worker.js'; export function generateRandomPhoneNumber(): string { function getRandomNumber(min: number, max: number) { @@ -34,3 +14,90 @@ export function generateRandomPhoneNumber(): string { return phoneNumber; } + +export function downloadAndParsePdf(element: string) { + cy.intercept('GET', '**/document-download-url').as('documentDownloadUrl'); + + cy.get(element).click(); + + return cy.wait('@documentDownloadUrl').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + const { url } = response.body; + + return cy + .request({ + encoding: 'binary', + url, + }) + .then(res => { + const filePath = 'cypress/downloads/file.pdf'; + + return cy.writeFile(filePath, res.body, 'binary').then(() => { + return cy + .readFile(filePath, { timeout: 15000 }) + .should('exist') + .then(() => { + return cy.task('parsePdf', { filePath }); + }); + }); + }); + }); +} + +export async function parsePdf({ + filePath, +}: { + filePath: string; +}): Promise { + try { + const dataBuffer = await fs.promises.readFile(filePath); + + const pdfDocument = await pdfjsLib.getDocument({ data: dataBuffer }) + .promise; + + const pdfText = await extractPdfText(pdfDocument); + return pdfText; + } catch (error) { + throw new Error('Failed to parse PDF'); + } +} + +async function extractPdfText(pdfDocument: any) { + let fullText = ''; + + for (let pageNum = 1; pageNum <= pdfDocument.numPages; pageNum++) { + const page = await pdfDocument.getPage(pageNum); + const pageText = await extractPageText(page); + fullText += pageText + '\n'; + } + + return fullText; +} + +async function extractPageText(page: any) { + const textContent = await page.getTextContent(); + + let lastX: number | null = null; + let lastY: number | null = null; + let pageText = ''; + + textContent.items.forEach((item: any) => { + // Check if the current text item is on the same line and close to the previous item. + // If not, add a space to separate them. + if (lastX !== null && lastY !== null) { + const sameLine = Math.abs(item.transform[5] - lastY) < 5; + const closeToLastItem = Math.abs(item.transform[4] - lastX) < 5; + + if (!sameLine || !closeToLastItem) { + pageText += ' '; + } + } + + pageText += item.str; + lastX = item.transform[4] + item.width; + lastY = item.transform[5]; + }); + + return pageText; +} diff --git a/cypress/local-only/support/pages/create-paper-petition.ts b/cypress/local-only/support/pages/create-paper-petition.ts index e8b46a3642a..89e655b5acc 100644 --- a/cypress/local-only/support/pages/create-paper-petition.ts +++ b/cypress/local-only/support/pages/create-paper-petition.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../../shared/src/business/entities/EntityConstants'; import { faker } from '@faker-js/faker'; import { getCreateACaseButton, @@ -54,7 +55,9 @@ export const fillInCreateCaseFromPaperForm = (testData?: { cy.get('input#date-received-picker').type('01/01/2020'); cy.get('#mailing-date').type('01/01/2020'); - cy.get('#procedure-type-0').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('#preferred-trial-city').scrollIntoView(); cy.get('#preferred-trial-city').select('Birmingham, Alabama'); cy.get('label[for="payment-status-paid"]').click(); diff --git a/cypress/local-only/tests/accessibility/filePetition/petitioner.cy.ts b/cypress/local-only/tests/accessibility/filePetition/petitioner.cy.ts index 414b0aba2cc..e620a05f304 100644 --- a/cypress/local-only/tests/accessibility/filePetition/petitioner.cy.ts +++ b/cypress/local-only/tests/accessibility/filePetition/petitioner.cy.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../../../shared/src/business/entities/EntityConstants'; import { checkA11y } from '../../../support/generalCommands/checkA11y'; import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; @@ -262,7 +263,9 @@ describe('File a Petition Page - Petitioner Accessibility', () => { loginAsPetitioner(); cy.visit('/file-a-petition-pa11y/step-4'); cy.get('[data-testid="complete-step-4"]').should('exist'); - cy.get('#procedure-type-0').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); cy.get('#preferred-trial-city').should('exist'); checkA11y(); diff --git a/cypress/local-only/tests/accessibility/petitionGeneration/petition-generation-step-4.cy.ts b/cypress/local-only/tests/accessibility/petitionGeneration/petition-generation-step-4.cy.ts index 7c26dd96834..94864b0f302 100644 --- a/cypress/local-only/tests/accessibility/petitionGeneration/petition-generation-step-4.cy.ts +++ b/cypress/local-only/tests/accessibility/petitionGeneration/petition-generation-step-4.cy.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../../../shared/src/business/entities/EntityConstants'; import { checkA11y } from '../../../support/generalCommands/checkA11y'; import { fillIrsNoticeInformation, @@ -22,7 +23,9 @@ describe('Petition generation - step 4', () => { }); it('Small Case: should be free of a11y issues', () => { - cy.get('[data-testid="procedure-type-1"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.small}-radio"]`, + ).click(); checkA11y(); }); }); diff --git a/cypress/local-only/tests/integration/blockedCasesReport/blocked-cases-report.cy.ts b/cypress/local-only/tests/integration/blockedCasesReport/blocked-cases-report.cy.ts new file mode 100644 index 00000000000..fbda82b1fc0 --- /dev/null +++ b/cypress/local-only/tests/integration/blockedCasesReport/blocked-cases-report.cy.ts @@ -0,0 +1,71 @@ +import { + CASE_STATUS_TYPES, + PROCEDURE_TYPES_MAP, +} from '../../../../../shared/src/business/entities/EntityConstants'; +import { + FORMATS, + formatNow, +} from '../../../../../shared/src/business/utilities/DateHandler'; +import { createAndServePaperPetition } from '../../../../helpers/fileAPetition/create-and-serve-paper-petition'; +import { goToCase } from '../../../../helpers/caseDetail/go-to-case'; +import { loginAsColvin } from '../../../../helpers/authentication/login-as-helpers'; +import { retry } from '../../../../helpers/retry'; + +describe('Blocked Cases Report', () => { + beforeEach(() => { + cy.task('deleteAllFilesInFolder', 'cypress/downloads'); + }); + + it('should show a blocked case in the blocked cases report and the downloaded csv report', () => { + const trialLocation = 'Portland, Maine'; + const [trialCity, trialState] = trialLocation.split(', '); + const procedureType = PROCEDURE_TYPES_MAP.small; + createAndServePaperPetition({ + procedureType, + trialLocation, + }).then(({ docketNumber }) => { + //block case + loginAsColvin(); + goToCase(docketNumber); + cy.get('[data-testid="tab-case-information"]').click(); + cy.get('[data-testid="add-manual-block-button"]').click(); + cy.get('[data-testid="blocked-from-trial-reason-textarea"]').type( + 'This case cannot go to trial.', + ); + cy.get('[data-testid="modal-button-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Case blocked from being set for trial.', + ); + + //View report + cy.get('[data-testid="dropdown-select-report"]').click(); + cy.get('[data-testid="blocked-cases-report"]').click(); + + function checkIfOpensearchHasIndexedBlockedCase() { + cy.reload(); + cy.get('[data-testid="trial-location-filter"]').select(trialLocation); + cy.get('[data-testid="procedure-type-filter"]').select(procedureType); + cy.get('[data-testid="case-status-filter"]').select( + CASE_STATUS_TYPES.generalDocket, + ); + cy.get('[data-testid="blocked-reason-filter"]').select('Manual Block'); + const selector = `[data-testid="blocked-case-${docketNumber}-row"]`; + return cy.get(selector).then(elements => elements.length > 0); + } + + retry(checkIfOpensearchHasIndexedBlockedCase); + + cy.get('[data-testid="blocked-cases-count"]').should('exist'); + + //download csv + cy.get('[data-testid="export-blocked-case-report"]').click(); + const today = formatNow(FORMATS.MMDDYYYY_UNDERSCORED); + const fileName = `Blocked Cases Report - ${trialCity}_${trialState} ${today}.csv`; + cy.readFile(`cypress/downloads/${fileName}`, 'utf-8').should( + fileContent => { + expect(fileContent).to.include(docketNumber); + }, + ); + }); + }); +}); diff --git a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-file-first-irs-document.cy.ts b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-file-first-irs-document.cy.ts index bd194daa074..da3c76dae5b 100644 --- a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-file-first-irs-document.cy.ts +++ b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-file-first-irs-document.cy.ts @@ -8,6 +8,22 @@ import { petitionerCreatesElectronicCaseWithDeceasedSpouse } from '../../../../. import { petitionsClerkServesPetition } from '../../../../../../helpers/documentQC/petitionsclerk-serves-petition'; describe('DOJ Practitioners - File First IRS Document', () => { + before(() => { + cy.task('toggleFeatureFlag', { + flag: 'updated-petition-flow', + flagValue: false, + }); + + cy.reload(true); + }); + + after(() => { + cy.task('toggleFeatureFlag', { + flag: 'updated-petition-flow', + flagValue: true, + }); + }); + it('should never display the "File First IRS Document" button if the user is DOJ Practitioner', () => { loginAsPetitioner(); petitionerCreatesElectronicCaseWithDeceasedSpouse('John', 'Sally').then( diff --git a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-represent-case-for-non-appeal-cases.cy.ts b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-represent-case-for-non-appeal-cases.cy.ts index 8cb7ad15d3e..68421915fe7 100644 --- a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-represent-case-for-non-appeal-cases.cy.ts +++ b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/doj-practitioner-should-not-be-able-to-represent-case-for-non-appeal-cases.cy.ts @@ -13,6 +13,22 @@ import { selectTypeaheadInput } from '../../../../../../helpers/components/typeA import { updateCaseStatus } from '../../../../../../helpers/caseDetail/caseInformation/update-case-status'; describe('DOJ Practitioners - Represent A Party', () => { + before(() => { + cy.task('toggleFeatureFlag', { + flag: 'updated-petition-flow', + flagValue: false, + }); + + cy.reload(true); + }); + + after(() => { + cy.task('toggleFeatureFlag', { + flag: 'updated-petition-flow', + flagValue: true, + }); + }); + it('should only display the "Represent A Party" button when the case is "On Appeal"', () => { const BAR_NUMBER = 'WN7777'; const primaryFilerName = 'John'; diff --git a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/logged-in-user-can-see-un-served-petition-document.cy.ts b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/logged-in-user-can-see-un-served-petition-document.cy.ts index 82f7e668dcb..18ac78dd319 100644 --- a/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/logged-in-user-can-see-un-served-petition-document.cy.ts +++ b/cypress/local-only/tests/integration/caseDetail/docketRecord/electronicFiling/logged-in-user-can-see-un-served-petition-document.cy.ts @@ -4,10 +4,7 @@ import { loginAsPetitioner, loginAsPrivatePractitioner, } from '../../../../../../helpers/authentication/login-as-helpers'; -import { - petitionerCreatesElectronicCaseForBusiness, - privatePractitionerCreatesElectronicCaseForBusiness, -} from '../../../../../../helpers/fileAPetition/petitioner-creates-electronic-case'; +import { petitionerCreatesElectronicCaseForBusiness } from '../../../../../../helpers/fileAPetition/petitioner-creates-electronic-case'; describe('Logged In User Can See Un-Served Petition Document', () => { it('should display a preview link to ["P", "ATP", "DISC"] documents for the Petitioner that created the case', () => { @@ -48,7 +45,7 @@ describe('Logged In User Can See Un-Served Petition Document', () => { it('should display a preview link to ["P", "ATP", "DISC"] documents for the Private Practitioner that created the case', () => { loginAsPrivatePractitioner(); - privatePractitionerCreatesElectronicCaseForBusiness().as('DOCKET_NUMBER'); + petitionerCreatesElectronicCaseForBusiness().as('DOCKET_NUMBER'); loginAsPrivatePractitioner('privatePractitioner1'); cy.get('@DOCKET_NUMBER').then(docketNumber => { diff --git a/cypress/local-only/tests/integration/fileAPetition/file-a-petition.cy.ts b/cypress/local-only/tests/integration/fileAPetition/file-a-petition.cy.ts index bfee3fc63da..c42bcdc1b16 100644 --- a/cypress/local-only/tests/integration/fileAPetition/file-a-petition.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetition/file-a-petition.cy.ts @@ -176,9 +176,24 @@ describe('File a Petition', () => { it('reviews information before filing', () => { cy.get('button#submit-case').click(); + + // check pdf preview for desktop cy.get('button#petition-preview-button').click(); cy.get('dialog.modal-screen').should('exist'); cy.get('button#close-modal-button').click(); + + // check pdf preview for mobile + cy.viewport('iphone-6+'); + cy.window().then(win => { + // Stub the window.open in the context of the window + cy.stub(win, 'open').as('windowOpen'); + }); + cy.get('button#petition-preview-button').click(); + cy.get('@windowOpen').should( + 'be.calledWithMatch', + new RegExp('^blob:', 'm'), + '_blank', + ); }); it('submits forms and redirects to the file petition success page', () => { diff --git a/cypress/local-only/tests/integration/fileAPetition/start-a-case-practitioner.cy.ts b/cypress/local-only/tests/integration/fileAPetition/start-a-case-practitioner.cy.ts index a2ef6e048b8..38c4102cc9d 100644 --- a/cypress/local-only/tests/integration/fileAPetition/start-a-case-practitioner.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetition/start-a-case-practitioner.cy.ts @@ -1,17 +1,15 @@ -import { fillInAndSubmitForm } from '../../../support/pages/start-a-case'; import { getCaseList, - getStartCaseButton, navigateTo as navigateToDashboard, } from '../../../support/pages/dashboard-practitioner'; +import { practitionerCreatesElectronicCase } from '../../../../helpers/fileAPetition/practitioner-creates-electronic-case'; describe('Start a case as a practitioner', () => { it('go to the practitioner dashboard, file a case, and expect case count to increment by one', () => { navigateToDashboard('privatePractitioner'); getCaseList().then(cases => { - getStartCaseButton().click(); - fillInAndSubmitForm(); + practitionerCreatesElectronicCase(); getCaseList().should('exist'); getCaseList().should('have.length', cases.length + 1); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-all-steps.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-all-steps.cy.ts index 7fdc9333588..df6069259f2 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-all-steps.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-all-steps.cy.ts @@ -41,7 +41,7 @@ describe('File a petition', () => { cy.get('[data-testid="step-6-next-button"]').click(); cy.wait('@postCase').then(({ response }) => { - if (!response) throw Error('Did not find resposne'); + if (!response) throw Error('Did not find response'); expect(response.body).to.have.property('docketNumber'); const createdDocketNumber = response.body.docketNumber; cy.get('.usa-alert__heading').should( diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-generate-petition.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-generate-petition.cy.ts new file mode 100644 index 00000000000..d7317d5f8be --- /dev/null +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-generate-petition.cy.ts @@ -0,0 +1,377 @@ +import { + contactInfo, + fillBusinessandOtherContact, + fillCaseProcedureInformation, + fillGeneratePetitionFileInformation, + fillIrsNoticeInformation, + fillMultipleIRSNotices, + fillPetitionerInformation, + fillPrimaryContact, + fillSecondaryContact, + fillStinInformation, + secondaryContactInfo, +} from './petition-helper'; +import { downloadAndParsePdf } from '../../../support/helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; + +describe('File a petition', () => { + const VALID_FILE = '../../helpers/file/sample.pdf'; + + describe('Generate petition file', () => { + it('should generate petition for filing type Myself', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Deficiency'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + '1. Which IRS ACTION(S) do you dispute? Notice of Deficiency', + ); + expect(text).to.include( + '2. If applicable, provide the date(s) the IRS issued the NOTICE(S) for the above and the city and state of the IRS office(s) issuing the NOTICE(S): N/A - Jackson, NJ', + ); + expect(text).to.include( + '3. Provide the year(s) or period(s) for which the NOTICE(S) was/were issued: 2024', + ); + expect(text).to.include( + '4. Which case procedure and trial location are you requesting? Regular - Birmingham, Alabama', + ); + + expect(text).to.include( + '5. Explain why you disagree with the IRS action(s) in this case (please add each reason separately): a. REASON 1', + ); + + expect(text).to.include( + '6. State the facts upon which you rely (please add each fact separately): a. FACT 1', + ); + + expect(text).to.include( + "Petitioner's contact information: John Cruz 123 Test Drive Boulder, CO 12345 Phone: Test Phone Service email: petitioner1@example.com", + ); + }, + ); + }); + }); + + it('should generate petition for case type Disclosure', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Disclosure2'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + '1. Which IRS ACTION(S) do you dispute? Notice - We Are Going To Make Your Determination Letter Available for Public Inspection', + ); + }, + ); + }); + }); + + it('should generate petition when user has not received an IRS notice', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Deficiency', false); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + '1. Which IRS ACTION(S) do you dispute? Deficiency', + ); + expect(text).to.include( + '2. If applicable, provide the date(s) the IRS issued the NOTICE(S) for the above and the city and state of the IRS office(s) issuing the NOTICE(S): N/A', + ); + expect(text).to.include( + '3. Provide the year(s) or period(s) for which the NOTICE(S) was/were issued: N/A', + ); + }, + ); + }); + }); + + it('should generate petition when user received multiple IRS notices', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(true); + fillMultipleIRSNotices(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + '2. If applicable, provide the date(s) the IRS issued the NOTICE(S) for the above and the city and state of the IRS office(s) issuing the NOTICE(S): 05/02/24 - Jackson, NJ 05/02/23 - New York, NY', + ); + expect(text).to.include( + '3. Provide the year(s) or period(s) for which the NOTICE(S) was/were issued: 2024 2023', + ); + }, + ); + }); + }); + + it('should generate petition when user enters multiple facts and reasons', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(true); + fillIrsNoticeInformation(VALID_FILE, 'Deficiency', false); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + '5. Explain why you disagree with the IRS action(s) in this case (please add each reason separately): a. REASON 1 b. REASON 2', + ); + + expect(text).to.include( + '6. State the facts upon which you rely (please add each fact separately): a. FACT 1 b. FACT 2', + ); + }, + ); + }); + }); + + it('should generate petition when filing for Myself and deceased Spouse', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + + cy.get('[data-testid="filing-type-1"]').click(); + fillPrimaryContact(); + cy.get('[data-testid="is-spouse-deceased-0"]').click(); + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + cy.get('[data-testid="contactSecondary-in-care-of"]').type( + secondaryContactInfo.inCareOf, + ); + fillSecondaryContact(); + cy.get('[data-testid="step-1-next-button"]').click(); + + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Disclosure2'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John & Bill, Deceased Petitioners v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + "Petitioner's contact information: John 111 South West St. Orlando, AK 33233 Phone: 3232323232 Place of legal residence: Delaware Service email: petitioner1@example.com", + ); + expect(text).to.include( + "Spouse's contact information: Bill c/o: Spouse Care of 111 South West St. Orlando, AK 33233 Phone: 7878787878 Email: petitioner2@example.com Register for electronic filing and service: Yes Place of legal residence: New Jersey", + ); + }, + ); + }); + }); + + it('should generate petition when filing for Myself and Spouse', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + + cy.get('[data-testid="filing-type-1"]').click(); + fillPrimaryContact(); + cy.get('[data-testid="is-spouse-deceased-1"]').click(); + cy.get('[data-testid="have-spouse-consent-label"]').click(); + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + fillSecondaryContact(); + + cy.get('[data-testid="step-1-next-button"]').click(); + + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Disclosure2'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John & Bill Petitioners v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + "Petitioner's contact information: John 111 South West St. Orlando, AK 33233 Phone: 3232323232 Place of legal residence: Delaware Service email: petitioner1@example.com", + ); + expect(text).to.include( + "Spouse's contact information: Bill 111 South West St. Orlando, AK 33233 Phone: 7878787878 Email: petitioner2@example.com Register for electronic filing and service: Yes Place of legal residence: New Jersey", + ); + }, + ); + }); + }); + + it('should generate petition when filing for Business', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + + cy.get('[data-testid="filing-type-2"]').click(); + cy.get('[data-testid="business-type-0"]').click(); + fillBusinessandOtherContact({ + fillInCareOf: true, + }); + cy.get('[data-testid="contactPrimary-placeOfLegalResidence"]').select( + contactInfo.placeOfLegalResidence, + ); + cy.get('[data-testid="contact-primary-phone"]').type(contactInfo.phone); + cy.get('[data-testid="corporate-disclosure-file"]').attachFile( + VALID_FILE, + ); + cy.get('[data-testid="step-1-next-button"]').click(); + + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE, 'Disclosure2'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'Test name Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include('Corporate Disclosure Statement'); + expect(text).to.include('Place of business: Delaware'); + }, + ); + }); + }); + + it('should generate petition when filed by Practitioner', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find response'); + + cy.get('[data-testid="case-link"]').click(); + downloadAndParsePdf('[data-testid="document-download-link-P"]').then( + text => { + expect(text).to.include(response.body.docketNumber); + expect(text).to.include( + 'John Cruz Petitioner v. Commissioner of Internal Revenue Respondent', + ); + expect(text).to.include( + "Petitioner's contact information: John Cruz 123 Test Drive Boulder, CO 12345 Phone: Test Phone", + ); + expect(text).to.include( + "Counsel's contact information: Test Private Practitioner Bogus Barristers 234 Main St Apartment 4 Under the stairs Chicago, IL 61234 Phone: +1 (555) 555-5555 Email: privatePractitioner1@example.com Tax Court Bar No.: PT5432", + ); + expect(text).not.to.include('Service Email'); + expect(text).not.to.include( + 'Register for electronic filing and service', + ); + }, + ); + }); + }); + }); +}); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-intro.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-intro.cy.ts new file mode 100644 index 00000000000..d8f048f8c6d --- /dev/null +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-intro.cy.ts @@ -0,0 +1,127 @@ +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; + +describe('File a petition: Intro', () => { + describe('Petitioner', () => { + describe('Welcome Page', () => { + beforeEach(() => { + loginAsPetitioner('petitioner7'); + }); + it('should display correct welcome message for petitioner', () => { + cy.get('[data-testid="error-alert-title"]').should( + 'have.text', + 'Have you already filed a petition by mail or do you want electronic access to your existing case?', + ); + cy.get('[data-testid="error-alert-message"]').contains( + 'Do not start a new case.', + ); + }); + + it('should display taxpayer tools and free taxpayer help sections', () => { + cy.get('[data-testid="taxpayer-tools-section"]').should('exist'); + cy.get('[data-testid="free-taxpayer-help-section"]').should('exist'); + }); + + it('should navigate to the before starting a case page', () => { + cy.get('[data-testid="file-a-petition"]').click(); + cy.get('h2').should('have.text', 'How to Create a Case'); + }); + }); + + describe('Before starting a case', () => { + beforeEach(() => { + loginAsPetitioner('petitioner'); + cy.get('[data-testid="file-a-petition"]').click(); + }); + it('should display correct text for start a case instructions', () => { + cy.get('[data-testid="upload-irs-notice-title"]').contains( + 'If you received', + ); + cy.get('[data-testid="upload-irs-notice-bullet-1"]').contains( + 'Submit a PDF of the Notice(s) you received', + ); + cy.get('[data-testid="confirm-identity-bullet-1"]').contains( + 'This document is sent to the IRS to help them identify you', + ); + cy.get('[data-testid="confirm-identity-bullet-1"]').contains( + 'This is the only document that should contain your SSN, TIN, or EIN.', + ); + cy.get('[data-testid="deadline-to-file"]').contains( + 'If you received a notice in the mail from the IRS', + ); + cy.get('[data-testid="accordion-item-title"]').contains( + 'Are you filing jointly with a spouse?', + ); + + cy.get('[data-testid="accordion-item-title"]').eq(0).click(); + cy.get('[data-testid="filing-jointly-accordion-item"]').contains( + "To file a joint Petition with your spouse, you must have the spouse's consent", + ); + cy.get('[data-testid="filing-jointly-accordion-item"]').contains( + "If you do not have your spouse's consent", + ); + cy.get('[data-testid="filing-jointly-accordion-item"]').contains( + 'select “Myself” as the person who is filing.', + ); + }); + }); + }); + describe('Practitioner', () => { + describe('Welcome Page', () => { + beforeEach(() => { + cy.login('privatePractitioner3'); + }); + it('should display correct welcome message text for practitioner', () => { + cy.get('[data-testid="warning-alert-title"]').should( + 'have.text', + 'Do you need access to an existing case?', + ); + cy.get('[data-testid="warning-alert-message"]').should( + 'have.text', + 'Search for the case docket number to file the appropriate document.', + ); + }); + + it('should not display taxpayer tools and free taxpayer help sections', () => { + cy.get('[data-testid="taxpayer-tools-section"]').should('not.exist'); + cy.get('[data-testid="free-taxpayer-help-section"]').should( + 'not.exist', + ); + }); + + it('should navigate to the before starting a case page', () => { + cy.get('[data-testid="file-a-petition"]').click(); + cy.get('h2').should('have.text', 'How to Create a Case'); + }); + }); + + describe('Before starting a case', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.get('[data-testid="file-a-petition"]').click(); + }); + it('should display correct text for start a case instructions', () => { + cy.get('[data-testid="upload-irs-notice-title"]').contains( + 'If the petitioner received', + ); + cy.get('[data-testid="upload-irs-notice-bullet-1"]').contains( + 'Submit a PDF of the Notice(s) they received', + ); + cy.get('[data-testid="confirm-identity-bullet-1"]').contains( + 'This document is sent to the IRS to help them identify the petitioner', + ); + cy.get('[data-testid="confirm-identity-bullet-1"]').contains( + 'This is the only document that should contain the petitioner’s SSN, TIN, or EIN.', + ); + cy.get('[data-testid="deadline-to-file"]').contains( + 'If the petitioner received a notice in the mail from the IRS', + ); + cy.get('[data-testid="accordion-item-title"]') + .contains('Is the petitioner filing jointly with a spouse?') + .should('not.exist'); + }); + }); + }); +}); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself-and-my-spouse.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself-and-my-spouse.cy.ts index 384af10a495..c408784e190 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself-and-my-spouse.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself-and-my-spouse.cy.ts @@ -1,44 +1,58 @@ import { InputFillType, selectInput, textInput } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition: Step 1 - Petitioner Information', () => { - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - cy.get('[data-testid="step-indicator-current-step-1-icon"]'); - }); - - it('should display all the possible options', () => { - const EXPECTED_FILING_TYPES: string[] = [ - 'Myself', - 'Myself and my spouse', - 'A business', - 'Other', - ]; - cy.get('.filing-type-radio-option').should('have.length', 4); - cy.get('.filing-type-radio-option').each((element, index) => { - cy.wrap(element).should('have.text', EXPECTED_FILING_TYPES[index]); + describe('Petitioner', () => { + beforeEach(() => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + cy.get('[data-testid="step-indicator-current-step-1-icon"]'); }); - }); - it('should display a validaiton error message if user does not select filing type', () => { - cy.get('[data-testid="filling-type-error-message"]').should('not.exist'); + it('should display all the possible options', () => { + const EXPECTED_FILING_TYPES: string[] = [ + 'Myself', + 'Myself and my spouse', + 'A business', + 'Other', + ]; + cy.get('.filing-type-radio-option').should('have.length', 4); + cy.get('.filing-type-radio-option').each((element, index) => { + cy.wrap(element).should('have.text', EXPECTED_FILING_TYPES[index]); + }); + }); - cy.get('[data-testid="step-1-next-button"]').click(); + it('should display a validation error message if user does not select filing type', () => { + cy.get('[data-testid="filling-type-error-message"]').should('not.exist'); - cy.get('[data-testid="filling-type-error-message"]').should('exist'); - }); + cy.get('[data-testid="step-1-next-button"]').click(); - describe('Myself and my spouse', () => { - beforeEach(() => { - cy.get('[data-testid="filing-type-1"').click(); + cy.get('[data-testid="filling-type-error-message"]').should('exist'); }); - describe('Country - United States', () => { + describe('Myself and my spouse', () => { beforeEach(() => { + cy.get('[data-testid="filing-type-1"').click(); cy.get('[data-testid="domestic-country-btn"').click(); }); + it('should display correct spouse header', () => { + cy.get('[data-testid="spouse-header"]').should( + 'have.text', + "Your spouse's information", + ); + }); + + it('should display correct is spouse deceased text', () => { + cy.get('[data-testid="deceased-spouse-legend"]').should( + 'have.text', + 'Is your spouse deceased?', + ); + }); + it('should display all error validation messages when user leaves form empty', () => { const ERROR_MESSAGES_DATA_TEST_ID = [ 'primary-contact-name-error-message', @@ -166,6 +180,25 @@ describe('File a petition: Step 1 - Petitioner Information', () => { cy.get('[data-testid="step-indicator-current-step-2-icon"]'); }); + it('should display email fields for spouse', () => { + cy.get('[data-testid="contact-secondary-email"]').should( + 'be.visible', + ); + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).should('be.visible'); + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).click(); + cy.get('[data-testid="warning-alert"]').should('be.visible'); + }); + + it('should not display spouse consent message', () => { + cy.get('[data-testid="have-spouse-consent-label"]').should( + 'not.exist', + ); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ { @@ -268,6 +301,34 @@ describe('File a petition: Step 1 - Petitioner Information', () => { }); }); + it('should display correct text for spouse consent message', () => { + cy.get('[data-testid="warning-alert"]').should( + 'have.text', + 'To file on behalf of your spouse, you must have consent. If you do not have your spouse\'s consent, select "Myself" as the person who is filing.', + ); + }); + + it('should display correct text for have spouse consent label', () => { + cy.get('[data-testid="have-spouse-consent-label"]').should( + 'have.text', + "I have my spouse's consent", + ); + }); + + it('should display email fields for spouse', () => { + cy.get('[data-testid="have-spouse-consent-label"]').click(); + cy.get('[data-testid="contact-secondary-email"]').should( + 'be.visible', + ); + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).should('be.visible'); + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).click(); + cy.get('[data-testid="warning-alert"]').should('be.visible'); + }); + describe('I have Spouse Consent - do not register email', () => { beforeEach(() => { cy.get('[data-testid="have-spouse-consent-label"').click(); @@ -434,4 +495,64 @@ describe('File a petition: Step 1 - Petitioner Information', () => { }); }); }); + describe('Practitioner', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + cy.get('[data-testid="step-indicator-current-step-1-icon"]'); + cy.get('[data-testid="filing-type-1"').click(); + }); + + describe('Petitioner and spouse', () => { + it('should display correct spouse header', () => { + cy.get('[data-testid="spouse-header"]').should( + 'have.text', + 'Petitioner Spouse information', + ); + }); + + it('should display correct is spouse deceased text', () => { + cy.get('[data-testid="deceased-spouse-legend"]').should( + 'have.text', + 'Is the petitioner spouse deceased?', + ); + }); + describe('Spouse is not deceased', () => { + beforeEach(() => { + cy.get('[data-testid="is-spouse-deceased-1"]').click(); + }); + it('should not display spouse consent checkbox', () => { + cy.get('[data-testid="have-spouse-consent-label"]').should( + 'not.exist', + ); + }); + + it('should display email fields for spouse', () => { + cy.get('[data-testid="contact-secondary-email"]').should('exist'); + }); + + it('should not display register for e-filing field', () => { + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).should('not.exist'); + }); + }); + + describe('Spouse is deceased', () => { + beforeEach(() => { + cy.get('[data-testid="is-spouse-deceased-0"]').click(); + }); + + it('should display email fields for spouse', () => { + cy.get('[data-testid="contact-secondary-email"]').should('exist'); + }); + + it('should not display register for e-filing field', () => { + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).should('not.exist'); + }); + }); + }); + }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself.cy.ts index eef6ec182b7..90a4ce95162 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-myself.cy.ts @@ -1,14 +1,14 @@ import { InputFillType, selectInput, textInput } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; -describe('File a petition', () => { - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - }); - - describe('Step 1 - Petitioner Information', () => { +describe('File a petition: Step 1 - Petitioner Information', () => { + describe('Petitioner', () => { beforeEach(() => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); cy.get('[data-testid="step-indicator-current-step-1-icon"]'); }); @@ -25,7 +25,7 @@ describe('File a petition', () => { }); }); - it('should display a validaiton error message if user does not select filing type', () => { + it('should display a validation error message if user does not select filing type', () => { cy.get('[data-testid="filling-type-error-message"]').should('not.exist'); cy.get('[data-testid="step-1-next-button"]').click(); @@ -44,6 +44,20 @@ describe('File a petition', () => { ); }); + it('should display correct label for contact name', () => { + cy.get('[data-testid="filing-type-0"]').click(); + cy.get('[data-testid="contact-primary-name-label"]').should( + 'have.text', + 'Full Name', + ); + }); + + it('should not display email field', () => { + cy.get('[data-testid="filing-type-0"]').click(); + cy.get('[data-testid="contact-primary-paper-petition-email"]').should( + 'not.exist', + ); + }); it('should display validation error messages to all required fields left empty', () => { const ERROR_MESSAGES_DATA_TEST_ID = [ 'primary-contact-name-error-message', @@ -165,4 +179,40 @@ describe('File a petition', () => { }); }); }); + + describe('Practitioner', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + }); + + describe('Myself', () => { + it('should display correct filing type options for private practitioner', () => { + const EXPECTED_FILING_TYPES: string[] = [ + 'Petitioner', + 'Petitioner and petitioner spouse', + 'A business', + 'Other', + ]; + cy.get('.filing-type-radio-option').should('have.length', 4); + cy.get('.filing-type-radio-option').each((element, index) => { + cy.wrap(element).should('have.text', EXPECTED_FILING_TYPES[index]); + }); + }); + + it('should display correct label for contact name', () => { + cy.get('[data-testid="filing-type-0"]').click(); + cy.get('[data-testid="contact-primary-name-label"]').should( + 'have.text', + 'Petitioner’s full name', + ); + }); + it('should display email field', () => { + cy.get('[data-testid="filing-type-0"]').click(); + cy.get('[data-testid="contact-primary-paper-petition-email"]').should( + 'exist', + ); + }); + }); + }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-other--minor-or-legally-incompetent.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-other--minor-or-legally-incompetent.cy.ts index a5f92c5e9cc..5e336d77885 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-other--minor-or-legally-incompetent.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-1-other--minor-or-legally-incompetent.cy.ts @@ -1,5 +1,8 @@ import { InputFillType, selectInput, textInput } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; const INTERNATIONAL_FORM_INPUT_DATA: InputFillType[] = [ { @@ -98,560 +101,615 @@ const DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID = [ ]; describe('File a petition: Step 1 - Petitioner Information', () => { - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - cy.get('[data-testid="step-indicator-current-step-1-icon"]'); - }); - - describe('Other', () => { + describe('Petitioner', () => { beforeEach(() => { - cy.get('[data-testid="filing-type-3"').click(); + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + cy.get('[data-testid="step-indicator-current-step-1-icon"]'); }); - - describe('A minor or legally incompetent person', () => { + describe('Other', () => { beforeEach(() => { - cy.get('[data-testid="other-type-radio-option-1"]').click(); + cy.get('[data-testid="filing-type-3"').click(); }); - it('should display all minor or legally incompetent person role options', () => { - const EXPECTED_FILING_TYPES: string[] = [ - 'Conservator', - 'Guardian', - 'Custodian', - 'Next friend for a minor (without a guardian, conservator, or other like fiduciary)', - 'Next friend for a legally incompetent person (without a guardian, conservator, or other like fiduciary)', - ]; - - EXPECTED_FILING_TYPES.forEach((filingType, index) => { - cy.get( - `[data-testid="minor-incompetent-type-radio-option-${index}"]`, - ).should('have.text', filingType); + describe('A minor or legally incompetent person', () => { + beforeEach(() => { + cy.get('[data-testid="other-type-radio-option-1"]').click(); }); - }); - it('should display a validation error message when no minor or legally incompetent person role option is selected', () => { - cy.get('[data-testid="minor-incompetent-type-error-message"]').should( - 'not.exist', - ); + it('should display all minor or legally incompetent person role options', () => { + const EXPECTED_FILING_TYPES: string[] = [ + 'Conservator', + 'Guardian', + 'Custodian', + 'Next friend for a minor (without a guardian, conservator, or other like fiduciary)', + 'Next friend for a legally incompetent person (without a guardian, conservator, or other like fiduciary)', + ]; - cy.get('[data-testid="step-1-next-button"]').click(); + EXPECTED_FILING_TYPES.forEach((filingType, index) => { + cy.get( + `[data-testid="minor-incompetent-type-radio-option-${index}"]`, + ).should('have.text', filingType); + }); + }); - cy.get('[data-testid="minor-incompetent-type-error-message"]').should( - 'exist', - ); - }); + it('should display a validation error message when no minor or legally incompetent person role option is selected', () => { + cy.get('[data-testid="minor-incompetent-type-error-message"]').should( + 'not.exist', + ); - describe('Conservator', () => { - beforeEach(() => { - cy.get( - '[data-testid="minor-incompetent-type-radio-option-0"]', - ).click(); - }); - describe('Domestic', () => { - beforeEach(() => { - cy.get('[data-testid="domestic-country-btn"]').click(); - }); - it('should display a validation error message when form is empty', () => { - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }); + cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="minor-incompetent-type-error-message"]').should( + 'exist', + ); + }); - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); + it('should display correct other type title', () => { + cy.get('[data-testid="estate-type-legend"]').should( + 'have.text', + 'What is your role in filing for this minor or legally incompetent person?', + ); }); - describe('International', () => { + + describe('Conservator', () => { beforeEach(() => { - cy.get('[data-testid="international-country-btn"]').click(); + cy.get( + '[data-testid="minor-incompetent-type-radio-option-0"]', + ).click(); }); - it('should display a validation error message when form is empty', () => { - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }, - ); - - cy.get('[data-testid="step-1-next-button"]').click(); - - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }, - ); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + describe('Domestic', () => { + beforeEach(() => { + cy.get('[data-testid="domestic-country-btn"]').click(); + }); + it('should display a validation error message when form is empty', () => { + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + describe('International', () => { + beforeEach(() => { + cy.get('[data-testid="international-country-btn"]').click(); + }); + it('should display a validation error message when form is empty', () => { + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); }); - }); - describe('Guardian', () => { - beforeEach(() => { - cy.get( - '[data-testid="minor-incompetent-type-radio-option-1"]', - ).click(); - }); - describe('Domestic', () => { + describe('Guardian', () => { beforeEach(() => { - cy.get('[data-testid="domestic-country-btn"]').click(); + cy.get( + '[data-testid="minor-incompetent-type-radio-option-1"]', + ).click(); }); - it('should display a validation error message when form is empty', () => { - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); + describe('Domestic', () => { + beforeEach(() => { + cy.get('[data-testid="domestic-country-btn"]').click(); }); - - cy.get('[data-testid="step-1-next-button"]').click(); - - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); + it('should display a validation error message when form is empty', () => { + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); }); }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - }); - describe('International', () => { - beforeEach(() => { - cy.get('[data-testid="international-country-btn"]').click(); - }); + describe('International', () => { + beforeEach(() => { + cy.get('[data-testid="international-country-btn"]').click(); + }); - it('should display a validation error message when form is empty', () => { - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }, - ); + it('should display a validation error message when form is empty', () => { + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); - cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-1-next-button"]').click(); - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }, - ); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); }); - }); - describe('Custodian', () => { - beforeEach(() => { - cy.get( - '[data-testid="minor-incompetent-type-radio-option-2"]', - ).click(); - }); - describe('Domestic', () => { + describe('Custodian', () => { beforeEach(() => { - cy.get('[data-testid="domestic-country-btn"]').click(); + cy.get( + '[data-testid="minor-incompetent-type-radio-option-2"]', + ).click(); }); - it('should display a validation error message when form is empty', () => { - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); + describe('Domestic', () => { + beforeEach(() => { + cy.get('[data-testid="domestic-country-btn"]').click(); }); - - cy.get('[data-testid="step-1-next-button"]').click(); - - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); + it('should display a validation error message when form is empty', () => { + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); }); }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - }); - describe('International', () => { - beforeEach(() => { - cy.get('[data-testid="international-country-btn"]').click(); - }); - it('should display a validation error message when form is empty', () => { - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }, - ); - - cy.get('[data-testid="step-1-next-button"]').click(); - - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }, - ); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + describe('International', () => { + beforeEach(() => { + cy.get('[data-testid="international-country-btn"]').click(); + }); + it('should display a validation error message when form is empty', () => { + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); }); - }); - describe('Next friend for a minor (without a guardian, conservator, or other like fiduciary)', () => { - beforeEach(() => { - cy.get( - '[data-testid="minor-incompetent-type-radio-option-3"]', - ).click(); - }); - describe('Domestic', () => { + describe('Next friend for a minor (without a guardian, conservator, or other like fiduciary)', () => { beforeEach(() => { - cy.get('[data-testid="domestic-country-btn"]').click(); + cy.get( + '[data-testid="minor-incompetent-type-radio-option-3"]', + ).click(); }); - it('should display a validation error message when form is empty', () => { - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); + describe('Domestic', () => { + beforeEach(() => { + cy.get('[data-testid="domestic-country-btn"]').click(); }); - - cy.get('[data-testid="step-1-next-button"]').click(); - - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); + it('should display a validation error message when form is empty', () => { + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); }); }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - }); - describe('International', () => { - beforeEach(() => { - cy.get('[data-testid="international-country-btn"]').click(); - }); - it('should display a validation error message when form is empty', () => { - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }, - ); - - cy.get('[data-testid="step-1-next-button"]').click(); - - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }, - ); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + describe('International', () => { + beforeEach(() => { + cy.get('[data-testid="international-country-btn"]').click(); + }); + it('should display a validation error message when form is empty', () => { + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); }); - }); - describe('Next friend for a legally incompetent person (without a guardian, conservator, or other like fiduciary)', () => { - beforeEach(() => { - cy.get( - '[data-testid="minor-incompetent-type-radio-option-4"]', - ).click(); - }); - describe('Domestic', () => { + describe('Next friend for a legally incompetent person (without a guardian, conservator, or other like fiduciary)', () => { beforeEach(() => { - cy.get('[data-testid="domestic-country-btn"]').click(); + cy.get( + '[data-testid="minor-incompetent-type-radio-option-4"]', + ).click(); }); - it('should display a validation error message when form is empty', () => { - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); + describe('Domestic', () => { + beforeEach(() => { + cy.get('[data-testid="domestic-country-btn"]').click(); }); - - cy.get('[data-testid="step-1-next-button"]').click(); - - DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach((selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); + it('should display a validation error message when form is empty', () => { + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + DOMESTIC_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); }); }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - DOMESTIC_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - }); - describe('International', () => { - beforeEach(() => { - cy.get('[data-testid="international-country-btn"]').click(); - }); - it('should display a validation error message when form is empty', () => { - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('not.exist'); - }, - ); - - cy.get('[data-testid="step-1-next-button"]').click(); - - INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( - (selector: string) => { - cy.get(`[data-testid="${selector}"]`).should('exist'); - }, - ); - }); - it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } else if ('inputValue' in inputInfo) { - const { errorMessage, input, inputValue } = inputInfo; - textInput(errorMessage, input, inputValue); - } - }); - - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); - }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } else if ('inputValue' in inputInfo) { - const { input, inputValue } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`[data-testid="${input}"]`).type(inputValue); - } - }); - cy.get('[data-testid="step-1-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + describe('International', () => { + beforeEach(() => { + cy.get('[data-testid="international-country-btn"]').click(); + }); + it('should display a validation error message when form is empty', () => { + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('not.exist'); + }, + ); + + cy.get('[data-testid="step-1-next-button"]').click(); + + INTERNATIONAL_ERROR_MESSAGES_DATA_TEST_ID.forEach( + (selector: string) => { + cy.get(`[data-testid="${selector}"]`).should('exist'); + }, + ); + }); + it('should run live validation when user leaves input with an invalid response and remove validation message when the user fixes it', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } else if ('inputValue' in inputInfo) { + const { errorMessage, input, inputValue } = inputInfo; + textInput(errorMessage, input, inputValue); + } + }); + + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + INTERNATIONAL_FORM_INPUT_DATA.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } else if ('inputValue' in inputInfo) { + const { input, inputValue } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`[data-testid="${input}"]`).type(inputValue); + } + }); + cy.get('[data-testid="step-1-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-2-icon"]'); + }); }); }); }); }); }); + + describe('Practitioner', () => { + describe('Other Filing Options', () => { + it('should display other filing options', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + cy.get('[data-testid="filing-type-3"').click(); + + cy.get('[data-testid="other-type-radio-option-0"]').should( + 'have.text', + 'An estate or trust', + ); + cy.get('[data-testid="other-type-radio-option-1"]').should( + 'have.text', + 'Donor', + ); + cy.get('[data-testid="other-type-radio-option-2"]').should( + 'have.text', + 'Transferee', + ); + cy.get('[data-testid="other-type-radio-option-3"]').should( + 'have.text', + 'Deceased Spouse', + ); + }); + }); + }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-3.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-3.cy.ts index fbc6def9dfa..24f0ec296fb 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-3.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-3.cy.ts @@ -4,164 +4,205 @@ import { fillPetitionerInformation, selectInput, } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition - Step 3 IRS Notices', () => { const VALID_FILE = '../../helpers/file/sample.pdf'; - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); + describe('Petitioner', () => { + beforeEach(() => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); - fillPetitionerInformation(); - fillPetitionFileInformation(VALID_FILE); - }); + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + }); - it('should display all the possible options', () => { - const EXPECTED_HAS_IRS_NOTICE_OPTIONS: string[] = ['Yes', 'No']; + it('should display correct title', () => { + cy.get('[data-testid="has-irs-notice-legend"]').should( + 'have.text', + 'Did you receive a notice from the IRS?', + ); + }); - cy.get('[data-testid^="irs-notice-"]').should('have.length', 2); + it('should display all the possible options', () => { + const EXPECTED_HAS_IRS_NOTICE_OPTIONS: string[] = ['Yes', 'No']; - EXPECTED_HAS_IRS_NOTICE_OPTIONS.forEach((option: string) => { - cy.get(`[data-testid="irs-notice-${option}"]`).should('exist'); - }); - }); + cy.get('[data-testid^="irs-notice-"]').should('have.length', 2); - describe('Has IRS Notices', () => { - beforeEach(() => { - cy.get('[data-testid="irs-notice-Yes"]').click(); + EXPECTED_HAS_IRS_NOTICE_OPTIONS.forEach((option: string) => { + cy.get(`[data-testid="irs-notice-${option}"]`).should('exist'); + }); + }); - cy.get('[data-testid="step-3-next-button"]').should('exist'); - cy.get('[data-testid="step-3-next-button"]').should('not.be.disabled'); + describe('Has IRS Notices', () => { + beforeEach(() => { + cy.get('[data-testid="irs-notice-Yes"]').click(); - cy.get('[data-testid="irs-notice-upload-0"]').attachFile(VALID_FILE); - cy.get('[data-testid="step-3-next-button"]').should('exist'); - cy.get('[data-testid="step-3-next-button"]').should('be.disabled'); + cy.get('[data-testid="step-3-next-button"]').should('exist'); + cy.get('[data-testid="step-3-next-button"]').should('not.be.disabled'); - cy.get('[data-testid="redaction-acknowledgement-label"]').should('exist'); - cy.get('[data-testid="redaction-acknowledgement-label"]').click(); + cy.get('[data-testid="irs-notice-upload-0"]').attachFile(VALID_FILE); + cy.get('[data-testid="step-3-next-button"]').should('exist'); + cy.get('[data-testid="step-3-next-button"]').should('be.disabled'); - cy.get('[data-testid="step-3-next-button"]').should('not.be.disabled'); - }); + cy.get('[data-testid="redaction-acknowledgement-label"]').should( + 'exist', + ); + cy.get('[data-testid="redaction-acknowledgement-label"]').click(); - describe('VALIDATION MESSAGES', () => { - it('should display validation error messages when user clicks on "Next" button without selecting a case type', () => { - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="case-type-0-error-message"]').should('exist'); + cy.get('[data-testid="step-3-next-button"]').should('not.be.disabled'); }); - it('should do live validation when user leaves input with an invalid response and remove message when user fixes it', () => { - const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ - { - errorMessage: 'case-type-0-error-message', - input: 'case-type-select', - selectOption: 'Deficiency', - }, - ]; - - ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } + describe('VALIDATION MESSAGES', () => { + it('should display validation error messages when user clicks on "Next" button without selecting a case type', () => { + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="case-type-0-error-message"]').should('exist'); }); - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-4-icon"]'); - }); + it('should do live validation when user leaves input with an invalid response and remove message when user fixes it', () => { + const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ + { + errorMessage: 'case-type-0-error-message', + input: 'case-type-select', + selectOption: 'Deficiency', + }, + ]; + + ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } + }); + + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-4-icon"]'); + }); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ - { - errorMessage: 'case-type-0-error-message', - input: 'case-type-select', - selectOption: 'Deficiency', - }, - ]; - - ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } + it('should allow user to go to step 3 if everything is filled out correctly', () => { + const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ + { + errorMessage: 'case-type-0-error-message', + input: 'case-type-select', + selectOption: 'Deficiency', + }, + ]; + + ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } + }); + + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-4-icon"]'); }); - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-4-icon"]'); + it('should remove the "Add another IRS Notice" Button when there are 5 IRS Notice already', () => { + cy.get('[data-testid="add-another-irs-notice-button"]').should( + 'exist', + ); + cy.get('[data-testid="add-another-irs-notice-button"]').click(); + + cy.get('[data-testid="add-another-irs-notice-button"]').should( + 'exist', + ); + cy.get('[data-testid="add-another-irs-notice-button"]').click(); + + cy.get('[data-testid="add-another-irs-notice-button"]').should( + 'exist', + ); + cy.get('[data-testid="add-another-irs-notice-button"]').click(); + + cy.get('[data-testid="add-another-irs-notice-button"]').should( + 'exist', + ); + cy.get('[data-testid="add-another-irs-notice-button"]').click(); + + cy.get('[data-testid="add-another-irs-notice-button"]').should( + 'not.exist', + ); + }); }); + }); - it('should remove the "Add another IRS Notice" Button when there are 5 IRS Notice already', () => { - cy.get('[data-testid="add-another-irs-notice-button"]').should('exist'); - cy.get('[data-testid="add-another-irs-notice-button"]').click(); - - cy.get('[data-testid="add-another-irs-notice-button"]').should('exist'); - cy.get('[data-testid="add-another-irs-notice-button"]').click(); + describe('Does Not Have IRS Notices', () => { + beforeEach(() => { + cy.get('[data-testid="irs-notice-No"]').click(); + }); - cy.get('[data-testid="add-another-irs-notice-button"]').should('exist'); - cy.get('[data-testid="add-another-irs-notice-button"]').click(); + describe('VALIDATION MESSAGES', () => { + it('should display validation error messages when user clicks on "Next" button without selecting a case type', () => { + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="case-type-root-error-message"]').should( + 'exist', + ); + }); - cy.get('[data-testid="add-another-irs-notice-button"]').should('exist'); - cy.get('[data-testid="add-another-irs-notice-button"]').click(); + it('should do live validation when user leaves input with an invalid response and remove message when user fixes it', () => { + const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ + { + errorMessage: 'case-type-root-error-message', + input: 'case-type-select', + selectOption: 'Disclosure', + }, + ]; + + ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { errorMessage, input, selectOption } = inputInfo; + selectInput(errorMessage, input, selectOption); + } + }); + + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-4-icon"]'); + }); - cy.get('[data-testid="add-another-irs-notice-button"]').should( - 'not.exist', - ); + it('should allow user to go to step 3 if everything is filled out correctly', () => { + const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ + { + errorMessage: 'case-type-root-error-message', + input: 'case-type-select', + selectOption: 'Disclosure', + }, + ]; + + ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { + if ('selectOption' in inputInfo) { + const { input, selectOption } = inputInfo; + cy.get(`[data-testid="${input}"]`).scrollIntoView(); + cy.get(`select[data-testid="${input}"]`).select(selectOption); + } + }); + + cy.get('[data-testid="step-3-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-4-icon"]'); + }); }); }); }); - describe('Does Not Have IRS Notices', () => { + describe('Practitioner', () => { beforeEach(() => { - cy.get('[data-testid="irs-notice-No"]').click(); - }); - - describe('VALIDATION MESSAGES', () => { - it('should display validation error messages when user clicks on "Next" button without selecting a case type', () => { - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="case-type-root-error-message"]').should('exist'); - }); - - it('should do live validation when user leaves input with an invalid response and remove message when user fixes it', () => { - const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ - { - errorMessage: 'case-type-root-error-message', - input: 'case-type-select', - selectOption: 'Disclosure', - }, - ]; - - ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { errorMessage, input, selectOption } = inputInfo; - selectInput(errorMessage, input, selectOption); - } - }); - - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-4-icon"]'); - }); + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); - it('should allow user to go to step 3 if everything is filled out correctly', () => { - const ERROR_MESSAGES_DATA_TEST_ID: InputFillType[] = [ - { - errorMessage: 'case-type-root-error-message', - input: 'case-type-select', - selectOption: 'Disclosure', - }, - ]; - - ERROR_MESSAGES_DATA_TEST_ID.forEach(inputInfo => { - if ('selectOption' in inputInfo) { - const { input, selectOption } = inputInfo; - cy.get(`[data-testid="${input}"]`).scrollIntoView(); - cy.get(`select[data-testid="${input}"]`).select(selectOption); - } - }); + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + }); - cy.get('[data-testid="step-3-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-4-icon"]'); - }); + it('should display correct title', () => { + cy.get('[data-testid="has-irs-notice-legend"]').should( + 'have.text', + 'Did the petitioner receive a notice from the IRS?', + ); }); }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-4.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-4.cy.ts index 160ac08c5cc..68d94c000a0 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-4.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-4.cy.ts @@ -5,6 +5,7 @@ import { fillPetitionerInformation, selectInput, } from './petition-helper'; +import { PROCEDURE_TYPES_MAP } from '../../../../../shared/src/business/entities/EntityConstants'; import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition - Step 4 Case Procedure & Trial Location', () => { @@ -20,21 +21,20 @@ describe('File a petition - Step 4 Case Procedure & Trial Location', () => { }); it('should display all the possible options', () => { - const EXPECTED_CASE_PROCEDURES: string[] = ['Regular case', 'Small case']; cy.get('[data-testid^="procedure-type-"]').should('have.length', 2); - - EXPECTED_CASE_PROCEDURES.forEach((option: string, index: number) => { - cy.get(`[data-testid="procedure-type-${index}"]`).should('exist'); - cy.get(`[data-testid="procedure-type-${index}"]`).should( - 'have.text', - option, - ); - }); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).should('have.text', 'Regular case'); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.small}-radio"]`, + ).should('have.text', 'Small case'); }); describe('Regular case', () => { beforeEach(() => { - cy.get('[data-testid="procedure-type-0"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.regular}-radio"]`, + ).click(); }); it('should display validation error message when user presses "Next" button without selecting a trial location', () => { @@ -100,7 +100,9 @@ describe('File a petition - Step 4 Case Procedure & Trial Location', () => { describe('Small case', () => { beforeEach(() => { - cy.get('[data-testid="procedure-type-1"]').click(); + cy.get( + `[data-testid="procedure-type-${PROCEDURE_TYPES_MAP.small}-radio"]`, + ).click(); }); it('should display validation error message when user presses "Next" button without selecting a trial location', () => { diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-5.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-5.cy.ts index 2aee3a72d89..43a81746134 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-5.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-5.cy.ts @@ -4,32 +4,61 @@ import { fillPetitionFileInformation, fillPetitionerInformation, } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition - Step 5 Statement of Taxpayer Identification Number', () => { const VALID_FILE = '../../helpers/file/sample.pdf'; - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); + describe('Petitioner', () => { + beforeEach(() => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); - fillPetitionerInformation(); - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - }); + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + }); + + it('should display correct info text', () => { + cy.get('[data-testid="info-alert"]').contains('to help identify you'); + }); - it('should display validation error message when user presses "Next" button without uploading stin file', () => { - const ERROR_MESSAGE_DATA_TEST_ID = ['stin-file-error-message-0']; - cy.get(`[data-testid="${ERROR_MESSAGE_DATA_TEST_ID}"]`).should('not.exist'); - cy.get('[data-testid="step-5-next-button"]').click(); - cy.get(`[data-testid="${ERROR_MESSAGE_DATA_TEST_ID}"]`).should('exist'); + it('should display validation error message when user presses "Next" button without uploading stin file', () => { + const ERROR_MESSAGE_DATA_TEST_ID = ['stin-file-error-message-0']; + cy.get(`[data-testid="${ERROR_MESSAGE_DATA_TEST_ID}"]`).should( + 'not.exist', + ); + cy.get('[data-testid="step-5-next-button"]').click(); + cy.get(`[data-testid="${ERROR_MESSAGE_DATA_TEST_ID}"]`).should('exist'); + }); + + it('should allow user to go to step 6 if stin file is uploaded', () => { + cy.get('[data-testid="stin-file"]').attachFile(VALID_FILE); + + cy.get('[data-testid="step-5-next-button"]').click(); + cy.get('[data-testid="step-indicator-current-step-6-icon"]'); + }); }); - it('should allow user to go to step 6 if stin file is uploaded', () => { - cy.get('[data-testid="stin-file"]').attachFile(VALID_FILE); + describe('Practitioner', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + }); - cy.get('[data-testid="step-5-next-button"]').click(); - cy.get('[data-testid="step-indicator-current-step-6-icon"]'); + it('should display correct info text', () => { + cy.get('[data-testid="info-alert"]').contains( + 'to help identify the petitioner', + ); + }); }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-case-procedure-and-trial-location.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-case-procedure-and-trial-location.cy.ts index 870b78e6bf1..77ef403a96a 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-case-procedure-and-trial-location.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-case-procedure-and-trial-location.cy.ts @@ -1,3 +1,4 @@ +import { PROCEDURE_TYPES_MAP } from '../../../../../shared/src/business/entities/EntityConstants'; import { fillCaseProcedureInformation, fillIrsNoticeInformation, @@ -41,9 +42,12 @@ describe('File a petition - Step 6 Review & Submit Case', () => { }); it('should display Case Procedure and Trial Location information correctly for small case', () => { - fillCaseProcedureInformation('small'); + fillCaseProcedureInformation(PROCEDURE_TYPES_MAP.small); fillStinInformation(VALID_FILE); - cy.get('[data-testid="procedure-type"]').should('have.text', 'Small'); + cy.get('[data-testid="procedure-type"]').should( + 'have.text', + PROCEDURE_TYPES_MAP.small, + ); cy.get('[data-testid="trial-location"]').should( 'have.text', 'Birmingham, Alabama', diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-irs-notice.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-irs-notice.cy.ts index b9b1e538c8f..089ff4f64a9 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-irs-notice.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-irs-notice.cy.ts @@ -35,10 +35,32 @@ describe('File a petition - Step 6 Review & Submit Case', () => { fillIrsNoticeInformation(VALID_FILE); fillCaseProcedureInformation(); fillStinInformation(VALID_FILE); - cy.get('[data-testid="petition-preview-button"]').should( - 'have.text', - 'sample.pdf', - ); + cy.get(`[data-testid="irs-notice-info-${0}"]`).within(() => { + cy.contains('IRS notice 1').should('exist'); + cy.contains('Notice of Deficiency').should('exist'); + cy.get('[data-testid="atp-preview-button"]').should( + 'have.text', + 'sample.pdf', + ); + }); + cy.get(`[data-testid="irs-notice-info-${1}"]`).should('not.exist'); + }); + + it('should display IRS notice information for a disclosure case type', () => { + fillIrsNoticeInformation(VALID_FILE, 'Disclosure2'); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + cy.get(`[data-testid="irs-notice-info-${0}"]`).within(() => { + cy.contains('IRS notice 1').should('exist'); + cy.contains( + 'Notice - We Are Going To Make Your Determination Letter Available for Public Inspection', + ).should('exist'); + cy.get('[data-testid="atp-preview-button"]').should( + 'have.text', + 'sample.pdf', + ); + }); + cy.get(`[data-testid="irs-notice-info-${1}"]`).should('not.exist'); }); it('should display IRS notice information for multiple IRS notices', () => { fillMultipleIRSNotices(VALID_FILE); @@ -47,6 +69,7 @@ describe('File a petition - Step 6 Review & Submit Case', () => { cy.get(`[data-testid="irs-notice-info-${0}"]`).within(() => { cy.contains('IRS notice 1').should('exist'); + cy.contains('Notice of Deficiency').should('exist'); cy.contains('2024').should('exist'); cy.contains('05/02/24').should('exist'); cy.contains('Jackson, NJ').should('exist'); @@ -58,6 +81,9 @@ describe('File a petition - Step 6 Review & Submit Case', () => { cy.get(`[data-testid="irs-notice-info-${1}"]`).within(() => { cy.contains('IRS notice 2').should('exist'); + cy.contains( + 'Notice of Determination Concerning Collection Action', + ).should('exist'); cy.contains('2023').should('exist'); cy.contains('05/02/23').should('exist'); cy.contains('New York, NY').should('exist'); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself-and-spouse.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself-and-spouse.cy.ts index 5cd0815d532..97f66207a1f 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself-and-spouse.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself-and-spouse.cy.ts @@ -1,338 +1,370 @@ import { contactInfo, fillCaseProcedureInformation, + fillGeneratePetitionFileInformation, fillIrsNoticeInformation, fillPetitionFileInformation, + fillPetitionerAndSpouseInformation, fillPrimaryContact, fillSecondaryContact, fillSecondaryContactInternational, fillStinInformation, secondaryContactInfo, } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition - Step 6 Review & Submit Case', () => { const VALID_FILE = '../../helpers/file/sample.pdf'; - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - }); - - describe('Filing type: Myself and Spouse', () => { + describe('Petitioner', () => { beforeEach(() => { - cy.get('[data-testid="filing-type-1"]').click(); - fillPrimaryContact(); + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); }); - - it('should display petitioner information correctly for deceased spouse', () => { - cy.get('[data-testid="is-spouse-deceased-0"]').click(); - cy.get('[data-testid="contact-secondary-name"]').type( - secondaryContactInfo.name, - ); - - cy.get('[data-testid="contactSecondary-in-care-of"]').type( - secondaryContactInfo.inCareOf, - ); - - fillSecondaryContact(); - cy.get('[data-testid="step-1-next-button"]').click(); - - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.get('[data-testid="party-type"]').should( - 'have.text', - 'Petitioner & deceased spouse', - ); - - cy.get('[data-testid="contact-name"]') - .eq(0) - .invoke('text') - .then(value => value.trim()) - .should('equal', contactInfo.name); - - cy.get('[data-testid="contact-address-information"]') - .eq(0) - .should('contain.text', contactInfo.address1); - - cy.get('[data-testid="contact-address-information"]') - .eq(0) - .should('contain.text', contactInfo.city); - - cy.get('[data-testid="contact-address-information"]') - .eq(0) - .should('contain.text', contactInfo.state); - - cy.get('[data-testid="contact-address-information"]') - .eq(0) - .should('contain.text', contactInfo.postalCode); - - cy.get('[data-testid=place-of-legal-residence-label]').should( - 'have.text', - 'Place of legal residence:', - ); - - cy.get('[data-testid="primary-place-of-legal-residence"]').should( - 'have.text', - contactInfo.placeOfLegalResidenceLabel, - ); - - cy.get('[data-testid="contact-info-phone-number"]') - .eq(0) - .should('contain.text', contactInfo.phone); - - cy.get('[data-testid="contact-primary-email"]') - .eq(0) - .should('have.text', contactInfo.email); - - cy.get('[data-testid="contact-name"]') - .eq(1) - .invoke('text') - .then(value => value.trim()) - .should('equal', secondaryContactInfo.name); - - cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( - 'contain.text', - secondaryContactInfo.inCareOf, - ); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.address1); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.city); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.state); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.postalCode); - - cy.get('[data-testid="secondary-place-of-legal-residence"]').should( - 'have.text', - secondaryContactInfo.placeOfLegalResidenceLabel, - ); - - cy.get('[data-testid="contact-info-phone-number"]') - .eq(1) - .should('contain.text', secondaryContactInfo.phone); - - cy.get('[data-testid="contact-info-email"]').should( - 'have.text', - secondaryContactInfo.email, - ); - }); - - it('should display petitioner information correctly when user does not select use same address', () => { - cy.get('[data-testid="is-spouse-deceased-0"]').click(); - - cy.get('[data-testid="contact-secondary-name"]').type( - secondaryContactInfo.name, - ); - - cy.get('[data-testid="contactSecondary-in-care-of"]').type( - secondaryContactInfo.inCareOf, - ); - - fillSecondaryContact(false); - - cy.get('[data-testid="step-1-next-button"]').click(); - - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.get('[data-testid="party-type"]').should( - 'have.text', - 'Petitioner & deceased spouse', - ); - - cy.get('[data-testid="contact-name"]') - .eq(1) - .invoke('text') - .then(value => value.trim()) - .should('equal', secondaryContactInfo.name); - - cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( - 'contain.text', - secondaryContactInfo.inCareOf, - ); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.address1); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.city); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.state); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.postalCode); - - cy.get('[data-testid="secondary-place-of-legal-residence"]').should( - 'have.text', - secondaryContactInfo.placeOfLegalResidenceLabel, - ); - - cy.get('[data-testid="contact-info-phone-number"]') - .eq(1) - .should('contain.text', secondaryContactInfo.phone); - - cy.get('[data-testid="contact-info-email"]').should( - 'have.text', - secondaryContactInfo.email, - ); + describe('Filing type: Myself and Spouse', () => { + beforeEach(() => { + cy.get('[data-testid="filing-type-1"]').click(); + fillPrimaryContact(); + }); + + it('should display petitioner information correctly for deceased spouse', () => { + cy.get('[data-testid="is-spouse-deceased-0"]').click(); + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + + cy.get('[data-testid="contactSecondary-in-care-of"]').type( + secondaryContactInfo.inCareOf, + ); + + fillSecondaryContact(); + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should( + 'have.text', + 'Petitioner & deceased spouse', + ); + + cy.get('[data-testid="contact-name"]') + .eq(0) + .invoke('text') + .then(value => value.trim()) + .should('equal', contactInfo.name); + + cy.get('[data-testid="contact-address-information"]') + .eq(0) + .should('contain.text', contactInfo.address1); + + cy.get('[data-testid="contact-address-information"]') + .eq(0) + .should('contain.text', contactInfo.city); + + cy.get('[data-testid="contact-address-information"]') + .eq(0) + .should('contain.text', contactInfo.state); + + cy.get('[data-testid="contact-address-information"]') + .eq(0) + .should('contain.text', contactInfo.postalCode); + + cy.get('[data-testid=place-of-legal-residence-label]').should( + 'have.text', + 'Place of legal residence:', + ); + + cy.get('[data-testid="primary-place-of-legal-residence"]').should( + 'have.text', + contactInfo.placeOfLegalResidenceLabel, + ); + + cy.get('[data-testid="contact-info-phone-number"]') + .eq(0) + .should('contain.text', contactInfo.phone); + + cy.get('[data-testid="contact-primary-email"]') + .eq(0) + .should('contain.text', contactInfo.email); + + cy.get('[data-testid="contact-name"]') + .eq(1) + .invoke('text') + .then(value => value.trim()) + .should('equal', secondaryContactInfo.name); + + cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( + 'contain.text', + secondaryContactInfo.inCareOf, + ); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.address1); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.city); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.state); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.postalCode); + + cy.get('[data-testid="secondary-place-of-legal-residence"]').should( + 'have.text', + secondaryContactInfo.placeOfLegalResidenceLabel, + ); + + cy.get('[data-testid="contact-info-phone-number"]') + .eq(1) + .should('contain.text', secondaryContactInfo.phone); + + cy.get('[data-testid="contact-info-email"]').should( + 'contain.text', + secondaryContactInfo.email, + ); + + cy.get('[data-testid="register-for-e-filing"]').should('exist'); + }); + + it('should display petitioner information correctly when user does not select use same address', () => { + cy.get('[data-testid="is-spouse-deceased-0"]').click(); + + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + + cy.get('[data-testid="contactSecondary-in-care-of"]').type( + secondaryContactInfo.inCareOf, + ); + + fillSecondaryContact(false); + + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should( + 'have.text', + 'Petitioner & deceased spouse', + ); + + cy.get('[data-testid="contact-name"]') + .eq(1) + .invoke('text') + .then(value => value.trim()) + .should('equal', secondaryContactInfo.name); + + cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( + 'contain.text', + secondaryContactInfo.inCareOf, + ); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.address1); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.city); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.state); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.postalCode); + + cy.get('[data-testid="secondary-place-of-legal-residence"]').should( + 'have.text', + secondaryContactInfo.placeOfLegalResidenceLabel, + ); + + cy.get('[data-testid="contact-info-phone-number"]') + .eq(1) + .should('contain.text', secondaryContactInfo.phone); + + cy.get('[data-testid="contact-info-email"]').should( + 'contain.text', + secondaryContactInfo.email, + ); + }); + + it('should display petitioner information correctly for spouse', () => { + cy.get('[data-testid="is-spouse-deceased-1"]').click(); + cy.get('[data-testid="have-spouse-consent-label"]').click(); + + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + fillSecondaryContact(); + + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should( + 'have.text', + 'Petitioner & spouse', + ); + + cy.get('[data-testid="contact-name"]') + .eq(1) + .invoke('text') + .then(value => value.trim()) + .should('equal', secondaryContactInfo.name); + + cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( + 'not.exist', + ); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.address1); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.city); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.state); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', contactInfo.postalCode); + + cy.get('[data-testid="secondary-place-of-legal-residence"]').should( + 'have.text', + secondaryContactInfo.placeOfLegalResidenceLabel, + ); + + cy.get('[data-testid="contact-info-phone-number"]') + .eq(1) + .should('contain.text', secondaryContactInfo.phone); + + cy.get('[data-testid="contact-info-email"]').should( + 'contain.text', + secondaryContactInfo.email, + ); + }); + + it('should display petitioner information correctly for spouse with an international address and not display legal place of residence if user does not select one', () => { + cy.get('[data-testid="is-spouse-deceased-1"]').click(); + cy.get('[data-testid="have-spouse-consent-label"]').click(); + + cy.get('[data-testid="contact-secondary-name"]').type( + secondaryContactInfo.name, + ); + + fillSecondaryContactInternational(); + + cy.get('[data-testid="contact-secondary-phone"]').type( + secondaryContactInfo.phone, + ); + cy.get('[data-testid="contact-secondary-email"]').type( + secondaryContactInfo.email, + ); + cy.get( + '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', + ).click(); + + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should( + 'have.text', + 'Petitioner & spouse', + ); + + cy.get('[data-testid="contact-name"]') + .eq(1) + .invoke('text') + .then(value => value.trim()) + .should('equal', secondaryContactInfo.name); + + cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( + 'not.exist', + ); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.address1); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.city); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.internationalState); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.internationalPostalCode); + + cy.get('[data-testid="contact-address-information"]') + .eq(1) + .should('contain.text', secondaryContactInfo.country); + + cy.get('[data-testid="secondary-place-of-legal-residence"]').should( + 'not.exist', + ); + + cy.get('[data-testid="contact-info-phone-number"]') + .eq(1) + .should('contain.text', secondaryContactInfo.phone); + + cy.get('[data-testid="contact-info-email"]').should( + 'contain.text', + secondaryContactInfo.email, + ); + }); }); + }); - it('should display petitioner information correctly for spouse', () => { - cy.get('[data-testid="is-spouse-deceased-1"]').click(); - cy.get('[data-testid="have-spouse-consent-label"]').click(); - - cy.get('[data-testid="contact-secondary-name"]').type( - secondaryContactInfo.name, - ); - fillSecondaryContact(); - - cy.get('[data-testid="step-1-next-button"]').click(); - - fillPetitionFileInformation(VALID_FILE); + describe('Practitioner', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerAndSpouseInformation(); + fillGeneratePetitionFileInformation(); fillIrsNoticeInformation(VALID_FILE); fillCaseProcedureInformation(); fillStinInformation(VALID_FILE); - - cy.get('[data-testid="party-type"]').should( - 'have.text', - 'Petitioner & spouse', - ); - - cy.get('[data-testid="contact-name"]') - .eq(1) - .invoke('text') - .then(value => value.trim()) - .should('equal', secondaryContactInfo.name); - - cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( - 'not.exist', - ); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.address1); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.city); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.state); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', contactInfo.postalCode); - - cy.get('[data-testid="secondary-place-of-legal-residence"]').should( - 'have.text', - secondaryContactInfo.placeOfLegalResidenceLabel, - ); - - cy.get('[data-testid="contact-info-phone-number"]') - .eq(1) - .should('contain.text', secondaryContactInfo.phone); - - cy.get('[data-testid="contact-info-email"]').should( - 'have.text', - secondaryContactInfo.email, - ); }); - - it('should display petitioner information correctly for spouse with an international address and not display legal place of residence if user does not select one', () => { - cy.get('[data-testid="is-spouse-deceased-1"]').click(); - cy.get('[data-testid="have-spouse-consent-label"]').click(); - - cy.get('[data-testid="contact-secondary-name"]').type( - secondaryContactInfo.name, - ); - - fillSecondaryContactInternational(); - - cy.get('[data-testid="contact-secondary-phone"]').type( - secondaryContactInfo.phone, - ); - cy.get('[data-testid="contact-secondary-email"]').type( - secondaryContactInfo.email, - ); - cy.get( - '[data-testid="register-email-address-provided-above-for-electronic-filing-and-service-label"]', - ).click(); - - cy.get('[data-testid="step-1-next-button"]').click(); - - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.get('[data-testid="party-type"]').should( - 'have.text', - 'Petitioner & spouse', - ); - - cy.get('[data-testid="contact-name"]') - .eq(1) - .invoke('text') - .then(value => value.trim()) - .should('equal', secondaryContactInfo.name); - - cy.get('[data-testid="contact-in-care-of-secondary-name"]').should( - 'not.exist', - ); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.address1); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.city); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.internationalState); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.internationalPostalCode); - - cy.get('[data-testid="contact-address-information"]') - .eq(1) - .should('contain.text', secondaryContactInfo.country); - - cy.get('[data-testid="secondary-place-of-legal-residence"]').should( - 'not.exist', - ); - - cy.get('[data-testid="contact-info-phone-number"]') - .eq(1) - .should('contain.text', secondaryContactInfo.phone); - - cy.get('[data-testid="contact-info-email"]').should( - 'have.text', - secondaryContactInfo.email, - ); + describe('Filing type: Myself and Spouse', () => { + it('should not display email information for spouse', () => { + cy.get('[data-testid="contact-info-email"]') + .eq(0) + .should('contain.text', 'privatePractitioner1@example.com'); + cy.get('[data-testid="service-email-label"]').should('not.exist'); + cy.get('[data-testid="contact-info-email"]') + .eq(1) + .should('contain.text', 'Email not provided'); + cy.get('[data-testid="register-for-e-filing"]').should('not.exist'); + }); }); }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself.cy.ts index 87da434390a..3981b84ac44 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-a-petition-step-6-petitioner-info-myself.cy.ts @@ -1,6 +1,7 @@ import { contactInfo, fillCaseProcedureInformation, + fillGeneratePetitionFileInformation, fillIrsNoticeInformation, fillPetitionFileInformation, fillPetitionerInformation, @@ -8,147 +9,207 @@ import { fillPrimaryContactInternational, fillStinInformation, } from './petition-helper'; -import { loginAsPetitioner } from '../../../../helpers/authentication/login-as-helpers'; +import { + loginAsPetitioner, + loginAsPrivatePractitioner, +} from '../../../../helpers/authentication/login-as-helpers'; describe('File a petition - Step 6 Review & Submit Case', () => { const VALID_FILE = '../../helpers/file/sample.pdf'; - beforeEach(() => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - }); + describe('Petitioner', () => { + beforeEach(() => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + }); - describe('Edit step 1', () => { - it('should navigate to petition flow step 1 when user clicks on edit button', () => { - fillPetitionerInformation(); - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - cy.get('[data-testid="edit-petition-section-button-1"]').click(); - cy.get('[data-testid="step-indicator-current-step-1-icon"]').should( - 'be.visible', - ); + describe('Edit step 1', () => { + it('should navigate to petition flow step 1 when user clicks on edit button', () => { + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + cy.get('[data-testid="edit-petition-section-button-1"]').click(); + cy.get('[data-testid="step-indicator-current-step-1-icon"]').should( + 'be.visible', + ); + }); }); - }); - describe('Filing type: Myself', () => { - it('should display petitioner information correctly', () => { - cy.get('[data-testid="filing-type-0"]').click(); - fillPrimaryContact(); - cy.get('[data-testid="step-1-next-button"]').click(); + describe('Filing type: Myself', () => { + it('should display petitioner information correctly', () => { + cy.get('[data-testid="filing-type-0"]').click(); + fillPrimaryContact(); + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should('have.text', 'Petitioner'); + + cy.get('[data-testid="contact-name"]') + .invoke('text') + .then(value => value.trim()) + .should('equal', contactInfo.name); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.address1, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.city, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.state, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.postalCode, + ); + + cy.get('[data-testid=place-of-legal-residence-label]').should( + 'have.text', + 'Place of legal residence:', + ); + + cy.get('[data-testid="primary-place-of-legal-residence"]').should( + 'have.text', + contactInfo.placeOfLegalResidenceLabel, + ); + + cy.get('[data-testid="contact-info-phone-number"]').should( + 'contain.text', + contactInfo.phone, + ); + + cy.get('[data-testid="contact-primary-email"]').should( + 'have.text', + contactInfo.email, + ); + }); + + it('should display petitioner information correctly for international address and should not show legal place of residence if user did not select one', () => { + cy.get('[data-testid="filing-type-0"]').click(); + cy.get('[data-testid="contact-primary-name"]').type(contactInfo.name); + fillPrimaryContactInternational(); + cy.get('[data-testid="step-1-next-button"]').click(); + + cy.get('[data-testid="contact-primary-phone"]').type(contactInfo.phone); + cy.get('[data-testid="step-1-next-button"]').click(); + + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.get('[data-testid="party-type"]').should('have.text', 'Petitioner'); + + cy.get('[data-testid="contact-name"]') + .invoke('text') + .then(value => value.trim()) + .should('equal', contactInfo.name); + + cy.get('[data-testid="address1-line"]').should( + 'have.text', + contactInfo.address1, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.city, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.internationalState, + ); + + cy.get('[data-testid="contact-address-information"]').should( + 'contain.text', + contactInfo.internationalPostalCode, + ); + + cy.get('[data-testid="contact-country-line"]').should( + 'have.text', + contactInfo.country, + ); + + cy.get('[data-testid=place-of-legal-residence-label]').should( + 'not.exist', + ); + + cy.get('[data-testid="primary-place-of-legal-residence"]').should( + 'not.exist', + ); + + cy.get('[data-testid="contact-primary-email"]').should( + 'have.text', + contactInfo.email, + ); + }); + + it('should not show counsel contact information when user generates petition file', () => { + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + cy.get('[data-testid="petition-review-counsel-information"]').should( + 'not.exist', + ); + }); + + it('should not show counsel contact information when user uploads petitions file', () => { + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + cy.get('[data-testid="petition-review-counsel-information"]').should( + 'not.exist', + ); + }); + }); + }); - fillPetitionFileInformation(VALID_FILE); + describe('Practitioner', () => { + beforeEach(() => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + }); + it('should show counsel contact information when user generated the petition', () => { + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); fillIrsNoticeInformation(VALID_FILE); fillCaseProcedureInformation(); fillStinInformation(VALID_FILE); - cy.get('[data-testid="party-type"]').should('have.text', 'Petitioner'); - - cy.get('[data-testid="contact-name"]') - .invoke('text') - .then(value => value.trim()) - .should('equal', contactInfo.name); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.address1, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.city, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.state, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.postalCode, - ); - - cy.get('[data-testid=place-of-legal-residence-label]').should( - 'have.text', - 'Place of legal residence:', + cy.get('[data-testid="petition-review-counsel-information"]').contains( + 'Counsel’s Contact Information', ); - cy.get('[data-testid="primary-place-of-legal-residence"]').should( - 'have.text', - contactInfo.placeOfLegalResidenceLabel, - ); - - cy.get('[data-testid="contact-info-phone-number"]').should( - 'contain.text', - contactInfo.phone, - ); - - cy.get('[data-testid="contact-primary-email"]').should( - 'have.text', - contactInfo.email, + cy.get('[data-testid="info-alert"]').contains( + 'The Petition will not be created with the Court until the Submit Documents & Create Case button is clicked.', ); }); - it('should display petitioner information correctly for international address and should not show legal place of residence if user did not select one', () => { - cy.get('[data-testid="filing-type-0"]').click(); - cy.get('[data-testid="contact-primary-name"]').type(contactInfo.name); - fillPrimaryContactInternational(); - cy.get('[data-testid="step-1-next-button"]').click(); - - cy.get('[data-testid="contact-primary-phone"]').type(contactInfo.phone); - cy.get('[data-testid="step-1-next-button"]').click(); - + it('should not show counsel contact information when user uploaded petition', () => { + fillPetitionerInformation(); fillPetitionFileInformation(VALID_FILE); fillIrsNoticeInformation(VALID_FILE); fillCaseProcedureInformation(); fillStinInformation(VALID_FILE); - - cy.get('[data-testid="party-type"]').should('have.text', 'Petitioner'); - - cy.get('[data-testid="contact-name"]') - .invoke('text') - .then(value => value.trim()) - .should('equal', contactInfo.name); - - cy.get('[data-testid="address1-line"]').should( - 'have.text', - contactInfo.address1, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.city, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.internationalState, - ); - - cy.get('[data-testid="contact-address-information"]').should( - 'contain.text', - contactInfo.internationalPostalCode, - ); - - cy.get('[data-testid="contact-country-line"]').should( - 'have.text', - contactInfo.country, - ); - - cy.get('[data-testid=place-of-legal-residence-label]').should( - 'not.exist', - ); - - cy.get('[data-testid="primary-place-of-legal-residence"]').should( + cy.get('[data-testid="petition-review-counsel-information"]').should( 'not.exist', ); - - cy.get('[data-testid="contact-primary-email"]').should( - 'have.text', - contactInfo.email, - ); }); }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-an-electronic-petition.cy.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-an-electronic-petition.cy.ts index ebbe2efea15..61f39409f3a 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/file-an-electronic-petition.cy.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/file-an-electronic-petition.cy.ts @@ -10,152 +10,301 @@ import { import { loginAsPetitioner, loginAsPetitionsClerk, + loginAsPrivatePractitioner, } from '../../../../helpers/authentication/login-as-helpers'; describe('File an Electronic Petition', () => { const VALID_FILE = '../../helpers/file/sample.pdf'; - it('should allow Petitions Clerk to serve an electronic generated petition', () => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - fillPetitionerInformation(); - fillGeneratePetitionFileInformation(); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.intercept('POST', '**/cases').as('postCase'); - - cy.get('[data-testid="step-6-next-button"]').click(); - - cy.wait('@postCase').then(({ response }) => { - if (!response) throw Error('Did not find resposne'); - expect(response.body).to.have.property('docketNumber'); - const createdDocketNumber = response.body.docketNumber; - - loginAsPetitionsClerk(); - cy.get('[data-testid="docket-number-search-input"]').type( - createdDocketNumber, - ); - cy.get('[data-testid="search-docket-number"]').click(); - cy.get('[data-testid="document-viewer-link-P"]').click(); - cy.get('[data-testid="review-and-serve-petition"]').click(); - cy.get('[data-testid="tab-irs-notice"]').click(); - cy.get('[data-testid="has-irs-verified-notice-no"]').click(); - cy.get('[data-testid="submit-case"]').click(); - cy.get('[data-testid="serve-case-to-irs"]').click(); - cy.get('[data-testid="modal-confirm"]').click(); - cy.get('[data-testid="success-alert"]').contains( - 'Petition served to IRS.', - ); + describe('Petitioner generates a petition', () => { + it('should allow Petitions Clerk to serve an electronic generated petition', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); }); - }); - it('should allow Petitions Clerk to serve an electronic uploaded petition', () => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - fillPetitionerInformation(); - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.intercept('POST', '**/cases').as('postCase'); - - cy.get('[data-testid="step-6-next-button"]').click(); - - cy.wait('@postCase').then(({ response }) => { - if (!response) throw Error('Did not find resposne'); - expect(response.body).to.have.property('docketNumber'); - const createdDocketNumber = response.body.docketNumber; - - loginAsPetitionsClerk(); - cy.get('[data-testid="docket-number-search-input"]').type( - createdDocketNumber, - ); - cy.get('[data-testid="search-docket-number"]').click(); - cy.get('[data-testid="document-viewer-link-P"]').click(); - cy.get('[data-testid="review-and-serve-petition"]').click(); - cy.get('[data-testid="tab-irs-notice"]').click(); - cy.get('[data-testid="has-irs-verified-notice-no"]').click(); - cy.get('[data-testid="submit-case"]').click(); - cy.get('[data-testid="serve-case-to-irs"]').click(); - cy.get('[data-testid="modal-confirm"]').click(); - cy.get('[data-testid="success-alert"]').contains( - 'Petition served to IRS.', - ); + it('should allow Petitions Clerk to serve an electronic uploaded petition', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); }); - }); - it('should allow Petitions Clerk to serve an electronic petition where secondary contact does not have a phone number filled out', () => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - fillPetitionerAndSpouseInformation(); - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.intercept('POST', '**/cases').as('postCase'); - - cy.get('[data-testid="step-6-next-button"]').click(); - - cy.wait('@postCase').then(({ response }) => { - if (!response) throw Error('Did not find resposne'); - expect(response.body).to.have.property('docketNumber'); - const createdDocketNumber = response.body.docketNumber; - - loginAsPetitionsClerk(); - cy.get('[data-testid="docket-number-search-input"]').type( - createdDocketNumber, - ); - cy.get('[data-testid="search-docket-number"]').click(); - cy.get('[data-testid="document-viewer-link-P"]').click(); - cy.get('[data-testid="review-and-serve-petition"]').click(); - cy.get('[data-testid="tab-irs-notice"]').click(); - cy.get('[data-testid="has-irs-verified-notice-no"]').click(); - cy.get('[data-testid="submit-case"]').click(); - cy.get('[data-testid="serve-case-to-irs"]').click(); - cy.get('[data-testid="modal-confirm"]').click(); - cy.get('[data-testid="success-alert"]').contains( - 'Petition served to IRS.', - ); + it('should allow Petitions Clerk to serve an electronic petition where secondary contact does not have a phone number filled out', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerAndSpouseInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); + }); + + it('should allow Petitions Clerk to serve an electronic petition where secondary contact does have a phone number filled out', () => { + loginAsPetitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerAndSpouseInformation(true); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); }); }); - it('should allow Petitions Clerk to serve an electronic petition where secondary contact does have a phone number filled out', () => { - loginAsPetitioner(); - cy.visit('/file-a-petition/new'); - fillPetitionerAndSpouseInformation(true); - fillPetitionFileInformation(VALID_FILE); - fillIrsNoticeInformation(VALID_FILE); - fillCaseProcedureInformation(); - fillStinInformation(VALID_FILE); - - cy.intercept('POST', '**/cases').as('postCase'); - - cy.get('[data-testid="step-6-next-button"]').click(); - - cy.wait('@postCase').then(({ response }) => { - if (!response) throw Error('Did not find resposne'); - expect(response.body).to.have.property('docketNumber'); - const createdDocketNumber = response.body.docketNumber; - - loginAsPetitionsClerk(); - cy.get('[data-testid="docket-number-search-input"]').type( - createdDocketNumber, - ); - cy.get('[data-testid="search-docket-number"]').click(); - cy.get('[data-testid="document-viewer-link-P"]').click(); - cy.get('[data-testid="review-and-serve-petition"]').click(); - cy.get('[data-testid="tab-irs-notice"]').click(); - cy.get('[data-testid="has-irs-verified-notice-no"]').click(); - cy.get('[data-testid="submit-case"]').click(); - cy.get('[data-testid="serve-case-to-irs"]').click(); - cy.get('[data-testid="modal-confirm"]').click(); - cy.get('[data-testid="success-alert"]').contains( - 'Petition served to IRS.', - ); + describe('Private practitioner generates a petition', () => { + it('should allow Petitions Clerk to serve an electronic generated petition', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillGeneratePetitionFileInformation(); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); + }); + + it('should allow Petitions Clerk to serve an electronic uploaded petition', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); + }); + + it('should allow Petitions Clerk to serve an electronic petition where secondary contact does not have a phone number filled out', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerAndSpouseInformation(); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); + }); + + it('should allow Petitions Clerk to serve an electronic petition where secondary contact does have a phone number filled out', () => { + loginAsPrivatePractitioner(); + cy.visit('/file-a-petition/new'); + fillPetitionerAndSpouseInformation(true); + fillPetitionFileInformation(VALID_FILE); + fillIrsNoticeInformation(VALID_FILE); + fillCaseProcedureInformation(); + fillStinInformation(VALID_FILE); + + cy.intercept('POST', '**/cases').as('postCase'); + + cy.get('[data-testid="step-6-next-button"]').click(); + + cy.wait('@postCase').then(({ response }) => { + if (!response) throw Error('Did not find resposne'); + expect(response.body).to.have.property('docketNumber'); + const createdDocketNumber = response.body.docketNumber; + + loginAsPetitionsClerk(); + cy.get('[data-testid="docket-number-search-input"]').type( + createdDocketNumber, + ); + cy.get('[data-testid="search-docket-number"]').click(); + cy.get('[data-testid="document-viewer-link-P"]').click(); + cy.get('[data-testid="review-and-serve-petition"]').click(); + cy.get('[data-testid="tab-irs-notice"]').click(); + cy.get('[data-testid="has-irs-verified-notice-no"]').click(); + cy.get('[data-testid="submit-case"]').click(); + cy.get('[data-testid="serve-case-to-irs"]').click(); + cy.get('[data-testid="modal-confirm"]').click(); + cy.get('[data-testid="success-alert"]').contains( + 'Petition served to IRS.', + ); + }); }); }); }); diff --git a/cypress/local-only/tests/integration/fileAPetitionUpdated/petition-helper.ts b/cypress/local-only/tests/integration/fileAPetitionUpdated/petition-helper.ts index 1c087953b8b..da472a93f7a 100644 --- a/cypress/local-only/tests/integration/fileAPetitionUpdated/petition-helper.ts +++ b/cypress/local-only/tests/integration/fileAPetitionUpdated/petition-helper.ts @@ -1,3 +1,5 @@ +import { ProcedureType } from '../../../../../shared/src/business/entities/EntityConstants'; + type TextFillType = { errorMessage: string; input: string; @@ -148,10 +150,19 @@ export function fillPetitionerInformation() { export function fillIrsNoticeInformation( filePath: string, caseType: string = 'Deficiency', + hasIrsNotice: boolean = true, ) { + if (!hasIrsNotice) { + cy.get('[data-testid="irs-notice-No"]').click(); + cy.get('[data-testid="case-type-select"]').select(caseType); + cy.get('[data-testid="step-3-next-button"]').click(); + return; + } cy.get('[data-testid="irs-notice-Yes"]').click(); cy.get('[data-testid="irs-notice-upload-0"]').attachFile(filePath); cy.get('[data-testid="case-type-select"]').select(caseType); + cy.get('[data-testid="irs-notice-tax-year-0"]').type('2024'); + cy.get('[data-testid="city-and-state-issuing-office-0"]').type('Jackson, NJ'); cy.get('[data-testid="redaction-acknowledgement-label"]').click(); cy.get('[data-testid="step-3-next-button"]').click(); } @@ -196,13 +207,10 @@ export function fillMultipleIRSNotices(filePath: string) { cy.get('[data-testid="step-3-next-button"]').click(); } -export function fillCaseProcedureInformation(procedureType = 'regular') { - if (procedureType === 'regular') { - cy.get('[data-testid="procedure-type-0"]').click(); - } - if (procedureType === 'small') { - cy.get('[data-testid="procedure-type-1"]').click(); - } +export function fillCaseProcedureInformation( + procedureType: ProcedureType = 'Regular', +) { + cy.get(`[data-testid="procedure-type-${procedureType}-radio"]`).click(); cy.get('[data-testid="preferred-trial-city"]').select('Birmingham, Alabama'); cy.get('[data-testid="step-4-next-button"]').click(); } diff --git a/cypress/local-only/tests/integration/trialSession/petitions-clerk-verify-chamber-phone-auto-fills.cy.ts b/cypress/local-only/tests/integration/trialSession/petitions-clerk-verify-chamber-phone-auto-fills.cy.ts index dfa45681bd7..7ab77e11076 100644 --- a/cypress/local-only/tests/integration/trialSession/petitions-clerk-verify-chamber-phone-auto-fills.cy.ts +++ b/cypress/local-only/tests/integration/trialSession/petitions-clerk-verify-chamber-phone-auto-fills.cy.ts @@ -5,7 +5,7 @@ import { petitionsClerkCreatesTrialSession } from '../../../../helpers/trialSess faker.seed(faker.number.int()); describe('trial sessions', () => { - it('verify the auto fill functionality for chambers phone number works when selectin a judge', () => { + it('verify the auto fill functionality for chambers phone number works when selecting a judge', () => { loginAsPetitionsClerk1(); petitionsClerkCreatesTrialSession().then(trialSessionId => { cy.get('[data-testid=new-trial-sessions-tab]').click(); diff --git a/cypress/local-only/tests/integration/trialSession/trial-session-paper-pdf.cy.ts b/cypress/local-only/tests/integration/trialSession/trial-session-paper-pdf.cy.ts index 101b6d44a72..d8afc8d21b0 100644 --- a/cypress/local-only/tests/integration/trialSession/trial-session-paper-pdf.cy.ts +++ b/cypress/local-only/tests/integration/trialSession/trial-session-paper-pdf.cy.ts @@ -120,6 +120,10 @@ describe('Trial Session Paper Pdf', { scrollBehavior: 'center' }, () => { ); cy.visit(`/edit-trial-session/${createdTrialSessionId}`); cy.get('[data-testid="trial-session-judge"]').select('Colvin'); + cy.get('[data-testid="trial-session-judge"] option:selected').should( + 'have.text', + 'Colvin', + ); cy.get('[data-testid="submit-edit-trial-session"]').click(); cy.url().should('include', 'print-paper-trial-notices'); cy.get('[data-testid="printing-complete"]').click(); diff --git a/docs/operations/runbooks/add-or-update-judge-user.md b/docs/operations/runbooks/add-or-update-judge-user.md new file mode 100644 index 00000000000..d7e65e724b6 --- /dev/null +++ b/docs/operations/runbooks/add-or-update-judge-user.md @@ -0,0 +1,27 @@ +# Adding or Updating a Judge User + +## Description +This runbook describes the process of onboarding or updating a Judge user. DO NOT use this runbook to offboard a judge. Instead, see `offboard-judge-user.md`. + +## Preqrequisites +- `add-judge.ts`, `update-judge.ts` (see these scripts for usage details) +- Environment switcher config, `set-env.sh` +- AWS access (DynamoDB and Cognito) +- Standard development setup described in `running-locally.md` + +## Steps for Adding or Updating a Judge User +1. If you want the new judge (or updated judge information) to be available in deployed environments other than test/prod, you will need to add or update the judge information in `judge_users.csv`. (There are plenty of examples in the CSV to guide you.) Once deployed in the given environment, these changes will take effect. +2. If you want the new judge (or updated judge information) to be available locally and in CI, you will need to add or update the judge information in `efcms-local.json`. Look at the other judge users (you can search the file for `judgeFullName`) for guidance. +3. To update the test environment: Use the environment switcher and run `add-judge.ts` or `update-judge.ts` according to your needs, e.g.: +``` +source ./scripts/env/set-env.zsh ustc-test +npx ts-node --transpile-only ./scripts/user/add-judge.ts ... +``` +These scripts will add/update the appropriate user records in Cognito and Dynamo. +4. To update the production environment: If you have access to the production environment, run either `add-judge.ts` or `update-judge.ts` as above. If you do not have access, hand off to a USTC engineer, linking to this documentation. + +## Caveat +If you update the name of a judge, their chambers section will be updated as well. However, as of 4 September 2024, we do not have anything that prevents a stale edit from overwriting an update. In other words, the following is possible: +- An admin begins to update a chambers user +- The script to update the judge's name is run +- The admin finishes the updates to the chambers user (in principle up to 24 hours later), overwriting that user's newly updated chambers section diff --git a/docs/operations/runbooks/offboard-judge-user.md b/docs/operations/runbooks/offboard-judge-user.md index 9aaade6c153..76b2fcbd758 100644 --- a/docs/operations/runbooks/offboard-judge-user.md +++ b/docs/operations/runbooks/offboard-judge-user.md @@ -1,11 +1,11 @@ # Offboarding a Judge user ## Description -This runbook describes the process of offboarding a Judge user if they no longer work with the US Tax Court, for whatever reason. This will mark the Judge as a "legacy" Judge, meaning they won't be an available choice for assigment on any active work in DAWSON, but will still be available in places where legacy Judges should be, e.g. Order & Opinion searches. +This runbook describes the process of offboarding a Judge user if they no longer work with the US Tax Court, for whatever reason. This will mark the Judge as a "legacy" Judge, meaning they won't be an available choice for assignment on any active work in DAWSON, but will still be available in places where legacy Judges should be, e.g. Order & Opinion searches. -Since completing this runbook in its entirety requires access to USTC environments, this runbook includes a handoff to a USTC Engineer with the necessary priveleges to adminster USTC environments. +Since completing this runbook in its entirety requires access to USTC environments, this runbook includes a handoff to a USTC Engineer with the necessary privileges to administer USTC environments. -## Preqrequisites +## Prerequisites - `offboard-judge-user.sh` - Environment switcher config, `set-env.sh` - AWS access (DynamoDB and Cognito) @@ -13,29 +13,30 @@ Since completing this runbook in its entirety requires access to USTC environmen - The Judge being offboarded should not have any active cases / trials / etc. assigned to them. (Check with the PO for whether or not this has happened) ## Steps -1. In `judge_users.csv`, find the Judge to be offboared. Change their role from `judge` to `legacyJudge` and their section from `{judgeName}Chambers` to `legacyJudgeChambers`. For example: +### To Update the Judge User in Deployed Environments Other Than Test/Prod +1. In `judge_users.csv`, find the Judge to be offboarded. Change their role from `judge` to `legacyJudge` and their section from `{judgeName}Chambers` to `legacyJudgeChambers`. For example: ``` -Colvin,Judge,John O. Colvin,judge.colvin@example.com,judge,colvinsChambers,true +Colvin,Judge,John O. Colvin,judge.colvin@example.com,judge,colvinsChambers,true,(123) 123-1234 ``` becomes ``` -Colvin,Judge,John O. Colvin,judge.colvin@example.com,legacyJudge,legacyJudgesChambers,true +Colvin,Judge,John O. Colvin,judge.colvin@example.com,legacyJudge,legacyJudgesChambers,true,(123) 123-1234 ``` -2. Remove their chambers from the list of valid sections in `add-user.ts` -3. In `getJudgesChambers.ts`, add `isLegacy: process.env.USTC_ENV === 'prod',` to their chambers section. This marks their chambers section as legacy in deployed environments so that they no longer show up in select inputs for selecting a Judge's chambers. -4. Check for and fix any smoke tests that rely upon the Judge being offboarded or their chambers. This process leaves the Judge user active in environments relying on 'local' data (e.g. developer machines, CI pipeline), so other tests relying only on 'local' data should not be impacted. -5. Deploy the change. Deployment takes care of all offboarding in environments other than **test** and **prod** -6. Using the environment switcher, source `ustc-test` +2. Check for and fix any smoke tests that rely upon the Judge being offboarded or their chambers. This process leaves the Judge user active in environments relying on 'local' data (e.g. developer machines, CI pipeline), so other tests relying only on 'local' data should not be impacted. +3. Once you deploy to the environment, your changes will take effect. + +### To Update the Judge User in Test +1. Using the environment switcher, source `ustc-test` ``` source ./scripts/env/set-env.zsh ustc-test ``` -7. run `offboard-judge.sh`, passing in the user ID +2. Run `offboard-judge.sh`, passing in the user ID ``` ./scripts/user/offboard-judge-user.sh {judgeUserId} ``` -6. If you haven't already, open a PR against `staging` for this change. Apply the "Manual Deploy Step(s) Required" label and include a link to this documentation in the PR's description. -7. At this point, hand off to a USTC engineer. -8. Once this change is deployed to production, run `offboard-judge.sh` as above, but against production. + +### To Update the Judge User in Prod +If you have access to prod, run the same script as above, but against production. If you do not have access, hand off to a USTC engineer to do so. ## Additional Resources - The Judge's id can be retrieved like so: diff --git a/package-lock.json b/package-lock.json index bbaf6bdf89b..358877fe7b2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -857,13 +857,27 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-apigatewaymanagementapi": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-apigatewaymanagementapi/-/client-apigatewaymanagementapi-3.637.0.tgz", + "integrity": "sha512-MN3b4T4icjfCxNi9iPh3ERsKBzEu4ua3Hoj65MX7hVrnsaPebjZXGw7YAJPe/ugV4SKPyrGAyuno0LLaoFw55g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -904,19 +918,29 @@ }, "engines": { "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-apigatewayv2": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-apigatewayv2/-/client-apigatewayv2-3.637.0.tgz", + "integrity": "sha512-mnqulbdo5t8W9ScFzfsLL5RPE96iSHWB+eAoIllztu+oW1HrRY4w/HcKqEz+5hK4FS+CPaH08ZwCAxVkRJ9biA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -952,6 +976,7 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -959,56 +984,7 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-api-gateway/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -1020,10 +996,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi": { + "node_modules/@aws-sdk/client-cloudfront": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-apigatewaymanagementapi/-/client-apigatewaymanagementapi-3.637.0.tgz", - "integrity": "sha512-MN3b4T4icjfCxNi9iPh3ERsKBzEu4ua3Hoj65MX7hVrnsaPebjZXGw7YAJPe/ugV4SKPyrGAyuno0LLaoFw55g==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.637.0.tgz", + "integrity": "sha512-yuKqFTRlRHAA5mVds/ufO8n6ENcCFAW0D6nXldQcMOCXIuz1UQRE5qyEwajIdDGtFnyeZVf5fWRMx3ylWC7h0Q==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1040,6 +1016,7 @@ "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", + "@aws-sdk/xml-builder": "3.609.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", @@ -1064,20 +1041,36 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-cloudfront/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cloudwatch": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.637.0.tgz", + "integrity": "sha512-S6UcU3vCKOAUVLCXTabyUMWAr1e1kHn7Hcy6VZ4sxxu5hQqbSGiety3vrjmPTALlV5rmhu3N+hlRZt2TRXwDRg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1094,6 +1087,7 @@ "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-compression": "^3.0.7", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.15", @@ -1114,23 +1108,22 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-cloudwatch-logs": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.637.0.tgz", + "integrity": "sha512-JK9BgR3zHo/3VHSMO5ovDgk95TGEiY1DnlJ1AIPl/t6i87gZojurQFlbVuwzLDMZGoFfH0FuAJTW2+sH6nzh8A==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1144,6 +1137,9 @@ "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", + "@smithy/eventstream-serde-browser": "^3.0.6", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.5", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", @@ -1167,62 +1163,38 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@aws-sdk/client-apigatewaymanagementapi/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-cloudwatch/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -1234,10 +1206,11 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2": { + "node_modules/@aws-sdk/client-cognito-identity": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-apigatewayv2/-/client-apigatewayv2-3.637.0.tgz", - "integrity": "sha512-mnqulbdo5t8W9ScFzfsLL5RPE96iSHWB+eAoIllztu+oW1HrRY4w/HcKqEz+5hK4FS+CPaH08ZwCAxVkRJ9biA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.637.0.tgz", + "integrity": "sha512-391mca6yEfXVcSOTLGcxzlT0QCFfvoymLlVHfb//bzl806UUTq12cR2k+AnaCKLj+QSejmA7n6lwZWADm00Fvg==", + "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1278,7 +1251,6 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, @@ -1286,13 +1258,15 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-cognito-identity-provider": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.637.0.tgz", + "integrity": "sha512-udgyXL5ZQPTcXbzCq4plPxCEnYWGnC5+nWpCQAOcCACpA0rtQQ9OKabq/SiNO+6PVUMQFKRrZq6LS2p76mjl1w==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1333,21 +1307,45 @@ }, "engines": { "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dev": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-dynamodb": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.637.0.tgz", + "integrity": "sha512-zUneT0yLgJjC69yry2fgYVWkv68OeV3amWaDXHirA8yJgygyc7tBLo+sQmtHczmKt8dBD9bU3OWpbAbtpF9Esw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-endpoint-discovery": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", @@ -1382,62 +1380,78 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "node_modules/@aws-sdk/client-dynamodb-streams": { + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb-streams/-/client-dynamodb-streams-3.637.0.tgz", + "integrity": "sha512-WBh9Dn2Fm37SAFvWaa2or7NSuxNLJ62cFEVHX+SrKzJxhXSWYs24BoHW4XxMb6jiT0ka3GMctu//7Y1//MBU3A==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/types": "3.609.0", + "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", + "@smithy/node-http-handler": "^3.1.4", "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", + "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", + "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-apigatewayv2/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-dynamodb/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -1449,10 +1463,22 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront": { + "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@aws-sdk/client-glue": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudfront/-/client-cloudfront-3.637.0.tgz", - "integrity": "sha512-yuKqFTRlRHAA5mVds/ufO8n6ENcCFAW0D6nXldQcMOCXIuz1UQRE5qyEwajIdDGtFnyeZVf5fWRMx3ylWC7h0Q==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.637.0.tgz", + "integrity": "sha512-QhkixUI3eTittXRBv43qfh9hEjIPc1IoBmqKAzn8dSA2choX3XxpLvDLKbyv26yCq5QnZIiZ5SzOtr5pTJG/BA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1469,7 +1495,6 @@ "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", @@ -1494,22 +1519,35 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.637.0.tgz", + "integrity": "sha512-mo1gCm3yayuiFPCQkY5i5wbL6jjgCprpAfeMP5zFOcDsr7BqX9ijTrRzK+dx0SwiTdRKOW6zJaDiWA1UZgb60A==", + "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1546,23 +1584,35 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dev": true, + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-lambda": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.637.0.tgz", + "integrity": "sha512-XVQn4p/9XNMEImxCY97WlA83Q63HRrDhks4kby5YGG2fZckaNJxXE+/FFYsznse8hXKLUJ1/aI3hZSnXTthq5g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1576,6 +1626,9 @@ "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", + "@smithy/eventstream-serde-browser": "^3.0.6", + "@smithy/eventstream-serde-config-resolver": "^3.0.3", + "@smithy/eventstream-serde-node": "^3.0.5", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", @@ -1598,63 +1651,79 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", + "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", + "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-opensearch": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-opensearch/-/client-opensearch-3.637.0.tgz", + "integrity": "sha512-SLmKOVBxImEziHS60hRB1d/pNSJVr+FRSlRSSV5KIEXvWrtrmNAZGly3KnXjPuDUpCflWrpuKX7sm2c9//CANQ==", "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-logger": "3.609.0", + "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", + "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", "@aws-sdk/util-endpoints": "3.637.0", + "@aws-sdk/util-user-agent-browser": "3.609.0", + "@aws-sdk/util-user-agent-node": "3.614.0", + "@smithy/config-resolver": "^3.0.5", + "@smithy/core": "^2.4.0", + "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-node": "^3.0.3", + "@smithy/invalid-dependency": "^3.0.3", + "@smithy/middleware-content-length": "^3.0.5", + "@smithy/middleware-endpoint": "^3.1.0", + "@smithy/middleware-retry": "^3.0.15", + "@smithy/middleware-serde": "^3.0.3", + "@smithy/middleware-stack": "^3.0.3", + "@smithy/node-config-provider": "^3.1.4", + "@smithy/node-http-handler": "^3.1.4", "@smithy/protocol-http": "^4.1.0", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", + "@smithy/url-parser": "^3.0.3", + "@smithy/util-base64": "^3.0.0", + "@smithy/util-body-length-browser": "^3.0.0", + "@smithy/util-body-length-node": "^3.0.0", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", "@smithy/util-endpoints": "^2.0.5", + "@smithy/util-middleware": "^3.0.3", + "@smithy/util-retry": "^3.0.3", + "@smithy/util-utf8": "^3.0.0", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudfront/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-opensearch/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -1666,10 +1735,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch": { + "node_modules/@aws-sdk/client-route-53": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.637.0.tgz", - "integrity": "sha512-S6UcU3vCKOAUVLCXTabyUMWAr1e1kHn7Hcy6VZ4sxxu5hQqbSGiety3vrjmPTALlV5rmhu3N+hlRZt2TRXwDRg==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.637.0.tgz", + "integrity": "sha512-lF73WvWrCmfvmESx397G/GS8ecLIiB7PRy3Cpn1yl8V6LR3Hmuthgd7DbpN1YHtkEnwr0mVQUMy5c2IUD9D3kg==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1680,18 +1749,19 @@ "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-sdk-route53": "3.609.0", "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", + "@aws-sdk/xml-builder": "3.609.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-compression": "^3.0.7", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.15", @@ -1719,34 +1789,58 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs": { + "node_modules/@aws-sdk/client-route-53/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch-logs/-/client-cloudwatch-logs-3.637.0.tgz", - "integrity": "sha512-JK9BgR3zHo/3VHSMO5ovDgk95TGEiY1DnlJ1AIPl/t6i87gZojurQFlbVuwzLDMZGoFfH0FuAJTW2+sH6nzh8A==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz", + "integrity": "sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA==", "dependencies": { + "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", + "@aws-sdk/middleware-bucket-endpoint": "3.620.0", + "@aws-sdk/middleware-expect-continue": "3.620.0", + "@aws-sdk/middleware-flexible-checksums": "3.620.0", "@aws-sdk/middleware-host-header": "3.620.0", + "@aws-sdk/middleware-location-constraint": "3.609.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-sdk-s3": "3.635.0", + "@aws-sdk/middleware-ssec": "3.609.0", "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", + "@aws-sdk/signature-v4-multi-region": "3.635.0", "@aws-sdk/types": "3.609.0", "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", + "@aws-sdk/xml-builder": "3.609.0", "@smithy/config-resolver": "^3.0.5", "@smithy/core": "^2.4.0", "@smithy/eventstream-serde-browser": "^3.0.6", "@smithy/eventstream-serde-config-resolver": "^3.0.3", "@smithy/eventstream-serde-node": "^3.0.5", "@smithy/fetch-http-handler": "^3.2.4", + "@smithy/hash-blob-browser": "^3.1.2", "@smithy/hash-node": "^3.0.3", + "@smithy/hash-stream-node": "^3.1.2", "@smithy/invalid-dependency": "^3.0.3", + "@smithy/md5-js": "^3.0.3", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.15", @@ -1766,21 +1860,37 @@ "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", + "@smithy/util-stream": "^3.1.3", "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-secrets-manager": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.637.0.tgz", + "integrity": "sha512-4AEV+4yhaFYlnD90MbtOouqTyrPVmD8OeGotsjtWxgnVHk55Vd0/dIWVGjic0YCxH3SNdWqJJ9G8Vd93fWymVA==", + "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -1817,3019 +1927,18 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch-logs/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cloudwatch/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.624.0.tgz", - "integrity": "sha512-imw3bNptHdhcogU3lwSVlQJsRpTxnkT4bQbchS/qX6+fF0Pk6ERZ+Q0YjzitPqTjkeyAWecUT4riyqv2djo+5w==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.637.0.tgz", - "integrity": "sha512-udgyXL5ZQPTcXbzCq4plPxCEnYWGnC5+nWpCQAOcCACpA0rtQQ9OKabq/SiNO+6PVUMQFKRrZq6LS2p76mjl1w==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity-provider/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dev": true, - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-cognito-identity/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.637.0.tgz", - "integrity": "sha512-zUneT0yLgJjC69yry2fgYVWkv68OeV3amWaDXHirA8yJgygyc7tBLo+sQmtHczmKt8dBD9bU3OWpbAbtpF9Esw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-endpoint-discovery": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb-streams/-/client-dynamodb-streams-3.637.0.tgz", - "integrity": "sha512-WBh9Dn2Fm37SAFvWaa2or7NSuxNLJ62cFEVHX+SrKzJxhXSWYs24BoHW4XxMb6jiT0ka3GMctu//7Y1//MBU3A==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb-streams/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-dynamodb/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@aws-sdk/client-glue": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-glue/-/client-glue-3.637.0.tgz", - "integrity": "sha512-QhkixUI3eTittXRBv43qfh9hEjIPc1IoBmqKAzn8dSA2choX3XxpLvDLKbyv26yCq5QnZIiZ5SzOtr5pTJG/BA==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-glue/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-iam/-/client-iam-3.637.0.tgz", - "integrity": "sha512-mo1gCm3yayuiFPCQkY5i5wbL6jjgCprpAfeMP5zFOcDsr7BqX9ijTrRzK+dx0SwiTdRKOW6zJaDiWA1UZgb60A==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dev": true, - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-iam/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.637.0.tgz", - "integrity": "sha512-XVQn4p/9XNMEImxCY97WlA83Q63HRrDhks4kby5YGG2fZckaNJxXE+/FFYsznse8hXKLUJ1/aI3hZSnXTthq5g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-lambda/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-opensearch/-/client-opensearch-3.637.0.tgz", - "integrity": "sha512-SLmKOVBxImEziHS60hRB1d/pNSJVr+FRSlRSSV5KIEXvWrtrmNAZGly3KnXjPuDUpCflWrpuKX7sm2c9//CANQ==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-opensearch/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-route-53/-/client-route-53-3.637.0.tgz", - "integrity": "sha512-lF73WvWrCmfvmESx397G/GS8ecLIiB7PRy3Cpn1yl8V6LR3Hmuthgd7DbpN1YHtkEnwr0mVQUMy5c2IUD9D3kg==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-route53": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-route-53/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.637.0.tgz", - "integrity": "sha512-y6UC94fsMvhKbf0dzfnjVP1HePeGjplfcYfilZU1COIJLyTkMcUv4XcT4I407CGIrvgEafONHkiC09ygqUauNA==", - "dependencies": { - "@aws-crypto/sha1-browser": "5.2.0", - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-bucket-endpoint": "3.620.0", - "@aws-sdk/middleware-expect-continue": "3.620.0", - "@aws-sdk/middleware-flexible-checksums": "3.620.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-location-constraint": "3.609.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-s3": "3.635.0", - "@aws-sdk/middleware-ssec": "3.609.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/signature-v4-multi-region": "3.635.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@aws-sdk/xml-builder": "3.609.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/eventstream-serde-browser": "^3.0.6", - "@smithy/eventstream-serde-config-resolver": "^3.0.3", - "@smithy/eventstream-serde-node": "^3.0.5", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-blob-browser": "^3.1.2", - "@smithy/hash-node": "^3.0.3", - "@smithy/hash-stream-node": "^3.1.2", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-stream": "^3.1.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-s3/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.637.0.tgz", - "integrity": "sha512-4AEV+4yhaFYlnD90MbtOouqTyrPVmD8OeGotsjtWxgnVHk55Vd0/dIWVGjic0YCxH3SNdWqJJ9G8Vd93fWymVA==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dev": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dev": true, - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dev": true, - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dev": true, - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-secrets-manager/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@aws-sdk/client-ses": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.637.0.tgz", - "integrity": "sha512-pHkI8iMxbdtNeaa0a+c0T29bRZMFu8HQtGtwPlSwvD1elDVFrlWXw74MrlaW0aRPGryF4sHxVHk3YkxhxAS5iw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ses/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.637.0.tgz", - "integrity": "sha512-6FDeWqTCeIPgImMyabqoFd9/EFS3XIaMYrqmHUTSPNlrhRkuJWh+3zS/S5a7tPxqkadOIqajf9UCzMCvjJru8g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sns/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-secrets-manager/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dev": true, "dependencies": { "@smithy/util-buffer-from": "^3.0.0", "tslib": "^2.6.2" @@ -4838,119 +1947,28 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sqs": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.637.0.tgz", - "integrity": "sha512-0slT2OCa8uOottHFjIBD9EuTotu3Qdzp7Z7PqtkSqQdbXxC8CFsDLNfZVqpU8o/+mf79I2fJK21pEPhBnm654g==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/client-sts": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-sdk-sqs": "3.635.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/md5-js": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "node_modules/@aws-sdk/client-secrets-manager/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-ses": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ses/-/client-ses-3.637.0.tgz", + "integrity": "sha512-pHkI8iMxbdtNeaa0a+c0T29bRZMFu8HQtGtwPlSwvD1elDVFrlWXw74MrlaW0aRPGryF4sHxVHk3YkxhxAS5iw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -4987,62 +2005,14 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", + "@smithy/util-waiter": "^3.1.2", "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-sqs/node_modules/@smithy/util-utf8": { + "node_modules/@aws-sdk/client-ses/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", @@ -5054,10 +2024,10 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm": { + "node_modules/@aws-sdk/client-sns": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.637.0.tgz", - "integrity": "sha512-cr0/c95KpFIwoCCofXu1Em/Sw8SjIFCZ3X1ji2rW81QdLpw7icP01SMcRTbgtiKeN12fKZDXmrupkI6zhnG0MA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sns/-/client-sns-3.637.0.tgz", + "integrity": "sha512-6FDeWqTCeIPgImMyabqoFd9/EFS3XIaMYrqmHUTSPNlrhRkuJWh+3zS/S5a7tPxqkadOIqajf9UCzMCvjJru8g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -5099,26 +2069,39 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", - "@smithy/util-waiter": "^3.1.2", - "tslib": "^2.6.2", - "uuid": "^9.0.1" + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sns/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso-oidc": { + "node_modules/@aws-sdk/client-sqs": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sqs/-/client-sqs-3.637.0.tgz", + "integrity": "sha512-0slT2OCa8uOottHFjIBD9EuTotu3Qdzp7Z7PqtkSqQdbXxC8CFsDLNfZVqpU8o/+mf79I2fJK21pEPhBnm654g==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", + "@aws-sdk/middleware-sdk-sqs": "3.635.0", "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", @@ -5130,6 +2113,7 @@ "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", + "@smithy/md5-js": "^3.0.3", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", "@smithy/middleware-retry": "^3.0.15", @@ -5154,19 +2138,29 @@ }, "engines": { "node": ">=16.0.0" + } + }, + "node_modules/@aws-sdk/client-sqs/node_modules/@smithy/util-utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", + "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", + "dependencies": { + "@smithy/util-buffer-from": "^3.0.0", + "tslib": "^2.6.2" }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" + "engines": { + "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sts": { + "node_modules/@aws-sdk/client-ssm": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.637.0.tgz", + "integrity": "sha512-cr0/c95KpFIwoCCofXu1Em/Sw8SjIFCZ3X1ji2rW81QdLpw7icP01SMcRTbgtiKeN12fKZDXmrupkI6zhnG0MA==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", "@aws-sdk/core": "3.635.0", "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", @@ -5203,56 +2197,9 @@ "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" + "@smithy/util-waiter": "^3.1.2", + "tslib": "^2.6.2", + "uuid": "^9.0.1" }, "engines": { "node": ">=16.0.0" @@ -5283,43 +2230,43 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.624.0.tgz", - "integrity": "sha512-EX6EF+rJzMPC5dcdsu40xSi2To7GSvdGQNIpe97pD9WvZwM9tRNQnNM4T6HA4gjV1L6Jwk8rBlG/CnveXtLEMw==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", + "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", + "@aws-sdk/core": "3.635.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", + "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-retry": "^3.0.15", "@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-stack": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", "@smithy/node-http-handler": "^3.1.4", "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", "@smithy/url-parser": "^3.0.3", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", @@ -5331,44 +2278,44 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.624.0.tgz", - "integrity": "sha512-Ki2uKYJKKtfHxxZsiMTOvJoVRP6b2pZ1u3rcUb2m/nVgBPUfLdl8ZkGpqE29I+t5/QaS/sEdbn6cgMUZwl+3Dg==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", + "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", + "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-retry": "^3.0.15", "@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-stack": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", "@smithy/node-http-handler": "^3.1.4", "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", "@smithy/url-parser": "^3.0.3", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", @@ -5379,29 +2326,7 @@ "node": ">=16.0.0" }, "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/client-sso-oidc/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" + "@aws-sdk/client-sts": "^3.637.0" } }, "node_modules/@aws-sdk/client-sso-oidc/node_modules/@smithy/util-utf8": { @@ -5429,45 +2354,45 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.624.0.tgz", - "integrity": "sha512-k36fLZCb2nfoV/DKK3jbRgO/Yf7/R80pgYfMiotkGjnZwDmRvNN08z4l06L9C+CieazzkgRxNUzyppsYcYsQaw==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", + "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.624.0", - "@aws-sdk/core": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", + "@aws-sdk/client-sso-oidc": "3.637.0", + "@aws-sdk/core": "3.635.0", + "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/middleware-host-header": "3.620.0", "@aws-sdk/middleware-logger": "3.609.0", "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.620.0", + "@aws-sdk/middleware-user-agent": "3.637.0", "@aws-sdk/region-config-resolver": "3.614.0", "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.637.0", "@aws-sdk/util-user-agent-browser": "3.609.0", "@aws-sdk/util-user-agent-node": "3.614.0", "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.3.2", + "@smithy/core": "^2.4.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/hash-node": "^3.0.3", "@smithy/invalid-dependency": "^3.0.3", "@smithy/middleware-content-length": "^3.0.5", "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.14", + "@smithy/middleware-retry": "^3.0.15", "@smithy/middleware-serde": "^3.0.3", "@smithy/middleware-stack": "^3.0.3", "@smithy/node-config-provider": "^3.1.4", "@smithy/node-http-handler": "^3.1.4", "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", "@smithy/url-parser": "^3.0.3", "@smithy/util-base64": "^3.0.0", "@smithy/util-body-length-browser": "^3.0.0", "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.14", - "@smithy/util-defaults-mode-node": "^3.0.14", + "@smithy/util-defaults-mode-browser": "^3.0.15", + "@smithy/util-defaults-mode-node": "^3.0.15", "@smithy/util-endpoints": "^2.0.5", "@smithy/util-middleware": "^3.0.3", "@smithy/util-retry": "^3.0.3", @@ -5478,28 +2403,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/client-sts/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/client-sts/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", @@ -5525,15 +2428,16 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.624.0.tgz", - "integrity": "sha512-WyFmPbhRIvtWi7hBp8uSFy+iPpj8ccNV/eX86hwF4irMjfc/FtsGVIAeBXxXM/vGCjkdfEzOnl+tJ2XACD4OXg==", + "version": "3.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", + "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", "dependencies": { - "@smithy/core": "^2.3.2", + "@smithy/core": "^2.4.0", "@smithy/node-config-provider": "^3.1.4", + "@smithy/property-provider": "^3.1.3", "@smithy/protocol-http": "^4.1.0", "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", "@smithy/util-middleware": "^3.0.3", "fast-xml-parser": "4.4.1", @@ -5544,12 +2448,12 @@ } }, "node_modules/@aws-sdk/credential-provider-cognito-identity": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.624.0.tgz", - "integrity": "sha512-gbXaxZP29yzMmEUzsGqUrHpKBnfMBtemvrlufJbaz/MGJNIa5qtJQp7n1LMI5R49DBVUN9s/e9Rf5liyMvlHiw==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.637.0.tgz", + "integrity": "sha512-9qK1mF+EThtv3tsL1C/wb9MpWctJSkzjrLTFj+0Rtk8VYm6DlGepo/I6a2x3SeDmdBfHAFSrKFU39GqWDp1mwQ==", "dev": true, "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", + "@aws-sdk/client-cognito-identity": "3.637.0", "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", "@smithy/types": "^3.3.0", @@ -5574,16 +2478,16 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.622.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.622.0.tgz", - "integrity": "sha512-VUHbr24Oll1RK3WR8XLUugLpgK9ZuxEm/NVeVqyFts1Ck9gsKpRg1x4eH7L7tW3SJ4TDEQNMbD7/7J+eoL2svg==", + "version": "3.635.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", + "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/fetch-http-handler": "^3.2.4", "@smithy/node-http-handler": "^3.1.4", "@smithy/property-provider": "^3.1.3", "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.1.12", + "@smithy/smithy-client": "^3.2.0", "@smithy/types": "^3.3.0", "@smithy/util-stream": "^3.1.3", "tslib": "^2.6.2" @@ -5593,37 +2497,12 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.624.0.tgz", - "integrity": "sha512-mMoNIy7MO2WTBbdqMyLpbt6SZpthE6e0GkRYpsd0yozPt0RZopcBhEh+HG1U9Y1PVODo+jcMk353vAi61CfnhQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.624.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", - "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", + "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.635.0", - "@aws-sdk/credential-provider-ini": "3.637.0", "@aws-sdk/credential-provider-process": "3.620.1", "@aws-sdk/credential-provider-sso": "3.637.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", @@ -5634,104 +2513,6 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.637.0.tgz", - "integrity": "sha512-+KjLvgX5yJYROWo3TQuwBJlHCY0zz9PsLuEolmXQn0BVK1L/m9GteZHtd+rEdAoDGBpE0Xqjy1oz5+SmtsaRUw==", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.637.0.tgz", - "integrity": "sha512-27bHALN6Qb6m6KZmPvRieJ/QRlj1lyac/GT2Rn5kJpre8Mpp+yxrtvp3h9PjNBty4lCeFEENfY4dGNSozBuBcw==", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, "engines": { "node": ">=16.0.0" }, @@ -5739,103 +2520,14 @@ "@aws-sdk/client-sts": "^3.637.0" } }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/client-sts": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.637.0.tgz", - "integrity": "sha512-xUi7x4qDubtA8QREtlblPuAcn91GS/09YVEY/RwU7xCY0aqGuFwgszAANlha4OUIqva8oVj2WO4gJuG+iaSnhw==", - "peer": true, - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/client-sso-oidc": "3.637.0", - "@aws-sdk/core": "3.635.0", - "@aws-sdk/credential-provider-node": "3.637.0", - "@aws-sdk/middleware-host-header": "3.620.0", - "@aws-sdk/middleware-logger": "3.609.0", - "@aws-sdk/middleware-recursion-detection": "3.620.0", - "@aws-sdk/middleware-user-agent": "3.637.0", - "@aws-sdk/region-config-resolver": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@aws-sdk/util-user-agent-browser": "3.609.0", - "@aws-sdk/util-user-agent-node": "3.614.0", - "@smithy/config-resolver": "^3.0.5", - "@smithy/core": "^2.4.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/hash-node": "^3.0.3", - "@smithy/invalid-dependency": "^3.0.3", - "@smithy/middleware-content-length": "^3.0.5", - "@smithy/middleware-endpoint": "^3.1.0", - "@smithy/middleware-retry": "^3.0.15", - "@smithy/middleware-serde": "^3.0.3", - "@smithy/middleware-stack": "^3.0.3", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/url-parser": "^3.0.3", - "@smithy/util-base64": "^3.0.0", - "@smithy/util-body-length-browser": "^3.0.0", - "@smithy/util-body-length-node": "^3.0.0", - "@smithy/util-defaults-mode-browser": "^3.0.15", - "@smithy/util-defaults-mode-node": "^3.0.15", - "@smithy/util-endpoints": "^2.0.5", - "@smithy/util-middleware": "^3.0.3", - "@smithy/util-retry": "^3.0.3", - "@smithy/util-utf8": "^3.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.635.0.tgz", - "integrity": "sha512-iJyRgEjOCQlBMXqtwPLIKYc7Bsc6nqjrZybdMDenPDa+kmLg7xh8LxHsu9088e+2/wtLicE34FsJJIfzu3L82g==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/fetch-http-handler": "^3.2.4", - "@smithy/node-http-handler": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-stream": "^3.1.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-ini": { + "node_modules/@aws-sdk/credential-provider-node": { "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.637.0.tgz", - "integrity": "sha512-h+PFCWfZ0Q3Dx84SppET/TFpcQHmxFW8/oV9ArEvMilw4EBN+IlxgbL0CnHwjHW64szcmrM0mbebjEfHf4FXmw==", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.637.0.tgz", + "integrity": "sha512-yoEhoxJJfs7sPVQ6Is939BDQJZpZCoUgKr/ySse4YKOZ24t4VqgHA6+wV7rYh+7IW24Rd91UTvEzSuHYTlxlNA==", "dependencies": { "@aws-sdk/credential-provider-env": "3.620.1", "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-ini": "3.637.0", "@aws-sdk/credential-provider-process": "3.620.1", "@aws-sdk/credential-provider-sso": "3.637.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", @@ -5846,67 +2538,6 @@ "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, - "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-sts": "^3.637.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", - "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", - "dependencies": { - "@aws-sdk/client-sso": "3.637.0", - "@aws-sdk/token-providers": "3.614.0", - "@aws-sdk/types": "3.609.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", - "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.637.0", - "@smithy/protocol-http": "^4.1.0", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/util-endpoints": { - "version": "3.637.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", - "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", - "dependencies": { - "@aws-sdk/types": "3.609.0", - "@smithy/types": "^3.3.0", - "@smithy/util-endpoints": "^2.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node/node_modules/@smithy/util-utf8": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", - "integrity": "sha512-rUeT12bxFnplYDe815GXbq/oixEGHfRFFtcTF3YdDi/JaENIM6aSYYLJydG83UNzLXeRI5K8abYd/8Sp/QM0kA==", - "dependencies": { - "@smithy/util-buffer-from": "^3.0.0", - "tslib": "^2.6.2" - }, "engines": { "node": ">=16.0.0" } @@ -5927,11 +2558,11 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.624.0.tgz", - "integrity": "sha512-A02bayIjU9APEPKr3HudrFHEx0WfghoSPsPopckDkW7VBqO4wizzcxr75Q9A3vNX+cwg0wCN6UitTNe6pVlRaQ==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.637.0.tgz", + "integrity": "sha512-Mvz+h+e62/tl+dVikLafhv+qkZJ9RUb8l2YN/LeKMWkxQylPT83CPk9aimVhCV89zth1zpREArl97+3xsfgQvA==", "dependencies": { - "@aws-sdk/client-sso": "3.624.0", + "@aws-sdk/client-sso": "3.637.0", "@aws-sdk/token-providers": "3.614.0", "@aws-sdk/types": "3.609.0", "@smithy/property-provider": "^3.1.3", @@ -5961,48 +2592,25 @@ } }, "node_modules/@aws-sdk/credential-providers": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.624.0.tgz", - "integrity": "sha512-SX+F5x/w8laQkhXLd1oww2lTuBDJSxzXWyxuOi25a9s4bMDs0V/wOj885Vr6h8QEGi3F8jZ8aWLwpsm2yuk9BA==", - "dev": true, - "dependencies": { - "@aws-sdk/client-cognito-identity": "3.624.0", - "@aws-sdk/client-sso": "3.624.0", - "@aws-sdk/client-sts": "3.624.0", - "@aws-sdk/credential-provider-cognito-identity": "3.624.0", - "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", - "@aws-sdk/credential-provider-node": "3.624.0", - "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", - "@aws-sdk/credential-provider-web-identity": "3.621.0", - "@aws-sdk/types": "3.609.0", - "@smithy/credential-provider-imds": "^3.2.0", - "@smithy/property-provider": "^3.1.3", - "@smithy/types": "^3.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-sdk/credential-providers/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.624.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.624.0.tgz", - "integrity": "sha512-vYyGK7oNpd81BdbH5IlmQ6zfaQqU+rPwsKTDDBeLRjshtrGXOEpfoahVpG9PX0ibu32IOWp4ZyXBNyVrnvcMOw==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-providers/-/credential-providers-3.637.0.tgz", + "integrity": "sha512-yW1scL3Z7JsrTrmhjyZsB6tsMJ49UCO42BGlNWZAW+kN1vNJ+qbv6XYQJWR4gjpuD2rdmtGcEawcgllE2Bmigw==", "dev": true, "dependencies": { + "@aws-sdk/client-cognito-identity": "3.637.0", + "@aws-sdk/client-sso": "3.637.0", + "@aws-sdk/client-sts": "3.637.0", + "@aws-sdk/credential-provider-cognito-identity": "3.637.0", "@aws-sdk/credential-provider-env": "3.620.1", - "@aws-sdk/credential-provider-http": "3.622.0", - "@aws-sdk/credential-provider-ini": "3.624.0", + "@aws-sdk/credential-provider-http": "3.635.0", + "@aws-sdk/credential-provider-ini": "3.637.0", + "@aws-sdk/credential-provider-node": "3.637.0", "@aws-sdk/credential-provider-process": "3.620.1", - "@aws-sdk/credential-provider-sso": "3.624.0", + "@aws-sdk/credential-provider-sso": "3.637.0", "@aws-sdk/credential-provider-web-identity": "3.621.0", "@aws-sdk/types": "3.609.0", "@smithy/credential-provider-imds": "^3.2.0", "@smithy/property-provider": "^3.1.3", - "@smithy/shared-ini-file-loader": "^3.1.4", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" }, @@ -6242,26 +2850,6 @@ "node": ">=16.0.0" } }, - "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@aws-sdk/core": { - "version": "3.635.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.635.0.tgz", - "integrity": "sha512-i1x/E/sgA+liUE1XJ7rj1dhyXpAKO1UKFUcTTHXok2ARjWTvszHnSXMOsB77aPbmn0fUp1JTx2kHUAZ1LVt5Bg==", - "dependencies": { - "@smithy/core": "^2.4.0", - "@smithy/node-config-provider": "^3.1.4", - "@smithy/property-provider": "^3.1.3", - "@smithy/protocol-http": "^4.1.0", - "@smithy/signature-v4": "^4.1.0", - "@smithy/smithy-client": "^3.2.0", - "@smithy/types": "^3.3.0", - "@smithy/util-middleware": "^3.0.3", - "fast-xml-parser": "4.4.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/@aws-sdk/middleware-sdk-s3/node_modules/@smithy/util-utf8": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-3.0.0.tgz", @@ -6316,12 +2904,12 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.620.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.620.0.tgz", - "integrity": "sha512-bvS6etn+KsuL32ubY5D3xNof1qkenpbJXf/ugGXbg0n98DvDFQ/F+SMLxHgbnER5dsKYchNnhmtI6/FC3HFu/A==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.637.0.tgz", + "integrity": "sha512-EYo0NE9/da/OY8STDsK2LvM4kNa79DBsf4YVtaG4P5pZ615IeFsD8xOHZeuJmUrSMlVQ8ywPRX7WMucUybsKug==", "dependencies": { "@aws-sdk/types": "3.609.0", - "@aws-sdk/util-endpoints": "3.614.0", + "@aws-sdk/util-endpoints": "3.637.0", "@smithy/protocol-http": "^4.1.0", "@smithy/types": "^3.3.0", "tslib": "^2.6.2" @@ -6741,9 +3329,9 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.614.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.614.0.tgz", - "integrity": "sha512-wK2cdrXHH4oz4IomV/yrGkftU9A+ITB6nFL+rxxyO78is2ifHJpFdV4aqk4LSkXYPi6CXWNru/Dqc7yiKXgJPw==", + "version": "3.637.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.637.0.tgz", + "integrity": "sha512-pAqOKUHeVWHEXXDIp/qoMk/6jyxIb6GGjnK1/f8dKHtKIEs4tKsnnL563gceEvdad53OPXIt86uoevCcCzmBnw==", "dependencies": { "@aws-sdk/types": "3.609.0", "@smithy/types": "^3.3.0", @@ -7014,18 +3602,6 @@ "node": ">=18.0.0" } }, - "node_modules/@azure/core-rest-pipeline/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@azure/core-rest-pipeline/node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -7114,27 +3690,6 @@ "node": ">=18.0.0" } }, - "node_modules/@azure/identity/node_modules/jwa": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", - "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", - "dev": true, - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/@azure/identity/node_modules/jws": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", - "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", - "dev": true, - "dependencies": { - "jwa": "^2.0.0", - "safe-buffer": "^5.0.1" - } - }, "node_modules/@azure/logger": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/@azure/logger/-/logger-1.1.4.tgz", @@ -7148,21 +3703,21 @@ } }, "node_modules/@azure/msal-browser": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.21.0.tgz", - "integrity": "sha512-BAwcFsVvOrYzKuUZHhFuvRykUmQGq6lDxst2qGnjxnpNZc3d/tnVPcmhgvUdeKl28VSE0ltgBzT3HkdpDtz9rg==", + "version": "3.22.0", + "resolved": "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-3.22.0.tgz", + "integrity": "sha512-ZkL2Z0zffsBIE3ovhMwa0rVrPeKV2GHhDWFgWiIcKiPt82b21YLijK3c/rNjTHkME+6FCjMIa/5Nul+ZjH197w==", "dev": true, "dependencies": { - "@azure/msal-common": "14.14.1" + "@azure/msal-common": "14.14.2" }, "engines": { "node": ">=0.8.0" } }, "node_modules/@azure/msal-common": { - "version": "14.14.1", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.1.tgz", - "integrity": "sha512-2Q3tqNz/PZLfSr8BvcHZVpRRfSn4MjGSqjj9J+HlBsmbf1Uu4P0WeXnemjTJwwx9KrmplsrN3UkZ/LPOR720rw==", + "version": "14.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.2.tgz", + "integrity": "sha512-XV0P5kSNwDwCA/SjIxTe9mEAsKB0NqGNSuaVrkCCE2lAyBr/D6YtD80Vkdp4tjWnPFwjzkwldjr1xU/facOJog==", "dev": true, "engines": { "node": ">=0.8.0" @@ -7182,6 +3737,15 @@ "node": ">=16" } }, + "node_modules/@azure/msal-node/node_modules/@azure/msal-common": { + "version": "14.14.1", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-14.14.1.tgz", + "integrity": "sha512-2Q3tqNz/PZLfSr8BvcHZVpRRfSn4MjGSqjj9J+HlBsmbf1Uu4P0WeXnemjTJwwx9KrmplsrN3UkZ/LPOR720rw==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/@azure/msal-node/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -7336,11 +3900,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.4.tgz", - "integrity": "sha512-NFtZmZsyzDPJnk9Zg3BbTfKKc9UlHYzD0E//p2Z3B9nCwwtJW9T0gVbCz8+fBngnn4zf1Dr3IK8PHQQHq0lDQw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dependencies": { - "@babel/types": "^7.25.4", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -7608,13 +4172,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.0.tgz", - "integrity": "sha512-MjgLZ42aCm0oGjJj8CtSM3DB8NOOf8h2l7DCTePJs29u+v7yO/RBX9nShlKMgFnRks/Q4tBAe7Hxnov9VkGwLw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "dev": true, "dependencies": { "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0" + "@babel/types": "^7.25.6" }, "engines": { "node": ">=6.9.0" @@ -7635,11 +4199,11 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.4.tgz", - "integrity": "sha512-nq+eWrOgdtu3jG5Os4TQP3x3cLA8hR8TvJNjD8vnPa20WGycimcparWnLK4jJhElTK6SDyuJo1weMKO/5LpmLA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", "dependencies": { - "@babel/types": "^7.25.4" + "@babel/types": "^7.25.6" }, "bin": { "parser": "bin/babel-parser.js" @@ -7815,12 +4379,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -7830,12 +4394,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -7986,12 +4550,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz", - "integrity": "sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -9085,15 +5649,15 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.4.tgz", - "integrity": "sha512-VJ4XsrD+nOvlXyLzmLzUs/0qjFS4sK30te5yEFlvbbUNEgKaVb2BHZUpAL+ttLPQAHNrsI3zZisbfha5Cvr8vg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.25.4", - "@babel/parser": "^7.25.4", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.4", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -9102,9 +5666,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.4.tgz", - "integrity": "sha512-zQ1ijeeCXVEh+aNL0RlmkPkG8HUiDcU2pzQQFjtbntgAczRASFzj4H+6+bV+dy1ntKR14I/DypeuRG1uma98iQ==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -9142,9 +5706,9 @@ } }, "node_modules/@codegenie/serverless-express": { - "version": "4.14.1", - "resolved": "https://registry.npmjs.org/@codegenie/serverless-express/-/serverless-express-4.14.1.tgz", - "integrity": "sha512-B90/1OmA9mf9bEJnplLj7FGf+N2v2ikB68c/9W9uXmCa4ep/V00ymCiivwGLyeuzQRW33tcj4+KxZ2utfmu39Q==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@codegenie/serverless-express/-/serverless-express-4.15.0.tgz", + "integrity": "sha512-adnKbnW1Tg5LAe0lcbyoRchu8G6+gLwP1rvgwfHvTbCwvBQNfhsgnzq4cKkLn7ZKn2sa4JZNis/Gn/2jWBWa4A==", "dev": true, "engines": { "node": ">=12" @@ -10224,18 +6788,6 @@ "node": ">=16.3.0" } }, - "node_modules/@cypress/puppeteer/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@cypress/puppeteer/node_modules/chromium-bidi": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", @@ -10596,14 +7148,14 @@ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" }, "node_modules/@emotion/react": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz", - "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==", + "version": "11.13.3", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", + "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.12.0", "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.0", + "@emotion/serialize": "^1.3.1", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", "@emotion/utils": "^1.4.0", "@emotion/weak-memoize": "^0.4.0", @@ -10619,13 +7171,13 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.0.tgz", - "integrity": "sha512-jACuBa9SlYajnpIVXB+XOXnfJHyckDfe6fOpORIM6yhBDlqGuExvDdZYHDQGoDf3bZXGv7tNr+LpLjJqiEQ6EA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.1.tgz", + "integrity": "sha512-dEPNKzBPU+vFPGa+z3axPRn8XVDetYORmDC0wAiej+TNcOZE70ZMJa0X7JdeoM6q/nWTMZeLpN/fTnD9o8MQBA==", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.9.0", + "@emotion/unitless": "^0.10.0", "@emotion/utils": "^1.4.0", "csstype": "^3.0.2" } @@ -10636,9 +7188,9 @@ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" }, "node_modules/@emotion/unitless": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.9.0.tgz", - "integrity": "sha512-TP6GgNZtmtFaFcsOgExdnfxLLpRDla4Q66tnenA9CktvVSdNKDvMVuUah4QvWPIpNjrWsGg3qeGo9a43QooGZQ==" + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { "version": "1.1.0", @@ -11210,26 +7762,26 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.6.tgz", - "integrity": "sha512-Vkvsw6EcpMHjvZZdMkSY+djMGFbt7CRssW99Ne8tar2WLnZ/l3dbxeTShbLQj+/s35h+Qb4cmnob+EzwtjrXGQ==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.7.tgz", + "integrity": "sha512-yDzVT/Lm101nQ5TCVeK65LtdN7Tj4Qpr9RTXJ2vPFLqtLxwOrpoxAHAJI8J3yYWUc40J0BDBheaitK5SJmno2g==", "dependencies": { - "@floating-ui/utils": "^0.2.6" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/dom": { - "version": "1.6.9", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.9.tgz", - "integrity": "sha512-zB1PcI350t4tkm3rvUhSRKa9sT7vH5CrAbQxW+VaPYJXKAO0gsg4CTueL+6Ajp7XzAQC8CW4Jj1Wgqc0sB6oUQ==", + "version": "1.6.10", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.10.tgz", + "integrity": "sha512-fskgCFv8J8OamCmyun8MfjB1Olfn+uZKjOKZ0vhYF3gRmEUXcGOjxWL8bBr7i4kIuPZ2KD2S3EUIOxnjC8kl2A==", "dependencies": { "@floating-ui/core": "^1.6.0", - "@floating-ui/utils": "^0.2.6" + "@floating-ui/utils": "^0.2.7" } }, "node_modules/@floating-ui/utils": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.6.tgz", - "integrity": "sha512-0KI3zGxIUs1KDR/pjQPdJH4Z8nGBm0yJ5WRoRfdw1Kzeh45jkIfA0rmD0kBF6fKHH+xaH7g8y4jIXyAV5MGK3g==" + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.7.tgz", + "integrity": "sha512-X8R8Oj771YRl/w+c1HqAC1szL8zWQRwFvgDwT129k9ACdBoud/+/rX9V0qiMl6LWUdP9voC2nDVZYPMQQsb6eA==" }, "node_modules/@fortawesome/fontawesome-common-types": { "version": "0.2.36", @@ -12260,18 +8812,6 @@ "node": "^16.14.0 || >=18.0.0" } }, - "node_modules/@npmcli/agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -12726,9 +9266,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz", - "integrity": "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.26.0.tgz", + "integrity": "sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==", "dev": true, "engines": { "node": ">=14" @@ -13248,15 +9788,15 @@ } }, "node_modules/@opentelemetry/exporter-zipkin": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.25.1.tgz", - "integrity": "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.26.0.tgz", + "integrity": "sha512-PW5R34n3SJHO4t0UetyHKiXL6LixIqWN6lWncg3eRXhKuT30x+b7m5sDJS0kEWRfHeS+kG7uCw2vBzmB2lk3Dw==", "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/sdk-trace-base": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/sdk-trace-base": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13266,12 +9806,12 @@ } }, "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", "dev": true, "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13280,15 +9820,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/exporter-zipkin/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/otlp-exporter-base": { "version": "0.41.2", "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.41.2.tgz", @@ -13419,13 +9950,13 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz", - "integrity": "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.26.0.tgz", + "integrity": "sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==", "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13435,12 +9966,12 @@ } }, "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", "dev": true, "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13449,15 +9980,6 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/resources/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-logs": { "version": "0.41.2", "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.41.2.tgz", @@ -13501,14 +10023,13 @@ } }, "node_modules/@opentelemetry/sdk-metrics": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz", - "integrity": "sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.26.0.tgz", + "integrity": "sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==", "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "lodash.merge": "^4.6.2" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0" }, "engines": { "node": ">=14" @@ -13518,12 +10039,12 @@ } }, "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", "dev": true, "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13532,24 +10053,15 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-metrics/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz", - "integrity": "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz", + "integrity": "sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==", "dev": true, "dependencies": { - "@opentelemetry/core": "1.25.1", - "@opentelemetry/resources": "1.25.1", - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/core": "1.26.0", + "@opentelemetry/resources": "1.26.0", + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13559,12 +10071,12 @@ } }, "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/core": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz", - "integrity": "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-1.26.0.tgz", + "integrity": "sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==", "dev": true, "dependencies": { - "@opentelemetry/semantic-conventions": "1.25.1" + "@opentelemetry/semantic-conventions": "1.27.0" }, "engines": { "node": ">=14" @@ -13573,19 +10085,10 @@ "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, - "node_modules/@opentelemetry/sdk-trace-base/node_modules/@opentelemetry/semantic-conventions": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz", - "integrity": "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.26.0.tgz", - "integrity": "sha512-U9PJlOswJPSgQVPI+XEuNLElyFWkb0hAiMg+DExD9V0St03X2lPHGMdxMY/LrVmoukuIpXJ12oyrOtEZ4uXFkw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz", + "integrity": "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==", "dev": true, "engines": { "node": ">=14" @@ -13892,9 +10395,9 @@ } }, "node_modules/@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, "node_modules/@smithy/abort-controller": { @@ -15624,28 +12127,6 @@ "@types/node": "*" } }, - "node_modules/@types/eslint": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.0.tgz", - "integrity": "sha512-gi6WQJ7cHRgZxtkQEoyHMppPjq9Kxo5Tjn2prSKDSmZrCz8TZ3jSRCeTJm+WoM+oB0WG37bRqLzaaU3q7JypGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -15806,9 +12287,9 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/pg": { - "version": "8.11.6", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.6.tgz", - "integrity": "sha512-/2WmmBXHLsfRqzfHW7BNZ8SbYzE8OSk7i3WjFYvfgRHj7S1xj+16Je5fUKv3lVdVzk/zn9TXOqf+avFCFIE0yQ==", + "version": "8.11.8", + "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.11.8.tgz", + "integrity": "sha512-IqpCf8/569txXN/HoP5i1LjXfKZWL76Yr2R77xgeIICUbAYHeoaEZFhYHo2uDftecLWrTJUq63JvQu8q3lnDyA==", "dependencies": { "@types/node": "*", "pg-protocol": "*", @@ -15866,9 +12347,9 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", - "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz", + "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==", "dependencies": { "@types/react": "*" } @@ -15961,9 +12442,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" @@ -16467,14 +12948,15 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/agentkeepalive": { @@ -16767,9 +13249,9 @@ } }, "node_modules/archiver/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/are-we-there-yet": { @@ -17486,9 +13968,9 @@ "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" }, "node_modules/aws-sdk": { - "version": "2.1668.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1668.0.tgz", - "integrity": "sha512-4Vcg3KjNZDHbvG4DI6jusN0DUPpRy3E/tBb6CA6ojlS2V1X5zljU9tkspICtbxXdY1gPFmKUe5COPc34XHG1RA==", + "version": "2.1685.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1685.0.tgz", + "integrity": "sha512-axo1by16nZXqHAFu65+/pLnqqaU3ez5ko3jTGDt0byafT7XD948z3WqqrXWT9vJTUF93DdTZ9DEcazj4Ai91cQ==", "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", @@ -17652,9 +14134,9 @@ } }, "node_modules/aws4": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.1.tgz", - "integrity": "sha512-u5w79Rd7SU4JaIlA/zFqG+gOiuq25q5VLyZ8E+ijJeILuTxVzZgp2CaGw/UTw6pXYN9XMO9yiqj/nEHmhTG5CA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "node_modules/axe-core": { "version": "4.10.0", @@ -18009,23 +14491,26 @@ "dev": true }, "node_modules/babel-preset-current-node-syntax": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", - "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz", + "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.8.3", - "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-top-level-await": "^7.8.3" + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5" }, "peerDependencies": { "@babel/core": "^7.0.0" @@ -18070,9 +14555,9 @@ "optional": true }, "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.2.tgz", + "integrity": "sha512-Kcq/FG3lhspzGHK+Q0IMfImuFOmaW/jFofBAUJuuG7H67879JeaPUppUHhgLjJKenfxiO6Ix2AGSd47Pf7mRxg==", "optional": true, "dependencies": { "bare-events": "^2.0.0", @@ -18081,9 +14566,9 @@ } }, "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.1.tgz", + "integrity": "sha512-yQC/blMP/eUdULsF7hrcC9tUFXlUmAWRbSQndEln77nOIh/N4Loaqch/MA4hyoDKhw1Zd1Wj+uLV/bT6lC/4BQ==", "optional": true }, "node_modules/bare-path": { @@ -18096,9 +14581,9 @@ } }, "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.2.0.tgz", + "integrity": "sha512-+o9MG5bPRRBlkVSpfFlMag3n7wMaIZb4YZasU2+/96f+3HTQ4F9DKQeu3K/Sjz1W0umu6xvVq1ON0ipWdMlr3A==", "optional": true, "dependencies": { "streamx": "^2.18.0" @@ -18846,9 +15331,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001649", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001649.tgz", - "integrity": "sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==", + "version": "1.0.30001653", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001653.tgz", + "integrity": "sha512-XGWQVB8wFQ2+9NZwZ10GxTYC5hk0Fa+q8cSkr0tgvMhYhMHP/QC+WTgrePMDBWiWc/pV+1ik82Al20XOK25Gcw==", "dev": true, "funding": [ { @@ -19125,9 +15610,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", - "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.0.tgz", + "integrity": "sha512-N1NGmowPlGBLsOZLPvm48StN04V4YvQRL0i6b7ctrVY3epjP/ct7hFLOItz6pDIvRjwpfPxi52a2UWV2ziir8g==", "dev": true }, "node_modules/classlist-polyfill": { @@ -19656,9 +16141,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.38.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.0.tgz", - "integrity": "sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "dependencies": { "browserslist": "^4.23.3" @@ -20478,9 +16963,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.12", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.12.tgz", - "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" + "version": "1.11.13", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==" }, "node_modules/debug": { "version": "4.3.6", @@ -21293,9 +17778,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.5.tgz", - "integrity": "sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "node_modules/element-closest": { @@ -22166,9 +18651,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", - "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.2.tgz", + "integrity": "sha512-3XnC5fDyc8M4J2E8pt8pmSVRX2M+5yWMCfI/kDZwauQeFgzQOuhcRBFKjTeJagqgk4sFKxe1mvNVnaWwImx/Tg==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -23847,9 +20332,9 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -24132,9 +20617,9 @@ } }, "node_modules/getos/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/getpass": { @@ -24780,18 +21265,6 @@ "node": ">= 14" } }, - "node_modules/http-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/http-signature": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", @@ -24831,6 +21304,17 @@ "node": ">= 6" } }, + "node_modules/https-proxy-agent/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/human-signals": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", @@ -25523,9 +22007,9 @@ } }, "node_modules/is-core-module": { - "version": "2.15.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.0.tgz", - "integrity": "sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { "hasown": "^2.0.2" }, @@ -26198,9 +22682,9 @@ } }, "node_modules/jake/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "node_modules/jake/node_modules/brace-expansion": { @@ -26674,6 +23158,18 @@ } } }, + "node_modules/jest-environment-jsdom/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/jest-environment-jsdom/node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", @@ -27681,18 +24177,6 @@ } } }, - "node_modules/jsdom/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/jsdom/node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -27910,6 +24394,25 @@ "npm": ">=6" } }, + "node_modules/jsonwebtoken/node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jsonwebtoken/node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/jsprim": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", @@ -27965,9 +24468,10 @@ "dev": true }, "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dev": true, "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", @@ -27975,11 +24479,12 @@ } }, "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dev": true, "dependencies": { - "jwa": "^1.4.1", + "jwa": "^2.0.0", "safe-buffer": "^5.0.1" } }, @@ -28238,9 +24743,9 @@ } }, "node_modules/lightningcss": { - "version": "1.25.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.25.1.tgz", - "integrity": "sha512-V0RMVZzK1+rCHpymRv4URK2lNhIRyO8g7U7zOFwVAhJuat74HtkjIQpQRKNCwFEYkRGpafOpmXXLoaoBcyVtBg==", + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.26.0.tgz", + "integrity": "sha512-a/XZ5hdgifrofQJUArr5AiJjx26SwMam3SJUSMjgebZbESZ96i+6Qsl8tLi0kaUsdMzBWXh9sN1Oe6hp2/dkQw==", "dev": true, "dependencies": { "detect-libc": "^1.0.3" @@ -28253,15 +24758,216 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.25.1", - "lightningcss-darwin-x64": "1.25.1", - "lightningcss-freebsd-x64": "1.25.1", - "lightningcss-linux-arm-gnueabihf": "1.25.1", - "lightningcss-linux-arm64-gnu": "1.25.1", - "lightningcss-linux-arm64-musl": "1.25.1", - "lightningcss-linux-x64-gnu": "1.25.1", - "lightningcss-linux-x64-musl": "1.25.1", - "lightningcss-win32-x64-msvc": "1.25.1" + "lightningcss-darwin-arm64": "1.26.0", + "lightningcss-darwin-x64": "1.26.0", + "lightningcss-freebsd-x64": "1.26.0", + "lightningcss-linux-arm-gnueabihf": "1.26.0", + "lightningcss-linux-arm64-gnu": "1.26.0", + "lightningcss-linux-arm64-musl": "1.26.0", + "lightningcss-linux-x64-gnu": "1.26.0", + "lightningcss-linux-x64-musl": "1.26.0", + "lightningcss-win32-arm64-msvc": "1.26.0", + "lightningcss-win32-x64-msvc": "1.26.0" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.26.0.tgz", + "integrity": "sha512-n4TIvHO1NY1ondKFYpL2ZX0bcC2y6yjXMD6JfyizgR8BCFNEeArINDzEaeqlfX9bXz73Bpz/Ow0nu+1qiDrBKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.26.0.tgz", + "integrity": "sha512-Rf9HuHIDi1R6/zgBkJh25SiJHF+dm9axUZW/0UoYCW1/8HV0gMI0blARhH4z+REmWiU1yYT/KyNF3h7tHyRXUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.26.0.tgz", + "integrity": "sha512-C/io7POAxp6sZxFSVGezjajMlCKQ8KSwISLLGRq8xLQpQMokYrUoqYEwmIX8mLmF6C/CZPk0gFmRSzd8biWM0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.26.0.tgz", + "integrity": "sha512-Aag9kqXqkyPSW+dXMgyWk66C984Nay2pY8Nws+67gHlDzV3cWh7TvFlzuaTaVFMVqdDTzN484LSK3u39zFBnzg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.26.0.tgz", + "integrity": "sha512-iJmZM7fUyVjH+POtdiCtExG+67TtPUTer7K/5A8DIfmPfrmeGvzfRyBltGhQz13Wi15K1lf2cPYoRaRh6vcwNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.26.0.tgz", + "integrity": "sha512-XxoEL++tTkyuvu+wq/QS8bwyTXZv2y5XYCMcWL45b8XwkiS8eEEEej9BkMGSRwxa5J4K+LDeIhLrS23CpQyfig==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.26.0.tgz", + "integrity": "sha512-1dkTfZQAYLj8MUSkd6L/+TWTG8V6Kfrzfa0T1fSlXCXQHrt1HC1/UepXHtKHDt/9yFwyoeayivxXAsApVxn6zA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.26.0.tgz", + "integrity": "sha512-yX3Rk9m00JGCUzuUhFEojY+jf/6zHs3XU8S8Vk+FRbnr4St7cjyMXdNjuA2LjiT8e7j8xHRCH8hyZ4H/btRE4A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.26.0.tgz", + "integrity": "sha512-X/597/cFnCogy9VItj/+7Tgu5VLbAtDF7KZDPdSw0MaL6FL940th1y3HiOzFIlziVvAtbo0RB3NAae1Oofr+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.26.0.tgz", + "integrity": "sha512-pYS3EyGP3JRhfqEFYmfFDiZ9/pVNfy8jVIYtrx9TVNusVyDK3gpW1w/rbvroQ4bDJi7grdUtyrYU6V2xkY/bBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, "node_modules/lightningcss/node_modules/detect-libc": { @@ -28476,9 +25182,9 @@ } }, "node_modules/lint-staged/node_modules/emoji-regex": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.3.0.tgz", - "integrity": "sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", "dev": true }, "node_modules/lint-staged/node_modules/eventemitter3": { @@ -29422,9 +26128,9 @@ "integrity": "sha512-+HzcV2H+rbSJzApgkj0NdTakkC+bnyeiUxgT6/m7mjcz1CmM22KYFKp+EVj1sWe4UYcnriJr5uqHQD/gMHLD+g==" }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "dependencies": { "braces": "^3.0.3", @@ -29754,6 +26460,18 @@ "node": ">=10.0" } }, + "node_modules/mixpanel/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/mixpanel/node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -29983,12 +26701,12 @@ } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz", - "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", "dev": true, "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@sinonjs/commons": "^3.0.1" } }, "node_modules/nise/node_modules/path-to-regexp": { @@ -30072,9 +26790,9 @@ } }, "node_modules/node-gyp-build": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", - "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", + "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -31146,18 +27864,6 @@ "node": ">= 14" } }, - "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -31803,6 +28509,20 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/pngjs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", @@ -33094,9 +29814,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/protobufjs": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.3.tgz", - "integrity": "sha512-HaYi2CVjiPoBR1d2zTVKVHXr9IUnpJizCjUu19vxdD3B8o4z+vfOHpIEB1358w8nv8dfUNEfDHFvMsH7QlLt/Q==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.4.0.tgz", + "integrity": "sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -33148,18 +29868,6 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/proxy-agent/node_modules/https-proxy-agent": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", @@ -34504,35 +31212,35 @@ }, "node_modules/s3rver": { "name": "@20minutes/s3rver", - "version": "4.0.0", - "resolved": "git+ssh://git@github.com/20minutes/s3rver.git#6960fcd9915bf68caf9a3081343b4fca79db208b", + "version": "4.0.1", + "resolved": "git+ssh://git@github.com/20minutes/s3rver.git#602411e44b45cd3607385b80142b67822c496b70", "dev": true, "dependencies": { - "@koa/router": "^12.0.0", + "@koa/router": "^12.0.1", "busboy": "^1.6.0", - "commander": "^11.0.0", - "fast-xml-parser": "^4.3.1", + "commander": "^12.1.0", + "fast-xml-parser": "^4.4.1", "he": "^1.2.0", - "koa": "^2.12.1", + "koa": "^2.15.3", "koa-logger": "^3.2.0", "lodash": "^4.17.20", "statuses": "^2.0.0", - "winston": "^3.10.0" + "winston": "^3.14.1" }, "bin": { "s3rver": "bin/s3rver.js" }, "engines": { - "node": ">=12.13.0" + "node": ">=20" } }, "node_modules/s3rver/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/safe-array-concat": { @@ -34605,9 +31313,9 @@ } }, "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "engines": { "node": ">=10" } @@ -34679,6 +31387,334 @@ "sass-embedded-win32-x64": "1.77.8" } }, + "node_modules/sass-embedded-android-arm": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.77.8.tgz", + "integrity": "sha512-GpGL7xZ7V1XpFbnflib/NWbM0euRzineK0iwoo31/ntWKAXGj03iHhGzkSiOwWSFcXgsJJi3eRA5BTmBvK5Q+w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.77.8.tgz", + "integrity": "sha512-EmWHLbEx0Zo/f/lTFzMeH2Du+/I4RmSRlEnERSUKQWVp3aBSO04QDvdxfFezgQ+2Yt/ub9WMqBpma9P/8MPsLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.77.8.tgz", + "integrity": "sha512-+GjfJ3lDezPi4dUUyjQBxlNKXNa+XVWsExtGvVNkv1uKyaOxULJhubVo2G6QTJJU0esJdfeXf5Ca5/J0ph7+7w==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.77.8.tgz", + "integrity": "sha512-YZbFDzGe5NhaMCygShqkeCWtzjhkWxGVunc7ULR97wmxYPQLPeVyx7XFQZc84Aj0lKAJBJS4qRZeqphMqZEJsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.77.8.tgz", + "integrity": "sha512-aifgeVRNE+i43toIkDFFJc/aPLMo0PJ5s5hKb52U+oNdiJE36n65n2L8F/8z3zZRvCa6eYtFY2b7f1QXR3B0LA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.77.8.tgz", + "integrity": "sha512-/VWZQtcWIOek60Zj6Sxk6HebXA1Qyyt3sD8o5qwbTgZnKitB1iEBuNunyGoAgMNeUz2PRd6rVki6hvbas9hQ6w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.77.8.tgz", + "integrity": "sha512-2edZMB6jf0whx3T0zlgH+p131kOEmWp+I4wnKj7ZMUeokiY4Up05d10hSvb0Q63lOrSjFAWu6P5/pcYUUx8arQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.77.8.tgz", + "integrity": "sha512-6iIOIZtBFa2YfMsHqOb3qake3C9d/zlKxjooKKnTSo+6g6z+CLTzMXe1bOfayb7yxeenElmFoK1k54kWD/40+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.77.8.tgz", + "integrity": "sha512-63GsFFHWN5yRLTWiSef32TM/XmjhCBx1DFhoqxmj+Yc6L9Z1h0lDHjjwdG6Sp5XTz5EmsaFKjpDgnQTP9hJX3Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.77.8.tgz", + "integrity": "sha512-nFkhSl3uu9btubm+JBW7uRglNVJ8W8dGfzVqh3fyQJKS1oyBC3vT3VOtfbT9YivXk28wXscSHpqXZwY7bUuopA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.77.8.tgz", + "integrity": "sha512-j8cgQxNWecYK+aH8ESFsyam/Q6G+9gg8eJegiRVpA9x8yk3ykfHC7UdQWwUcF22ZcuY4zegrjJx8k+thsgsOVA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.77.8.tgz", + "integrity": "sha512-oWveMe+8TFlP8WBWPna/+Ec5TV0CE+PxEutyi0ltSruBds2zxRq9dPVOqrpPcDN9QUx50vNZC0Afgch0aQEd0g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.77.8.tgz", + "integrity": "sha512-2NtRpMXHeFo9kaYxuZ+Ewwo39CE7BTS2JDfXkTjZTZqd8H+8KC53eBh516YQnn2oiqxSiKxm7a6pxbxGZGwXOQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.77.8.tgz", + "integrity": "sha512-ND5qZLWUCpOn7LJfOf0gLSZUWhNIysY+7NZK1Ctq+pM6tpJky3JM5I1jSMplNxv5H3o8p80n0gSm+fcjsEFfjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.77.8.tgz", + "integrity": "sha512-7L8zT6xzEvTYj86MvUWnbkWYCNQP+74HvruLILmiPPE+TCgOjgdi750709BtppVJGGZSs40ZuN6mi/YQyGtwXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.77.8.tgz", + "integrity": "sha512-7Buh+4bP0WyYn6XPbthkIa3M2vtcR8QIsFVg3JElVlr+8Ng19jqe0t0SwggDgbMX6AdQZC+Wj4F1BprZSok42A==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.77.8", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.77.8.tgz", + "integrity": "sha512-rZmLIx4/LLQm+4GW39sRJW0MIlDqmyV0fkRzTmhFP5i/wVC7cuj8TUubPHw18rv2rkHFfBZKZJTCkPjCS5Z+SA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/sass-embedded/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -35303,18 +32339,6 @@ "node": ">= 14" } }, - "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, "node_modules/sonic-boom": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", @@ -35379,9 +32403,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.18", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", - "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==", "dev": true }, "node_modules/split2": { @@ -35558,9 +32582,9 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.19.0.tgz", + "integrity": "sha512-5z6CNR4gtkPbwlxyEqoDGDmWIzoNJqCBt4Eac1ICP9YaIT08ct712cFj0u1rx4F8luAuL+3Qc+RFIdI4OX00kg==", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -36025,9 +33049,9 @@ } }, "node_modules/stylelint-scss": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.5.0.tgz", - "integrity": "sha512-yOnYlr71wrTPT3rYyUurgTj6Rw7JUtzsZQsiPEjvs+k/yqoYHdweqpw6XN/ARpxjAuvJpddoMUvV8aAIpvUwTg==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.5.1.tgz", + "integrity": "sha512-ZLqdqihm6uDYkrsOeD6YWb+stZI8Wn92kUNDhE4M+g9g1aCnRv0JlOrttFiAJJwaNzpdQgX3YJb5vDQXVuO9Ww==", "dev": true, "dependencies": { "css-tree": "2.3.1", @@ -36073,9 +33097,9 @@ "dev": true }, "node_modules/stylelint/node_modules/file-entry-cache": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz", - "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", "dev": true, "dependencies": { "flat-cache": "^5.0.0" @@ -36146,9 +33170,9 @@ } }, "node_modules/stylelint/node_modules/supports-hyperlinks": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", - "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "dependencies": { "has-flag": "^4.0.0", @@ -36156,6 +33180,9 @@ }, "engines": { "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/stylelint/node_modules/write-file-atomic": { @@ -36716,9 +33743,9 @@ } }, "node_modules/terser": { - "version": "5.31.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.3.tgz", - "integrity": "sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "peer": true, "dependencies": { @@ -37419,9 +34446,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsscmp": { "version": "1.0.6", @@ -37675,9 +34702,9 @@ } }, "node_modules/undici-types": { - "version": "6.19.6", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.6.tgz", - "integrity": "sha512-e/vggGopEfTKSvj4ihnOLTsqhrKRN3LeO6qSN/GxohhuRv8qH9bNQ4B8W7e/vFL+0XTnmHPB4/kegunZGA4Org==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -38080,9 +35107,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -38118,13 +35145,12 @@ } }, "node_modules/webpack": { - "version": "5.93.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.93.0.tgz", - "integrity": "sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "peer": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -38133,7 +35159,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -38475,9 +35501,9 @@ } }, "node_modules/winston/node_modules/async": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", - "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" }, "node_modules/with": { "version": "7.0.2", diff --git a/scripts/circleci/judge/bulkImportJudgeUsers.helpers.ts b/scripts/circleci/judge/bulkImportJudgeUsers.helpers.ts index 2e0c311c99c..89aa5f59d5d 100644 --- a/scripts/circleci/judge/bulkImportJudgeUsers.helpers.ts +++ b/scripts/circleci/judge/bulkImportJudgeUsers.helpers.ts @@ -19,6 +19,7 @@ export const CSV_HEADERS = [ 'role', 'section', 'isSeniorJudge', + 'judgePhoneNumber', ]; const { DEFAULT_ACCOUNT_PASS } = process.env; diff --git a/scripts/circleci/judge/judge_users.csv b/scripts/circleci/judge/judge_users.csv index f1fa839c86e..b3718dc1de5 100644 --- a/scripts/circleci/judge/judge_users.csv +++ b/scripts/circleci/judge/judge_users.csv @@ -1,88 +1,88 @@ -name,judgeTitle,judgeFullName,email,role,section,isSeniorJudge -Aarons,Judge,Aarons,legacy.judge.aarons@example.com,legacyJudge,legacyJudgesChambers,false -Armen,Special Trial Judge,Armen,legacy.judge.armen@example.com,legacyJudge,legacyJudgesChambers,false -Ashford,Judge,Tamara W. Ashford,judge.ashford@example.com,judge,ashfordsChambers,false -Beghe,Judge,Beghe,legacy.judge.beghe@example.com,legacyJudge,legacyJudgesChambers,false -Buch,Judge,Ronald L. Buch,judge.buch@example.com,judge,buchsChambers,false -Buckley,Special Trial Judge,Buckley,legacy.judge.buckley@example.com,legacyJudge,legacyJudgesChambers,false -Cantrel,Judge,Cantrel,legacy.judge.cantrel@example.com,legacyJudge,legacyJudgesChambers,false -Carluzzo,Chief Special Trial Judge,Lewis R. Carluzzo,stjudge.carluzzo@example.com,judge,carluzzosChambers,false -Chabot,Judge,Chabot,legacy.judge.chabot@example.com,legacyJudge,legacyJudgesChambers,false -Chiechi,Judge,Chiechi,legacy.judge.chiechi@example.com,legacyJudge,legacyJudgesChambers,false -Choi,Special Trial Judge,Eunkyong Choi,legacy.stjudge.choi@example.com,legacyJudge,legacyJudgesChambers,false -Clapp,Judge,Clapp,legacy.judge.clapp@example.com,legacyJudge,legacyJudgesChambers,false -Cohen,Judge,Mary Ann Cohen,judge.cohen@example.com,judge,cohensChambers,true -Colvin,Judge,John O. Colvin,judge.colvin@example.com,legacyJudge,legacyJudgesChambers,true -Copeland,Judge,Elizabeth A. Copeland,judge.copeland@example.com,judge,copelandsChambers,false -Couvillion,Special Trial Judge,Couvillion,legacy.judge.couvillion@example.com,legacyJudge,legacyJudgesChambers,false -Dawson,Judge,Dawson,legacy.judge.dawson@example.com,legacyJudge,legacyJudgesChambers,false -Dean,Special Trial Judge,Dean,legacy.judge.dean@example.com,legacyJudge,legacyJudgesChambers,false -Dinan,Special Trial Judge,Dinan,legacy.judge.dinan@example.com,legacyJudge,legacyJudgesChambers,false -Drennen,Judge,Drennen,legacy.judge.drennen@example.com,legacyJudge,legacyJudgesChambers,false -Fay,Judge,Fay,legacy.judge.fay@example.com,legacyJudge,legacyJudgesChambers,false -Featherston,Judge,Featherston,legacy.judge.featherston@example.com,legacyJudge,legacyJudgesChambers,false -Fried,Special Trial Judge,Zachary S. Fried,stjudge.fried@example.com,judge,friedsChambers,false -Foley,Chief Judge,Maurice B. Foley,judge.foley@example.com,judge,foleysChambers,false -Gale,Judge,Joseph H. Gale,judge.gale@example.com,judge,galesChambers,true -Galloway,Special Trial Judge,Galloway,legacy.judge.galloway@example.com,legacyJudge,legacyJudgesChambers,false -Gerber,Judge,Gerber,legacy.judge.gerber@example.com,legacyJudge,legacyJudgesChambers,false -Goeke,Judge,Joseph Robert Goeke,judge.goeke@example.com,judge,goekesChambers,true -Goffe,Judge,Goffe,legacy.judge.goffe@example.com,legacyJudge,legacyJudgesChambers,false -Goldberg,Special Trial Judge,Goldberg,legacy.judge.goldberg@example.com,legacyJudge,legacyJudgesChambers,false -Greaves,Judge,Travis A. Greaves,judge.greaves@example.com,judge,greavesChambers,false -Gussis,Special Trial Judge,Gussis,legacy.judge.gussis@example.com,legacyJudge,legacyJudgesChambers,false -Gustafson,Judge,David Gustafson,judge.gustafson@example.com,judge,gustafsonsChambers,true -Guy,Special Trial Judge,"Daniel A. Guy, Jr.",stjudge.guy@example.com,legacyJudge,legacyJudgesChambers,false -Haines,Judge,Haines,legacy.judge.haines@example.com,legacyJudge,legacyJudgesChambers,false -Halpern,Judge,James S. Halpern,judge.halpern@example.com,judge,halpernsChambers,true -Hamblen,Judge,Hamblen,legacy.judge.hamblen@example.com,legacyJudge,legacyJudgesChambers,false -Holmes,Judge,Mark V. Holmes,judge.holmes@example.com,judge,holmesChambers,true -Jacobs,Judge,Jacobs,legacy.judge.jacobs@example.com,legacyJudge,legacyJudgesChambers,false -Jones,Judge,Courtney D. Jones,judge.jones@example.com,judge,jonesChambers,false -Kerrigan,Judge,Kathleen Kerrigan,judge.kerrigan@example.com,judge,kerrigansChambers,false -Korner,Judge,Korner,legacy.judge.korner@example.com,legacyJudge,legacyJudgesChambers,false -Kroupa,Judge,Kroupa,legacy.judge.kroupa@example.com,legacyJudge,legacyJudgesChambers,false -Landy,Judge,Adam B. Landy,judge.landy@example.com,judge,landysChambers,false -Laro,Judge,Laro,legacy.judge.laro@example.com,legacyJudge,legacyJudgesChambers,false -Lauber,Judge,Albert G. Lauber,judge.lauber@example.com,judge,laubersChambers,true -Leyden,Special Trial Judge,Diana L. Leyden,stjudge.leyden@example.com,judge,leydensChambers,false -Marshall,Judge,Alina I. Marshall,judge.marshall@example.com,judge,marshallsChambers,false -Marvel,Judge,L. Paige Marvel,judge.marvel@example.com,judge,marvelsChambers,true -Morrison,Judge,Richard T. Morrison,judge.morrison@example.com,judge,morrisonsChambers,true -Nameroff,Judge,Nameroff,legacy.judge.nameroff@example.com,legacyJudge,legacyJudgesChambers,false -Nega,Judge,Joseph W. Nega,judge.nega@example.com,judge,negasChambers,false -Nims,Judge,Nims,legacy.judge.nims@example.com,legacyJudge,legacyJudgesChambers,false -Pajak,Special Trial Judge,Pajak,legacy.judge.pajak@example.com,legacyJudge,legacyJudgesChambers,false -Panuthos,Special Trial Judge,Peter J. Panuthos,stjudge.panuthos@example.com,judge,panuthosChambers,false -Paris,Judge,Elizabeth Crewson Paris,judge.paris@example.com,judge,parisChambers,true -Parker,Judge,Parker,legacy.judge.parker@example.com,legacyJudge,legacyJudgesChambers,false -Parr,Judge,Parr,legacy.judge.parr@example.com,legacyJudge,legacyJudgesChambers,false -Pate,Judge,Pate,legacy.judge.pate@example.com,legacyJudge,legacyJudgesChambers,false -Peterson,Special Trial Judge,Peterson,legacy.judge.peterson@example.com,legacyJudge,legacyJudgesChambers,false -Powell,Special Trial Judge,Powell,legacy.judge.powell@example.com,legacyJudge,legacyJudgesChambers,false -Pugh,Judge,Cary Douglas Pugh,judge.pugh@example.com,judge,pughsChambers,false -Raum,Judge,Raum,legacy.judge.raum@example.com,legacyJudge,legacyJudgesChambers,false -Ruwe,Judge,Robert P. Ruwe,legacy.judge.ruwe@example.com,legacyJudge,legacyJudgesChambers,false -Scott,Judge,Scott,legacy.judge.scott@example.com,legacyJudge,legacyJudgesChambers,false -Shields,Judge,Shields,legacy.judge.shields@example.com,legacyJudge,legacyJudgesChambers,false -Siegel,Special Trial Judge,Jennifer E. Siegel,stjudge.siegel@example.com,judge,siegelsChambers,false -Simpson,Judge,Simpson,legacy.judge.simpson@example.com,legacyJudge,legacyJudgesChambers,false -Sterrett,Judge,Sterrett,legacy.judge.sterrett@example.com,legacyJudge,legacyJudgesChambers,false -Swift,Judge,Swift,legacy.judge.swift@example.com,legacyJudge,legacyJudgesChambers,false -Tannenwald,Judge,Tannenwald,legacy.judge.tannenwald@example.com,legacyJudge,legacyJudgesChambers,false -Thornton,Judge,Michael B. Thornton,judge.thornton@example.com,judge,thorntonsChambers,true -Toro,Judge,Emin Toro,judge.toro@example.com,judge,torosChambers,false -Urda,Judge,Patrick J. Urda,judge.urda@example.com,judge,urdasChambers,false -Vandervort,Special Trial Judge,Vandervort,legacy.judge.vandervort@example.com,legacyJudge,legacyJudgesChambers,false -Vasquez,Judge,Juan F. Vasquez,judge.vasquez@example.com,judge,vasquezsChambers,true -Way,Judge,Kashi Way,judge.way@example.com,judge,waysChambers,false -Weiler,Judge,Christian N. Weiler,judge.weiler@example.com,judge,weilersChambers,false -Wells,Judge,Thomas B. Wells,judge.wells@example.com,judge,wellsChambers,false -Whalen,Judge,Whalen,legacy.judge.whalen@example.com,legacyJudge,legacyJudgesChambers,false -Wherry,Judge,Wherry,legacy.judge.wherry@example.com,legacyJudge,legacyJudgesChambers,false -Whitaker,Judge,Whitaker,legacy.judge.whitaker@example.com,legacyJudge,legacyJudgesChambers,false -Wilbur,Judge,Wilbur,legacy.judge.wilbur@example.com,legacyJudge,legacyJudgesChambers,false -Wiles,Judge,Wiles,legacy.judge.wiles@example.com,legacyJudge,legacyJudgesChambers,false -Williams,Judge,Williams,legacy.judge.williams@example.com,legacyJudge,legacyJudgesChambers,false -Wolfe,Special Trial Judge,Wolfe,legacy.judge.wolfe@example.com,legacyJudge,legacyJudgesChambers,false -Wright,Judge,Wright,legacy.judge.wright@example.com,legacyJudge,legacyJudgesChambers,false +name,judgeTitle,judgeFullName,email,role,section,isSeniorJudge,judgePhoneNumber +Aarons,Judge,Aarons,legacy.judge.aarons@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Armen,Special Trial Judge,Armen,legacy.judge.armen@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Ashford,Judge,Tamara W. Ashford,judge.ashford@example.com,judge,ashfordsChambers,false,(202) 521-0822 +Beghe,Judge,Beghe,legacy.judge.beghe@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Buch,Judge,Ronald L. Buch,judge.buch@example.com,judge,buchsChambers,false,(202) 521-0810 +Buckley,Special Trial Judge,Buckley,legacy.judge.buckley@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Cantrel,Judge,Cantrel,legacy.judge.cantrel@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Carluzzo,Chief Special Trial Judge,Lewis R. Carluzzo,stjudge.carluzzo@example.com,judge,carluzzosChambers,false,(202) 521-3339 +Chabot,Judge,Chabot,legacy.judge.chabot@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Chiechi,Judge,Chiechi,legacy.judge.chiechi@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Choi,Special Trial Judge,Eunkyong Choi,legacy.stjudge.choi@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Clapp,Judge,Clapp,legacy.judge.clapp@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Cohen,Judge,Mary Ann Cohen,judge.cohen@example.com,judge,cohensChambers,true,(202) 521-0655 +Colvin,Judge,John O. Colvin,judge.colvin@example.com,legacyJudge,legacyJudgesChambers,true,(202) 521-0662 +Copeland,Judge,Elizabeth A. Copeland,judge.copeland@example.com,judge,copelandsChambers,false,(202) 521-0670 +Couvillion,Special Trial Judge,Couvillion,legacy.judge.couvillion@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Dawson,Judge,Dawson,legacy.judge.dawson@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Dean,Special Trial Judge,Dean,legacy.judge.dean@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Dinan,Special Trial Judge,Dinan,legacy.judge.dinan@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Drennen,Judge,Drennen,legacy.judge.drennen@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Fay,Judge,Fay,legacy.judge.fay@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Featherston,Judge,Featherston,legacy.judge.featherston@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Foley,Chief Judge,Maurice B. Foley,judge.foley@example.com,judge,foleysChambers,false,(202) 521-0681 +Fried,Special Trial Judge,Zachary S. Fried,stjudge.fried@example.com,judge,friedsChambers,false,(202) 521-0867 +Gale,Judge,Joseph H. Gale,judge.gale@example.com,judge,galesChambers,true,(202) 521-0688 +Galloway,Special Trial Judge,Galloway,legacy.judge.galloway@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Gerber,Judge,Gerber,legacy.judge.gerber@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Goeke,Judge,Joseph Robert Goeke,judge.goeke@example.com,judge,goekesChambers,true,(202) 521-0690 +Goffe,Judge,Goffe,legacy.judge.goffe@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Goldberg,Special Trial Judge,Goldberg,legacy.judge.goldberg@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Greaves,Judge,Travis A. Greaves,judge.greaves@example.com,judge,greavesChambers,false,(202) 521-0736 +Gussis,Special Trial Judge,Gussis,legacy.judge.gussis@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Gustafson,Judge,David Gustafson,judge.gustafson@example.com,judge,gustafsonsChambers,true,(202) 521-0850 +Guy,Special Trial Judge,"Daniel A. Guy, Jr.",stjudge.guy@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Haines,Judge,Haines,legacy.judge.haines@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Halpern,Judge,James S. Halpern,judge.halpern@example.com,judge,halpernsChambers,true,(202) 521-0707 +Hamblen,Judge,Hamblen,legacy.judge.hamblen@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Holmes,Judge,Mark V. Holmes,judge.holmes@example.com,judge,holmesChambers,true,(202) 521-0714 +Jacobs,Judge,Jacobs,legacy.judge.jacobs@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Jones,Judge,Courtney D. Jones,judge.jones@example.com,judge,jonesChambers,false,(202) 521-0795 +Kerrigan,Judge,Kathleen Kerrigan,judge.kerrigan@example.com,judge,kerrigansChambers,false,(202) 521-0777 +Korner,Judge,Korner,legacy.judge.korner@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Kroupa,Judge,Kroupa,legacy.judge.kroupa@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Landy,Judge,Adam B. Landy,judge.landy@example.com,judge,landysChambers,false,(202) 521-0835 +Laro,Judge,Laro,legacy.judge.laro@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Lauber,Judge,Albert G. Lauber,judge.lauber@example.com,judge,laubersChambers,true,(202) 521-0785 +Leyden,Special Trial Judge,Diana L. Leyden,stjudge.leyden@example.com,judge,leydensChambers,false,(202) 521-0823 +Marshall,Judge,Alina I. Marshall,judge.marshall@example.com,judge,marshallsChambers,false,(202) 521-0738 +Marvel,Judge,L. Paige Marvel,judge.marvel@example.com,judge,marvelsChambers,true,(202) 521-0740 +Morrison,Judge,Richard T. Morrison,judge.morrison@example.com,judge,morrisonsChambers,true,(202) 521-0853 +Nameroff,Judge,Nameroff,legacy.judge.nameroff@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Nega,Judge,Joseph W. Nega,judge.nega@example.com,judge,negasChambers,false,(202) 521-0640 +Nims,Judge,Nims,legacy.judge.nims@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Pajak,Special Trial Judge,Pajak,legacy.judge.pajak@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Panuthos,Special Trial Judge,Peter J. Panuthos,stjudge.panuthos@example.com,judge,panuthosChambers,false,(202) 521-4707 +Paris,Judge,Elizabeth Crewson Paris,judge.paris@example.com,judge,parisChambers,true,(202) 521-0839 +Parker,Judge,Parker,legacy.judge.parker@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Parr,Judge,Parr,legacy.judge.parr@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Pate,Judge,Pate,legacy.judge.pate@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Peterson,Special Trial Judge,Peterson,legacy.judge.peterson@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Powell,Special Trial Judge,Powell,legacy.judge.powell@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Pugh,Judge,Cary Douglas Pugh,judge.pugh@example.com,judge,pughsChambers,false,(202) 521-0824 +Raum,Judge,Raum,legacy.judge.raum@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Ruwe,Judge,Robert P. Ruwe,legacy.judge.ruwe@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Scott,Judge,Scott,legacy.judge.scott@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Shields,Judge,Shields,legacy.judge.shields@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Siegel,Special Trial Judge,Jennifer E. Siegel,stjudge.siegel@example.com,judge,siegelsChambers,false,(202) 521-0720 +Simpson,Judge,Simpson,legacy.judge.simpson@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Sterrett,Judge,Sterrett,legacy.judge.sterrett@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Swift,Judge,Swift,legacy.judge.swift@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Tannenwald,Judge,Tannenwald,legacy.judge.tannenwald@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Thornton,Judge,Michael B. Thornton,judge.thornton@example.com,judge,thorntonsChambers,true,(202) 521-0766 +Toro,Judge,Emin Toro,judge.toro@example.com,judge,torosChambers,false,(202) 521-0760 +Urda,Judge,Patrick J. Urda,judge.urda@example.com,judge,urdasChambers,false,(202) 521-0800 +Vandervort,Special Trial Judge,Vandervort,legacy.judge.vandervort@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Vasquez,Judge,Juan F. Vasquez,judge.vasquez@example.com,judge,vasquezsChambers,true,(202) 521-0778 +Way,Judge,Kashi Way,judge.way@example.com,judge,waysChambers,false,(123) 123-1234 +Weiler,Judge,Christian N. Weiler,judge.weiler@example.com,judge,weilersChambers,false,(202) 521-0649 +Wells,Judge,Thomas B. Wells,judge.wells@example.com,judge,wellsChambers,false,(123) 123-1234 +Whalen,Judge,Whalen,legacy.judge.whalen@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Wherry,Judge,Wherry,legacy.judge.wherry@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Whitaker,Judge,Whitaker,legacy.judge.whitaker@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Wilbur,Judge,Wilbur,legacy.judge.wilbur@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Wiles,Judge,Wiles,legacy.judge.wiles@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Williams,Judge,Williams,legacy.judge.williams@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Wolfe,Special Trial Judge,Wolfe,legacy.judge.wolfe@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 +Wright,Judge,Wright,legacy.judge.wright@example.com,legacyJudge,legacyJudgesChambers,false,(123) 123-1234 diff --git a/scripts/run-once-scripts/add-new-judge.ts b/scripts/run-once-scripts/add-new-judge.ts deleted file mode 100644 index 56d8d796182..00000000000 --- a/scripts/run-once-scripts/add-new-judge.ts +++ /dev/null @@ -1,75 +0,0 @@ -import { createApplicationContext } from '@web-api/applicationContext'; -import { environment } from '@web-api/environment'; -import { - getDestinationTableInfo, - getUserPoolId, - requireEnvVars, -} from '../../shared/admin-tools/util'; -import { User } from '../../shared/src/business/entities/User'; -import { Role } from '../../shared/src/business/entities/EntityConstants'; - -requireEnvVars(['ENV']); - -// eslint-disable-next-line @typescript-eslint/no-floating-promises -(async () => { - const applicationContext = createApplicationContext(); - - // used to set testable email on lower envs - // const email = process.argv[2]; - - const email = 'judge.way@ustaxcourt.gov'; - const judgeFullName = 'Kashi Way'; - const name = 'Way'; - const section = 'waysChambers'; - - const isSeniorJudge = false; - const judgeTitle = 'Judge'; - const role = 'judge'; - const userId = applicationContext.getUniqueId(); - - const userPoolId = await getUserPoolId(); - - environment.userPoolId = userPoolId; - const { tableName } = await getDestinationTableInfo(); - environment.dynamoDbTableName = tableName; - - const cognitoCall: { - email: string; - role: Role; - name: string; - userId: string; - poolId?: string; - temporaryPassword?: string; - sendWelcomeEmail: boolean; - } = { - email, - role, - name, - userId, - poolId: userPoolId, - sendWelcomeEmail: true, - }; - - const dynamoUserInfo = { - email, - role, - name, - userId, - judgeFullName, - section, - judgeTitle, - isSeniorJudge, - }; - - await applicationContext - .getUserGateway() - .createUser(applicationContext, cognitoCall); - - const rawUser = new User(dynamoUserInfo).validate().toRawObject(); - - await applicationContext.getPersistenceGateway().createUserRecords({ - applicationContext, - user: rawUser, - userId: rawUser.userId, - }); -})(); diff --git a/scripts/run-once-scripts/add-phone-numbers-to-judge-records.ts b/scripts/run-once-scripts/add-phone-numbers-to-judge-records.ts new file mode 100644 index 00000000000..683c432336c --- /dev/null +++ b/scripts/run-once-scripts/add-phone-numbers-to-judge-records.ts @@ -0,0 +1,61 @@ +#!/usr/bin/env npx ts-node --transpile-only +/* +We used to hard-code information for judges' chambers. +The only piece of data not in our DB was the phone +number. This script therefore adds the phone number +to the relevant DB records. +*/ + +import { createApplicationContext } from '@web-api/applicationContext'; +import { environment } from '@web-api/environment'; +import * as client from '../../web-api/src/persistence/dynamodbClientService'; +import { + requireEnvVars, + getDestinationTableInfo, +} from '../../shared/admin-tools/util'; +import { RawUser } from '../../shared/src/business/entities/User'; +import { getTestJudgesChambers } from '../../shared/src/test/mockJudgesChambers'; + +requireEnvVars(['ENV']); + +const OLD_HARDCODED_CHAMBERS_DATA = getTestJudgesChambers(); + +const getPhoneNumberForJudgeUser = (judgeUser: RawUser): string | undefined => { + return Object.values(OLD_HARDCODED_CHAMBERS_DATA).find( + data => data.judgeFullName === judgeUser.judgeFullName, + )?.phoneNumber; +}; + +(async () => { + const applicationContext = createApplicationContext(); + + const { tableName } = await getDestinationTableInfo(); + environment.dynamoDbTableName = tableName; + + // Get all of the existing judge user records + const judgeUsers: RawUser[] = await applicationContext + .getPersistenceGateway() + .getUsersInSection({ + applicationContext, + section: 'judge', + }); + + let totalUpdated = 0; + // For each judge user record, we get the relevant phone number. + // Then we update the record so that the phone number is stored on the record. + for (const judgeUser of judgeUsers) { + const phoneNumber = getPhoneNumberForJudgeUser(judgeUser); + if (!phoneNumber) { + console.error( + `Could not get phone number for ${judgeUser.judgeFullName}.`, + ); + continue; + } + judgeUser.judgePhoneNumber = phoneNumber; + await client.put({ applicationContext, Item: judgeUser }); + totalUpdated += 1; + console.log(`Updated ${judgeUser.judgeFullName}`); + } + + console.log(`\nUpdated ${totalUpdated} out of ${judgeUsers.length} judges`); +})(); diff --git a/scripts/run-once-scripts/promote-special-trial-judge.ts b/scripts/run-once-scripts/promote-special-trial-judge.ts deleted file mode 100644 index 2ca046f2172..00000000000 --- a/scripts/run-once-scripts/promote-special-trial-judge.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { createApplicationContext } from '@web-api/applicationContext'; -import { environment } from '@web-api/environment'; -import { - getDestinationTableInfo, - getUserPoolId, - requireEnvVars, -} from '../../shared/admin-tools/util'; -import { User } from '../../shared/src/business/entities/User'; -requireEnvVars(['ENV']); -// eslint-disable-next-line @typescript-eslint/no-floating-promises -(async () => { - // 'stjudge.landy@ustaxcourt.gov'; // OLD - // 'judge.landy@ustaxcourt.gov'; // NEW - - const oldEmail = process.argv[2]; - const newEmail = process.argv[3]; - - const applicationContext = createApplicationContext(); - const userPoolId = await getUserPoolId(); - - environment.userPoolId = userPoolId; - const { tableName } = await getDestinationTableInfo(); - environment.dynamoDbTableName = tableName; - - const { userId } = await applicationContext - .getUserGateway() - .getUserByEmail(applicationContext, { - poolId: userPoolId, - email: oldEmail, - }); - - // simpler than updating only judgeTitle and email fields in dynamo - const dynamoUser = await applicationContext - .getPersistenceGateway() - .getUserById({ - applicationContext, - userId, - }); - - dynamoUser.email = newEmail; - dynamoUser.judgeTitle = 'Judge'; - - const rawUser = new User(dynamoUser).validate().toRawObject(); - - await applicationContext.getUserGateway().updateUser(applicationContext, { - attributesToUpdate: { - email: newEmail, - }, - email: oldEmail, - poolId: userPoolId, - }); - - await applicationContext.getPersistenceGateway().createUserRecords({ - applicationContext, - user: rawUser, - userId: rawUser.userId, - }); -})(); diff --git a/scripts/user/add-judge.ts b/scripts/user/add-judge.ts new file mode 100644 index 00000000000..8aa717077f0 --- /dev/null +++ b/scripts/user/add-judge.ts @@ -0,0 +1,127 @@ +#!/usr/bin/env npx ts-node --transpile-only +import { JudgeTitle } from '../../shared/src/business/entities/EntityConstants'; +import { RawUser, User } from '@shared/business/entities/User'; +import { createApplicationContext } from '@web-api/applicationContext'; +import { createOrUpdateUser } from 'shared/admin-tools/user/admin'; +import { + emailIsInExpectedFormat, + expectedEmailFormats, + expectedJudgeTitles, + getChambersNameFromJudgeName, + judgeTitleIsInExpectedFormat, + phoneIsInExpectedFormat, + promptUser, +} from 'scripts/user/add-or-update-judge-helpers'; +import { environment } from '@web-api/environment'; +import { + getDestinationTableInfo, + getUserPoolId, + requireEnvVars, +} from '../../shared/admin-tools/util'; +import { sendWelcomeEmail } from 'scripts/user/email-helpers'; + +// eslint-disable-next-line spellcheck/spell-checker +/** + * This script will add a judge user to a deployed environment. + * It creates both the Cognito record and the associated Dynamo record. + * Required parameters: name, judgeFullName, and email + * Optional parameters: phone (defaults to none), isSeniorJudge (defaults to false), judgeTitle (defaults to "Judge") + * Note that a phone number is eventually required; otherwise, trial information will + * lack a chambers number. To add one later, use update-judge.ts. + * + * Example usage: + * + * $ npx ts-node --transpile-only add-judge.ts Way "Kashi Way" judge.way@ustaxcourt.gov ["(123) 123-1234" false "Special Trial Judge"] + * + * Note that this script SHOULD be temporary: it is meant as a slight improvement from the current ill-defined process. + * Please extract into application logic! + */ + +requireEnvVars(['ENV']); + +// eslint-disable-next-line @typescript-eslint/no-floating-promises +(async () => { + const applicationContext = createApplicationContext(); + + // Required + const name = process.argv[2]; + const judgeFullName = process.argv[3]; + const email = process.argv[4]; + + // Optional, though a phone number needs to be provided eventually + // otherwise the chambers will have no associated phone number on trial info + const phone = process.argv[5]; + const isSeniorJudge = process.argv[6] + ? process.argv[6].toLowerCase() === 'true' + : false; + const judgeTitle = process.argv[7] ? process.argv[7] : 'Judge'; + + // Check for mistaken emails + if (!emailIsInExpectedFormat({ email, judgeName: name })) { + const userInput = await promptUser( + `Warning: The email you entered does not match expected formats: ${expectedEmailFormats(name).join(', ')}. Continue anyway? y/n `, + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + + // Check for mistaken phone numbers + if (phone && !phoneIsInExpectedFormat(phone)) { + const userInput = await promptUser( + 'Warning: The phone number you entered does not match the expected format: (XXX) XXX-XXXX. Continue anyway? y/n ', + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + + // Check for mistaken judgeTitle + if (!judgeTitleIsInExpectedFormat(judgeTitle)) { + const userInput = await promptUser( + `Warning: The judgeTitle you entered does not match expected values: ${expectedJudgeTitles.join(', ')}. Continue anyway? y/n `, + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + + console.log('Setting up information to store ... '); + const section = getChambersNameFromJudgeName(name); + const role = 'judge'; + + environment.userPoolId = await getUserPoolId(); + const { tableName } = await getDestinationTableInfo(); + environment.dynamoDbTableName = tableName; + + let dynamoUserInfo: RawUser = { + email, + entityName: 'User', + isSeniorJudge, + judgeFullName, + judgePhoneNumber: phone, + judgeTitle: judgeTitle as JudgeTitle, + name, + role, + section, + userId: applicationContext.getUniqueId(), // Silly as this will be overwritten, but we need one for validation + }; + const rawUser = new User(dynamoUserInfo).validate().toRawObject(); + + console.log('Adding user information to Dynamo and Cognito ... '); + const { userId } = await createOrUpdateUser(applicationContext, { + password: environment.defaultAccountPass, + setPasswordAsPermanent: true, + user: rawUser, + }); + + console.log('Sending welcome email ... '); + await sendWelcomeEmail({ applicationContext, email }); + + console.log( + `\nSuccess! Created Judge ${judgeFullName} with userId = ${userId} and email = ${email}.`, + ); + console.log( + 'If you need to update this judge, run update-judge.ts using this email.\n', + ); +})(); diff --git a/scripts/user/add-or-update-judge-helpers.ts b/scripts/user/add-or-update-judge-helpers.ts new file mode 100644 index 00000000000..19926b3f5ce --- /dev/null +++ b/scripts/user/add-or-update-judge-helpers.ts @@ -0,0 +1,53 @@ +import * as readline from 'node:readline/promises'; + +const defaultEmailHost = 'ustaxcourt.gov'; + +export const getChambersNameFromJudgeName = (judgeName: string) => { + return judgeName.endsWith('s') + ? `${judgeName}Chambers` + : `${judgeName}sChambers`; +}; + +export async function promptUser(query: string): Promise { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + const answer = await rl.question(query); + rl.close(); + return answer; +} + +export const expectedEmailFormats = (name: string): string[] => { + const lowerCaseName = name.toLowerCase(); + return [ + `stjudge.${lowerCaseName}@${defaultEmailHost}`, // Special Trial judges + `judge.${lowerCaseName}@${defaultEmailHost}`, // Regular judges + ]; +}; + +export const emailIsInExpectedFormat = ({ + email, + judgeName, +}: { + judgeName: string; + email: string; +}): boolean => { + return expectedEmailFormats(judgeName).includes(email.toLowerCase()); +}; + +export const phoneIsInExpectedFormat = (phone: string) => { + const phoneRegex = /^\(\d{3}\) \d{3}-\d{4}$/; + return phoneRegex.test(phone); +}; + +export const expectedJudgeTitles = [ + 'Judge', + 'Special Trial Judge', + 'Chief Judge', + 'Chief Special Trial Judge', +]; + +export const judgeTitleIsInExpectedFormat = (judgeTitle: string): boolean => { + return expectedJudgeTitles.includes(judgeTitle); +}; diff --git a/scripts/user/add-user.ts b/scripts/user/add-user.ts index fff700e2863..44237a33bc5 100644 --- a/scripts/user/add-user.ts +++ b/scripts/user/add-user.ts @@ -1,3 +1,4 @@ +import { RawUser } from '@shared/business/entities/User'; import { createApplicationContext } from '@web-api/applicationContext'; import { createOrUpdateUser } from 'shared/admin-tools/user/admin'; import { environment } from '@web-api/environment'; @@ -6,10 +7,20 @@ import { getUserPoolId, requireEnvVars, } from '../../shared/admin-tools/util'; +import { judgeUser } from '@shared/test/mockUsers'; +import { mockJudgeUser } from '@shared/test/mockAuthUsers'; +import { sendWelcomeEmail } from 'scripts/user/email-helpers'; import joi from 'joi'; requireEnvVars(['ENV', 'DEFAULT_ACCOUNT_PASS']); +interface UserParamsInterface { + email: string; + name: string; + role: string; + section: string; +} + const usage = error => { if (error) { console.log(`\nERROR: ${error}\n`); @@ -38,9 +49,16 @@ const usage = error => { process.exit(); }; -const applicationContext = createApplicationContext({}); +// We create the context as a judge user to have permissions to access the chambers interactor +const applicationContext = createApplicationContext(judgeUser); -const checkParams = params => { +const checkParams = ({ + params, + validChambersSections, +}: { + params: UserParamsInterface; + validChambersSections: string[]; +}) => { const schema = joi.object().keys({ email: joi.string().email().required(), name: joi.string().required(), @@ -73,40 +91,7 @@ const checkParams = params => { 'floater', 'general', 'reportersOffice', - 'ashfordsChambers', - 'buchsChambers', - 'cohensChambers', - 'copelandsChambers', - 'foleysChambers', - 'friedsChambers', - 'galesChambers', - 'goekesChambers', - 'greavesChambers', - 'gustafsonsChambers', - 'halpernsChambers', - 'holmesChambers', - 'jonesChambers', - 'kerrigansChambers', - 'landysChambers', - 'laubersChambers', - 'marshallsChambers', - 'marvelsChambers', - 'morrisonsChambers', - 'negasChambers', - 'parisChambers', - 'pughsChambers', - 'siegelsChambers', - 'thorntonsChambers', - 'torosChambers', - 'urdasChambers', - 'vasquezsChambers', - 'waysChambers', - 'weilersChambers', - 'wellsChambers', - 'carluzzosChambers', - 'guysChambers', - 'leydensChambers', - 'panuthosChambers', + ...validChambersSections, ], ), }); @@ -119,34 +104,31 @@ const checkParams = params => { return value; }; -const sendWelcomeEmail = async ({ email }) => { - try { - await applicationContext.getCognito().adminCreateUser({ - MessageAction: 'RESEND', - UserPoolId: environment.userPoolId, - Username: email.toLowerCase(), - }); - } catch (err) { - console.error('Error sending welcome email', err); - } -}; - // eslint-disable-next-line @typescript-eslint/no-floating-promises (async () => { - const params = { + const { tableName } = await getDestinationTableInfo(); + environment.dynamoDbTableName = tableName; + + const judgeUsers: RawUser[] = await applicationContext + .getUseCases() + .getUsersInSectionInteractor( + applicationContext, + { section: 'judge' }, + mockJudgeUser, + ); + const validChambersSections = judgeUsers.map(user => user.section!); + const params: UserParamsInterface = { email: process.argv[2], name: process.argv[3], role: process.argv[4], section: process.argv[5], }; - checkParams(params); + checkParams({ params, validChambersSections }); environment.userPoolId = await getUserPoolId(); - const { tableName } = await getDestinationTableInfo(); - environment.dynamoDbTableName = tableName; await createOrUpdateUser(applicationContext, { password: environment.defaultAccountPass, setPasswordAsPermanent: true, - user: params, + user: { ...params }, }); - await sendWelcomeEmail({ email: params.email }); + await sendWelcomeEmail({ applicationContext, email: params.email }); })(); diff --git a/scripts/user/email-helpers.ts b/scripts/user/email-helpers.ts new file mode 100644 index 00000000000..ae0cd29b2a0 --- /dev/null +++ b/scripts/user/email-helpers.ts @@ -0,0 +1,13 @@ +import { environment } from '@web-api/environment'; + +export const sendWelcomeEmail = async ({ applicationContext, email }) => { + try { + await applicationContext.getCognito().adminCreateUser({ + MessageAction: 'RESEND', + UserPoolId: environment.userPoolId, + Username: email.toLowerCase(), + }); + } catch (err) { + console.error('Error sending welcome email', err); + } +}; diff --git a/scripts/user/update-judge.ts b/scripts/user/update-judge.ts new file mode 100644 index 00000000000..9e64811ddda --- /dev/null +++ b/scripts/user/update-judge.ts @@ -0,0 +1,317 @@ +#!/usr/bin/env npx ts-node --transpile-only +import * as client from '../../web-api/src/persistence/dynamodbClientService'; +import { JudgeTitle } from '@shared/business/entities/EntityConstants'; +import { User } from '@shared/business/entities/User'; +import { UserRecord } from '@web-api/persistence/dynamo/dynamoTypes'; +import { createApplicationContext } from '@web-api/applicationContext'; +import { + emailIsInExpectedFormat, + expectedEmailFormats, + expectedJudgeTitles, + getChambersNameFromJudgeName, + judgeTitleIsInExpectedFormat, + phoneIsInExpectedFormat, + promptUser, +} from 'scripts/user/add-or-update-judge-helpers'; +import { environment } from '@web-api/environment'; +import { + getDestinationTableInfo, + getUserPoolId, + requireEnvVars, +} from '../../shared/admin-tools/util'; +import { isEmpty } from 'lodash'; + +// eslint-disable-next-line spellcheck/spell-checker +/** + * This script will update the judge user in a deployed environment. + * It updates both the Cognito record (if necessary) and the associated Dynamo record. + * Required parameters: the current email of the judge to update + * Optional parameters (although at least one required): --name, --judgeFullName, --judgeTitle, --email, --phone, --isSeniorJudge + * + * Example usage: + * + * $ npx ts-node --transpile-only update-judge.ts judge.someone.ustaxcourt.gov --name Way --judgeFullName "Kashi Way" --judgeTitle Judge --email judge.way@ustaxcourt.gov --phone "(123) 123-1234" --isSeniorJudge true + * + * Note that this script SHOULD be temporary: it is meant as a slight improvement from the current ill-defined process. + * Please extract into application logic! + */ + +requireEnvVars(['ENV']); + +const getArgValue = (param: string): string => { + const args = process.argv.slice(3); // Skip the first three arguments (node, script path, and id) + const index = args.indexOf(`--${param}`); + if (index !== -1 && index + 1 < args.length) { + return args[index + 1]; + } + return ''; +}; + +const validateUpdates = ({ updates }: { updates: Record }) => { + if (!Object.values(updates).some(update => update !== '')) { + throw new Error('Nothing to update!'); + } + if ( + updates.isSeniorJudge && + !['true', 'false'].includes(updates.isSeniorJudge) + ) { + throw new Error('isSeniorJudge must be blank or either true/false'); + } +}; + +const updateCognitoRecord = async ({ + applicationContext, + currentEmail, + updates, + userPoolId, +}: { + updates: Record; + applicationContext: any; + currentEmail: string; + userPoolId: string; +}) => { + console.log('Setting up the updated Cognito user info ...'); + const cognitoAttributesToUpdate = {} as { name: string; email: string }; + if (updates.name) { + cognitoAttributesToUpdate.name = updates.name; + } + if (updates.email) { + cognitoAttributesToUpdate.email = updates.email; + } + if (!isEmpty(cognitoAttributesToUpdate)) { + console.log('Updating the user Cognito record ...'); + await applicationContext.getUserGateway().updateUser(applicationContext, { + attributesToUpdate: cognitoAttributesToUpdate, + email: currentEmail, + poolId: userPoolId, + }); + } else { + console.log('Nothing to update in Cognito, continuing ...'); + } +}; + +const updateDynamoRecords = async ({ + applicationContext, + updates, + userId, +}: { + updates: Record; + userId: string; + applicationContext: any; +}) => { + console.log('Getting existing Dynamo record ...'); + const dynamoUser: UserRecord = await applicationContext + .getPersistenceGateway() + .getUserById({ applicationContext, userId }); + + // If the name is updated, then we will need to update the chambers section + const oldChambersSection = dynamoUser.section; + const updatedChambersSection = + updates.name && updates.name != dynamoUser.name // No need to update if same name + ? getChambersNameFromJudgeName(updates.name) + : ''; + + await updateDynamoJudgeUserRecord({ + applicationContext, + chambersSection: updatedChambersSection || oldChambersSection!, + dynamoUser, + updates, + }); + + if (updatedChambersSection) { + await updateDynamoChambersRecords({ + applicationContext, + oldChambersSection, + updatedChambersSection, + userId, + }); + } + return dynamoUser; +}; + +const updateDynamoJudgeUserRecord = async ({ + applicationContext, + chambersSection, + dynamoUser, + updates, +}: { + updates: Record; + dynamoUser: UserRecord; + applicationContext: any; + chambersSection: string; +}) => { + console.log('Updating the judge user Dynamo record ...'); + dynamoUser.email = updates.email || dynamoUser.email; + dynamoUser.name = updates.name || dynamoUser.name; + dynamoUser.judgePhoneNumber = updates.phone + ? updates.phone + : dynamoUser.phone; + dynamoUser.isSeniorJudge = + updates.isSeniorJudge != '' + ? updates.isSeniorJudge.toLowerCase() === 'true' + : dynamoUser.isSeniorJudge; + dynamoUser.judgeFullName = updates.judgeFullName || dynamoUser.judgeFullName; + dynamoUser.section = chambersSection; + dynamoUser.judgeTitle = + (updates.judgeTitle as JudgeTitle) || dynamoUser.judgeTitle; + + const rawUser = new User(dynamoUser).validate().toRawObject(); + + console.log('Updating the Dynamo record ...'); + await applicationContext.getPersistenceGateway().updateUser({ + applicationContext, + user: rawUser, + }); +}; + +const createUserChambersSectionRecord = async ({ + applicationContext, + chambersSection, + userId, +}) => { + await client.put({ + Item: { + pk: `section|${chambersSection}`, + sk: `user|${userId}`, + }, + applicationContext, + }); +}; + +const updateDynamoChambersRecords = async ({ + applicationContext, + oldChambersSection, + updatedChambersSection, + userId, +}) => { + console.log('Chambers section needs to be updated.'); + console.log(`Adding a record for ${updatedChambersSection}`); + // If there is no old chambers section, we only need to add the section record + if (!oldChambersSection) { + await createUserChambersSectionRecord({ + applicationContext, + chambersSection: updatedChambersSection, + userId, + }); + return; + } + + // Otherwise, we need to update existing records for every chambers member, including the judge + console.log( + `Updating members of ${oldChambersSection} to be members of ${updatedChambersSection} ...`, + ); + const chambersUsers: User[] = await applicationContext + .getPersistenceGateway() + .getUsersInSection({ applicationContext, section: oldChambersSection }); + + for (let chambersUser of chambersUsers) { + console.log(`Updating ${chambersUser.role} user ${chambersUser.userId}`); + chambersUser.section = updatedChambersSection; + const rawChambersUser = new User(chambersUser).validate().toRawObject(); + + // Update the user record, create the section record, and remove the old section record + await applicationContext.getPersistenceGateway().updateUser({ + applicationContext, + user: rawChambersUser, + }); + await createUserChambersSectionRecord({ + applicationContext, + chambersSection: updatedChambersSection, + userId: chambersUser.userId, + }); + await client.remove({ + applicationContext, + key: { + pk: `section|${oldChambersSection}`, + sk: `user|${chambersUser.userId}`, + }, + }); + } +}; + +// eslint-disable-next-line @typescript-eslint/no-floating-promises, complexity +(async () => { + const applicationContext = createApplicationContext(); + + const currentEmail = process.argv[2]; + + const updates = { + email: getArgValue('email'), + isSeniorJudge: getArgValue('isSeniorJudge'), + judgeFullName: getArgValue('judgeFullName'), + judgeTitle: getArgValue('judgeTitle'), + name: getArgValue('name'), + phone: getArgValue('phone'), + }; + validateUpdates({ updates }); + + const userPoolId = await getUserPoolId(); + environment.userPoolId = userPoolId; + const { tableName } = await getDestinationTableInfo(); + environment.dynamoDbTableName = tableName; + + console.log('Getting the Cognito record for the user ...'); + const existingCognitoRecord = await applicationContext + .getUserGateway() + .getUserByEmail(applicationContext, { + email: currentEmail, + poolId: userPoolId, + }); + + if (!existingCognitoRecord) { + throw new Error(`Cannot find user with email ${currentEmail}`); + } + + const { name: currentName, userId } = existingCognitoRecord; + + if ( + updates.email && + !emailIsInExpectedFormat({ + email: updates.email, + judgeName: updates.name || currentName, + }) + ) { + const userInput = await promptUser( + `Warning: The email you entered does not match expected formats: ${expectedEmailFormats(updates.name || currentName).join(', ')}. Continue anyway? y/n `, + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + if (updates.phone && !phoneIsInExpectedFormat(updates.phone)) { + const userInput = await promptUser( + 'Warning: The phone number you entered does not match the expected format: (XXX) XXX-XXXX. Continue anyway? y/n ', + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + if (updates.judgeTitle && !judgeTitleIsInExpectedFormat(updates.judgeTitle)) { + const userInput = await promptUser( + `Warning: The judgeTitle you entered does not match expected values: ${expectedJudgeTitles.join(', ')}. Continue anyway? y/n `, + ); + if (userInput.toLowerCase() !== 'y') { + return; + } + } + + await updateCognitoRecord({ + applicationContext, + currentEmail, + updates, + userPoolId, + }); + + const updatedDynamoUser = await updateDynamoRecords({ + applicationContext, + updates, + userId, + }); + + console.log( + `\n\nSuccess! Updated Judge ${updatedDynamoUser.judgeFullName}. Current email = ${updatedDynamoUser.email}.`, + ); + console.log( + 'If you need to update this judge further (including an update to undo this update), run update-judge.ts using this email.\n\n', + ); +})(); diff --git a/shared/src/business/entities/EntityConstants.ts b/shared/src/business/entities/EntityConstants.ts index b72fb1c20c3..a5568cdd067 100644 --- a/shared/src/business/entities/EntityConstants.ts +++ b/shared/src/business/entities/EntityConstants.ts @@ -910,7 +910,10 @@ export type PaymentStatusTypes = export const PROCEDURE_TYPES_MAP = { regular: 'Regular', small: 'Small', -}; +} as const; + +export type ProcedureType = + (typeof PROCEDURE_TYPES_MAP)[keyof typeof PROCEDURE_TYPES_MAP]; export const PROCEDURE_TYPES = [ PROCEDURE_TYPES_MAP.regular, @@ -963,7 +966,10 @@ export const AUTOMATIC_BLOCKED_REASONS = { dueDate: 'Due Date', pending: 'Pending Item', pendingAndDueDate: 'Pending Item and Due Date', -}; +} as const; + +export type AutomaticBlockedReasons = + (typeof AUTOMATIC_BLOCKED_REASONS)[keyof typeof AUTOMATIC_BLOCKED_REASONS]; export const CUSTOM_CASE_REPORT_PAGE_SIZE = 100; @@ -1062,7 +1068,11 @@ export const FILING_TYPES = { 'A business', 'Other', ], -}; +} as const; + +export type FilingType = + | (typeof FILING_TYPES)['petitioner'][number] + | (typeof FILING_TYPES)['privatePractitioner'][number]; export const ANSWER_CUTOFF_AMOUNT_IN_DAYS = 45; diff --git a/shared/src/business/entities/PrivatePractitioner.ts b/shared/src/business/entities/PrivatePractitioner.ts index 42109ee8a68..fbf0d050bfa 100644 --- a/shared/src/business/entities/PrivatePractitioner.ts +++ b/shared/src/business/entities/PrivatePractitioner.ts @@ -8,7 +8,7 @@ export class PrivatePractitioner extends User { public entityName: string; public barNumber: string; public firmName: string; - public representing: string; + public representing: string[]; public serviceIndicator: string; constructor(rawUser, { filtered = false } = {}) { diff --git a/shared/src/business/entities/User.ts b/shared/src/business/entities/User.ts index 689aa0e01e2..14cb6914ef1 100644 --- a/shared/src/business/entities/User.ts +++ b/shared/src/business/entities/User.ts @@ -37,6 +37,7 @@ export class User extends JoiValidationEntity { public judgeTitle?: JudgeTitle; public section?: string; public isSeniorJudge?: boolean; + public judgePhoneNumber?: string; constructor(rawUser, { filtered = false } = {}) { super('User'); @@ -53,7 +54,20 @@ export class User extends JoiValidationEntity { this.token = rawUser.token; this.userId = rawUser.userId; this.isUpdatingInformation = rawUser.isUpdatingInformation; - if (rawUser.contact) { + this.setContactInformation(rawUser); + if (this.role === ROLES.judge || this.role === ROLES.legacyJudge) { + this.judgeFullName = rawUser.judgeFullName; + this.judgeTitle = rawUser.judgeTitle; + this.isSeniorJudge = rawUser.isSeniorJudge; + } + + this.section = rawUser.section; + } + + setContactInformation(rawUser) { + if ([ROLES.judge, ROLES.legacyJudge].includes(rawUser.role)) { + this.judgePhoneNumber = formatPhoneNumber(rawUser.judgePhoneNumber); + } else if (rawUser.contact) { this.contact = { address1: rawUser.contact.address1, address2: rawUser.contact.address2 ? rawUser.contact.address2 : null, @@ -66,13 +80,6 @@ export class User extends JoiValidationEntity { state: rawUser.contact.state, }; } - if (this.role === ROLES.judge || this.role === ROLES.legacyJudge) { - this.judgeFullName = rawUser.judgeFullName; - this.judgeTitle = rawUser.judgeTitle; - this.isSeniorJudge = rawUser.isSeniorJudge; - } - - this.section = rawUser.section; } static USER_CONTACT_VALIDATION_RULES = { @@ -138,6 +145,7 @@ export class User extends JoiValidationEntity { otherwise: joi.optional().allow(null), then: joi.required(), }), + judgePhoneNumber: JoiValidationConstants.STRING.max(100).optional(), judgeTitle: JoiValidationConstants.STRING.max(100).when('role', { is: ROLES.judge, otherwise: joi.optional().allow(null), diff --git a/shared/src/business/entities/cases/ElectronicPetition.test.ts b/shared/src/business/entities/cases/ElectronicPetition.test.ts index d3057c8954d..b21d5316f63 100644 --- a/shared/src/business/entities/cases/ElectronicPetition.test.ts +++ b/shared/src/business/entities/cases/ElectronicPetition.test.ts @@ -9,16 +9,20 @@ import { import { ElectronicPetition } from './ElectronicPetition'; describe('ElectronicPetition entity', () => { + const validPetitionData = { + caseType: CASE_TYPES_MAP.other, + hasIrsNotice: false, + preferredTrialCity: 'Memphis, Tennessee', + procedureType: 'Small', + }; + describe('isValid', () => { it('requires corporate disclosure if filing type is a business', () => { const electronicPetition = new ElectronicPetition({ + ...validPetitionData, businessType: PARTY_TYPES.corporation, - caseType: CASE_TYPES_MAP.other, filingType: 'A business', - hasIrsNotice: false, petitionType: undefined, - preferredTrialCity: 'Memphis, Tennessee', - procedureType: 'Small', }); expect( @@ -29,10 +33,8 @@ describe('ElectronicPetition entity', () => { it('does not require corporate disclosure if filing type not set', () => { const petition = new ElectronicPetition({ - caseType: CASE_TYPES_MAP.other, - hasIrsNotice: false, - preferredTrialCity: 'Memphis, Tennessee', - procedureType: 'Small', + ...validPetitionData, + filingType: undefined, }); expect( @@ -42,11 +44,8 @@ describe('ElectronicPetition entity', () => { it('does not require corporate disclosure if filing type not a business', () => { const electronicPetition = new ElectronicPetition({ - caseType: CASE_TYPES_MAP.other, + ...validPetitionData, filingType: 'not a biz', - hasIrsNotice: false, - preferredTrialCity: 'Memphis, Tennessee', - procedureType: 'Small', }); expect( @@ -57,12 +56,9 @@ describe('ElectronicPetition entity', () => { it('requires stinFile', () => { const electronicPetition = new ElectronicPetition({ + ...validPetitionData, businessType: PARTY_TYPES.corporation, - caseType: CASE_TYPES_MAP.other, filingType: 'A business', - hasIrsNotice: false, - preferredTrialCity: 'Memphis, Tennessee', - procedureType: 'Small', }); expect( @@ -366,6 +362,7 @@ describe('ElectronicPetition entity', () => { describe('Secondary contact phone', () => { it('should use secondary contact phone when provided', () => { const electronicPetition = new ElectronicPetition({ + ...validPetitionData, contactSecondary: { contactType: CONTACT_TYPES.secondary, phone: '123-234-3456', @@ -380,6 +377,7 @@ describe('ElectronicPetition entity', () => { it('should use default secondary contact phone when no phone is provided', () => { const electronicPetition = new ElectronicPetition({ + ...validPetitionData, contactSecondary: { contactType: CONTACT_TYPES.secondary, }, @@ -391,4 +389,48 @@ describe('ElectronicPetition entity', () => { expect(secondaryContact.phone).toEqual('N/A'); }); }); + + describe('Redaction acknowledgements', () => { + it('should fail validation when petitionRedactionAcknowledgement is false', () => { + const electronicPetition = new ElectronicPetition({ + ...validPetitionData, + petitionRedactionAcknowledgement: false, + }); + + expect( + electronicPetition.getFormattedValidationErrors()! + .petitionRedactionAcknowledgement, + ).toBeDefined(); + }); + + it('should fail validation when hasIrsNotice is true and irsNoticesRedactionAcknowledgement is false', () => { + const electronicPetition = new ElectronicPetition({ + ...validPetitionData, + hasIrsNotice: true, + irsNoticesRedactionAcknowledgement: false, + }); + + expect( + electronicPetition.getFormattedValidationErrors()! + .irsNoticesRedactionAcknowledgement, + ).toBeDefined(); + }); + + it('should pass validation when petitionRedactionAcknowledgement and/or irsNoticesRedactionAcknowledgement are undefined or true', () => { + const electronicPetition = new ElectronicPetition({ + ...validPetitionData, + irsNoticesRedactionAcknowledgement: undefined, + petitionRedactionAcknowledgement: true, + }); + + expect( + electronicPetition.getFormattedValidationErrors()! + .petitionRedactionAcknowledgement, + ).toBeUndefined(); + expect( + electronicPetition.getFormattedValidationErrors()! + .irsNoticesRedactionAcknowledgement, + ).toBeUndefined(); + }); + }); }); diff --git a/shared/src/business/entities/cases/ElectronicPetition.ts b/shared/src/business/entities/cases/ElectronicPetition.ts index 394adcdd8f9..c250e268e98 100644 --- a/shared/src/business/entities/cases/ElectronicPetition.ts +++ b/shared/src/business/entities/cases/ElectronicPetition.ts @@ -23,6 +23,8 @@ import joi from 'joi'; * add to the system. */ export class ElectronicPetition extends JoiValidationEntity { + public attachmentToPetitionFile?: File; + public attachmentToPetitionFileSize?: number; public businessType: string; public caseType: string; public corporateDisclosureFile?: object; @@ -30,18 +32,18 @@ export class ElectronicPetition extends JoiValidationEntity { public countryType: string; public filingType: string; public hasIrsNotice: boolean; + public irsNoticesRedactionAcknowledgement: string; public partyType: string; public petitioners: any; public petitionFile?: object; - public petitionFileSize?: number; public petitionFileId?: string; + public petitionFileSize?: number; + public petitionRedactionAcknowledgement?: boolean; + public petitionType: string; public preferredTrialCity: string; public procedureType: string; public stinFile?: object; public stinFileSize?: number; - public attachmentToPetitionFile?: File; - public attachmentToPetitionFileSize?: number; - public petitionType: string; constructor(rawCase) { super('ElectronicPetition'); @@ -53,6 +55,8 @@ export class ElectronicPetition extends JoiValidationEntity { this.countryType = rawCase.countryType; this.filingType = rawCase.filingType; this.hasIrsNotice = rawCase.hasIrsNotice; + this.irsNoticesRedactionAcknowledgement = + rawCase.irsNoticesRedactionAcknowledgement; this.partyType = rawCase.partyType; this.preferredTrialCity = rawCase.preferredTrialCity; this.procedureType = rawCase.procedureType; @@ -64,6 +68,8 @@ export class ElectronicPetition extends JoiValidationEntity { this.petitionFileSize = rawCase.petitionFileSize; this.petitionFileId = rawCase.petitionFileId; this.petitionType = rawCase.petitionType || PETITION_TYPES.userUploaded; + this.petitionRedactionAcknowledgement = + rawCase.petitionRedactionAcknowledgement; this.corporateDisclosureFile = rawCase.corporateDisclosureFile; this.corporateDisclosureFileSize = rawCase.corporateDisclosureFileSize; @@ -141,6 +147,11 @@ export class ElectronicPetition extends JoiValidationEntity { .boolean() .required() .messages({ '*': 'Indicate whether you received an IRS notice' }), + irsNoticesRedactionAcknowledgement: joi.boolean().when('hasIrsNotice', { + is: true, + otherwise: joi.optional(), + then: joi.boolean().optional().invalid(false), + }), partyType: JoiValidationConstants.STRING.valid( ...Object.values(PARTY_TYPES), ) @@ -173,6 +184,11 @@ export class ElectronicPetition extends JoiValidationEntity { '*': 'Your Petition file size is empty', 'number.max': `Your Petition file size is too big. The maximum file size is ${MAX_FILE_SIZE_MB}MB.`, }), + petitionRedactionAcknowledgement: joi.boolean().when('petitionType', { + is: JoiValidationConstants.STRING.valid(PETITION_TYPES.userUploaded), + otherwise: joi.optional(), + then: joi.boolean().optional().invalid(false), + }), petitionType: JoiValidationConstants.STRING.required().valid( ...Object.values(PETITION_TYPES), ), diff --git a/shared/src/business/entities/contacts/ContactFactoryUpdated.test.ts b/shared/src/business/entities/contacts/ContactFactoryUpdated.test.ts index d22f1cf622f..282a99bfe2a 100644 --- a/shared/src/business/entities/contacts/ContactFactoryUpdated.test.ts +++ b/shared/src/business/entities/contacts/ContactFactoryUpdated.test.ts @@ -9,6 +9,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: EMPTY_VALUE, contactInfoSecondary: EMPTY_VALUE, + filingType: 'Myself', hasSpouseConsent: false, partyType: '', petitionType: '', @@ -28,6 +29,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: EMPTY_VALUE, + filingType: 'Myself', hasSpouseConsent: false, partyType, petitionType: TEST_PETITION_TYPE, @@ -46,6 +48,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: EMPTY_VALUE, + filingType: 'Myself and my spouse', hasSpouseConsent: false, partyType: PARTY_TYPES.petitionerDeceasedSpouse, petitionType: TEST_PETITION_TYPE, @@ -63,6 +66,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: {}, + filingType: 'Myself and my spouse', hasSpouseConsent: false, partyType: PARTY_TYPES.petitionerDeceasedSpouse, petitionType: TEST_PETITION_TYPE, @@ -83,6 +87,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: EMPTY_VALUE, + filingType: 'Myself and my spouse', hasSpouseConsent: false, partyType: PARTY_TYPES.petitionerSpouse, petitionType: TEST_PETITION_TYPE, @@ -100,6 +105,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: {}, + filingType: 'Myself and my spouse', hasSpouseConsent: false, partyType: PARTY_TYPES.petitionerSpouse, petitionType: TEST_PETITION_TYPE, @@ -117,6 +123,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: {}, + filingType: 'Myself and my spouse', hasSpouseConsent: true, partyType: PARTY_TYPES.petitionerSpouse, petitionType: TEST_PETITION_TYPE, @@ -149,6 +156,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: {}, + filingType: 'Other', hasSpouseConsent: false, partyType, petitionType: TEST_PETITION_TYPE, @@ -167,6 +175,7 @@ describe('ContactFactoryUpdated', () => { const { primary, secondary } = ContactFactoryUpdated({ contactInfoPrimary: {}, contactInfoSecondary: {}, + filingType: 'Other', hasSpouseConsent: false, partyType: 'SOMETHING_RANDOM', petitionType: TEST_PETITION_TYPE, diff --git a/shared/src/business/entities/contacts/ContactFactoryUpdated.ts b/shared/src/business/entities/contacts/ContactFactoryUpdated.ts index 2287e8e16b4..c1c7ec26d72 100644 --- a/shared/src/business/entities/contacts/ContactFactoryUpdated.ts +++ b/shared/src/business/entities/contacts/ContactFactoryUpdated.ts @@ -1,5 +1,5 @@ import { BusinessContact } from './BusinessContact'; -import { CONTACT_TYPES, PARTY_TYPES } from '../EntityConstants'; +import { CONTACT_TYPES, FilingType, PARTY_TYPES } from '../EntityConstants'; import { ContactUpdated } from '@shared/business/entities/contacts/ContactUpdated'; import { DeceasedSpouseContact } from '@shared/business/entities/contacts/DeceasedSpouseContact'; import { OtherContact } from '@shared/business/entities/contacts/OtherContact'; @@ -8,12 +8,14 @@ import { SpouseContact } from '@shared/business/entities/contacts/SpouseContact' export function ContactFactoryUpdated({ contactInfoPrimary, contactInfoSecondary, + filingType, hasSpouseConsent, partyType, petitionType, }: { contactInfoPrimary: {}; contactInfoSecondary: {}; + filingType: FilingType; partyType: string; petitionType: string; hasSpouseConsent: boolean; @@ -61,7 +63,9 @@ export function ContactFactoryUpdated({ } if (partyType === PARTY_TYPES.petitionerSpouse) { - const shouldValidateSecondary = !!hasSpouseConsent; + const shouldValidateSecondary = + filingType === 'Petitioner and spouse' || + (filingType === 'Myself and my spouse' && !!hasSpouseConsent); return { primary: new ContactUpdated( { ...contactInfoPrimary, contactType: CONTACT_TYPES.primary }, diff --git a/shared/src/business/entities/contacts/ContactUpdated.test.ts b/shared/src/business/entities/contacts/ContactUpdated.test.ts index e78034d9838..9b84dd0fd5f 100644 --- a/shared/src/business/entities/contacts/ContactUpdated.test.ts +++ b/shared/src/business/entities/contacts/ContactUpdated.test.ts @@ -335,7 +335,7 @@ describe('ContactUpdated', () => { ); const errors = entity.getFormattedValidationErrors(); - expect(errors).toEqual({ postalCode: 'Enter ZIP code' }); + expect(errors).toEqual({ postalCode: 'Enter a valid ZIP code' }); }); it('should return an error message for "postalCode" if it does not match regex', () => { @@ -351,7 +351,7 @@ describe('ContactUpdated', () => { ); const errors = entity.getFormattedValidationErrors(); - expect(errors).toEqual({ postalCode: 'Enter ZIP code' }); + expect(errors).toEqual({ postalCode: 'Enter a valid ZIP code' }); }); }); diff --git a/shared/src/business/entities/contacts/ContactUpdated.ts b/shared/src/business/entities/contacts/ContactUpdated.ts index d16fd5c6204..f316b108c57 100644 --- a/shared/src/business/entities/contacts/ContactUpdated.ts +++ b/shared/src/business/entities/contacts/ContactUpdated.ts @@ -97,7 +97,7 @@ export class ContactUpdated extends JoiValidationEntity { .required() .messages({ '*': 'Enter country type' }), postalCode: JoiValidationConstants.US_POSTAL_CODE.required().messages({ - '*': 'Enter ZIP code', + '*': 'Enter a valid ZIP code', }), state: JoiValidationConstants.STRING.valid( ...Object.keys(US_STATES), diff --git a/shared/src/business/entities/contacts/DeceasedSpouseContact.test.ts b/shared/src/business/entities/contacts/DeceasedSpouseContact.test.ts index d2ed39fd05f..c33bf74872c 100644 --- a/shared/src/business/entities/contacts/DeceasedSpouseContact.test.ts +++ b/shared/src/business/entities/contacts/DeceasedSpouseContact.test.ts @@ -59,12 +59,12 @@ describe('DeceasedSpouseContact', () => { expect(errors).toEqual(null); }); - it('should not return an error message for "paperPetitionEmail" if not a valid email string', () => { + it('should return an error message for "paperPetitionEmail" if not a valid email string', () => { const entity = new DeceasedSpouseContact( { ...VALID_ENTITY, hasConsentedToEService: true, - paperPetitionEmail: 'not a email string', + paperPetitionEmail: 'not a valid email string', }, TEST_PETITION_TYPE, PARTY_TYPE, @@ -73,7 +73,7 @@ describe('DeceasedSpouseContact', () => { const errors = entity.getFormattedValidationErrors(); expect(errors).toEqual({ paperPetitionEmail: - 'Enter an email address to register for electronic service', + 'Enter email address in format: yourname@example.com', }); }); }); diff --git a/shared/src/business/entities/contacts/DeceasedSpouseContact.ts b/shared/src/business/entities/contacts/DeceasedSpouseContact.ts index a8a83145661..b1e9c19ce9a 100644 --- a/shared/src/business/entities/contacts/DeceasedSpouseContact.ts +++ b/shared/src/business/entities/contacts/DeceasedSpouseContact.ts @@ -27,7 +27,9 @@ export class DeceasedSpouseContact extends ContactUpdated { then: joi.string().required(), }, ).messages({ - '*': 'Enter an email address to register for electronic service', + 'any.required': + 'Enter an email address to register for electronic service', + 'string.email': 'Enter email address in format: yourname@example.com', }), phone: JoiValidationConstants.STRING.max(100).optional().allow(null), }; diff --git a/shared/src/business/entities/contacts/SpouseContact.ts b/shared/src/business/entities/contacts/SpouseContact.ts index cd2239aeb2f..0b19fb5d3d7 100644 --- a/shared/src/business/entities/contacts/SpouseContact.ts +++ b/shared/src/business/entities/contacts/SpouseContact.ts @@ -24,7 +24,9 @@ export class SpouseContact extends ContactUpdated { then: joi.string().required(), }, ).messages({ - '*': 'Enter an email address to register for electronic service', + 'any.required': + 'Enter an email address to register for electronic service', + 'string.email': 'Enter email address in format: yourname@example.com', }), phone: JoiValidationConstants.STRING.max(100).optional().allow(null), }; diff --git a/shared/src/business/entities/startCase/GeneratePetitionPdf.ts b/shared/src/business/entities/startCase/GeneratePetitionPdf.ts index bf38dbfbc89..db7f4e3364c 100644 --- a/shared/src/business/entities/startCase/GeneratePetitionPdf.ts +++ b/shared/src/business/entities/startCase/GeneratePetitionPdf.ts @@ -1,6 +1,7 @@ import { CASE_TYPES, PARTY_TYPES, PROCEDURE_TYPES } from '../EntityConstants'; import { Contact, + ContactCounsel, ContactSecondary, IrsNotice, } from '@shared/business/useCases/generatePetitionPdfInteractor'; @@ -13,6 +14,7 @@ export class GeneratePetitionPdf extends JoiValidationEntity { public caseTitle: string; public contactPrimary: Contact; public contactSecondary?: ContactSecondary; + public contactCounsel?: ContactCounsel; public hasUploadedIrsNotice: boolean; public partyType: string; public petitionFacts: string[]; @@ -30,6 +32,7 @@ export class GeneratePetitionPdf extends JoiValidationEntity { this.caseTitle = rawProps.caseTitle; this.contactPrimary = rawProps.contactPrimary; this.contactSecondary = rawProps.contactSecondary; + this.contactCounsel = rawProps.contactCounsel; this.hasUploadedIrsNotice = rawProps.hasUploadedIrsNotice; this.partyType = rawProps.partyType; this.petitionFacts = rawProps.petitionFacts; @@ -44,6 +47,7 @@ export class GeneratePetitionPdf extends JoiValidationEntity { static VALIDATION_RULES = { caseCaptionExtension: joi.string().required(), caseTitle: joi.string().required(), + contactCounsel: joi.object().optional(), contactPrimary: joi.object().required(), contactSecondary: joi.object().optional(), hasIrsNotice: joi.boolean().required(), diff --git a/shared/src/business/entities/startCase/UploadPetitionStep1.test.ts b/shared/src/business/entities/startCase/UploadPetitionStep1.test.ts index 4d5068e984a..25fe3a7b2a4 100644 --- a/shared/src/business/entities/startCase/UploadPetitionStep1.test.ts +++ b/shared/src/business/entities/startCase/UploadPetitionStep1.test.ts @@ -194,5 +194,38 @@ describe('UploadPetitionStep1', () => { expect(errors.partyType).not.toBeDefined(); }); }); + + describe('Filing types', () => { + it('should not return an error message for petitioner filing type', () => { + const entity = new UploadPetitionStep1(VALID_ENTITY); + + expect(entity).toBeDefined(); + + const errors = entity.getFormattedValidationErrors(); + expect(errors).toEqual(null); + }); + it('should not return an error message for practitioner filing type', () => { + const entity = new UploadPetitionStep1({ + filingType: FILING_TYPES[ROLES.privatePractitioner][0], + partyType: PARTY_TYPES.petitioner, + }); + expect(entity).toBeDefined(); + + const errors = entity.getFormattedValidationErrors(); + expect(errors).toEqual(null); + }); + it('should return an error message for filing type other than petitioner and practitioner', () => { + const entity = new UploadPetitionStep1({ + filingType: 'random filing type', + partyType: PARTY_TYPES.petitioner, + }); + expect(entity).toBeDefined(); + + const errors = entity.getFormattedValidationErrors(); + expect(errors).toEqual({ + filingType: 'Select on whose behalf you are filing', + }); + }); + }); }); }); diff --git a/shared/src/business/entities/startCase/UploadPetitionStep1.ts b/shared/src/business/entities/startCase/UploadPetitionStep1.ts index 49859f2032f..93bfeea2d9f 100644 --- a/shared/src/business/entities/startCase/UploadPetitionStep1.ts +++ b/shared/src/business/entities/startCase/UploadPetitionStep1.ts @@ -47,6 +47,7 @@ export class UploadPetitionStep1 extends JoiValidationEntity { const contactInfo = ContactFactoryUpdated({ contactInfoPrimary: rawProps.contactPrimary, contactInfoSecondary: rawProps.contactSecondary, + filingType: rawProps.filingType, hasSpouseConsent: rawProps.hasSpouseConsent, partyType: rawProps.partyType, petitionType: rawProps.petitionType, @@ -109,15 +110,20 @@ export class UploadPetitionStep1 extends JoiValidationEntity { .messages({ '*': 'Select a type of estate or trust' }), filingType: JoiValidationConstants.STRING.valid( ...FILING_TYPES[ROLES.petitioner], + ...FILING_TYPES[ROLES.privatePractitioner], ) .required() .messages({ '*': 'Select on whose behalf you are filing' }), hasSpouseConsent: joi .boolean() - .when('isSpouseDeceased', { - is: 'No', - otherwise: joi.optional().allow(null), - then: joi.boolean().valid(true).required(), + .when('filingType', { + is: 'Petitioner and spouse', + otherwise: joi.when('isSpouseDeceased', { + is: 'No', + otherwise: joi.optional().allow(null), + then: joi.boolean().valid(true).required(), + }), + then: joi.optional().allow(null), }) .messages({ '*': "Check the box to confirm that you have your spouse's consent", @@ -126,7 +132,7 @@ export class UploadPetitionStep1 extends JoiValidationEntity { .string() .valid('Yes', 'No') .when('filingType', { - is: 'Myself and my spouse', + is: joi.valid('Myself and my spouse', 'Petitioner and spouse'), otherwise: joi.optional().allow(null), then: joi.required(), }) @@ -166,9 +172,13 @@ export class UploadPetitionStep1 extends JoiValidationEntity { getFormattedValidationErrors(): Record | null { const errors = super.getFormattedValidationErrors(); - // // If partyType is failing and user selects "Myself and my spouse" as the filing type - // // don't show party type error since we show the isSpousedDeceased error - if (errors?.partyType && this.filingType === 'Myself and my spouse') { + // // If partyType is failing and user selects "Myself and my spouse" or "Petitioner and spouse" as the filing type + // // don't show party type error since we show the isSpouseDeceased error + if ( + errors?.partyType && + (this.filingType === 'Myself and my spouse' || + this.filingType === 'Petitioner and spouse') + ) { return { ...errors, partyType: undefined, @@ -182,6 +192,7 @@ export class UploadPetitionStep1 extends JoiValidationEntity { contactPrimary: undefined, partyType: undefined, }; + return errors; } } diff --git a/shared/src/business/test/createTestApplicationContext.ts b/shared/src/business/test/createTestApplicationContext.ts index 1aa31a83988..f241dc7842a 100644 --- a/shared/src/business/test/createTestApplicationContext.ts +++ b/shared/src/business/test/createTestApplicationContext.ts @@ -81,12 +81,6 @@ import { getAllWebSocketConnections } from '@web-api/persistence/dynamo/notifica import { getCaseByDocketNumber } from '@web-api/persistence/dynamo/cases/getCaseByDocketNumber'; import { getCaseDeadlinesByDocketNumber } from '@web-api/persistence/dynamo/caseDeadlines/getCaseDeadlinesByDocketNumber'; import { getCaseDocumentsIdsFilteredByDocumentType } from '@shared/business/utilities/getCaseDocumentsIdsFilteredByDocumentType'; -import { - getChambersSections, - getChambersSectionsLabels, - getJudgesChambers, - getJudgesChambersWithLegacy, -} from '@web-client/business/chambers/getJudgesChambers'; import { getConfigurationItemValue } from '@web-api/persistence/dynamo/deployTable/getConfigurationItemValue'; import { getConstants } from '@web-client/getConstants'; import { getCropBox } from '@shared/business/utilities/getCropBox'; @@ -288,7 +282,6 @@ export const createTestApplicationContext = () => { .fn() .mockImplementation(getFormattedTrialSessionDetails), getJudgeLastName: jest.fn().mockImplementation(getJudgeLastName), - getJudgesChambers: jest.fn().mockImplementation(getJudgesChambers), getMonthDayYearInETObj: jest .fn() .mockImplementation(DateHandler.getMonthDayYearInETObj), @@ -495,10 +488,6 @@ export const createTestApplicationContext = () => { .fn() .mockImplementation(getCaseDeadlinesByDocketNumber), getCasesByFilters: jest.fn(), - getChambersSections: jest.fn().mockImplementation(getChambersSections), - getChambersSectionsLabels: jest - .fn() - .mockImplementation(getChambersSectionsLabels), getConfigurationItemValue: jest .fn() .mockImplementation(getConfigurationItemValue), @@ -521,10 +510,6 @@ export const createTestApplicationContext = () => { } }), getItem: jest.fn().mockImplementation(getItem), - getJudgesChambers: jest.fn().mockImplementation(getJudgesChambers), - getJudgesChambersWithLegacy: jest - .fn() - .mockImplementation(getJudgesChambersWithLegacy), getLimiterByKey: jest.fn(), getMaintenanceMode: jest.fn(), getMessagesByDocketNumber: jest.fn(), diff --git a/shared/src/business/useCases/generatePetitionPdfInteractor.ts b/shared/src/business/useCases/generatePetitionPdfInteractor.ts index e8479f72fb1..e38c83e13f7 100644 --- a/shared/src/business/useCases/generatePetitionPdfInteractor.ts +++ b/shared/src/business/useCases/generatePetitionPdfInteractor.ts @@ -1,7 +1,3 @@ -import { - CASE_TYPE_DESCRIPTIONS_WITHOUT_IRS_NOTICE, - CASE_TYPE_DESCRIPTIONS_WITH_IRS_NOTICE, -} from '@shared/business/entities/EntityConstants'; import { CreateCaseIrsForm } from '@web-client/presenter/state'; import { ROLE_PERMISSIONS, @@ -9,6 +5,7 @@ import { } from '@shared/authorization/authorizationClientService'; import { UnauthorizedError } from '@web-api/errors/errors'; import { UnknownAuthUser } from '@shared/business/entities/authUser/AuthUser'; +import { getCaseDescription } from '@shared/business/utilities/getCaseDescription'; export type IrsNotice = CreateCaseIrsForm & { noticeIssuedDateFormatted: string; @@ -25,11 +22,12 @@ export interface Contact { inCareOf?: string; secondaryName?: string; title?: string; - country: string; + country?: string; address1: string; address2?: string; address3?: string; city: string; + paperPetitionEmail?: string; postalCode: string; phone: string; state: string; @@ -44,9 +42,24 @@ export type ContactSecondary = Contact & { paperPetitionEmail?: string; }; +export type ContactCounsel = { + name: string; + firmName: string; + address1: string; + address2?: string; + address3?: string; + city: string; + state: string; + postalCode: string; + phone: string; + email: string; + barNumber: string; +}; + export interface PetitionPdfBase { caseCaptionExtension: string; caseTitle: string; + contactCounsel?: ContactCounsel; contactPrimary: Contact; contactSecondary?: ContactSecondary; hasUploadedIrsNotice: boolean; @@ -62,6 +75,7 @@ export const generatePetitionPdfInteractor = async ( { caseCaptionExtension, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasIrsNotice, @@ -91,6 +105,7 @@ export const generatePetitionPdfInteractor = async ( caseCaptionExtension, caseDescription, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasUploadedIrsNotice, @@ -119,10 +134,3 @@ export const generatePetitionPdfInteractor = async ( return { fileId }; }; - -function getCaseDescription(hasIrsNotice: boolean, caseType: string) { - if (hasIrsNotice) { - return CASE_TYPE_DESCRIPTIONS_WITH_IRS_NOTICE[caseType]; - } - return CASE_TYPE_DESCRIPTIONS_WITHOUT_IRS_NOTICE[caseType]; -} diff --git a/shared/src/business/useCases/validatePetitionInteractor.test.ts b/shared/src/business/useCases/validatePetitionInteractor.test.ts index a0271fe9f5b..26cd655584d 100644 --- a/shared/src/business/useCases/validatePetitionInteractor.test.ts +++ b/shared/src/business/useCases/validatePetitionInteractor.test.ts @@ -3,12 +3,11 @@ import { PARTY_TYPES, PETITION_TYPES, } from '../entities/EntityConstants'; -import { applicationContext } from '../test/createTestApplicationContext'; import { validatePetitionInteractor } from './validatePetitionInteractor'; describe('validatePetitionInteractor', () => { it('should return the expected errors object on an empty petition when user uploaded file', () => { - const errors = validatePetitionInteractor(applicationContext, { + const errors = validatePetitionInteractor({ petition: { petitionType: PETITION_TYPES.userUploaded, }, @@ -26,7 +25,7 @@ describe('validatePetitionInteractor', () => { }); it('should return the expected errors object on an empty petition when auto generated petition', () => { - const errors = validatePetitionInteractor(applicationContext, { + const errors = validatePetitionInteractor({ petition: { petitionType: PETITION_TYPES.autoGenerated, }, @@ -44,7 +43,7 @@ describe('validatePetitionInteractor', () => { }); it('should return the expected errors object when caseType is defined', () => { - const errors = validatePetitionInteractor(applicationContext, { + const errors = validatePetitionInteractor({ petition: { caseType: 'defined', hasIrsNotice: true, @@ -63,7 +62,7 @@ describe('validatePetitionInteractor', () => { }); it('should return the expected errors object', () => { - const errors = validatePetitionInteractor(applicationContext, { + const errors = validatePetitionInteractor({ petition: { caseType: 'defined', contactPrimary: { diff --git a/shared/src/business/useCases/validatePetitionInteractor.ts b/shared/src/business/useCases/validatePetitionInteractor.ts index 72f4730b5f7..180d1933d62 100644 --- a/shared/src/business/useCases/validatePetitionInteractor.ts +++ b/shared/src/business/useCases/validatePetitionInteractor.ts @@ -1,8 +1,5 @@ import { ElectronicPetition } from '../entities/cases/ElectronicPetition'; -export const validatePetitionInteractor = ( - applicationContext: IApplicationContext, - { petition }: { petition: any }, -) => { +export const validatePetitionInteractor = ({ petition }: { petition: any }) => { return new ElectronicPetition(petition).getFormattedValidationErrors(); }; diff --git a/shared/src/business/utilities/documentGenerators/petition.test.ts b/shared/src/business/utilities/documentGenerators/petition.test.ts new file mode 100644 index 00000000000..0632e18403b --- /dev/null +++ b/shared/src/business/utilities/documentGenerators/petition.test.ts @@ -0,0 +1,105 @@ +import { applicationContext } from '../../test/createTestApplicationContext'; +import { generateAndVerifyPdfDiff } from './generateAndVerifyPdfDiff'; +import { petition } from './petition'; + +describe('generated petition', () => { + generateAndVerifyPdfDiff({ + fileName: 'Generated_Petition.pdf', + pageNumber: 1, + pdfGenerateFunction: () => + petition({ + applicationContext, + data: { + caseCaptionExtension: 'Petitioner', + caseDescription: 'Notice of Deficiency', + caseTitle: 'Thaddeus Wilcox', + contactCounsel: undefined, + contactPrimary: { + address1: '31 South Clarendon Freeway', + address2: 'Est est qui fugit ', + address3: 'Dignissimos eos veri', + city: 'Aliquip possimus el', + contactType: 'primary', + countryType: 'domestic', + email: 'petitioner@example.com', + name: 'Thaddeus Wilcox', + phone: '+1 (419) 437-7842', + placeOfLegalResidence: 'NE', + postalCode: '83310', + state: 'LA', + }, + contactSecondary: undefined, + hasUploadedIrsNotice: false, + irsNotices: [ + { + caseDescription: 'Notice of Deficiency', + caseType: 'Deficiency', + cityAndStateIssuingOffice: 'Jackson, NJ', + key: '74d1cdc6-7118-4f62-b6f7-c4a23e5ad4e4', + noticeIssuedDate: '2024-08-06T00:00:00.000-04:00', + noticeIssuedDateFormatted: '08/06/24', + originalCaseType: 'Deficiency', + taxYear: '2024', + todayDate: '2024-08-22', + }, + ], + partyType: 'Petitioner', + petitionFacts: ['Asperiores rem illum', 'Dolorem in laudantiu'], + petitionReasons: ['In nisi magnam eius ', 'Iste dolorem sed fac'], + preferredTrialCity: 'Birmingham, Alabama', + procedureType: 'Regular', + }, + }), + testDescription: 'generates a petition', + }); + + generateAndVerifyPdfDiff({ + fileName: 'Generated_Petition.pdf', + pageNumber: 2, + pdfGenerateFunction: () => + petition({ + applicationContext, + data: { + caseCaptionExtension: 'Petitioner', + caseDescription: 'Notice of Deficiency', + caseTitle: 'Thaddeus Wilcox', + contactCounsel: undefined, + contactPrimary: { + address1: '31 South Clarendon Freeway', + address2: 'Est est qui fugit ', + address3: 'Dignissimos eos veri', + city: 'Aliquip possimus el', + contactType: 'primary', + countryType: 'domestic', + email: 'petitioner@example.com', + name: 'Thaddeus Wilcox', + phone: '+1 (419) 437-7842', + placeOfLegalResidence: 'NE', + postalCode: '83310', + state: 'LA', + }, + contactSecondary: undefined, + hasUploadedIrsNotice: false, + irsNotices: [ + { + caseDescription: 'Notice of Deficiency', + caseType: 'Deficiency', + cityAndStateIssuingOffice: 'Jackson, NJ', + key: '74d1cdc6-7118-4f62-b6f7-c4a23e5ad4e4', + noticeIssuedDate: '2024-08-06T00:00:00.000-04:00', + noticeIssuedDateFormatted: '08/06/24', + originalCaseType: 'Deficiency', + taxYear: '2024', + todayDate: '2024-08-22', + }, + ], + partyType: 'Petitioner', + petitionFacts: ['Asperiores rem illum', 'Dolorem in laudantiu'], + petitionReasons: ['In nisi magnam eius ', 'Iste dolorem sed fac'], + preferredTrialCity: 'Birmingham, Alabama', + procedureType: 'Regular', + }, + }), + testDescription: 'generates a petition', + }); +}); diff --git a/shared/src/business/utilities/documentGenerators/petition.ts b/shared/src/business/utilities/documentGenerators/petition.ts index 49f76330ae3..e4234a8d449 100644 --- a/shared/src/business/utilities/documentGenerators/petition.ts +++ b/shared/src/business/utilities/documentGenerators/petition.ts @@ -22,6 +22,7 @@ export const petition = async ({ caseCaptionExtension, caseDescription, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasUploadedIrsNotice, @@ -32,12 +33,12 @@ export const petition = async ({ preferredTrialCity, procedureType, } = data; - const PetitionTemplate = ReactDOM.renderToString( React.createElement(Petition, { caseCaptionExtension, caseDescription, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasUploadedIrsNotice, diff --git a/shared/src/business/utilities/getCaseDescription.test.ts b/shared/src/business/utilities/getCaseDescription.test.ts new file mode 100644 index 00000000000..e5da6b77108 --- /dev/null +++ b/shared/src/business/utilities/getCaseDescription.test.ts @@ -0,0 +1,107 @@ +import { getCaseDescription } from '@shared/business/utilities/getCaseDescription'; + +const caseTypesWithIrsNotice = [ + { + description: 'Notice of Deficiency', + type: 'Deficiency', + }, + { + description: 'Notice of Determination Concerning Collection Action', + type: 'CDP (Lien/Levy)', + }, + { + description: 'Other', + type: 'Other', + }, + { + description: 'Adjustment of Partnership Items Code Section 6228', + type: 'Partnership (Section 6228)', + }, + { + description: + 'Notice - We Are Going To Make Your Determination Letter Available for Public Inspection', + type: 'Disclosure2', + }, + { + description: + 'Notice of Certification of Your Seriously Delinquent Federal Tax Debt to the Department of State', + type: 'Passport', + }, + { + description: + 'Notice of Determination Concerning Relief From Joint and Several Liability Under Section 6015', + type: 'Innocent Spouse', + }, + { + description: 'Notice of Determination of Worker Classification', + type: 'Worker Classification', + }, + { + description: + 'Notice of Determination Under Section 7623 Concerning Whistleblower Action', + type: 'Whistleblower', + }, + { + description: + 'Notice of Final Determination for Full or Partial Disallowance of Interest Abatement Claim', + type: 'Interest Abatement', + }, + { + description: 'Notice of Intention to Disclose', + type: 'Disclosure1', + }, + { + description: 'Partnership Action Under BBA Section 1101', + type: 'Partnership (BBA Section 1101)', + }, + { + description: 'Readjustment of Partnership Items Code Section 6226', + type: 'Partnership (Section 6226)', + }, +]; + +const caseTypesWithoutIrsNotice = [ + { description: 'Deficiency', type: 'Deficiency' }, + { description: 'Collection (Lien/Levy)', type: 'CDP (Lien/Levy)' }, + { description: 'Passport', type: 'Passport' }, + { description: 'Innocent Spouse', type: 'Innocent Spouse' }, + { description: 'Whistleblower', type: 'Whistleblower' }, + { description: 'Worker Classification', type: 'Worker Classification' }, + { + description: 'Declaratory Judgment (Retirement Plan)', + type: 'Declaratory Judgment (Retirement Plan)', + }, + { + description: 'Declaratory Judgment (Exempt Organization)', + type: 'Declaratory Judgment (Exempt Organization)', + }, + { description: 'Disclosure', type: 'Disclosure' }, + { + description: + 'Interest Abatement - Failure of IRS to Make Final Determination Within 180 Days After Claim for Abatement', + type: 'Interest Abatement', + }, + { description: 'Other', type: 'Other' }, +]; + +describe('getCaseDescription', () => { + describe('With IRS notices', () => { + const hasIrsNotice = true; + caseTypesWithIrsNotice.forEach(caseType => { + it(`should return case description for ${caseType.type}`, () => { + const caseDescription = getCaseDescription(hasIrsNotice, caseType.type); + expect(caseDescription).toEqual(caseType.description); + }); + }); + }); + + describe('Without IRS notices', () => { + const hasIrsNotice = false; + caseTypesWithoutIrsNotice.forEach(caseType => { + it(`should return case description for ${caseType.type}`, () => { + const caseDescription = getCaseDescription(hasIrsNotice, caseType.type); + expect(caseDescription).toEqual(caseType.description); + }); + }); + }); +}); diff --git a/shared/src/business/utilities/getCaseDescription.ts b/shared/src/business/utilities/getCaseDescription.ts new file mode 100644 index 00000000000..e94712e5cdd --- /dev/null +++ b/shared/src/business/utilities/getCaseDescription.ts @@ -0,0 +1,14 @@ +import { + CASE_TYPE_DESCRIPTIONS_WITHOUT_IRS_NOTICE, + CASE_TYPE_DESCRIPTIONS_WITH_IRS_NOTICE, +} from '../entities/EntityConstants'; + +export const getCaseDescription = ( + hasIrsNotice: boolean, + originalCaseType: string, +) => { + if (hasIrsNotice) { + return CASE_TYPE_DESCRIPTIONS_WITH_IRS_NOTICE[originalCaseType]; + } + return CASE_TYPE_DESCRIPTIONS_WITHOUT_IRS_NOTICE[originalCaseType]; +}; diff --git a/shared/src/business/utilities/htmlGenerator/documents/petition.scss b/shared/src/business/utilities/htmlGenerator/documents/petition.scss index 196f1fbffa1..6b44caca430 100644 --- a/shared/src/business/utilities/htmlGenerator/documents/petition.scss +++ b/shared/src/business/utilities/htmlGenerator/documents/petition.scss @@ -53,5 +53,14 @@ padding-left: 20px; list-style-position: outside; } + + .petition-contact { + display: flex; + margin-top: 24px; + } + + .petition-contact-info { + flex: 1; + } } diff --git a/shared/src/business/utilities/pdfGenerator/documentTemplates/Petition.tsx b/shared/src/business/utilities/pdfGenerator/documentTemplates/Petition.tsx index 67434f41fd4..dbd83b4aaf0 100644 --- a/shared/src/business/utilities/pdfGenerator/documentTemplates/Petition.tsx +++ b/shared/src/business/utilities/pdfGenerator/documentTemplates/Petition.tsx @@ -19,6 +19,7 @@ export const Petition = ({ caseCaptionExtension, caseDescription, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasUploadedIrsNotice, @@ -40,6 +41,8 @@ export const Petition = ({ ); const noticesDontHaveTaxYear = irsNotices.every(notice => !notice.taxYear); + + const isPetitioner = !contactCounsel; return (
@@ -164,8 +167,8 @@ export const Petition = ({ Access to Case Files," available at{' '} www.ustaxcourt.gov.
-
-
+
+
Petitioner's contact information:
{contactPrimary.name}
{contactPrimary.secondaryName && ( @@ -192,7 +195,16 @@ export const Petition = ({ {contactPrimary.countryType === COUNTRY_TYPES.INTERNATIONAL && (
{contactPrimary.country}
)} -
{contactPrimary.phone}
+
+ Phone: + {contactPrimary.phone} +
+ {!isPetitioner && ( +
+ Email: + {contactPrimary.paperPetitionEmail || 'Email not provided'} +
+ )} {contactPrimary.placeOfLegalResidence && (
{BUSINESS_TYPE_VALUES.includes(partyType) ? ( @@ -203,56 +215,102 @@ export const Petition = ({ {ALL_STATE_OPTIONS[contactPrimary.placeOfLegalResidence]}
)} -
- Service email: - {contactPrimary.email} -
-
-
- {contactSecondary && ( -
- Spouse's contact information: -
{contactSecondary.name}
- {contactSecondary.inCareOf && ( + {isPetitioner && (
- c/o: - {contactSecondary.inCareOf} + Service email: + {contactPrimary.email}
)} -
{contactSecondary.address1}
- {contactSecondary.address2 && ( -
{contactSecondary.address2}
- )} - {contactSecondary.address3 && ( -
{contactSecondary.address3}
- )} -
- {contactSecondary.city}, {contactSecondary.state}{' '} - {contactSecondary.postalCode} -
- {contactSecondary.countryType === COUNTRY_TYPES.INTERNATIONAL && ( -
{contactSecondary.country}
- )} -
- {contactSecondary.phone - ? contactSecondary.phone - : 'Phone number not provided'} -
- {contactSecondary.paperPetitionEmail && ( -
{contactSecondary.paperPetitionEmail}
+
+
+ {contactSecondary && ( +
+ Spouse's contact information: +
{contactSecondary.name}
+ {contactSecondary.inCareOf && ( +
+ c/o: + {contactSecondary.inCareOf} +
+ )} +
{contactSecondary.address1}
+ {contactSecondary.address2 && ( +
{contactSecondary.address2}
+ )} + {contactSecondary.address3 && ( +
{contactSecondary.address3}
+ )} +
+ {contactSecondary.city}, {contactSecondary.state}{' '} + {contactSecondary.postalCode} +
+ {contactSecondary.countryType === + COUNTRY_TYPES.INTERNATIONAL && ( +
{contactSecondary.country}
+ )} +
+ Phone: + {contactSecondary.phone + ? contactSecondary.phone + : 'Phone number not provided'} +
+ +
+ Email: + {contactSecondary.paperPetitionEmail || 'Email not provided'} +
+ + {isPetitioner && ( +
+ Register for electronic filing and service: + {contactSecondary.hasConsentedToEService ? 'Yes' : 'No'} +
+ )} + {contactSecondary.placeOfLegalResidence && ( +
+ Place of legal residence: + {ALL_STATE_OPTIONS[contactSecondary.placeOfLegalResidence]} +
+ )} +
)} -
- Register for electronic filing and service: - {contactSecondary.hasConsentedToEService ? 'Yes' : 'No'} -
- {contactSecondary.placeOfLegalResidence && ( +
+
+
+
+ {contactCounsel && (
- Place of legal residence: - {ALL_STATE_OPTIONS[contactSecondary.placeOfLegalResidence]} + Counsel's contact information: +
{contactCounsel.name}
+
{contactCounsel.firmName}
+
{contactCounsel.address1}
+ {contactCounsel.address2 && ( +
{contactCounsel.address2}
+ )} + {contactCounsel.address3 && ( +
{contactCounsel.address3}
+ )} +
+ {contactCounsel.city}, {contactCounsel.state}{' '} + {contactCounsel.postalCode} +
+
+ Phone: + {contactCounsel.phone} +
+
+ Email: + {contactCounsel.email} +
+ +
+ Tax Court Bar No.: + {contactCounsel.barNumber} +
)}
- )} +
); diff --git a/shared/src/proxies/generatePetitionPdfProxy.ts b/shared/src/proxies/generatePetitionPdfProxy.ts index 9e2f1e74fe4..6e80790883d 100644 --- a/shared/src/proxies/generatePetitionPdfProxy.ts +++ b/shared/src/proxies/generatePetitionPdfProxy.ts @@ -9,6 +9,7 @@ export const generatePetitionPdfInteractor = ( { caseCaptionExtension, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasIrsNotice, @@ -33,6 +34,7 @@ export const generatePetitionPdfInteractor = ( body: { caseCaptionExtension, caseTitle, + contactCounsel, contactPrimary, contactSecondary, hasIrsNotice, diff --git a/shared/src/proxies/reports/generatePrintableCaseInventoryReportProxy.ts b/shared/src/proxies/reports/generatePrintableCaseInventoryReportProxy.ts index f065dcbcaf2..22c16e09bec 100644 --- a/shared/src/proxies/reports/generatePrintableCaseInventoryReportProxy.ts +++ b/shared/src/proxies/reports/generatePrintableCaseInventoryReportProxy.ts @@ -1,4 +1,5 @@ -import { get } from '../requests'; +import { ClientApplicationContext } from '@web-client/applicationContext'; +import { asyncSyncHandler, get } from '../requests'; /** * generatePrintableCaseInventoryReportInteractor @@ -10,12 +11,26 @@ import { get } from '../requests'; * @returns {Promise<*>} the promise of the api call */ export const generatePrintableCaseInventoryReportInteractor = ( - applicationContext, - { associatedJudge, status }, + applicationContext: ClientApplicationContext, + { + associatedJudge, + status, + }: { + associatedJudge?: string; + status?: string; + }, ) => { - return get({ + return asyncSyncHandler( applicationContext, - endpoint: '/reports/printable-case-inventory-report', - params: { associatedJudge, status }, - }); + async asyncSyncId => + await get({ + applicationContext, + asyncSyncId, + endpoint: '/async/reports/printable-case-inventory-report', + params: { associatedJudge, status }, + }), + ) as Promise<{ + fileId: string; + url: string; + }>; }; diff --git a/shared/src/proxies/requests.ts b/shared/src/proxies/requests.ts index d2236b2549a..4518ac8c3cf 100644 --- a/shared/src/proxies/requests.ts +++ b/shared/src/proxies/requests.ts @@ -41,15 +41,18 @@ export const head = async ({ applicationContext, endpoint, params }) => { */ const internalGet = async ({ applicationContext, + asyncSyncId = undefined, endpoint, params, }: { applicationContext: ClientApplicationContext; endpoint: string; + asyncSyncId?: string; params?: any; }) => { const response = await getResponse({ applicationContext, + asyncSyncId, endpoint, params, }); @@ -65,11 +68,19 @@ const internalGet = async ({ * @param {object} providers.params the params to send to the endpoint * @returns {Promise<*>} the complete http response */ -export const getResponse = ({ applicationContext, endpoint, params }) => { +export const getResponse = ({ + applicationContext, + asyncSyncId, + endpoint, + params, +}) => { return applicationContext .getHttpClient() .get(`${applicationContext.getBaseUrl()}${endpoint}`, { - headers: getDefaultHeaders(getCurrentUserToken()), + headers: { + ...getDefaultHeaders(getCurrentUserToken()), + Asyncsyncid: asyncSyncId, + }, params, }); }; diff --git a/shared/src/test/mockJudgesChambers.ts b/shared/src/test/mockJudgesChambers.ts new file mode 100644 index 00000000000..605703ab2e4 --- /dev/null +++ b/shared/src/test/mockJudgesChambers.ts @@ -0,0 +1,237 @@ +import { JudgeChambersInfo } from '@web-client/presenter/actions/getJudgesChambersAction'; + +const JUDGES_CHAMBERS: Record = { + ASHFORDS_CHAMBERS_SECTION: { + judgeFullName: 'Tamara W. Ashford', + label: 'Ashford’s Chambers', + phoneNumber: '(202) 521-0822', + section: 'ashfordsChambers', + }, + BUCHS_CHAMBERS_SECTION: { + judgeFullName: 'Ronald L. Buch', + label: 'Buch’s Chambers', + phoneNumber: '(202) 521-0810', + section: 'buchsChambers', + }, + CARLUZZOS_CHAMBERS_SECTION: { + judgeFullName: 'Lewis R. Carluzzo', + label: 'Carluzzo’s Chambers', + phoneNumber: '(202) 521-3339', + section: 'carluzzosChambers', + }, + COHENS_CHAMBERS_SECTION: { + judgeFullName: 'Mary Ann Cohen', + label: 'Cohen’s Chambers', + phoneNumber: '(202) 521-0655', + section: 'cohensChambers', + }, + COLVINS_CHAMBERS_SECTION: { + judgeFullName: 'John O. Colvin', + label: 'Colvin’s Chambers', + phoneNumber: '(202) 521-0662', + section: 'colvinsChambers', + }, + COPELANDS_CHAMBERS_SECTION: { + judgeFullName: 'Elizabeth A. Copeland', + label: 'Copeland’s Chambers', + phoneNumber: '(202) 521-0670', + section: 'copelandsChambers', + }, + FOLEYS_CHAMBERS_SECTION: { + judgeFullName: 'Maurice B. Foley', + label: 'Foley’s Chambers', + phoneNumber: '(202) 521-0681', + section: 'foleysChambers', + }, + FRIEDS_CHAMBERS_SECTION: { + judgeFullName: 'Zachary S. Fried', + label: 'Fried’s Chambers', + phoneNumber: '(202) 521-0867', + section: 'friedsChambers', + }, + GALES_CHAMBERS_SECTION: { + judgeFullName: 'Joseph H. Gale', + label: 'Gale’s Chambers', + phoneNumber: '(202) 521-0688', + section: 'galesChambers', + }, + GOEKES_CHAMBERS_SECTION: { + judgeFullName: 'Joseph Robert Goeke', + label: 'Goeke’s Chambers', + phoneNumber: '(202) 521-0690', + section: 'goekesChambers', + }, + GREAVES_CHAMBESR_SECTION: { + judgeFullName: 'Travis A. Greaves', + label: 'Greaves’ Chambers', + phoneNumber: '(202) 521-0736', + section: 'greavesChambers', + }, + GUSTAFSONS_CHAMBERS_SECTION: { + judgeFullName: 'David Gustafson', + label: 'Gustafson’s Chambers', + phoneNumber: '(202) 521-0850', + section: 'gustafsonsChambers', + }, + HALPERNS_CHAMBERS_SECTION: { + judgeFullName: 'James S. Halpern', + label: 'Halpern’s Chambers', + phoneNumber: '(202) 521-0707', + section: 'halpernsChambers', + }, + HOLMES_CHAMBERS_SECTION: { + judgeFullName: 'Mark V. Holmes', + label: 'Holmes’ Chambers', + phoneNumber: '(202) 521-0714', + section: 'holmesChambers', + }, + JONES_CHAMBERS_SECTION: { + judgeFullName: 'Courtney D. Jones', + label: 'Jones’ Chambers', + phoneNumber: '(202) 521-0795', + section: 'jonesChambers', + }, + KERRIGANS_CHAMBERS_SECTION: { + judgeFullName: 'Kathleen Kerrigan', + label: 'Kerrigan’s Chambers', + phoneNumber: '(202) 521-0777', + section: 'kerrigansChambers', + }, + LANDYS_CHAMBERS_SECTION: { + judgeFullName: 'Adam B. Landy', + label: 'Landy’s Chambers', + phoneNumber: '(202) 521-0835', + section: 'landysChambers', + }, + LAUBERS_CHAMBERS_SECTION: { + judgeFullName: 'Albert G. Lauber', + label: 'Lauber’s Chambers', + phoneNumber: '(202) 521-0785', + section: 'laubersChambers', + }, + LEYDENS_CHAMBERS_SECTION: { + judgeFullName: 'Diana L. Leyden', + label: 'Leyden’s Chambers', + phoneNumber: '(202) 521-0823', + section: 'leydensChambers', + }, + MARSHALLS_CHAMBERS_SECTION: { + judgeFullName: 'Alina I. Marshall', + label: 'Marshall’s Chambers', + phoneNumber: '(202) 521-0738', + section: 'marshallsChambers', + }, + MARVELS_CHAMBERS_SECTION: { + judgeFullName: 'L. Paige Marvel', + label: 'Marvel’s Chambers', + phoneNumber: '(202) 521-0740', + section: 'marvelsChambers', + }, + MORRISONS_CHAMBERS_SECTION: { + judgeFullName: 'Richard T. Morrison', + label: 'Morrison’s Chambers', + phoneNumber: '(202) 521-0853', + section: 'morrisonsChambers', + }, + NEGAS_CHAMBERS_SECTION: { + judgeFullName: 'Joseph W. Nega', + label: 'Nega’s Chambers', + phoneNumber: '(202) 521-0640', + section: 'negasChambers', + }, + PANUTHOS_CHAMBERS_SECTION: { + judgeFullName: 'Peter J. Panuthos', + label: 'Panuthos’ Chambers', + phoneNumber: '(202) 521-4707', + section: 'panuthosChambers', + }, + PARIS_CHAMBERS_SECTION: { + judgeFullName: 'Elizabeth Crewson Paris', + label: 'Paris’ Chambers', + phoneNumber: '(202) 521-0839', + section: 'parisChambers', + }, + PUGHS_CHAMBERS_SECTION: { + judgeFullName: 'Cary Douglas Pugh', + label: 'Pugh’s Chambers', + phoneNumber: '(202) 521-0824', + section: 'pughsChambers', + }, + RUWES_CHAMBERS_SECTION: { + judgeFullName: 'Robert P. Ruwe', + label: 'Ruwe’s Chambers', + phoneNumber: '', // inactive judge, leave blank + section: 'ruwesChambers', + }, + SIEGELS_CHAMBERS_SECTION: { + judgeFullName: 'Jennifer E. Siegel', + label: 'Siegel’s Chambers', + phoneNumber: '(202) 521-0720', + section: 'siegelsChambers', + }, + THORNTONS_CHAMBERS_SECTION: { + judgeFullName: 'Michael B. Thornton', + label: 'Thornton’s Chambers', + phoneNumber: '(202) 521-0766', + section: 'thorntonsChambers', + }, + TOROS_CHAMBERS_SECTION: { + judgeFullName: 'Emin Toro', + label: 'Toro’s Chambers', + phoneNumber: '(202) 521-0760', + section: 'torosChambers', + }, + URDAS_CHAMBERS_SECTION: { + judgeFullName: 'Patrick J. Urda', + label: 'Urda’s Chambers', + phoneNumber: '(202) 521-0800', + section: 'urdasChambers', + }, + VASQUEZS_CHAMBERS_SECTION: { + judgeFullName: 'Juan F. Vasquez', + label: 'Vasquez’s Chambers', + phoneNumber: '(202) 521-0778', + section: 'vasquezsChambers', + }, + WAYS_CHAMBERS_SECTION: { + judgeFullName: 'Kashi Way', + label: 'Way’s Chambers', + phoneNumber: '', // TODO + section: 'waysChambers', + }, + WEILERS_CHAMBERS_SECTION: { + judgeFullName: 'Christian N. Weiler', + label: 'Weiler’s Chambers', + phoneNumber: '(202) 521-0649', + section: 'weilersChambers', + }, + WELLS_CHAMBERS_SECTION: { + judgeFullName: 'Thomas B. Wells', + label: 'Wells’ Chambers', + phoneNumber: '', // inactive judge, leave blank + section: 'wellsChambers', + }, +}; + +export const getTestJudgesChambers = () => { + return JUDGES_CHAMBERS; +}; + +export const getTestJudgesChambersWithLegacy = () => { + return { + ...JUDGES_CHAMBERS, + LEGACY_JUDGES_CHAMBERS_SECTION: { + label: 'Legacy Judges Chambers', + section: 'legacyJudgesChambers', + }, + }; +}; + +export const getChambersSectionsLabels = () => { + const chambersSectionsLabels = []; + Object.keys(getTestJudgesChambers()).forEach(k => { + const chambers = JUDGES_CHAMBERS[k]; + chambersSectionsLabels[chambers.section] = chambers.label; + }); + return chambersSectionsLabels; +}; diff --git a/shared/src/test/mockUsers.ts b/shared/src/test/mockUsers.ts index 8c7871e854b..9c52719b780 100644 --- a/shared/src/test/mockUsers.ts +++ b/shared/src/test/mockUsers.ts @@ -12,11 +12,19 @@ import { } from '../business/entities/EntityConstants'; import { RawIrsPractitioner } from '@shared/business/entities/IrsPractitioner'; import { RawPractitioner } from '@shared/business/entities/Practitioner'; +import { RawPrivatePractitioner } from '@shared/business/entities/PrivatePractitioner'; import { RawUser } from '@shared/business/entities/User'; + import { - getJudgesChambers, - getJudgesChambersWithLegacy, -} from '../../../web-client/src/business/chambers/getJudgesChambers'; + getTestJudgesChambers, + getTestJudgesChambersWithLegacy, +} from './mockJudgesChambers'; + +const COLVINS_CHAMBERS_SECTION = + getTestJudgesChambers().COLVINS_CHAMBERS_SECTION.section; + +const LEGACY_CHAMBERS_SECTION = + getTestJudgesChambersWithLegacy().LEGACY_JUDGES_CHAMBERS_SECTION.section; export const adminUser: RawUser = { email: 'admin@example.com', @@ -38,7 +46,7 @@ export const colvinsChambersUser = { email: 'chambers@e.mail', name: 'Chandler Chambers', role: ROLES.chambers, - section: getJudgesChambers().COLVINS_CHAMBERS_SECTION.section, + section: COLVINS_CHAMBERS_SECTION, userId: '3d9fa032-ad00-475a-9183-8aa0229a31eb', }; @@ -128,7 +136,7 @@ export const legacyJudgeUser: RawUser = { entityName: 'User', name: 'Legacy Judge Ginsburg', role: ROLES.legacyJudge, - section: getJudgesChambersWithLegacy().LEGACY_JUDGES_CHAMBERS_SECTION.section, + section: LEGACY_CHAMBERS_SECTION, userId: 'dc67e189-cf3e-4ca3-a33f-91db111ec270', }; @@ -139,24 +147,28 @@ export const judgeColvin: RawUser = { judgeFullName: 'John O. Colvin', name: 'Colvin', role: ROLES.judge, - section: getJudgesChambers().COLVINS_CHAMBERS_SECTION.section, + section: COLVINS_CHAMBERS_SECTION, userId: 'd17b07dc-6455-447e-bea3-f91d12ac5a6a', }; -export const petitionerUser = { +export const petitionerUser: RawUser = { email: 'petitioner@example.com', + entityName: 'User', name: 'Tax Payer', role: ROLES.petitioner, section: 'petitioner', userId: 'd7d90c05-f6cd-442c-a168-202db587f16f', }; -export const privatePractitionerUser = { +export const privatePractitionerUser: RawPrivatePractitioner = { barNumber: 'BN1234', email: 'privatePractitioner@example.com', + entityName: 'User', + firmName: 'Law offices of Private Practitioner', name: 'Private Practitioner', + representing: [], role: ROLES.privatePractitioner, - section: 'privatePractitioner', + serviceIndicator: SERVICE_INDICATOR_TYPES.SI_PAPER, userId: '330d4b65-620a-489d-8414-6623653ebc4f', }; diff --git a/shared/test-pdf-expected-images/Generated_Petition.pdf.1.png b/shared/test-pdf-expected-images/Generated_Petition.pdf.1.png new file mode 100644 index 00000000000..12dda1cea9a Binary files /dev/null and b/shared/test-pdf-expected-images/Generated_Petition.pdf.1.png differ diff --git a/shared/test-pdf-expected-images/Generated_Petition.pdf.2.png b/shared/test-pdf-expected-images/Generated_Petition.pdf.2.png new file mode 100644 index 00000000000..f5998111060 Binary files /dev/null and b/shared/test-pdf-expected-images/Generated_Petition.pdf.2.png differ diff --git a/web-api/src/app-public.ts b/web-api/src/app-public.ts index 07567744d37..ee9a13732a0 100644 --- a/web-api/src/app-public.ts +++ b/web-api/src/app-public.ts @@ -1,9 +1,9 @@ import { createApplicationContext } from './applicationContext'; +import { expressLogger } from './logger'; import { get } from './persistence/dynamodbClientService'; import { getCurrentInvoke } from '@vendia/serverless-express'; import { json, urlencoded } from 'body-parser'; import { lambdaWrapper } from './lambdaWrapper'; -import { logger } from './logger'; import { set } from 'lodash'; import cors from 'cors'; import express from 'express'; @@ -67,7 +67,7 @@ app.use((req, res, next) => { next(); }); -app.use(logger()); +app.use(expressLogger); import { advancedQueryLimiter } from './middleware/advancedQueryLimiter'; import { casePublicSearchLambda } from './lambdas/public-api/casePublicSearchLambda'; diff --git a/web-api/src/app.ts b/web-api/src/app.ts index 81687c34410..a20657ec20a 100644 --- a/web-api/src/app.ts +++ b/web-api/src/app.ts @@ -50,6 +50,7 @@ import { downloadPolicyUrlLambda } from './lambdas/documents/downloadPolicyUrlLa import { editPaperFilingLambda } from './lambdas/documents/editPaperFilingLambda'; import { editPractitionerDocumentLambda } from './lambdas/practitioners/editPractitionerDocumentLambda'; import { exportPendingReportLambda } from '@web-api/lambdas/pendingItems/exportPendingReportLambda'; +import { expressLogger } from './logger'; import { fetchPendingItemsLambda } from './lambdas/pendingItems/fetchPendingItemsLambda'; import { fileAndServeCourtIssuedDocumentLambda } from './lambdas/cases/fileAndServeCourtIssuedDocumentLambda'; import { fileCorrespondenceDocumentLambda } from './lambdas/correspondence/fileCorrespondenceDocumentLambda'; @@ -127,7 +128,6 @@ import { getUsersPendingEmailLambda } from './lambdas/users/getUsersPendingEmail import { getWorkItemLambda } from './lambdas/workitems/getWorkItemLambda'; import { ipLimiter } from './middleware/ipLimiter'; import { lambdaWrapper } from './lambdaWrapper'; -import { logger } from './logger'; import { loginLambda } from '@web-api/lambdas/auth/loginLambda'; import { opinionAdvancedSearchLambda } from './lambdas/documents/opinionAdvancedSearchLambda'; import { orderAdvancedSearchLambda } from './lambdas/documents/orderAdvancedSearchLambda'; @@ -276,7 +276,7 @@ app.use((req, res, next) => { next(); }); -app.use(logger()); +app.use(expressLogger); /** * Important note: order of routes DOES matter! @@ -824,8 +824,14 @@ app.delete( lambdaWrapper(getCustomCaseReportLambda), ); app.get( - '/reports/printable-case-inventory-report', - lambdaWrapper(generatePrintableCaseInventoryReportLambda), + '/async/reports/printable-case-inventory-report', + lambdaWrapper( + generatePrintableCaseInventoryReportLambda, + { + isAsyncSync: true, + }, + applicationContext, + ), ); app.get('/reports/pending-items', lambdaWrapper(fetchPendingItemsLambda)); app.get( diff --git a/web-api/src/applicationContext.ts b/web-api/src/applicationContext.ts index 92b9a3d4ef1..1943fac5323 100644 --- a/web-api/src/applicationContext.ts +++ b/web-api/src/applicationContext.ts @@ -34,7 +34,6 @@ import { UserCase } from '../../shared/src/business/entities/UserCase'; import { UserCaseNote } from '../../shared/src/business/entities/notes/UserCaseNote'; import { WorkItem } from '../../shared/src/business/entities/WorkItem'; import { WorkerMessage } from '@web-api/gateways/worker/workerRouter'; -import { createLogger } from './createLogger'; import { defaultProvider } from '@aws-sdk/credential-provider-node'; import { environment } from '@web-api/environment'; import { @@ -50,6 +49,7 @@ import { getDocumentGenerators } from './getDocumentGenerators'; import { getDynamoClient } from '@web-api/persistence/dynamo/getDynamoClient'; import { getEmailClient } from './persistence/messages/getEmailClient'; import { getEnvironment, getUniqueId } from '../../shared/src/sharedAppContext'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { getNotificationClient } from '@web-api/notifications/getNotificationClient'; import { getNotificationService } from '@web-api/notifications/getNotificationService'; import { getPersistenceGateway } from './getPersistenceGateway'; @@ -72,7 +72,6 @@ import { sendSetTrialSessionCalendarEvent } from './persistence/messages/sendSet import { sendSlackNotification } from './dispatchers/slack/sendSlackNotification'; import { worker } from '@web-api/gateways/worker/worker'; import { workerLocal } from '@web-api/gateways/worker/workerLocal'; - import axios from 'axios'; import pug from 'pug'; import sass from 'sass'; @@ -97,20 +96,8 @@ const entitiesByName = { WorkItem, }; -export const createApplicationContext = ( - appContextUser = {}, - logger = createLogger(), -) => { - const user = new User(appContextUser); - - if (process.env.NODE_ENV === 'production') { - const authenticated = user && Object.keys(user).length; - logger.defaultMeta = logger.defaultMeta || {}; - logger.defaultMeta.user = authenticated - ? user - : { role: 'unauthenticated' }; - } - +// eslint-disable-next-line @typescript-eslint/no-unused-vars +export const createApplicationContext = (appContextUser = {}) => { return { barNumberGenerator, docketNumberGenerator, @@ -282,12 +269,7 @@ export const createApplicationContext = ( }), isAuthorized, isCurrentColorActive, - logger: { - debug: (message, context?) => logger.debug(message, { context }), - error: (message, context?) => logger.error(message, { context }), - info: (message, context?) => logger.info(message, { context }), - warn: (message, context?) => logger.warn(message, { context }), - }, + logger: getLogger(), setTimeout: (callback, timeout) => setTimeout(callback, timeout), }; }; diff --git a/web-api/src/business/useCaseHelper/getJudgeForUserHelper.test.ts b/web-api/src/business/useCaseHelper/getJudgeForUserHelper.test.ts index 3c14e71bc81..0b501f4ccc4 100644 --- a/web-api/src/business/useCaseHelper/getJudgeForUserHelper.test.ts +++ b/web-api/src/business/useCaseHelper/getJudgeForUserHelper.test.ts @@ -11,6 +11,7 @@ import { validUser } from '@shared/test/mockUsers'; describe('getJudgeForUserHelper', () => { const judgeUser = { ...validUser, + contact: { phone: validUser.contact?.phone }, role: ROLES.judge, section: 'judgeChambers', }; @@ -51,7 +52,7 @@ describe('getJudgeForUserHelper', () => { }); }); - it('returns the retrieved from the database', async () => { + it('returns the retrieved judge from the database', async () => { const result = await getJudgeForUserHelper(applicationContext, { user: mockJudgeUser, }); diff --git a/web-api/src/business/useCases/createCaseInteractor.test.ts b/web-api/src/business/useCases/createCaseInteractor.test.ts index 1ccd9e0c555..03595fd9a9f 100644 --- a/web-api/src/business/useCases/createCaseInteractor.test.ts +++ b/web-api/src/business/useCases/createCaseInteractor.test.ts @@ -48,9 +48,11 @@ describe('createCaseInteractor', () => { contactSecondary: {}, filingType: 'Myself', hasIrsNotice: true, + irsNoticesRedactionAcknowledgement: true, partyType: PARTY_TYPES.petitioner, petitionFile: new File([], 'test.pdf'), petitionFileSize: 1, + petitionRedactionAcknowledgement: true, preferredTrialCity: 'Fresno, California', procedureType: 'Small', signature: true, @@ -123,6 +125,11 @@ describe('createCaseInteractor', () => { ); expect(result).toBeDefined(); + const petitionDocketEntry = result.docketEntries.find( + d => d.eventCode === INITIAL_DOCUMENT_TYPES.petition.eventCode, + ); + expect(petitionDocketEntry).toBeDefined(); + expect(petitionDocketEntry.redactionAcknowledgement).toEqual(true); expect( applicationContext.getUseCaseHelpers().createCaseAndAssociations.mock .calls[0][0].caseToCreate, @@ -271,9 +278,11 @@ describe('createCaseInteractor', () => { contactSecondary: {}, filingType: 'Myself', hasIrsNotice: true, + irsNoticesRedactionAcknowledgement: true, partyType: PARTY_TYPES.petitioner, petitionFile: new File([], 'test.pdf'), petitionFileSize: 1, + petitionRedactionAcknowledgement: true, preferredTrialCity: 'Fresno, California', procedureType: 'Small', signature: true, @@ -290,6 +299,12 @@ describe('createCaseInteractor', () => { expect(result.privatePractitioners![0].representing).toEqual([ getContactPrimary(result).contactId, ]); + const petitionDocketEntry = result.docketEntries.find( + d => d.eventCode === INITIAL_DOCUMENT_TYPES.petition.eventCode, + ); + + expect(petitionDocketEntry).toBeDefined(); + expect(petitionDocketEntry.redactionAcknowledgement).toEqual(true); expect( applicationContext.getUseCaseHelpers().createCaseAndAssociations, ).toHaveBeenCalled(); @@ -321,16 +336,18 @@ describe('createCaseInteractor', () => { contactSecondary: {}, filingType: 'Myself', hasIrsNotice: true, + irsNoticesRedactionAcknowledgement: true, partyType: PARTY_TYPES.petitioner, petitionFile: new File([], 'test.pdf'), petitionFileSize: 1, + petitionRedactionAcknowledgement: true, preferredTrialCity: 'Fresno, California', procedureType: 'Small', signature: true, stinFile: new File([], 'test.pdf'), stinFileSize: 1, }, - stinFileId: '96759830-8970-486f-916b-23439a8ebb70', + stinFileId: '413f62ce-7c8d-446e-aeda-14a2a625a611', }, user, ); @@ -341,6 +358,7 @@ describe('createCaseInteractor', () => { ); expect(atpDocketEntry).toBeDefined(); + expect(atpDocketEntry.redactionAcknowledgement).toEqual(true); }); it('should create a case successfully with multiple "Attachment to Petition" documents', async () => { @@ -369,16 +387,18 @@ describe('createCaseInteractor', () => { contactSecondary: {}, filingType: 'Myself', hasIrsNotice: true, + irsNoticesRedactionAcknowledgement: true, partyType: PARTY_TYPES.petitioner, petitionFile: new File([], 'test.pdf'), petitionFileSize: 1, + petitionRedactionAcknowledgement: true, preferredTrialCity: 'Fresno, California', procedureType: 'Small', signature: true, stinFile: new File([], 'test.pdf'), stinFileSize: 1, }, - stinFileId: '96759830-8970-486f-916b-23439a8ebb70', + stinFileId: '413f62ce-7c8d-446e-aeda-14a2a625a611', }, user, ); @@ -388,6 +408,8 @@ describe('createCaseInteractor', () => { d.eventCode === INITIAL_DOCUMENT_TYPES.attachmentToPetition.eventCode, ); expect(atpDocketEntries).toHaveLength(2); + expect(atpDocketEntries[0].redactionAcknowledgement).toEqual(true); + expect(atpDocketEntries[1].redactionAcknowledgement).toEqual(true); }); it('should create a case with contact primary and secondary successfully as a practitioner', async () => { @@ -526,7 +548,7 @@ describe('createCaseInteractor', () => { }); }); - it('should set serviceIndicator to none for petitioner when case is created by a private petitioner', async () => { + it('should remove email and serviceIndicator for petitioner when case is created by a private petitioner', async () => { user = new PrivatePractitioner({ barNumber: 'BN1234', email: 'kb@example.com', @@ -572,6 +594,7 @@ describe('createCaseInteractor', () => { result.petitioners.forEach(p => { expect(p.serviceIndicator).toBe(SERVICE_INDICATOR_TYPES.SI_NONE); + expect(p.email).toBeUndefined(); }); }); }); diff --git a/web-api/src/business/useCases/createCaseInteractor.ts b/web-api/src/business/useCases/createCaseInteractor.ts index 5a73e91f99d..76b3a49ea9c 100644 --- a/web-api/src/business/useCases/createCaseInteractor.ts +++ b/web-api/src/business/useCases/createCaseInteractor.ts @@ -110,7 +110,9 @@ export const createCaseInteractor = async ( ); } - // remove the email from contactPrimary since the practitioners array should have a service email + // remove the email from contactPrimary + // since the practitioners array should have a service email + // and paperPetitionEmail is used as email for the petitioner delete petitionEntity.getContactPrimary().email; delete petitionEntity.getContactPrimary().serviceIndicator; @@ -162,6 +164,7 @@ export const createCaseInteractor = async ( isFileAttached: true, isOnDocketRecord: true, privatePractitioners, + redactionAcknowledgement: petitionEntity.petitionRedactionAcknowledgement, }, { authorizedUser, petitioners: caseToAdd.petitioners }, ); @@ -261,6 +264,8 @@ export const createCaseInteractor = async ( petitionMetadata.hasIrsNotice && petitionMetadata.irsNotices?.[index]?.noticeIssuedDate, privatePractitioners, + redactionAcknowledgement: + petitionEntity.irsNoticesRedactionAcknowledgement, taxYear: petitionMetadata.hasIrsNotice && petitionMetadata.irsNotices?.[index]?.taxYear, diff --git a/web-api/src/business/useCases/generateDocketRecordPdfInteractor.test.ts b/web-api/src/business/useCases/generateDocketRecordPdfInteractor.test.ts index 2e228f6515c..eadf7622b7a 100644 --- a/web-api/src/business/useCases/generateDocketRecordPdfInteractor.test.ts +++ b/web-api/src/business/useCases/generateDocketRecordPdfInteractor.test.ts @@ -125,6 +125,7 @@ describe('generateDocketRecordPdfInteractor', () => { it('sets counsel name to `None` when there is no counsel representing the petitioner', async () => { const mockPractitionerOnCase = { ...privatePractitionerUser, + email: 'privatePractitioner@example.com', representing: ['b4302f61-2cff-4a57-bacf-1f817ffbaf8d'], }; diff --git a/web-api/src/business/useCases/user/getUsersInSectionInteractor.test.ts b/web-api/src/business/useCases/user/getUsersInSectionInteractor.test.ts index 0639d2f815b..5616ba0b2f7 100644 --- a/web-api/src/business/useCases/user/getUsersInSectionInteractor.test.ts +++ b/web-api/src/business/useCases/user/getUsersInSectionInteractor.test.ts @@ -30,7 +30,7 @@ describe('Get users in section', () => { { ...mockJudgeUser, isSeniorJudge: false, - judgeFullName: 'Test Judge 1', + judgeFullName: 'Test Judge 2', judgeTitle: 'Judge', name: 'Test Judge 2', userId: 'ea83cea2-5ce9-451d-b3d6-1e7c0e51d311', diff --git a/web-api/src/business/useCases/workItems/getDocumentQCInboxForSectionInteractor.test.ts b/web-api/src/business/useCases/workItems/getDocumentQCInboxForSectionInteractor.test.ts index da9f5cad66c..ba16d0c064d 100644 --- a/web-api/src/business/useCases/workItems/getDocumentQCInboxForSectionInteractor.test.ts +++ b/web-api/src/business/useCases/workItems/getDocumentQCInboxForSectionInteractor.test.ts @@ -1,6 +1,7 @@ import { DOCKET_SECTION } from '../../../../../shared/src/business/entities/EntityConstants'; import { applicationContext } from '../../../../../shared/src/business/test/createTestApplicationContext'; import { getDocumentQCInboxForSectionInteractor } from './getDocumentQCInboxForSectionInteractor'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { mockDocketClerkUser, mockJudgeUser, @@ -55,8 +56,7 @@ describe('getDocumentQCInboxForSectionInteractor', () => { applicationContext, { judgeUserName: 'Ashford', - section: applicationContext.getPersistenceGateway().getJudgesChambers() - .ASHFORDS_CHAMBERS_SECTION.section, + section: getTestJudgesChambers().ASHFORDS_CHAMBERS_SECTION.section, }, mockJudgeUser, ); diff --git a/web-api/src/createLogger.ts b/web-api/src/createLogger.ts index 45013555f18..d62c42c0284 100644 --- a/web-api/src/createLogger.ts +++ b/web-api/src/createLogger.ts @@ -1,10 +1,11 @@ -import { cloneDeep, isEqual, unset } from 'lodash'; import { + LoggerOptions, config, createLogger as createWinstonLogger, format, transports, } from 'winston'; +import { cloneDeep, isEqual, unset } from 'lodash'; import colorize from 'logform/colorize'; import combine from 'logform/combine'; import errors from 'logform/errors'; @@ -37,12 +38,17 @@ export const removeDuplicateLogInformation = format(logEntry => { return copy; }); -export const createLogger = (opts = {}) => { +export const createLogger = (opts: LoggerOptions = {}) => { const options = { defaultMeta: {}, - level: opts.logLevel || process.env.LOG_LEVEL || 'debug', + level: opts.level || process.env.LOG_LEVEL || 'debug', levels: config.syslog.levels, - transports: [new transports.Console()], + transports: [ + new transports.Console({ + handleExceptions: true, + handleRejections: true, + }), + ], ...opts, }; diff --git a/web-api/src/gateways/worker/workerLocal.ts b/web-api/src/gateways/worker/workerLocal.ts index 458e8116ca2..cdd088014c5 100644 --- a/web-api/src/gateways/worker/workerLocal.ts +++ b/web-api/src/gateways/worker/workerLocal.ts @@ -7,13 +7,15 @@ import { WorkerMessage, workerRouter, } from '@web-api/gateways/worker/workerRouter'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; export const workerLocal: WorkerHandler = async ( applicationContext: ServerApplicationContext, { message }: { message: WorkerMessage }, ): Promise => { // Simulate what happens on a deployed environment when a message is sent to SQS. - const appContext = createApplicationContext(message.authorizedUser); + const appContext = createApplicationContext(); + getLogger().addUser({ user: message.authorizedUser }); setTimeout( async () => { try { diff --git a/web-api/src/genericHandler.ts b/web-api/src/genericHandler.ts index 0ee582fc501..b8b5a59326b 100644 --- a/web-api/src/genericHandler.ts +++ b/web-api/src/genericHandler.ts @@ -8,6 +8,7 @@ import { getUserFromAuthHeader, handle, } from './middleware/apiGatewayHelper'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; export const dataSecurityFilter = ( data, @@ -85,7 +86,8 @@ export const genericHandler = ( return handle(awsEvent, async () => { const user = getUserFromAuthHeader(awsEvent); const clientConnectionId = getConnectionIdFromEvent(awsEvent); - const applicationContext = createApplicationContext(user, awsEvent.logger); + const applicationContext = createApplicationContext(); + getLogger().addUser({ user }); delete awsEvent.logger; diff --git a/web-api/src/lambdaWrapper.test.ts b/web-api/src/lambdaWrapper.test.ts index c1609bc6b15..a6f2f60e01e 100644 --- a/web-api/src/lambdaWrapper.test.ts +++ b/web-api/src/lambdaWrapper.test.ts @@ -10,6 +10,10 @@ describe('lambdaWrapper', () => { let orignalParse; beforeAll(() => { + (getCurrentInvoke as jest.Mock).mockReturnValue({ + event: {}, + }); + orignalParse = JSON.parse; jest.spyOn(console, 'log').mockImplementation(() => {}); }); diff --git a/web-api/src/lambdaWrapper.ts b/web-api/src/lambdaWrapper.ts index 6d9bc78bec8..17165ce4011 100644 --- a/web-api/src/lambdaWrapper.ts +++ b/web-api/src/lambdaWrapper.ts @@ -34,9 +34,9 @@ export const lambdaWrapper = ( process.env.NODE_ENV != 'production'; // If you'd like to test the terminal user functionality locally, make this boolean true - const currentInvoke = getCurrentInvoke(); + const { event: currentInvokeEvent } = getCurrentInvoke(); let isTerminalUser = - get(currentInvoke, 'event.requestContext.authorizer.isTerminalUser') === + get(currentInvokeEvent, 'requestContext.authorizer.isTerminalUser') === 'true'; const event = { @@ -44,7 +44,10 @@ export const lambdaWrapper = ( isTerminalUser, path: req.path, pathParameters: req.params, - queryStringParameters: req.query, + queryStringParameters: { + ...currentInvokeEvent.queryStringParameters, + ...req.query, + }, }; const user = getUserFromAuthHeader(event); diff --git a/web-api/src/lambdas/cases/sealInLowerEnvironmentLambda.ts b/web-api/src/lambdas/cases/sealInLowerEnvironmentLambda.ts index 694b9a4fb56..f55e17f2404 100644 --- a/web-api/src/lambdas/cases/sealInLowerEnvironmentLambda.ts +++ b/web-api/src/lambdas/cases/sealInLowerEnvironmentLambda.ts @@ -1,5 +1,6 @@ import { AuthUser } from '@shared/business/entities/authUser/AuthUser'; import { createApplicationContext } from '../../applicationContext'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { sealInLowerEnvironment } from '@web-api/business/useCaseHelper/sealInLowerEnvironment'; /** @@ -16,7 +17,8 @@ export const sealInLowerEnvironmentLambda = async event => { userId: 'N/A', }; - const applicationContext = createApplicationContext(user); + const applicationContext = createApplicationContext(); + getLogger().addUser({ user }); const records = event.Records.map(record => ({ ...JSON.parse(record.Sns.Message), diff --git a/web-api/src/lambdas/cognitoAuthorizer/cognito-authorizer.test.ts b/web-api/src/lambdas/cognitoAuthorizer/cognito-authorizer.test.ts index b3526210871..3046295cadb 100644 --- a/web-api/src/lambdas/cognitoAuthorizer/cognito-authorizer.test.ts +++ b/web-api/src/lambdas/cognitoAuthorizer/cognito-authorizer.test.ts @@ -1,15 +1,17 @@ -import { createLogger } from '../../createLogger'; import { handler } from './cognito-authorizer'; -import { transports } from 'winston'; import axios from 'axios'; -import fs from 'fs'; import jwk from 'jsonwebtoken'; -const { createLogger: actualCreateLogger } = jest.requireActual( - '../../../src/createLogger', -); -jest.mock('../../../src/createLogger', () => { - return { createLogger: jest.fn() }; +const mockLogger = { + addContext: jest.fn(), + clearContext: jest.fn(), + info: jest.fn(), + warn: jest.fn(), +}; +jest.mock('@web-api/utilities/logger/getLogger', () => { + return { + getLogger: () => mockLogger, + }; }); jest.mock('jsonwebtoken', () => { return { @@ -48,18 +50,9 @@ describe('cognito-authorizer', () => { }); }; - let event, context, transport; + let event, context; beforeEach(() => { - transport = new transports.Stream({ - stream: fs.createWriteStream('/dev/null'), - }); - - (createLogger as jest.Mock).mockImplementation(opts => { - opts.transports = [transport]; - return actualCreateLogger(opts); - }); - event = { authorizationToken: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6ImFkbWlzc2lvbnNjbGVya0BleGFtcGxlLmNvbSIsIm5hbWUiOiJUZXN0IEFkbWlzc2lvbnMgQ2xlcmsiLCJyb2xlIjoiYWRtaXNzaW9uc2NsZXJrIiwic2VjdGlvbiI6ImFkbWlzc2lvbnMiLCJ1c2VySWQiOiI5ZDdkNjNiNy1kN2E1LTQ5MDUtYmE4OS1lZjcxYmYzMDA1N2YiLCJjdXN0b206cm9sZSI6ImFkbWlzc2lvbnNjbGVyayIsInN1YiI6IjlkN2Q2M2I3LWQ3YTUtNDkwNS1iYTg5LWVmNzFiZjMwMDU3ZiIsImlhdCI6MTYwOTQ0NTUyNn0.kow3pAUloDseD3isrxgtKBpcKsjMktbRBzY41c1NRqA', @@ -79,7 +72,6 @@ describe('cognito-authorizer', () => { }); jest.spyOn(axios, 'get'); - jest.spyOn(transport, 'log'); }); it('returns unauthorized when token is missing', async () => { @@ -87,12 +79,8 @@ describe('cognito-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('No authorizationToken found'), - }), - expect.any(Function), + expect(mockLogger.info).toHaveBeenCalledWith( + 'No authorizationToken found in the header', ); }); @@ -103,15 +91,9 @@ describe('cognito-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'Could not fetch keys for token issuer', - ), - stack: expect.stringContaining('Error: any error'), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Could not fetch keys for token issuer, considering request unauthorized', + new Error('any error'), ); }); @@ -122,15 +104,9 @@ describe('cognito-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'Could not fetch keys for token issuer', - ), - stack: expect.any(String), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Could not fetch keys for token issuer, considering request unauthorized', + expect.anything(), ); }); @@ -143,17 +119,13 @@ describe('cognito-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( + expect(mockLogger.warn).toHaveBeenCalledWith( + 'The key used to sign the authorization token was not found in the user pool’s keys, considering request unauthorized', expect.objectContaining({ issuer: expect.any(String), keys: expect.any(Array), - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'was not found in the user pool’s keys', - ), requestedKeyId: 'key-identifier', }), - expect.any(Function), ); }); @@ -175,13 +147,9 @@ describe('cognito-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining('token is not valid'), - stack: expect.stringContaining('Error: verification failed'), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'The token is not valid, considering request unauthorized', + new Error('verification failed'), ); }); @@ -207,14 +175,9 @@ describe('cognito-authorizer', () => { }), ); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('Request authorized'), - metadata: expect.objectContaining({ policy }), - }), - expect.any(Function), - ); + expect(mockLogger.info).toHaveBeenCalledWith('Request authorized', { + metadata: { policy }, + }); }); it('returns IAM policy to allow invoking requested lambda when authorized using the payload custom:userId', async () => { @@ -239,14 +202,9 @@ describe('cognito-authorizer', () => { }), ); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('Request authorized'), - metadata: expect.objectContaining({ policy }), - }), - expect.any(Function), - ); + expect(mockLogger.info).toHaveBeenCalledWith('Request authorized', { + metadata: { policy }, + }); }); it('caches keys for issuers', async () => { diff --git a/web-api/src/lambdas/cognitoAuthorizer/createAuthorizer.ts b/web-api/src/lambdas/cognitoAuthorizer/createAuthorizer.ts index 1a0ca6c3d5c..aa54c27ff96 100644 --- a/web-api/src/lambdas/cognitoAuthorizer/createAuthorizer.ts +++ b/web-api/src/lambdas/cognitoAuthorizer/createAuthorizer.ts @@ -2,36 +2,15 @@ import { APIGatewayAuthorizerResult, APIGatewayRequestAuthorizerEvent, } from 'aws-lambda'; -import { createLogger } from '../../createLogger'; import { createPublicKey } from 'crypto'; import { environment } from '@web-api/environment'; -import { transports } from 'winston'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import axios from 'axios'; import jwk from 'jsonwebtoken'; -const transport = new transports.Console({ - handleExceptions: true, - handleRejections: true, -}); - const issMain = `https://cognito-idp.us-east-1.amazonaws.com/${environment.userPoolId}`; const issIrs = `https://cognito-idp.us-east-1.amazonaws.com/${environment.userPoolIrsId}`; -const getLogger = context => { - return createLogger({ - defaultMeta: { - environment: { - stage: process.env.STAGE, - }, - requestId: { - authorizer: context.awsRequestId, - }, - }, - logLevel: context.logLevel, - transports: [transport], - }); -}; - const decodeToken = requestToken => { const { header, payload } = jwk.decode(requestToken, { complete: true }); return { iss: payload.iss, kid: header.kid }; @@ -74,7 +53,16 @@ const throw401GatewayError = () => { export const createAuthorizer = getToken => async (event: APIGatewayRequestAuthorizerEvent, context) => { - const logger = getLogger(context); + const logger = getLogger(); + logger.clearContext(); + logger.addContext({ + environment: { + stage: process.env.STAGE, + }, + requestId: { + authorizer: context.awsRequestId, + }, + }); let token; try { diff --git a/web-api/src/lambdas/cognitoAuthorizer/websocket-authorizer.test.ts b/web-api/src/lambdas/cognitoAuthorizer/websocket-authorizer.test.ts index d3b03fbc0b1..3569907db1c 100644 --- a/web-api/src/lambdas/cognitoAuthorizer/websocket-authorizer.test.ts +++ b/web-api/src/lambdas/cognitoAuthorizer/websocket-authorizer.test.ts @@ -1,14 +1,17 @@ -const { createLogger: actualCreateLogger } = jest.requireActual( - '../../../src/createLogger', -); -import { createLogger } from '../../createLogger'; import { handler } from './websocket-authorizer'; -import { transports } from 'winston'; import axios from 'axios'; -import fs from 'fs'; import jwk from 'jsonwebtoken'; -jest.mock('../../../src/createLogger', () => { - return { createLogger: jest.fn() }; + +const mockLogger = { + addContext: jest.fn(), + clearContext: jest.fn(), + info: jest.fn(), + warn: jest.fn(), +}; +jest.mock('@web-api/utilities/logger/getLogger', () => { + return { + getLogger: () => mockLogger, + }; }); jest.mock('jsonwebtoken', () => { return { @@ -47,18 +50,9 @@ describe('websocket-authorizer', () => { }); }; - let event, context, transport; + let event, context; beforeEach(() => { - transport = new transports.Stream({ - stream: fs.createWriteStream('/dev/null'), - }); - - createLogger.mockImplementation(opts => { - opts.transports = [transport]; - return actualCreateLogger(opts); - }); - event = { methodArn: 'arn:aws:execute-api:us-east-1:aws-account-id:api-gateway-id/stage/GET/path', @@ -75,7 +69,6 @@ describe('websocket-authorizer', () => { }; jest.spyOn(axios, 'get'); - jest.spyOn(transport, 'log'); jwk.decode.mockReturnValue({ header: { kid: 'key-identifier' }, @@ -88,12 +81,8 @@ describe('websocket-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('No authorizationToken found'), - }), - expect.any(Function), + expect(mockLogger.info).toHaveBeenCalledWith( + 'No authorizationToken found in the header', ); }); @@ -104,15 +93,9 @@ describe('websocket-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'Could not fetch keys for token issuer', - ), - stack: expect.stringContaining('Error: any error'), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Could not fetch keys for token issuer, considering request unauthorized', + new Error('any error'), ); }); @@ -123,15 +106,9 @@ describe('websocket-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'Could not fetch keys for token issuer', - ), - stack: expect.any(String), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'Could not fetch keys for token issuer, considering request unauthorized', + expect.anything(), ); }); @@ -144,17 +121,13 @@ describe('websocket-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( + expect(mockLogger.warn).toHaveBeenCalledWith( + 'The key used to sign the authorization token was not found in the user pool’s keys, considering request unauthorized', expect.objectContaining({ issuer: expect.any(String), keys: expect.any(Array), - level: expect.stringContaining('warning'), - message: expect.stringContaining( - 'was not found in the user pool’s keys', - ), requestedKeyId: 'key-identifier', }), - expect.any(Function), ); }); @@ -176,13 +149,9 @@ describe('websocket-authorizer', () => { await expect(() => handler(event, context)).rejects.toThrow('Unauthorized'); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('warning'), - message: expect.stringContaining('token is not valid'), - stack: expect.stringContaining('Error: verification failed'), - }), - expect.any(Function), + expect(mockLogger.warn).toHaveBeenCalledWith( + 'The token is not valid, considering request unauthorized', + expect.anything(), ); }); @@ -208,14 +177,9 @@ describe('websocket-authorizer', () => { }), ); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('Request authorized'), - metadata: expect.objectContaining({ policy }), - }), - expect.any(Function), - ); + expect(mockLogger.info).toHaveBeenCalledWith('Request authorized', { + metadata: { policy }, + }); }); it('returns IAM policy to allow invoking requested lambda when authorized using the payload custom:userId', async () => { @@ -240,14 +204,9 @@ describe('websocket-authorizer', () => { }), ); - expect(transport.log).toHaveBeenCalledWith( - expect.objectContaining({ - level: expect.stringContaining('info'), - message: expect.stringContaining('Request authorized'), - metadata: expect.objectContaining({ policy }), - }), - expect.any(Function), - ); + expect(mockLogger.info).toHaveBeenCalledWith('Request authorized', { + metadata: { policy }, + }); }); it('caches keys for issuers', async () => { diff --git a/web-api/src/lambdas/cognitoAuthorizer/worker-handler.ts b/web-api/src/lambdas/cognitoAuthorizer/worker-handler.ts index f9deadf3861..0ee8486f3de 100644 --- a/web-api/src/lambdas/cognitoAuthorizer/worker-handler.ts +++ b/web-api/src/lambdas/cognitoAuthorizer/worker-handler.ts @@ -4,11 +4,13 @@ import { workerRouter, } from '@web-api/gateways/worker/workerRouter'; import { createApplicationContext } from '@web-api/applicationContext'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; export const workerHandler = async (event: SQSEvent): Promise => { const { Records } = event; const { body } = Records[0]; const message: WorkerMessage = JSON.parse(body); - const applicationContext = createApplicationContext(message.authorizedUser); + const applicationContext = createApplicationContext(); + getLogger().addUser({ user: message.authorizedUser }); await workerRouter(applicationContext, { message }); }; diff --git a/web-api/src/lambdas/migration/migration-segments.ts b/web-api/src/lambdas/migration/migration-segments.ts index e994107ad90..4958cf51447 100644 --- a/web-api/src/lambdas/migration/migration-segments.ts +++ b/web-api/src/lambdas/migration/migration-segments.ts @@ -11,7 +11,7 @@ import { createISODateString, dateStringsCompared, } from '@shared/business/utilities/DateHandler'; -import { createLogger } from '@web-api/createLogger'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { migrationsToRun } from './migrationsToRun'; import { migrateItems as validationMigration } from './migrations/0000-validate-all-items'; import promiseRetry from 'promise-retry'; @@ -150,19 +150,16 @@ export const processItems = async ( }; export const handler: Handler = async (event: SQSEvent, context: Context) => { - const applicationContext = createApplicationContext( - {}, - createLogger({ - defaultMeta: { - environment: { - stage: process.env.STAGE || 'local', - }, - requestId: { - lambda: context.awsRequestId, - }, - }, - }), - ); + const applicationContext = createApplicationContext(); + getLogger().clearContext(); + getLogger().addContext({ + environment: { + stage: process.env.STAGE || 'local', + }, + requestId: { + lambda: context.awsRequestId, + }, + }); const { Records } = event; const { body, receiptHandle } = Records[0]; const { segment, totalSegments } = JSON.parse(body); diff --git a/web-api/src/lambdas/migration/migration.ts b/web-api/src/lambdas/migration/migration.ts index f39750f56aa..748d38f319a 100644 --- a/web-api/src/lambdas/migration/migration.ts +++ b/web-api/src/lambdas/migration/migration.ts @@ -5,7 +5,7 @@ import { } from '@aws-sdk/lib-dynamodb'; import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; import { createApplicationContext } from '@web-api/applicationContext'; -import { createLogger } from '@web-api/createLogger'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { migrateRecords as migrations } from './migration-segments'; import { unmarshall } from '@aws-sdk/util-dynamodb'; import type { DynamoDBStreamEvent, Handler } from 'aws-lambda'; @@ -61,19 +61,16 @@ export const handler: Handler = async (event: DynamoDBStreamEvent, context) => { marshallOptions: { removeUndefinedValues: true }, }); - const applicationContext = createApplicationContext( - {}, - createLogger({ - defaultMeta: { - environment: { - stage: process.env.STAGE || 'local', - }, - requestId: { - lambda: context.awsRequestId, - }, - }, - }), - ); + const applicationContext = createApplicationContext(); + getLogger().clearContext(); + getLogger().addContext({ + environment: { + stage: process.env.STAGE || 'local', + }, + requestId: { + lambda: context.awsRequestId, + }, + }); const { Records } = event; diff --git a/web-api/src/lambdas/pdfGeneration/pdf-generation.ts b/web-api/src/lambdas/pdfGeneration/pdf-generation.ts index 2154661bf2e..7c55a3cfe35 100644 --- a/web-api/src/lambdas/pdfGeneration/pdf-generation.ts +++ b/web-api/src/lambdas/pdfGeneration/pdf-generation.ts @@ -1,4 +1,5 @@ import { createApplicationContext } from '../../applicationContext'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; export const handler = async event => { const applicationContext = createApplicationContext({}); @@ -28,7 +29,8 @@ export const changeOfAddressHandler = async event => { const { body } = Records[0]; const eventBody = JSON.parse(body); - const applicationContext = createApplicationContext(eventBody.requestUser); + const applicationContext = createApplicationContext(); + getLogger().addUser({ user: eventBody.requestUser }); applicationContext.logger.info( `processing job "change-of-address-job|${eventBody.jobId}", task for case ${eventBody.docketNumber}`, diff --git a/web-api/src/logger.test.ts b/web-api/src/logger.test.ts index 4cc418801aa..ac23105cdbd 100644 --- a/web-api/src/logger.test.ts +++ b/web-api/src/logger.test.ts @@ -1,6 +1,4 @@ -import { logger } from './logger'; -import { transports } from 'winston'; -import fs from 'fs'; +import { expressLogger } from './logger'; jest.mock('@vendia/serverless-express'); import { getCurrentInvoke } from '@vendia/serverless-express'; @@ -36,11 +34,7 @@ describe('logger', () => { const subject = (request, response) => new Promise(resolve => { - const middleware = logger( - new transports.Stream({ - stream: fs.createWriteStream('/dev/null'), - }), - ); + const middleware = expressLogger; middleware(request, response, resolve); }); @@ -51,7 +45,7 @@ describe('logger', () => { }); it('defaults to using a console logger if not specified', () => { - const middleware = logger(); + const middleware = expressLogger; jest.spyOn(console, 'log').mockImplementation(jest.fn()); middleware(req, res, () => { @@ -80,7 +74,7 @@ describe('logger', () => { ); }); - it('sets logger.defaultMeta.environment color stage to from the environment variables', async () => { + it('sets logger.getContext().environment based on environment variables and clears the context at the end of the request', async () => { process.env.NODE_ENV = 'production'; process.env.CURRENT_COLOR = 'blue'; process.env.STAGE = 'someEnv'; @@ -88,16 +82,16 @@ describe('logger', () => { await subject(req, res); const instance = req.locals.logger; - instance.info = jest.fn(); - - res.end(); - expect(instance.defaultMeta.environment).toEqual({ + expect(instance.getContext().environment).toEqual({ color: 'blue', stage: 'someEnv', }); + + res.end(); + expect(instance.getContext()).toEqual(undefined); }); - it('sets logger.defaultMeta.environment color to green and stage to local when those environment variables are undefined', async () => { + it('sets logger.getContext().environment color to green and stage to local when those environment variables are undefined', async () => { delete process.env.CURRENT_COLOR; delete process.env.STAGE; process.env.NODE_ENV = 'production'; @@ -107,8 +101,7 @@ describe('logger', () => { instance.info = jest.fn(); - res.end(); - expect(instance.defaultMeta.environment).toEqual({ + expect(instance.getContext().environment).toEqual({ color: 'green', stage: 'local', }); @@ -137,14 +130,14 @@ describe('logger', () => { await subject(req, res); - expect(req.locals.logger.defaultMeta.requestId).toBeDefined(); - expect(req.locals.logger.defaultMeta.requestId.apiGateway).toBe( + expect(req.locals.logger.getContext().requestId).toBeDefined(); + expect(req.locals.logger.getContext().requestId.apiGateway).toBe( '11ff704e-b35b-4472-8280-29be3fb957ca', ); expect( - req.locals.logger.defaultMeta.requestId.applicationLoadBalancer, + req.locals.logger.getContext().requestId.applicationLoadBalancer, ).toBe('Root=1-5fa1efc9-164cfd9602fe2b523bf82292;Sampled=0'); - expect(req.locals.logger.defaultMeta.requestId.lambda).toBe( + expect(req.locals.logger.getContext().requestId.lambda).toBe( 'c840522b-1e43-4d03-995c-014d199fa237', ); }); @@ -176,15 +169,15 @@ describe('logger', () => { await subject(request, res); - expect(request.locals.logger.defaultMeta.requestId).toBeDefined(); + expect(request.locals.logger.getContext().requestId).toBeDefined(); expect( - request.locals.logger.defaultMeta.requestId.apiGateway, + request.locals.logger.getContext().requestId.apiGateway, ).not.toBeDefined(); expect( - request.locals.logger.defaultMeta.requestId.applicationLoadBalancer, + request.locals.logger.getContext().requestId.applicationLoadBalancer, ).not.toBeDefined(); expect( - request.locals.logger.defaultMeta.requestId.lambda, + request.locals.logger.getContext().requestId.lambda, ).not.toBeDefined(); } }); @@ -216,7 +209,7 @@ describe('logger', () => { await subject(req, res); const bodyToBeLogged = JSON.parse( - req.locals.logger.defaultMeta.request.body, + req.locals.logger.getContext().request.body, ); expect(bodyToBeLogged.username).toBe(body.username); diff --git a/web-api/src/logger.ts b/web-api/src/logger.ts index 89261ab47cc..2bc1e530acd 100644 --- a/web-api/src/logger.ts +++ b/web-api/src/logger.ts @@ -1,69 +1,59 @@ /* eslint-disable @miovision/disallow-date/no-new-date */ import { cloneDeep, get } from 'lodash'; -import { createLogger } from './createLogger'; import { getCurrentInvoke } from '@vendia/serverless-express'; -import { transports } from 'winston'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; -let cache; -const console = () => - cache || - (cache = new transports.Console({ - handleExceptions: true, - handleRejections: true, - })); +export const expressLogger = (req, res, next) => { + const logger = getLogger(); + if (process.env.NODE_ENV === 'production') { + const requestBody = cloneDeep(req.body); -export const logger = (transport = console()) => { - const createdLogger = createLogger({ transports: [transport] }); - return (req, res, next) => { - if (process.env.NODE_ENV === 'production') { - const requestBody = cloneDeep(req.body); - - if (requestBody) { - redactPasswordFields(requestBody); - } - const currentInvoke = getCurrentInvoke(); - createdLogger.defaultMeta = { - environment: { - color: process.env.CURRENT_COLOR || 'green', - stage: process.env.STAGE || 'local', - }, - request: { - body: JSON.stringify(requestBody), - headers: req.headers, - method: req.method, - url: req.url, - }, - requestId: { - apiGateway: get(currentInvoke, 'event.requestContext.requestId'), - applicationLoadBalancer: req.get('x-amzn-trace-id'), - lambda: get(currentInvoke, 'context.awsRequestId'), - }, - }; + if (requestBody) { + redactPasswordFields(requestBody); } + const currentInvoke = getCurrentInvoke(); + logger.addContext({ + environment: { + color: process.env.CURRENT_COLOR || 'green', + stage: process.env.STAGE || 'local', + }, + request: { + body: JSON.stringify(requestBody), + headers: req.headers, + method: req.method, + url: req.url, + }, + requestId: { + apiGateway: get(currentInvoke, 'event.requestContext.requestId'), + applicationLoadBalancer: req.get('x-amzn-trace-id'), + lambda: get(currentInvoke, 'context.awsRequestId'), + }, + }); + } - createdLogger.debug(`Request started: ${req.method} ${req.url}`); - - req.locals = req.locals || {}; - req.locals.logger = createdLogger; - req.locals.startTime = new Date(); + logger.debug(`Request started: ${req.method} ${req.url}`); - const { end } = res; + req.locals = req.locals || {}; + req.locals.logger = logger; + req.locals.startTime = new Date(); - res.end = function () { - end.apply(this, arguments); - const responseTimeMs = new Date() - req.locals.startTime; + const { end } = res; - req.locals.logger.info(`Request ended: ${req.method} ${req.url}`, { - response: { - responseSize: parseInt(res.get('content-length') ?? '0'), - responseTimeMs, - statusCode: res.statusCode, - }, - }); - }; + res.end = function () { + end.apply(this, arguments); + const responseTimeMs = new Date() - req.locals.startTime; - return next(); + logger.info(`Request ended: ${req.method} ${req.url}`, { + response: { + responseSize: parseInt(res.get('content-length') ?? '0'), + responseTimeMs, + statusCode: res.statusCode, + }, + }); + logger.clearContext(); }; + + return next(); }; function redactPasswordFields(obj) { diff --git a/web-api/src/middleware/userIdLimiter.ts b/web-api/src/middleware/userIdLimiter.ts index 2212a1ea590..7058d046a11 100644 --- a/web-api/src/middleware/userIdLimiter.ts +++ b/web-api/src/middleware/userIdLimiter.ts @@ -1,4 +1,5 @@ import { createApplicationContext } from '../applicationContext'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { getUserFromAuthHeader } from './apiGatewayHelper'; export const userIdLimiter = key => async (req, res, next) => { @@ -8,7 +9,8 @@ export const userIdLimiter = key => async (req, res, next) => { const WINDOW_TIME = parseInt( process.env.USER_LIMITER_WINDOW ?? `${60 * 1000}`, ); - const applicationContext = createApplicationContext(user); + const applicationContext = createApplicationContext(); + getLogger().addUser({ user }); const KEY = `user-limiter-${key}|${user.userId}`; const limiterCache = await applicationContext diff --git a/web-api/src/persistence/dynamo/users/createUserRecords.test.ts b/web-api/src/persistence/dynamo/users/createUserRecords.test.ts index 258df73375e..a91dd7ca673 100644 --- a/web-api/src/persistence/dynamo/users/createUserRecords.test.ts +++ b/web-api/src/persistence/dynamo/users/createUserRecords.test.ts @@ -21,6 +21,10 @@ describe('createUserRecords', () => { userId: mockPrivatePractitionerUser.userId, }); + expect(applicationContext.getDocumentClient().put.mock.calls.length).toBe( + 3, + ); + expect( applicationContext.getDocumentClient().put.mock.calls[0][0], ).toMatchObject({ @@ -173,43 +177,6 @@ describe('createUserRecords', () => { }); }); - it('should persist a private practitioner user with name and barNumber mapping records', async () => { - await createUserRecords({ - applicationContext, - user: mockPrivatePractitionerUser, - userId: mockPrivatePractitionerUser.userId, - }); - - expect(applicationContext.getDocumentClient().put.mock.calls.length).toBe( - 3, - ); - expect( - applicationContext.getDocumentClient().put.mock.calls[0][0], - ).toMatchObject({ - Item: { - ...mockPrivatePractitionerUser, - pk: `user|${mockPrivatePractitionerUser.userId}`, - sk: `user|${mockPrivatePractitionerUser.userId}`, - }, - }); - expect( - applicationContext.getDocumentClient().put.mock.calls[1][0], - ).toMatchObject({ - Item: { - pk: 'privatePractitioner|PRIVATE PRACTITIONER', - sk: `user|${mockPrivatePractitionerUser.userId}`, - }, - }); - expect( - applicationContext.getDocumentClient().put.mock.calls[2][0], - ).toMatchObject({ - Item: { - pk: 'privatePractitioner|PT1234', - sk: `user|${mockPrivatePractitionerUser.userId}`, - }, - }); - }); - it('should persist a case services supervisor user with 3 section user mapping records (docket, petitions, and case services)', async () => { await createUserRecords({ applicationContext, diff --git a/web-api/src/utilities/logger/getLogger.ts b/web-api/src/utilities/logger/getLogger.ts new file mode 100644 index 00000000000..e61864aa6dc --- /dev/null +++ b/web-api/src/utilities/logger/getLogger.ts @@ -0,0 +1,46 @@ +import { Logger } from 'winston'; +import { UnknownAuthUser } from '@shared/business/entities/authUser/AuthUser'; +import { createLogger } from '@web-api/createLogger'; + +let loggerCache: LoggerType; + +export const getLogger = (): LoggerType => { + if (!loggerCache) { + const logger = createLogger(); + loggerCache = { + addContext: (newMeta: Record) => { + logger.defaultMeta = { + ...logger.defaultMeta, + ...newMeta, + }; + }, + addUser: ({ user }: { user: UnknownAuthUser }) => { + logger.defaultMeta = { + ...logger.defaultMeta, + user, + }; + }, + clearContext: () => { + logger.defaultMeta = undefined; + }, + debug: (message, context?) => logger.debug(message, { context }), + error: (message, context?) => logger.error(message, { context }), + getContext: () => logger.defaultMeta, + info: (message, context?) => logger.info(message, { context }), + warn: (message, context?) => logger.warn(message, { context }), + }; + } + + return loggerCache; +}; + +type LoggerType = { + addUser: (user: { user: UnknownAuthUser }) => void; + debug: (message: any, context?: any) => Logger; + error: (message: any, context?: any) => Logger; + info: (message: any, context?: any) => Logger; + warn: (message: any, context?: any) => Logger; + clearContext: () => void; + addContext: (newMeta: Record) => void; + getContext: () => Record; +}; diff --git a/web-api/storage/fixtures/seed/efcms-local.json b/web-api/storage/fixtures/seed/efcms-local.json index 3dac6bdfd5d..090112ede4b 100644 --- a/web-api/storage/fixtures/seed/efcms-local.json +++ b/web-api/storage/fixtures/seed/efcms-local.json @@ -31602,7 +31602,7 @@ { "associatedJudge": "Colvin", "isSealed": false, - "procedureType": "Regular", + "procedureType": "Small", "isPaper": true, "automaticBlocked": true, "automaticBlockedDate": "2023-11-22T01:17:49.276Z", @@ -31848,7 +31848,7 @@ "receivedAt": "2011-10-11T04:00:00.000Z", "caseType": "Partnership (Section 6226)", "orderDesignatingPlaceOfTrial": false, - "automaticBlockedReason": "Pending Item", + "automaticBlockedReason": "Due Date", "createdAt": "2021-10-29T13:41:06.778Z", "noticeOfAttachments": false, "leadDocketNumber": "404-22", @@ -57455,7 +57455,8 @@ "pk": "user|659789b4-acc5-40b7-9318-3354e7eb8604", "userId": "659789b4-acc5-40b7-9318-3354e7eb8604", "isSeniorJudge": false, - "email": "judgefoley@example.com" + "email": "judgefoley@example.com", + "judgePhoneNumber": "(202) 521-0681" }, { "role": "adc", @@ -58561,7 +58562,8 @@ "pk": "user|dabbad00-18d0-43ec-bafb-654e83405416", "userId": "dabbad00-18d0-43ec-bafb-654e83405416", "isSeniorJudge": true, - "email": "judgecolvin@example.com" + "email": "judgecolvin@example.com", + "judgePhoneNumber": "(202) 521-0662" }, { "judgeTitle": "Judge", @@ -58574,7 +58576,8 @@ "pk": "user|dabbad01-18d0-43ec-bafb-654e83405416", "userId": "dabbad01-18d0-43ec-bafb-654e83405416", "isSeniorJudge": false, - "email": "judgeashford@example.com" + "email": "judgeashford@example.com", + "judgePhoneNumber": "(202) 521-0822" }, { "judgeTitle": "Judge", @@ -58587,7 +58590,8 @@ "pk": "user|dabbad02-18d0-43ec-bafb-654e83405416", "userId": "dabbad02-18d0-43ec-bafb-654e83405416", "isSeniorJudge": false, - "email": "judgebuch@example.com" + "email": "judgebuch@example.com", + "judgePhoneNumber": "(202) 521-0810" }, { "judgeTitle": "Chief Special Trial Judge", @@ -58600,7 +58604,8 @@ "pk": "user|dabbad03-18d0-43ec-bafb-654e83405416", "userId": "dabbad03-18d0-43ec-bafb-654e83405416", "isSeniorJudge": false, - "email": "judgecarluzzo@example.com" + "email": "judgecarluzzo@example.com", + "judgePhoneNumber": "(202) 521-3339" }, { "judgeTitle": "Judge", @@ -58613,7 +58618,8 @@ "pk": "user|dabbad04-18d0-43ec-bafb-654e83405416", "userId": "dabbad04-18d0-43ec-bafb-654e83405416", "isSeniorJudge": true, - "email": "judgecohen@example.com" + "email": "judgecohen@example.com", + "judgePhoneNumber": "(202) 521-0655" }, { "judgeTitle": "Judge", @@ -58626,7 +58632,8 @@ "pk": "user|dabbad05-18d0-43ec-bafb-654e83405416", "userId": "dabbad05-18d0-43ec-bafb-654e83405416", "isSeniorJudge": true, - "email": "judgegustafson@example.com" + "email": "judgegustafson@example.com", + "judgePhoneNumber": "(202) 521-0850" }, { "judgeTitle": "Judge", @@ -58639,7 +58646,8 @@ "pk": "user|dabbad06-18d0-43ec-bafb-654e83405416", "userId": "dabbad06-18d0-43ec-bafb-654e83405416", "isSeniorJudge": false, - "email": "judgepugh@example.com" + "email": "judgepugh@example.com", + "judgePhoneNumber": "(202) 521-0824" }, { "judgeTitle": "Judge", @@ -58652,7 +58660,8 @@ "pk": "user|dabbad0a-18d0-43ec-bafb-654e83405416", "userId": "dabbad0a-18d0-43ec-bafb-654e83405416", "isSeniorJudge": false, - "email": "judgeurda@example.com" + "email": "judgeurda@example.com", + "judgePhoneNumber": "(202) 521-0800" }, { "judgeTitle": "Judge", diff --git a/web-api/storage/scripts/createUsers.ts b/web-api/storage/scripts/createUsers.ts index 8e5489fcc5c..93779f64e29 100644 --- a/web-api/storage/scripts/createUsers.ts +++ b/web-api/storage/scripts/createUsers.ts @@ -6,6 +6,7 @@ import { import { createApplicationContext } from '../../src/applicationContext'; import { createPetitionerUserRecords } from '../../../web-api/src/persistence/dynamo/users/createPetitionerUserRecords'; import { createUserRecords } from '../../src/persistence/dynamo/users/createUserRecords'; +import { getLogger } from '@web-api/utilities/logger/getLogger'; import { omit } from 'lodash'; import users from '../fixtures/seed/users.json'; @@ -13,8 +14,14 @@ export const createUsers = async () => { const EXCLUDE_PROPS = ['pk', 'sk', 'userId']; const usersByEmail = {}; - const applicationContext = createApplicationContext({ - role: ROLES.admin, + const applicationContext = createApplicationContext(); + getLogger().addUser({ + user: { + email: 'system@ustc.gov', + name: 'ustc automated system', + role: ROLES.admin, + userId: 'N/A', + }, }); await Promise.all( diff --git a/web-api/storage/scripts/loadTest/loadTestPdfGeneration.ts b/web-api/storage/scripts/loadTest/loadTestPdfGeneration.ts index 95cda39445d..6a1bad474bf 100644 --- a/web-api/storage/scripts/loadTest/loadTestPdfGeneration.ts +++ b/web-api/storage/scripts/loadTest/loadTestPdfGeneration.ts @@ -1,5 +1,6 @@ import { CognitoIdentityProvider } from '@aws-sdk/client-cognito-identity-provider'; import { getUserToken } from './loadTestHelpers'; +import { v4 } from 'uuid'; import axios from 'axios'; // eslint-disable-next-line @typescript-eslint/no-floating-promises @@ -10,22 +11,55 @@ import axios from 'axios'; const token = await getUserToken({ cognito, - env: process.env.ENV, - password: process.env.DEFAULT_ACCOUNT_PASS, + env: process.env.ENV || '', + password: process.env.DEFAULT_ACCOUNT_PASS || '', username: 'petitionsclerk1@example.com', }); + const checkPDFComplete = async (asyncSyncId: string) => { + await new Promise(resolve => setTimeout(() => resolve(null), 1000)); + const URL = `https://api-${process.env.DEPLOYING_COLOR}.${process.env.EFCMS_DOMAIN}/results/fetch/${asyncSyncId}`; + const headers = { + Asyncsyncid: asyncSyncId, + Authorization: `Bearer ${token}`, + 'x-test-user': 'true', + }; + + const results: { + data: { + response: any; + }; + } = await axios.get(URL, { + headers, + }); + + if (!results) return await checkPDFComplete(asyncSyncId); + const { response } = results.data; + if (!response) return await checkPDFComplete(asyncSyncId); + + const responseObj = JSON.parse(response); + if (+responseObj.statusCode === 200) return; + + throw new Error( + `Error generating PDF -> ${JSON.stringify(responseObj, null, 2)}`, + ); + }; + for (let i = 0; i < 100; i++) { try { + const asyncSyncId = v4(); await axios.get( - `https://api-${process.env.DEPLOYING_COLOR}.${process.env.EFCMS_DOMAIN}/reports/printable-case-inventory-report?associatedJudge=&status=New`, + `https://api-${process.env.DEPLOYING_COLOR}.${process.env.EFCMS_DOMAIN}/async/reports/printable-case-inventory-report?associatedJudge=&status=New`, { headers: { + Asyncsyncid: asyncSyncId, Authorization: `Bearer ${token}`, 'x-test-user': 'true', }, }, ); + + await checkPDFComplete(asyncSyncId); } catch (e) { console.log('ERROR', e); throw e; diff --git a/web-api/terraform/modules/api/api-async.tf b/web-api/terraform/modules/api/api-async.tf index 5efe1f460fb..b8878bb1510 100644 --- a/web-api/terraform/modules/api/api-async.tf +++ b/web-api/terraform/modules/api/api-async.tf @@ -196,6 +196,12 @@ resource "aws_api_gateway_integration" "api_async_integration_get" { "content-type": "$input.params('Content-Type')", "x-test-user": "$input.params('x-test-user')" }, + "queryStringParameters": { + #foreach($param in $input.params().querystring.keySet()) + "$param": "$util.escapeJavaScript($input.params().querystring.get($param))" + #if($foreach.hasNext),#end + #end + }, "requestContext" : { "account-id" : "$context.identity.accountId", "api-id" : "$context.apiId", diff --git a/web-api/terraform/modules/api/pdf-generation.tf b/web-api/terraform/modules/api/pdf-generation.tf index 5d57ad30607..e620f06956d 100644 --- a/web-api/terraform/modules/api/pdf-generation.tf +++ b/web-api/terraform/modules/api/pdf-generation.tf @@ -7,8 +7,8 @@ module "pdf_generation_lambda" { lambda_name = "pdf_generator_${var.environment}_${var.current_color}" role = var.lambda_role_arn environment = var.lambda_environment - timeout = "29" - memory_size = "3008" + timeout = "900" + memory_size = "6508" layers = [ aws_lambda_layer_version.puppeteer_layer.arn ] diff --git a/web-client/integration-tests/journey/docketClerkCreatesMessageWithCorrespondence.ts b/web-client/integration-tests/journey/docketClerkCreatesMessageWithCorrespondence.ts index 75480de53a2..a3816c3833f 100644 --- a/web-client/integration-tests/journey/docketClerkCreatesMessageWithCorrespondence.ts +++ b/web-client/integration-tests/journey/docketClerkCreatesMessageWithCorrespondence.ts @@ -1,12 +1,10 @@ -import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { messageModalHelper as messageModalHelperComputed } from '../../src/presenter/computeds/messageModalHelper'; import { refreshElasticsearchIndex } from '../helpers'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { withAppContextDecorator } from '../../src/withAppContext'; -const JUDGES_CHAMBERS = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); +const JUDGES_CHAMBERS = getTestJudgesChambers(); const messageModalHelper = withAppContextDecorator(messageModalHelperComputed); export const docketClerkCreatesMessageWithCorrespondence = cerebralTest => { diff --git a/web-client/integration-tests/journey/petitionsClerkBlocksCase.ts b/web-client/integration-tests/journey/petitionsClerkBlocksCase.ts index 6b4b212a514..c6fa2057c2f 100644 --- a/web-client/integration-tests/journey/petitionsClerkBlocksCase.ts +++ b/web-client/integration-tests/journey/petitionsClerkBlocksCase.ts @@ -40,7 +40,8 @@ export const petitionsClerkBlocksCase = ( await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); diff --git a/web-client/integration-tests/journey/petitionsClerkCreatesMessageToChambers.ts b/web-client/integration-tests/journey/petitionsClerkCreatesMessageToChambers.ts index c1b9d00fa64..3bfa4d01670 100644 --- a/web-client/integration-tests/journey/petitionsClerkCreatesMessageToChambers.ts +++ b/web-client/integration-tests/journey/petitionsClerkCreatesMessageToChambers.ts @@ -1,12 +1,10 @@ -import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { messageModalHelper as messageModalHelperComputed } from '../../src/presenter/computeds/messageModalHelper'; import { refreshElasticsearchIndex } from '../helpers'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { withAppContextDecorator } from '../../src/withAppContext'; -const JUDGES_CHAMBERS = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); +const JUDGES_CHAMBERS = getTestJudgesChambers(); const messageModalHelper = withAppContextDecorator(messageModalHelperComputed); export const petitionsClerkCreatesMessageToChambers = cerebralTest => { diff --git a/web-client/integration-tests/journey/petitionsClerkUnblocksCase.ts b/web-client/integration-tests/journey/petitionsClerkUnblocksCase.ts index 557fb89c190..49cc2601dce 100644 --- a/web-client/integration-tests/journey/petitionsClerkUnblocksCase.ts +++ b/web-client/integration-tests/journey/petitionsClerkUnblocksCase.ts @@ -25,7 +25,8 @@ export const petitionsClerkUnblocksCase = ( await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); diff --git a/web-client/integration-tests/journey/practitionerCreatesNewCase.ts b/web-client/integration-tests/journey/practitionerCreatesNewCase.ts index e0063bb77ee..0b383c096c7 100644 --- a/web-client/integration-tests/journey/practitionerCreatesNewCase.ts +++ b/web-client/integration-tests/journey/practitionerCreatesNewCase.ts @@ -199,7 +199,7 @@ export const practitionerCreatesNewCase = ( await cerebralTest.runSequence('gotoDashboardSequence'); - expect(cerebralTest.getState('currentPage')).toBe('DashboardPractitioner'); + expect(cerebralTest.getState('currentPage')).toBe('DashboardPetitioner'); cerebralTest.docketNumber = cerebralTest.getState( 'openCases.0.docketNumber', diff --git a/web-client/integration-tests/journey/practitionerViewsDashboard.ts b/web-client/integration-tests/journey/practitionerViewsDashboard.ts index 08971d2f6e3..0c75eda7838 100644 --- a/web-client/integration-tests/journey/practitionerViewsDashboard.ts +++ b/web-client/integration-tests/journey/practitionerViewsDashboard.ts @@ -4,9 +4,7 @@ export const practitionerViewsDashboard = cerebralTest => { return it('Practitioner views dashboard', async () => { await refreshElasticsearchIndex(); await cerebralTest.runSequence('gotoDashboardSequence'); - expect(cerebralTest.getState('currentPage')).toEqual( - 'DashboardPractitioner', - ); + expect(cerebralTest.getState('currentPage')).toEqual('DashboardPetitioner'); expect(cerebralTest.getState('openCases').length).toBeGreaterThan(0); const latestDocketNumber = cerebralTest.getState( 'openCases.0.docketNumber', diff --git a/web-client/integration-tests/journey/practitionerViewsDashboardBeforeAddingCase.ts b/web-client/integration-tests/journey/practitionerViewsDashboardBeforeAddingCase.ts index 1ee9c6eae24..b24b6231cce 100644 --- a/web-client/integration-tests/journey/practitionerViewsDashboardBeforeAddingCase.ts +++ b/web-client/integration-tests/journey/practitionerViewsDashboardBeforeAddingCase.ts @@ -1,8 +1,6 @@ export const practitionerViewsDashboardBeforeAddingCase = cerebralTest => { return it('Practitioner views dashboard before adding the case', async () => { await cerebralTest.runSequence('gotoDashboardSequence'); - expect(cerebralTest.getState('currentPage')).toEqual( - 'DashboardPractitioner', - ); + expect(cerebralTest.getState('currentPage')).toEqual('DashboardPetitioner'); }); }; diff --git a/web-client/integration-tests/journey/privatePractitionerViewsOpenAndClosedCases.ts b/web-client/integration-tests/journey/privatePractitionerViewsOpenAndClosedCases.ts index ca37d68b73f..eea90aabf3d 100644 --- a/web-client/integration-tests/journey/privatePractitionerViewsOpenAndClosedCases.ts +++ b/web-client/integration-tests/journey/privatePractitionerViewsOpenAndClosedCases.ts @@ -2,9 +2,7 @@ export const privatePractitionerViewsOpenAndClosedCases = cerebralTest => { return it('private practitioner views open and closed cases', async () => { await cerebralTest.runSequence('gotoDashboardSequence'); - expect(cerebralTest.getState('currentPage')).toEqual( - 'DashboardPractitioner', - ); + expect(cerebralTest.getState('currentPage')).toEqual('DashboardPetitioner'); expect(cerebralTest.getState('openCases').length).toBeGreaterThan(0); expect(cerebralTest.getState('closedCases').length).toBeGreaterThan(0); }); diff --git a/web-client/integration-tests/journey/privatePractitionerViewsOpenConsolidatedCases.ts b/web-client/integration-tests/journey/privatePractitionerViewsOpenConsolidatedCases.ts index f5915a59ac7..9e3de65d88d 100644 --- a/web-client/integration-tests/journey/privatePractitionerViewsOpenConsolidatedCases.ts +++ b/web-client/integration-tests/journey/privatePractitionerViewsOpenConsolidatedCases.ts @@ -5,9 +5,7 @@ export const privatePractitionerViewsOpenConsolidatedCases = cerebralTest => { await refreshElasticsearchIndex(); await cerebralTest.runSequence('gotoDashboardSequence'); - expect(cerebralTest.getState('currentPage')).toEqual( - 'DashboardPractitioner', - ); + expect(cerebralTest.getState('currentPage')).toEqual('DashboardPetitioner'); const openCases = cerebralTest.getState('openCases'); expect(openCases.length).toBeGreaterThan(0); diff --git a/web-client/integration-tests/journey/userSendsMessage.ts b/web-client/integration-tests/journey/userSendsMessage.ts index 201a5653cdb..a76316b4b64 100644 --- a/web-client/integration-tests/journey/userSendsMessage.ts +++ b/web-client/integration-tests/journey/userSendsMessage.ts @@ -1,13 +1,11 @@ -import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { messageModalHelper as messageModalHelperComputed } from '../../src/presenter/computeds/messageModalHelper'; import { refreshElasticsearchIndex } from '../helpers'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { withAppContextDecorator } from '../../src/withAppContext'; const messageModalHelper = withAppContextDecorator(messageModalHelperComputed); -const JUDGES_CHAMBERS = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); +const JUDGES_CHAMBERS = getTestJudgesChambers(); export const userSendsMessage = ( cerebralTest, diff --git a/web-client/integration-tests/messagesTableJourney.test.ts b/web-client/integration-tests/messagesTableJourney.test.ts index 067b8f13166..cf3b2f159d8 100644 --- a/web-client/integration-tests/messagesTableJourney.test.ts +++ b/web-client/integration-tests/messagesTableJourney.test.ts @@ -1,7 +1,7 @@ import { CASE_STATUS_TYPES } from '../../shared/src/business/entities/EntityConstants'; -import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; import { createNewMessageOnCase } from './journey/createNewMessageOnCase'; import { formattedMessages as formattedMessagesComputed } from '../src/presenter/computeds/formattedMessages'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { loginAs, refreshElasticsearchIndex, setupTest } from './helpers'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { userSendsMessage } from './journey/userSendsMessage'; @@ -18,9 +18,7 @@ describe('messages table journey', () => { }; const messageSubjectForJudge = 'Check your recent messages!'; - const judgesChambers = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); + const JUDGES_CHAMBERS = getTestJudgesChambers(); const judgeCohenUserId = 'dabbad04-18d0-43ec-bafb-654e83405416'; const formattedMessages = withAppContextDecorator(formattedMessagesComputed); @@ -159,7 +157,7 @@ describe('messages table journey', () => { userSendsMessage( cerebralTest, messageSubjectForJudge, - judgesChambers.COHENS_CHAMBERS_SECTION.section, + JUDGES_CHAMBERS.COHENS_CHAMBERS_SECTION.section, judgeCohenUserId, ); diff --git a/web-client/integration-tests/petitionsClerkBlockCase.test.ts b/web-client/integration-tests/petitionsClerkBlockCase.test.ts index 6af35e4287d..840a4c97c8c 100644 --- a/web-client/integration-tests/petitionsClerkBlockCase.test.ts +++ b/web-client/integration-tests/petitionsClerkBlockCase.test.ts @@ -59,7 +59,8 @@ describe('Blocking a Case', () => { await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); @@ -96,7 +97,8 @@ describe('Blocking a Case', () => { await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); @@ -124,7 +126,8 @@ describe('Blocking a Case', () => { await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); @@ -171,7 +174,8 @@ describe('Blocking a Case', () => { await refreshElasticsearchIndex(); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); @@ -188,7 +192,8 @@ describe('Blocking a Case', () => { await refreshElasticsearchIndex(); await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', + key: 'trialLocationFilter', + root: 'blockedCaseReportFilter', value: trialLocation, }); diff --git a/web-client/integration-tests/petitionsClerkFiltersBlockedCaseReport.test.ts b/web-client/integration-tests/petitionsClerkFiltersBlockedCaseReport.test.ts deleted file mode 100644 index e3075215eb6..00000000000 --- a/web-client/integration-tests/petitionsClerkFiltersBlockedCaseReport.test.ts +++ /dev/null @@ -1,190 +0,0 @@ -import { blockedCasesReportHelper as blockedCasesReportHelperComputed } from '../src/presenter/computeds/blockedCasesReportHelper'; -import { docketClerkCreatesATrialSession } from './journey/docketClerkCreatesATrialSession'; -import { docketClerkSetsCaseReadyForTrial } from './journey/docketClerkSetsCaseReadyForTrial'; -import { loginAs, refreshElasticsearchIndex, setupTest } from './helpers'; -import { petitionsClerkBlocksCase } from './journey/petitionsClerkBlocksCase'; -import { petitionsClerkCreatesNewCase } from './journey/petitionsClerkCreatesNewCase'; -import { runCompute } from '@web-client/presenter/test.cerebral'; -import { withAppContextDecorator } from '../src/withAppContext'; - -const blockedCasesReportHelper = withAppContextDecorator( - blockedCasesReportHelperComputed, -); - -const createAndBlockCase = ( - cerebralTest, - procedureType, - trialLocation, - overrides = {}, - blockedCases, -) => { - loginAs(cerebralTest, 'petitionsclerk@example.com'); - petitionsClerkCreatesNewCase(cerebralTest, { - procedureType, - trialLocation, - }); - it('track the docket number', () => { - blockedCases.push({ - docketNumber: cerebralTest.docketNumber, - procedureType, - }); - }); - - loginAs(cerebralTest, 'docketclerk@example.com'); - docketClerkSetsCaseReadyForTrial(cerebralTest); - - loginAs(cerebralTest, 'petitionsclerk@example.com'); - petitionsClerkBlocksCase(cerebralTest, trialLocation, overrides); -}; - -describe('Blocking a Case', () => { - const cerebralTest = setupTest(); - - const blockedCases = []; - - afterAll(() => { - cerebralTest.closeSocket(); - }); - - const trialLocation = `Charleston, West Virginia, ${Date.now()}`; - loginAs(cerebralTest, 'docketclerk@example.com'); - docketClerkCreatesATrialSession(cerebralTest, { trialLocation }); - - createAndBlockCase( - cerebralTest, - 'Small', - trialLocation, - { - docketNumberSuffix: 'S', - }, - blockedCases, - ); - createAndBlockCase( - cerebralTest, - 'Regular', - trialLocation, - undefined, - blockedCases, - ); - createAndBlockCase( - cerebralTest, - 'Small', - trialLocation, - { - docketNumberSuffix: 'S', - }, - blockedCases, - ); - createAndBlockCase( - cerebralTest, - 'Regular', - trialLocation, - undefined, - blockedCases, - ); - - it('petitions clerk views all cases on blocked report', async () => { - await refreshElasticsearchIndex(); - - await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); - - await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', - value: trialLocation, - }); - - expect(cerebralTest.getState('blockedCases')).toMatchObject( - expect.arrayContaining( - blockedCases.map(blockedCase => - expect.objectContaining({ - docketNumber: blockedCase.docketNumber, - }), - ), - ), - ); - }); - - it('petitions clerk views Small cases on blocked report', async () => { - await refreshElasticsearchIndex(); - - await cerebralTest.runSequence('gotoBlockedCasesReportSequence'); - - await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', - value: trialLocation, - }); - - await cerebralTest.runSequence('updateFormValueSequence', { - key: 'procedureType', - value: 'Small', - }); - - const { blockedCasesFormatted } = runCompute(blockedCasesReportHelper, { - state: cerebralTest.getState(), - }); - - expect(blockedCasesFormatted).not.toMatchObject( - expect.arrayContaining([ - expect.objectContaining({ - procedureType: 'Regular', - }), - ]), - ); - }); - - it('petitions clerk views Regular cases on blocked report', async () => { - await cerebralTest.runSequence('updateFormValueSequence', { - key: 'procedureType', - value: 'Regular', - }); - - const { blockedCasesFormatted } = runCompute(blockedCasesReportHelper, { - state: cerebralTest.getState(), - }); - - expect(blockedCasesFormatted).not.toMatchObject( - expect.arrayContaining([ - expect.objectContaining({ - procedureType: 'Small', - }), - ]), - ); - }); - - it('petitions clerk views All cases on blocked report', async () => { - await cerebralTest.runSequence('updateFormValueSequence', { - key: 'procedureType', - value: 'All', - }); - - const { blockedCasesFormatted } = runCompute(blockedCasesReportHelper, { - state: cerebralTest.getState(), - }); - - expect(blockedCasesFormatted).toMatchObject( - expect.arrayContaining( - blockedCases.map(blockedCase => - expect.objectContaining({ - docketNumber: blockedCase.docketNumber, - }), - ), - ), - ); - }); - - it('should reset the procedureType select back to All when changing the trial location dropdown', async () => { - await cerebralTest.runSequence('updateFormValueSequence', { - key: 'procedureType', - value: 'Small', - }); - - expect(cerebralTest.getState('form.procedureType')).toEqual('Small'); - - await cerebralTest.runSequence('getBlockedCasesByTrialLocationSequence', { - key: 'trialLocation', - value: 'No existing trial location', - }); - - expect(cerebralTest.getState('form.procedureType')).toEqual('All'); - }); -}); diff --git a/web-client/integration-tests/stampDispositionJudgeJourney.test.ts b/web-client/integration-tests/stampDispositionJudgeJourney.test.ts index 6c6183105dc..42d67b9f766 100644 --- a/web-client/integration-tests/stampDispositionJudgeJourney.test.ts +++ b/web-client/integration-tests/stampDispositionJudgeJourney.test.ts @@ -1,6 +1,5 @@ import { FORMATS } from '@shared/business/utilities/DateHandler'; import { MOTION_DISPOSITIONS } from '../../shared/src/business/entities/EntityConstants'; -import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; import { contactPrimaryFromState, fakeFile, @@ -9,14 +8,12 @@ import { uploadPetition, waitForCondition, } from './helpers'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { userSendsMessage } from './journey/userSendsMessage'; describe('Stamp disposition judge journey test', () => { const cerebralTest = setupTest(); - - const judgesChambers = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); + const judgesChambers = getTestJudgesChambers(); const judgeCohenUserId = 'dabbad04-18d0-43ec-bafb-654e83405416'; const messageSubject = 'Motion to Stamp'; const deniedMotionDocketEntryTitle = diff --git a/web-client/src/applicationContext.ts b/web-client/src/applicationContext.ts index 390fe7117f3..59f66f550a3 100644 --- a/web-client/src/applicationContext.ts +++ b/web-client/src/applicationContext.ts @@ -163,11 +163,6 @@ import { getCaseInventoryReportInteractor } from '../../shared/src/proxies/repor import { getCaseWorksheetsByJudgeInteractor } from '@shared/proxies/reports/getCaseWorksheetsByJudgeProxy'; import { getCasesClosedByJudgeInteractor } from '../../shared/src/proxies/reports/getCasesClosedByJudgeProxy'; import { getCasesForUserInteractor } from '../../shared/src/proxies/getCasesForUserProxy'; -import { - getChambersSections, - getChambersSectionsLabels, - getJudgesChambers, -} from './business/chambers/getJudgesChambers'; import { getClinicLetterKey } from '../../shared/src/business/utilities/getClinicLetterKey'; import { getColdCaseReportInteractor } from '../../shared/src/proxies/reports/getColdCaseReportProxy'; import { getCompletedMessagesForSectionInteractor } from '../../shared/src/proxies/messages/getCompletedMessagesForSectionProxy'; @@ -624,6 +619,22 @@ const applicationContext = { convertBlobToUInt8Array: async blob => { return new Uint8Array(await new Response(blob).arrayBuffer()); }, + createCsvString: ( + data: any[], + config: { displayLabel: string; key: string }[], + ) => { + const headers = config.map(c => `"${c.displayLabel}"`).join(); + const body = data.reduce((acc, currentData) => { + const row = config + .map(c => c.key) + .map(key => `"${currentData[key]}"`) + .join(); + acc += `${row}\n`; + return acc; + }, ''); + + return `${headers}\n${body}`; + }, getBaseUrl: () => { return process.env.API_URL || 'http://localhost:4000'; }, @@ -674,8 +685,6 @@ const applicationContext = { }, getPersistenceGateway: () => { return { - getChambersSections, - getChambersSectionsLabels, getDocument, getItem, getPdfFromUrl, @@ -754,7 +763,6 @@ const applicationContext = { getFormattedPartiesNameAndTitle, getFormattedTrialSessionDetails, getJudgeLastName, - getJudgesChambers, getMonthDayYearInETObj, getOtherFilers, getPetitionDocketEntry, diff --git a/web-client/src/business/chambers/getJudgesChambers.test.ts b/web-client/src/business/chambers/getJudgesChambers.test.ts deleted file mode 100644 index 4fd42f28a1a..00000000000 --- a/web-client/src/business/chambers/getJudgesChambers.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { - getChambersSections, - getChambersSectionsLabels, - getJudgesChambers, - getJudgesChambersWithLegacy, -} from './getJudgesChambers'; - -describe('getJudgesChambers', () => { - it('should return a map of judge chambers with labels and sections', () => { - const result = getJudgesChambers(); - - expect(result).toBeDefined(); - - const firstKey = Object.keys(result)[0]; - - expect(result[firstKey]).toMatchObject({ - label: expect.anything(), - section: expect.anything(), - }); - }); - - describe('getJudgesChambersWithLegacy', () => { - it('should return a map of judge chambers with legacy judge chambers', () => { - const result = getJudgesChambersWithLegacy(); - - expect(result.LEGACY_JUDGES_CHAMBERS_SECTION).toBeDefined(); - }); - }); - - describe('getChambersSectionsLabels', () => { - it('should return an array of chambers section labels', () => { - const result = getChambersSectionsLabels(); - - expect(result.length).toBeDefined(); - }); - }); - - describe('getChambersSections', () => { - it('should return chambers sections sorted by name', () => { - const result = getChambersSections(); - - expect(result.length).toBeDefined(); - }); - }); -}); diff --git a/web-client/src/business/chambers/getJudgesChambers.ts b/web-client/src/business/chambers/getJudgesChambers.ts deleted file mode 100644 index 97179f51874..00000000000 --- a/web-client/src/business/chambers/getJudgesChambers.ts +++ /dev/null @@ -1,260 +0,0 @@ -import { omitBy, sortBy } from 'lodash'; - -type JudgeInfo = { - judgeFullName: string; - label: string; - phoneNumber: string; - section: string; - isLegacy?: boolean; -}; - -// TODO: It would be better to have this list outside of the code so we could -// update judges in production without deploying code changes. -const JUDGES_CHAMBERS: Record = omitBy( - { - ASHFORDS_CHAMBERS_SECTION: { - judgeFullName: 'Tamara W. Ashford', - label: 'Ashford’s Chambers', - phoneNumber: '(202) 521-0822', - section: 'ashfordsChambers', - }, - BUCHS_CHAMBERS_SECTION: { - judgeFullName: 'Ronald L. Buch', - label: 'Buch’s Chambers', - phoneNumber: '(202) 521-0810', - section: 'buchsChambers', - }, - CARLUZZOS_CHAMBERS_SECTION: { - judgeFullName: 'Lewis R. Carluzzo', - label: 'Carluzzo’s Chambers', - phoneNumber: '(202) 521-3339', - section: 'carluzzosChambers', - }, - COHENS_CHAMBERS_SECTION: { - judgeFullName: 'Mary Ann Cohen', - label: 'Cohen’s Chambers', - phoneNumber: '(202) 521-0655', - section: 'cohensChambers', - }, - COLVINS_CHAMBERS_SECTION: { - isLegacy: process.env.USTC_ENV === 'prod', - judgeFullName: 'John O. Colvin', - label: 'Colvin’s Chambers', - phoneNumber: '(202) 521-0662', - section: 'colvinsChambers', - }, - COPELANDS_CHAMBERS_SECTION: { - judgeFullName: 'Elizabeth A. Copeland', - label: 'Copeland’s Chambers', - phoneNumber: '(202) 521-0670', - section: 'copelandsChambers', - }, - FOLEYS_CHAMBERS_SECTION: { - judgeFullName: 'Maurice B. Foley', - label: 'Foley’s Chambers', - phoneNumber: '(202) 521-0681', - section: 'foleysChambers', - }, - FRIEDS_CHAMBERS_SECTION: { - judgeFullName: 'Zachary S. Fried', - label: 'Fried’s Chambers', - phoneNumber: '(202) 521-0867', - section: 'friedsChambers', - }, - GALES_CHAMBERS_SECTION: { - judgeFullName: 'Joseph H. Gale', - label: 'Gale’s Chambers', - phoneNumber: '(202) 521-0688', - section: 'galesChambers', - }, - GOEKES_CHAMBERS_SECTION: { - judgeFullName: 'Joseph Robert Goeke', - label: 'Goeke’s Chambers', - phoneNumber: '(202) 521-0690', - section: 'goekesChambers', - }, - GREAVES_CHAMBESR_SECTION: { - judgeFullName: 'Travis A. Greaves', - label: 'Greaves’ Chambers', - phoneNumber: '(202) 521-0736', - section: 'greavesChambers', - }, - GUSTAFSONS_CHAMBERS_SECTION: { - judgeFullName: 'David Gustafson', - label: 'Gustafson’s Chambers', - phoneNumber: '(202) 521-0850', - section: 'gustafsonsChambers', - }, - HALPERNS_CHAMBERS_SECTION: { - judgeFullName: 'James S. Halpern', - label: 'Halpern’s Chambers', - phoneNumber: '(202) 521-0707', - section: 'halpernsChambers', - }, - HOLMES_CHAMBERS_SECTION: { - judgeFullName: 'Mark V. Holmes', - label: 'Holmes’ Chambers', - phoneNumber: '(202) 521-0714', - section: 'holmesChambers', - }, - JONES_CHAMBERS_SECTION: { - judgeFullName: 'Courtney D. Jones', - label: 'Jones’ Chambers', - phoneNumber: '(202) 521-0795', - section: 'jonesChambers', - }, - KERRIGANS_CHAMBERS_SECTION: { - judgeFullName: 'Kathleen Kerrigan', - label: 'Kerrigan’s Chambers', - phoneNumber: '(202) 521-0777', - section: 'kerrigansChambers', - }, - LANDYS_CHAMBERS_SECTION: { - judgeFullName: 'Adam B. Landy', - label: 'Landy’s Chambers', - phoneNumber: '(202) 521-0835', - section: 'landysChambers', - }, - LAUBERS_CHAMBERS_SECTION: { - judgeFullName: 'Albert G. Lauber', - label: 'Lauber’s Chambers', - phoneNumber: '(202) 521-0785', - section: 'laubersChambers', - }, - LEYDENS_CHAMBERS_SECTION: { - judgeFullName: 'Diana L. Leyden', - label: 'Leyden’s Chambers', - phoneNumber: '(202) 521-0823', - section: 'leydensChambers', - }, - MARSHALLS_CHAMBERS_SECTION: { - judgeFullName: 'Alina I. Marshall', - label: 'Marshall’s Chambers', - phoneNumber: '(202) 521-0738', - section: 'marshallsChambers', - }, - MARVELS_CHAMBERS_SECTION: { - judgeFullName: 'L. Paige Marvel', - label: 'Marvel’s Chambers', - phoneNumber: '(202) 521-0740', - section: 'marvelsChambers', - }, - MORRISONS_CHAMBERS_SECTION: { - judgeFullName: 'Richard T. Morrison', - label: 'Morrison’s Chambers', - phoneNumber: '(202) 521-0853', - section: 'morrisonsChambers', - }, - NEGAS_CHAMBERS_SECTION: { - judgeFullName: 'Joseph W. Nega', - label: 'Nega’s Chambers', - phoneNumber: '(202) 521-0640', - section: 'negasChambers', - }, - PANUTHOS_CHAMBERS_SECTION: { - judgeFullName: 'Peter J. Panuthos', - label: 'Panuthos’ Chambers', - phoneNumber: '(202) 521-4707', - section: 'panuthosChambers', - }, - PARIS_CHAMBERS_SECTION: { - judgeFullName: 'Elizabeth Crewson Paris', - label: 'Paris’ Chambers', - phoneNumber: '(202) 521-0839', - section: 'parisChambers', - }, - PUGHS_CHAMBERS_SECTION: { - judgeFullName: 'Cary Douglas Pugh', - label: 'Pugh’s Chambers', - phoneNumber: '(202) 521-0824', - section: 'pughsChambers', - }, - RUWES_CHAMBERS_SECTION: { - judgeFullName: 'Robert P. Ruwe', - label: 'Ruwe’s Chambers', - phoneNumber: '', // inactive judge, leave blank - section: 'ruwesChambers', - }, - SIEGELS_CHAMBERS_SECTION: { - judgeFullName: 'Jennifer E. Siegel', - label: 'Siegel’s Chambers', - phoneNumber: '(202) 521-0720', - section: 'siegelsChambers', - }, - THORNTONS_CHAMBERS_SECTION: { - judgeFullName: 'Michael B. Thornton', - label: 'Thornton’s Chambers', - phoneNumber: '(202) 521-0766', - section: 'thorntonsChambers', - }, - TOROS_CHAMBERS_SECTION: { - judgeFullName: 'Emin Toro', - label: 'Toro’s Chambers', - phoneNumber: '(202) 521-0760', - section: 'torosChambers', - }, - URDAS_CHAMBERS_SECTION: { - judgeFullName: 'Patrick J. Urda', - label: 'Urda’s Chambers', - phoneNumber: '(202) 521-0800', - section: 'urdasChambers', - }, - VASQUEZS_CHAMBERS_SECTION: { - judgeFullName: 'Juan F. Vasquez', - label: 'Vasquez’s Chambers', - phoneNumber: '(202) 521-0778', - section: 'vasquezsChambers', - }, - WAYS_CHAMBERS_SECTION: { - judgeFullName: 'Kashi Way', - label: 'Way’s Chambers', - phoneNumber: '', // TODO - section: 'waysChambers', - }, - WEILERS_CHAMBERS_SECTION: { - judgeFullName: 'Christian N. Weiler', - label: 'Weiler’s Chambers', - phoneNumber: '(202) 521-0649', - section: 'weilersChambers', - }, - WELLS_CHAMBERS_SECTION: { - judgeFullName: 'Thomas B. Wells', - label: 'Wells’ Chambers', - phoneNumber: '', // inactive judge, leave blank - section: 'wellsChambers', - }, - }, - chambers => chambers.isLegacy, -); - -export const getJudgesChambers = () => { - return JUDGES_CHAMBERS; -}; - -export const getJudgesChambersWithLegacy = () => { - return { - ...JUDGES_CHAMBERS, - LEGACY_JUDGES_CHAMBERS_SECTION: { - label: 'Legacy Judges Chambers', - section: 'legacyJudgesChambers', - }, - }; -}; - -export const getChambersSectionsLabels = () => { - const chambersSectionsLabels = []; - Object.keys(getJudgesChambers()).forEach(k => { - const chambers = JUDGES_CHAMBERS[k]; - chambersSectionsLabels[chambers.section] = chambers.label; - }); - return chambersSectionsLabels; -}; - -export const getChambersSections = () => { - const chambersSections = []; - Object.keys(getJudgesChambers()).forEach(k => { - const chambers = JUDGES_CHAMBERS[k]; - chambersSections.push(chambers.section); - }); - return sortBy(chambersSections); -}; diff --git a/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.test.ts b/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.test.ts index 7666a937f87..9626c90827d 100644 --- a/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.test.ts +++ b/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.test.ts @@ -24,7 +24,7 @@ describe('getBlockedCasesByTrialLocationAction', () => { presenter, }, state: { - form: {}, + blockedCaseReportFilter: {}, }, }); @@ -39,8 +39,8 @@ describe('getBlockedCasesByTrialLocationAction', () => { presenter, }, state: { - form: { - trialLocation: 'Boise, Idaho', + blockedCaseReportFilter: { + trialLocationFilter: 'Boise, Idaho', }, }, }); diff --git a/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.ts b/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.ts index a742e711079..2a49cdefba3 100644 --- a/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.ts +++ b/web-client/src/presenter/actions/CaseDetail/getBlockedCasesByTrialLocationAction.ts @@ -11,16 +11,14 @@ export const getBlockedCasesByTrialLocationAction = async ({ applicationContext, get, }: ActionProps) => { - const trialLocation = get(state.form.trialLocation); + const trialLocation = get(state.blockedCaseReportFilter.trialLocationFilter); + if (!trialLocation) return { blockedCases: [] }; - let blockedCases = []; - if (trialLocation) { - blockedCases = await applicationContext - .getUseCases() - .getBlockedCasesInteractor(applicationContext, { - trialLocation, - }); - } + const blockedCases = await applicationContext + .getUseCases() + .getBlockedCasesInteractor(applicationContext, { + trialLocation, + }); return { blockedCases }; }; diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.test.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.test.ts new file mode 100644 index 00000000000..4a7411cdda3 --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.test.ts @@ -0,0 +1,33 @@ +import { + CASE_STATUS_TYPES, + PROCEDURE_TYPES_MAP, +} from '@shared/business/entities/EntityConstants'; +import { clearBlockedCasesReportAction } from '@web-client/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction'; +import { initialBlockedCaseReportFilter } from '@web-client/presenter/state/blockedCasesReportState'; +import { presenter } from '@web-client/presenter/presenter-mock'; +import { runAction } from '@web-client/presenter/test.cerebral'; + +describe('clearBlockedCasesReportAction', () => { + it('should reset blocked case filters', async () => { + const { state } = await runAction(clearBlockedCasesReportAction, { + modules: { + presenter, + }, + props: {}, + state: { + blockedCaseReportFilter: { + caseStatusFilter: CASE_STATUS_TYPES.calendared, + procedureTypeFilter: PROCEDURE_TYPES_MAP.regular, + reasonFilter: 'All', + trialLocationFilter: 'Birmingham, Alabama', + }, + blockedCases: [{}], + }, + }); + + expect(state.blockedCaseReportFilter).toEqual( + initialBlockedCaseReportFilter, + ); + expect(state.blockedCases).toEqual([]); + }); +}); diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.ts new file mode 100644 index 00000000000..c614edc224b --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction.ts @@ -0,0 +1,11 @@ +import { cloneDeep } from 'lodash'; +import { initialBlockedCaseReportFilter } from '@web-client/presenter/state/blockedCasesReportState'; +import { state } from '@web-client/presenter/app.cerebral'; + +export const clearBlockedCasesReportAction = ({ store }: ActionProps) => { + store.set( + state.blockedCaseReportFilter, + cloneDeep(initialBlockedCaseReportFilter), + ); + store.set(state.blockedCases, []); +}; diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.test.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.test.ts new file mode 100644 index 00000000000..0ebbc1b731e --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.test.ts @@ -0,0 +1,22 @@ +import { resetBlockedCasesFiltersAction } from './resetBlockedCasesFiltersAction'; +import { runAction } from '@web-client/presenter/test.cerebral'; + +describe('resetBlockedCasesFiltersAction', () => { + it('should reset the block cases report filters to "All"', async () => { + const { state } = await runAction(resetBlockedCasesFiltersAction, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: undefined, + procedureTypeFilter: undefined, + reasonFilter: undefined, + }, + }, + }); + + expect(state.blockedCaseReportFilter).toEqual({ + caseStatusFilter: 'All', + procedureTypeFilter: 'All', + reasonFilter: 'All', + }); + }); +}); diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.ts new file mode 100644 index 00000000000..4e7fa12951d --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction.ts @@ -0,0 +1,7 @@ +import { state } from '@web-client/presenter/app.cerebral'; + +export const resetBlockedCasesFiltersAction = ({ store }: ActionProps) => { + store.set(state.blockedCaseReportFilter.caseStatusFilter, 'All'); + store.set(state.blockedCaseReportFilter.procedureTypeFilter, 'All'); + store.set(state.blockedCaseReportFilter.reasonFilter, 'All'); +}; diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.test.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.test.ts new file mode 100644 index 00000000000..4a90abd8181 --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.test.ts @@ -0,0 +1,24 @@ +import { CASE_STATUS_TYPES } from '@shared/business/entities/EntityConstants'; +import { runAction } from '@web-client/presenter/test.cerebral'; +import { setBlockedCaseReportProcedureTypeAction } from '@web-client/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction'; + +describe('setBlockedCaseReportProcedureTypeAction', () => { + it('should reset the blocked cases report filters for case status and reason to "All" when a new procedure type is selected', async () => { + const { state } = await runAction(setBlockedCaseReportProcedureTypeAction, { + props: { procedureType: 'Regular' }, + state: { + blockedCaseReportFilter: { + caseStatusFilter: CASE_STATUS_TYPES.generalDocket, + procedureTypeFilter: 'Small', + reasonFilter: 'Due Date', + }, + }, + }); + + expect(state.blockedCaseReportFilter).toEqual({ + caseStatusFilter: 'All', + procedureTypeFilter: 'Regular', + reasonFilter: 'All', + }); + }); +}); diff --git a/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.ts b/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.ts new file mode 100644 index 00000000000..6e70a7f2964 --- /dev/null +++ b/web-client/src/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction.ts @@ -0,0 +1,13 @@ +import { state } from '@web-client/presenter/app.cerebral'; + +export const setBlockedCaseReportProcedureTypeAction = ({ + props, + store, +}: ActionProps<{ procedureType: string }>) => { + store.set( + state.blockedCaseReportFilter.procedureTypeFilter, + props.procedureType, + ); + store.set(state.blockedCaseReportFilter.caseStatusFilter, 'All'); + store.set(state.blockedCaseReportFilter.reasonFilter, 'All'); +}; diff --git a/web-client/src/presenter/actions/StartCase/setDefaultContactStateAction.ts b/web-client/src/presenter/actions/StartCase/setDefaultContactStateAction.ts index 81e17352d99..4a7ef37a0cb 100644 --- a/web-client/src/presenter/actions/StartCase/setDefaultContactStateAction.ts +++ b/web-client/src/presenter/actions/StartCase/setDefaultContactStateAction.ts @@ -1,4 +1,3 @@ -import { PARTY_TYPES } from '@shared/business/entities/EntityConstants'; import { showContactsHelperUpdated } from '@web-client/presenter/computeds/showContactsHelperUpdated'; import { state } from '@web-client/presenter/app.cerebral'; @@ -12,12 +11,14 @@ export const setDefaultContactStateAction = ({ value: string; }>) => { const partyType = get(state.form.partyType); + const filingType = get(state.form.filingType); + const isSpouseDeceased = get(state.form.isSpouseDeceased); - const { showContactSecondary } = showContactsHelperUpdated( + const { showContactSecondary } = showContactsHelperUpdated({ + filingType, + isSpouseDeceased, partyType, - PARTY_TYPES, - props, - ); + }); const { COUNTRY_TYPES } = applicationContext.getConstants(); diff --git a/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.test.ts b/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.test.ts index f7a578427b5..14fe40715d0 100644 --- a/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.test.ts +++ b/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.test.ts @@ -1,5 +1,6 @@ import { applicationContextForClient } from '@web-client/test/createClientTestApplicationContext'; import { computeTrialSessionFormDataAction } from './computeTrialSessionFormDataAction'; +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; import { presenter } from '@web-client/presenter/presenter-mock'; import { runAction } from '@web-client/presenter/test.cerebral'; @@ -313,7 +314,7 @@ describe('computeTrialSessionFormDataAction', () => { key: 'judgeId', value: { name: 'Test Judge', section: 'buchsChambers', userId: '123' }, }, - state: { form }, + state: { form, judgesChambers: Object.values(getTestJudgesChambers()) }, }); expect(result.state.form.judgeId).toEqual('123'); expect(result.state.form.judge).toEqual({ @@ -332,7 +333,7 @@ describe('computeTrialSessionFormDataAction', () => { key: 'judgeId', value: { name: 'Test Judge', section: 'buchsChambers', userId: '123' }, }, - state: { form }, + state: { form, judgesChambers: Object.values(getTestJudgesChambers()) }, }); expect(result.state.form.chambersPhoneNumber).toEqual('(202) 521-0810'); diff --git a/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.ts b/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.ts index 3569bdd9fef..6e621f34570 100644 --- a/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.ts +++ b/web-client/src/presenter/actions/TrialSession/computeTrialSessionFormDataAction.ts @@ -105,11 +105,9 @@ export const computeTrialSessionFormDataAction = ({ store.set(state.form.judgeId, selectedJudge.userId); store.set(state.form.judge, selectedJudge); - const JUDGES_CHAMBERS = applicationContext - .getUtilities() - .getJudgesChambers(); + const JUDGES_CHAMBERS = get(state.judgesChambers); - const judge = Object.values(JUDGES_CHAMBERS).find( + const judge = JUDGES_CHAMBERS.find( ({ section }) => section === selectedJudge.section, ); diff --git a/web-client/src/presenter/actions/clearAddressFieldsAction.test.ts b/web-client/src/presenter/actions/clearAddressFieldsAction.test.ts index bdf9f9c3eeb..22254a1cf02 100644 --- a/web-client/src/presenter/actions/clearAddressFieldsAction.test.ts +++ b/web-client/src/presenter/actions/clearAddressFieldsAction.test.ts @@ -1,110 +1,174 @@ import { clearAddressFieldsAction } from '@web-client/presenter/actions/clearAddressFieldsAction'; import { runAction } from '@web-client/presenter/test.cerebral'; -it('should clear out primary contact address fields', async () => { - const result = await runAction(clearAddressFieldsAction, { - props: { - type: 'contactPrimary', - }, - state: { - form: { - contactPrimary: { - address1: 'address1', - address2: 'address2', - address3: 'address3', - city: 'city', - country: 'country', - placeOfLegalResidence: 'placeOfLegalResidence', - postalCode: 'postalCode', - state: 'state', - }, - contactSecondary: { - address1: 'address1', - address2: 'address2', - address3: 'address3', - city: 'city', - country: 'country', - placeOfLegalResidence: 'placeOfLegalResidence', - postalCode: 'postalCode', - state: 'state', +describe('clearAddressFieldsAction', () => { + it('should clear out primary contact address fields', async () => { + const result = await runAction(clearAddressFieldsAction, { + props: { + type: 'contactPrimary', + }, + state: { + form: { + contactPrimary: { + address1: 'address1', + address2: 'address2', + address3: 'address3', + city: 'city', + country: 'country', + placeOfLegalResidence: 'placeOfLegalResidence', + postalCode: 'postalCode', + state: 'state', + }, + contactSecondary: { + address1: 'address1', + address2: 'address2', + address3: 'address3', + city: 'city', + country: 'country', + placeOfLegalResidence: 'placeOfLegalResidence', + postalCode: 'postalCode', + state: 'state', + }, }, }, - }, - }); + }); - expect(result.state.form.contactPrimary.country).toBeUndefined(); - expect(result.state.form.contactPrimary.address1).toBeUndefined(); - expect(result.state.form.contactPrimary.address2).toBeUndefined(); - expect(result.state.form.contactPrimary.address3).toBeUndefined(); - expect(result.state.form.contactPrimary.city).toBeUndefined(); - expect( - result.state.form.contactPrimary.placeOfLegalResidence, - ).toBeUndefined(); - expect(result.state.form.contactPrimary.postalCode).toBeUndefined(); - expect(result.state.form.contactPrimary.state).toBeUndefined(); + expect(result.state.form.contactPrimary.country).toBeUndefined(); + expect(result.state.form.contactPrimary.address1).toBeUndefined(); + expect(result.state.form.contactPrimary.address2).toBeUndefined(); + expect(result.state.form.contactPrimary.address3).toBeUndefined(); + expect(result.state.form.contactPrimary.city).toBeUndefined(); + expect( + result.state.form.contactPrimary.placeOfLegalResidence, + ).toBeUndefined(); + expect(result.state.form.contactPrimary.postalCode).toBeUndefined(); + expect(result.state.form.contactPrimary.state).toBeUndefined(); - expect(result.state.form.contactSecondary.country).toEqual('country'); - expect(result.state.form.contactSecondary.address1).toEqual('address1'); - expect(result.state.form.contactSecondary.address2).toEqual('address2'); - expect(result.state.form.contactSecondary.address3).toEqual('address3'); - expect(result.state.form.contactSecondary.city).toEqual('city'); - expect(result.state.form.contactSecondary.placeOfLegalResidence).toEqual( - 'placeOfLegalResidence', - ); - expect(result.state.form.contactSecondary.postalCode).toEqual('postalCode'); - expect(result.state.form.contactSecondary.state).toEqual('state'); -}); + expect(result.state.form.contactSecondary.country).toEqual('country'); + expect(result.state.form.contactSecondary.address1).toEqual('address1'); + expect(result.state.form.contactSecondary.address2).toEqual('address2'); + expect(result.state.form.contactSecondary.address3).toEqual('address3'); + expect(result.state.form.contactSecondary.city).toEqual('city'); + expect(result.state.form.contactSecondary.placeOfLegalResidence).toEqual( + 'placeOfLegalResidence', + ); + expect(result.state.form.contactSecondary.postalCode).toEqual('postalCode'); + expect(result.state.form.contactSecondary.state).toEqual('state'); + }); -it('should clear out secondary contact address fields', async () => { - const result = await runAction(clearAddressFieldsAction, { - props: { - type: 'contactSecondary', - }, - state: { - form: { - contactPrimary: { - address1: 'address1', - address2: 'address2', - address3: 'address3', - city: 'city', - country: 'country', - placeOfLegalResidence: 'placeOfLegalResidence', - postalCode: 'postalCode', - state: 'state', + it('should clear out primary contact address validation errors', async () => { + const result = await runAction(clearAddressFieldsAction, { + props: { + type: 'contactPrimary', + }, + state: { + form: { + contactPrimary: { + address1: 'address1', + }, + contactSecondary: { + address1: 'address1', + }, }, - contactSecondary: { - address1: 'address1', - address2: 'address2', - address3: 'address3', - city: 'city', - country: 'country', - placeOfLegalResidence: 'placeOfLegalResidence', - postalCode: 'postalCode', - state: 'state', + validationErrors: { + contactPrimary: { + address1: 'Enter valid address', + name: 'Enter valid name', + }, }, }, - }, + }); + + expect(result.state.validationErrors.contactPrimary.name).toEqual( + 'Enter valid name', + ); + expect( + result.state.validationErrors.contactPrimary.address, + ).toBeUndefined(); }); - expect(result.state.form.contactPrimary.country).toEqual('country'); - expect(result.state.form.contactPrimary.address1).toEqual('address1'); - expect(result.state.form.contactPrimary.address2).toEqual('address2'); - expect(result.state.form.contactPrimary.address3).toEqual('address3'); - expect(result.state.form.contactPrimary.city).toEqual('city'); - expect(result.state.form.contactPrimary.placeOfLegalResidence).toEqual( - 'placeOfLegalResidence', - ); - expect(result.state.form.contactPrimary.postalCode).toEqual('postalCode'); - expect(result.state.form.contactPrimary.state).toEqual('state'); + it('should clear out secondary contact address fields', async () => { + const result = await runAction(clearAddressFieldsAction, { + props: { + type: 'contactSecondary', + }, + state: { + form: { + contactPrimary: { + address1: 'address1', + address2: 'address2', + address3: 'address3', + city: 'city', + country: 'country', + placeOfLegalResidence: 'placeOfLegalResidence', + postalCode: 'postalCode', + state: 'state', + }, + contactSecondary: { + address1: 'address1', + address2: 'address2', + address3: 'address3', + city: 'city', + country: 'country', + placeOfLegalResidence: 'placeOfLegalResidence', + postalCode: 'postalCode', + state: 'state', + }, + }, + }, + }); - expect(result.state.form.contactSecondary.country).toBeUndefined(); - expect(result.state.form.contactSecondary.address1).toBeUndefined(); - expect(result.state.form.contactSecondary.address2).toBeUndefined(); - expect(result.state.form.contactSecondary.address3).toBeUndefined(); - expect(result.state.form.contactSecondary.city).toBeUndefined(); - expect( - result.state.form.contactSecondary.placeOfLegalResidence, - ).toBeUndefined(); - expect(result.state.form.contactSecondary.postalCode).toBeUndefined(); - expect(result.state.form.contactSecondary.state).toBeUndefined(); + expect(result.state.form.contactPrimary.country).toEqual('country'); + expect(result.state.form.contactPrimary.address1).toEqual('address1'); + expect(result.state.form.contactPrimary.address2).toEqual('address2'); + expect(result.state.form.contactPrimary.address3).toEqual('address3'); + expect(result.state.form.contactPrimary.city).toEqual('city'); + expect(result.state.form.contactPrimary.placeOfLegalResidence).toEqual( + 'placeOfLegalResidence', + ); + expect(result.state.form.contactPrimary.postalCode).toEqual('postalCode'); + expect(result.state.form.contactPrimary.state).toEqual('state'); + + expect(result.state.form.contactSecondary.country).toBeUndefined(); + expect(result.state.form.contactSecondary.address1).toBeUndefined(); + expect(result.state.form.contactSecondary.address2).toBeUndefined(); + expect(result.state.form.contactSecondary.address3).toBeUndefined(); + expect(result.state.form.contactSecondary.city).toBeUndefined(); + expect( + result.state.form.contactSecondary.placeOfLegalResidence, + ).toBeUndefined(); + expect(result.state.form.contactSecondary.postalCode).toBeUndefined(); + expect(result.state.form.contactSecondary.state).toBeUndefined(); + }); + + it('should clear out secondary contact address validation errors', async () => { + const result = await runAction(clearAddressFieldsAction, { + props: { + type: 'contactSecondary', + }, + state: { + form: { + contactPrimary: { + address1: 'address1', + }, + contactSecondary: { + address1: 'address1', + }, + }, + validationErrors: { + contactSecondary: { + address1: 'Enter valid address', + name: 'Enter valid name', + }, + }, + }, + }); + + expect(result.state.validationErrors.contactSecondary.name).toEqual( + 'Enter valid name', + ); + expect( + result.state.validationErrors.contactSecondary.address, + ).toBeUndefined(); + }); }); diff --git a/web-client/src/presenter/actions/clearAddressFieldsAction.ts b/web-client/src/presenter/actions/clearAddressFieldsAction.ts index f191bfc171d..b301f9f3278 100644 --- a/web-client/src/presenter/actions/clearAddressFieldsAction.ts +++ b/web-client/src/presenter/actions/clearAddressFieldsAction.ts @@ -10,6 +10,17 @@ export const clearAddressFieldsAction = ({ props, store }: ActionProps) => { store.unset(state.form.contactPrimary.state); store.unset(state.form.contactPrimary.postalCode); store.unset(state.form.contactPrimary.placeOfLegalResidence); + + if (state.validationErrors && state.validationErrors.contactPrimary) { + store.unset(state.validationErrors.contactPrimary.country); + store.unset(state.validationErrors.contactPrimary.address1); + store.unset(state.validationErrors.contactPrimary.address2); + store.unset(state.validationErrors.contactPrimary.address3); + store.unset(state.validationErrors.contactPrimary.city); + store.unset(state.validationErrors.contactPrimary.state); + store.unset(state.validationErrors.contactPrimary.postalCode); + store.unset(state.validationErrors.contactPrimary.placeOfLegalResidence); + } } if (props.type === 'contactSecondary') { store.unset(state.form.contactSecondary.country); @@ -20,5 +31,18 @@ export const clearAddressFieldsAction = ({ props, store }: ActionProps) => { store.unset(state.form.contactSecondary.state); store.unset(state.form.contactSecondary.postalCode); store.unset(state.form.contactSecondary.placeOfLegalResidence); + + if (state.validationErrors && state.validationErrors.contactSecondary) { + store.unset(state.validationErrors.contactSecondary.country); + store.unset(state.validationErrors.contactSecondary.address1); + store.unset(state.validationErrors.contactSecondary.address2); + store.unset(state.validationErrors.contactSecondary.address3); + store.unset(state.validationErrors.contactSecondary.city); + store.unset(state.validationErrors.contactSecondary.state); + store.unset(state.validationErrors.contactSecondary.postalCode); + store.unset( + state.validationErrors.contactSecondary.placeOfLegalResidence, + ); + } } }; diff --git a/web-client/src/presenter/actions/createCaseAction.ts b/web-client/src/presenter/actions/createCaseAction.ts index 80d0404fbf8..82b98fbfd66 100644 --- a/web-client/src/presenter/actions/createCaseAction.ts +++ b/web-client/src/presenter/actions/createCaseAction.ts @@ -7,6 +7,8 @@ import { ElectronicCreatedCaseType } from '@web-api/business/useCases/createCase import { omit } from 'lodash'; import { state } from '@web-client/presenter/app.cerebral'; +// updated-petition-flow: can be removed when flag is removed + export const createCaseAction = async ({ applicationContext, get, diff --git a/web-client/src/presenter/actions/deleteValidationErrorMessageAction.ts b/web-client/src/presenter/actions/deleteValidationErrorMessageAction.ts index 471946e8559..91f36c0e5f1 100644 --- a/web-client/src/presenter/actions/deleteValidationErrorMessageAction.ts +++ b/web-client/src/presenter/actions/deleteValidationErrorMessageAction.ts @@ -5,7 +5,9 @@ export const deleteValidationErrorMessageAction = ({ get, props, store, -}: ActionProps<{ validationKey: any }>) => { +}: ActionProps<{ + validationKey: (string | { property: string; value: any })[]; +}>) => { const { validationKey } = props; const validationErrors = cloneDeep( get(state.validationErrors), diff --git a/web-client/src/presenter/actions/formatPetitionAction.test.ts b/web-client/src/presenter/actions/formatPetitionAction.test.ts index 61146360fa6..e7cfc5e5cd1 100644 --- a/web-client/src/presenter/actions/formatPetitionAction.test.ts +++ b/web-client/src/presenter/actions/formatPetitionAction.test.ts @@ -1,7 +1,10 @@ import { CASE_TYPES_MAP } from '@shared/business/entities/EntityConstants'; import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; import { formatPetitionAction } from '@web-client/presenter/actions/formatPetitionAction'; -import { mockPetitionerUser } from '@shared/test/mockAuthUsers'; +import { + mockPetitionerUser, + mockPrivatePractitionerUser, +} from '@shared/test/mockAuthUsers'; import { presenter } from '../presenter-mock'; import { runAction } from '@web-client/presenter/test.cerebral'; @@ -158,38 +161,82 @@ describe('formatPetitionAction', () => { }); }); - it('should set noticeIssuedDate and taxYear as undefined if there is no irsNotice', async () => { - const propsWithoutIrsNotice = { - ...PROPS, - createPetitionStep3Data: { - caseType: CASE_TYPES_MAP.deficiency, - irsNotices: [], - }, - }; + it('should set counsel contact if user is a private practitioner', async () => { const results = await runAction(formatPetitionAction, { modules: { presenter, }, - props: propsWithoutIrsNotice, + props: PROPS, state: { petitionFormatted: undefined, user: { - ...mockPetitionerUser, - email: TEST_EMAIL, + ...mockPrivatePractitionerUser, + barNumber: 'TEST_barNumber', + contact: { + address1: 'TEST_address1', + address2: 'TEST_address2', + address3: 'TEST_address3', + city: 'TEST_city', + phone: 'TEST_phone', + postalCode: 'TEST_postalCode', + state: 'TEST_state', + }, + firmName: 'TEST_firmName', }, }, }); - expect(results.state.petitionFormatted).toEqual({ - caseCaption: 'TEST_CASE_CAPTION', - caseCaptionExtension: '', - caseTitle: 'TEST_CASE_CAPTION', - caseType: CASE_TYPES_MAP.deficiency, - contactPrimary: { - email: 'TEST_EMAIL', + expect(results.state.petitionFormatted.contactCounsel).toEqual({ + address1: 'TEST_address1', + address2: 'TEST_address2', + address3: 'TEST_address3', + barNumber: 'TEST_barNumber', + city: 'TEST_city', + email: 'mockPrivatePractitioner@example.com', + firmName: 'TEST_firmName', + name: 'Reginald Barclay', + phone: 'TEST_phone', + postalCode: 'TEST_postalCode', + state: 'TEST_state', + }); + }); + + it('should set primary contact email to user email when the user is a petitioner', async () => { + const results = await runAction(formatPetitionAction, { + modules: { + presenter, + }, + props: PROPS, + state: { + petitionFormatted: undefined, + user: mockPetitionerUser, }, - irsNotices: [], - originalCaseType: CASE_TYPES_MAP.deficiency, }); + + expect(results.state.petitionFormatted?.contactPrimary?.email).toEqual( + 'mockPetitioner@example.com', + ); + }); + + it('should not set primary contact email to user email when the user is a private practitioner', async () => { + const results = await runAction(formatPetitionAction, { + modules: { + presenter, + }, + props: { + ...PROPS, + createPetitionStep1Data: { + contactPrimary: { email: 'test@example.com' }, + }, + }, + state: { + petitionFormatted: undefined, + user: mockPrivatePractitionerUser, + }, + }); + + expect(results.state.petitionFormatted?.contactPrimary?.email).toEqual( + 'mockPrivatePractitioner@example.com', + ); }); }); diff --git a/web-client/src/presenter/actions/formatPetitionAction.ts b/web-client/src/presenter/actions/formatPetitionAction.ts index 997b6d16d30..65ffd156b9f 100644 --- a/web-client/src/presenter/actions/formatPetitionAction.ts +++ b/web-client/src/presenter/actions/formatPetitionAction.ts @@ -1,4 +1,10 @@ -import { CASE_TYPES_MAP } from '@shared/business/entities/EntityConstants'; +import { + CASE_TYPES_MAP, + ROLES, +} from '@shared/business/entities/EntityConstants'; +import { RawIrsPractitioner } from '@shared/business/entities/IrsPractitioner'; +import { RawPractitioner } from '@shared/business/entities/Practitioner'; +import { RawUser } from '@shared/business/entities/User'; import { getCaseCaptionMeta } from '@shared/business/utilities/getCaseCaptionMeta'; import { state } from '@web-client/presenter/app.cerebral'; @@ -31,6 +37,7 @@ export const formatPetitionAction = ({ const { contactPrimary, irsNotices } = petitionInfo; const user = get(state.user); + contactPrimary.email = user.email; const irsNoticesWithCaseTypes = irsNotices.map(irsNotice => { @@ -41,11 +48,28 @@ export const formatPetitionAction = ({ }; }); + const contactCounsel = isRawPractitioner(user) + ? { + address1: user.contact?.address1, + address2: user.contact?.address2, + address3: user.contact?.address3, + barNumber: user.barNumber, + city: user.contact?.city, + email: user.email, + firmName: user.firmName, + name: user.name, + phone: user.contact?.phone, + postalCode: user.contact?.postalCode, + state: user.contact?.state, + } + : undefined; + store.set(state.petitionFormatted, { ...petitionInfo, caseCaption, caseCaptionExtension, caseTitle, + contactCounsel, contactPrimary, irsNotices: irsNoticesWithCaseTypes, }); @@ -57,3 +81,9 @@ function formatCaseType(caseType: string) { } return caseType; } + +function isRawPractitioner( + user: RawUser | RawPractitioner | RawIrsPractitioner, +): user is RawPractitioner { + return user.role === ROLES.privatePractitioner; +} diff --git a/web-client/src/presenter/actions/getCreatePetitionStep3DataAction.ts b/web-client/src/presenter/actions/getCreatePetitionStep3DataAction.ts index 0a20664d222..977dc5f9022 100644 --- a/web-client/src/presenter/actions/getCreatePetitionStep3DataAction.ts +++ b/web-client/src/presenter/actions/getCreatePetitionStep3DataAction.ts @@ -4,9 +4,7 @@ import { } from '@shared/business/utilities/DateHandler'; import { state } from '@web-client/presenter/app.cerebral'; -export const getCreatePetitionStep3DataAction = ({ - get, -}: ActionProps<{ selectedPage: number }>) => { +export const getCreatePetitionStep3DataAction = ({ get }: ActionProps) => { const { caseType, hasIrsNotice, irsNoticesRedactionAcknowledgement } = get( state.form, ); diff --git a/web-client/src/presenter/actions/getCreatePetitionStep4DataAction.ts b/web-client/src/presenter/actions/getCreatePetitionStep4DataAction.ts index 5b9fea35e98..43da7030886 100644 --- a/web-client/src/presenter/actions/getCreatePetitionStep4DataAction.ts +++ b/web-client/src/presenter/actions/getCreatePetitionStep4DataAction.ts @@ -1,8 +1,6 @@ import { state } from '@web-client/presenter/app.cerebral'; -export const getCreatePetitionStep4DataAction = ({ - get, -}: ActionProps<{ selectedPage: number }>) => { +export const getCreatePetitionStep4DataAction = ({ get }: ActionProps) => { const { preferredTrialCity, procedureType } = get(state.form); const createPetitionStep4Data = { diff --git a/web-client/src/presenter/actions/getCreatePetitionStep5DataAction.ts b/web-client/src/presenter/actions/getCreatePetitionStep5DataAction.ts index 4b207a1fea7..f640b131c5b 100644 --- a/web-client/src/presenter/actions/getCreatePetitionStep5DataAction.ts +++ b/web-client/src/presenter/actions/getCreatePetitionStep5DataAction.ts @@ -1,8 +1,6 @@ import { state } from '@web-client/presenter/app.cerebral'; -export const getCreatePetitionStep5DataAction = ({ - get, -}: ActionProps<{ selectedPage: number }>) => { +export const getCreatePetitionStep5DataAction = ({ get }: ActionProps) => { const { stinFile, stinFileSize } = get(state.form); const createPetitionStep5Data = { diff --git a/web-client/src/presenter/actions/getJudgesChambersAction.test.ts b/web-client/src/presenter/actions/getJudgesChambersAction.test.ts new file mode 100644 index 00000000000..c9859030369 --- /dev/null +++ b/web-client/src/presenter/actions/getJudgesChambersAction.test.ts @@ -0,0 +1,65 @@ +import { + JudgeChambersInfo, + getJudgesChambersAction, +} from '@web-client/presenter/actions/getJudgesChambersAction'; +import { ROLES } from '@shared/business/entities/EntityConstants'; +import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { presenter } from '../presenter-mock'; +import { runAction } from '@web-client/presenter/test.cerebral'; + +describe('getJudgesChambersAction', () => { + const MOCK_JUDGE_USERS = [ + { + isSeniorJudge: false, + judgeFullName: 'Test Judge 1', + judgePhoneNumber: '(123) 123-1234', + judgeTitle: 'Judge', + name: 'Test Judge 1', + role: ROLES.judge, + section: 'testJudge1sChambers', + userId: 'ce5add74-1559-448d-a67d-c887c8351b2e', + }, + { + isSeniorJudge: false, + judgeFullName: 'Test Judge 2', + judgeTitle: 'Judge', + name: 'Test Judge 2', + role: ROLES.judge, + section: 'testJudge2sChambers', + userId: 'ea83cea2-5ce9-451d-b3d6-1e7c0e51d311', + }, + ]; + + const MOCK_JUDGES_CHAMBERS: JudgeChambersInfo[] = [ + { + isLegacy: false, + judgeFullName: 'Test Judge 1', + label: 'Test Judge 1’s Chambers', + phoneNumber: '(123) 123-1234', + section: 'testJudge1sChambers', + }, + { + isLegacy: false, + judgeFullName: 'Test Judge 2', + label: 'Test Judge 2’s Chambers', + phoneNumber: undefined, + section: 'testJudge2sChambers', + }, + ]; + + beforeAll(() => { + presenter.providers.applicationContext = applicationContext; + }); + + it('gets the correct judgesChambers', async () => { + applicationContext + .getUseCases() + .getUsersInSectionInteractor.mockReturnValue(MOCK_JUDGE_USERS); + const { output } = await runAction(getJudgesChambersAction, { + modules: { + presenter, + }, + }); + expect(output).toMatchObject({ judgesChambers: MOCK_JUDGES_CHAMBERS }); + }); +}); diff --git a/web-client/src/presenter/actions/getJudgesChambersAction.ts b/web-client/src/presenter/actions/getJudgesChambersAction.ts new file mode 100644 index 00000000000..ae2683b636c --- /dev/null +++ b/web-client/src/presenter/actions/getJudgesChambersAction.ts @@ -0,0 +1,51 @@ +import { RawUser } from '@shared/business/entities/User'; +import { isEmpty, sortBy } from 'lodash'; +import { state } from '@web-client/presenter/app.cerebral'; + +export interface JudgeChambersInfo { + label: string; + judgeFullName: string; + phoneNumber?: string; + section: string; + isLegacy?: boolean; +} + +const pluralizeChambersLabel = (judgeName: string) => { + return judgeName.endsWith('s') + ? judgeName + '’ Chambers' + : judgeName + '’s Chambers'; +}; + +export const getJudgesChambersAction = async ({ + applicationContext, + get, +}: ActionProps) => { + const judgesChambersCached = get(state.judgesChambers); + if (!isEmpty(judgesChambersCached)) { + return { judgesChambers: judgesChambersCached }; + } + + const judgeUsers: RawUser[] = await applicationContext + .getUseCases() + .getUsersInSectionInteractor(applicationContext, { section: 'judge' }); + + const judgesChambers: JudgeChambersInfo[] = judgeUsers.map(u => { + const phoneNumber = u.judgePhoneNumber; + const label = pluralizeChambersLabel(u.name); + return { + isLegacy: u.section === 'legacyJudgesChambers', + judgeFullName: u.judgeFullName, + label, + phoneNumber, + section: u.section, + } as JudgeChambersInfo; + }); + + const filteredJudgesChambers = judgesChambers.filter( + chambers => !chambers.isLegacy, + ); + + return { + judgesChambers: sortBy(filteredJudgesChambers, 'label'), + }; +}; diff --git a/web-client/src/presenter/actions/saveAndSubmitCaseAction.test.ts b/web-client/src/presenter/actions/saveAndSubmitCaseAction.test.ts index ecd812683b2..ed932172e66 100644 --- a/web-client/src/presenter/actions/saveAndSubmitCaseAction.test.ts +++ b/web-client/src/presenter/actions/saveAndSubmitCaseAction.test.ts @@ -1,5 +1,6 @@ import { PETITION_TYPES } from '@shared/business/entities/EntityConstants'; import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { mockPetitionerUser } from '@shared/test/mockAuthUsers'; import { presenter } from '@web-client/presenter/presenter-mock'; import { runAction } from '@web-client/presenter/test.cerebral'; import { saveAndSubmitCaseAction } from '@web-client/presenter/actions/saveAndSubmitCaseAction'; @@ -68,6 +69,7 @@ describe('saveAndSubmitCaseAction', () => { petitionFormatted: 'petitionFormattedData', petitionType: PETITION_TYPES.userUploaded, }, + user: mockPetitionerUser, }, }); @@ -150,6 +152,7 @@ describe('saveAndSubmitCaseAction', () => { petitionFormatted: 'petitionFormattedData', petitionType: PETITION_TYPES.autoGenerated, }, + user: mockPetitionerUser, }, }); @@ -234,6 +237,7 @@ describe('saveAndSubmitCaseAction', () => { petitionFormatted: 'petitionFormattedData', petitionType: PETITION_TYPES.autoGenerated, }, + user: mockPetitionerUser, }, }); diff --git a/web-client/src/presenter/actions/saveAndSubmitCaseAction.ts b/web-client/src/presenter/actions/saveAndSubmitCaseAction.ts index 52eebd0e098..283f6ecc681 100644 --- a/web-client/src/presenter/actions/saveAndSubmitCaseAction.ts +++ b/web-client/src/presenter/actions/saveAndSubmitCaseAction.ts @@ -3,6 +3,7 @@ import { FileUploadProgressType, FileUploadProgressValueType, PETITION_TYPES, + ROLES, } from '@shared/business/entities/EntityConstants'; import { state } from '@web-client/presenter/app.cerebral'; @@ -82,11 +83,14 @@ export const saveAndSubmitCaseAction = async ({ await Promise.all(documentsThatNeedCoverSheet.map(addCoversheet)); + const isPetitioner = user.role === ROLES.petitioner; + const successTitle = `${isPetitioner ? 'Your' : 'The'} case has been assigned docket number ${caseDetail.docketNumberWithSuffix || caseDetail.docketNumber}`; + const successMessage = `${isPetitioner ? 'Your' : 'The'} case has been created and ${isPetitioner ? 'your' : ''} documents sent to the U.S. Tax Court.`; + return path.success({ alertSuccess: { - message: - 'Your case has been created and your documents sent to the U.S. Tax Court.', - title: `Your case has been assigned docket number ${caseDetail.docketNumberWithSuffix || caseDetail.docketNumber}`, + message: successMessage, + title: successTitle, }, caseDetail, }); diff --git a/web-client/src/presenter/actions/setFormValueAction.test.ts b/web-client/src/presenter/actions/setFormValueAction.test.ts index edf4aa1ff9e..02a23020aa4 100644 --- a/web-client/src/presenter/actions/setFormValueAction.test.ts +++ b/web-client/src/presenter/actions/setFormValueAction.test.ts @@ -77,4 +77,19 @@ describe('setFormValueAction', () => { }); expect(result.state.form.appleType).toEqual(undefined); }); + + describe('root', () => { + it('should save to the specified root level of state', async () => { + const TEST_ROOT = 'TEST_ROOT'; + const result = await runAction(setFormValueAction, { + props: { + key: 'hasApples', + root: TEST_ROOT, + value: true, + }, + state: {}, + }); + expect(result.state[TEST_ROOT].hasApples).toEqual(true); + }); + }); }); diff --git a/web-client/src/presenter/actions/setFormValueAction.ts b/web-client/src/presenter/actions/setFormValueAction.ts index 45b851cd412..54b4b8b2c6e 100644 --- a/web-client/src/presenter/actions/setFormValueAction.ts +++ b/web-client/src/presenter/actions/setFormValueAction.ts @@ -6,18 +6,20 @@ export const setFormValueAction = ({ }: ActionProps<{ allowEmptyString?: boolean; index?: number; + root?: string; key: string; value: any; }>) => { - const { allowEmptyString, index, key, value } = props; + const { allowEmptyString, index, key, root, value } = props; + const stateRoot = root || 'form'; if ((!allowEmptyString && value === '') || value === null) { - return store.unset(state.form[key]); + return store.unset(state[stateRoot][key]); } if (typeof index === 'number') { - return store.set(state.form[key][index], value); + return store.set(state[stateRoot][key][index], value); } - store.set(state.form[key], value); + store.set(state[stateRoot][key], value); }; diff --git a/web-client/src/presenter/actions/setJudgesChambersAction.test.ts b/web-client/src/presenter/actions/setJudgesChambersAction.test.ts new file mode 100644 index 00000000000..104e4dcf95e --- /dev/null +++ b/web-client/src/presenter/actions/setJudgesChambersAction.test.ts @@ -0,0 +1,16 @@ +import { getTestJudgesChambers } from '@shared/test/mockJudgesChambers'; +import { runAction } from '@web-client/presenter/test.cerebral'; +import { setJudgesChambersAction } from '@web-client/presenter/actions/setJudgesChambersAction'; + +describe('setJudgesChambersAction', () => { + const judgesChambers = Object.values(getTestJudgesChambers()); + + it('sets state.judgesChambers to the passed in props.judgesChambers', async () => { + const { state } = await runAction(setJudgesChambersAction, { + props: { + judgesChambers, + }, + }); + expect(state.judgesChambers).toMatchObject(judgesChambers); + }); +}); diff --git a/web-client/src/presenter/actions/setJudgesChambersAction.ts b/web-client/src/presenter/actions/setJudgesChambersAction.ts new file mode 100644 index 00000000000..73ffe8326a9 --- /dev/null +++ b/web-client/src/presenter/actions/setJudgesChambersAction.ts @@ -0,0 +1,9 @@ +import { JudgeChambersInfo } from '@web-client/presenter/actions/getJudgesChambersAction'; +import { state } from '@web-client/presenter/app.cerebral'; + +export const setJudgesChambersAction = ({ + props, + store, +}: ActionProps<{ judgesChambers: JudgeChambersInfo[] }>) => { + store.set(state.judgesChambers, props.judgesChambers); +}; diff --git a/web-client/src/presenter/actions/setProcedureTypeToAllAction.test.ts b/web-client/src/presenter/actions/setProcedureTypeToAllAction.test.ts deleted file mode 100644 index 90f35c0f222..00000000000 --- a/web-client/src/presenter/actions/setProcedureTypeToAllAction.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { runAction } from '@web-client/presenter/test.cerebral'; -import { setProcedureTypeToAllAction } from './setProcedureTypeToAllAction'; - -describe('setProcedureTypeToAllAction', () => { - it('sets state.form.procedureType to All', async () => { - const result = await runAction(setProcedureTypeToAllAction, { - state: { - form: { - procedureType: undefined, - }, - }, - }); - - expect(result.state.form.procedureType).toEqual('All'); - }); -}); diff --git a/web-client/src/presenter/actions/setProcedureTypeToAllAction.ts b/web-client/src/presenter/actions/setProcedureTypeToAllAction.ts deleted file mode 100644 index fdcae583136..00000000000 --- a/web-client/src/presenter/actions/setProcedureTypeToAllAction.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { state } from '@web-client/presenter/app.cerebral'; - -/** - * sets the procedure type filter to 'All' - * @param {object} providers the providers object - * @param {object} providers.store the cerebral store - */ -export const setProcedureTypeToAllAction = ({ store }: ActionProps) => { - store.set(state.form.procedureType, 'All'); -}; diff --git a/web-client/src/presenter/actions/updatedValidatePetitionAction.ts b/web-client/src/presenter/actions/updatedValidatePetitionAction.ts index fd8e80ed2f0..751e4b0bfb4 100644 --- a/web-client/src/presenter/actions/updatedValidatePetitionAction.ts +++ b/web-client/src/presenter/actions/updatedValidatePetitionAction.ts @@ -7,11 +7,9 @@ export const updatedValidatePetitionAction = ({ }: ActionProps) => { const petition = get(state.petitionFormatted); - const errors = applicationContext - .getUseCases() - .validatePetitionInteractor(applicationContext, { - petition, - }); + const errors = applicationContext.getUseCases().validatePetitionInteractor({ + petition, + }); if (errors) { return path.error({ diff --git a/web-client/src/presenter/actions/validatePetitionAction.ts b/web-client/src/presenter/actions/validatePetitionAction.ts index d71275a5b7d..dcba23f3dbd 100644 --- a/web-client/src/presenter/actions/validatePetitionAction.ts +++ b/web-client/src/presenter/actions/validatePetitionAction.ts @@ -22,11 +22,9 @@ export const validatePetitionAction = ({ 'trialCities', ); - const errors = applicationContext - .getUseCases() - .validatePetitionInteractor(applicationContext, { - petition: form, - }); + const errors = applicationContext.getUseCases().validatePetitionInteractor({ + petition: form, + }); if (!errors) { return path.success(); diff --git a/web-client/src/presenter/computeds/blockedCasesReportHelper.test.ts b/web-client/src/presenter/computeds/blockedCasesReportHelper.test.ts index cac42d692d9..9b632135612 100644 --- a/web-client/src/presenter/computeds/blockedCasesReportHelper.test.ts +++ b/web-client/src/presenter/computeds/blockedCasesReportHelper.test.ts @@ -10,21 +10,13 @@ describe('blockedCasesReportHelper', () => { blockedCasesReportHelperComputed, ); - const noBlockedCasesLocationMessage = - 'There are no blocked cases for this location.'; - const noBlockedCasesProcedureTypeMessage = - 'There are no blocked cases for this case type.'; - - it('returns blockedCasesCount as 0 if blockedCases is not on the state', () => { - const result = runCompute(blockedCasesReportHelper, { - state: {}, - }); - expect(result).toMatchObject({ blockedCasesCount: 0 }); - }); - it('returns blockedCasesCount as 0 if the blockedCases array is empty', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'All', + }, blockedCases: [], }, }); @@ -34,6 +26,10 @@ describe('blockedCasesReportHelper', () => { it('returns blockedCasesCount as the length of the blockedCases array', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'All', + }, blockedCases: [ { docketNumber: '101-19' }, { docketNumber: '102-19' }, @@ -50,6 +46,10 @@ describe('blockedCasesReportHelper', () => { it('formats blocked cases with caseTitle, docketNumberWithSuffix, and blockedDateFormatted and sorts by docket number', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'All', + }, blockedCases: [ { blocked: true, @@ -162,6 +162,11 @@ describe('blockedCasesReportHelper', () => { it('should return blocked small cases when small is selected', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + procedureTypeFilter: 'Small', + reasonFilter: 'All', + }, blockedCases: [ { blocked: true, @@ -202,7 +207,6 @@ describe('blockedCasesReportHelper', () => { procedureType: 'Regular', }, ], - form: { procedureType: 'Small' }, }, }); expect(result.blockedCasesCount).toBe(2); @@ -221,6 +225,11 @@ describe('blockedCasesReportHelper', () => { it('should return blocked regular cases when regular is selected', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + procedureTypeFilter: 'Regular', + reasonFilter: 'All', + }, blockedCases: [ { blocked: true, @@ -261,7 +270,6 @@ describe('blockedCasesReportHelper', () => { procedureType: 'Regular', }, ], - form: { procedureType: 'Regular' }, }, }); expect(result.blockedCasesCount).toBe(2); @@ -280,6 +288,11 @@ describe('blockedCasesReportHelper', () => { it('should return all cases if the procedureType is undefined', () => { const result = runCompute(blockedCasesReportHelper, { state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + procedureTypeFilter: undefined, + reasonFilter: 'All', + }, blockedCases: [ { blocked: true, @@ -320,103 +333,139 @@ describe('blockedCasesReportHelper', () => { procedureType: 'Regular', }, ], - form: { procedureType: undefined }, }, }); expect(result.blockedCasesCount).toEqual(4); }); - it('should display correct display message when blockedCasesCount equals zero', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [], - form: { procedureType: 'All' }, - }, - }); - expect(result.displayMessage).toEqual(noBlockedCasesLocationMessage); - }); + describe('filters', () => { + describe('caseStatusFilter', () => { + it('should return all the blocked cases when "caseStatusFilter" is set to "All', () => { + const TEST_CASES = [ + { docketNumber: '101-19' }, + { docketNumber: '102-19' }, + { docketNumber: '103-19' }, + ]; - it('should display correct display message when procedureType is set to Small and there are no Small Blocked Cases', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [ - { - automaticBlocked: true, - automaticBlockedDate: '2019-03-05T21:42:29.073Z', - caseCaption: 'Bob Barker, Petitioner', - docketNumber: '104-19', - docketNumberWithSuffix: '104-19', - procedureType: 'Regular', + const result = runCompute(blockedCasesReportHelper, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'All', + }, + blockedCases: TEST_CASES, }, - ], - form: { procedureType: 'Small' }, - }, - }); - expect(result.displayMessage).toEqual(noBlockedCasesProcedureTypeMessage); - }); + }); + expect(result.blockedCasesFormatted.length).toEqual(TEST_CASES.length); + }); - it('should not display any message when procedureType is set to Regular and there are Regular Blocked Cases', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [ - { - automaticBlocked: true, - automaticBlockedDate: '2019-03-05T21:42:29.073Z', - caseCaption: 'Bob Barker, Petitioner', - docketNumber: '104-19', - docketNumberWithSuffix: '104-19', - procedureType: 'Regular', + it('should filter out blocked cases that do not match "caseStatusFilter"', () => { + const TEST_STATUS = 'TEST_STATUS'; + const TEST_CASES = [ + { docketNumber: '101-19', status: 'RANDOM' }, + { docketNumber: '102-19', status: TEST_STATUS }, + { docketNumber: '103-19', status: 'RANDOM' }, + ]; + + const result = runCompute(blockedCasesReportHelper, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: TEST_STATUS, + reasonFilter: 'All', + }, + blockedCases: TEST_CASES, }, - ], - form: { procedureType: 'Regular' }, - }, + }); + + expect(result.blockedCasesFormatted.length).toEqual(1); + expect(result.blockedCasesFormatted[0]).toMatchObject({ + docketNumber: '102-19', + status: TEST_STATUS, + }); + }); }); - expect(result.displayMessage).toBeUndefined(); - }); - it('should not display any message when procedureType is set to All and there are Blocked Cases', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [ - { - automaticBlocked: true, - automaticBlockedDate: '2019-03-05T21:42:29.073Z', - caseCaption: 'Bob Barker, Petitioner', - docketNumber: '104-19', - docketNumberWithSuffix: '104-19', - procedureType: 'Regular', + describe('reasonFilter', () => { + it('should return all the blocked cases when "reasonFilter" is set to "All', () => { + const TEST_CASES = [ + { docketNumber: '101-19' }, + { docketNumber: '102-19' }, + { docketNumber: '103-19' }, + ]; + + const result = runCompute(blockedCasesReportHelper, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'All', + }, + blockedCases: TEST_CASES, }, - ], - form: { procedureType: 'All' }, - }, - }); - expect(result.displayMessage).toBeUndefined(); - }); + }); + expect(result.blockedCasesFormatted.length).toEqual(TEST_CASES.length); + }); - it('should not display any message when procedureType is not set on form and there are Blocked Cases', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [ + it('should filter out blocked cases that do not match "reasonFilter"', () => { + const TEST_REASON = 'TEST_REASON'; + const TEST_CASES = [ + { automaticBlockedReason: 'RANDOM', docketNumber: '101-19' }, + { automaticBlockedReason: TEST_REASON, docketNumber: '102-19' }, + { automaticBlockedReason: 'RANDOM', docketNumber: '103-19' }, + ]; + + const result = runCompute(blockedCasesReportHelper, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: TEST_REASON, + }, + blockedCases: TEST_CASES, + }, + }); + + expect(result.blockedCasesFormatted.length).toEqual(1); + expect(result.blockedCasesFormatted[0]).toMatchObject({ + automaticBlockedReason: TEST_REASON, + docketNumber: '102-19', + }); + }); + + it('should filter out blocked cases that do not have user added reason if "reasonFilter" is "Manual Block"', () => { + const TEST_CASES = [ { - automaticBlocked: true, - automaticBlockedDate: '2019-03-05T21:42:29.073Z', - caseCaption: 'Bob Barker, Petitioner', - docketNumber: '104-19', - docketNumberWithSuffix: '104-19', - procedureType: 'Regular', + automaticBlockedReason: 'RANDOM', + blockedReason: '', + docketNumber: '101-19', }, - ], - }, - }); - expect(result.displayMessage).toBeUndefined(); - }); + { + automaticBlockedReason: 'RANDOM', + blockedReason: 'RANDOM USER REASON', + docketNumber: '102-19', + }, + { + automaticBlockedReason: 'RANDOM', + blockedReason: '', + docketNumber: '103-19', + }, + ]; - it('should display correct display message when procedureType is not on form and there are no Blocked Cases', () => { - const result = runCompute(blockedCasesReportHelper, { - state: { - blockedCases: [], - }, + const result = runCompute(blockedCasesReportHelper, { + state: { + blockedCaseReportFilter: { + caseStatusFilter: 'All', + reasonFilter: 'Manual Block', + }, + blockedCases: TEST_CASES, + }, + }); + + expect(result.blockedCasesFormatted.length).toEqual(1); + expect(result.blockedCasesFormatted[0]).toMatchObject({ + automaticBlockedReason: 'RANDOM', + blockedReason: 'RANDOM USER REASON', + docketNumber: '102-19', + }); + }); }); - expect(result.displayMessage).toEqual(noBlockedCasesLocationMessage); }); }); diff --git a/web-client/src/presenter/computeds/blockedCasesReportHelper.ts b/web-client/src/presenter/computeds/blockedCasesReportHelper.ts index cae8244c8c0..411d41b2c53 100644 --- a/web-client/src/presenter/computeds/blockedCasesReportHelper.ts +++ b/web-client/src/presenter/computeds/blockedCasesReportHelper.ts @@ -1,80 +1,108 @@ -import { state } from '@web-client/presenter/app.cerebral'; - -/** - * gets the blocked cases and formats them and filters based on procedureType - * @param {Function} get the cerebral get function used - * for getting state.form.procedureType and state.blockedCases - * @param {object} applicationContext the application context - * @returns {object} {blockedCasesFormatted: *[], blockedCasesCount: number} - */ +import { CaseStatus } from '@shared/business/entities/EntityConstants'; import { ClientApplicationContext } from '@web-client/applicationContext'; import { Get } from 'cerebral'; +import { state } from '@web-client/presenter/app.cerebral'; + export const blockedCasesReportHelper = ( get: Get, applicationContext: ClientApplicationContext, -): any => { - const blockedCases = get(state.blockedCases); - const procedureTypeFilter = get(state.form.procedureType); +): { + blockedCasesCount: number; + blockedCasesFormatted: BlockedFormattedCase[]; +} => { + const blockedCases: RawCase[] = get(state.blockedCases); + const { caseStatusFilter, procedureTypeFilter, reasonFilter } = get( + state.blockedCaseReportFilter, + ); - let blockedCasesFormatted = []; - let displayMessage; - - const setFormattedBlockDates = blockedCase => { - if (blockedCase.blockedDate && blockedCase.automaticBlocked) { - if (blockedCase.blockedDate < blockedCase.automaticBlockedDate) { - blockedCase.blockedDateEarliest = applicationContext - .getUtilities() - .formatDateString(blockedCase.blockedDate, 'MMDDYY'); - } else { - blockedCase.blockedDateEarliest = applicationContext - .getUtilities() - .formatDateString(blockedCase.automaticBlockedDate, 'MMDDYY'); - } - } else if (blockedCase.blocked) { - blockedCase.blockedDateEarliest = applicationContext - .getUtilities() - .formatDateString(blockedCase.blockedDate, 'MMDDYY'); - } else if (blockedCase.automaticBlocked) { - blockedCase.blockedDateEarliest = applicationContext + const blockedCasesFormatted: BlockedFormattedCase[] = blockedCases + .sort(applicationContext.getUtilities().compareCasesByDocketNumber) + .map(blockedCase => { + const blockedCaseWithConsolidatedProperties = applicationContext .getUtilities() - .formatDateString(blockedCase.automaticBlockedDate, 'MMDDYY'); - } - return blockedCase; - }; - - if (blockedCases && blockedCases.length) { - blockedCasesFormatted = blockedCases - .sort(applicationContext.getUtilities().compareCasesByDocketNumber) - .map(blockedCase => { - const blockedCaseWithConsolidatedProperties = applicationContext - .getUtilities() - .setConsolidationFlagsForDisplay(blockedCase); - return { - ...setFormattedBlockDates(blockedCaseWithConsolidatedProperties), - caseTitle: applicationContext.getCaseTitle( - blockedCase.caseCaption || '', - ), - docketNumberWithSuffix: blockedCase.docketNumberWithSuffix, - }; - }) - .filter(blockedCase => { - return procedureTypeFilter && procedureTypeFilter !== 'All' - ? blockedCase.procedureType === procedureTypeFilter - : true; - }); - } + .setConsolidationFlagsForDisplay(blockedCase); - if (blockedCasesFormatted.length === 0) { - displayMessage = 'There are no blocked cases for this location.'; + const updatedCase = { + ...setFormattedBlockDates( + blockedCaseWithConsolidatedProperties, + applicationContext, + ), + caseTitle: applicationContext.getCaseTitle( + blockedCase.caseCaption || '', + ), + docketNumberWithSuffix: blockedCase.docketNumberWithSuffix, + }; - if (procedureTypeFilter && procedureTypeFilter !== 'All') { - displayMessage = 'There are no blocked cases for this case type.'; - } - } + return updatedCase; + }) + .filter(blockedCase => { + return procedureTypeFilter && procedureTypeFilter !== 'All' + ? blockedCase.procedureType === procedureTypeFilter + : true; + }) + .filter(blockedCase => { + if (caseStatusFilter === 'All') return true; + return blockedCase.status === caseStatusFilter; + }) + .filter(blockedCase => { + if (reasonFilter === 'All') return true; + if (reasonFilter === 'Manual Block') return !!blockedCase.blockedReason; + return blockedCase.automaticBlockedReason === reasonFilter; + }); return { blockedCasesCount: blockedCasesFormatted.length, blockedCasesFormatted, - displayMessage, }; }; + +export type BlockedFormattedCase = { + docketNumber: string; + inConsolidatedGroup: boolean; + consolidatedIconTooltipText: string; + isLeadCase: boolean; + blockedDateEarliest: string; + caseTitle: string; + procedureType: string; + status: CaseStatus; + blockedReason?: string; + automaticBlockedReason?: string; + docketNumberWithSuffix?: string; +}; + +const setFormattedBlockDates = ( + blockedCase: RawCase & { + inConsolidatedGroup: boolean; + consolidatedIconTooltipText: string; + shouldIndent: boolean; + isLeadCase: boolean; + }, + applicationContext: ClientApplicationContext, +): BlockedFormattedCase => { + const blockedFormattedCase: BlockedFormattedCase = { + ...blockedCase, + blockedDateEarliest: '', + caseTitle: '', + }; + + if (blockedCase.blockedDate && blockedCase.automaticBlocked) { + if (blockedCase.blockedDate < blockedCase.automaticBlockedDate!) { + blockedFormattedCase.blockedDateEarliest = applicationContext + .getUtilities() + .formatDateString(blockedCase.blockedDate, 'MMDDYY'); + } else { + blockedFormattedCase.blockedDateEarliest = applicationContext + .getUtilities() + .formatDateString(blockedCase.automaticBlockedDate!, 'MMDDYY'); + } + } else if (blockedCase.blocked) { + blockedFormattedCase.blockedDateEarliest = applicationContext + .getUtilities() + .formatDateString(blockedCase.blockedDate!, 'MMDDYY'); + } else if (blockedCase.automaticBlocked) { + blockedFormattedCase.blockedDateEarliest = applicationContext + .getUtilities() + .formatDateString(blockedCase.automaticBlockedDate!, 'MMDDYY'); + } + return blockedFormattedCase; +}; diff --git a/web-client/src/presenter/computeds/dashboardExternalHelper.test.ts b/web-client/src/presenter/computeds/dashboardExternalHelper.test.ts index 48367a23ca0..5d195684aed 100644 --- a/web-client/src/presenter/computeds/dashboardExternalHelper.test.ts +++ b/web-client/src/presenter/computeds/dashboardExternalHelper.test.ts @@ -1,5 +1,4 @@ -import { applicationContext } from '../../applicationContext'; -import { dashboardExternalHelper as dashboardExternalHelperComputed } from './dashboardExternalHelper'; +import { dashboardExternalHelper } from './dashboardExternalHelper'; import { docketClerk1User, irsPractitionerUser, @@ -7,14 +6,8 @@ import { privatePractitionerUser, } from '@shared/test/mockUsers'; import { runCompute } from '@web-client/presenter/test.cerebral'; -import { withAppContextDecorator } from '../../withAppContext'; describe('dashboardExternalHelper', () => { - const dashboardExternalHelper = withAppContextDecorator( - dashboardExternalHelperComputed, - applicationContext, - ); - it('should show "what to expect" but not case list when there are no open or closed cases', () => { const result = runCompute(dashboardExternalHelper, { state: { @@ -37,30 +30,6 @@ describe('dashboardExternalHelper', () => { expect(result.showPetitionWelcomePage).toEqual(false); }); - it('should keep the showFileACase flag as false when the user role is petitioner', () => { - const result = runCompute(dashboardExternalHelper, { - state: { - closedCases: [{ something: true }], - openCases: [{ something: true }], - user: petitionerUser, - }, - }); - - expect(result.showFileACase).toEqual(false); - }); - - it('should set the showFileACase flag as true when the user role is a private practitioner', () => { - const result = runCompute(dashboardExternalHelper, { - state: { - closedCases: [{ something: true }], - openCases: [{ something: true }], - user: privatePractitionerUser, - }, - }); - - expect(result.showFileACase).toEqual(true); - }); - it('should keep the showStartButton flag as false when the user role is irs practitioner', () => { const result = runCompute(dashboardExternalHelper, { state: { @@ -116,4 +85,34 @@ describe('dashboardExternalHelper', () => { expect(result.showFilingFee).toEqual(false); }); + + it('should set the return welcome message for private practitioner', () => { + const result = runCompute(dashboardExternalHelper, { + state: { + user: privatePractitionerUser, + }, + }); + + expect(result.welcomeMessageTitle).toEqual( + 'Do you need access to an existing case?', + ); + expect(result.welcomeMessage).toEqual( + 'Search for the case docket number to file the appropriate document.', + ); + }); + + it('should set the return welcome message for petitioner', () => { + const result = runCompute(dashboardExternalHelper, { + state: { + user: petitionerUser, + }, + }); + + expect(result.welcomeMessageTitle).toEqual( + 'Have you already filed a petition by mail or do you want electronic access to your existing case?', + ); + expect(result.welcomeMessage).toContain( + 'Do not start a new case. Email dawson.support@ustaxcourt.gov with your case\'s docket number (e.g. 12345-67) to get access to your existing case.', + ); + }); }); diff --git a/web-client/src/presenter/computeds/dashboardExternalHelper.ts b/web-client/src/presenter/computeds/dashboardExternalHelper.ts index ac3c130a361..678e0707cd1 100644 --- a/web-client/src/presenter/computeds/dashboardExternalHelper.ts +++ b/web-client/src/presenter/computeds/dashboardExternalHelper.ts @@ -1,17 +1,16 @@ -import { ClientApplicationContext } from '@web-client/applicationContext'; import { Get } from 'cerebral'; +import { ROLES } from '../../../../shared/src/business/entities/EntityConstants'; import { state } from '@web-client/presenter/app.cerebral'; export const dashboardExternalHelper = ( get: Get, - applicationContext: ClientApplicationContext, ): { - showFileACase: boolean; showFilingFee: boolean; showStartButton: boolean; showPetitionWelcomePage: boolean; + welcomeMessageTitle: string; + welcomeMessage: string; } => { - const { USER_ROLES } = applicationContext.getConstants(); const user = get(state.user); const openCases = get(state.openCases) || []; @@ -19,26 +18,38 @@ export const dashboardExternalHelper = ( const cases = [...openCases, ...closedCases]; - let showFileACase = false; let showStartButton = false; let showFilingFee = false; - if (user.role === USER_ROLES.privatePractitioner) { - showFileACase = true; - } - if ( - user.role === USER_ROLES.privatePractitioner || - user.role === USER_ROLES.petitioner + user.role === ROLES.privatePractitioner || + user.role === ROLES.petitioner ) { showStartButton = true; showFilingFee = true; } + const welcomeMessage = messages[user.role]?.welcomeMessage; + const welcomeMessageTitle = messages[user.role]?.welcomeMessageTitle; return { - showFileACase, showFilingFee, showPetitionWelcomePage: cases.length === 0, showStartButton, + welcomeMessage, + welcomeMessageTitle, }; }; + +const messages = { + [ROLES.privatePractitioner]: { + welcomeMessage: + 'Search for the case docket number to file the appropriate document.', + welcomeMessageTitle: 'Do you need access to an existing case?', + }, + [ROLES.petitioner]: { + welcomeMessage: + 'Do not start a new case. Email dawson.support@ustaxcourt.gov with your case\'s docket number (e.g. 12345-67) to get access to your existing case.', + welcomeMessageTitle: + 'Have you already filed a petition by mail or do you want electronic access to your existing case?', + }, +}; diff --git a/web-client/src/presenter/computeds/formattedCaseDetail.getUserIsAssignedToSession.test.ts b/web-client/src/presenter/computeds/formattedCaseDetail.getUserIsAssignedToSession.test.ts index 97a39ecfd4a..89140956d0f 100644 --- a/web-client/src/presenter/computeds/formattedCaseDetail.getUserIsAssignedToSession.test.ts +++ b/web-client/src/presenter/computeds/formattedCaseDetail.getUserIsAssignedToSession.test.ts @@ -5,12 +5,11 @@ import { petitionsClerkUser, trialClerkUser, } from '../../../../shared/src/test/mockUsers'; +import { getTestJudgesChambers } from '../../../../shared/src/test/mockJudgesChambers'; import { getUserIsAssignedToSession } from './formattedCaseDetail'; import { runCompute } from '@web-client/presenter/test.cerebral'; -const JUDGES_CHAMBERS = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); +const JUDGES_CHAMBERS = getTestJudgesChambers(); describe('formattedCaseDetail getUserIsAssignedToSession', () => { const mockTrialSessionId = applicationContext.getUniqueId(); diff --git a/web-client/src/presenter/computeds/headerHelper.test.ts b/web-client/src/presenter/computeds/headerHelper.test.ts index ca176f97f81..c2a05083751 100644 --- a/web-client/src/presenter/computeds/headerHelper.test.ts +++ b/web-client/src/presenter/computeds/headerHelper.test.ts @@ -289,7 +289,7 @@ describe('headerHelper', () => { const result = runCompute(headerHelper, { state: { ...getBaseState({ role: ROLES.privatePractitioner }), - currentPage: 'DashboardPractitioner', + currentPage: 'DashboardPetitioner', }, }); diff --git a/web-client/src/presenter/computeds/internalPetitionPartiesHelper.test.ts b/web-client/src/presenter/computeds/internalPetitionPartiesHelper.test.ts index 8578f408679..2fb11067cab 100644 --- a/web-client/src/presenter/computeds/internalPetitionPartiesHelper.test.ts +++ b/web-client/src/presenter/computeds/internalPetitionPartiesHelper.test.ts @@ -1,6 +1,8 @@ import { ALLOWLIST_FEATURE_FLAGS, + FILING_TYPES, PARTY_TYPES, + ROLES, } from '../../../../shared/src/business/entities/EntityConstants'; import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; import { @@ -419,7 +421,22 @@ describe('internalPetitionPartiesHelper', () => { user: docketClerk1User, }; - it('should be false when the current user is an external user', () => { + it('should not show email and consent fields when the e-consent feature flag is disabled', () => { + const result = runCompute(internalPetitionPartiesHelper, { + state: { + ...baseState, + featureFlags: { + [ALLOWLIST_FEATURE_FLAGS.E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG.key]: + false, + }, + user: petitionsClerkUser, + }, + }); + + expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(false); + }); + + it('should not show email and consent fields for external user', () => { const result = runCompute(internalPetitionPartiesHelper, { state: { ...baseState, user: petitionerUser }, }); @@ -427,7 +444,7 @@ describe('internalPetitionPartiesHelper', () => { expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(false); }); - it('should be true when the current user is a petitions clerk user', () => { + it('should show email and consent fields for an internal user with paper filing', () => { const result = runCompute(internalPetitionPartiesHelper, { state: { ...baseState, @@ -441,13 +458,16 @@ describe('internalPetitionPartiesHelper', () => { expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(true); }); - it('should be false when the e-consent feature flag is disabled', () => { + it('should not show email and consent fields for an internal user with an electronic filing', () => { const result = runCompute(internalPetitionPartiesHelper, { state: { ...baseState, featureFlags: { [ALLOWLIST_FEATURE_FLAGS.E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG.key]: - false, + true, + }, + form: { + isPaper: false, }, user: petitionsClerkUser, }, @@ -456,7 +476,7 @@ describe('internalPetitionPartiesHelper', () => { expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(false); }); - it('should be true when the e-consent feature flag is enabled, it is a paper petition and the current user is internal', () => { + it('should show email and consent fields when petition was filed electronically by a private practitioner', () => { const result = runCompute(internalPetitionPartiesHelper, { state: { ...baseState, @@ -465,7 +485,8 @@ describe('internalPetitionPartiesHelper', () => { true, }, form: { - isPaper: true, + isPaper: false, + privatePractitioners: [{ role: ROLES.privatePractitioner }], }, user: petitionsClerkUser, }, @@ -473,23 +494,42 @@ describe('internalPetitionPartiesHelper', () => { expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(true); }); + }); - it('should be false when the e-consent feature flag is enabled, and it is NOT a paper petition', () => { + describe('showSecondaryContactEmailFieldAndConsentBox', () => { + it('should display secondary contact email field when petition is filed by a petitioner', () => { const result = runCompute(internalPetitionPartiesHelper, { state: { - ...baseState, featureFlags: { [ALLOWLIST_FEATURE_FLAGS.E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG.key]: true, }, form: { + filingType: FILING_TYPES.petitioner[1], isPaper: false, }, user: petitionsClerkUser, }, }); - expect(result.showPaperPetitionEmailFieldAndConsentBox).toEqual(false); + expect(result.showSecondaryContactEmailFieldAndConsentBox).toEqual(true); + }); + it('should display secondary contact email field when petition is filed by a private practitioner', () => { + const result = runCompute(internalPetitionPartiesHelper, { + state: { + featureFlags: { + [ALLOWLIST_FEATURE_FLAGS.E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG.key]: + true, + }, + form: { + filingType: FILING_TYPES.privatePractitioner[1], + isPaper: false, + }, + user: petitionsClerkUser, + }, + }); + + expect(result.showSecondaryContactEmailFieldAndConsentBox).toEqual(true); }); }); }); diff --git a/web-client/src/presenter/computeds/internalPetitionPartiesHelper.ts b/web-client/src/presenter/computeds/internalPetitionPartiesHelper.ts index a5f818fd32f..ba76931db0f 100644 --- a/web-client/src/presenter/computeds/internalPetitionPartiesHelper.ts +++ b/web-client/src/presenter/computeds/internalPetitionPartiesHelper.ts @@ -213,7 +213,10 @@ export const internalPetitionPartiesHelper = ( applicationContext.getConstants(); const user = get(state.user); - const { filingType, isPaper, partyType } = get(state.form); + const { filingType, isPaper, partyType, privatePractitioners } = get( + state.form, + ); + const E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG = get( state.featureFlags[ ALLOWLIST_FEATURE_FLAGS.E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG.key @@ -225,12 +228,18 @@ export const internalPetitionPartiesHelper = ( .isExternalUser(user.role); const showPaperPetitionEmailFieldAndConsentBox = - E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG && !!isPaper && !isExternalUser; + getShowPaperPetitionEmailFieldAndConsentBox({ + eConsentFieldsEnabled: !!E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG, + isExternalUser, + isPaperFiling: isPaper, + petitionFiledByPrivatePractitioner: privatePractitioners?.length, + }); const showSecondaryContactEmailFieldAndConsentBox = E_CONSENT_FIELDS_ENABLED_FEATURE_FLAG && !isPaper && - filingType === 'Myself and my spouse' && + (filingType === 'Myself and my spouse' || + filingType === 'Petitioner and spouse') && !isExternalUser; const contacts = getOptionsForContact({ PARTY_TYPES, partyType }); @@ -241,3 +250,19 @@ export const internalPetitionPartiesHelper = ( showSecondaryContactEmailFieldAndConsentBox, }; }; + +function getShowPaperPetitionEmailFieldAndConsentBox({ + eConsentFieldsEnabled, + isExternalUser, + isPaperFiling, + petitionFiledByPrivatePractitioner, +}: { + eConsentFieldsEnabled: boolean; + isExternalUser: boolean; + petitionFiledByPrivatePractitioner: boolean; + isPaperFiling: boolean; +}) { + if (!eConsentFieldsEnabled || isExternalUser) return false; + if (petitionFiledByPrivatePractitioner || isPaperFiling) return true; + return false; +} diff --git a/web-client/src/presenter/computeds/messageModalHelper.test.ts b/web-client/src/presenter/computeds/messageModalHelper.test.ts index b6657b23919..153e88f5e90 100644 --- a/web-client/src/presenter/computeds/messageModalHelper.test.ts +++ b/web-client/src/presenter/computeds/messageModalHelper.test.ts @@ -4,6 +4,7 @@ import { SECTIONS, } from '../../../../shared/src/business/entities/EntityConstants'; import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { getTestJudgesChambers } from '../../../../shared/src/test/mockJudgesChambers'; import { messageModalHelper as messageModalHelperComputed } from './messageModalHelper'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { withAppContextDecorator } from '../../withAppContext'; @@ -16,9 +17,7 @@ describe('messageModalHelper', () => { }; const mockDocketEntryIdOnDocketRecord = '123'; const mockDocketEntryIdAlsoOnDocketRecord = '234'; - const JUDGES_CHAMBERS = applicationContext - .getPersistenceGateway() - .getJudgesChambers(); + const JUDGES_CHAMBERS = getTestJudgesChambers(); const mockDocketEntryWithFileAttachedOnDocketRecord = { descriptionDisplay: 'Hello with additional info', @@ -484,6 +483,7 @@ describe('messageModalHelper', () => { { state: { caseDetail: {}, + judgesChambers: Object.values(JUDGES_CHAMBERS), modal: { form: { attachments: [{}, {}], // 2/2 documents attached @@ -509,6 +509,7 @@ describe('messageModalHelper', () => { { state: { ...baseState, + judgesChambers: Object.values(JUDGES_CHAMBERS), modal: { form: { attachments: [{}], diff --git a/web-client/src/presenter/computeds/messageModalHelper.ts b/web-client/src/presenter/computeds/messageModalHelper.ts index 5e4b5d28288..1452f0d3cf1 100644 --- a/web-client/src/presenter/computeds/messageModalHelper.ts +++ b/web-client/src/presenter/computeds/messageModalHelper.ts @@ -22,6 +22,7 @@ export const messageModalHelper = ( const draftAttachments = get(state.modal.form.draftAttachments); const user = get(state.user); const currentAttachments = [...attachments, ...draftAttachments]; + const judgesChambers = get(state.judgesChambers) || []; const computeIsAlreadyAttached = doc => currentAttachments.some( @@ -65,10 +66,6 @@ export const messageModalHelper = ( const shouldShowAddDocumentForm = currentAttachmentCount === 0 || screenMetadata.showAddDocumentForm; - const CHAMBERS_SECTIONS_LABELS = applicationContext - .getPersistenceGateway() - .getChambersSectionsLabels(); - const sectionDisplay = key => { return ( { @@ -85,14 +82,14 @@ export const messageModalHelper = ( ); }; + const chambersSections = judgesChambers.map(chambers => { + return chambers.section; + }); + const chambersDisplay = key => { - return CHAMBERS_SECTIONS_LABELS[key]; + return judgesChambers?.filter(s => s.section === key)[0]?.label; }; - const chambersSections = applicationContext - .getPersistenceGateway() - .getChambersSections(); - return { chambersDisplay, chambersSections, diff --git a/web-client/src/presenter/computeds/selectCriteriaHelper.test.ts b/web-client/src/presenter/computeds/selectCriteriaHelper.test.ts new file mode 100644 index 00000000000..8d5ad1318bf --- /dev/null +++ b/web-client/src/presenter/computeds/selectCriteriaHelper.test.ts @@ -0,0 +1,179 @@ +import { applicationContextForClient as applicationContext } from '@web-client/test/createClientTestApplicationContext'; +import { runCompute } from '../test.cerebral'; +import { selectCriteriaHelper as selectCriteriaHelperComputed } from '@web-client/presenter/computeds/selectCriteriaHelper'; +import { withAppContextDecorator } from '@web-client/withAppContext'; + +describe('selectCriteriaHelper', () => { + const selectCriteriaHelper = withAppContextDecorator( + selectCriteriaHelperComputed, + applicationContext, + ); + + describe('Case Statuses', () => { + it('should return an empty arrayif there are no case in state', () => { + const { caseStatuses } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: [], + }, + }); + + expect(caseStatuses).toEqual([]); + }); + + it('should return the case statuses', () => { + const EXPECTED_OPTIONS = [ + { + key: 'assignedCase', + value: 'Assigned - Case', + }, + { + key: 'assignedMotion', + value: 'Assigned - Motion', + }, + { + key: 'cav', + value: 'CAV', + }, + { + key: 'calendared', + value: 'Calendared', + }, + { + key: 'closed', + value: 'Closed', + }, + { + key: 'closedDismissed', + value: 'Closed - Dismissed', + }, + { + key: 'generalDocketReadyForTrial', + value: 'General Docket - At Issue (Ready for Trial)', + }, + { + key: 'generalDocket', + value: 'General Docket - Not at Issue', + }, + { + key: 'jurisdictionRetained', + value: 'Jurisdiction Retained', + }, + { + key: 'new', + value: 'New', + }, + { + key: 'onAppeal', + value: 'On Appeal', + }, + { + key: 'rule155', + value: 'Rule 155', + }, + { + key: 'submitted', + value: 'Submitted', + }, + { + key: 'submittedRule122', + value: 'Submitted - Rule 122', + }, + ]; + + const { caseStatuses } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: EXPECTED_OPTIONS.map(o => ({ status: o.value })), + }, + }); + + expect(caseStatuses).toEqual(EXPECTED_OPTIONS); + }); + }); + + describe('Blocked Reasons', () => { + it('should return an empty array of automatic blocked reasons if there are no blocked cases', () => { + const { automaticBlockedReasons } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: [], + }, + }); + + expect(automaticBlockedReasons).toEqual([]); + }); + + it('should return all automatic blocked reasons if there is a blocked cases for each option', () => { + const { automaticBlockedReasons } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: [ + { automaticBlockedReason: 'Due Date' }, + { automaticBlockedReason: 'Pending Item and Due Date' }, + { automaticBlockedReason: 'Pending Item' }, + { blockedReason: 'ANYTHING' }, + ], + }, + }); + + expect(automaticBlockedReasons).toEqual([ + { + key: 'dueDate', + value: 'Due Date', + }, + { + key: 'manualBlock', + value: 'Manual Block', + }, + { + key: 'pending', + value: 'Pending Item', + }, + { + key: 'pendingAndDueDate', + value: 'Pending Item and Due Date', + }, + ]); + }); + }); + + describe('Procedure Types', () => { + it('should return all procedure types even when there are no blocked cases', () => { + const { procedureTypes } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: [], + }, + }); + + expect(procedureTypes).toEqual([ + { + key: 'regular', + value: 'Regular', + }, + { + key: 'small', + value: 'Small', + }, + ]); + }); + + it('should return all procedure types when there is a blocked case for each option', () => { + const { procedureTypes } = runCompute(selectCriteriaHelper, { + state: { + blockedCases: [ + { procedureType: 'Regular' }, + { procedureType: 'Small' }, + ], + }, + }); + + expect(procedureTypes).toEqual([ + { + key: 'regular', + value: 'Regular', + }, + { + key: 'small', + value: 'Small', + }, + ]); + }); + }); +}); diff --git a/web-client/src/presenter/computeds/selectCriteriaHelper.ts b/web-client/src/presenter/computeds/selectCriteriaHelper.ts new file mode 100644 index 00000000000..f6c7a37e036 --- /dev/null +++ b/web-client/src/presenter/computeds/selectCriteriaHelper.ts @@ -0,0 +1,69 @@ +import { + AUTOMATIC_BLOCKED_REASONS, + AutomaticBlockedReasons, + CASE_STATUS_TYPES, + CaseStatus, + PROCEDURE_TYPES_MAP, + ProcedureType, +} from '@shared/business/entities/EntityConstants'; +import { Get } from 'cerebral'; +import { state } from '@web-client/presenter/app.cerebral'; + +export const selectCriteriaHelper = ( + get: Get, +): { + automaticBlockedReasons: { + key: string; + value: AutomaticBlockedReasons | 'Manual Block'; + }[]; + caseStatuses: { key: string; value: CaseStatus }[]; + procedureTypes: { key: string; value: ProcedureType }[]; +} => { + const blockedCases: RawCase[] = get(state.blockedCases); + + const automaticBlockedReasons: { + key: string; + value: AutomaticBlockedReasons | 'Manual Block'; + }[] = Object.entries(AUTOMATIC_BLOCKED_REASONS) + .map(([key, value]) => ({ + key, + value, + })) + .filter(reason => { + return blockedCases.some( + bc => bc.automaticBlockedReason === reason.value, + ); + }); + + if (blockedCases.some(bc => !!bc.blockedReason)) { + automaticBlockedReasons.push({ + key: 'manualBlock', + value: 'Manual Block', + }); + } + + const caseStatuses: { key: string; value: CaseStatus }[] = Object.entries( + CASE_STATUS_TYPES, + ) + .map(([key, value]) => ({ + key, + value, + })) + .filter(option => blockedCases.some(c => c.status === option.value)); + + const procedureTypes = Object.entries(PROCEDURE_TYPES_MAP).map( + ([key, value]) => ({ key, value }), + ); + + const sortByLabel = (a, b) => { + if (a.value < b.value) return -1; + if (a.value > b.value) return 1; + return 0; + }; + + return { + automaticBlockedReasons: automaticBlockedReasons.sort(sortByLabel), + caseStatuses: caseStatuses.sort(sortByLabel), + procedureTypes: procedureTypes.sort(sortByLabel), + }; +}; diff --git a/web-client/src/presenter/computeds/showContactsHelperUpdated.test.ts b/web-client/src/presenter/computeds/showContactsHelperUpdated.test.ts index 20333f07728..89d3704188c 100644 --- a/web-client/src/presenter/computeds/showContactsHelperUpdated.test.ts +++ b/web-client/src/presenter/computeds/showContactsHelperUpdated.test.ts @@ -1,64 +1,48 @@ -import { PARTY_TYPES } from '@shared/business/entities/EntityConstants'; +import { + FILING_TYPES, + PARTY_TYPES, + PartyType, +} from '@shared/business/entities/EntityConstants'; import { showContactsHelperUpdated } from '@web-client/presenter/computeds/showContactsHelperUpdated'; describe('showContactsHelperUpdated', () => { describe('showContactPrimary', () => { - it('should return showContactPrimary as true when the party type is included in type object being passed in', () => { - const TEST_PROPS = {}; - - const { showContactPrimary } = showContactsHelperUpdated( - 'conservator', - { - conservator: 'conservator', - }, - TEST_PROPS, - ); + it('should return showContactPrimary as true when there is a valid party type', () => { + const { showContactPrimary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[3], + isSpouseDeceased: false, + partyType: PARTY_TYPES.conservator, + }); expect(showContactPrimary).toEqual(true); }); - it('should return showContactPrimary as false when the party type is not included in type object being passed in', () => { - const TEST_PROPS = {}; - - const { showContactPrimary } = showContactsHelperUpdated( - 'RANDOM TYPE', - { - conservator: 'conservator', - }, - TEST_PROPS, - ); + it('should return showContactPrimary as false when there is not a valid party type', () => { + const { showContactPrimary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[3], + isSpouseDeceased: false, + partyType: 'RANDOM_TYPE' as PartyType, + }); expect(showContactPrimary).toEqual(false); }); it('should return showContactPrimary as true when the filling type is "Myself and my spouse"', () => { - const TEST_PROPS = { - value: 'Myself and my spouse', - }; - - const { showContactPrimary } = showContactsHelperUpdated( - 'RANDOM TYPE', - { - conservator: 'conservator', - }, - TEST_PROPS, - ); + const { showContactPrimary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[1], + isSpouseDeceased: false, + partyType: PARTY_TYPES.petitionerSpouse, + }); expect(showContactPrimary).toEqual(true); }); it('should return showContactPrimary as true when the filling type is "Myself"', () => { - const TEST_PROPS = { - value: 'Myself', - }; - - const { showContactPrimary } = showContactsHelperUpdated( - 'RANDOM TYPE', - { - conservator: 'conservator', - }, - TEST_PROPS, - ); + const { showContactPrimary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[0], + isSpouseDeceased: false, + partyType: PARTY_TYPES.petitioner, + }); expect(showContactPrimary).toEqual(true); }); @@ -66,65 +50,31 @@ describe('showContactsHelperUpdated', () => { describe('showContactSecondary', () => { it('should return showContactSecondary as false when party type is neither "petitionerDeceasedSpouse" or "petitionerSpouse"', () => { - const TEST_PROPS = {}; - - const { showContactSecondary } = showContactsHelperUpdated( - 'conservator', - { - conservator: 'conservator', - }, - TEST_PROPS, - ); - - expect(showContactSecondary).toEqual(false); - }); - - it('should return showContactSecondary as false when party type is "petitionerDeceasedSpouse" but key in props is not "isSpouseDeceased"', () => { - const TEST_PROPS = { - key: 'RANDOM KEY', - }; - - const { showContactSecondary } = showContactsHelperUpdated( - PARTY_TYPES.petitionerDeceasedSpouse, - { - petitionerDeceasedSpouse: PARTY_TYPES.petitionerDeceasedSpouse, - }, - TEST_PROPS, - ); + const { showContactSecondary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[0], + isSpouseDeceased: false, + partyType: PARTY_TYPES.petitioner, + }); expect(showContactSecondary).toEqual(false); }); - it('should return showContactSecondary as false when party type is "petitionerDeceasedSpouse", key in props is "isSpouseDeceased" but value in props is not "Yes"', () => { - const TEST_PROPS = { - key: 'isSpouseDeceased', - value: 'NO', - }; - - const { showContactSecondary } = showContactsHelperUpdated( - PARTY_TYPES.petitionerDeceasedSpouse, - { - petitionerDeceasedSpouse: PARTY_TYPES.petitionerDeceasedSpouse, - }, - TEST_PROPS, - ); + it('should return showContactSecondary as false when user is a pro se petitioner and spouse is not deceased', () => { + const { showContactSecondary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.petitioner[1], + isSpouseDeceased: false, + partyType: PARTY_TYPES.petitionerSpouse, + }); expect(showContactSecondary).toEqual(false); }); - it('should return showContactSecondary as true when party type is "petitionerDeceasedSpouse", key in props is "isSpouseDeceased" and value in props is "Yes"', () => { - const TEST_PROPS = { - key: 'isSpouseDeceased', - value: 'Yes', - }; - - const { showContactSecondary } = showContactsHelperUpdated( - PARTY_TYPES.petitionerDeceasedSpouse, - { - petitionerDeceasedSpouse: PARTY_TYPES.petitionerDeceasedSpouse, - }, - TEST_PROPS, - ); + it('should return showContactSecondary as true when user is a private practitioner and spouse is deceased', () => { + const { showContactSecondary } = showContactsHelperUpdated({ + filingType: FILING_TYPES.privatePractitioner[1], + isSpouseDeceased: true, + partyType: PARTY_TYPES.petitionerSpouse, + }); expect(showContactSecondary).toEqual(true); }); diff --git a/web-client/src/presenter/computeds/showContactsHelperUpdated.ts b/web-client/src/presenter/computeds/showContactsHelperUpdated.ts index d835948861c..febb833e72b 100644 --- a/web-client/src/presenter/computeds/showContactsHelperUpdated.ts +++ b/web-client/src/presenter/computeds/showContactsHelperUpdated.ts @@ -1,19 +1,29 @@ -export const showContactsHelperUpdated = (partyType, PARTY_TYPES, props) => { - const showContactPrimary = getShowContactPrimary( - partyType, - PARTY_TYPES, - props.value, - ); +import { + FilingType, + PARTY_TYPES, + PartyType, +} from '@shared/business/entities/EntityConstants'; + +export const showContactsHelperUpdated = ({ + filingType, + isSpouseDeceased, + partyType, +}: { + filingType: FilingType; + isSpouseDeceased: boolean; + partyType: PartyType; +}) => { + const showContactPrimary = getShowContactPrimary(partyType, filingType); - const showContactSecondary = getShowContactSecondary( + const showContactSecondary = getShowContactSecondary({ + filingType, + isSpouseDeceased, partyType, - PARTY_TYPES, - props, - ); + }); return { showContactPrimary, showContactSecondary }; }; -function getShowContactPrimary(partyType, PARTY_TYPES, filingType) { +function getShowContactPrimary(partyType, filingType) { return ( [ PARTY_TYPES.conservator, @@ -40,14 +50,24 @@ function getShowContactPrimary(partyType, PARTY_TYPES, filingType) { ); } -function getShowContactSecondary(partyType, PARTY_TYPES, props) { - const isContactSecondaryPartyType = [ - PARTY_TYPES.petitionerDeceasedSpouse, - PARTY_TYPES.petitionerSpouse, - ].includes(partyType); +function getShowContactSecondary({ + filingType, + isSpouseDeceased, + partyType, +}: { + filingType: FilingType; + isSpouseDeceased: boolean; + partyType: PartyType; +}): boolean { + const isContactSecondaryPartyType = + PARTY_TYPES.petitionerDeceasedSpouse === partyType || + PARTY_TYPES.petitionerSpouse === partyType; if (!isContactSecondaryPartyType) return false; - if (props.key !== 'isSpouseDeceased') return false; - if (props.value !== 'Yes') return false; + + if (filingType === 'Myself and my spouse' && !isSpouseDeceased) { + return false; + } + return true; } diff --git a/web-client/src/presenter/computeds/startCaseHelper.test.ts b/web-client/src/presenter/computeds/startCaseHelper.test.ts index 28e2ccbae5b..01bdde5064c 100644 --- a/web-client/src/presenter/computeds/startCaseHelper.test.ts +++ b/web-client/src/presenter/computeds/startCaseHelper.test.ts @@ -298,6 +298,34 @@ describe('startCaseHelper', () => { ]); }); + it('should set notice legend correctly when user is petitioner', () => { + const result = runCompute(startCaseHelper, { + state: { + form: { + hasIrsNotice: false, + }, + user: petitionerUser, + }, + }); + expect(result.noticeLegend).toEqual( + 'Did you receive a notice from the IRS?', + ); + }); + + it('should set notice legend correctly when user is private practitioner', () => { + const result = runCompute(startCaseHelper, { + state: { + form: { + hasIrsNotice: false, + }, + user: privatePractitionerUser, + }, + }); + expect(result.noticeLegend).toEqual( + 'Did the petitioner receive a notice from the IRS?', + ); + }); + describe('formattedCaseType', () => { it('should be Disclosure if form.caseType is Disclosure1', () => { const result = runCompute(startCaseHelper, { diff --git a/web-client/src/presenter/computeds/startCaseHelper.ts b/web-client/src/presenter/computeds/startCaseHelper.ts index 0ca5a992eb8..2b4893b3b82 100644 --- a/web-client/src/presenter/computeds/startCaseHelper.ts +++ b/web-client/src/presenter/computeds/startCaseHelper.ts @@ -69,6 +69,11 @@ export const startCaseHelper = ( state.irsNoticeUploadFormInfo, )?.some(notice => 'file' in notice); + const noticeLegend = + user.role === USER_ROLES.petitioner + ? 'Did you receive a notice from the IRS?' + : 'Did the petitioner receive a notice from the IRS?'; + return { caseTitle, contactPrimaryLabel, @@ -86,10 +91,7 @@ export const startCaseHelper = ( user.role === USER_ROLES.petitioner ? 'What is your role in filing for this minor or legally incompetent person?' : 'What is the petitioner’s role in filing for this minor or incompetent person?', - noticeLegend: - user.role === USER_ROLES.petitioner - ? 'Did you receive a notice from the IRS?' - : 'Do you have a notice from the IRS?', + noticeLegend, showAttachmentToPetitionFileValid: form.attachmentToPetitionFile, showBusinessFilingTypeOptions: form.filingType === 'A business', showCorporateDisclosure: form.partyType && form.filingType === 'A business', diff --git a/web-client/src/presenter/computeds/updatedFilePetitionHelper.test.ts b/web-client/src/presenter/computeds/updatedFilePetitionHelper.test.ts index 9aff632750a..b2aa17d4844 100644 --- a/web-client/src/presenter/computeds/updatedFilePetitionHelper.test.ts +++ b/web-client/src/presenter/computeds/updatedFilePetitionHelper.test.ts @@ -3,7 +3,10 @@ import { PARTY_TYPES, } from '@shared/business/entities/EntityConstants'; import { applicationContext } from '../../applicationContext'; -import { petitionerUser } from '@shared/test/mockUsers'; +import { + petitionerUser, + privatePractitionerUser, +} from '@shared/test/mockUsers'; import { runCompute } from '@web-client/presenter/test.cerebral'; import { updatedFilePetitionHelper as updatedFilePetitionHelperComputed } from './updatedFilePetitionHelper'; import { withAppContextDecorator } from '../../withAppContext'; @@ -89,10 +92,49 @@ describe('updatedFilePetitionHelper', () => { state: { form: {}, user: petitionerUser }, }); expect(result.filingOptions).toEqual([ - 'Myself', - 'Myself and my spouse', - 'A business', - 'Other', + { label: 'Myself', value: 'Myself' }, + { label: 'Myself and my spouse', value: 'Myself and my spouse' }, + { label: 'A business', value: 'A business' }, + { label: 'Other', value: 'Other' }, + ]); + }); + it('should return filing options for practitioner', () => { + const result = runCompute(updatedFilePetitionHelper, { + state: { form: {}, user: privatePractitionerUser }, + }); + expect(result.filingOptions).toEqual([ + { label: 'Petitioner', value: 'Individual petitioner' }, + { + label: 'Petitioner and petitioner spouse', + value: 'Petitioner and spouse', + }, + { label: 'A business', value: 'A business' }, + { label: 'Other', value: 'Other' }, + ]); + }); + }); + describe('otherFilingOptions', () => { + it('should return the other filing options for petitioner', () => { + const result = runCompute(updatedFilePetitionHelper, { + state: { form: {}, user: petitionerUser }, + }); + expect(result.otherFilingOptions).toEqual([ + 'An estate or trust', + 'A minor or legally incompetent person', + 'Donor', + 'Transferee', + 'Deceased Spouse', + ]); + }); + it('should return other filing options for practitioner', () => { + const result = runCompute(updatedFilePetitionHelper, { + state: { form: {}, user: privatePractitionerUser }, + }); + expect(result.otherFilingOptions).toEqual([ + 'An estate or trust', + 'Donor', + 'Transferee', + 'Deceased Spouse', ]); }); }); @@ -138,7 +180,6 @@ describe('updatedFilePetitionHelper', () => { expect(result.showContactInformationForOtherPartyType).toBeFalsy(); }); }); - describe('otherContactNameLabel', () => { it('should return correct labels for survivingSpouse', () => { const result = runCompute(updatedFilePetitionHelper, { diff --git a/web-client/src/presenter/computeds/updatedFilePetitionHelper.ts b/web-client/src/presenter/computeds/updatedFilePetitionHelper.ts index bfb1abe3d43..abd10e6f173 100644 --- a/web-client/src/presenter/computeds/updatedFilePetitionHelper.ts +++ b/web-client/src/presenter/computeds/updatedFilePetitionHelper.ts @@ -1,4 +1,5 @@ import { ClientApplicationContext } from '@web-client/applicationContext'; +import { FilingType, ROLES } from '@shared/business/entities/EntityConstants'; import { Get } from 'cerebral'; import { state } from '@web-client/presenter/app.cerebral'; @@ -20,9 +21,12 @@ interface IOtherContactNameLabel { } type UpdatedFilePetitionHelper = { - filingOptions: string[]; + filingOptions: { label: string; value: string }[]; + isPetitioner: boolean; + isPractitioner: boolean; businessFieldNames: IBusinessFields | {}; otherContactNameLabel?: IOtherContactNameLabel; + otherFilingOptions: string[]; showContactInformationForOtherPartyType: boolean; }; @@ -36,22 +40,73 @@ export const updatedFilePetitionHelper = ( const businessType = get(state.form.businessType); const partyType = get(state.form.partyType); - const filingOptions = FILING_TYPES[user.role]; + const filingOptions = formatFilingTypes(FILING_TYPES[user.role]); const businessFieldNames = getBusinessFieldLabels(businessType); const otherContactNameLabel = getOtherContactNameLabel( partyType, PARTY_TYPES, ); + const isPetitioner = user.role === ROLES.petitioner; + const isPractitioner = user.role === ROLES.privatePractitioner; + + const otherFilingOptions = getOtherFilingOptions(isPractitioner); + return { businessFieldNames, filingOptions, + isPetitioner, + isPractitioner, otherContactNameLabel, + otherFilingOptions, showContactInformationForOtherPartyType: getShowContactInformationForOtherPartyType(partyType, PARTY_TYPES), }; }; +function getOtherFilingOptions(isPractitioner) { + const estateOrTrust = 'An estate or trust'; + const minorOrIncompetentPerson = 'A minor or legally incompetent person'; + const donor = 'Donor'; + const transferee = 'Transferee'; + const deceasedSpouse = 'Deceased Spouse'; + + const otherFilingOptions = isPractitioner + ? [estateOrTrust, donor, transferee, deceasedSpouse] + : [ + estateOrTrust, + minorOrIncompetentPerson, + donor, + transferee, + deceasedSpouse, + ]; + + return otherFilingOptions; +} + +function formatFilingTypes(filingOptions: FilingType[]) { + return filingOptions.map(option => { + if (option === 'Individual petitioner') { + return { + label: 'Petitioner', + value: option, + }; + } + + if (option === 'Petitioner and spouse') { + return { + label: 'Petitioner and petitioner spouse', + value: option, + }; + } + + return { + label: option, + value: option, + }; + }); +} + function getBusinessFieldLabels(businessType): IBusinessFields | {} { switch (businessType) { case 'Corporation': diff --git a/web-client/src/presenter/presenter.ts b/web-client/src/presenter/presenter.ts index b0c1626252b..2372cf1b20e 100644 --- a/web-client/src/presenter/presenter.ts +++ b/web-client/src/presenter/presenter.ts @@ -378,6 +378,7 @@ import { servePaperFiledDocumentSequence } from './sequences/servePaperFiledDocu import { serveThirtyDayNoticeOfTrialSequence } from './sequences/serveThirtyDayNoticeOfTrialSequence'; import { serveToIrsCompleteSequence } from './sequences/serveToIrsCompleteSequence'; import { serveToIrsErrorSequence } from './sequences/serveToIrsErrorSequence'; +import { setBlockedCaseReportProcedureTypeSequence } from '@web-client/presenter/sequences/Reports/BlockedCases/setBlockedCaseReportProcedureTypeSequence'; import { setCaseDetailPageTabSequence } from './sequences/setCaseDetailPageTabSequence'; import { setCaseDetailPrimaryTabSequence } from './sequences/setCaseDetailPrimaryTabSequence'; import { setCaseTypeToDisplaySequence } from './sequences/setCaseTypeToDisplaySequence'; @@ -618,8 +619,7 @@ import { validateUploadCourtIssuedDocumentSequence } from './sequences/validateU import { validateUserContactSequence } from './sequences/validateUserContactSequence'; export const presenterSequences = { - addAnotherIrsNoticeToFormSequence: - addAnotherIrsNoticeToFormSequence as unknown as Function, + addAnotherIrsNoticeToFormSequence, addCaseToTrialSessionSequence: addCaseToTrialSessionSequence as unknown as Function, addFactOrReasonSequence, @@ -779,8 +779,7 @@ export const presenterSequences = { deleteUploadedPdfSequence: deleteUploadedPdfSequence as unknown as Function, deleteUserCaseNoteFromWorkingCopySequence: deleteUserCaseNoteFromWorkingCopySequence as unknown as Function, - deleteValidationErrorMessageSequence: - deleteValidationErrorMessageSequence as unknown as Function, + deleteValidationErrorMessageSequence, deleteWorkingCopySessionNoteSequence: deleteWorkingCopySessionNoteSequence as unknown as Function, disengageAppMaintenanceSequence: @@ -953,8 +952,7 @@ export const presenterSequences = { gotoTrialSessionWorkingCopySequence: gotoTrialSessionWorkingCopySequence as unknown as Function, gotoTrialSessionsSequence: gotoTrialSessionsSequence as unknown as Function, - gotoUpdatedPetitionFlowSequence: - gotoUpdatedPetitionFlowSequence as unknown as Function, + gotoUpdatedPetitionFlowSequence, gotoUploadCorrespondenceDocumentSequence: gotoUploadCorrespondenceDocumentSequence as unknown as Function, gotoUploadCourtIssuedDocumentSequence: @@ -1172,8 +1170,7 @@ export const presenterSequences = { removeCaseFromTrialSequence: removeCaseFromTrialSequence as unknown as Function, removeFactOrReasonSequence, - removeIrsNoticeFromFormSequence: - removeIrsNoticeFromFormSequence as unknown as Function, + removeIrsNoticeFromFormSequence, removePetitionForReplacementSequence: removePetitionForReplacementSequence as unknown as Function, removePetitionerAndUpdateCaptionSequence: @@ -1195,8 +1192,7 @@ export const presenterSequences = { resetHeaderAccordionsSequence as unknown as Function, resetIdleTimerSequence: resetIdleTimerSequence as unknown as Function, resetPasswordSequence, - resetSecondaryAddressSequence: - resetSecondaryAddressSequence as unknown as Function, + resetSecondaryAddressSequence, retryAsyncRequestSequence: retryAsyncRequestSequence as unknown as Function, reviewCaseAssociationRequestSequence: reviewCaseAssociationRequestSequence as unknown as Function, @@ -1237,6 +1233,7 @@ export const presenterSequences = { serveThirtyDayNoticeOfTrialSequence as unknown as Function, serveToIrsCompleteSequence: serveToIrsCompleteSequence as unknown as Function, serveToIrsErrorSequence: serveToIrsErrorSequence as unknown as Function, + setBlockedCaseReportProcedureTypeSequence, setCaseDetailPageTabSequence: setCaseDetailPageTabSequence as unknown as Function, setCaseDetailPrimaryTabSequence: @@ -1253,7 +1250,7 @@ export const presenterSequences = { setDocumentUploadModeSequence: setDocumentUploadModeSequence as unknown as Function, setForHearingSequence: setForHearingSequence as unknown as Function, - setHasIrsNoticeSequence: setHasIrsNoticeSequence as unknown as Function, + setHasIrsNoticeSequence, setIdleStatusActiveSequence: setIdleStatusActiveSequence as unknown as Function, setIrsNoticeFalseSequence: setIrsNoticeFalseSequence as unknown as Function, @@ -1268,7 +1265,7 @@ export const presenterSequences = { setPdfPreviewUrlSequence, setPendingReportSelectedJudgeSequence: setPendingReportSelectedJudgeSequence as unknown as Function, - setPetitionTypeSequence: setPetitionTypeSequence as unknown as Function, + setPetitionTypeSequence, setSelectedAddressOnFormSequence: setSelectedAddressOnFormSequence as unknown as Function, setSelectedBatchIndexSequence: @@ -1468,7 +1465,7 @@ export const presenterSequences = { updateFileDocumentWizardFormValueSequence: updateFileDocumentWizardFormValueSequence as unknown as Function, updateFilePetitionSequence, - updateFilingTypeSequence: updateFilingTypeSequence as unknown as Function, + updateFilingTypeSequence, updateFormValueAndCaseCaptionSequence: updateFormValueAndCaseCaptionSequence as unknown as Function, updateFormValueAndSecondaryContactInfoSequence: @@ -1479,8 +1476,7 @@ export const presenterSequences = { updateGenerateNoticesProgressSequence: updateGenerateNoticesProgressSequence as unknown as Function, updateHearingNoteSequence: updateHearingNoteSequence as unknown as Function, - updateIrsNoticeIndexPropertySequence: - updateIrsNoticeIndexPropertySequence as unknown as Function, + updateIrsNoticeIndexPropertySequence, updateJudgesCaseNoteOnCaseDetailSequence: updateJudgesCaseNoteOnCaseDetailSequence as unknown as Function, updateMessageFilterSequence, @@ -1494,8 +1490,7 @@ export const presenterSequences = { updatePaperServiceProgressSequence: updatePaperServiceProgressSequence as unknown as Function, updatePartyViewTabSequence: updatePartyViewTabSequence as unknown as Function, - updatePetitionPaymentFormValueSequence: - updatePetitionPaymentFormValueSequence as unknown as Function, + updatePetitionPaymentFormValueSequence, updateQcCompleteForTrialSequence: updateQcCompleteForTrialSequence as unknown as Function, updateScreenMetadataSequence: @@ -1511,8 +1506,7 @@ export const presenterSequences = { updateStatisticsFormValueSequence: updateStatisticsFormValueSequence as unknown as Function, updateStatusReportOrderFormValueSequence, - updateStepIndicatorSequence: - updateStepIndicatorSequence as unknown as Function, + updateStepIndicatorSequence, updateTrialSessionCompleteSequence: updateTrialSessionCompleteSequence as unknown as Function, updateTrialSessionFormDataSequence: @@ -1522,20 +1516,13 @@ export const presenterSequences = { updateUserCaseNoteOnWorkingCopySequence as unknown as Function, updateWorkingCopySessionNoteSequence: updateWorkingCopySessionNoteSequence as unknown as Function, - updatedFilePetitionCompleteStep1Sequence: - updatedFilePetitionCompleteStep1Sequence as unknown as Function, - updatedFilePetitionCompleteStep2Sequence: - updatedFilePetitionCompleteStep2Sequence as unknown as Function, - updatedFilePetitionCompleteStep3Sequence: - updatedFilePetitionCompleteStep3Sequence as unknown as Function, - updatedFilePetitionCompleteStep4Sequence: - updatedFilePetitionCompleteStep4Sequence as unknown as Function, - updatedFilePetitionCompleteStep5Sequence: - updatedFilePetitionCompleteStep5Sequence as unknown as Function, - updatedFilePetitionCompleteStep6Sequence: - updatedFilePetitionCompleteStep6Sequence as unknown as Function, - updatedFilePetitionGoBackAStepSequence: - updatedFilePetitionGoBackAStepSequence as unknown as Function, + updatedFilePetitionCompleteStep1Sequence, + updatedFilePetitionCompleteStep2Sequence, + updatedFilePetitionCompleteStep3Sequence, + updatedFilePetitionCompleteStep4Sequence, + updatedFilePetitionCompleteStep5Sequence, + updatedFilePetitionCompleteStep6Sequence, + updatedFilePetitionGoBackAStepSequence, uploadCorrespondenceDocumentSequence: uploadCorrespondenceDocumentSequence as unknown as Function, uploadCourtIssuedDocumentSequence: @@ -1634,10 +1621,8 @@ export const presenterSequences = { validateUpdateCaseModalSequence as unknown as Function, validateUpdatePractitionerSequence: validateUpdatePractitionerSequence as unknown as Function, - validateUpdatedFilePetitionStep2Sequence: - validateUpdatedFilePetitionStep2Sequence as unknown as Function, - validateUpdatedFilePetitionStep5Sequence: - validateUpdatedFilePetitionStep5Sequence as unknown as Function, + validateUpdatedFilePetitionStep2Sequence, + validateUpdatedFilePetitionStep5Sequence, validateUploadCorrespondenceDocumentSequence: validateUploadCorrespondenceDocumentSequence as unknown as Function, validateUploadCourtIssuedDocumentSequence: diff --git a/web-client/src/presenter/sequences/Reports/BlockedCases/setBlockedCaseReportProcedureTypeSequence.ts b/web-client/src/presenter/sequences/Reports/BlockedCases/setBlockedCaseReportProcedureTypeSequence.ts new file mode 100644 index 00000000000..545e6f37e30 --- /dev/null +++ b/web-client/src/presenter/sequences/Reports/BlockedCases/setBlockedCaseReportProcedureTypeSequence.ts @@ -0,0 +1,5 @@ +import { setBlockedCaseReportProcedureTypeAction } from '@web-client/presenter/actions/Reports/BlockedCaseReport/setBlockedCaseReportProcedureTypeAction'; + +export const setBlockedCaseReportProcedureTypeSequence = [ + setBlockedCaseReportProcedureTypeAction, +] as unknown as (props: { procedureType: string }) => void; diff --git a/web-client/src/presenter/sequences/StatusReportOrder/updateStatusReportOrderFormValueSequence.ts b/web-client/src/presenter/sequences/StatusReportOrder/updateStatusReportOrderFormValueSequence.ts index 9c8bb8b803c..2c420255071 100644 --- a/web-client/src/presenter/sequences/StatusReportOrder/updateStatusReportOrderFormValueSequence.ts +++ b/web-client/src/presenter/sequences/StatusReportOrder/updateStatusReportOrderFormValueSequence.ts @@ -3,4 +3,4 @@ import { setFormValueAction } from '../../actions/setFormValueAction'; export const updateStatusReportOrderFormValueSequence = [ setFormValueAction, clearJurisdictionRadioAction, -] as unknown as (props: { key: string; value: string | boolean }) => void; +] as unknown as (props: { key: string; value: any }) => void; diff --git a/web-client/src/presenter/sequences/addAnotherIrsNoticeToFormSequence.ts b/web-client/src/presenter/sequences/addAnotherIrsNoticeToFormSequence.ts index 08dbae37103..6558ed2a1ff 100644 --- a/web-client/src/presenter/sequences/addAnotherIrsNoticeToFormSequence.ts +++ b/web-client/src/presenter/sequences/addAnotherIrsNoticeToFormSequence.ts @@ -2,4 +2,4 @@ import { addAnotherIrsNoticeToFormAction } from '@web-client/presenter/actions/a export const addAnotherIrsNoticeToFormSequence = [ addAnotherIrsNoticeToFormAction, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/deleteValidationErrorMessageSequence.ts b/web-client/src/presenter/sequences/deleteValidationErrorMessageSequence.ts index e89f3ee3973..5666b107ca9 100644 --- a/web-client/src/presenter/sequences/deleteValidationErrorMessageSequence.ts +++ b/web-client/src/presenter/sequences/deleteValidationErrorMessageSequence.ts @@ -2,4 +2,6 @@ import { deleteValidationErrorMessageAction } from '@web-client/presenter/action export const deleteValidationErrorMessageSequence = [ deleteValidationErrorMessageAction, -]; +] as unknown as (props: { + validationKey: (string | { property: string; value: any })[]; +}) => void; diff --git a/web-client/src/presenter/sequences/getBlockedCasesByTrialLocationSequence.ts b/web-client/src/presenter/sequences/getBlockedCasesByTrialLocationSequence.ts index bc9036e3748..0dae69cb0de 100644 --- a/web-client/src/presenter/sequences/getBlockedCasesByTrialLocationSequence.ts +++ b/web-client/src/presenter/sequences/getBlockedCasesByTrialLocationSequence.ts @@ -1,12 +1,12 @@ import { getBlockedCasesByTrialLocationAction } from '../actions/CaseDetail/getBlockedCasesByTrialLocationAction'; +import { resetBlockedCasesFiltersAction } from '@web-client/presenter/actions/Reports/BlockedCaseReport/resetBlockedCasesFiltersAction'; import { setBlockedCasesAction } from '../actions/CaseDetail/setBlockedCasesAction'; import { setFormValueAction } from '../actions/setFormValueAction'; -import { setProcedureTypeToAllAction } from '../actions/setProcedureTypeToAllAction'; import { showProgressSequenceDecorator } from '../utilities/showProgressSequenceDecorator'; export const getBlockedCasesByTrialLocationSequence = showProgressSequenceDecorator([ - setProcedureTypeToAllAction, + resetBlockedCasesFiltersAction, setFormValueAction, getBlockedCasesByTrialLocationAction, setBlockedCasesAction, diff --git a/web-client/src/presenter/sequences/getJudgesChambersSequence.ts b/web-client/src/presenter/sequences/getJudgesChambersSequence.ts new file mode 100644 index 00000000000..4b7889d3a37 --- /dev/null +++ b/web-client/src/presenter/sequences/getJudgesChambersSequence.ts @@ -0,0 +1,7 @@ +import { getJudgesChambersAction } from '@web-client/presenter/actions/getJudgesChambersAction'; +import { setJudgesChambersAction } from '@web-client/presenter/actions/setJudgesChambersAction'; + +export const getJudgesChambersSequence = [ + getJudgesChambersAction, + setJudgesChambersAction, +]; diff --git a/web-client/src/presenter/sequences/gotoBlockedCasesReportSequence.ts b/web-client/src/presenter/sequences/gotoBlockedCasesReportSequence.ts index 06d8ceb9756..e2478469bd6 100644 --- a/web-client/src/presenter/sequences/gotoBlockedCasesReportSequence.ts +++ b/web-client/src/presenter/sequences/gotoBlockedCasesReportSequence.ts @@ -1,3 +1,4 @@ +import { clearBlockedCasesReportAction } from '@web-client/presenter/actions/Reports/BlockedCaseReport/clearBlockedCasesReportAction'; import { clearErrorAlertsAction } from '../actions/clearErrorAlertsAction'; import { clearFormAction } from '../actions/clearFormAction'; import { clearScreenMetadataAction } from '../actions/clearScreenMetadataAction'; @@ -10,6 +11,7 @@ export const gotoBlockedCasesReportSequence = setupCurrentPageAction('Interstitial'), clearScreenMetadataAction, clearFormAction, + clearBlockedCasesReportAction, closeMobileMenuAction, clearErrorAlertsAction, setupCurrentPageAction('BlockedCasesReport'), diff --git a/web-client/src/presenter/sequences/gotoDashboardSequence.ts b/web-client/src/presenter/sequences/gotoDashboardSequence.ts index 8a9721e130e..193dff97f63 100644 --- a/web-client/src/presenter/sequences/gotoDashboardSequence.ts +++ b/web-client/src/presenter/sequences/gotoDashboardSequence.ts @@ -115,7 +115,7 @@ export const gotoDashboardSequence = [ setDefaultCaseTypeToDisplayAction, getOpenAndClosedCasesForUserAction, setCasesAction, - setupCurrentPageAction('DashboardPractitioner'), + setupCurrentPageAction('DashboardPetitioner'), ], }, ], diff --git a/web-client/src/presenter/sequences/gotoUpdatedPetitionFlowSequence.ts b/web-client/src/presenter/sequences/gotoUpdatedPetitionFlowSequence.ts index 528bd185bab..a54a965c2e8 100644 --- a/web-client/src/presenter/sequences/gotoUpdatedPetitionFlowSequence.ts +++ b/web-client/src/presenter/sequences/gotoUpdatedPetitionFlowSequence.ts @@ -12,4 +12,4 @@ export const gotoUpdatedPetitionFlowSequence = setupPetitionStateAction, setDefaultCaseProcedureAction, setupCurrentPageAction('UpdatedFilePetition'), - ]); + ]) as unknown as () => void; diff --git a/web-client/src/presenter/sequences/openCreateMessageModalSequence.ts b/web-client/src/presenter/sequences/openCreateMessageModalSequence.ts index f696295ebf8..2a359c5fab7 100644 --- a/web-client/src/presenter/sequences/openCreateMessageModalSequence.ts +++ b/web-client/src/presenter/sequences/openCreateMessageModalSequence.ts @@ -1,10 +1,12 @@ import { clearModalStateAction } from '../actions/clearModalStateAction'; +import { getJudgesChambersSequence } from '@web-client/presenter/sequences/getJudgesChambersSequence'; import { setCreateMessageModalDialogModalStateAction } from '../actions/WorkItem/setCreateMessageModalDialogModalStateAction'; import { setShowModalFactoryAction } from '../actions/setShowModalFactoryAction'; import { showProgressSequenceDecorator } from '../utilities/showProgressSequenceDecorator'; export const openCreateMessageModalSequence = showProgressSequenceDecorator([ clearModalStateAction, + getJudgesChambersSequence, setCreateMessageModalDialogModalStateAction, setShowModalFactoryAction('CreateMessageModal'), ]); diff --git a/web-client/src/presenter/sequences/removeIrsNoticeFromFormSequence.ts b/web-client/src/presenter/sequences/removeIrsNoticeFromFormSequence.ts index 418c1d9864d..a574d23ebf7 100644 --- a/web-client/src/presenter/sequences/removeIrsNoticeFromFormSequence.ts +++ b/web-client/src/presenter/sequences/removeIrsNoticeFromFormSequence.ts @@ -1,3 +1,5 @@ import { removeIrsNoticeFromFormAction } from '@web-client/presenter/actions/removeIrsNoticeFromFormAction'; -export const removeIrsNoticeFromFormSequence = [removeIrsNoticeFromFormAction]; +export const removeIrsNoticeFromFormSequence = [ + removeIrsNoticeFromFormAction, +] as unknown as (props: { index: number }) => void; diff --git a/web-client/src/presenter/sequences/resetSecondaryAddressSequence.ts b/web-client/src/presenter/sequences/resetSecondaryAddressSequence.ts index 804979e0433..33f1689f0e3 100644 --- a/web-client/src/presenter/sequences/resetSecondaryAddressSequence.ts +++ b/web-client/src/presenter/sequences/resetSecondaryAddressSequence.ts @@ -1,3 +1,5 @@ import { resetContactSecondaryAction } from '@web-client/presenter/actions/StartCaseInternal/resetContactSecondaryAction'; -export const resetSecondaryAddressSequence = [resetContactSecondaryAction]; +export const resetSecondaryAddressSequence = [ + resetContactSecondaryAction, +] as unknown as (props: { key: string; value: boolean }) => void; diff --git a/web-client/src/presenter/sequences/setHasIrsNoticeSequence.ts b/web-client/src/presenter/sequences/setHasIrsNoticeSequence.ts index 81318d4aec1..3a290de16aa 100644 --- a/web-client/src/presenter/sequences/setHasIrsNoticeSequence.ts +++ b/web-client/src/presenter/sequences/setHasIrsNoticeSequence.ts @@ -6,4 +6,9 @@ export const setHasIrsNoticeSequence = [ clearIrsNoticeFormAction, setIrsNoticeUploadFormInfoAction, setFormValueAction, -]; +] as unknown as (props: { + allowEmptyString?: boolean; + index?: number; + key: string; + value: any; +}) => void; diff --git a/web-client/src/presenter/sequences/setPetitionTypeSequence.ts b/web-client/src/presenter/sequences/setPetitionTypeSequence.ts index f1f41faef16..4eb04828e0c 100644 --- a/web-client/src/presenter/sequences/setPetitionTypeSequence.ts +++ b/web-client/src/presenter/sequences/setPetitionTypeSequence.ts @@ -4,4 +4,9 @@ import { setFormValueAction } from '@web-client/presenter/actions/setFormValueAc export const setPetitionTypeSequence = [ clearPetitionFormAction, setFormValueAction, -]; +] as unknown as (props: { + allowEmptyString?: boolean; + index?: number; + key: string; + value: any; +}) => void; diff --git a/web-client/src/presenter/sequences/submitCaseInventoryReportModalSequence.ts b/web-client/src/presenter/sequences/submitCaseInventoryReportModalSequence.ts index 6b4edb97e00..9dca93c56ab 100644 --- a/web-client/src/presenter/sequences/submitCaseInventoryReportModalSequence.ts +++ b/web-client/src/presenter/sequences/submitCaseInventoryReportModalSequence.ts @@ -8,17 +8,18 @@ import { showProgressSequenceDecorator } from '../utilities/showProgressSequence import { startShowValidationAction } from '../actions/startShowValidationAction'; import { validateCaseInventoryReportModalAction } from '../actions/CaseInventoryReport/validateCaseInventoryReportModalAction'; -export const submitCaseInventoryReportModalSequence = [ - startShowValidationAction, - validateCaseInventoryReportModalAction, - { - error: [setValidationErrorsAction], - success: showProgressSequenceDecorator([ - clearCaseInventoryReportDataAction, - clearModalAction, - getCaseInventoryReportAction, - clearModalStateAction, - navigateToCaseInventoryReportAction, - ]), - }, -]; +export const submitCaseInventoryReportModalSequence = + showProgressSequenceDecorator([ + startShowValidationAction, + validateCaseInventoryReportModalAction, + { + error: [setValidationErrorsAction], + success: [ + clearCaseInventoryReportDataAction, + clearModalAction, + getCaseInventoryReportAction, + clearModalStateAction, + navigateToCaseInventoryReportAction, + ], + }, + ]); diff --git a/web-client/src/presenter/sequences/submitFilePetitionSequence.ts b/web-client/src/presenter/sequences/submitFilePetitionSequence.ts index 19a7d686310..98eb807fb73 100644 --- a/web-client/src/presenter/sequences/submitFilePetitionSequence.ts +++ b/web-client/src/presenter/sequences/submitFilePetitionSequence.ts @@ -15,6 +15,8 @@ import { startShowValidationAction } from '../actions/startShowValidationAction' import { stopShowValidationAction } from '../actions/stopShowValidationAction'; import { validatePetitionAction } from '../actions/validatePetitionAction'; +// updated-petition-flow: can be removed when flag is removed + export const submitFilePetitionSequence = [ clearAlertsAction, startShowValidationAction, diff --git a/web-client/src/presenter/sequences/updateFilingTypeSequence.ts b/web-client/src/presenter/sequences/updateFilingTypeSequence.ts index 6d4a95ac05b..39dd3265180 100644 --- a/web-client/src/presenter/sequences/updateFilingTypeSequence.ts +++ b/web-client/src/presenter/sequences/updateFilingTypeSequence.ts @@ -10,4 +10,9 @@ export const updateFilingTypeSequence = [ setFormValueAction, updatePartyTypeActionUpdated, setDefaultContactStateAction, -]; +] as unknown as (props: { + allowEmptyString?: boolean; + index?: number; + key: string; + value: any; +}) => void; diff --git a/web-client/src/presenter/sequences/updateFormValueSequence.ts b/web-client/src/presenter/sequences/updateFormValueSequence.ts index 7a818fe004d..64c5aff587f 100644 --- a/web-client/src/presenter/sequences/updateFormValueSequence.ts +++ b/web-client/src/presenter/sequences/updateFormValueSequence.ts @@ -4,6 +4,7 @@ export const updateFormValueSequence = [ setFormValueAction, ] as unknown as (props: { index: number; + root?: string; key: string; value: any; allowEmptyString?: boolean; diff --git a/web-client/src/presenter/sequences/updateIrsNoticeIndexPropertySequence.ts b/web-client/src/presenter/sequences/updateIrsNoticeIndexPropertySequence.ts index fc97f745041..312a2720e49 100644 --- a/web-client/src/presenter/sequences/updateIrsNoticeIndexPropertySequence.ts +++ b/web-client/src/presenter/sequences/updateIrsNoticeIndexPropertySequence.ts @@ -4,4 +4,9 @@ import { updateIrsNoticeIndexPropertyAction } from '@web-client/presenter/action export const updateIrsNoticeIndexPropertySequence = [ updateIrsNoticeIndexPropertyAction, clearIrsNoticeRedactionAcknowledgementAction, -]; +] as unknown as (props: { + key: string | number; + property: string; + toFormat?: string; + value: string | null; +}) => void; diff --git a/web-client/src/presenter/sequences/updatePetitionPaymentFormValueSequence.ts b/web-client/src/presenter/sequences/updatePetitionPaymentFormValueSequence.ts index 2bfd488124e..892ed41aafc 100644 --- a/web-client/src/presenter/sequences/updatePetitionPaymentFormValueSequence.ts +++ b/web-client/src/presenter/sequences/updatePetitionPaymentFormValueSequence.ts @@ -4,4 +4,9 @@ import { updateOrderForFilingFeeAction } from '../actions/StartCaseInternal/upda export const updatePetitionPaymentFormValueSequence = [ setFormValueAction, updateOrderForFilingFeeAction, -]; +] as unknown as (props: { + allowEmptyString?: boolean; + index?: number; + key: string; + value: any; +}) => void; diff --git a/web-client/src/presenter/sequences/updateStepIndicatorSequence.ts b/web-client/src/presenter/sequences/updateStepIndicatorSequence.ts index 02cdd9429a8..e17fb8c586b 100644 --- a/web-client/src/presenter/sequences/updateStepIndicatorSequence.ts +++ b/web-client/src/presenter/sequences/updateStepIndicatorSequence.ts @@ -1,3 +1,5 @@ import { setStepIndicatorAction } from '@web-client/presenter/actions/setStepIndicatorAction'; -export const updateStepIndicatorSequence = [setStepIndicatorAction]; +export const updateStepIndicatorSequence = [ + setStepIndicatorAction, +] as unknown as (props: { step: number }) => void; diff --git a/web-client/src/presenter/sequences/updateTrialSessionFormDataSequence.ts b/web-client/src/presenter/sequences/updateTrialSessionFormDataSequence.ts index 93c01cb2ff7..a0a318aff40 100644 --- a/web-client/src/presenter/sequences/updateTrialSessionFormDataSequence.ts +++ b/web-client/src/presenter/sequences/updateTrialSessionFormDataSequence.ts @@ -1,7 +1,9 @@ import { computeTrialSessionFormDataAction } from '../actions/TrialSession/computeTrialSessionFormDataAction'; +import { getJudgesChambersSequence } from '@web-client/presenter/sequences/getJudgesChambersSequence'; import { setFormValueAction } from '../actions/setFormValueAction'; export const updateTrialSessionFormDataSequence = [ setFormValueAction, + getJudgesChambersSequence, computeTrialSessionFormDataAction, ]; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep1Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep1Sequence.ts index 85e12a7d661..d14cd50c29d 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep1Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep1Sequence.ts @@ -18,4 +18,4 @@ export const updatedFilePetitionCompleteStep1Sequence = [ incrementCurrentStepIndicatorAction, ], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep2Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep2Sequence.ts index e1264bb3d8b..0b3a8027823 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep2Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep2Sequence.ts @@ -20,4 +20,4 @@ export const updatedFilePetitionCompleteStep2Sequence = [ incrementCurrentStepIndicatorAction, ], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep3Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep3Sequence.ts index 462d9992077..ce7bef6fd68 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep3Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep3Sequence.ts @@ -18,4 +18,4 @@ export const updatedFilePetitionCompleteStep3Sequence = [ incrementCurrentStepIndicatorAction, ], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep4Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep4Sequence.ts index a2b71e96d92..11c34ddaaee 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep4Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep4Sequence.ts @@ -18,4 +18,4 @@ export const updatedFilePetitionCompleteStep4Sequence = [ incrementCurrentStepIndicatorAction, ], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep5Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep5Sequence.ts index 27f64297c62..9df29c7ddf9 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep5Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep5Sequence.ts @@ -31,4 +31,4 @@ export const updatedFilePetitionCompleteStep5Sequence = [ incrementCurrentStepIndicatorAction, ]), }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep6Sequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep6Sequence.ts index c325267ee25..fe54211e209 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep6Sequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionCompleteStep6Sequence.ts @@ -51,4 +51,4 @@ export const updatedFilePetitionCompleteStep6Sequence = }, ], }, - ]); + ]) as unknown as () => void; diff --git a/web-client/src/presenter/sequences/updatedFilePetitionGoBackAStepSequence.ts b/web-client/src/presenter/sequences/updatedFilePetitionGoBackAStepSequence.ts index 860207a8346..4f4f05b92cd 100644 --- a/web-client/src/presenter/sequences/updatedFilePetitionGoBackAStepSequence.ts +++ b/web-client/src/presenter/sequences/updatedFilePetitionGoBackAStepSequence.ts @@ -2,4 +2,4 @@ import { decrementCurrentStepIndicatorAction } from '@web-client/presenter/actio export const updatedFilePetitionGoBackAStepSequence = [ decrementCurrentStepIndicatorAction, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/validateTrialSessionSequence.ts b/web-client/src/presenter/sequences/validateTrialSessionSequence.ts index 0bb003efe47..5a2213260c6 100644 --- a/web-client/src/presenter/sequences/validateTrialSessionSequence.ts +++ b/web-client/src/presenter/sequences/validateTrialSessionSequence.ts @@ -1,5 +1,6 @@ import { clearAlertsAction } from '../actions/clearAlertsAction'; import { computeTrialSessionFormDataAction } from '../actions/TrialSession/computeTrialSessionFormDataAction'; +import { getJudgesChambersSequence } from '@web-client/presenter/sequences/getJudgesChambersSequence'; import { setValidationErrorsAction } from '../actions/setValidationErrorsAction'; import { shouldValidateAction } from '../actions/shouldValidateAction'; import { validateTrialSessionAction } from '../actions/TrialSession/validateTrialSessionAction'; @@ -9,6 +10,7 @@ export const validateTrialSessionSequence = [ { ignore: [], validate: [ + getJudgesChambersSequence, computeTrialSessionFormDataAction, validateTrialSessionAction, { diff --git a/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep2Sequence.ts b/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep2Sequence.ts index 5bbf5d2d861..a99a7bce8ca 100644 --- a/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep2Sequence.ts +++ b/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep2Sequence.ts @@ -14,4 +14,4 @@ export const validateUpdatedFilePetitionStep2Sequence = [ error: [setValidationErrorsAction, setValidationAlertErrorsAction], success: [clearAlertsAction, stopShowValidationAction], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep5Sequence.ts b/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep5Sequence.ts index a8f04ffef2f..26b30c78611 100644 --- a/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep5Sequence.ts +++ b/web-client/src/presenter/sequences/validateUpdatedFilePetitionStep5Sequence.ts @@ -14,4 +14,4 @@ export const validateUpdatedFilePetitionStep5Sequence = [ error: [setValidationErrorsAction, setValidationAlertErrorsAction], success: [clearAlertsAction, stopShowValidationAction], }, -]; +] as unknown as () => void; diff --git a/web-client/src/presenter/state.ts b/web-client/src/presenter/state.ts index 2ec6cd15b87..643ef2b6fee 100644 --- a/web-client/src/presenter/state.ts +++ b/web-client/src/presenter/state.ts @@ -1,4 +1,5 @@ /* eslint-disable max-lines */ +import { Contact } from '@shared/business/useCases/generatePetitionPdfInteractor'; import { FormattedPendingMotionWithWorksheet } from '@web-api/business/useCases/pendingMotion/getPendingMotionDocketEntriesForCurrentJudgeInteractor'; import { GetCasesByStatusAndByJudgeResponse } from '@web-api/business/useCases/judgeActivityReport/getCaseWorksheetsByJudgeInteractor'; import { @@ -7,6 +8,7 @@ import { } from '@shared/business/entities/EntityConstants'; import { IrsNoticeForm } from '@shared/business/entities/startCase/IrsNoticeForm'; import { JudgeActivityReportState } from '@web-client/ustc-ui/Utils/types'; +import { JudgeChambersInfo } from '@web-client/presenter/actions/getJudgesChambersAction'; import { RawCaseDeadline } from '@shared/business/entities/CaseDeadline'; import { RawMessage } from '@shared/business/entities/Message'; import { RawUser } from '@shared/business/entities/User'; @@ -89,6 +91,7 @@ import { getAllIrsPractitionersForSelectHelper } from '@web-client/presenter/com import { getConstants } from '../getConstants'; import { getOrdinalValuesForUploadIteration } from './computeds/selectDocumentTypeHelper'; import { headerHelper } from './computeds/headerHelper'; +import { initialBlockedCaseReportFilter } from '@web-client/presenter/state/blockedCasesReportState'; import { initialCustomCaseReportState } from './customCaseReportState'; import { initialPendingReportsState } from '@web-client/presenter/state/pendingReportState'; import { initialTrialSessionState } from '@web-client/presenter/state/trialSessionState'; @@ -127,6 +130,7 @@ import { reviewSavedPetitionHelper } from './computeds/reviewSavedPetitionHelper import { scanBatchPreviewerHelper } from './computeds/scanBatchPreviewerHelper'; import { scanHelper } from './computeds/scanHelper'; import { sealedCaseDetailHelper } from './computeds/sealedCaseDetailHelper'; +import { selectCriteriaHelper } from '@web-client/presenter/computeds/selectCriteriaHelper'; import { serveThirtyDayNoticeModalHelper } from './computeds/serveThirtyDayNoticeModalHelper'; import { sessionAssignmentHelper } from './computeds/sessionAssignmentHelper'; import { setForHearingModalHelper } from './computeds/setForHearingModalHelper'; @@ -494,6 +498,9 @@ export const computeds = { sealedCaseDetailHelper: sealedCaseDetailHelper as unknown as ReturnType< typeof sealedCaseDetailHelper >, + selectCriteriaHelper: selectCriteriaHelper as unknown as ReturnType< + typeof selectCriteriaHelper + >, serveThirtyDayNoticeModalHelper: serveThirtyDayNoticeModalHelper as unknown as ReturnType< typeof serveThirtyDayNoticeModalHelper @@ -602,6 +609,8 @@ export const baseState = { fileCount?: number; title?: string; }, + blockedCaseReportFilter: cloneDeep(initialBlockedCaseReportFilter), + blockedCases: [] as RawCase[], caseDeadlineReport: {} as { caseDeadlines: (RawCaseDeadline & { caseCaption: string; @@ -694,6 +703,7 @@ export const baseState = { } as JudgeActivityReportState, judgeUser: {} as any, judges: [] as RawUser[], + judgesChambers: [] as JudgeChambersInfo[], lastIdleAction: undefined, legacyAndCurrentJudges: [], login: {} as any, @@ -758,8 +768,9 @@ export const baseState = { caseCaptionExtension: undefined, caseTitle: undefined, caseType: undefined, - contactPrimary: undefined, - contactSecondary: undefined, + contactCounsel: undefined, + contactPrimary: undefined as Contact | undefined, + contactSecondary: undefined as Contact | undefined, corporateDisclosureFile: undefined, corporateDisclosureFileUrl: undefined, hasIrsNotice: undefined, @@ -842,7 +853,7 @@ export const baseState = { user: cloneDeep(emptyUserState), userContactEditProgress: {} as { inProgress?: boolean }, users: [] as RawUser[], - validationErrors: {} as Record, + validationErrors: {} as Record, viewerDocumentToDisplay: undefined as unknown as ViewerDocument, viewerDraftDocumentToDisplay: undefined as unknown as ViewerDocument, workItem: {}, @@ -867,7 +878,7 @@ export type CreateCaseIrsForm = { size?: number; caseType?: string; noticeIssuedDate?: string; - taxYear?: number; + taxYear?: string; irsNoticeFileUrl?: string; cityAndStateIssuingOffice?: string; }; diff --git a/web-client/src/presenter/state/blockedCasesReportState.ts b/web-client/src/presenter/state/blockedCasesReportState.ts new file mode 100644 index 00000000000..f96b669cf38 --- /dev/null +++ b/web-client/src/presenter/state/blockedCasesReportState.ts @@ -0,0 +1,6 @@ +export const initialBlockedCaseReportFilter = { + caseStatusFilter: 'All', + procedureTypeFilter: 'All', + reasonFilter: 'All', + trialLocationFilter: '', +}; diff --git a/web-client/src/styles/buttons.scss b/web-client/src/styles/buttons.scss index 527330a0452..510c0438d50 100644 --- a/web-client/src/styles/buttons.scss +++ b/web-client/src/styles/buttons.scss @@ -229,7 +229,9 @@ table.ustc-table .ustc-button--unstyled { color: $color-white; &.usa-button--unstyled { - padding-left: 20px; + padding: 0.75rem 0 0.75rem 20px; + margin-top: 0; + margin-bottom: 0; } &:hover { diff --git a/web-client/src/styles/custom.scss b/web-client/src/styles/custom.scss index c87c44e7a45..e4ba2491be4 100644 --- a/web-client/src/styles/custom.scss +++ b/web-client/src/styles/custom.scss @@ -2395,3 +2395,12 @@ button.change-scanner-button { .no-wrap-white-space { white-space: normal; } + +.align-items-center { + align-items: center; +} + +.petitioner-welcome-name { + overflow-wrap: break-word; + word-break: break-word; +} diff --git a/web-client/src/styles/forms.scss b/web-client/src/styles/forms.scss index cbc85c45fab..2061ea16761 100644 --- a/web-client/src/styles/forms.scss +++ b/web-client/src/styles/forms.scss @@ -738,7 +738,6 @@ label.ustc-upload { .remove-fact-reason-button { @media only screen and (max-width: $medium-screen - 1px) { - padding-right: 1rem !important; text-align: right !important; } } diff --git a/web-client/src/styles/nav.scss b/web-client/src/styles/nav.scss index a0e017344b7..f724fb1ba84 100644 --- a/web-client/src/styles/nav.scss +++ b/web-client/src/styles/nav.scss @@ -272,10 +272,10 @@ /* this is for buttons in submenus that should be styled the same as links in submenus */ .usa-nav__submenu-item button { - padding-top: 0; - padding-bottom: 0; + padding: 0; color: $color-white; font-weight: $font-regular; + line-height: 1.3; &:hover { text-decoration: underline; diff --git a/web-client/src/styles/overrides.scss b/web-client/src/styles/overrides.scss index eed8c8a9ed7..4537aa5bfd4 100644 --- a/web-client/src/styles/overrides.scss +++ b/web-client/src/styles/overrides.scss @@ -343,14 +343,6 @@ p { font-size: 17px; font-weight: normal; } - - button:not([disabled]):focus { - outline: none; - } - - .usa-accordion__button:hover { - background-color: inherit; - } } .other-filing-option { diff --git a/web-client/src/styles/tabs.scss b/web-client/src/styles/tabs.scss index 38d6c46bc98..a4d62c3943f 100644 --- a/web-client/src/styles/tabs.scss +++ b/web-client/src/styles/tabs.scss @@ -38,6 +38,7 @@ position: relative; top: 2px; padding: 0; + padding-bottom: 5px; border: none; margin-right: 45px; background: none; diff --git a/web-client/src/test/createClientTestApplicationContext.ts b/web-client/src/test/createClientTestApplicationContext.ts index dfb4ee53731..ccb6d15fb57 100644 --- a/web-client/src/test/createClientTestApplicationContext.ts +++ b/web-client/src/test/createClientTestApplicationContext.ts @@ -70,12 +70,6 @@ import { getAllWebSocketConnections } from '@web-api/persistence/dynamo/notifica import { getCaseByDocketNumber } from '@web-api/persistence/dynamo/cases/getCaseByDocketNumber'; import { getCaseDeadlinesByDocketNumber } from '@web-api/persistence/dynamo/caseDeadlines/getCaseDeadlinesByDocketNumber'; import { getCaseDocumentsIdsFilteredByDocumentType } from '@shared/business/utilities/getCaseDocumentsIdsFilteredByDocumentType'; -import { - getChambersSections, - getChambersSectionsLabels, - getJudgesChambers, - getJudgesChambersWithLegacy, -} from '@web-client/business/chambers/getJudgesChambers'; import { getConstants } from '@web-client/getConstants'; import { getCropBox } from '@shared/business/utilities/getCropBox'; import { getDescriptionDisplay } from '@shared/business/utilities/getDescriptionDisplay'; @@ -272,7 +266,6 @@ const createTestApplicationContext = () => { .fn() .mockImplementation(getFormattedTrialSessionDetails), getJudgeLastName: jest.fn().mockImplementation(getJudgeLastName), - getJudgesChambers: jest.fn().mockImplementation(getJudgesChambers), getMonthDayYearInETObj: jest .fn() .mockImplementation(DateHandler.getMonthDayYearInETObj), @@ -446,10 +439,6 @@ const createTestApplicationContext = () => { .fn() .mockImplementation(getCaseDeadlinesByDocketNumber), getCasesByFilters: jest.fn(), - getChambersSections: jest.fn().mockImplementation(getChambersSections), - getChambersSectionsLabels: jest - .fn() - .mockImplementation(getChambersSectionsLabels), getDispatchNotification: jest.fn(), getDocument: jest.fn(), getDocumentQCInboxForSection: jest.fn(), @@ -459,10 +448,6 @@ const createTestApplicationContext = () => { .mockReturnValue({ url: 'http://example.com/' }), getElasticsearchReindexRecords: jest.fn(), getItem: jest.fn().mockImplementation(getItem), - getJudgesChambers: jest.fn().mockImplementation(getJudgesChambers), - getJudgesChambersWithLegacy: jest - .fn() - .mockImplementation(getJudgesChambersWithLegacy), getLimiterByKey: jest.fn(), getMaintenanceMode: jest.fn(), getMessagesByDocketNumber: jest.fn(), @@ -524,6 +509,7 @@ const createTestApplicationContext = () => { convertBlobToUInt8Array: jest .fn() .mockImplementation(() => new Uint8Array([])), + createCsvString: jest.fn(), filterCaseMetadata: jest.fn(), getBaseUrl: () => 'http://localhost', getBounceAlertRecipients: jest.fn(), diff --git a/web-client/src/ustc-ui/Accordion/Accordion.tsx b/web-client/src/ustc-ui/Accordion/Accordion.tsx index c0dd399978f..2712aae42ed 100644 --- a/web-client/src/ustc-ui/Accordion/Accordion.tsx +++ b/web-client/src/ustc-ui/Accordion/Accordion.tsx @@ -97,7 +97,12 @@ const renderAccordionFactory = ({ activeKey, headingLevel, setTab }) =>
{title}
-
{title}
+
+ {title} +
diff --git a/web-client/src/views/AppComponent.tsx b/web-client/src/views/AppComponent.tsx index f3392f85a85..27c91ee4d5b 100644 --- a/web-client/src/views/AppComponent.tsx +++ b/web-client/src/views/AppComponent.tsx @@ -34,7 +34,6 @@ import { DashboardInactive } from './Dashboards/DashboardInactive'; import { DashboardIrsSuperuser } from './Dashboards/DashboardIrsSuperuser'; import { DashboardJudge } from './Dashboards/DashboardJudge'; import { DashboardPetitioner } from './Dashboards/DashboardPetitioner'; -import { DashboardPractitioner } from './Dashboards/DashboardPractitioner'; import { DashboardRespondent } from './Dashboards/DashboardRespondent'; import { DocketEntryQc } from './DocketEntryQc'; import { DownloadDocketEntriesModal } from '@web-client/views/DownloadDocketEntriesModal'; @@ -141,7 +140,6 @@ const pages = { DashboardIrsSuperuser, DashboardJudge, DashboardPetitioner, - DashboardPractitioner, DashboardRespondent, DocketEntryQc, EditCaseDetails, diff --git a/web-client/src/views/BeforeStartingCase.tsx b/web-client/src/views/BeforeStartingCase.tsx index ad38c80c372..90f60866153 100644 --- a/web-client/src/views/BeforeStartingCase.tsx +++ b/web-client/src/views/BeforeStartingCase.tsx @@ -14,6 +14,8 @@ import { sequences } from '@web-client/presenter/app.cerebral'; import { state } from '@web-client/presenter/app.cerebral'; import React from 'react'; +type PetitionCreationRoles = 'petitioner' | 'privatePractitioner'; + export const BeforeStartingCase = connect( { closeModalAndReturnToDashboardSequence: @@ -29,9 +31,14 @@ export const BeforeStartingCase = connect( user, }) { const redirectUrl = - petitionFlowUpdated && ROLES.petitioner === user.role + petitionFlowUpdated && + [ROLES.petitioner, ROLES.privatePractitioner].includes( + user.role as PetitionCreationRoles, + ) ? '/file-a-petition/new' : '/file-a-petition/step-1'; + + const isPetitioner = user.role === ROLES.petitioner; return ( <>