From 9633213be1500e1f130526cec7477569bdbee6b1 Mon Sep 17 00:00:00 2001 From: Daniel Belcher <47116905+daniel-belcher@users.noreply.github.com> Date: Thu, 14 Mar 2024 12:45:02 -0700 Subject: [PATCH 01/12] feat(text comp rework): text comp rework to add more flexibility(#448) --- src/packages/shared-types/forms.ts | 40 ++++++++-- .../ui/src/components/Inputs/checkbox.tsx | 3 +- .../ui/src/components/RHF/RHFTextDisplay.tsx | 77 +++++++++++++++++++ src/services/ui/src/components/RHF/Slot.tsx | 41 ++++++++-- src/services/ui/src/components/RHF/index.ts | 1 + 5 files changed, 147 insertions(+), 15 deletions(-) create mode 100644 src/services/ui/src/components/RHF/RHFTextDisplay.tsx diff --git a/src/packages/shared-types/forms.ts b/src/packages/shared-types/forms.ts index c1031ea88..d04d2e726 100644 --- a/src/packages/shared-types/forms.ts +++ b/src/packages/shared-types/forms.ts @@ -20,11 +20,11 @@ export interface FormSchema { export type RHFSlotProps = { name: string; - label?: string; + label?: RHFTextField; labelStyling?: string; formItemStyling?: string; groupNamePrefix?: string; - description?: string; + description?: RHFTextField; descriptionAbove?: boolean; descriptionStyling?: string; dependency?: DependencyRule; @@ -33,17 +33,44 @@ export type RHFSlotProps = { [K in keyof RHFComponentMap]: { rhf: K; props?: RHFComponentMap[K]; + text?: K extends "TextDisplay" ? RHFTextField : never; fields?: K extends "FieldArray" ? RHFSlotProps[] : K extends "FieldGroup" - ? RHFSlotProps[] - : never; + ? RHFSlotProps[] + : never; }; }[keyof RHFComponentMap]; +export type RHFTextField = + | Array< + | { + text: string; + type?: RHFTextItemType; + link?: string; + listType?: "ordered" | "unordered"; + list?: RHFTextListItem[]; + classname?: string; + } + | string + > + | string; + +export type RHFTextListItem = { + text: string; + list?: RHFTextListItem[]; + listType?: "ordered" | "unordered"; + classname?: string; + type?: RHFTextItemType; + link?: string; +}; + +type RHFTextItemType = "br" | "brWrap" | "link" | "bold" | "italic" | "list"; + export type RHFOption = { label: string; value: string; + styledLabel?: RHFTextField; dependency?: DependencyRule; form?: FormGroup[]; slots?: RHFSlotProps[]; @@ -75,6 +102,7 @@ export type RHFComponentMap = { appendText?: string; removeText?: string; }; + TextDisplay: { className?: string }; }; export type FormGroup = { @@ -97,7 +125,7 @@ export interface Document { export type FieldArrayProps< T extends FieldValues, - TFieldArrayName extends FieldArrayPath = FieldArrayPath + TFieldArrayName extends FieldArrayPath = FieldArrayPath, > = { control: Control; name: TFieldArrayName; @@ -108,7 +136,7 @@ export type FieldArrayProps< export type FieldGroupProps< T extends FieldValues, - TFieldArrayName extends FieldArrayPath = FieldArrayPath + TFieldArrayName extends FieldArrayPath = FieldArrayPath, > = { control: Control; name: TFieldArrayName; diff --git a/src/services/ui/src/components/Inputs/checkbox.tsx b/src/services/ui/src/components/Inputs/checkbox.tsx index 8fc7f660d..ff317e1dc 100644 --- a/src/services/ui/src/components/Inputs/checkbox.tsx +++ b/src/services/ui/src/components/Inputs/checkbox.tsx @@ -11,6 +11,7 @@ const Checkbox = React.forwardRef< className?: string; label: string; value?: string; + styledLabel?: React.ReactNode; description?: string; } >(({ className, ...props }, ref) => { @@ -45,7 +46,7 @@ const Checkbox = React.forwardRef< htmlFor={props.label} className="text-md font-medium leading-normal peer-disabled:cursor-not-allowed peer-disabled:opacity-70" > - {props.label} + {props.styledLabel ?? props.label} )} {!!props.description && ( diff --git a/src/services/ui/src/components/RHF/RHFTextDisplay.tsx b/src/services/ui/src/components/RHF/RHFTextDisplay.tsx new file mode 100644 index 000000000..7bab7b80b --- /dev/null +++ b/src/services/ui/src/components/RHF/RHFTextDisplay.tsx @@ -0,0 +1,77 @@ +import { cn } from "@/utils"; +import { Link } from "react-router-dom"; +import { RHFTextField } from "shared-types"; + +interface RHFTextDisplayProps { + text: RHFTextField; +} + +export const RHFTextDisplay = (props: RHFTextDisplayProps) => { + if (!Array.isArray(props.text)) return props.text; + + return ( + <> + {...props.text?.map((t) => { + if (typeof t === "string") return <>{t}; + const orderedList = t?.listType === "ordered"; + + switch (t?.type) { + case "br": + return ( + <> +
{t.text} + + ); + case "brWrap": + return ( + <> +
{t.text}
+ + ); + case "bold": + return {t.text}; + case "italic": + return {t.text}; + case "link": + return ( + + {t.text} + + ); + case "list": + return ( + <> + {orderedList && ( +
    + {t?.list?.map((l, j) => { + return ( +
  1. + +
  2. + ); + })} +
+ )} + {!orderedList && ( +
    + {t?.list?.map((l, j) => { + return ( +
  • + +
  • + ); + })} +
+ )} + + ); + default: + return {t.text}; + } + })} + + ); +}; diff --git a/src/services/ui/src/components/RHF/Slot.tsx b/src/services/ui/src/components/RHF/Slot.tsx index bacd988f0..dcb618b38 100644 --- a/src/services/ui/src/components/RHF/Slot.tsx +++ b/src/services/ui/src/components/RHF/Slot.tsx @@ -28,11 +28,11 @@ import { } from "../Inputs"; import { Popover, PopoverContent, PopoverTrigger } from "@/components"; import { cn } from "@/utils"; -import { RHFFieldArray, FieldGroup, RHFFormGroup } from "."; +import { RHFFieldArray, FieldGroup, RHFFormGroup, RHFTextDisplay } from "."; export const RHFSlot = < TFieldValues extends FieldValues = FieldValues, - TName extends FieldPath = FieldPath + TName extends FieldPath = FieldPath, >({ control, rhf, @@ -42,6 +42,7 @@ export const RHFSlot = < descriptionStyling, name, props, + text, labelStyling, formItemStyling, groupNamePrefix, @@ -64,10 +65,14 @@ export const RHFSlot = < formItemStyling ? ` ${formItemStyling}` : "" }`} > - {label && {label}} - {descriptionAbove && ( + {label && ( + + + + )} + {descriptionAbove && description && ( - {description} + )} @@ -154,7 +159,9 @@ export const RHFSlot = < className="font-normal" htmlFor={OPT.value} > - {OPT.label} + } @@ -208,6 +215,11 @@ export const RHFSlot = < label={OPT.label} value={OPT.value} checked={field.value?.includes(OPT.value)} + styledLabel={ + + } onCheckedChange={(c) => { const filtered = field.value?.filter( @@ -299,7 +311,13 @@ export const RHFSlot = < (() => { const hops = props as RHFComponentMap["Upload"]; - return ; + return ( + + ); })()} {/* ----------------------------------------------------------------------------- */} @@ -323,10 +341,17 @@ export const RHFSlot = < {...(props as RHFComponentMap["FieldGroup"])} /> )} + + {/* ----------------------------------------------------------------------------- */} + {rhf === "TextDisplay" && ( +

+ +

+ )}
{description && !descriptionAbove && ( - {description} + )} diff --git a/src/services/ui/src/components/RHF/index.ts b/src/services/ui/src/components/RHF/index.ts index 71f2a6cdb..d65f7f828 100644 --- a/src/services/ui/src/components/RHF/index.ts +++ b/src/services/ui/src/components/RHF/index.ts @@ -5,4 +5,5 @@ export * from "./Slot"; export * from "./utils"; export * from "./FieldArray"; export * from "./FieldGroup"; +export * from "./RHFTextDisplay"; export * from "./dependencyWrapper"; From 3a04e5a63b0d8aabc77f1b98fd08faea0a146d8f Mon Sep 17 00:00:00 2001 From: Mike Dial <48921055+mdial89f@users.noreply.github.com> Date: Thu, 14 Mar 2024 16:19:46 -0400 Subject: [PATCH 02/12] feat(TE Support): Add support for Temporary Extension submission. (#446) * frontend boilerplate for TE form * fix typo * fix type error * package action te view ui * add some conditional stuff based on if id exists * add rules * add temp extension api endpoint call * stuff for te * save * add comps for dropdown and text box * Lower the level of the context * add the choice card form * fix navigation * Use exising medicaid authoritys, but model TEs as a new action type * yep * Make breadcrumbs work for card choice te * hold * remove ded * remove stuff * asdf * functional * fixess * fix routing and banner thing * block actions for TEs * lint * rm log * rm log * reduce * restructure to make the inference of main index Document be correct again * lets see what breaks * schemas * parseasync * add check to submit function to double check the action is valid for the parent * fix breadcrumb label * faq link fix * fixes * fqq updates * maybe * dangerous * Revert "maybe" This reverts commit b629fa118d8cc937e3f33f9b911fb0c698868ee8. * rm log * fix undefind id in banner when going through new cards * fix additional information being blank * fix statuses for details page * update language for action * to uppercase * block bs for cs and cs for bs * hide fields that dont apply * position of error * add question mark * add uploads message to uploads * add dot * fix validation * rm function --------- Co-authored-by: 13bfrancis <40218571+13bfrancis@users.noreply.github.com> --- .../action-types/new-submission.ts | 5 + src/packages/shared-types/actions.ts | 1 + src/packages/shared-types/attachments.ts | 1 + .../main/transforms/new-submission.ts | 78 +++- .../shared-utils/package-actions/rules.ts | 19 +- src/packages/shared-utils/package-check.ts | 15 +- src/services/api/handlers/submit.ts | 80 +++- src/services/api/serverless.yml | 4 + src/services/data/handlers/sinkMain.ts | 3 +- src/services/ui/src/api/submissionService.ts | 1 + .../ui/src/components/Routing/routes.ts | 1 + .../features/faq/content/oneMACFAQContent.tsx | 6 +- .../package-actions/ActionWrapper.tsx | 3 + .../package-actions/TemporaryExtension.tsx | 358 ++++++++++++++++++ .../ui/src/features/package-actions/index.tsx | 9 + .../package-actions/shared-components.tsx | 31 +- .../ui/src/features/package/index.tsx | 7 +- .../package/package-details/hooks.tsx | 16 +- .../src/features/selection-flow/options.tsx | 2 +- src/services/ui/src/router.tsx | 27 +- src/services/ui/src/utils/labelMappers.ts | 4 + src/services/ui/src/utils/zod.ts | 35 ++ 22 files changed, 659 insertions(+), 47 deletions(-) create mode 100644 src/services/ui/src/features/package-actions/TemporaryExtension.tsx diff --git a/src/packages/shared-types/action-types/new-submission.ts b/src/packages/shared-types/action-types/new-submission.ts index ab6ba19dd..e9615fa81 100644 --- a/src/packages/shared-types/action-types/new-submission.ts +++ b/src/packages/shared-types/action-types/new-submission.ts @@ -7,11 +7,16 @@ export const onemacSchema = z.object({ seaActionType: z.string().optional(), // Used by waivers and chip spas origin: z.string(), appkParentId: z.string().nullable().default(null), + originalWaiverNumber: z.string().nullable().default(null), additionalInformation: z.string().nullable().default(null), submitterName: z.string(), submitterEmail: z.string(), attachments: z.array(attachmentSchema).nullish(), raiWithdrawEnabled: z.boolean().default(false), + // these are specific to TEs... should be broken into its own schema + statusDate: z.number().optional(), + submissionDate: z.number().optional(), + changedDate: z.number().optional(), }); export type OneMac = z.infer; diff --git a/src/packages/shared-types/actions.ts b/src/packages/shared-types/actions.ts index 8698954af..d1ce8b5cc 100644 --- a/src/packages/shared-types/actions.ts +++ b/src/packages/shared-types/actions.ts @@ -9,6 +9,7 @@ export enum Action { WITHDRAW_RAI = "withdraw-rai", WITHDRAW_PACKAGE = "withdraw-package", REMOVE_APPK_CHILD = "remove-appk-child", + TEMP_EXTENSION = "temporary-extension", } export type ActionRule = { diff --git a/src/packages/shared-types/attachments.ts b/src/packages/shared-types/attachments.ts index bbc17ca5b..bfdb939fd 100644 --- a/src/packages/shared-types/attachments.ts +++ b/src/packages/shared-types/attachments.ts @@ -40,6 +40,7 @@ export const attachmentTitleMap = ( "1915(b)(4) FFS Selective Contracting (Streamlined) Waiver Application Pre-print", b4IndependentAssessment: "1915(b)(4) FFS Selective Contracting (Streamlined) Independent Assessment (first two renewals only)", + waiverExtensionRequest: "Waiver Extension Request", }); export type AttachmentKey = keyof typeof attachmentTitleMap; export type AttachmentTitle = (typeof attachmentTitleMap)[AttachmentKey]; diff --git a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts index 06fed5850..4956d6aa7 100644 --- a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts +++ b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts @@ -1,18 +1,72 @@ -import { onemacSchema } from "../../.."; +import { + SEATOOL_AUTHORITIES, + SEATOOL_STATUS, + onemacSchema, +} from "shared-types"; + +const getIdByAuthorityName = (authorityName: string) => { + try { + const authorityId = Object.keys(SEATOOL_AUTHORITIES).find( + (key) => SEATOOL_AUTHORITIES[key] === authorityName + ); + return authorityId ? parseInt(authorityId, 10) : null; + } catch (error) { + console.error(`SEATOOL AUTHORITY ID LOOKUP ERROR: ${authorityName}`); + console.error(error); + return null; + } +}; export const transform = (id: string) => { return onemacSchema.transform((data) => { - const transformedData = { - id, - attachments: data.attachments, - appkParentId: data.appkParentId, - raiWithdrawEnabled: data.raiWithdrawEnabled, - additionalInformation: data.additionalInformation, - submitterEmail: data.submitterEmail, - submitterName: data.submitterName === "-- --" ? null : data.submitterName, - origin: "OneMAC", - }; - return transformedData; + if (data.seaActionType === "Extend") { + // We should have a separate transform for TE new submission, and possibly for each new-submission that's unique (appk)... todo + return { + id, + attachments: data.attachments, + appkParentId: data.appkParentId, + raiWithdrawEnabled: data.raiWithdrawEnabled, + additionalInformation: data.additionalInformation, + submitterEmail: data.submitterEmail, + submitterName: + data.submitterName === "-- --" ? null : data.submitterName, + origin: "OneMAC", + // ---------- + // The fields below are usually set by way of seatool and the ksql output, but must be set here for TEs. + flavor: "WAIVER", + state: id.split("-")[0], + actionType: data.seaActionType, + actionTypeId: 9999, + authorityId: getIdByAuthorityName(data.authority), + authority: data.authority, + stateStatus: "Submitted", + cmsStatus: "Requested", + seatoolStatus: SEATOOL_STATUS.PENDING, + statusDate: data.statusDate, + submissionDate: data.submissionDate, + changedDate: data.changedDate, + // type, subtype, subject, description will soon be collected and available in data; this will need updating then. + subject: null, + description: null, + typeId: null, + typeName: null, + subTypeId: null, + subTypeName: null, + // ---------- + }; + } else { + return { + id, + attachments: data.attachments, + appkParentId: data.appkParentId, + raiWithdrawEnabled: data.raiWithdrawEnabled, + additionalInformation: data.additionalInformation, + submitterEmail: data.submitterEmail, + submitterName: + data.submitterName === "-- --" ? null : data.submitterName, + origin: "OneMAC", + }; + } }); }; diff --git a/src/packages/shared-utils/package-actions/rules.ts b/src/packages/shared-utils/package-actions/rules.ts index b6276f19b..4c0577abe 100644 --- a/src/packages/shared-utils/package-actions/rules.ts +++ b/src/packages/shared-utils/package-actions/rules.ts @@ -10,6 +10,7 @@ import { isStateUser, isCmsWriteUser, isIDM } from "../user-helper"; const arIssueRai: ActionRule = { action: Action.ISSUE_RAI, check: (checker, user) => + !checker.isTempExtension && checker.isInActivePendingStatus && // Doesn't have any RAIs (!checker.hasLatestRai || @@ -26,14 +27,25 @@ const arIssueRai: ActionRule = { const arRespondToRai: ActionRule = { action: Action.RESPOND_TO_RAI, check: (checker, user) => + !checker.isTempExtension && checker.hasStatus(SEATOOL_STATUS.PENDING_RAI) && checker.hasRequestedRai && isStateUser(user), }; +const arTempExtension: ActionRule = { + action: Action.TEMP_EXTENSION, + check: (checker, user) => + checker.hasStatus(SEATOOL_STATUS.APPROVED) && + checker.isWaiver && + checker.isInitialOrRenewal && + isStateUser(user), +}; + const arEnableWithdrawRaiResponse: ActionRule = { action: Action.ENABLE_RAI_WITHDRAW, check: (checker, user) => + !checker.isTempExtension && checker.isNotWithdrawn && checker.hasRaiResponse && !checker.hasEnabledRaiWithdraw && @@ -44,6 +56,7 @@ const arEnableWithdrawRaiResponse: ActionRule = { const arDisableWithdrawRaiResponse: ActionRule = { action: Action.DISABLE_RAI_WITHDRAW, check: (checker, user) => + !checker.isTempExtension && checker.isNotWithdrawn && checker.hasRaiResponse && checker.hasEnabledRaiWithdraw && @@ -54,6 +67,7 @@ const arDisableWithdrawRaiResponse: ActionRule = { const arWithdrawRaiResponse: ActionRule = { action: Action.WITHDRAW_RAI, check: (checker, user) => + !checker.isTempExtension && checker.isInActivePendingStatus && checker.hasRaiResponse && checker.hasEnabledRaiWithdraw && @@ -62,7 +76,9 @@ const arWithdrawRaiResponse: ActionRule = { const arWithdrawPackage: ActionRule = { action: Action.WITHDRAW_PACKAGE, check: (checker, user) => - !checker.hasStatus(finalDispositionStatuses) && isStateUser(user), + !checker.isTempExtension && + !checker.hasStatus(finalDispositionStatuses) && + isStateUser(user), }; // TODO: Add rule for remove-appk-child @@ -74,4 +90,5 @@ export default [ arDisableWithdrawRaiResponse, arWithdrawRaiResponse, arWithdrawPackage, + arTempExtension, ]; diff --git a/src/packages/shared-utils/package-check.ts b/src/packages/shared-utils/package-check.ts index a6e3b42bf..b9c60ef97 100644 --- a/src/packages/shared-utils/package-check.ts +++ b/src/packages/shared-utils/package-check.ts @@ -1,4 +1,4 @@ -import { opensearch, Authority, SEATOOL_STATUS } from "../shared-types"; +import { opensearch, Authority, SEATOOL_STATUS } from "shared-types"; const secondClockStatuses = [ SEATOOL_STATUS.PENDING, @@ -28,11 +28,15 @@ export const PackageCheck = ({ raiWithdrawnDate, raiWithdrawEnabled, authority, + actionType, appkParentId, }: opensearch.main.Document) => { const planChecks = { isSpa: checkAuthority(authority, [Authority.MED_SPA, Authority.CHIP_SPA]), - isWaiver: checkAuthority(authority, [Authority["1915b"]]), + isWaiver: checkAuthority(authority, [ + Authority["1915b"], + Authority["1915c"], + ]), isAppk: checkAuthority(authority, [Authority["1915c"]]) && !appkParentId, /** Keep excess methods to a minimum with `is` **/ authorityIs: (validAuthorities: Authority[]) => @@ -71,10 +75,17 @@ export const PackageCheck = ({ /** RAI Withdraw has been enabled **/ hasEnabledRaiWithdraw: raiWithdrawEnabled, }; + + const actionTypeChecks = { + isInitialOrRenewal: actionType === "New" || actionType === "Renew", + isTempExtension: actionType === "Extend", + }; + return { ...planChecks, ...statusChecks, ...raiChecks, + ...actionTypeChecks, }; }; diff --git a/src/services/api/handlers/submit.ts b/src/services/api/handlers/submit.ts index 85448f186..496e49768 100644 --- a/src/services/api/handlers/submit.ts +++ b/src/services/api/handlers/submit.ts @@ -1,15 +1,21 @@ import { response } from "../libs/handler"; import { APIGatewayEvent } from "aws-lambda"; import * as sql from "mssql"; -import { isAuthorized } from "../libs/auth/user"; +import { + getAuthDetails, + isAuthorized, + lookupUserAttributes, +} from "../libs/auth/user"; -import { Authority, onemacSchema } from "shared-types"; +import { Action, Authority, onemacSchema } from "shared-types"; import { + getAvailableActions, getNextBusinessDayTimestamp, seaToolFriendlyTimestamp, } from "shared-utils"; import { buildStatusMemoQuery } from "../libs/statusMemo"; import { produceMessage } from "../libs/kafka"; +import { getPackage } from "../libs/package"; export const submit = async (event: APIGatewayEvent) => { try { @@ -33,6 +39,7 @@ export const submit = async (event: APIGatewayEvent) => { Authority.CHIP_SPA, Authority.MED_SPA, Authority["1915b"], + Authority["1915c"], // We accept amendments, renewals, and extensions for Cs ]; if (!activeSubmissionTypes.includes(body.authority)) { return response({ @@ -43,6 +50,71 @@ export const submit = async (event: APIGatewayEvent) => { }); } + const authDetails = getAuthDetails(event); + const userAttr = await lookupUserAttributes( + authDetails.userId, + authDetails.poolId + ); + + // I think we need to break this file up. A switch maybe + if ( + [Authority["1915b"], Authority["1915c"]].includes(body.authority) && + body.seaActionType === "Extend" + ) { + console.log("Received a new temporary extension sumbission"); + + // Check that this action can be performed on the original waiver + const originalWaiver = await getPackage(body.originalWaiverNumber); + console.log(originalWaiver); + const originalWaiverAvailableActions: Action[] = getAvailableActions( + userAttr, + originalWaiver._source + ); + if (!originalWaiverAvailableActions.includes(Action.TEMP_EXTENSION)) { + const actionType = Action.TEMP_EXTENSION; + const id = body.originalWaiverNumber; + console.log( + `Package ${body.originalWaiverNumber} is not a candidate to receive a Temporary Extension` + ); + return response({ + statusCode: 401, + body: { + message: `You are not authorized to perform ${actionType} on ${id}`, + }, + }); + } + + // Safe parse the body + const eventBody = onemacSchema.safeParse(body); + if (!eventBody.success) { + return console.log( + "MAKO Validation Error. The following record failed to parse: ", + JSON.stringify(eventBody), + "Because of the following Reason(s): ", + eventBody.error.message + ); + } + console.log( + "Safe parsed event body" + JSON.stringify(eventBody.data, null, 2) + ); + + await produceMessage( + process.env.topicName as string, + body.id, + JSON.stringify({ + ...eventBody.data, + submissionDate: getNextBusinessDayTimestamp(), + statusDate: seaToolFriendlyTimestamp(), + changedDate: Date.now(), + }) + ); + + return response({ + statusCode: 200, + body: { message: "success" }, + }); + } + const today = seaToolFriendlyTimestamp(); const submissionDate = getNextBusinessDayTimestamp(); console.log( @@ -94,8 +166,8 @@ export const submit = async (event: APIGatewayEvent) => { -- Main insert into State_Plan INSERT INTO SEA.dbo.State_Plan (ID_Number, State_Code, Title_Name, Summary_Memo, Region_ID, Plan_Type, Submission_Date, Status_Date, Proposed_Date, SPW_Status_ID, Budget_Neutrality_Established_Flag, Status_Memo) VALUES ('${body.id}', '${ - body.state - }', @TitleName, @SummaryMemo, @RegionID, @PlanTypeID, @SubmissionDate, @StatusDate, @ProposedDate, @SPWStatusID, 0, @StatusMemo); + body.state + }', @TitleName, @SummaryMemo, @RegionID, @PlanTypeID, @SubmissionDate, @StatusDate, @ProposedDate, @SPWStatusID, 0, @StatusMemo); `; console.log(query); diff --git a/src/services/api/serverless.yml b/src/services/api/serverless.yml index 61a604715..4cc9844af 100644 --- a/src/services/api/serverless.yml +++ b/src/services/api/serverless.yml @@ -7,6 +7,9 @@ plugins: - "@stratiformdigital/serverless-s3-security-helper" - serverless-plugin-scripts +package: + individually: true + provider: name: aws runtime: nodejs18.x @@ -235,6 +238,7 @@ functions: dbPassword: ${self:custom.dbInfo.password} topicName: ${param:topicName} brokerString: ${self:custom.brokerString} + osDomain: ${param:osDomain} events: - http: path: /submit diff --git a/src/services/data/handlers/sinkMain.ts b/src/services/data/handlers/sinkMain.ts index 5460bbbf3..0a9c1f9be 100644 --- a/src/services/data/handlers/sinkMain.ts +++ b/src/services/data/handlers/sinkMain.ts @@ -139,7 +139,8 @@ const onemac = async (kafkaRecords: KafkaRecord[], topicPartition: string) => { // Handle everything else const result = (() => { switch (record?.actionType) { - case undefined: + case "new-submission": + case undefined: return opensearch.main.newSubmission .transform(id) .safeParse(record); diff --git a/src/services/ui/src/api/submissionService.ts b/src/services/ui/src/api/submissionService.ts index e1cb88879..7d720e396 100644 --- a/src/services/ui/src/api/submissionService.ts +++ b/src/services/ui/src/api/submissionService.ts @@ -107,6 +107,7 @@ export const buildSubmissionPayload = >( case buildActionUrl(Action.DISABLE_RAI_WITHDRAW): case buildActionUrl(Action.WITHDRAW_RAI): case buildActionUrl(Action.WITHDRAW_PACKAGE): + case buildActionUrl(Action.TEMP_EXTENSION): default: return { ...baseProperties, diff --git a/src/services/ui/src/components/Routing/routes.ts b/src/services/ui/src/components/Routing/routes.ts index 037d655e3..caf4b70a8 100644 --- a/src/services/ui/src/components/Routing/routes.ts +++ b/src/services/ui/src/components/Routing/routes.ts @@ -41,3 +41,4 @@ export const WAIVER_ACTIONS = "/action/:authority/:id/:type"; export const GUIDES = "/guides"; export const ABPGUIDE = "/guides/abp"; export const APPK_SUBMISSION = "/new-submission/waiver/app-k"; +export const TE_CARD_ROUTE = "/new-submission/waiver/temporary-extensions"; diff --git a/src/services/ui/src/features/faq/content/oneMACFAQContent.tsx b/src/services/ui/src/features/faq/content/oneMACFAQContent.tsx index 4e9272f88..d9f34fdc4 100644 --- a/src/services/ui/src/features/faq/content/oneMACFAQContent.tsx +++ b/src/services/ui/src/features/faq/content/oneMACFAQContent.tsx @@ -870,7 +870,7 @@ export const oneMACFAQContent: FAQContent[] = [ { anchorText: "waiver-extension-id-format", question: - "What format is used to enter a 1915(b) and 1915(c) Temporary Extension number?", + "What format is used to enter a 1915(b) or 1915(c) Temporary Extension number?", answerJSX: ( <>

@@ -916,7 +916,7 @@ export const oneMACFAQContent: FAQContent[] = [ ), }, { - anchorText: "waiverb-extension-attachments", + anchorText: "1915(b)-waiver-extension-attachments", question: "What are the attachments for a 1915(b) Waiver - Request for Temporary Extension?", answerJSX: ( @@ -957,7 +957,7 @@ export const oneMACFAQContent: FAQContent[] = [ ), }, { - anchorText: "waiverc-extension-attachments", + anchorText: "1915(c)-waiver-extension-attachments", question: "What are the attachments for a 1915(c) Waiver - Request for Temporary Extension", answerJSX: ( diff --git a/src/services/ui/src/features/package-actions/ActionWrapper.tsx b/src/services/ui/src/features/package-actions/ActionWrapper.tsx index caee07507..32f331e46 100644 --- a/src/services/ui/src/features/package-actions/ActionWrapper.tsx +++ b/src/services/ui/src/features/package-actions/ActionWrapper.tsx @@ -11,6 +11,7 @@ import { toggleRaiResponseWithdrawSchema } from "./ToggleRaiResponseWithdraw"; import { withdrawPackageSchema } from "./WithdrawPackage"; import { respondToRaiSchema } from "./RespondToRai"; import { useParams } from "@/components/Routing"; +import { tempExtensionSchema } from "./TemporaryExtension"; const schemas = { "issue-rai": issueRaiSchema, @@ -18,6 +19,7 @@ const schemas = { "enable-rai-withdraw": toggleRaiResponseWithdrawSchema, "disable-rai-withdraw": toggleRaiResponseWithdrawSchema, "withdraw-package": withdrawPackageSchema, + "temporary-extension": tempExtensionSchema, "respond-to-rai": respondToRaiSchema, } satisfies Record>; type SchemaKeys = keyof typeof schemas; @@ -27,6 +29,7 @@ const actions: Record = { "disable-rai-withdraw": Action.DISABLE_RAI_WITHDRAW, "enable-rai-withdraw": Action.ENABLE_RAI_WITHDRAW, "respond-to-rai": Action.RESPOND_TO_RAI, + "temporary-extension": Action.TEMP_EXTENSION, "withdraw-package": Action.WITHDRAW_PACKAGE, "withdraw-rai": Action.WITHDRAW_RAI, }; diff --git a/src/services/ui/src/features/package-actions/TemporaryExtension.tsx b/src/services/ui/src/features/package-actions/TemporaryExtension.tsx new file mode 100644 index 000000000..51b0689f1 --- /dev/null +++ b/src/services/ui/src/features/package-actions/TemporaryExtension.tsx @@ -0,0 +1,358 @@ +import { + Alert, + BreadCrumbs, + FAQ_TAB, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, + Input, + RequiredIndicator, + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, + SimplePageContainer, + useLocationCrumbs, +} from "@/components"; +import * as SC from "@/features/package-actions/shared-components"; +import { Link, useParams } from "react-router-dom"; +import { z } from "zod"; +import { Info } from "lucide-react"; +import { getUser } from "@/api/useGetUser"; +import { Authority } from "shared-types"; +import { unflatten } from "flat"; +import { + zAttachmentOptional, + zAttachmentRequired, + zExtensionOriginalWaiverNumberSchema, + zExtensionWaiverNumberSchema, +} from "@/utils"; +import { submit } from "@/api/submissionService"; +import { FormProvider, useForm, useFormContext } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { getItem } from "@/api"; + +type Attachments = keyof z.infer["attachments"]; +export const tempExtensionSchema = z + .object({ + id: zExtensionWaiverNumberSchema, + authority: z.string(), + seaActionType: z.string().default("Extend"), + originalWaiverNumber: zExtensionOriginalWaiverNumberSchema, + additionalInformation: z.string().optional().default(""), + attachments: z.object({ + waiverExtensionRequest: zAttachmentRequired({ min: 1 }), + other: zAttachmentOptional, + }), + }) + // We combined two checks into one, because zod stops validation chain when one fails + // This way, they will both be evaluated and errors shown if applicable + .superRefine(async (data, ctx) => { + // Check that the authorities match + const originalWaiverData = await getItem(data.originalWaiverNumber); + if (originalWaiverData._source.authority !== data.authority) { + ctx.addIssue({ + message: + "The selected Temporary Extension Type does not match the Approved Initial or Renewal Waiver's type.", + code: z.ZodIssueCode.custom, + fatal: true, + path: ["authority"], + }); + } + + // Check that the original waiver and temp extension have the same id up to the last period + const originalWaiverNumberPrefix = data.originalWaiverNumber.substring( + 0, + data.originalWaiverNumber.lastIndexOf(".") + ); + const idPrefix = data.id.substring(0, data.id.lastIndexOf(".")); + if (originalWaiverNumberPrefix !== idPrefix) { + ctx.addIssue({ + message: + "The Approved Initial or Renewal Waiver Number and the Temporary Extension Request Number must be identical until the last period.", + code: z.ZodIssueCode.custom, + fatal: true, + path: ["id"], + }); + } + return z.never; + }); + +export const onValidSubmission: SC.ActionFunction = async ({ request }) => { + try { + const formData = Object.fromEntries(await request.formData()); + const unflattenedFormData = unflatten(formData); + const data = await tempExtensionSchema.parseAsync(unflattenedFormData); + + const user = await getUser(); + + await submit({ + data, + endpoint: "/submit", + user, + authority: data.authority as Authority, + }); + + return { + submitted: true, + }; + } catch (err) { + console.log(err); + return { submitted: false }; + } +}; + +export const TempExtensionWrapper = () => { + const methods = useForm({ + resolver: zodResolver(tempExtensionSchema), + }); + const crumbs = useLocationCrumbs(); + + return ( + + + + + + + ); +}; + +export const TemporaryExtension = () => { + const { handleSubmit, formMethods } = SC.useSubmitForm(); + const { id: urlId, authority: urlAuthority } = useParams(); + const formId = formMethods.getValues("originalWaiverNumber"); + const formAuthority = formMethods.getValues("authority"); + const authority = urlAuthority ? urlAuthority : formAuthority; + + const parentId = urlId ? urlId : formId; + SC.useDisplaySubmissionAlert( + "Temporary Extension issued", + `The Temporary Extension Request for ${parentId} has been submitted.` + ); + + return ( + + + + + Once you submit this form, a confirmation email is sent to you and to + CMS. CMS will use this content to review your package, and you will not + be able to edit this form. If CMS needs any additional information, they + will follow up by email.{" "} + + If you leave this page, you will lose your progress on this form. + + +

+ + + attachments={[ + { + registerName: "waiverExtensionRequest", + name: "Waiver Extension Request", + required: true, + }, + { + registerName: "other", + name: "Other", + required: false, + }, + ]} + /> + + + + + + + + ); +}; + +/** +Private Components for Temporary Extension +**/ + +const TEPackageSection = ({ + authority, + id, +}: { + authority?: "1915(b)" | "1915(c)"; + id?: string; +}) => { + const type = id?.split(".")[1]?.includes("00") ? "Initial" : "Renewal"; + const { setValue } = useFormContext>(); + + if (id && authority) { + setValue("originalWaiverNumber", id); + setValue("authority", authority); + } + + return ( +
+ {/* If ID exists show these */} + {id && ( + <> +
+

Temporary Extension Type

+

{authority}

+
+ +
+

Approved Initial or Renewal Waiver Number

+

{id}

+
+ +
+

Type

+

+ {authority} Waiver {type} +

+
+ + )} + {/* Otherwise collect the following fields */} + {/* Set the fields that are required by default when they don't need to be collected */} + {!id && ( + <> + + + + + )} +
+ ); +}; +const AdditionalFormInformation = () => { + return ( + + +

+ Once you submit this form, a confirmation email is sent to you and to + CMS. CMS will use this content to review your package, and you will not + be able to edit this form. If CMS needs any additional information, they + will follow up by email. +

+
+ ); +}; + +const IdInput = () => { + const form = useFormContext(); + + return ( + ( + + + + Temporary Extension Request Number + + + + What is my Temporary Extension Request Number? + + + + Must use a waiver extension request number with the format + SS-####.R##.TE## or SS-#####.R##.TE## + + + { + if (e.target instanceof HTMLInputElement) { + e.target.value = e.target.value.toUpperCase(); + } + }} + /> + + + + )} + /> + ); +}; + +const TempExtensionTypeDropDown = () => { + const { control } = useFormContext>(); + + return ( + ( + + + Temporary Extension Type{" "} + + + + + + )} + /> + ); +}; + +const TempExtensionApproveOrRenewNumber = () => { + const { control } = useFormContext>(); + + return ( + ( + + + + Approved Initial or Renewal Waiver Number + {" "} + + + + Enter the existing waiver number in the format it was approved, + using a dash after the two character state abbreviation. + + + { + if (e.target instanceof HTMLInputElement) { + e.target.value = e.target.value.toUpperCase(); + } + }} + /> + + + + )} + /> + ); +}; diff --git a/src/services/ui/src/features/package-actions/index.tsx b/src/services/ui/src/features/package-actions/index.tsx index b9095a6c9..41d29127f 100644 --- a/src/services/ui/src/features/package-actions/index.tsx +++ b/src/services/ui/src/features/package-actions/index.tsx @@ -16,6 +16,10 @@ import { RespondToRai, onValidSubmission as respondToRaiSubmission, } from "./RespondToRai"; +import { + TemporaryExtension, + onValidSubmission as temporaryExtensionSubmission, +} from "./TemporaryExtension"; import { ActionWrapper } from "./ActionWrapper"; export const packageActionRoutes: RouteObject = { @@ -52,6 +56,11 @@ export const packageActionRoutes: RouteObject = { element: , action: respondToRaiSubmission, }, + { + path: "temporary-extension", + element: , + action: temporaryExtensionSubmission, + }, { path: "*", element: , diff --git a/src/services/ui/src/features/package-actions/shared-components.tsx b/src/services/ui/src/features/package-actions/shared-components.tsx index 91182e8a9..4705785af 100644 --- a/src/services/ui/src/features/package-actions/shared-components.tsx +++ b/src/services/ui/src/features/package-actions/shared-components.tsx @@ -1,4 +1,9 @@ -import { Alert, LoadingSpinner, useAlertContext, useModalContext } from "@/components"; +import { + Alert, + LoadingSpinner, + useAlertContext, + useModalContext, +} from "@/components"; import { Button, FormDescription, @@ -66,7 +71,7 @@ export const AttachmentsSection = ({ the description for each of the attachment types on the{" "} {" "} @@ -74,12 +79,12 @@ export const AttachmentsSection = ({

- We accept the following file formats:{" "} - .docx, .jpg, .png, .pdf, .xlsx, - and a few others. See the full list on the{" "} + We accept the following file formats:{" "} + .docx, .jpg, .pdf, .png, .xlsx. + See the full list on the{" "} {" "} @@ -95,6 +100,7 @@ export const AttachmentsSection = ({ {name} {required && } + )} /> @@ -228,7 +234,10 @@ export const ErrorBanner = () => { export const FormLoadingSpinner = () => { const { state } = useNavigation(); - return state === "submitting" && ; + const { formState } = useFormContext(); + return ( + (state === "submitting" || formState.isSubmitting) && + ); }; // Hooks @@ -283,8 +292,10 @@ export const useDisplaySubmissionAlert = (header: string, body: string) => { body, }); alert.setBannerShow(true); - alert.setBannerDisplayOn(location.state.from.split("?")[0]); - navigate(location.state.from); + alert.setBannerDisplayOn( + location.state?.from?.split("?")[0] ?? "/dashboard" + ); + navigate(location.state?.from ?? "/dashboard"); } }, [data]); }; @@ -303,4 +314,4 @@ const filterUndefinedValues = (obj: Record) => { export type ActionFunction = ( args: ActionFunctionArgs ) => Promise<{ submitted: boolean }>; -export type ActionFunctionReturnType = Awaited>; \ No newline at end of file +export type ActionFunctionReturnType = Awaited>; diff --git a/src/services/ui/src/features/package/index.tsx b/src/services/ui/src/features/package/index.tsx index a48fdcdd1..e64d181b6 100644 --- a/src/services/ui/src/features/package/index.tsx +++ b/src/services/ui/src/features/package/index.tsx @@ -9,7 +9,6 @@ import { Outlet } from "react-router-dom"; import { useGetPackageActions } from "@/api/useGetPackageActions"; import { FC, PropsWithChildren } from "react"; -import { getStatus } from "shared-types/statusHelper"; import { Link } from "@/components/Routing"; import { PackageActivities } from "./package-activity"; import { AdminChanges } from "./admin-changes"; @@ -33,17 +32,15 @@ const DetailCardWrapper = ({ ); const StatusCard = (data: opensearch.main.Document) => { - const transformedStatuses = getStatus(data.seatoolStatus); const { data: user } = useGetUser(); - return (

{user?.isCms && !user.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK) - ? transformedStatuses.cmsStatus - : transformedStatuses.stateStatus} + ? data.cmsStatus + : data.stateStatus}

{data.raiWithdrawEnabled && ( diff --git a/src/services/ui/src/features/package/package-details/hooks.tsx b/src/services/ui/src/features/package/package-details/hooks.tsx index c2015837b..468118e80 100644 --- a/src/services/ui/src/features/package/package-details/hooks.tsx +++ b/src/services/ui/src/features/package/package-details/hooks.tsx @@ -77,14 +77,18 @@ export const spaDetails = ( value: data.proposedDate ? formatSeatoolDate(data.proposedDate) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Approved Effective Date", value: data.approvedEffectiveDate ? formatSeatoolDate(data.approvedEffectiveDate) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Status Date", @@ -96,7 +100,9 @@ export const spaDetails = ( value: data.finalDispositionDate ? formatSeatoolDate(data.finalDispositionDate) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, ]; @@ -126,7 +132,9 @@ export const submissionDetails = ( { label: "CPOC", value:

{data?.leadAnalystName || BLANK_VALUE}

, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Review Team (SRT)", diff --git a/src/services/ui/src/features/selection-flow/options.tsx b/src/services/ui/src/features/selection-flow/options.tsx index 7ea1a868e..1bb69a474 100644 --- a/src/services/ui/src/features/selection-flow/options.tsx +++ b/src/services/ui/src/features/selection-flow/options.tsx @@ -63,7 +63,7 @@ export const WAIVER_OPTIONS: OptionData[] = [ { title: "Request Temporary Extension", description: "Submit for 1915(b) or 1915(c)", - linkTo: "/", + linkTo: "/new-submission/waiver/temporary-extensions", }, { title: "1915(b) Waiver Actions", diff --git a/src/services/ui/src/router.tsx b/src/services/ui/src/router.tsx index 800108d96..c9b69a03e 100644 --- a/src/services/ui/src/router.tsx +++ b/src/services/ui/src/router.tsx @@ -4,6 +4,11 @@ import * as C from "@/components"; import { QueryClient } from "@tanstack/react-query"; import { type Route } from "./components/Routing/types"; import { packageActionRoutes } from "@/features/package-actions"; +import { + TempExtensionWrapper, + TemporaryExtension, + onValidSubmission as tempExtensionAction, +} from "@/features/package-actions/TemporaryExtension"; export const queryClient = new QueryClient(); export const router = createBrowserRouter([ @@ -13,7 +18,7 @@ export const router = createBrowserRouter([ children: [ { path: "/", index: true, element: }, { path: "/faq", element: }, - { path: "/faq/:id", element: }, + { path: "/faq/:id", element: }, { path: "/dashboard", element: , @@ -100,14 +105,28 @@ export const router = createBrowserRouter([ path: "/new-submission/waiver/b/b4/amendment/create", element: , }, - { path: "/new-submission/spa/medicaid/create", element: }, - { path: "/new-submission/spa/chip/create", element: }, + { + path: "/new-submission/spa/medicaid/create", + element: , + }, + { + path: "/new-submission/spa/chip/create", + element: , + }, { path: "/action/:id/:type", element: }, { path: "/webforms", element: }, { path: "/webform/:id/:version", element: }, { path: "/profile", element: }, { path: "/guides/abp", element: }, - { path: "/new-submission/waiver/app-k", element: }, + { + path: "/new-submission/waiver/app-k", + element: , + }, + { + path: "/new-submission/waiver/temporary-extensions", + element: , + action: tempExtensionAction, + }, packageActionRoutes, ], loader: F.loader(queryClient), diff --git a/src/services/ui/src/utils/labelMappers.ts b/src/services/ui/src/utils/labelMappers.ts index 56c6801a4..7f4af7a97 100644 --- a/src/services/ui/src/utils/labelMappers.ts +++ b/src/services/ui/src/utils/labelMappers.ts @@ -17,6 +17,8 @@ export const mapActionLabel = (a: Action) => { return "Withdraw Formal RAI Response"; case Action.RESPOND_TO_RAI: return "Respond to Formal RAI"; + case Action.TEMP_EXTENSION: + return "Request Temporary Extension"; case Action.REMOVE_APPK_CHILD: return ""; } @@ -42,6 +44,8 @@ export const mapSubmissionCrumb = (path: Route) => { return "1915(b)(4) FFS Selective Contracting Waiver Amendment"; case "/new-submission/waiver/app-k": return "1915(c) APPENDIX K Amendment"; + case "/new-submission/waiver/temporary-extensions": + return "Request 1915(b) or 1915(c) Temporary Extension"; default: return BLANK_VALUE; } diff --git a/src/services/ui/src/utils/zod.ts b/src/services/ui/src/utils/zod.ts index 656980661..894787335 100644 --- a/src/services/ui/src/utils/zod.ts +++ b/src/services/ui/src/utils/zod.ts @@ -129,3 +129,38 @@ export const zAppkWaiverNumberSchema = z "The 1915(c) Waiver Amendment Number must be in the format of ####.R##.## or #####.R##.##. For amendments, the last two digits start with '01' and ascends." ) .default(""); + +export const zExtensionWaiverNumberSchema = z + .string() + .regex( + /^[A-Z]{2}-\d{4,5}\.R\d{2}\.TE\d{2}$/, + "The Temporary Extension Request Number must be in the format of SS-####.R##.TE## or SS-#####.R##.TE##" + ) + .refine((value) => isAuthorizedState(value), { + message: + "You can only submit for a state you have access to. If you need to add another state, visit your IDM user profile to request access.", + }) + .refine(async (value) => !(await itemExists(value)), { + message: + "According to our records, this Temporary Extension Request Number already exists. Please check the Temporary Extension Request Number and try entering it again.", + }); + +export const zExtensionOriginalWaiverNumberSchema = z + .string() + .regex( + /^[A-Z]{2}-\d{4,5}\.R\d{2}\.00$/, + "The Approved Initial or Renewal Waiver Number must be in the format of SS-####.R##.00 or SS-#####.R##.00." + ) + .refine((value) => isAuthorizedState(value), { + message: + "You can only submit for a state you have access to. If you need to add another state, visit your IDM user profile to request access.", + }) + // This should already exist + .refine(async (value) => await itemExists(value), { + message: + "According to our records, this Approved Initial or Renewal Waiver Number does not yet exist. Please check the Approved Initial or Renewal Waiver Number and try entering it again.", + }) + .refine(async (value) => idIsApproved(value), { + message: + "According to our records, this Approved Initial or Renewal Waiver Number is not approved. You must supply an approved Initial or Renewal Waiver Number.", + }); From f9489a7804c538146959e1367900f7d72248e9a8 Mon Sep 17 00:00:00 2001 From: Benjamin Paige Date: Thu, 14 Mar 2024 22:25:26 -0600 Subject: [PATCH 03/12] feat(four fields): This change add required fields to the submission forms (#428) * Update site title * init fields to medicaid submittion form * submission comments * update isprod check for next domain * update title check test * adjust layout width * Revert "adjust layout width" This reverts commit 9f6889fc71acabb3860aeb552473a67a0fc66840. * add subject and description to submit forms * adjust some fields did some refactoring * remove temo form * lots of refactoring * move dashboard to feature * getAllForms hood refactor structure * add types and subtypes schemas * add subject and description * add useGetPackageTypes * refactor authority, type, and subtype. move to a pattern of lookup indices. * remove tests... little value, just confusing at this point * reset file to clear junk diff * remove commented lines * remove unused func * remove comments * lint * remove comment * remove file * lint * type to clear vs code red line * lint * remove unused vars * Correct custom resource replies * added some api calls and hooks * add subtypes stuff * filter for do not use * update query and waiver implimentation * update submit query * fix table name typo * refactor * refactor inports * updates per paul * prettier" * middle ground ish * yes * rename * asdf * Add back * ok * ok * asdf * align names * asdf * break the seatool index sink away, for operational speed. * correct logic for disabled triggers * update decode record util * added shared comps * Refactor our sinks and reindex workflow * Set status to undefined when undefined * skip records without a status * types * fix conflicts * update getAllForms * update types and detail and page * fix unit tests * refactor * lots of refactors * refactor * add deconde thing back * temp comment four fields stuff out * clean up * remove unused api/util/seatoolservice * Remove remaining repack stuff * uncomment additinal seatool fields * update details page fields * update type and subtype fields and stuff * update more stuff and queries * update styles * update that details page sidebar thing * style updates * pushing pixels * pushing pixels * use a transaction with commit and rollback for submit handler * write types and subtypes as a single insert to reduce pressure on ksql and increase performance * collapse action type into main query * i am danerous, iceman * fixing an issue... pulling authority id from the static map * remove transmit begin * Bring back review team thing * Bug fixes * small bug fixes * substitute some weird characters in type and subtype * better * Adding fetchTypes tests and adjust styling * Add subtype tests and prettierrc file :0 * Combined type/subtype hooks and tests and mocks * Remove unused files * Pushing pixels * Pixel pushing * Update sidebar for details page * typo * Merge with master * Fixed sidebar bug * fixing bugs * fixing bugs * Bug Fixes * Add size to query * Bug fixes withn subtypes * Remainnig bug squashing * Squashed the rest of the bugs --------- Co-authored-by: Mike Dial <48921055+mdial89f@users.noreply.github.com> Co-authored-by: Mike Dial --- .gitignore | 1 - .prettierignore | 1 - .prettierrc | 5 + src/libs/package.json | 2 - .../opensearch/main/transforms/seatool.ts | 28 +- .../tests/seatool-date-helper.test.ts | 1 + src/packages/shared-utils/tests/testData.ts | 3 +- .../{getSeaTypes.ts => getSubTypes.ts} | 44 +- src/services/api/handlers/getTypes.ts | 76 + src/services/api/handlers/submit.ts | 229 +- src/services/api/package.json | 2 - src/services/api/serverless.yml | 38 +- src/services/api/services/seatoolService.ts | 35 - src/services/ui/src/api/index.ts | 2 +- src/services/ui/src/api/mocks/index.ts | 1 + src/services/ui/src/api/mocks/types.ts | 57 + src/services/ui/src/api/useGetPackageTypes.ts | 37 - src/services/ui/src/api/useGetTypes.test.ts | 102 + src/services/ui/src/api/useGetTypes.ts | 65 + src/services/ui/src/api/useGetUser.test.ts | 2 +- .../components/Cards/CardWithTopBorder.tsx | 2 +- .../ui/src/components/Cards/SectionCard.tsx | 2 +- .../src/components/DetailsSection/index.tsx | 6 +- .../ui/src/components/Form/content.tsx | 25 +- .../Filtering/Drawer/Filterable/Select.tsx | 1 + .../main/Filtering/Drawer/consts.ts | 4 +- .../Opensearch/main/Filtering/Export/hooks.ts | 6 +- .../ui/src/components/Table/index.tsx | 6 +- .../ui/src/features/actions/common.tsx | 2 +- .../features/dashboard/Lists/spas/consts.tsx | 4 +- .../dashboard/Lists/waivers/consts.tsx | 6 +- .../package-actions/shared-components.tsx | 2 +- .../features/package/admin-changes/index.tsx | 10 +- .../ui/src/features/package/hooks.tsx | 42 + .../ui/src/features/package/index.tsx | 172 +- .../package/package-actions/index.tsx | 59 + .../package/package-activity/index.tsx | 2 +- .../features/package/package-details/appk.tsx | 4 +- .../package/package-details/hooks.tsx | 87 +- .../package/package-details/index.tsx | 58 +- .../features/package/package-status/index.tsx | 48 + .../shared-components/AdditionalInfoInput.tsx | 5 +- .../shared-components/DescriptionInput.tsx | 11 +- .../shared-components/SubTypeSelect.tsx | 105 +- .../shared-components/SubjectInput.tsx | 5 +- .../shared-components/TypeSelect.tsx | 72 +- .../features/submission/spa/chip-intitial.tsx | 57 +- .../submission/spa/medicaid-initial.tsx | 50 +- .../capitated-1915-b-waiver-amendment.tsx | 53 +- .../capitated-1915-b-waiver-initial.tsx | 49 +- .../capitated-1915-b-waiver-renewal.tsx | 49 +- .../contracting-1915-b-waiver-amendment.tsx | 49 +- .../contracting-1915-b-waiver-initial.tsx | 49 +- .../contracting-1915-b-waiver-renewal.tsx | 49 +- src/services/ui/testing/setup.ts | 13 +- yarn.lock | 2597 ++++++----------- 56 files changed, 2158 insertions(+), 2334 deletions(-) create mode 100644 .prettierrc rename src/services/api/handlers/{getSeaTypes.ts => getSubTypes.ts} (60%) create mode 100644 src/services/api/handlers/getTypes.ts delete mode 100644 src/services/api/services/seatoolService.ts create mode 100644 src/services/ui/src/api/mocks/types.ts delete mode 100644 src/services/ui/src/api/useGetPackageTypes.ts create mode 100644 src/services/ui/src/api/useGetTypes.test.ts create mode 100644 src/services/ui/src/api/useGetTypes.ts create mode 100644 src/services/ui/src/features/package/hooks.tsx create mode 100644 src/services/ui/src/features/package/package-actions/index.tsx create mode 100644 src/services/ui/src/features/package/package-status/index.tsx diff --git a/.gitignore b/.gitignore index 0be21c7db..70f74135c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,7 +6,6 @@ testcafe_results yarn-error.log .serverless .webpack -.repack .yarn_install tsconfig.tsbuildinfo build_run diff --git a/.prettierignore b/.prettierignore index 9ee707eec..22c9ff44f 100644 --- a/.prettierignore +++ b/.prettierignore @@ -6,7 +6,6 @@ testcafe_results yarn-error.log .serverless .webpack -.repack .yarn_install tsconfig.tsbuildinfo build_run diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 000000000..d3be6d22e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "tabWidth": 2, + "useTabs": false, + "trailingComma": "all" +} diff --git a/src/libs/package.json b/src/libs/package.json index 98d8b1aa7..fb8b857ae 100644 --- a/src/libs/package.json +++ b/src/libs/package.json @@ -3,10 +3,8 @@ "version": "0.0.0", "dependencies": { "@aws-sdk/client-cognito-identity-provider": "^3.350.0", - "@aws-sdk/client-dynamodb": "^3.281.0", "@aws-sdk/credential-provider-node": "^3.369.0", "@aws-sdk/client-secrets-manager": "^3.410.0", - "@aws-sdk/util-dynamodb": "^3.281.0", "@opensearch-project/opensearch": "^2.3.0", "@types/aws4": "^1.11.3", "aws4": "^1.12.0", diff --git a/src/packages/shared-types/opensearch/main/transforms/seatool.ts b/src/packages/shared-types/opensearch/main/transforms/seatool.ts index 04d80dee6..a3a76d78f 100644 --- a/src/packages/shared-types/opensearch/main/transforms/seatool.ts +++ b/src/packages/shared-types/opensearch/main/transforms/seatool.ts @@ -159,10 +159,24 @@ export const transform = (id: string) => { leadAnalystName, authorityId: authorityId || null, authority: getAuthority(authorityId, id) as Authority | null, - typeId: data.STATE_PLAN_SERVICETYPES?.[0]?.SPA_TYPE_ID || null, - typeName: data.STATE_PLAN_SERVICETYPES?.[0]?.SPA_TYPE_NAME || null, - subTypeId: data.STATE_PLAN_SERVICE_SUBTYPES?.[0]?.TYPE_ID || null, - subTypeName: data.STATE_PLAN_SERVICE_SUBTYPES?.[0]?.TYPE_NAME || null, + types: + data.STATE_PLAN_SERVICETYPES?.filter( + (type): type is NonNullable => type != null + ).map((type) => { + return { + SPA_TYPE_ID: type.SPA_TYPE_ID, + SPA_TYPE_NAME: type.SPA_TYPE_NAME.replace(/–|—/g, "-"), + }; + }) || null, + subTypes: + data.STATE_PLAN_SERVICE_SUBTYPES?.filter( + (subType): subType is NonNullable => subType != null + ).map((subType) => { + return { + TYPE_ID: subType.TYPE_ID, + TYPE_NAME: subType.TYPE_NAME.replace(/–|—/g, "-"), + }; + }) || null, proposedDate: getDateStringOrNullFromEpoc(data.STATE_PLAN.PROPOSED_DATE), raiReceivedDate, raiRequestedDate, @@ -217,9 +231,7 @@ export const tombstone = (id: string) => { statusDate: null, submissionDate: null, subject: null, - typeId: null, - typeName: null, - subTypeId: null, - subTypeName: null, + types: null, + subTypes: null, }; }; diff --git a/src/packages/shared-utils/tests/seatool-date-helper.test.ts b/src/packages/shared-utils/tests/seatool-date-helper.test.ts index 06b0a6137..c6d47ac18 100644 --- a/src/packages/shared-utils/tests/seatool-date-helper.test.ts +++ b/src/packages/shared-utils/tests/seatool-date-helper.test.ts @@ -87,6 +87,7 @@ describe("getNextBusinessDayTimestamp", () => { expect(nextDate).toEqual(Date.UTC(2024, 0, 16)); // Tuesday, midnight utc }); + // TODO: I dont know if its my time zone but this always fails for me in the MST it("identifies valid business days", () => { let testDate = new Date(2024, 0, 9, 15, 0, 0); // Tuesday 3pm utc, Tuesday 8am eastern let nextDate = getNextBusinessDayTimestamp(testDate); diff --git a/src/packages/shared-utils/tests/testData.ts b/src/packages/shared-utils/tests/testData.ts index a17445df3..7d590a076 100644 --- a/src/packages/shared-utils/tests/testData.ts +++ b/src/packages/shared-utils/tests/testData.ts @@ -93,7 +93,7 @@ export const testItemResult: opensearch.main.ItemResult = { finalDispositionDate: null, stateStatus: "Under Review", submissionDate: "2024-03-01T00:00:00.000Z", - subTypeId: null, + subTypeIds: null, cmsStatus: "Pending", reviewTeam: [], flavor: "MEDICAID", @@ -108,7 +108,6 @@ export const testItemResult: opensearch.main.ItemResult = { { _index: "changelog", _id: "MD-12-3456", - _score: null, // @ts-ignore _source: { authority: "medicaid spa", diff --git a/src/services/api/handlers/getSeaTypes.ts b/src/services/api/handlers/getSubTypes.ts similarity index 60% rename from src/services/api/handlers/getSeaTypes.ts rename to src/services/api/handlers/getSubTypes.ts index 6ab509838..7ae8aa016 100644 --- a/src/services/api/handlers/getSeaTypes.ts +++ b/src/services/api/handlers/getSubTypes.ts @@ -1,19 +1,19 @@ import { APIGatewayEvent } from "aws-lambda"; -import * as os from "../../../libs/opensearch-lib"; +import * as os from "libs/opensearch-lib"; import { response } from "../libs/handler"; -type GetSeaTypesBoby = { +type GetSubTypesBoby = { authorityId: string; - typeId?: string; + typeIds: string[]; }; -export const querySeaTypes = async (authorityId: string, typeId?: string) => { +export const querySubTypes = async (authorityId: string, typeIds: string[]) => { if (!process.env.osDomain) { throw new Error("process.env.osDomain must be defined"); } - const index = typeId ? "subtypes" : "types"; - const query: any = { + const query = { + size: 200, query: { bool: { must: [ @@ -22,6 +22,11 @@ export const querySeaTypes = async (authorityId: string, typeId?: string) => { authorityId: authorityId, }, }, + { + terms: { + typeId: typeIds, + }, + }, ], must_not: [ { @@ -34,29 +39,28 @@ export const querySeaTypes = async (authorityId: string, typeId?: string) => { ], }, }, - }; - - if (typeId) { - query.query.bool.must.push({ - match: { - typeId: typeId, + sort: [ + { + "name.keyword": { + order: "asc", + }, }, - }); - } + ], + }; - return await os.search(process.env.osDomain, index, query); + return await os.search(process.env.osDomain, "subtypes", query); }; -export const getSeaTypes = async (event: APIGatewayEvent) => { +export const getSubTypes = async (event: APIGatewayEvent) => { if (!event.body) { return response({ statusCode: 400, body: { message: "Event body required" }, }); } - const body = JSON.parse(event.body) as GetSeaTypesBoby; + const body = JSON.parse(event.body) as GetSubTypesBoby; try { - const result = await querySeaTypes(body.authorityId, body.typeId); + const result = await querySubTypes(body.authorityId, body.typeIds); if (!result) return response({ @@ -66,7 +70,7 @@ export const getSeaTypes = async (event: APIGatewayEvent) => { return response({ statusCode: 200, - body: body.typeId ? { seaSubTypes: result } : { seaTypes: result }, + body: result, }); } catch (err) { console.error({ err }); @@ -77,4 +81,4 @@ export const getSeaTypes = async (event: APIGatewayEvent) => { } }; -export const handler = getSeaTypes; +export const handler = getSubTypes; diff --git a/src/services/api/handlers/getTypes.ts b/src/services/api/handlers/getTypes.ts new file mode 100644 index 000000000..4c76d5ff1 --- /dev/null +++ b/src/services/api/handlers/getTypes.ts @@ -0,0 +1,76 @@ +import { APIGatewayEvent } from "aws-lambda"; +import * as os from "libs/opensearch-lib"; +import { response } from "../libs/handler"; + +type GetTypesBoby = { + authorityId: string; +}; + +export const queryTypes = async (authorityId: string) => { + if (!process.env.osDomain) { + throw new Error("process.env.osDomain must be defined"); + } + + const query = { + size: 200, + query: { + bool: { + must: [ + { + match: { + authorityId: authorityId, + }, + }, + ], + must_not: [ + { + match_phrase: { + name: { + query: "Do Not Use", + }, + }, + }, + ], + }, + }, + sort: [ + { + "name.keyword": { + order: "asc", + }, + }, + ], + }; + return await os.search(process.env.osDomain, "types", query); +}; + +export const getTypes = async (event: APIGatewayEvent) => { + if (!event.body) { + return response({ + statusCode: 400, + body: { message: "Event body required" }, + }); + } + const body = JSON.parse(event.body) as GetTypesBoby; + try { + const result = await queryTypes(body.authorityId); + if (!result) + return response({ + statusCode: 400, + body: { message: "No record found for the given authority" }, + }); + + return response({ + statusCode: 200, + body: result, + }); + } catch (err) { + console.error({ err }); + return response({ + statusCode: 500, + body: { message: "Internal server error" }, + }); + } +}; + +export const handler = getTypes; diff --git a/src/services/api/handlers/submit.ts b/src/services/api/handlers/submit.ts index 496e49768..e29244947 100644 --- a/src/services/api/handlers/submit.ts +++ b/src/services/api/handlers/submit.ts @@ -7,7 +7,7 @@ import { lookupUserAttributes, } from "../libs/auth/user"; -import { Action, Authority, onemacSchema } from "shared-types"; +import { Action, Authority, SEATOOL_AUTHORITIES, onemacSchema } from "shared-types"; import { getAvailableActions, getNextBusinessDayTimestamp, @@ -17,38 +17,51 @@ import { buildStatusMemoQuery } from "../libs/statusMemo"; import { produceMessage } from "../libs/kafka"; import { getPackage } from "../libs/package"; +const user = process.env.dbUser; +const password = process.env.dbPassword; +const server = process.env.dbIp; +const port = parseInt(process.env.dbPort as string); +const config = { + user: user, + password: password, + server: server, + port: port, + database: "SEA", +} as sql.config; + export const submit = async (event: APIGatewayEvent) => { - try { - if (!event.body) { - return response({ - statusCode: 400, - body: "Event body required", - }); - } - const body = JSON.parse(event.body); - console.log(body); + if (!event.body) { + return response({ + statusCode: 400, + body: "Event body required", + }); + } - if (!(await isAuthorized(event, body.state))) { - return response({ - statusCode: 403, - body: { message: "Unauthorized" }, - }); - } + // TODO: We should really type this, is would be hard, but not impossible + const body = JSON.parse(event.body); + console.log(body); + + if (!(await isAuthorized(event, body.state))) { + return response({ + statusCode: 403, + body: { message: "Unauthorized" }, + }); + } - const activeSubmissionTypes = [ - Authority.CHIP_SPA, - Authority.MED_SPA, - Authority["1915b"], + const activeSubmissionTypes = [ + Authority.CHIP_SPA, + Authority.MED_SPA, + Authority["1915b"], Authority["1915c"], // We accept amendments, renewals, and extensions for Cs - ]; - if (!activeSubmissionTypes.includes(body.authority)) { - return response({ - statusCode: 400, - body: { - message: `OneMAC (micro) Submissions API does not support the following authority: ${body.authority}`, - }, - }); - } + ]; + if (!activeSubmissionTypes.includes(body.authority)) { + return response({ + statusCode: 400, + body: { + message: `OneMAC (micro) Submissions API does not support the following authority: ${body.authority}`, + }, + }); + } const authDetails = getAuthDetails(event); const userAttr = await lookupUserAttributes( @@ -115,24 +128,66 @@ export const submit = async (event: APIGatewayEvent) => { }); } - const today = seaToolFriendlyTimestamp(); - const submissionDate = getNextBusinessDayTimestamp(); - console.log( - "Initial Submission Date determined to be: " + - new Date(submissionDate).toISOString() - ); - const pool = await sql.connect({ - user: process.env.dbUser, - password: process.env.dbPassword, - server: process.env.dbIp as string, - port: parseInt(process.env.dbPort as string), - database: "SEA", - }); - console.log(body); + const today = seaToolFriendlyTimestamp(); + const submissionDate = getNextBusinessDayTimestamp(); + console.log( + "Initial Submission Date determined to be: " + + new Date(submissionDate).toISOString() + ); + + // Open the connection pool and transaction outside of the try/catch/finally + const pool = await sql.connect(config); + const transaction = new sql.Transaction(pool); + + // Begin writes + try { + await transaction.begin(); + // We first parse the event; if it's malformed, this will throw an error before we touch seatool or kafka + const eventBody = onemacSchema.safeParse(body); + if (!eventBody.success) { + return console.log( + "MAKO Validation Error. The following record failed to parse: ", + JSON.stringify(eventBody), + "Because of the following Reason(s): ", + eventBody.error.message + ); + } + + // Resolve the the Plan_Type_ID + const authorityId = findAuthorityIdByName(body.authority); + // Resolve the actionTypeID, if applicable + const actionTypeSelect = [Authority["1915b"], Authority.CHIP_SPA].includes( + body.authority + ) + ? ` + SELECT @ActionTypeID = Action_ID FROM SEA.dbo.Action_Types + WHERE Plan_Type_ID = '${authorityId}' + AND Action_Name = '${body.seaActionType}'; + ` + : "SET @ActionTypeID = NULL;"; + + // Generate INSERT statements for typeIds + const typeIdsValues = body.typeIds + .map((typeId: number) => `('${body.id}', '${typeId}')`) + .join(",\n"); + + const typeIdsInsert = typeIdsValues + ? `INSERT INTO SEA.dbo.State_Plan_Service_Types (ID_Number, Service_Type_ID) VALUES ${typeIdsValues};` + : ""; + + // Generate INSERT statements for subTypeIds + const subTypeIdsValues = body.subTypeIds + .map((subTypeId: number) => `('${body.id}', '${subTypeId}')`) + .join(",\n"); + + const subTypeIdsInsert = subTypeIdsValues + ? `INSERT INTO SEA.dbo.State_Plan_Service_SubTypes (ID_Number, Service_SubType_ID) VALUES ${subTypeIdsValues};` + : ""; + const query = ` DECLARE @RegionID INT; - DECLARE @PlanTypeID INT; DECLARE @SPWStatusID INT; + DECLARE @ActionTypeID INT; DECLARE @SubmissionDate DATETIME; DECLARE @StatusDate DATETIME; DECLARE @ProposedDate DATETIME; @@ -147,16 +202,16 @@ export const submit = async (event: APIGatewayEvent) => { "Package Submitted", "insert" )} + DECLARE @PlanTypeID INT = ${authorityId} -- Set your variables SELECT @RegionID = Region_ID FROM SEA.dbo.States WHERE State_Code = '${ body.state }'; - SELECT @PlanTypeID = Plan_Type_ID FROM SEA.dbo.Plan_Types WHERE Plan_Type_Name = '${ - body.authority - }'; SELECT @SPWStatusID = SPW_Status_ID FROM SEA.dbo.SPW_Status WHERE SPW_Status_DESC = 'Pending'; - + -- Set ActionTypeID if applicale, using the conditionally set statement generated previously + ${actionTypeSelect} + SET @SubmissionDate = DATEADD(s, CONVERT(INT, LEFT(${submissionDate}, 10)), CAST('19700101' as DATETIME)); SET @StatusDate = DATEADD(s, CONVERT(INT, LEFT(${today}, 10)), CAST('19700101' as DATETIME)); SET @ProposedDate = DATEADD(s, CONVERT(INT, LEFT(${ @@ -164,73 +219,57 @@ export const submit = async (event: APIGatewayEvent) => { }, 10)), CAST('19700101' as DATETIME)); -- Main insert into State_Plan - INSERT INTO SEA.dbo.State_Plan (ID_Number, State_Code, Title_Name, Summary_Memo, Region_ID, Plan_Type, Submission_Date, Status_Date, Proposed_Date, SPW_Status_ID, Budget_Neutrality_Established_Flag, Status_Memo) - VALUES ('${body.id}', '${ - body.state - }', @TitleName, @SummaryMemo, @RegionID, @PlanTypeID, @SubmissionDate, @StatusDate, @ProposedDate, @SPWStatusID, 0, @StatusMemo); - `; - console.log(query); + INSERT INTO SEA.dbo.State_Plan (ID_Number, State_Code, Title_Name, Summary_Memo, Region_ID, Plan_Type, Submission_Date, Status_Date, Proposed_Date, SPW_Status_ID, Budget_Neutrality_Established_Flag, Status_Memo, Action_Type) + VALUES ('${body.id}', '${body.state}', @TitleName, @SummaryMemo, @RegionID, @PlanTypeID, @SubmissionDate, @StatusDate, @ProposedDate, @SPWStatusID, 0, @StatusMemo, @ActionTypeID); - // TODO: FFF - // -- Insert into State_Plan_Service_SubTypes - // INSERT INTO SEA.dbo.State_Plan_Service_SubTypes (ID_Number, Service_SubType_ID) - // VALUES ('${body.id}', TRY_CAST('${body.subTypeId}' AS INT)); + -- Insert all types into State_Plan_Service_Types + ${typeIdsInsert} - // -- Insert into State_Plan_Service_Types - // INSERT INTO SEA.dbo.State_Plan_Service_Types (ID_Number, Service_Type_ID) - // VALUES ('${body.id}', TRY_CAST('${body.typeId}' AS INT)); - // `; + -- Insert all types into State_Plan_Service_SubTypes + ${subTypeIdsInsert} + `; - const result = await sql.query(query); + const result = await transaction.request().query(query); console.log(result); - if ([Authority["1915b"], Authority.CHIP_SPA].includes(body.authority)) { - const actionTypeQuery = ` - UPDATE sp - SET sp.Action_Type = at.Action_ID - FROM SEA.dbo.State_Plan sp - INNER JOIN SEA.dbo.Action_Types at ON at.Plan_Type_ID = ( - SELECT pt.Plan_Type_ID - FROM SEA.dbo.Plan_Types pt - WHERE pt.Plan_Type_Name = '${body.authority}' - ) - WHERE at.Action_Name = '${body.seaActionType}' - AND sp.ID_Number = '${body.id}'; - - `; - const actionTypeQueryResult = await sql.query(actionTypeQuery); - console.log(actionTypeQueryResult); - } - - await pool.close(); - - const eventBody = onemacSchema.safeParse(body); - if (!eventBody.success) { - return console.log( - "MAKO Validation Error. The following record failed to parse: ", - JSON.stringify(eventBody), - "Because of the following Reason(s): ", - eventBody.error.message - ); - } - console.log(eventBody); + // Write to kafka, before we commit our seatool transaction. + // This way, if we have an error making the kafka write, the seatool changes are rolled back. await produceMessage( process.env.topicName as string, body.id, JSON.stringify(eventBody.data) ); + // Commit transaction if we've made it this far + await transaction.commit(); + return response({ statusCode: 200, body: { message: "success" }, }); - } catch (error) { - console.error({ error }); + } catch (err) { + // Rollback and log + await transaction.rollback(); + console.error("Error when interacting with seatool or kafka:", err); return response({ statusCode: 500, body: { message: "Internal server error" }, }); + } finally { + // Close pool + await pool.close(); } }; +function findAuthorityIdByName(authority: string): string | undefined { + const entries = Object.entries(SEATOOL_AUTHORITIES); + for (const [key, value] of entries) { + if (value.toLowerCase() === authority.toLowerCase()) { + return key; + } + } + // Return undefined if no match is found + return undefined; +} + export const handler = submit; diff --git a/src/services/api/package.json b/src/services/api/package.json index c8592ab1d..16490104a 100644 --- a/src/services/api/package.json +++ b/src/services/api/package.json @@ -13,7 +13,6 @@ "extract-zip": "^2.0.1" }, "dependencies": { - "@aws-sdk/client-dynamodb": "^3.276.0", "@aws-sdk/client-s3": "^3.383.0", "@aws-sdk/client-sts": "^3.382.0", "@aws-sdk/s3-request-presigner": "^3.383.0", @@ -31,7 +30,6 @@ "scripts": { "build": "tsc", "lint": "eslint '**/*.{ts,js}'", - "compileRepack": "tsc -p repack", "test": "vitest", "coverage": "vitest run --coverage" } diff --git a/src/services/api/serverless.yml b/src/services/api/serverless.yml index 4cc9844af..9be5425d2 100644 --- a/src/services/api/serverless.yml +++ b/src/services/api/serverless.yml @@ -71,7 +71,8 @@ params: master: formsProvisionedConcurrency: 2 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 4 itemProvisionedConcurrency: 2 getAttachmentUrlProvisionedConcurrency: 2 @@ -80,7 +81,8 @@ params: val: formsProvisionedConcurrency: 2 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 4 itemProvisionedConcurrency: 2 getAttachmentUrlProvisionedConcurrency: 2 @@ -89,7 +91,8 @@ params: production: formsProvisionedConcurrency: 5 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 10 itemProvisionedConcurrency: 5 getAttachmentUrlProvisionedConcurrency: 5 @@ -98,7 +101,8 @@ params: default: formsProvisionedConcurrency: 0 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 1 + getSubTypesProvisionedConcurrency: 1 searchProvisionedConcurrency: 0 itemProvisionedConcurrency: 0 getAttachmentUrlProvisionedConcurrency: 0 @@ -191,15 +195,15 @@ functions: subnetIds: >- ${self:custom.vpc.privateSubnets} - getSeaTypes: - handler: handlers/getSeaTypes.handler + getTypes: + handler: handlers/getTypes.handler maximumRetryAttempts: 0 environment: region: ${self:provider.region} osDomain: ${param:osDomain} events: - http: - path: /getSeaTypes + path: /getTypes method: post cors: true authorizer: aws_iam @@ -208,7 +212,25 @@ functions: - Ref: SecurityGroup subnetIds: >- ${self:custom.vpc.privateSubnets} - provisionedConcurrency: ${param:getSeaTypesProvisionedConcurrency} + provisionedConcurrency: ${param:getTypesProvisionedConcurrency} + getSubTypes: + handler: handlers/getSubTypes.handler + maximumRetryAttempts: 0 + environment: + region: ${self:provider.region} + osDomain: ${param:osDomain} + events: + - http: + path: /getSubTypes + method: post + cors: true + authorizer: aws_iam + vpc: + securityGroupIds: + - Ref: SecurityGroup + subnetIds: >- + ${self:custom.vpc.privateSubnets} + provisionedConcurrency: ${param:getSubTypesProvisionedConcurrency} itemExists: handler: handlers/itemExists.handler maximumRetryAttempts: 0 diff --git a/src/services/api/services/seatoolService.ts b/src/services/api/services/seatoolService.ts deleted file mode 100644 index b4b0b13a6..000000000 --- a/src/services/api/services/seatoolService.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb"; -import { unmarshall } from "@aws-sdk/util-dynamodb"; - -export class SeatoolService { - #dynamoInstance: DynamoDBClient; - - constructor(dynamoInstance: DynamoDBClient) { - this.#dynamoInstance = dynamoInstance; - } - - async getIssues({ - tableName, - stateCode, - }: { - tableName: string; - stateCode: string; - }) { - const data = await this.#dynamoInstance.send( - new QueryCommand({ - TableName: tableName, - IndexName: "STATE_CODE-SUBMISSION_DATE-index", - KeyConditionExpression: "STATE_CODE = :state", - - ExpressionAttributeValues: { - ":state": { S: stateCode }, - }, - - ScanIndexForward: false, - Limit: 300, - }) - ); - - return data.Items?.map((item) => unmarshall(item)); - } -} diff --git a/src/services/ui/src/api/index.ts b/src/services/ui/src/api/index.ts index 8def17f86..f5d0394e0 100644 --- a/src/services/ui/src/api/index.ts +++ b/src/services/ui/src/api/index.ts @@ -4,7 +4,7 @@ export * from "./useGetItem"; export * from "./useGetUser"; export * from "./getAttachmentUrl"; export * from "./useGetPackageActions"; -export * from "./useGetPackageTypes"; +export * from "./useGetTypes"; export * from "./amplifyConfig"; export * from "./submissionService"; export * from "./itemExists"; diff --git a/src/services/ui/src/api/mocks/index.ts b/src/services/ui/src/api/mocks/index.ts index ecf85ec97..08cbffb83 100644 --- a/src/services/ui/src/api/mocks/index.ts +++ b/src/services/ui/src/api/mocks/index.ts @@ -1,2 +1,3 @@ export * as mockItem from "./item"; export * as mockSubmit from "./submit"; +export * as mockTypes from "./types"; diff --git a/src/services/ui/src/api/mocks/types.ts b/src/services/ui/src/api/mocks/types.ts new file mode 100644 index 000000000..07a5a26aa --- /dev/null +++ b/src/services/ui/src/api/mocks/types.ts @@ -0,0 +1,57 @@ +import { http, HttpResponse } from "msw"; +import { setupServer } from "msw/node"; + +type GetTypesBody = { authorityId: number }; +type GetSubTypesBody = { authorityId: number; typeIds: number[] }; + +export const handlers = [ + http.post("/os/getTypes", async ({ request }) => { + const { authorityId } = await request.json(); + + if (authorityId === -1) { + throw Error("useGetTypes > mockFetch: Expected error thrown by test."); + } + + return HttpResponse.json({ + hits: { + hits: mockData.filter( + (item) => + item._source.authorityId === authorityId && !item._source.typeId, + ), + }, + }); + }), + + http.post("/os/getSubTypes", async ({ request }) => { + const { authorityId, typeIds } = await request.json(); + + if (authorityId === -1) { + throw Error("useGetSubTypes > mockFetch: Expected error thrown by test."); + } + + const filteredData = mockData.filter( + (item) => + item._source.authorityId === authorityId && + typeIds.some((typeId) => item._source.typeId === typeId), + ); + + return HttpResponse.json({ + hits: { + hits: filteredData, + }, + }); + }), +]; + +const mockData = [ + { _source: { id: 101, authorityId: 1, name: "typeOne" } }, + { _source: { id: 102, authorityId: 1, name: "typetwo" } }, + { _source: { id: 103, authorityId: 2, name: "typethree" } }, + { _source: { id: 101, authorityId: 1, name: "subtypeOne", typeId: 1 } }, + { _source: { id: 102, authorityId: 1, name: "subtypetwo", typeId: 2 } }, + { _source: { id: 103, authorityId: 2, name: "subtypethree", typeId: 1 } }, + { _source: { id: 104, authorityId: 2, name: "subtypethree", typeId: 4 } }, + { _source: { id: 105, authorityId: 2, name: "subtypethree", typeId: 3 } }, +]; + +export const server = setupServer(...handlers); diff --git a/src/services/ui/src/api/useGetPackageTypes.ts b/src/services/ui/src/api/useGetPackageTypes.ts deleted file mode 100644 index 8ea5821c2..000000000 --- a/src/services/ui/src/api/useGetPackageTypes.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { API } from "aws-amplify"; -import { useQuery, UseQueryOptions } from "@tanstack/react-query"; -import { ReactQueryApiError } from "shared-types"; -import { types, subtypes } from "shared-types/opensearch"; - -async function fetchSeaTypes( - authorityId: number, - typeId?: string -): Promise { - const endpoint = "/getSeaTypes"; - const body = { authorityId, ...(typeId && { typeId }) }; - - try { - const response = await API.post("os", endpoint, { body }); - const key = typeId ? "seaSubTypes" : "seaTypes"; - const hits = response[key]?.hits?.hits || []; - - return hits.map( - (hit: types.ItemResult | subtypes.ItemResult) => hit._source - ); - } catch (error) { - console.error("Error fetching types:", error); - throw new Error("Failed to fetch types"); - } -} - -export function useSeaTypes( - authorityId: number, - typeId?: string, - options?: UseQueryOptions -) { - return useQuery( - ["package-types", authorityId, typeId], - () => fetchSeaTypes(authorityId, typeId), - options - ); -} diff --git a/src/services/ui/src/api/useGetTypes.test.ts b/src/services/ui/src/api/useGetTypes.test.ts new file mode 100644 index 000000000..df392ce56 --- /dev/null +++ b/src/services/ui/src/api/useGetTypes.test.ts @@ -0,0 +1,102 @@ +import { + beforeAll, + afterEach, + afterAll, + it, + expect, + vi, + describe, +} from "vitest"; +import { API } from "aws-amplify"; +import { mockTypes } from "./mocks"; +import { fetchData } from "./useGetTypes"; + +const mockFetchData = vi.fn(async (apiName, path, init) => { + const endpoint = init.body.typeIds ? "/getSubTypes" : "/getTypes"; + const res = await fetch(`/os${endpoint}`, { + body: JSON.stringify(init.body), + method: "POST", + }); + if (res.status !== 200) + throw Error("useGetData > mockFetch: Expected error thrown by test."); + return await res.json(); +}); + +describe("fetchData", () => { + beforeAll(() => { + mockTypes.server.listen(); + API.post = vi.fn(mockFetchData); + }); + afterEach(() => { + mockTypes.server.resetHandlers(); + }); + afterAll(() => { + mockTypes.server.close(); + }); + + describe("fetchTypes", () => { + it("makes an AWS Amplify post request for types", async () => { + const types = await fetchData({ authorityId: 1 }); + expect(types).toEqual([ + { id: 101, authorityId: 1, name: "typeOne" }, + { id: 102, authorityId: 1, name: "typetwo" }, + ]); + expect(API.post).toHaveBeenCalledWith("os", "/getTypes", { + body: { authorityId: 1 }, + }); + }); + + it("successfully fetches types for a given authorityId", async () => { + const types = await fetchData({ authorityId: 2 }); + expect(types).toEqual([{ id: 103, authorityId: 2, name: "typethree" }]); + expect(API.post).toHaveBeenCalledWith("os", "/getTypes", { + body: { authorityId: 2 }, + }); + }); + + it("returns an empty array when there are no types", async () => { + const types = await fetchData({ authorityId: 3 }); + expect(types).toEqual([]); + }); + + it("throws an error when fetch fails", async () => { + await expect(fetchData({ authorityId: -1 })).rejects.toThrow( + "Failed to fetch types", + ); + }); + }); + + describe("fetchSubTypes", () => { + it("makes an AWS Amplify post request for subtypes", async () => { + const subtypes = await fetchData({ authorityId: 1, typeIds: [1, 2] }); + expect(subtypes).toEqual([ + { id: 101, authorityId: 1, name: "subtypeOne", typeId: 1 }, + { id: 102, authorityId: 1, name: "subtypetwo", typeId: 2 }, + ]); + expect(API.post).toHaveBeenCalledWith("os", "/getSubTypes", { + body: { authorityId: 1, typeIds: [1, 2] }, + }); + }); + + it("successfully fetches subtypes for a given authorityId and typeIds", async () => { + const subtypes = await fetchData({ authorityId: 2, typeIds: [4] }); + expect(subtypes).toEqual([ + { id: 104, authorityId: 2, name: "subtypethree", typeId: 4 }, + ]); + expect(API.post).toHaveBeenCalledWith("os", "/getSubTypes", { + body: { authorityId: 2, typeIds: [4] }, + }); + }); + + it("returns an empty array when there are no subtypes", async () => { + const subtypes = await fetchData({ authorityId: 3, typeIds: [4, 5] }); + expect(subtypes).toEqual([]); + }); + + it("throws an error when fetch fails", async () => { + await expect(fetchData({ authorityId: -1, typeIds: [] })).rejects.toThrow( + "Failed to fetch subtypes", + ); + }); + }); +}); diff --git a/src/services/ui/src/api/useGetTypes.ts b/src/services/ui/src/api/useGetTypes.ts new file mode 100644 index 000000000..ffa9feecb --- /dev/null +++ b/src/services/ui/src/api/useGetTypes.ts @@ -0,0 +1,65 @@ +import { API } from "aws-amplify"; +import { useQuery, UseQueryOptions } from "@tanstack/react-query"; +import { opensearch, ReactQueryApiError } from "shared-types"; +import { subtypes, types } from "shared-types/opensearch"; + +type FetchOptions = { + authorityId: number; + typeIds?: number[]; +}; + +export async function fetchData({ + authorityId, + typeIds, +}: FetchOptions): Promise { + const endpoint = typeIds ? "/getSubTypes" : "/getTypes"; + const body = typeIds ? { authorityId, typeIds } : { authorityId }; + + try { + const response = await API.post("os", endpoint, { body }); + const hits = response.hits?.hits || []; + + if (typeIds) { + return hits.map((hit: subtypes.ItemResult) => hit._source as T); + } else { + return hits.map((hit: types.ItemResult) => hit._source as T); + } + } catch (error) { + console.error(`Error fetching ${typeIds ? "subtypes" : "types"}:`, error); + throw new Error(`Failed to fetch ${typeIds ? "subtypes" : "types"}`); + } +} + +export function useGetData( + options: FetchOptions, + queryOptions?: UseQueryOptions, +) { + const { authorityId, typeIds } = options; + const queryKey = typeIds + ? ["package-subtypes", authorityId, typeIds] + : ["package-types", authorityId]; + + return useQuery( + queryKey, + () => fetchData(options), + queryOptions, + ); +} + +export function useGetTypes( + authorityId: number, + options?: UseQueryOptions, +) { + return useGetData({ authorityId }, options); +} + +export function useGetSubTypes( + authorityId: number, + typeIds: number[], + options?: UseQueryOptions, +) { + return useGetData( + { authorityId, typeIds }, + options, + ); +} diff --git a/src/services/ui/src/api/useGetUser.test.ts b/src/services/ui/src/api/useGetUser.test.ts index c1dc3cea7..ca4c4eb40 100644 --- a/src/services/ui/src/api/useGetUser.test.ts +++ b/src/services/ui/src/api/useGetUser.test.ts @@ -58,7 +58,7 @@ const mockUserAttr = ({ Value: isCms ? "onemac-micro-reviewer" : "onemac-micro-cmsreview", }, ] as Array<{ Name: string; Value: string }>); - }, + } ); }); diff --git a/src/services/ui/src/components/Cards/CardWithTopBorder.tsx b/src/services/ui/src/components/Cards/CardWithTopBorder.tsx index d9d9e003e..2aadd7f62 100644 --- a/src/services/ui/src/components/Cards/CardWithTopBorder.tsx +++ b/src/services/ui/src/components/Cards/CardWithTopBorder.tsx @@ -10,7 +10,7 @@ export const CardWithTopBorder: FC = ({ className, }: CardWithTopBorderProps) => { return ( -
+
= ({ return (
-

{title}

+

{title}

{children}
diff --git a/src/services/ui/src/components/DetailsSection/index.tsx b/src/services/ui/src/components/DetailsSection/index.tsx index c9aeeb592..cd5cf375e 100644 --- a/src/services/ui/src/components/DetailsSection/index.tsx +++ b/src/services/ui/src/components/DetailsSection/index.tsx @@ -15,9 +15,9 @@ export const DetailsSection: React.FC = ({ }: DetailsSectionProps) => { useScrollToTop(); return ( -
-

{title}

-
+
+

{title}

+
{description &&

{description}

} diff --git a/src/services/ui/src/components/Form/content.tsx b/src/services/ui/src/components/Form/content.tsx index 7ffc7b27d..13a978417 100644 --- a/src/services/ui/src/components/Form/content.tsx +++ b/src/services/ui/src/components/Form/content.tsx @@ -6,24 +6,24 @@ export const FormIntroText = () => (
{" "} Indicates a required field. -

+

Once you submit this form, a confirmation email is sent to you and to CMS. CMS will use this content to review your package, and you will not be able to edit this form. If CMS needs any additional information, they will follow up by email.{" "} - + If you leave this page, you will lose your progress on this form. - +

); export const SpaIdFormattingDesc = () => ( <> -

+

Must follow the format SS-YY-NNNN or SS-YY-NNNN-XXXX.

-

+

Reminder - CMS recommends that all SPA numbers start with the year in which the package is submitted.

@@ -37,14 +37,12 @@ export const AttachmentsSizeTypesDesc = ({ faqLink: string; includeCMS179?: boolean; }) => ( - <> +

- Maximum file size of 80 MB per attachment.{" "} - - You can add multiple files per attachment type - {includeCMS179 && ", except for the CMS Form 179."}. - {" "} - Read the description for each of the attachment types on the{" "} + Maximum file size of 80 MB per attachment. You can add multiple files per + attachment type + {includeCMS179 && ", except for the CMS Form 179."}. Read the description + for each of the attachment types on the{" "} { +

We accept the following file formats:{" "} .docx, .jpg, .pdf, .png, .xlsx. See the @@ -73,7 +72,7 @@ export const AttachmentsSizeTypesDesc = ({ } .

- +
); export const PreSubmissionMessage = () => ( diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/Filterable/Select.tsx b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/Filterable/Select.tsx index 5038fd94c..03b205bcc 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/Filterable/Select.tsx +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/Filterable/Select.tsx @@ -21,6 +21,7 @@ export const FilterableSelect: FC<{ onChange={(val) => props.onChange(val.map((s: any) => s.value))} options={props.options} closeMenuOnSelect={false} + placeholder /> ); }; diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts index c422100d3..71e9bade4 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts @@ -25,7 +25,7 @@ export const SELECT_STATE: DrawerFilterableGroup = { }; export const CHECK_AUTHORITY: DrawerFilterableGroup = { - label: "Type", + label: "Authority", field: "authority.keyword", component: "multiCheck", prefix: "must", @@ -79,7 +79,7 @@ export const DATE_SUBMISSION: DrawerFilterableGroup = { }; export const DATE_RAIRECEIVED: DrawerFilterableGroup = { - label: "Formal RAI Response", + label: "Formal RAI Received", field: "raiReceivedDate", component: "dateRange", prefix: "must", diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts index 995cb9c90..168bbe0e1 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts @@ -11,7 +11,7 @@ export const useFilterExportGroups = () => { const onExport = () => getMainExportData( - url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []) + url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []), ); const headers: opensearch.main.ExportHeader[] = [ @@ -28,7 +28,7 @@ export const useFilterExportGroups = () => { transform: (data) => data.state ?? BLANK_VALUE, }, { - name: "Type", + name: "Authority", transform: (data) => data.authority ?? BLANK_VALUE, }, ...((): opensearch.main.ExportHeader[] => { @@ -80,7 +80,7 @@ export const useFilterExportGroups = () => { : BLANK_VALUE, }, { - name: "Formal RAI Response", + name: "Formal RAI Received", transform: (data) => { return data.raiReceivedDate && !data.raiWithdrawnDate ? formatSeatoolDate(data.raiReceivedDate) diff --git a/src/services/ui/src/components/Table/index.tsx b/src/services/ui/src/components/Table/index.tsx index 2885371bc..ac6011ca7 100644 --- a/src/services/ui/src/components/Table/index.tsx +++ b/src/services/ui/src/components/Table/index.tsx @@ -66,7 +66,7 @@ const TableRow = React.forwardRef< ref={ref} className={cn( "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted", - className + className, )} {...props} /> @@ -86,9 +86,9 @@ const TableHead = React.forwardRef< diff --git a/src/services/ui/src/features/actions/common.tsx b/src/services/ui/src/features/actions/common.tsx index c952d2ccd..3fb75387a 100644 --- a/src/services/ui/src/features/actions/common.tsx +++ b/src/services/ui/src/features/actions/common.tsx @@ -22,7 +22,7 @@ export const PackageInfo = ({ item }: { item: opensearch.main.ItemResult }) => (
{ }, { field: "authority.keyword", - label: "Type", + label: "Authority", cell: (data) => data?.authority ? removeUnderscoresAndCapitalize(data.authority) @@ -84,7 +84,7 @@ export const useSpaTableColumns = (): OsTableColumn[] => { }, { field: "raiReceivedDate", - label: "Formal RAI Response", + label: "Formal RAI Received", cell: (data) => { if (!data.raiReceivedDate || data.raiWithdrawnDate) return null; return formatSeatoolDate(data.raiReceivedDate); diff --git a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx index cc4b70ce6..e84027cdf 100644 --- a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx +++ b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx @@ -30,7 +30,7 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { }, { field: "authority.keyword", - label: "Type", + label: "Authority", cell: (data) => data?.authority ? removeUnderscoresAndCapitalize(data.authority) @@ -91,7 +91,7 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { }, { field: "raiReceivedDate", - label: "Formal RAI Response", + label: "Formal RAI Received", cell: renderCellDate("raiReceivedDate"), }, { @@ -107,7 +107,7 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { }, // hide actions column for: readonly,help desk ...(!CMS_READ_ONLY_ROLES.some((UR) => - props.user?.["custom:cms-roles"].includes(UR) + props.user?.["custom:cms-roles"].includes(UR), ) ? [ { diff --git a/src/services/ui/src/features/package-actions/shared-components.tsx b/src/services/ui/src/features/package-actions/shared-components.tsx index 4705785af..abdbe4d52 100644 --- a/src/services/ui/src/features/package-actions/shared-components.tsx +++ b/src/services/ui/src/features/package-actions/shared-components.tsx @@ -165,7 +165,7 @@ export const PackageSection = () => {

{id}

-

Type

+

Authority

{authority === Authority["1915b"] && "1915(b) Waiver"} {authority === Authority["CHIP_SPA"] && "CHIP SPA"} diff --git a/src/services/ui/src/features/package/admin-changes/index.tsx b/src/services/ui/src/features/package/admin-changes/index.tsx index f60367b9d..816b97fae 100644 --- a/src/services/ui/src/features/package/admin-changes/index.tsx +++ b/src/services/ui/src/features/package/admin-changes/index.tsx @@ -12,7 +12,7 @@ import { BLANK_VALUE } from "@/consts"; import { usePackageDetailsCache } from ".."; export const AC_WithdrawEnabled: FC = ( - props + props, ) => { return (

@@ -26,7 +26,7 @@ export const AC_WithdrawEnabled: FC = ( }; export const AC_WithdrawDisabled: FC = ( - props + props, ) => { return (
@@ -77,15 +77,15 @@ export const AdminChanges = () => { const cache = usePackageDetailsCache(); const data = cache.data.changelog?.filter((CL) => ["disable-rai-withdraw", "enable-rai-withdraw"].includes( - CL._source.actionType - ) + CL._source.actionType, + ), ); if (!data?.length) return <>; return ( diff --git a/src/services/ui/src/features/package/hooks.tsx b/src/services/ui/src/features/package/hooks.tsx new file mode 100644 index 000000000..d88a4dfc6 --- /dev/null +++ b/src/services/ui/src/features/package/hooks.tsx @@ -0,0 +1,42 @@ +import { useGetItem } from "@/api"; +import { removeUnderscoresAndCapitalize } from "@/utils"; +import { useEffect, useLayoutEffect, useState } from "react"; + +export type DetailsSidebarLink = { + id: string; + href: string; + displayName: string; +}; + +export const useDetailsSidebarLinks = ( + dataId: string, +): DetailsSidebarLink[] => { + const { data } = useGetItem(dataId); + const [sideBarLinks, setSideBarLinks] = useState([]); + + useLayoutEffect(() => { + const ids = [ + "package_details", + "package_activity", + "administrative_package_changess", + "appendix_k", + ]; + + // Check if dataId is not undefined before proceeding + if (data?._id) { + const links = ids + .filter((id) => document.getElementById(id) != null) + .map((id) => ({ + id, + href: `?id=${encodeURIComponent(dataId)}#${id}`, + displayName: removeUnderscoresAndCapitalize(id), + })); + + setSideBarLinks(links); + } else { + setSideBarLinks([]); + } + }, [dataId, data]); + + return sideBarLinks; +}; diff --git a/src/services/ui/src/features/package/index.tsx b/src/services/ui/src/features/package/index.tsx index e64d181b6..22d91fd75 100644 --- a/src/services/ui/src/features/package/index.tsx +++ b/src/services/ui/src/features/package/index.tsx @@ -1,163 +1,52 @@ import { CardWithTopBorder, ErrorAlert, LoadingSpinner } from "@/components"; -import { useGetUser } from "@/api/useGetUser"; -import { Authority, opensearch, UserRoles } from "shared-types"; + import { useQuery } from "@/hooks"; import { useGetItem, useGetItemCache } from "@/api"; import { BreadCrumbs } from "@/components/BreadCrumb"; -import { mapActionLabel } from "@/utils"; -import { Outlet } from "react-router-dom"; -import { useGetPackageActions } from "@/api/useGetPackageActions"; import { FC, PropsWithChildren } from "react"; -import { Link } from "@/components/Routing"; import { PackageActivities } from "./package-activity"; import { AdminChanges } from "./admin-changes"; -import { useLocation } from "react-router-dom"; import { PackageDetails } from "./package-details"; import { detailsAndActionsCrumbs } from "../actions"; +import { PackageStatusCard } from "./package-status"; +import { PackageActionsCard } from "./package-actions"; +import { useDetailsSidebarLinks } from "./hooks"; -const DetailCardWrapper = ({ +export const DetailCardWrapper = ({ title, children, }: PropsWithChildren<{ title: string; }>) => ( - -
+ +

{title}

{children}
); -const StatusCard = (data: opensearch.main.Document) => { - const { data: user } = useGetUser(); - return ( - -
-

- {user?.isCms && - !user.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK) - ? data.cmsStatus - : data.stateStatus} -

-
- {data.raiWithdrawEnabled && ( -
-

·

-

- Withdraw Formal RAI Response - Enabled -

-
- )} - - {user?.isCms && data.secondClock && ( -
-

·

-

2nd Clock

-
- )} - - {user?.isCms && data.initialIntakeNeeded && ( -
-

·

-

Initial Intake Needed

-
- )} -
-
-
- ); -}; -const PackageActionsCard: FC = (props) => { - const location = useLocation(); - const { data, isLoading } = useGetPackageActions(props.id, { retry: false }); - if (isLoading) return ; - - return ( - -
- {!data || !data.actions.length ? ( - - No actions are currently available for this submission. - - ) : ( -
    - {data.actions.map((type, idx) => { - if (props.authority === Authority["1915b"]) { - return ( - -
  • {mapActionLabel(type)}
  • - - ); - } else { - return ( - -
  • {mapActionLabel(type)}
  • - - ); - } - })} -
- )} -
-
- ); -}; - export const DetailsContent: FC<{ id: string }> = ({ id }) => { const { data, isLoading, error } = useGetItem(id); if (isLoading) return ; if (!data?._source) return ; if (error) return ; - return ( -
- -
-
- - -
-
- - - -
+
+
+ + +
+
+ + +
); @@ -168,20 +57,27 @@ export const Details = () => { const id = query.get("id") as string; return ( - <> -
+
+
- +
- + +
); }; -export const PackageDetailsWrapper = () => { +const DetailsSidebar: FC<{ id: string }> = ({ id }) => { + const links = useDetailsSidebarLinks(id); + return ( -
- -
+ ); }; diff --git a/src/services/ui/src/features/package/package-actions/index.tsx b/src/services/ui/src/features/package/package-actions/index.tsx new file mode 100644 index 000000000..6121c5983 --- /dev/null +++ b/src/services/ui/src/features/package/package-actions/index.tsx @@ -0,0 +1,59 @@ +import { useGetItem, useGetPackageActions } from "@/api"; +import { LoadingSpinner, Link } from "@/components"; +import { mapActionLabel } from "@/utils"; +import { Authority } from "shared-types"; +import { DetailCardWrapper } from ".."; +import { FC } from "react"; +import { useLocation } from "react-router-dom"; + +export const PackageActionsCard: FC<{ id: string }> = ({ id }) => { + const location = useLocation(); + const item = useGetItem(id); + + const { data, isLoading } = useGetPackageActions(id, { + retry: false, + }); + if (isLoading) return ; + + const authority = item.data?._source.authority; + return ( + +
+ {!data || !data.actions.length ? ( + + No actions are currently available for this submission. + + ) : ( +
    + {data.actions.map((type, idx) => { + if (authority === Authority["1915b"]) { + return ( + +
  • {mapActionLabel(type)}
  • + + ); + } else { + return ( + +
  • {mapActionLabel(type)}
  • + + ); + } + })} +
+ )} +
+
+ ); +}; diff --git a/src/services/ui/src/features/package/package-activity/index.tsx b/src/services/ui/src/features/package/package-activity/index.tsx index 5110fc075..87b17ae25 100644 --- a/src/services/ui/src/features/package/package-activity/index.tsx +++ b/src/services/ui/src/features/package/package-activity/index.tsx @@ -338,7 +338,7 @@ export const PackageActivities = () => { return ( diff --git a/src/services/ui/src/features/package/package-details/appk.tsx b/src/services/ui/src/features/package/package-details/appk.tsx index fc30086b0..5492fe937 100644 --- a/src/services/ui/src/features/package/package-details/appk.tsx +++ b/src/services/ui/src/features/package/package-details/appk.tsx @@ -43,7 +43,7 @@ export const AppK = () => { if (!cache.data.appkChildren) return <>; return ( - <> +
@@ -94,6 +94,6 @@ export const AppK = () => { } /> - +
); }; diff --git a/src/services/ui/src/features/package/package-details/hooks.tsx b/src/services/ui/src/features/package/package-details/hooks.tsx index 468118e80..8e4e6a19c 100644 --- a/src/services/ui/src/features/package/package-details/hooks.tsx +++ b/src/services/ui/src/features/package/package-details/hooks.tsx @@ -1,8 +1,7 @@ -import { removeUnderscoresAndCapitalize } from "@/utils"; import { isCmsUser } from "shared-utils"; import { BLANK_VALUE } from "@/consts"; -import { Authority, opensearch } from "shared-types"; +import { opensearch } from "shared-types"; import { FC, ReactNode } from "react"; import { OneMacUser } from "@/api/useGetUser"; @@ -13,7 +12,7 @@ export const ReviewTeamList: FC = (props) => { const [expanded, setExpanded] = useState(false); const displayTeam = useMemo( () => (expanded ? props.reviewTeam : props.reviewTeam?.slice(0, 3)), - [expanded, props.reviewTeam] + [expanded, props.reviewTeam], ); return !displayTeam || !displayTeam.length ? ( BLANK_VALUE @@ -38,42 +37,52 @@ export type DetailSectionItem = { value: ReactNode; canView: (u: OneMacUser | undefined) => boolean; }; -export const spaDetails = ( - data: opensearch.main.Document +export const recordDetails = ( + data: opensearch.main.Document, ): DetailSectionItem[] => [ - { - label: "Waiver Authority", - value: data.authority, - canView: () => { - return data.authority?.toLowerCase() == Authority.WAIVER; - }, - }, { label: "Submission ID", value: data.id, canView: () => true, }, + { + label: "Authority", + value: data?.authority, + canView: () => true, + }, { label: "State", value: data.state, canView: () => true, }, + { + label: "Subject", + value:

{data?.subject || BLANK_VALUE}

, + canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), + }, { label: "Type", - value: data?.authority - ? removeUnderscoresAndCapitalize(data.authority) + value: data.types + ? data.types.map((T) =>

{T?.SPA_TYPE_NAME}

) + : BLANK_VALUE, + canView: () => true, + }, + { + label: "Subtype", + value: data.subTypes + ? data.subTypes.map((T) =>

{T?.TYPE_NAME}

) : BLANK_VALUE, canView: () => true, }, { - label: "Initial Submission Date", + label: "Initial submission date", value: data.submissionDate ? formatSeatoolDate(data.submissionDate) : BLANK_VALUE, canView: () => true, }, { - label: "Proposed Effective Date", + label: "Proposed effective date", value: data.proposedDate ? formatSeatoolDate(data.proposedDate) : BLANK_VALUE, @@ -82,9 +91,9 @@ export const spaDetails = ( }, }, { - label: "Approved Effective Date", - value: data.approvedEffectiveDate - ? formatSeatoolDate(data.approvedEffectiveDate) + label: "Formal RAI received", + value: data.raiReceivedDate + ? formatSeatoolDate(data.raiReceivedDate) : BLANK_VALUE, canView: () => { return !(data.actionType === "Extend"); @@ -95,8 +104,13 @@ export const spaDetails = ( value: data.statusDate ? formatSeatoolDate(data.statusDate) : BLANK_VALUE, canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), }, +]; + +export const approvedAndAEffectiveDetails = ( + data: opensearch.main.Document, +): DetailSectionItem[] => [ { - label: "Final Disposition Date", + label: "Final disposition date", value: data.finalDispositionDate ? formatSeatoolDate(data.finalDispositionDate) : BLANK_VALUE, @@ -104,31 +118,38 @@ export const spaDetails = ( return !(data.actionType === "Extend"); }, }, + { + label: "Approved effective date", + value: data.approvedEffectiveDate + ? formatSeatoolDate(data.approvedEffectiveDate) + : BLANK_VALUE, + canView: () => true, + }, +]; + +export const descriptionDetails = ( + data: opensearch.main.Document, +): DetailSectionItem[] => [ + { + label: "Description", + value: data.description ?? BLANK_VALUE, + canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), + }, ]; export const submissionDetails = ( - data: opensearch.main.Document + data: opensearch.main.Document, ): DetailSectionItem[] => [ { - label: "Submitted By", + label: "Submitted by", value:

{data?.submitterName || BLANK_VALUE}

, canView: () => true, }, { - label: "Submission Source", + label: "Submission source", value:

{data?.origin || BLANK_VALUE}

, canView: () => true, }, - { - label: "Subject", - value:

{data?.subject || BLANK_VALUE}

, - canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), - }, - { - label: "Description", - value:

{data?.description || BLANK_VALUE}

, - canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), - }, { label: "CPOC", value:

{data?.leadAnalystName || BLANK_VALUE}

, diff --git a/src/services/ui/src/features/package/package-details/index.tsx b/src/services/ui/src/features/package/package-details/index.tsx index cc10cd3af..7187581c5 100644 --- a/src/services/ui/src/features/package/package-details/index.tsx +++ b/src/services/ui/src/features/package/package-details/index.tsx @@ -1,31 +1,43 @@ import { DetailsSection } from "@/components"; -import { spaDetails, submissionDetails } from "./hooks"; +import { + approvedAndAEffectiveDetails, + descriptionDetails, + recordDetails, + submissionDetails, +} from "./hooks"; import { FC } from "react"; import { DetailSectionItem } from "./hooks"; import { useGetUser } from "@/api/useGetUser"; import { AppK } from "./appk"; +import { cn } from "@/utils"; import { usePackageDetailsCache } from ".."; -export const DetailItemsGrid: FC<{ displayItems: DetailSectionItem[] }> = ( - props -) => { +export const DetailItemsGrid: FC<{ + displayItems: DetailSectionItem[]; + fullWidth?: boolean; + containerStyle?: string; +}> = (props) => { const { data: user } = useGetUser(); return ( - <> -
- {props.displayItems.map(({ label, value, canView }) => { - return !canView(user) ? null : ( -
-

{label}

+
+ {props.displayItems.map(({ label, value, canView }) => { + return !canView(user) ? null : ( +
+

{label}

+
{value}
- ); - })} -
-
- +
+ ); + })} +
); }; @@ -33,12 +45,20 @@ export const PackageDetails = () => { const { data } = usePackageDetailsCache(); return ( - - - +
+ + + +
+ + +
); }; diff --git a/src/services/ui/src/features/package/package-status/index.tsx b/src/services/ui/src/features/package/package-status/index.tsx new file mode 100644 index 000000000..00c19fba7 --- /dev/null +++ b/src/services/ui/src/features/package/package-status/index.tsx @@ -0,0 +1,48 @@ +import { useGetItem, useGetUser } from "@/api"; +import { UserRoles } from "shared-types"; +import { DetailCardWrapper } from ".."; +import { FC } from "react"; + +export const PackageStatusCard: FC<{ id: string }> = ({ id }) => { + const { data } = useGetItem(id); + const { data: user } = useGetUser(); + + if (!data) return null; + + return ( + +
+
+ {user?.isCms && + !user.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK) + ? data?._source.cmsStatus + : data?._source.stateStatus} +
+
+ {data._source.raiWithdrawEnabled && ( +
+

·

+

+ Withdraw Formal RAI Response - Enabled +

+
+ )} + + {user?.isCms && data._source.secondClock && ( +
+

·

+

2nd Clock

+
+ )} + + {user?.isCms && data._source.initialIntakeNeeded && ( +
+

·

+

Initial Intake Needed

+
+ )} +
+
+
+ ); +}; diff --git a/src/services/ui/src/features/submission/shared-components/AdditionalInfoInput.tsx b/src/services/ui/src/features/submission/shared-components/AdditionalInfoInput.tsx index eaecb3aa1..884ed5117 100644 --- a/src/services/ui/src/features/submission/shared-components/AdditionalInfoInput.tsx +++ b/src/services/ui/src/features/submission/shared-components/AdditionalInfoInput.tsx @@ -18,9 +18,8 @@ export function AdditionalInfoInput({ name={name} render={({ field }) => ( - - Add anything else you would like to share with CMS, limited to - 4000 characters + + Add anything else you would like to share with CMS diff --git a/src/services/ui/src/features/submission/shared-components/DescriptionInput.tsx b/src/services/ui/src/features/submission/shared-components/DescriptionInput.tsx index 6ff44412f..1167b257a 100644 --- a/src/services/ui/src/features/submission/shared-components/DescriptionInput.tsx +++ b/src/services/ui/src/features/submission/shared-components/DescriptionInput.tsx @@ -4,22 +4,29 @@ import { Control, FieldValues, Path } from "react-hook-form"; type DescriptionInputProps = { control: Control; name: Path; + helperText: string; }; export function DescriptionInput({ control, name, + helperText, }: DescriptionInputProps) { return ( ( - + Description - +

{helperText}

+ +
)} diff --git a/src/services/ui/src/features/submission/shared-components/SubTypeSelect.tsx b/src/services/ui/src/features/submission/shared-components/SubTypeSelect.tsx index b3477c141..2619e80f6 100644 --- a/src/services/ui/src/features/submission/shared-components/SubTypeSelect.tsx +++ b/src/services/ui/src/features/submission/shared-components/SubTypeSelect.tsx @@ -1,54 +1,81 @@ -import { useSeaTypes } from "@/api"; +import { useEffect, useMemo } from "react"; +import { useGetSubTypes } from "@/api"; import * as Inputs from "@/components/Inputs"; -import { Control, FieldValues, Path } from "react-hook-form"; -import { opensearch } from "shared-types"; +import { useFormContext, useWatch } from "react-hook-form"; +import Select from "react-select"; +import { uniqBy } from "lodash"; -type SubTypeSelectFormFieldProps = { - control: Control; - name: Path; +type SubTypeSelectFormFieldProps = { authorityId: number; - typeId: string; }; +type SelectOption = { + value: number; + label: string; +}; + +export function SubTypeSelect({ authorityId }: SubTypeSelectFormFieldProps) { + const { control, setValue } = useFormContext(); + const typeIds = useWatch({ name: "typeIds", defaultValue: [] }); + const subTypeIds = useWatch({ + name: "subTypeIds", + defaultValue: [], + }); + + const { data } = useGetSubTypes(authorityId, typeIds); -export function SubTypeSelect({ - control, - typeId, - name, - authorityId, -}: SubTypeSelectFormFieldProps) { - const { data } = useSeaTypes( - authorityId, - typeId + const options = useMemo( + () => + uniqBy(data, "name").map((item) => ({ + value: item.id, + label: item.name, + })), + [data], ); + useEffect(() => { + const validValues = typeIds?.filter((val: number) => + options.find((option) => option.value === val), + ); + + if (validValues.length > 0) { + setValue("subTypeIds", validValues, { shouldValidate: true }); + } + if (typeIds.length === 0) { + setValue("subTypeIds", []); + } + }, [options, typeIds, data]); + return ( ( - + name={"subTypeIds"} + render={() => ( + - Sub Type + Subtype - - - - - - - - {data && - data.map((T) => ( - - {T.name} - - ))} - - +

+ You may select more than one +

+ + options?.find((O) => O.value === id), + ) + : [] + } + onChange={(val) => + field.onChange(val.map((v: SelectOption) => v.value)) + } + options={options} + closeMenuOnSelect={false} + className="border border-black shadow-sm rounded-sm" + placeholder="- Select -" + /> + +
+ ); + }} /> ); } diff --git a/src/services/ui/src/features/submission/spa/chip-intitial.tsx b/src/services/ui/src/features/submission/spa/chip-intitial.tsx index 5db58054d..17701638c 100644 --- a/src/services/ui/src/features/submission/spa/chip-intitial.tsx +++ b/src/services/ui/src/features/submission/spa/chip-intitial.tsx @@ -30,16 +30,29 @@ import { } from "@/utils"; import { useQuery as useQueryString } from "@/hooks"; -import { AdditionalInfoInput } from "../shared-components"; +import { + DescriptionInput, + SubjectInput, + TypeSelect, + SubTypeSelect, + AdditionalInfoInput, +} from "../shared-components"; const formSchema = z.object({ id: zSpaIdSchema, additionalInformation: z.string().max(4000).optional(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string(), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ currentStatePlan: zAttachmentRequired({ min: 1 }), amendedLanguage: zAttachmentRequired({ min: 1 }), @@ -52,6 +65,7 @@ const formSchema = z.object({ proposedEffectiveDate: z.date(), seaActionType: z.string().default("Amend"), }); + type ChipFormSchema = z.infer; // first argument in the array is the name that will show up in the form submission @@ -111,7 +125,7 @@ export const ChipSpaFormPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -148,8 +162,9 @@ export const ChipSpaFormPage = () => {
- + { if (e.target instanceof HTMLInputElement) { @@ -181,21 +196,22 @@ export const ChipSpaFormPage = () => { )} /> - {/* TODO: FFF */} - {/* - + - - - */} + @@ -214,7 +230,10 @@ export const ChipSpaFormPage = () => { At least one attachment is required )} - + )} diff --git a/src/services/ui/src/features/submission/spa/medicaid-initial.tsx b/src/services/ui/src/features/submission/spa/medicaid-initial.tsx index 4d67153ec..51487f593 100644 --- a/src/services/ui/src/features/submission/spa/medicaid-initial.tsx +++ b/src/services/ui/src/features/submission/spa/medicaid-initial.tsx @@ -41,11 +41,18 @@ import { const formSchema = z.object({ id: zSpaIdSchema, additionalInformation: z.string().max(4000).optional(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string(), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ cmsForm179: zAttachmentRequired({ min: 1, @@ -121,7 +128,7 @@ export const MedicaidSpaFormPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -157,8 +164,9 @@ export const MedicaidSpaFormPage = () => {
- + { if (e.target instanceof HTMLInputElement) { @@ -190,21 +198,24 @@ export const MedicaidSpaFormPage = () => { )} /> - {/* TODO: FFF */} - {/* - + - - - */} + { : ""} } - + )} diff --git a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-amendment.tsx b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-amendment.tsx index a6f362296..486696fae 100644 --- a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-amendment.tsx +++ b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-amendment.tsx @@ -36,17 +36,25 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features/submission/shared-components"; const formSchema = z.object({ waiverNumber: zAmendmentOriginalWaiverNumberSchema, id: zAmendmentWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -96,7 +104,7 @@ export const Capitated1915BWaiverAmendmentPage = () => { }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -115,7 +123,7 @@ export const Capitated1915BWaiverAmendmentPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -127,6 +135,8 @@ export const Capitated1915BWaiverAmendmentPage = () => { resolver: zodResolver(formSchema), }); + console.log(form.formState); + return ( @@ -230,16 +240,24 @@ export const Capitated1915BWaiverAmendmentPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -254,7 +272,10 @@ export const Capitated1915BWaiverAmendmentPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-initial.tsx b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-initial.tsx index 66c391b0f..a26b9b3c5 100644 --- a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-initial.tsx +++ b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-initial.tsx @@ -33,16 +33,24 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features/submission/shared-components"; const formSchema = z.object({ id: zInitialWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -93,7 +101,7 @@ export const Capitated1915BWaiverInitialPage = () => { navigate(originPath ? { path: originPath } : { path: "/dashboard" }); }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { console.log("testing"); @@ -113,7 +121,7 @@ export const Capitated1915BWaiverInitialPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -199,16 +207,24 @@ export const Capitated1915BWaiverInitialPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -223,7 +239,10 @@ export const Capitated1915BWaiverInitialPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-renewal.tsx b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-renewal.tsx index 1fc1fc8c6..f33224911 100644 --- a/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-renewal.tsx +++ b/src/services/ui/src/features/submission/waiver/capitated/capitated-1915-b-waiver-renewal.tsx @@ -36,6 +36,7 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features/submission/shared-components"; const formSchema = z @@ -43,11 +44,18 @@ const formSchema = z waiverNumber: zRenewalOriginalWaiverNumberSchema, id: zRenewalWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -122,7 +130,7 @@ export const Capitated1915BWaiverRenewalPage = () => { navigate(originPath ? { path: originPath } : { path: "/dashboard" }); }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { // AK-0260.R04.02 @@ -142,7 +150,7 @@ export const Capitated1915BWaiverRenewalPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -259,16 +267,24 @@ export const Capitated1915BWaiverRenewalPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -283,7 +299,10 @@ export const Capitated1915BWaiverRenewalPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-amendment.tsx b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-amendment.tsx index 955dad7fb..47aedcc88 100644 --- a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-amendment.tsx +++ b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-amendment.tsx @@ -36,17 +36,25 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features"; const formSchema = z.object({ waiverNumber: zAmendmentOriginalWaiverNumberSchema, id: zAmendmentWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), tribalConsultation: zAttachmentOptional, @@ -92,7 +100,7 @@ export const Contracting1915BWaiverAmendmentPage = () => { navigate(originPath ? { path: originPath } : { path: "/dashboard" }); }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -111,7 +119,7 @@ export const Contracting1915BWaiverAmendmentPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -226,16 +234,24 @@ export const Contracting1915BWaiverAmendmentPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -250,7 +266,10 @@ export const Contracting1915BWaiverAmendmentPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-initial.tsx b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-initial.tsx index 494131f44..96504db20 100644 --- a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-initial.tsx +++ b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-initial.tsx @@ -35,16 +35,24 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features"; const formSchema = z.object({ id: zInitialWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), tribalConsultation: zAttachmentOptional, @@ -89,7 +97,7 @@ export const Contracting1915BWaiverInitialPage = () => { navigate(originPath ? { path: originPath } : { path: "/dashboard" }); }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -108,7 +116,7 @@ export const Contracting1915BWaiverInitialPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -194,16 +202,24 @@ export const Contracting1915BWaiverInitialPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -217,7 +233,10 @@ export const Contracting1915BWaiverInitialPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-renewal.tsx b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-renewal.tsx index e11d656f9..a7aeb11c0 100644 --- a/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-renewal.tsx +++ b/src/services/ui/src/features/submission/waiver/contracting/contracting-1915-b-waiver-renewal.tsx @@ -36,6 +36,7 @@ import { DescriptionInput, SubTypeSelect, SubjectInput, + TypeSelect, } from "@/features"; const formSchema = z @@ -43,11 +44,18 @@ const formSchema = z waiverNumber: zRenewalOriginalWaiverNumberSchema, id: zRenewalWaiverNumberSchema, proposedEffectiveDate: z.date(), - // TODO: FFF - // subject: z.string(), - // description: z.string(), - // typeId: z.string().default("111"), - // subTypeId: z.string(), + subject: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(120, { message: "Subject should be under 120 characters" }), + description: z + .string() + .trim() + .min(1, { message: "This field is required" }) + .max(4000, { message: "Description should be under 4000 characters" }), + typeIds: z.array(z.number()).min(1, { message: "Required" }), + subTypeIds: z.array(z.number()).min(1, { message: "Required" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), b4IndependentAssessment: zAttachmentOptional, @@ -115,7 +123,7 @@ export const Contracting1915BWaiverRenewalPage = () => { navigate(originPath ? { path: originPath } : { path: "/dashboard" }); }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { // AK-0260.R04.02 @@ -135,7 +143,7 @@ export const Contracting1915BWaiverRenewalPage = () => { // when any queries are added, such as the case of /details?id=... urlQuery.get(ORIGIN) ? originRoute[urlQuery.get(ORIGIN)! as Origin] - : "/dashboard" + : "/dashboard", ); navigate(originPath ? { path: originPath } : { path: "/dashboard" }); } catch (e) { @@ -252,16 +260,24 @@ export const Contracting1915BWaiverRenewalPage = () => { )} /> - {/* // TODO: FFF */} - {/* + + + - - - */} @@ -276,7 +292,10 @@ export const Contracting1915BWaiverRenewalPage = () => { {label} {required ? : null} - + )} diff --git a/src/services/ui/testing/setup.ts b/src/services/ui/testing/setup.ts index 513954661..e66d2524d 100644 --- a/src/services/ui/testing/setup.ts +++ b/src/services/ui/testing/setup.ts @@ -1,4 +1,4 @@ -import { expect, afterEach } from "vitest"; +import { expect, afterEach, beforeAll, afterAll, vi } from "vitest"; import { cleanup } from "@testing-library/react"; import * as matchers from "@testing-library/jest-dom/matchers"; @@ -6,6 +6,17 @@ import * as matchers from "@testing-library/jest-dom/matchers"; expect.extend(matchers); // runs a cleanup after each test case (e.g. clearing jsdom) + +// Add this to remove all the expected errors in console when running unit tests. +beforeAll(() => { + // eslint-disable-next-line @typescript-eslint/no-empty-function + vi.spyOn(console, "error").mockImplementation(() => {}); +}); + afterEach(() => { cleanup(); }); + +afterAll(() => { + vi.restoreAllMocks(); +}); diff --git a/yarn.lock b/yarn.lock index 5f561132d..cccad1856 100644 --- a/yarn.lock +++ b/yarn.lock @@ -33,12 +33,12 @@ integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== "@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" "@anatine/zod-mock@^3.12.0": version "3.13.3" @@ -461,56 +461,7 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/client-cloudformation@^3.128.0", "@aws-sdk/client-cloudformation@^3.137.0", "@aws-sdk/client-cloudformation@^3.245.0", "@aws-sdk/client-cloudformation@^3.410.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.521.0.tgz#314e5ea93a59ca6fb9cc01dd7b844dcfe19a0870" - integrity sha512-+2LUWVwZRX8XDRbA07pPiCNRZqHxQACQz8kttFoZc0yRRC6P3us0eVUeAEAUB57teEoQAo3Ak5/+lqEJkLEzSg== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-body-length-browser" "^2.1.1" - "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" - fast-xml-parser "4.2.5" - tslib "^2.5.0" - uuid "^9.0.1" - -"@aws-sdk/client-cloudformation@^3.526.0": +"@aws-sdk/client-cloudformation@^3.128.0", "@aws-sdk/client-cloudformation@^3.137.0", "@aws-sdk/client-cloudformation@^3.245.0", "@aws-sdk/client-cloudformation@^3.410.0", "@aws-sdk/client-cloudformation@^3.526.0": version "3.526.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudformation/-/client-cloudformation-3.526.0.tgz#229b48a1530b09964e5121653c649cc8e8eced0c" integrity sha512-Zz6swHfQdauuCJY3j+5SUPMFWTxgpAWN3x5dl/8jdn0Q1GdiWzZ0/5+jZr83mE7ola3UUH3LP/cw1UIljJO0ZA== @@ -597,97 +548,97 @@ tslib "^2.0.0" "@aws-sdk/client-cloudwatch@^3.209.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.521.0.tgz#cfeebedd06ec5c30a279b477fcfa46b172a57820" - integrity sha512-1UXtcxjRDW8eORQtNjw/TlnPuEaFoL7ppJokuY6KmOc1RVsYWpWBZm2Qbbclq1/LaZjtQStXF2Ho96Tl21x70A== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.525.0.tgz#31cc2cd1e32986c855955c172f4e313cf195265f" + integrity sha512-qi73IN/cGDxixHKnO99UIzGhYshStPXsZou8PNp0ee6ZJgyEpwtj1lFAoAEAbYcD0/PjtXsVNCOpyA1VXNjDDQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-compression" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-compression" "^2.1.4" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" + "@smithy/util-waiter" "^2.1.3" fast-xml-parser "4.2.5" tslib "^2.5.0" "@aws-sdk/client-cognito-identity-provider@^3.350.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.521.0.tgz#41744d1c2b1157342c21d280a289cbed429b7268" - integrity sha512-lDM8eAc9hkVoxatHk5hpLNv/G0z0e/LBoH763aXcy8C35fncURRS2pOXbmOHp2gC5kOsTmIwhHOcyBHg3aw6WA== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity-provider/-/client-cognito-identity-provider-3.525.0.tgz#98b35c6857d623a71c0ff5e7240846c0f918483e" + integrity sha512-i15QHM2GM0uahR135/Q0xTl3UyV5y8X+d3FTJcjdWlQhgUQJRXP6k5nssvoDW2DrJLwNRYDZvVmVV9wzTJlp+w== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" @@ -729,55 +680,6 @@ tslib "^2.0.0" uuid "^3.0.0" -"@aws-sdk/client-dynamodb@^3.276.0", "@aws-sdk/client-dynamodb@^3.281.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.521.0.tgz#cc508ab6ca8e387e77606123b38cd5cd1bb416ac" - integrity sha512-3DhEUrmyq/KbLBbgIuup1EC0/25RD6yTa5MqOrNM8A84xarS2Ws8lMceKFbzwJlQrudVA/PAmfs1CCa4UnGCtg== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-endpoint-discovery" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-body-length-browser" "^2.1.1" - "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" - tslib "^2.5.0" - uuid "^9.0.1" - "@aws-sdk/client-firehose@3.6.1": version "3.6.1" resolved "https://registry.yarnpkg.com/@aws-sdk/client-firehose/-/client-firehose-3.6.1.tgz#87a8ef0c18267907b3ce712e6d3de8f36b0a7c7b" @@ -816,50 +718,50 @@ tslib "^2.0.0" "@aws-sdk/client-iam@^3.316.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.521.0.tgz#a9ea3aad26e019fd08fc4e852848c40cd8814f2b" - integrity sha512-5ljHk6hhRPfAR13iE1/LGVdcAamXdDEd2eVeltV+BO0iBcm8sh0t/0WCQUqZ7hgOasDoGew+0C8gYTAkU+IaUw== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-iam/-/client-iam-3.525.0.tgz#544e981aaba4048a3621c1a3ebc71572099ecb27" + integrity sha512-h705ebOYcgZWN9a4Pdkwd7DAPK4KTEGEFtXEj2FoaadBYBcR9r5yffm7umHZv9gOCHxFMaap8/NSZXirF2VHKg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" + "@smithy/util-waiter" "^2.1.3" fast-xml-parser "4.2.5" tslib "^2.5.0" @@ -905,54 +807,54 @@ tslib "^2.0.0" "@aws-sdk/client-lambda@^3.363.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.521.0.tgz#a0e760bde773684e4c928f61119de63dd6d612d6" - integrity sha512-05EGAvDtTNa8IZ+Jh9UtR5qh7K9jIGeSyCKQps4yFa0+fEDIglnRMtymzeRb6RksT3PerV4GOm+yKEKtV5XpCQ== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-lambda/-/client-lambda-3.525.0.tgz#775afcb51c1a1f9112f6f4c40a23e67279920094" + integrity sha512-Jsz2F6X6DBV962T4wTyQgP2KqsIS3Hxw6shC5653tapCrR+AK2psFpeKs9w3SQA8D0SnEOAQf/5ay4n9sL+fZw== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/eventstream-serde-browser" "^2.1.2" - "@smithy/eventstream-serde-config-resolver" "^2.1.2" - "@smithy/eventstream-serde-node" "^2.1.2" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/eventstream-serde-browser" "^2.1.3" + "@smithy/eventstream-serde-config-resolver" "^2.1.3" + "@smithy/eventstream-serde-node" "^2.1.3" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-stream" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-stream" "^2.1.3" "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" + "@smithy/util-waiter" "^2.1.3" tslib "^2.5.0" "@aws-sdk/client-lex-runtime-service@3.186.3": @@ -1193,302 +1095,257 @@ tslib "^2.0.0" "@aws-sdk/client-s3@^3.128.0", "@aws-sdk/client-s3@^3.137.0", "@aws-sdk/client-s3@^3.383.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.521.0.tgz#a8ff7a5bd5b07903885b0ecd4df15da9f24aac4f" - integrity sha512-txSfcxezAIW72dgRfhX+plc/lMouilY/QFVne/Cv01SL8Tzclcyp7T7LtkV7aSO4Tb9CUScHdqwWOfjZzCm/yQ== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.525.0.tgz#965ed5b70c067d74c7a3c4aea26dfce53db4cd06" + integrity sha512-hoMGH8G9rezZDiJPsMjsyRVNfVHHa4u6lcZ09SQMmtFHWK0FUcC0DIKR5ripV5qGDbnV54i2JotXlLzAv0aNCQ== dependencies: "@aws-crypto/sha1-browser" "3.0.0" "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-bucket-endpoint" "3.521.0" - "@aws-sdk/middleware-expect-continue" "3.521.0" - "@aws-sdk/middleware-flexible-checksums" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-location-constraint" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-sdk-s3" "3.521.0" - "@aws-sdk/middleware-signing" "3.521.0" - "@aws-sdk/middleware-ssec" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/signature-v4-multi-region" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@aws-sdk/xml-builder" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/eventstream-serde-browser" "^2.1.2" - "@smithy/eventstream-serde-config-resolver" "^2.1.2" - "@smithy/eventstream-serde-node" "^2.1.2" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-blob-browser" "^2.1.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/hash-stream-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/md5-js" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-bucket-endpoint" "3.525.0" + "@aws-sdk/middleware-expect-continue" "3.523.0" + "@aws-sdk/middleware-flexible-checksums" "3.523.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-location-constraint" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-sdk-s3" "3.525.0" + "@aws-sdk/middleware-signing" "3.523.0" + "@aws-sdk/middleware-ssec" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/signature-v4-multi-region" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@aws-sdk/xml-builder" "3.523.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/eventstream-serde-browser" "^2.1.3" + "@smithy/eventstream-serde-config-resolver" "^2.1.3" + "@smithy/eventstream-serde-node" "^2.1.3" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-blob-browser" "^2.1.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/hash-stream-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/md5-js" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-stream" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-retry" "^2.1.3" + "@smithy/util-stream" "^2.1.3" "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" + "@smithy/util-waiter" "^2.1.3" fast-xml-parser "4.2.5" tslib "^2.5.0" "@aws-sdk/client-secrets-manager@^3.410.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.521.0.tgz#e3965b2569950bc2cb187037451cd0ac80292b52" - integrity sha512-C01O7Ep06lL3pEhvsEwLjCHTt4ARA5NmCqQlVg/NVPkWTA3RX/GgvaqKu+HMFeTRoipTdOvdril+weBLIWFKAg== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.525.0.tgz#ec2c217b15b3890bca61bf5f471ddec766ca2c03" + integrity sha512-YhPfH87BWGNrkfV7VkP1EyjNzPkgqxen5aBqQKgJOxPy1M2+kNjqB9zQ/B/Q3T6cyQ/aduQ7Bi7bm3cqihmtbA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" uuid "^9.0.1" "@aws-sdk/client-securityhub@^3.317.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-securityhub/-/client-securityhub-3.521.0.tgz#2a3873c5639139ee47d8b3210e772a55286aaed6" - integrity sha512-eqLybSl/k7xCDBjVL206gA4wz5SFVUz5vW6pW/LL9BLQnSqtho41Oiv0obG021u5WZkj0S3uUBt8XJDWbQWhDw== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-securityhub/-/client-securityhub-3.525.0.tgz#76b70efe16230db973aa6a9a9c59f8bd4cf5a8d4" + integrity sha512-Ry1NO5Tl7A9Q4elwZJFdNpcE4aMC8kj8U0+BejrvpDUcINjxhziUZMXnX9sgykkKUR20aXBO8GzpWDYj73XdeA== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" "@aws-sdk/client-ses@^3.499.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ses/-/client-ses-3.521.0.tgz#8673354b40b7816b4d1d1049c416df073e0ba40e" - integrity sha512-rQRmiMOh6v80sMNK2xx46ZL7z7B6VuTUwzggimOkgwUMLYEGWndKojKnkTrt0kPRB4Mx+WHKDIOLx6bDI82oKw== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ses/-/client-ses-3.525.0.tgz#ffb4c21a82e07f36d7dc24c2203d7e18bde6f9f7" + integrity sha512-wvsj/NiEyweJYns14RDwg4UCbCAba4rYgW9ESpCVZ3cx+deUqNUbfU+YcYrfZNcqApq42LPcSubU1Ynh/QHEsg== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" - "@smithy/util-waiter" "^2.1.2" + "@smithy/util-waiter" "^2.1.3" fast-xml-parser "4.2.5" tslib "^2.5.0" "@aws-sdk/client-sfn@^3.511.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.521.0.tgz#85060175f00aed2aec9362828bd826f06c1bd7c3" - integrity sha512-IzL0FqVwwTP1zX5qYtrL5ibLlNtDiw6OYPLgxDXtrTn8/n4eTq3yuDkS8ngxpW/hV2Zy3qyvSR7NrXrfIZtrVw== + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.525.0.tgz#8edd1a72bfbfa6b8c6414ba6ad034a6074695198" + integrity sha512-YMIV38S9GxyVaEJvWYj7+BZPjEUfyQAQSYqfr8uretW1vhFUjDS9+P/uCFMbBZ8HnALkX0/4G2VbkfSlU6UZJQ== dependencies: "@aws-crypto/sha256-browser" "3.0.0" "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/credential-provider-node" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" + "@aws-sdk/client-sts" "3.525.0" + "@aws-sdk/core" "3.525.0" + "@aws-sdk/credential-provider-node" "3.525.0" + "@aws-sdk/middleware-host-header" "3.523.0" + "@aws-sdk/middleware-logger" "3.523.0" + "@aws-sdk/middleware-recursion-detection" "3.523.0" + "@aws-sdk/middleware-user-agent" "3.525.0" + "@aws-sdk/region-config-resolver" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-endpoints" "3.525.0" + "@aws-sdk/util-user-agent-browser" "3.523.0" + "@aws-sdk/util-user-agent-node" "3.525.0" + "@smithy/config-resolver" "^2.1.4" + "@smithy/core" "^1.3.5" + "@smithy/fetch-http-handler" "^2.4.3" + "@smithy/hash-node" "^2.1.3" + "@smithy/invalid-dependency" "^2.1.3" + "@smithy/middleware-content-length" "^2.1.3" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/middleware-retry" "^2.1.4" + "@smithy/middleware-serde" "^2.1.3" + "@smithy/middleware-stack" "^2.1.3" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/node-http-handler" "^2.4.1" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" + "@smithy/url-parser" "^2.1.3" "@smithy/util-base64" "^2.1.1" "@smithy/util-body-length-browser" "^2.1.1" "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" + "@smithy/util-defaults-mode-browser" "^2.1.4" + "@smithy/util-defaults-mode-node" "^2.2.3" + "@smithy/util-endpoints" "^1.1.4" + "@smithy/util-middleware" "^2.1.3" + "@smithy/util-retry" "^2.1.3" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" uuid "^9.0.1" -"@aws-sdk/client-sso-oidc@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.521.0.tgz#455cf62ccc0bba8fabd00f0b540cd9e51a24cd93" - integrity sha512-MhX0CjV/543MR7DRPr3lA4ZDpGGKopp8cyV4EkSGXB7LMN//eFKKDhuZDlpgWU+aFe2A3DIqlNJjqgs08W0cSA== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-body-length-browser" "^2.1.1" - "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-utf8" "^2.1.1" - tslib "^2.5.0" - "@aws-sdk/client-sso-oidc@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.525.0.tgz#0f80242d997adc7cf259f50f9e590d515a123fac" @@ -1571,50 +1428,6 @@ "@aws-sdk/util-utf8-node" "3.186.0" tslib "^2.3.1" -"@aws-sdk/client-sso@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.521.0.tgz#b28fd6a974f4c6ddca6151df0b7954bbf72dd6d3" - integrity sha512-aEx8kEvWmTwCja6hvIZd5PvxHsI1HQZkckXhw1UrkDPnfcAwQoQAgselI7D+PVT5qQDIjXRm0NpsvBLaLj6jZw== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-body-length-browser" "^2.1.1" - "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-utf8" "^2.1.1" - tslib "^2.5.0" - "@aws-sdk/client-sso@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.525.0.tgz#2af5028a56a72a8067cb6b149ca1cc433beb9fa4" @@ -1701,52 +1514,7 @@ fast-xml-parser "4.2.5" tslib "^2.3.1" -"@aws-sdk/client-sts@3.521.0", "@aws-sdk/client-sts@^3.100.0", "@aws-sdk/client-sts@^3.316.0", "@aws-sdk/client-sts@^3.382.0", "@aws-sdk/client-sts@^3.4.1", "@aws-sdk/client-sts@^3.410.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.521.0.tgz#d58a2b3c6b0b16c487e41fdcd41df43ec8b56fad" - integrity sha512-f1J5NDbntcwIHJqhks89sQvk7UXPmN0X0BZ2mgpj6pWP+NlPqy+1t1bia8qRhEuNITaEigoq6rqe9xaf4FdY9A== - dependencies: - "@aws-crypto/sha256-browser" "3.0.0" - "@aws-crypto/sha256-js" "3.0.0" - "@aws-sdk/core" "3.521.0" - "@aws-sdk/middleware-host-header" "3.521.0" - "@aws-sdk/middleware-logger" "3.521.0" - "@aws-sdk/middleware-recursion-detection" "3.521.0" - "@aws-sdk/middleware-user-agent" "3.521.0" - "@aws-sdk/region-config-resolver" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@aws-sdk/util-user-agent-browser" "3.521.0" - "@aws-sdk/util-user-agent-node" "3.521.0" - "@smithy/config-resolver" "^2.1.2" - "@smithy/core" "^1.3.3" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/hash-node" "^2.1.2" - "@smithy/invalid-dependency" "^2.1.2" - "@smithy/middleware-content-length" "^2.1.2" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-body-length-browser" "^2.1.1" - "@smithy/util-body-length-node" "^2.2.1" - "@smithy/util-defaults-mode-browser" "^2.1.2" - "@smithy/util-defaults-mode-node" "^2.2.1" - "@smithy/util-endpoints" "^1.1.2" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - "@smithy/util-utf8" "^2.1.1" - fast-xml-parser "4.2.5" - tslib "^2.5.0" - -"@aws-sdk/client-sts@3.525.0": +"@aws-sdk/client-sts@3.525.0", "@aws-sdk/client-sts@^3.100.0", "@aws-sdk/client-sts@^3.316.0", "@aws-sdk/client-sts@^3.382.0", "@aws-sdk/client-sts@^3.4.1", "@aws-sdk/client-sts@^3.410.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.525.0.tgz#5c59c39950f24d9fb4a42b226ada6a72955c0672" integrity sha512-a8NUGRvO6rkfTZCbMaCsjDjLbERCwIUU9dIywFYcRgbFhkupJ7fSaZz3Het98U51M9ZbTEpaTa3fz0HaJv8VJw== @@ -1886,18 +1654,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/core@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.521.0.tgz#56aaed5714a5145055983f08362c2dfeaf275769" - integrity sha512-KovKmW7yg/P2HVG2dhV2DAJLyoeGelgsnSGHaktXo/josJ3vDGRNqqRSgVaqKFxnD98dPEMLrjkzZumNUNGvLw== - dependencies: - "@smithy/core" "^1.3.3" - "@smithy/protocol-http" "^3.2.0" - "@smithy/signature-v4" "^2.1.1" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/core@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/core/-/core-3.525.0.tgz#710740ff96551e04f595fc156a40b54793a37b01" @@ -1919,17 +1675,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.521.0", "@aws-sdk/credential-provider-env@^3.78.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.521.0.tgz#abef98938e0013d4dcc34a546c50e1fd5593a9ca" - integrity sha512-OwblTJNdDAoqYVwcNfhlKDp5z+DINrjBfC6ZjNdlJpTXgxT3IqzuilTJTlydQ+2eG7aXfV9OwTVRQWdCmzFuKA== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-env@3.523.0": +"@aws-sdk/credential-provider-env@3.523.0", "@aws-sdk/credential-provider-env@^3.78.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.523.0.tgz#4bc04b32c15ff7237ba1de866b96ccea24e433c7" integrity sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA== @@ -1948,21 +1694,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/credential-provider-http@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.521.0.tgz#a189f2ced504bccedbe57cb911f64a8c1bb77b3c" - integrity sha512-yJM1yNGj2XFH8v6/ffWrFY5nC3/2+8qZ8c4mMMwZru8bYXeuSV4+NNfE59HUWvkAF7xP76u4gr4I8kNrMPTlfg== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/util-stream" "^2.1.2" - tslib "^2.5.0" - "@aws-sdk/credential-provider-http@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-http/-/credential-provider-http-3.525.0.tgz#3a785ea8724200596ad1a48cf8485658401eb589" @@ -2020,24 +1751,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-ini@3.521.0", "@aws-sdk/credential-provider-ini@^3.100.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.521.0.tgz#936201cc56ccc50a5a412f97f3a0867e3017d477" - integrity sha512-HuhP1AlKgvBBxUIwxL/2DsDemiuwgbz1APUNSeJhDBF6JyZuxR0NU8zEZkvH9b4ukTcmcKGABpY0Wex4rAh3xw== - dependencies: - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/credential-provider-env" "3.521.0" - "@aws-sdk/credential-provider-process" "3.521.0" - "@aws-sdk/credential-provider-sso" "3.521.0" - "@aws-sdk/credential-provider-web-identity" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/credential-provider-imds" "^2.2.1" - "@smithy/property-provider" "^2.1.1" - "@smithy/shared-ini-file-loader" "^2.3.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-ini@3.525.0": +"@aws-sdk/credential-provider-ini@3.525.0", "@aws-sdk/credential-provider-ini@^3.100.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.525.0.tgz#e672842bfdc3bcde221def0284f4a8af30bee2bb" integrity sha512-JDnccfK5JRb9jcgpc9lirL9PyCwGIqY0nKdw3LlX5WL5vTpTG4E1q7rLAlpNh7/tFD1n66Itarfv2tsyHMIqCw== @@ -2080,25 +1794,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-node@3.521.0", "@aws-sdk/credential-provider-node@^3.369.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.521.0.tgz#b999f382242a5b2ea5b35025f9a7e3b1c0ab6892" - integrity sha512-N9SR4gWI10qh4V2myBcTw8IlX3QpsMMxa4Q8d/FHiAX6eNV7e6irXkXX8o7+J1gtCRy1AtBMqAdGsve4GVqYMQ== - dependencies: - "@aws-sdk/credential-provider-env" "3.521.0" - "@aws-sdk/credential-provider-http" "3.521.0" - "@aws-sdk/credential-provider-ini" "3.521.0" - "@aws-sdk/credential-provider-process" "3.521.0" - "@aws-sdk/credential-provider-sso" "3.521.0" - "@aws-sdk/credential-provider-web-identity" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/credential-provider-imds" "^2.2.1" - "@smithy/property-provider" "^2.1.1" - "@smithy/shared-ini-file-loader" "^2.3.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-node@3.525.0": +"@aws-sdk/credential-provider-node@3.525.0", "@aws-sdk/credential-provider-node@^3.369.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.525.0.tgz#fde02124df4f8afd4a58475452c9cd7f91a60b01" integrity sha512-RJXlO8goGXpnoHQAyrCcJ0QtWEOFa34LSbfdqBIjQX/fwnjUuEmiGdXTV3AZmwYQ7juk49tfBneHbtOP3AGqsQ== @@ -2140,18 +1836,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-process@3.521.0", "@aws-sdk/credential-provider-process@^3.80.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.521.0.tgz#8d163862607bd6ef3ac289ae89b4c7cf2e2f994a" - integrity sha512-EcJjcrpdklxbRAFFgSLk6QGVtvnfZ80ItfZ47VL9LkhWcDAkQ1Oi0esHq+zOgvjb7VkCyD3Q9CyEwT6MlJsriA== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/shared-ini-file-loader" "^2.3.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-process@3.523.0": +"@aws-sdk/credential-provider-process@3.523.0", "@aws-sdk/credential-provider-process@^3.80.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.523.0.tgz#8cf85637f5075065a164d008f392d3ae3539ea23" integrity sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q== @@ -2184,20 +1869,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-sso@3.521.0", "@aws-sdk/credential-provider-sso@^3.100.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.521.0.tgz#d4baf025c60d92dd4f3a27bbfaa83e4289010fcd" - integrity sha512-GAfc0ji+fC2k9VngYM3zsS1J5ojfWg0WUOBzavvHzkhx/O3CqOt82Vfikg3PvemAp9yOgKPMaasTHVeipNLBBQ== - dependencies: - "@aws-sdk/client-sso" "3.521.0" - "@aws-sdk/token-providers" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/shared-ini-file-loader" "^2.3.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-sso@3.525.0": +"@aws-sdk/credential-provider-sso@3.525.0", "@aws-sdk/credential-provider-sso@^3.100.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.525.0.tgz#b79f263fcde291250b35af41ee83743bdfec7d13" integrity sha512-7V7ybtufxdD3plxeIeB6aqHZeFIUlAyPphXIUgXrGY10iNcosL970rQPBeggsohe4gCM6UvY2TfMeEcr+ZE8FA== @@ -2219,18 +1891,7 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.521.0", "@aws-sdk/credential-provider-web-identity@^3.78.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.521.0.tgz#a062dead8d50df1601c08d4925628d89584920b8" - integrity sha512-ZPPJqdbPOE4BkdrPrYBtsWg0Zy5b+GY1sbMWLQt0tcISgN5EIoePCS2pGNWnBUmBT+mibMQCVv9fOQpqzRkvAw== - dependencies: - "@aws-sdk/client-sts" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/credential-provider-web-identity@3.525.0": +"@aws-sdk/credential-provider-web-identity@3.525.0", "@aws-sdk/credential-provider-web-identity@^3.78.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.525.0.tgz#f71a7a322209468de89b2dee6acd961e386a89cc" integrity sha512-sAukOjR1oKb2JXG4nPpuBFpSwGUhrrY17PG/xbTy8NAoLLhrqRwnErcLfdTfmj6tH+3094k6ws/Sh8a35ae7fA== @@ -2241,14 +1902,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@aws-sdk/endpoint-cache@3.495.0": - version "3.495.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/endpoint-cache/-/endpoint-cache-3.495.0.tgz#f1c59a4315e61394ebd18b3dda211485c07ee7f8" - integrity sha512-XCDrpiS50WaPzPzp7FwsChPHtX9PQQUU4nRzcn2N7IkUtpcFCUx8m1PAZe086VQr6hrbdeE4Z4j8hUPNwVdJGQ== - dependencies: - mnemonist "0.38.3" - tslib "^2.5.0" - "@aws-sdk/eventstream-codec@3.186.0": version "3.186.0" resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.186.0.tgz#9da9608866b38179edf72987f2bc3b865d11db13" @@ -2429,16 +2082,16 @@ "@aws-sdk/util-utf8-browser" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-bucket-endpoint@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.521.0.tgz#5d71cd7a73fbab1eac933d79194150b14a85ab39" - integrity sha512-wUPSpzeEGwAic5OJmXQGt1RCbt5KHighZ1ubUeNV67FMPsxaEW+Y0Kd+L0vbbFoQptIui2GqP5JxuROr6J7SjA== +"@aws-sdk/middleware-bucket-endpoint@3.525.0": + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.525.0.tgz#f354fbc0b4a55b0b13ab704672382c5aeafae0b3" + integrity sha512-nYfQ2Xspfef7j8mZO7varUWLPH6HQlXateH7tBVtBNUAazyQE4UJEvC0fbQ+Y01e+FKlirim/m2umkdMXqAlTg== dependencies: - "@aws-sdk/types" "3.521.0" + "@aws-sdk/types" "3.523.0" "@aws-sdk/util-arn-parser" "3.495.0" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/protocol-http" "^3.2.1" + "@smithy/types" "^2.10.1" "@smithy/util-config-provider" "^2.2.1" tslib "^2.5.0" @@ -2460,18 +2113,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-endpoint-discovery@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.521.0.tgz#909a5829f69ee9ec38bdf3c11d4ad3460dc7f482" - integrity sha512-w0ar4miRZamR9YrZcdtRnPlc+MrFYzD9opwE02dd0n4IRPrf4rpVTVmyfZ4tx2N5vja04NOp0dT4sHETSHQiLg== - dependencies: - "@aws-sdk/endpoint-cache" "3.495.0" - "@aws-sdk/types" "3.521.0" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/middleware-eventstream@3.186.0": version "3.186.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-eventstream/-/middleware-eventstream-3.186.0.tgz#64a66102ed2e182182473948f131f23dda84e729" @@ -2481,27 +2122,27 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-expect-continue@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.521.0.tgz#22845df7ea4940f836c439e2dbc14c6e055cf343" - integrity sha512-6NBaPS+1b1QbsbJ74KI9MkqWbj8rnY6uKNEo0wkxgA8Q6u0aTn/jV+jrn5ZemdYmfS/y/VbaoY/hE+/QNp5vUw== +"@aws-sdk/middleware-expect-continue@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.523.0.tgz#9db5a9dd54a41fb71d40e744ff800a697a82e969" + integrity sha512-E5DyRAHU39VHaAlQLqXYS/IKpgk3vsryuU6kkOcIIK8Dgw0a2tjoh5AOCaNa8pD+KgAGrFp35JIMSX1zui5diA== dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" + "@aws-sdk/types" "3.523.0" + "@smithy/protocol-http" "^3.2.1" + "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@aws-sdk/middleware-flexible-checksums@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.521.0.tgz#375cf8332876dfa83069a2a91c61524db9b0bf88" - integrity sha512-sWNN0wtdwImO2QqN4J1YVTpDhdii6Tp5p8jCkCE1Qe+afQ5u52PeRAS/9U56cJnqM5JLabO4kE10Mm5rufNs2A== +"@aws-sdk/middleware-flexible-checksums@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.523.0.tgz#7f0e4a98aac00f08b154cb283d33a36993dd730d" + integrity sha512-lIa1TdWY9q4zsDFarfSnYcdrwPR+nypaU4n6hb95i620/1F5M5s6H8P0hYtwTNNvx+slrR8F3VBML9pjBtzAHw== dependencies: "@aws-crypto/crc32" "3.0.0" "@aws-crypto/crc32c" "3.0.0" - "@aws-sdk/types" "3.521.0" + "@aws-sdk/types" "3.523.0" "@smithy/is-array-buffer" "^2.1.1" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" + "@smithy/protocol-http" "^3.2.1" + "@smithy/types" "^2.10.1" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" @@ -2514,16 +2155,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.521.0.tgz#d826a4803c1479935cbc9b05e2399895497e55a1" - integrity sha512-Bc4stnMtVAdqosYI1wedFK9tffclCuwpOK/JA4bxbnvSyP1kz4s1HBVT9OOMzdLRLWLwVj/RslXKfSbzOUP7ug== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/middleware-host-header@3.523.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.523.0.tgz#9aaa29edd668905eed8ee8af482b96162dafdeb1" @@ -2543,13 +2174,13 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-location-constraint@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.521.0.tgz#bf9446bc8652a25176757123be4864e78bcd9e05" - integrity sha512-XlGst6F3+20mhMVk+te7w8Yvrm9i9JGpgRdxdMN1pnXtGn/aAKF9lFFm4bOu47PR/XHun2PLmKlLnlZd7NAP2Q== +"@aws-sdk/middleware-location-constraint@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.523.0.tgz#c5b2395119ece973773f80f67eef43603d159c12" + integrity sha512-1QAUXX3U0jkARnU0yyjk81EO4Uw5dCeQOtvUY5s3bUOHatR3ThosQeIr6y9BCsbXHzNnDe1ytCjqAPyo8r/bYw== dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/types" "^2.10.0" + "@aws-sdk/types" "3.523.0" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@aws-sdk/middleware-logger@3.186.0": @@ -2560,15 +2191,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.521.0.tgz#499d93a1b74dc4f37c508567aff9290449c730bf" - integrity sha512-JJ4nyYvLu3RyyNHo74Rlx6WKxJsAixWCEnnFb6IGRUHvsG+xBGU7HF5koY2log8BqlDLrt4ZUaV/CGy5Dp8Mfg== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/middleware-logger@3.523.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.523.0.tgz#ad61bfdd73b5983ab8a8926b9c01825bc048babf" @@ -2595,16 +2217,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-recursion-detection@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.521.0.tgz#77e2917e8b7040b8f3dacea3f29a65f885c69f98" - integrity sha512-1m5AsC55liTlaYMjc4pIQfjfBHG9LpWgubSl4uUxJSdI++zdA/SRBwXl40p7Ac/y5esweluhWabyiv1g/W4+Xg== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/middleware-recursion-detection@3.523.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.523.0.tgz#21d9ec52700545d7935d6c943cb40bffa69ab4b4" @@ -2639,18 +2251,18 @@ tslib "^1.8.0" uuid "^3.0.0" -"@aws-sdk/middleware-sdk-s3@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.521.0.tgz#ccf020ba7a8a2bbc1527fc672e9d02c6915e40f2" - integrity sha512-aDeOScfzGGHZ7oEDx+EPzz+JVa8/B88CPeDRaDmO5dFNv2/5PFumHfh0gc6XFl4nJWPPOrJyZ1UYU/9VdDfSyQ== +"@aws-sdk/middleware-sdk-s3@3.525.0": + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.525.0.tgz#c3ce03940240fa7a42bfa3f1916d2ce9fa0fafbf" + integrity sha512-ewFyyFM6wdFTOqCiId5GQNi7owDdLEonQhB4h8tF6r3HV52bRlDvZA4aDos+ft6N/XY2J6L0qlFTFq+/oiurXw== dependencies: - "@aws-sdk/types" "3.521.0" + "@aws-sdk/types" "3.523.0" "@aws-sdk/util-arn-parser" "3.495.0" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/signature-v4" "^2.1.1" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/protocol-http" "^3.2.1" + "@smithy/signature-v4" "^2.1.3" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" "@smithy/util-config-provider" "^2.2.1" tslib "^2.5.0" @@ -2694,17 +2306,17 @@ "@aws-sdk/util-middleware" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-signing@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.521.0.tgz#87267770454f66d3ea46d12a3cb71b0131b699fa" - integrity sha512-OW1jKeN6Eh3/OItXBtyNRFOv1MuZQBeHpEbywgYwtaqxTGxm9gFj//9wFsCXK4zg1+ghun8iC0buNbyOvCUf9A== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/protocol-http" "^3.2.0" - "@smithy/signature-v4" "^2.1.1" - "@smithy/types" "^2.10.0" - "@smithy/util-middleware" "^2.1.2" +"@aws-sdk/middleware-signing@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.523.0.tgz#1b2c458eb6a00da45b0800916ee463ff727c0717" + integrity sha512-pFXV4don6qcmew/OvEjLUr2foVjzoJ8o5k57Oz9yAHz8INx3RHK8MP/K4mVhHo6n0SquRcWrm4kY/Tw+89gkEA== + dependencies: + "@aws-sdk/types" "3.523.0" + "@smithy/property-provider" "^2.1.3" + "@smithy/protocol-http" "^3.2.1" + "@smithy/signature-v4" "^2.1.3" + "@smithy/types" "^2.10.1" + "@smithy/util-middleware" "^2.1.3" tslib "^2.5.0" "@aws-sdk/middleware-signing@3.6.1": @@ -2717,13 +2329,13 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/middleware-ssec@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.521.0.tgz#5d1e494d04c9c479ece7673ac874ff90d3ba87f1" - integrity sha512-O9vlns8bFxkZA71CyjQbiB2tm3v+925C37Z3wzn9sj2x0FTB3njgSR23w05d8HP2ve1GPuqoVD0T0pa+jG0Zbw== +"@aws-sdk/middleware-ssec@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.523.0.tgz#1bc0b57859a3e90af7e6103341903896f601e622" + integrity sha512-FaqAZQeF5cQzZLOIboIJRaWVOQ2F2pJZAXGF5D7nJsxYNFChotA0O0iWimBRxU35RNn7yirVxz35zQzs20ddIw== dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/types" "^2.10.0" + "@aws-sdk/types" "3.523.0" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@aws-sdk/middleware-stack@3.186.0": @@ -2749,17 +2361,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/middleware-user-agent@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.521.0.tgz#c2362f97394143d86ba9f5ab9f929d337b18c5ce" - integrity sha512-+hmQjWDG93wCcJn5QY2MkzAL1aG5wl3FJ/ud2nQOu/Gx7d4QVT/B6VJwoG6GSPVuVPZwzne5n9zPVst6RmWJGA== - dependencies: - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-endpoints" "3.521.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/middleware-user-agent@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.525.0.tgz#3ac154829460271c53ad49d8301d4c849e9afb9f" @@ -2896,18 +2497,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/region-config-resolver@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.521.0.tgz#a8313f9d7e2df55662418cfb8a04fd055624cb29" - integrity sha512-eC2T62nFgQva9Q0Sqoc9xsYyyH9EN2rJtmUKkWsBMf77atpmajAYRl5B/DzLwGHlXGsgVK2tJdU5wnmpQCEwEQ== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/types" "^2.10.0" - "@smithy/util-config-provider" "^2.2.1" - "@smithy/util-middleware" "^2.1.2" - tslib "^2.5.0" - "@aws-sdk/region-config-resolver@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.525.0.tgz#ebd7edd0059857f59ed605c37cf5752542cf8914" @@ -2921,17 +2510,17 @@ tslib "^2.5.0" "@aws-sdk/s3-request-presigner@^3.383.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.521.0.tgz#7d43d149f1eb66d252e22be5cf198c0b69f2f7d3" - integrity sha512-H44naGH2gGPfTC2159wq2MYHA90P0XsSPfT/3gg8xD9mNl59Ylw+S0oQTChlxbHUAxyFI44CVjOUHuUBuugGgA== - dependencies: - "@aws-sdk/signature-v4-multi-region" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@aws-sdk/util-format-url" "3.521.0" - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.525.0.tgz#8c56b44431bfea57946e6e6c479d7dd371b357aa" + integrity sha512-EllqWqzzzLs8QgUENgOF8qlSuZI6QiPypazSVbCuaAR5B6+s6E8XuBPlX99bV28pGbmtG06d/qqwu2pzXORbBg== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@aws-sdk/util-format-url" "3.523.0" + "@smithy/middleware-endpoint" "^2.4.4" + "@smithy/protocol-http" "^3.2.1" + "@smithy/smithy-client" "^2.4.2" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@aws-sdk/service-error-classification@3.186.0": @@ -2967,16 +2556,16 @@ "@smithy/shared-ini-file-loader" "^1.0.1" tslib "^2.5.0" -"@aws-sdk/signature-v4-multi-region@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.521.0.tgz#74f74de15cc4dc94a42c469dd70c7ca29a69749b" - integrity sha512-JVMGQEE6+MQ5Enc/NDQNw8cmy/soALH/Ky00SVQvrfb9ec4H40eDQbbn/d7lua52UCcvUv1w+Ppk00WzbqDAcQ== +"@aws-sdk/signature-v4-multi-region@3.525.0": + version "3.525.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.525.0.tgz#b9b7e1079b0a8a1df4bb282216aa20b56d139ba5" + integrity sha512-j8gkdfiokaherRgokfZBl2azYBMHlegT7pOnR/3Y79TSz6G+bJeIkuNk8aUbJArr6R8nvAM1j4dt1rBM+efolQ== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/protocol-http" "^3.2.0" - "@smithy/signature-v4" "^2.1.1" - "@smithy/types" "^2.10.0" + "@aws-sdk/middleware-sdk-s3" "3.525.0" + "@aws-sdk/types" "3.523.0" + "@smithy/protocol-http" "^3.2.1" + "@smithy/signature-v4" "^2.1.3" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@aws-sdk/signature-v4@3.186.0": @@ -3020,18 +2609,6 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/token-providers@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.521.0.tgz#557fa6e5535dc680c8589cca611ac2bd4426a9dd" - integrity sha512-63XxPOn13j87yPWKm6UXOPdMZIMyEyCDJzmlxnIACP8m20S/c6b8xLJ4fE/PUlD0MTKxpFeQbandq5OhnLsWSQ== - dependencies: - "@aws-sdk/client-sso-oidc" "3.521.0" - "@aws-sdk/types" "3.521.0" - "@smithy/property-provider" "^2.1.1" - "@smithy/shared-ini-file-loader" "^2.3.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/token-providers@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/token-providers/-/token-providers-3.525.0.tgz#370d206a06e77e29ec0f76408654b16d6612f0d2" @@ -3049,15 +2626,7 @@ resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.186.0.tgz#f6fb6997b6a364f399288bfd5cd494bc680ac922" integrity sha512-NatmSU37U+XauMFJCdFI6nougC20JUFZar+ump5wVv0i54H+2Refg1YbFDxSs0FY28TSB9jfhWIpfFBmXgL5MQ== -"@aws-sdk/types@3.521.0", "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.110.0", "@aws-sdk/types@^3.222.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.521.0.tgz#63696760837a1f505b6ef49a668bbff8c827dd2d" - integrity sha512-H9I3Lut0F9d+kTibrhnTRqDRzhxf/vrDu12FUdTXVZEvVAQ7w9yrVHAZx8j2e8GWegetsQsNitO3KMrj4dA4pw== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@aws-sdk/types@3.523.0": +"@aws-sdk/types@3.523.0", "@aws-sdk/types@^3.1.0", "@aws-sdk/types@^3.110.0", "@aws-sdk/types@^3.222.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.523.0.tgz#2bb11390023949f31d9211212f41e245a7f03489" integrity sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A== @@ -3208,23 +2777,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/util-dynamodb@^3.281.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.521.0.tgz#31d45c950d521550db3b9a65c8dd0c469a1b1698" - integrity sha512-XG6UwAWfSnl3EEpcKfF2Tk/anGOoryUIJVAr7VeMJcsYxvl+t3KZxFi7x4079T8NMQLvfajyLRsAD+E8ydaf8A== - dependencies: - tslib "^2.5.0" - -"@aws-sdk/util-endpoints@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.521.0.tgz#607edd5429ed971ad4d3a0331d335f430a23d555" - integrity sha512-lO5+1LeAZycDqgNjQyZdPSdXFQKXaW5bRuQ3UIT3bOCcUAbDI0BYXlPm1huPNTCEkI9ItnDCbISbV0uF901VXw== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/types" "^2.10.0" - "@smithy/util-endpoints" "^1.1.2" - tslib "^2.5.0" - "@aws-sdk/util-endpoints@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-endpoints/-/util-endpoints-3.525.0.tgz#d9f53b60e69dbe4623a4200d10be1be2ac73438f" @@ -3235,14 +2787,14 @@ "@smithy/util-endpoints" "^1.1.4" tslib "^2.5.0" -"@aws-sdk/util-format-url@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.521.0.tgz#8c6263c2ea141e03997d8c6279b4245744d63456" - integrity sha512-lKERTlx3prKcZynMioubjpZWY5+t6o916MhExAo9+twiTKv1r8dWYH+k/jLMViEcYtPiM9Ces9NX1sTJhzk/yQ== +"@aws-sdk/util-format-url@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-format-url/-/util-format-url-3.523.0.tgz#4c769d46f34dd351051d7f10c2cdd4499244219d" + integrity sha512-OWi+8bsEfxG4DvHkWauxyWVZMbYrezC49DbGDEu1lJgk9eqQALlyGkZHt9O8KKfyT/mdqQbR8qbpkxqYcGuHVA== dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/querystring-builder" "^2.1.2" - "@smithy/types" "^2.10.0" + "@aws-sdk/types" "3.523.0" + "@smithy/querystring-builder" "^2.1.3" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@aws-sdk/util-hex-encoding@3.186.0": @@ -3296,16 +2848,6 @@ bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.521.0.tgz#20f10df57a5499ace0b955b7b76dccebb530bf1f" - integrity sha512-2t3uW6AXOvJ5iiI1JG9zPqKQDc/TRFa+v13aqT5KKw9h3WHFyRUpd4sFQL6Ul0urrq2Zg9cG4NHBkei3k9lsHA== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/types" "^2.10.0" - bowser "^2.11.0" - tslib "^2.5.0" - "@aws-sdk/util-user-agent-browser@3.523.0": version "3.523.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.523.0.tgz#77188e83f9d470ddf140fe8c5d4d51049c9d5898" @@ -3334,16 +2876,6 @@ "@aws-sdk/types" "3.186.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.521.0.tgz#5f0337af400037363676e7f45136b0463de412d8" - integrity sha512-g4KMEiyLc8DG21eMrp6fJUdfQ9F0fxfCNMDRgf0SE/pWI/u4vuWR2n8obLwq1pMVx7Ksva1NO3dc+a3Rgr0hag== - dependencies: - "@aws-sdk/types" "3.521.0" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@aws-sdk/util-user-agent-node@3.525.0": version "3.525.0" resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.525.0.tgz#aa96c28bad8360d2a350c30c3c209c35f99ac5ee" @@ -3409,12 +2941,12 @@ "@aws-sdk/types" "3.6.1" tslib "^1.8.0" -"@aws-sdk/xml-builder@3.521.0": - version "3.521.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.521.0.tgz#628d5f38aa17ac5c6da70e10e40e2eef9b517b17" - integrity sha512-ahaG39sgpBN/UOKzOW9Ey6Iuy6tK8vh2D+/tsLFLQ59PXoCvU06xg++TGXKpxsYMJGIzBvZMDC1aBhGmm/HsaA== +"@aws-sdk/xml-builder@3.523.0": + version "3.523.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.523.0.tgz#6abdaf5716f6c7153c328bbbd499345fae755dce" + integrity sha512-wfvyVymj2TUw7SuDor9IuFcAzJZvWRBZotvY/wQJOlYa3UP3Oezzecy64N4FWfBJEsZdrTN+HOZFl+IzTWWnUA== dependencies: - "@smithy/types" "^2.10.0" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@axe-core/playwright@^4.8.3": @@ -3594,20 +3126,20 @@ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== "@babel/core@^7.12.3": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" - integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.0.tgz#56cbda6b185ae9d9bed369816a8f4423c5f2ff1b" + integrity sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.9" - "@babel/parser" "^7.23.9" - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/helpers" "^7.24.0" + "@babel/parser" "^7.24.0" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -3702,14 +3234,14 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307" integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw== -"@babel/helpers@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" - integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== +"@babel/helpers@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.0.tgz#a3dd462b41769c95db8091e49cfe019389a9409b" + integrity sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA== dependencies: - "@babel/template" "^7.23.9" - "@babel/traverse" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/template" "^7.24.0" + "@babel/traverse" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/highlight@^7.23.4": version "7.23.4" @@ -3720,31 +3252,31 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.14.7", "@babel/parser@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" - integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== +"@babel/parser@^7.14.7", "@babel/parser@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.0.tgz#26a3d1ff49031c53a97d03b604375f028746a9ac" + integrity sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg== "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" - integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.0.tgz#584c450063ffda59697021430cb47101b085951e" + integrity sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" - integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== +"@babel/template@^7.22.15", "@babel/template@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: "@babel/code-frame" "^7.23.5" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" -"@babel/traverse@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" - integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== +"@babel/traverse@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.0.tgz#4a408fbf364ff73135c714a2ab46a5eab2831b1e" + integrity sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -3752,15 +3284,15 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.9" - "@babel/types" "^7.23.9" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.23.9": - version "7.23.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" - integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== +"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.6", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" @@ -3823,7 +3355,7 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.1.tgz#4ffb0055f7ef676ebc3a5a91fb621393294e2f43" integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== -"@emotion/is-prop-valid@1.2.1", "@emotion/is-prop-valid@^1.2.1": +"@emotion/is-prop-valid@1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== @@ -3837,6 +3369,13 @@ dependencies: "@emotion/memoize" "0.7.4" +"@emotion/is-prop-valid@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/memoize@0.7.4": version "0.7.4" resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" @@ -3848,9 +3387,9 @@ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.11.1", "@emotion/react@^11.8.1": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" - integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== + version "11.11.4" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" @@ -4230,9 +3769,9 @@ integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== "@fontsource/open-sans@^5.0.17": - version "5.0.24" - resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-5.0.24.tgz#02f85e51d0ee75c3c2f42f683cd486364f99e2d9" - integrity sha512-bIF+87vxfOPTyvnBKS+rCPmz/m66um3zCk1UdPv8RGBgwu6MMxwED0jpcbvyFSkfy0ApcdjfkDSAhlFTm/pgiw== + version "5.0.25" + resolved "https://registry.yarnpkg.com/@fontsource/open-sans/-/open-sans-5.0.25.tgz#a74e6926333c3a749bf21e62a739d55f7cc1754e" + integrity sha512-7drfN/MwZyF4syQQ09rKOxof7KhM8N5M5CTGSJzvm13Cl0Jr0oaxrpmVKlBspzfdo7j350PpdCczUpEx4G1uPg== "@gar/promisify@^1.1.3": version "1.1.3" @@ -4366,34 +3905,34 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.4" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.4.tgz#9b18145d26cf33d08576cf4c7665b28554480ed7" - integrity sha512-Oud2QPM5dHviZNn4y/WhhYKSXksv+1xLEIsNrAbGcFzUN3ubqWRFT5gwPchNc5NuzILOU4tPBDTZ4VwhL8Y7cw== +"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== dependencies: - "@jridgewell/set-array" "^1.0.1" + "@jridgewell/set-array" "^1.2.1" "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" + "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.23" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.23.tgz#afc96847f3f07841477f303eed687707a5aacd80" - integrity sha512-9/4foRoUKp8s96tSkh8DlAAc5A0Ty8vLXld+l9gjKKY6ckwI8G15f0hskGmuLZu78ZlGa1vtsfOa+lnB4vG6Jg== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -4454,48 +3993,48 @@ outvariant "^1.2.1" strict-event-emitter "^0.5.1" -"@mui/base@5.0.0-beta.37": - version "5.0.0-beta.37" - resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.37.tgz#0e7e0f28402391fcfbb05476d5acc6c4f2d817b1" - integrity sha512-/o3anbb+DeCng8jNsd3704XtmmLDZju1Fo8R2o7ugrVtPQ/QpcqddwKNzKPZwa0J5T8YNW3ZVuHyQgbTnQLisQ== +"@mui/base@5.0.0-beta.38": + version "5.0.0-beta.38" + resolved "https://registry.yarnpkg.com/@mui/base/-/base-5.0.0-beta.38.tgz#0d79c1158d18d9decfc8fa3ab87b4830a49cf952" + integrity sha512-AsjD6Y1X5A1qndxz8xCcR8LDqv31aiwlgWMPxFAX/kCKiIGKlK65yMeVZ62iQr/6LBz+9hSKLiD1i4TZdAHKcQ== dependencies: "@babel/runtime" "^7.23.9" "@floating-ui/react-dom" "^2.0.8" "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" "@popperjs/core" "^2.11.8" clsx "^2.1.0" prop-types "^15.8.1" -"@mui/core-downloads-tracker@^5.15.11": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.11.tgz#dcaf6156880e81e4547237fb781700485453e964" - integrity sha512-JVrJ9Jo4gyU707ujnRzmE8ABBWpXd6FwL9GYULmwZRtfPg89ggXs/S3MStQkpJ1JRWfdLL6S5syXmgQGq5EDAw== +"@mui/core-downloads-tracker@^5.15.12": + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.12.tgz#f3da6ff16c753ab8b2f8d401c1e1534ba8a8a9a9" + integrity sha512-brRO+tMFLpGyjEYHrX97bzqeF6jZmKpqqe1rY0LyIHAwP6xRVzh++zSecOQorDOCaZJg4XkGT9xfD+RWOWxZBA== "@mui/lab@^5.0.0-alpha.136": - version "5.0.0-alpha.166" - resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.166.tgz#7c79c66e8cc1bd44f1ef2d1e0c3fd874381e161f" - integrity sha512-a+0yorrgxLIgfKhShVKQk0/5CnB4KBhMQ64SvEB+CsvKAKKJzjIU43m2nMqdBbWzfnEuj6wR9vQ9kambdn3ZKA== + version "5.0.0-alpha.167" + resolved "https://registry.yarnpkg.com/@mui/lab/-/lab-5.0.0-alpha.167.tgz#8f00b0fe8f236691bc2cffadfd4feb542b0151cd" + integrity sha512-BNQJ7fBBvL68WGVnzAhbtTmabSuJDXaILr9dz/3RNK4TgGXPgWCAr7qtJeUdc4p1t7c4Z1ifG8UwgqD+5hzMNg== dependencies: "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.37" - "@mui/system" "^5.15.11" + "@mui/base" "5.0.0-beta.38" + "@mui/system" "^5.15.12" "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" clsx "^2.1.0" prop-types "^15.8.1" "@mui/material@^5.14.1": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.11.tgz#4f42ee30443699ffb5836029c6d8464154eca603" - integrity sha512-FA3eEuEZaDaxgN3CgfXezMWbCZ4VCeU/sv0F0/PK5n42qIgsPVD6q+j71qS7/62sp6wRFMHtDMpXRlN+tT/7NA== + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/material/-/material-5.15.12.tgz#08d6582e4037f45df510f3bce51fa06b38a9a676" + integrity sha512-vXJGg6KNKucsvbW6l7w9zafnpOp0CWc0Wx4mDykuABTpQ5QQBnZxP7+oB4yAS1hDZQ1WobbeIl0CjxK4EEahkA== dependencies: "@babel/runtime" "^7.23.9" - "@mui/base" "5.0.0-beta.37" - "@mui/core-downloads-tracker" "^5.15.11" - "@mui/system" "^5.15.11" + "@mui/base" "5.0.0-beta.38" + "@mui/core-downloads-tracker" "^5.15.12" + "@mui/system" "^5.15.12" "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" "@types/react-transition-group" "^4.4.10" clsx "^2.1.0" csstype "^3.1.3" @@ -4503,13 +4042,13 @@ react-is "^18.2.0" react-transition-group "^4.4.5" -"@mui/private-theming@^5.15.11": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.15.11.tgz#4b9289b56b1ae0beb84e47bc9952f927b6e175ae" - integrity sha512-jY/696SnSxSzO1u86Thym7ky5T9CgfidU3NFJjguldqK4f3Z5S97amZ6nffg8gTD0HBjY9scB+4ekqDEUmxZOA== +"@mui/private-theming@^5.15.12": + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-5.15.12.tgz#e3ac99b3dbfa6ecc6e914009df33a2d400432f6e" + integrity sha512-cqoSo9sgA5HE+8vZClbLrq9EkyOnYysooepi5eKaKvJ41lReT2c5wOZAeDDM1+xknrMDos+0mT2zr3sZmUiRRA== dependencies: "@babel/runtime" "^7.23.9" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" prop-types "^15.8.1" "@mui/styled-engine@^5.13.2", "@mui/styled-engine@^5.15.11": @@ -4523,15 +4062,15 @@ prop-types "^15.8.1" "@mui/styles@^5.14.0": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.15.11.tgz#2fc57a42eff47542924e1ba90fb188b733d295aa" - integrity sha512-7TCs+0AGCtNaqBHhj0ZODYLnQjVrY9nG4PrT2bzIGIh3zvJxF7zY6IRiPyBFsKY1OjdVHjjYuan4U81QbdBrew== + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/styles/-/styles-5.15.12.tgz#2e42e8a663f55fb22f5ac79c5071db31701a2f47" + integrity sha512-1dBGLPAR3BhlmKorKhP9XK2wIH1M6BVSfws7agbWaS3atM4fApa0pZic4wjiTyNo7o6N5Lg2wZSnl1wUv/nCmA== dependencies: "@babel/runtime" "^7.23.9" "@emotion/hash" "^0.9.1" - "@mui/private-theming" "^5.15.11" + "@mui/private-theming" "^5.15.12" "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" clsx "^2.1.0" csstype "^3.1.3" hoist-non-react-statics "^3.3.2" @@ -4545,16 +4084,16 @@ jss-plugin-vendor-prefixer "^10.10.0" prop-types "^15.8.1" -"@mui/system@^5.14.1", "@mui/system@^5.15.11": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.11.tgz#19cf1974f82f1dd38be1f162034efecadd765733" - integrity sha512-9j35suLFq+MgJo5ktVSHPbkjDLRMBCV17NMBdEQurh6oWyGnLM4uhU4QGZZQ75o0vuhjJghOCA1jkO3+79wKsA== +"@mui/system@^5.14.1", "@mui/system@^5.15.12": + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/system/-/system-5.15.12.tgz#852cf7c339eb61703196f56c36fc93206136eb20" + integrity sha512-/pq+GO6yN3X7r3hAwFTrzkAh7K1bTF5r8IzS79B9eyKJg7v6B/t4/zZYMR6OT9qEPtwf6rYN2Utg1e6Z7F1OgQ== dependencies: "@babel/runtime" "^7.23.9" - "@mui/private-theming" "^5.15.11" + "@mui/private-theming" "^5.15.12" "@mui/styled-engine" "^5.15.11" "@mui/types" "^7.2.13" - "@mui/utils" "^5.15.11" + "@mui/utils" "^5.15.12" clsx "^2.1.0" csstype "^3.1.3" prop-types "^15.8.1" @@ -4564,10 +4103,10 @@ resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.13.tgz#d1584912942f9dc042441ecc2d1452be39c666b8" integrity sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g== -"@mui/utils@^5.14.16", "@mui/utils@^5.15.11": - version "5.15.11" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.15.11.tgz#a71804d6d6025783478fd1aca9afbf83d9b789c7" - integrity sha512-D6bwqprUa9Stf8ft0dcMqWyWDKEo7D+6pB1k8WajbqlYIRA8J8Kw9Ra7PSZKKePGBGWO+/xxrX1U8HpG/aXQCw== +"@mui/utils@^5.14.16", "@mui/utils@^5.15.12": + version "5.15.12" + resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-5.15.12.tgz#bd00b678c16b98c543d4c6c560f9c90e6792b2a7" + integrity sha512-8SDGCnO2DY9Yy+5bGzu00NZowSDtuyHP4H8gunhHGQoIlhlY2Z3w64wBzAOLpYw/ZhJNzksDTnS/i8qdJvxuow== dependencies: "@babel/runtime" "^7.23.9" "@types/prop-types" "^15.7.11" @@ -4575,9 +4114,9 @@ react-is "^18.2.0" "@mui/x-data-grid@^6.10.0": - version "6.19.5" - resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-6.19.5.tgz#5d202e9304197d431d92d5d041f5c8d6893ee5ba" - integrity sha512-jV1ZqwyFslKqFScSn4t+xc/tNxLHOeJjz3HoeK+Wdf5t3bPM69pg/jLeg8TmOkAUY62JmQKCLVmcGWiR3AqUKQ== + version "6.19.6" + resolved "https://registry.yarnpkg.com/@mui/x-data-grid/-/x-data-grid-6.19.6.tgz#6334bb70a7a2685fc1cf3ed902172661c3206f3f" + integrity sha512-jpZkX1Gnlo87gKcD10mKMY8YoAzUD8Cv3/IvedH3FINDKO3hnraMeOciKDeUk0tYSj8RUDB02kpTHCM8ojLVBA== dependencies: "@babel/runtime" "^7.23.2" "@mui/utils" "^5.14.16" @@ -4607,9 +4146,9 @@ fastq "^1.6.0" "@npmcli/arborist@^6.5.0": - version "6.5.0" - resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.0.tgz#ee24ecc56e4c387d78c3bce66918b386df6bd560" - integrity sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg== + version "6.5.1" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.1.tgz#b378a2e162e9b868d06f8f2c7e87e828de7e63ba" + integrity sha512-cdV8pGurLK0CifZRilMJbm2CZ3H4Snk8PAqOngj5qmgFLjEllMLvScSZ3XKfd+CK8fo/hrPHO9zazy9OYdvmUg== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/fs" "^3.1.0" @@ -4619,7 +4158,7 @@ "@npmcli/name-from-folder" "^2.0.0" "@npmcli/node-gyp" "^3.0.0" "@npmcli/package-json" "^4.0.0" - "@npmcli/query" "^3.0.0" + "@npmcli/query" "^3.1.0" "@npmcli/run-script" "^6.0.0" bin-links "^4.0.1" cacache "^17.0.4" @@ -4646,12 +4185,12 @@ walk-up-path "^3.0.1" "@npmcli/config@^6.4.0": - version "6.4.0" - resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.4.0.tgz#3b1ddfa0c452fd09beac2cf05ca49b76c7a36bc8" - integrity sha512-/fQjIbuNVIT/PbXvw178Tm97bxV0E0nVUFKHivMKtSI2pcs8xKdaWkHJxf9dTI0G/y5hp/KuCvgcUu5HwAtI1w== + version "6.4.1" + resolved "https://registry.yarnpkg.com/@npmcli/config/-/config-6.4.1.tgz#006409c739635db008e78bf58c92421cc147911d" + integrity sha512-uSz+elSGzjCMANWa5IlbGczLYPkNI/LeR+cHrgaTqTrTSh9RHhOFA4daD2eRUz6lMtOW+Fnsb+qv7V2Zz8ML0g== dependencies: "@npmcli/map-workspaces" "^3.0.2" - ci-info "^3.8.0" + ci-info "^4.0.0" ini "^4.1.0" nopt "^7.0.0" proc-log "^3.0.0" @@ -4761,7 +4300,7 @@ dependencies: which "^3.0.0" -"@npmcli/query@^3.0.0": +"@npmcli/query@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.1.0.tgz#bc202c59e122a06cf8acab91c795edda2cdad42c" integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== @@ -4820,9 +4359,9 @@ integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== "@octokit/plugin-paginate-rest@^9.0.0": - version "9.2.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.0.tgz#ca08e32adfab72a1223c4f4b77c9f0222087f879" - integrity sha512-NKi0bJEZqOSbBLMv9kdAcuocpe05Q2xAXNLTGi0HN2GSMFJHNZuSoPNa0tcQFTOFCKe+ZaYBZ3lpXh1yxgUDCA== + version "9.2.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" + integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== dependencies: "@octokit/types" "^12.6.0" @@ -4904,11 +4443,11 @@ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== "@playwright/test@^1.38.0": - version "1.41.2" - resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.41.2.tgz#bd9db40177f8fd442e16e14e0389d23751cdfc54" - integrity sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg== + version "1.42.1" + resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.42.1.tgz#9eff7417bcaa770e9e9a00439e078284b301f31c" + integrity sha512-Gq9rmS54mjBL/7/MvBaNOBwbfnh7beHvS6oS4srqXFcQHpQCV1+c8JXWE8VLPyRDhgS3H8x8A7hztqI9VnwrAQ== dependencies: - playwright "1.41.2" + playwright "1.42.1" "@pnpm/config.env-replace@^1.1.0": version "1.1.0" @@ -5500,10 +5039,10 @@ dependencies: "@babel/runtime" "^7.13.10" -"@remix-run/router@1.15.1": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.1.tgz#221fd31a65186b9bc027b74573485fb3226dff7f" - integrity sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w== +"@remix-run/router@1.15.2": + version "1.15.2" + resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.2.tgz#35726510d332ba5349c6398d13259d5da184553d" + integrity sha512-+Rnav+CaoTE5QJc4Jcwh5toUpnVLKYbpU6Ys0zqbakqbaLQHeglLVHPfxOiQqdNmUy5C2lXz5dwC6tQNX2JW2Q== "@semantic-release/changelog@^6.0.3": version "6.0.3" @@ -5661,9 +5200,9 @@ uuid "^8.3.2" "@serverless/dashboard-plugin@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@serverless/dashboard-plugin/-/dashboard-plugin-7.2.0.tgz#9e903e9099c830b34a5a9356d01e940e63252262" - integrity sha512-Gqzgef+KmrX1OxJW9aubrIN6AvPrtDARMv+NegMNEe+pfkZA/IMuZiSyYUaHgARokdw2/IALOysTLgdFJIrXvA== + version "7.2.3" + resolved "https://registry.yarnpkg.com/@serverless/dashboard-plugin/-/dashboard-plugin-7.2.3.tgz#ea2a312de2c4e763f4365654f8dfb8720bda52bb" + integrity sha512-Vu4TKJLEQ5F8ZipfCvd8A/LMIdH8kNGe448sX9mT4/Z0JVUaYmMc3BwkQ+zkNIh3QdBKAhocGn45TYjHV6uPWQ== dependencies: "@aws-sdk/client-cloudformation" "^3.410.0" "@aws-sdk/client-sts" "^3.410.0" @@ -5867,14 +5406,6 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== -"@smithy/abort-controller@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.1.2.tgz#8d865c28ad0d6a39ed0fdf3c361d0e0d722182e3" - integrity sha512-iwUxrFm/ZFCXhzhtZ6JnoJzAsqUrVfBAZUTQj8ypXGtIjwXZpKqmgYiuqrDERiydDI5gesqvsC4Rqe57GGhbVg== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/abort-controller@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/abort-controller/-/abort-controller-2.1.3.tgz#19997b701b36294c8d27bbc5e59167da2c719fae" @@ -5898,17 +5429,6 @@ dependencies: tslib "^2.5.0" -"@smithy/config-resolver@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.1.2.tgz#68d8e175ba9b1112d74dbfdccd03dfa38b96c718" - integrity sha512-ZDMY63xJVsJl7ei/yIMv9nx8OiEOulwNnQOUDGpIvzoBrcbvYwiMjIMe5mP5J4fUmttKkpiTKwta/7IUriAn9w== - dependencies: - "@smithy/node-config-provider" "^2.2.2" - "@smithy/types" "^2.10.0" - "@smithy/util-config-provider" "^2.2.1" - "@smithy/util-middleware" "^2.1.2" - tslib "^2.5.0" - "@smithy/config-resolver@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@smithy/config-resolver/-/config-resolver-2.1.4.tgz#cb870f82494b10c223c60ba4298b438d9185b4be" @@ -5920,20 +5440,6 @@ "@smithy/util-middleware" "^2.1.3" tslib "^2.5.0" -"@smithy/core@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.3.3.tgz#383da328c514fb916041380196df6fc190a5a996" - integrity sha512-8cT/swERvU1EUMuJF914+psSeVy4+NcNhbRe1WEKN1yIMPE5+Tq5EaPq1HWjKCodcdBIyU9ViTjd62XnebXMHA== - dependencies: - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-retry" "^2.1.2" - "@smithy/middleware-serde" "^2.1.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/util-middleware" "^2.1.2" - tslib "^2.5.0" - "@smithy/core@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@smithy/core/-/core-1.3.5.tgz#7523da67b49e165e09ee8019601bea410bf92c38" @@ -5959,17 +5465,6 @@ "@smithy/url-parser" "^1.1.0" tslib "^2.5.0" -"@smithy/credential-provider-imds@^2.2.1", "@smithy/credential-provider-imds@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.2.tgz#58d5e38a8c50ae5119e94c0580421ea65789b13b" - integrity sha512-a2xpqWzhzcYwImGbFox5qJLf6i5HKdVeOVj7d6kVFElmbS2QW2T4HmefRc5z1huVArk9bh5Rk1NiFp9YBCXU3g== - dependencies: - "@smithy/node-config-provider" "^2.2.2" - "@smithy/property-provider" "^2.1.2" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - tslib "^2.5.0" - "@smithy/credential-provider-imds@^2.2.3", "@smithy/credential-provider-imds@^2.2.4": version "2.2.4" resolved "https://registry.yarnpkg.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.4.tgz#7b237ad8623b782578335b61a616c5463b13451b" @@ -5981,16 +5476,6 @@ "@smithy/url-parser" "^2.1.3" tslib "^2.5.0" -"@smithy/eventstream-codec@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.1.2.tgz#b527902b7813c5d9d23fb1351b6e84046f2e00df" - integrity sha512-2PHrVRixITHSOj3bxfZmY93apGf8/DFiyhRh9W0ukfi07cvlhlRonZ0fjgcqryJjUZ5vYHqqmfIE/Qe1HM9mlw== - dependencies: - "@aws-crypto/crc32" "3.0.0" - "@smithy/types" "^2.10.0" - "@smithy/util-hex-encoding" "^2.1.1" - tslib "^2.5.0" - "@smithy/eventstream-codec@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/eventstream-codec/-/eventstream-codec-2.1.3.tgz#6be114d3c4d94f3bfd2e32cb258851baa6129acf" @@ -6001,50 +5486,39 @@ "@smithy/util-hex-encoding" "^2.1.1" tslib "^2.5.0" -"@smithy/eventstream-serde-browser@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.2.tgz#993f0c92bc0f5fcf734dea1217531f556efe62e6" - integrity sha512-2N11IFHvOmKuwK6hLVkqM8ge8oiQsFkflr4h07LToxo3rX+njkx/5eRn6RVcyNmpbdbxYYt0s0Pf8u+yhHmOKg== - dependencies: - "@smithy/eventstream-serde-universal" "^2.1.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@smithy/eventstream-serde-config-resolver@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.2.tgz#6423b5fb1140448286803dae1d444f3bf96d166e" - integrity sha512-nD/+k3mK+lMMwf2AItl7uWma+edHLqiE6LyIYXYnIBlCJcIQnA/vTHjHFoSJFCfG30sBJnU/7u4X5j/mbs9uKg== +"@smithy/eventstream-serde-browser@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.3.tgz#97427465aa277e66d3dcacab5f2bae890949a890" + integrity sha512-qAgKbZ9m2oBfSyJWWurX/MvQFRPrYypj79cDSleEgDwBoez6Tfd+FTpu2L/j3ZeC3mDlDHIKWksoeaXZpLLAHw== dependencies: - "@smithy/types" "^2.10.0" + "@smithy/eventstream-serde-universal" "^2.1.3" + "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/eventstream-serde-node@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.2.tgz#283adddc9898689cd231a0e6efcdf9bdcec81333" - integrity sha512-zNE6DhbwDEWTKl4mELkrdgXBGC7UsFg1LDkTwizSOFB/gd7G7la083wb0JgU+xPt+TYKK0AuUlOM0rUZSJzqeA== +"@smithy/eventstream-serde-config-resolver@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.3.tgz#09487fd5e3c22c7e53ff74d14de3924ab16b8751" + integrity sha512-48rvsNv/MgAFCxOE0qwR7ZwKhaEdDoTxqH5HM+T6SDxICmPGb7gEuQzjTxQhcieCPgqyXeZFW8cU0QJxdowuIg== dependencies: - "@smithy/eventstream-serde-universal" "^2.1.2" - "@smithy/types" "^2.10.0" + "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/eventstream-serde-universal@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.2.tgz#2ecbe6bffc7a40add81dbee04654c943bb602ec7" - integrity sha512-Upd/zy+dNvvIDPU1HGhW9ivNjvJQ0W4UkkQOzr5Mo0hz2lqnZAyOuit4TK2JAEg/oo+V1gUY4XywDc7zNbCF0g== +"@smithy/eventstream-serde-node@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.3.tgz#f51bf8e4eba9d1aaa995200a36c3d3fb5a29734d" + integrity sha512-RPJWWDhj8isk3NtGfm3Xt1WdHyX9ZE42V+m1nLU1I0zZ1hEol/oawHsTnhva/VR5bn+bJ2zscx+BYr0cEPRtmg== dependencies: - "@smithy/eventstream-codec" "^2.1.2" - "@smithy/types" "^2.10.0" + "@smithy/eventstream-serde-universal" "^2.1.3" + "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/fetch-http-handler@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.2.tgz#5ff26c1ef24c6e1d0acd189f6bc064f110fc446f" - integrity sha512-sIGMVwa/8h6eqNjarI3F07gvML3mMXcqBe+BINNLuKsVKXMNBN6wRzeZbbx7lfiJDEHAP28qRns8flHEoBB7zw== +"@smithy/eventstream-serde-universal@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.3.tgz#79ab2e313c4e6621d8d9ecb98e0c826e9d8d21da" + integrity sha512-ssvSMk1LX2jRhiOVgVLGfNJXdB8SvyjieKcJDHq698Gi3LOog6g/+l7ggrN+hZxyjUiDF4cUxgKaZTBUghzhLw== dependencies: - "@smithy/protocol-http" "^3.2.0" - "@smithy/querystring-builder" "^2.1.2" - "@smithy/types" "^2.10.0" - "@smithy/util-base64" "^2.1.1" + "@smithy/eventstream-codec" "^2.1.3" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@smithy/fetch-http-handler@^2.4.3": @@ -6058,24 +5532,14 @@ "@smithy/util-base64" "^2.1.1" tslib "^2.5.0" -"@smithy/hash-blob-browser@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-2.1.2.tgz#0e57a302587f9833e45a036479149990f414cedc" - integrity sha512-f8QHgOVSXeYsc4BLKWdfXRowKa2g9byAkAX5c7Ku89bi9uBquWLEVmKlYXFBlkX562Fkmp2YSeciv+zZuOrIOQ== +"@smithy/hash-blob-browser@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/hash-blob-browser/-/hash-blob-browser-2.1.3.tgz#f63b391a8bedf640ad120d576c485a10f16c280b" + integrity sha512-sHLTM5xQYw5Wxz07DFo+eh1PVC6P5+kazQRF1k5nsvOhZG5VnkIy4LZ7N0ZNWqJx16g9otGd5MvqUOpb3WWtgA== dependencies: "@smithy/chunked-blob-reader" "^2.1.1" "@smithy/chunked-blob-reader-native" "^2.1.1" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - -"@smithy/hash-node@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-node/-/hash-node-2.1.2.tgz#3dba95fc89d4758cb6189f2029d846677ac1364e" - integrity sha512-3Sgn4s0g4xud1M/j6hQwYCkz04lVJ24wvCAx4xI26frr3Ao6v0o2VZkBpUySTeQbMUBp2DhuzJ0fV1zybzkckw== - dependencies: - "@smithy/types" "^2.10.0" - "@smithy/util-buffer-from" "^2.1.1" - "@smithy/util-utf8" "^2.1.1" + "@smithy/types" "^2.10.1" tslib "^2.5.0" "@smithy/hash-node@^2.1.3": @@ -6088,23 +5552,15 @@ "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" -"@smithy/hash-stream-node@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-2.1.2.tgz#85f940809bf646e4f7c485c2f23a7b3f04ac0fb3" - integrity sha512-UB6xo+KN3axrLO+MfnWb8mtdeep4vjGUcjYCVFdk9h+OqUb7JYWZZLRcupRPZx28cNBCBEUtc9wVZDI71JDdQA== +"@smithy/hash-stream-node@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/hash-stream-node/-/hash-stream-node-2.1.3.tgz#c61f5d10cc236cef69af1278a552a42162bc254c" + integrity sha512-fWpUx2ca/u5lcD5RhNJogEG5FD7H0RDDpYmfQgxFqIUv3Ow7bZsapMukh8uzQPVO8R+NDAvSdxmgXoy4Hz8sFw== dependencies: - "@smithy/types" "^2.10.0" + "@smithy/types" "^2.10.1" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" -"@smithy/invalid-dependency@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.1.2.tgz#45c0b34ca9dee56920b9313d88fa5a9e78c7bf41" - integrity sha512-qdgKhkFYxDJnKecx2ANwz3JRkXjm0qDgEnAs5BIfb2z/XqA2l7s9BTH7GTC/RR4E8h6EDCeb5rM2rnARxviqIg== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/invalid-dependency@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/invalid-dependency/-/invalid-dependency-2.1.3.tgz#0f0895d3db2e03493f933e10c27551f059b92b6c" @@ -6120,39 +5576,30 @@ dependencies: tslib "^2.5.0" -"@smithy/md5-js@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-2.1.2.tgz#205253479128980d3313189dd79d23f63ec757a1" - integrity sha512-C/FWR5ooyDNDfc1Opx3n0QFO5p4G0gldIbk2VU9mPGnZVTjzXcWM5jUQp33My5UK305tKYpG5/kZdQSNVh+tLw== +"@smithy/md5-js@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@smithy/md5-js/-/md5-js-2.1.3.tgz#edf6a570a06fe84a126db90e335d6a5a12b25c69" + integrity sha512-zmn3M6+mP4IJlSmXBN9964AztgkIO8b5lRzAgdJn9AdCFwA6xLkcW2B6uEnpBjvotxtQMmXTUP19tIO7NmFPpw== dependencies: - "@smithy/types" "^2.10.0" + "@smithy/types" "^2.10.1" "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" -"@smithy/middleware-compression@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-compression/-/middleware-compression-2.1.2.tgz#381b19ef8f13c8ee25cd11d3291acf660a7c57e5" - integrity sha512-3uZPE/sA3OEVYEnVmcddn46dPycMs87CLES7bh7WEpKpOm+BP2akoRfD34wHdkx7EUEp+6B0IGc85zSdQLvdRQ== +"@smithy/middleware-compression@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@smithy/middleware-compression/-/middleware-compression-2.1.4.tgz#82d3cacc4a54749155602a4f6ea6f3ba917eb107" + integrity sha512-euMHyTkvKbndhLvoMKwDDZAcQPhVHv4prkEru2xkbH85ShC8SMLGjuTvQ6UcmOQCzuDZaMCBLhisKxbfn4GWWg== dependencies: "@smithy/is-array-buffer" "^2.1.1" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" + "@smithy/node-config-provider" "^2.2.4" + "@smithy/protocol-http" "^3.2.1" + "@smithy/types" "^2.10.1" "@smithy/util-config-provider" "^2.2.1" - "@smithy/util-middleware" "^2.1.2" + "@smithy/util-middleware" "^2.1.3" "@smithy/util-utf8" "^2.1.1" fflate "0.8.1" tslib "^2.5.0" -"@smithy/middleware-content-length@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.1.2.tgz#c114f955d2b0fd3b61b1068908dd8d87ed070107" - integrity sha512-XEWtul1tHP31EtUIobEyN499paUIbnCTRtjY+ciDCEXW81lZmpjrDG3aL0FxJDPnvatVQuMV1V5eg6MCqTFaLQ== - dependencies: - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/middleware-content-length@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/middleware-content-length/-/middleware-content-length-2.1.3.tgz#243d74789a311366948dec5a85b03146ac580c51" @@ -6162,19 +5609,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/middleware-endpoint@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.2.tgz#dc229e8ee59e9f73ffd1ab4e020b2fc25cf2e7fd" - integrity sha512-72qbmVwaWcLOd/OT52fszrrlXywPwciwpsRiIk/dIvpcwkpGE9qrYZ2bt/SYcA/ma8Rz9Ni2AbBuSXLDYISS+A== - dependencies: - "@smithy/middleware-serde" "^2.1.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/shared-ini-file-loader" "^2.3.2" - "@smithy/types" "^2.10.0" - "@smithy/url-parser" "^2.1.2" - "@smithy/util-middleware" "^2.1.2" - tslib "^2.5.0" - "@smithy/middleware-endpoint@^2.4.4": version "2.4.4" resolved "https://registry.yarnpkg.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.4.tgz#aa42dc8340a8511a8c66d597cf774e27f0109dd9" @@ -6188,21 +5622,6 @@ "@smithy/util-middleware" "^2.1.3" tslib "^2.5.0" -"@smithy/middleware-retry@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.1.2.tgz#39762d83970b0458db3ad3469349d455ac6af4a4" - integrity sha512-tlvSK+v9bPHHb0dLWvEaFW2Iz0IeA57ISvSaso36I33u8F8wYqo5FCvenH7TgMVBx57jyJBXOmYCZa9n5gdJIg== - dependencies: - "@smithy/node-config-provider" "^2.2.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/service-error-classification" "^2.1.2" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-retry" "^2.1.2" - tslib "^2.5.0" - uuid "^8.3.2" - "@smithy/middleware-retry@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@smithy/middleware-retry/-/middleware-retry-2.1.4.tgz#a468c64b0186b8edeef444ee9249a88675f3fe23" @@ -6218,14 +5637,6 @@ tslib "^2.5.0" uuid "^8.3.2" -"@smithy/middleware-serde@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.1.2.tgz#15b8258b806ecffd0a4c3fec3e56458cdef7ae66" - integrity sha512-XNU6aVIhlSbjuo2XsfZ7rd4HhjTXDlNWxAmhlBfViTW1TNK02CeWdeEntp5XtQKYD//pyTIbYi35EQvIidAkOw== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/middleware-serde@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/middleware-serde/-/middleware-serde-2.1.3.tgz#dbb3c4257b66fdab3019809106b02f953bd42a44" @@ -6234,14 +5645,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/middleware-stack@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.1.2.tgz#17dbb56d85f51cb2c86c13dbad7fca35c843c61c" - integrity sha512-EPGaHGd4XmZcaRYjbhyqiqN/Q/ESxXu5e5TK24CTZUe99y8/XCxmiX8VLMM4H0DI7K3yfElR0wPAAvceoSkTgw== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/middleware-stack@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/middleware-stack/-/middleware-stack-2.1.3.tgz#7cf77e6ad5c885bc0b8b0857e9349017d530f7d1" @@ -6260,16 +5663,6 @@ "@smithy/types" "^1.2.0" tslib "^2.5.0" -"@smithy/node-config-provider@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.2.2.tgz#9422a0764dea8dec4a24f9aa570771d921dc657b" - integrity sha512-QXvpqHSijAm13ZsVkUo92b085UzDvYP1LblWTb3uWi9WilhDvYnVyPLXaryLhOWZ2YvdhK2170T3ZBqtg+quIQ== - dependencies: - "@smithy/property-provider" "^2.1.2" - "@smithy/shared-ini-file-loader" "^2.3.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/node-config-provider@^2.2.4": version "2.2.4" resolved "https://registry.yarnpkg.com/@smithy/node-config-provider/-/node-config-provider-2.2.4.tgz#6c2406a47c4ece45f158a282bb148a6be7867817" @@ -6280,17 +5673,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/node-http-handler@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.4.0.tgz#21e48aa56ab334eee8afc69bb05f38f3883c3e95" - integrity sha512-Mf2f7MMy31W8LisJ9O+7J5cKiNwBwBBLU6biQ7/sFSFdhuOxPN7hOPoZ8vlaFjvrpfOUJw9YOpjGyNTKuvomOQ== - dependencies: - "@smithy/abort-controller" "^2.1.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/querystring-builder" "^2.1.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/node-http-handler@^2.4.1": version "2.4.1" resolved "https://registry.yarnpkg.com/@smithy/node-http-handler/-/node-http-handler-2.4.1.tgz#08409108460fcfaa9068f78e1ef655d7af952fef" @@ -6310,14 +5692,6 @@ "@smithy/types" "^1.2.0" tslib "^2.5.0" -"@smithy/property-provider@^2.1.1", "@smithy/property-provider@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.1.2.tgz#16c630ae0354c05595c99c6ab70a877ee9a180e4" - integrity sha512-yaXCVFKzxbSXqOoyA7AdAgXhwdjiLeui7n2P6XLjBCz/GZFdLUJgSY6KL1PevaxT4REMwUSs/bSHAe/0jdzEHw== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/property-provider@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/property-provider/-/property-provider-2.1.3.tgz#faaa9b7f605725168493e74600a74beca1b059fb" @@ -6326,14 +5700,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/protocol-http@^3.2.0": - version "3.2.0" - resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.2.0.tgz#1b9ed9eb18cd256e0d7872ec2851f5d12ba37d87" - integrity sha512-VRp0YITYIQum+rX4zeZ3cW1wl9r90IQzQN+VLS1NxdSMt6NLsJiJqR9czTxlaeWNrLHsFAETmjmdrS48Ug1liA== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/protocol-http@^3.2.1": version "3.2.1" resolved "https://registry.yarnpkg.com/@smithy/protocol-http/-/protocol-http-3.2.1.tgz#946fcd076525f8208d659fbc70e2a32d21ed1291" @@ -6342,15 +5708,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/querystring-builder@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.1.2.tgz#78f028c25253e514915247b25c20b3cf0d6a035b" - integrity sha512-wk6QpuvBBLJF5w8aADsZOtxaHY9cF5MZe1Ry3hSqqBxARdUrMoXi/jukUz5W0ftXGlbA398IN8dIIUj3WXqJXg== - dependencies: - "@smithy/types" "^2.10.0" - "@smithy/util-uri-escape" "^2.1.1" - tslib "^2.5.0" - "@smithy/querystring-builder@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/querystring-builder/-/querystring-builder-2.1.3.tgz#e64e126f565b2aae6e9abd1bebc9aa0839842e8d" @@ -6368,14 +5725,6 @@ "@smithy/types" "^1.2.0" tslib "^2.5.0" -"@smithy/querystring-parser@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.1.2.tgz#3883dfec5760f0f8cdf9acc837bdc631069df576" - integrity sha512-z1yL5Iiagm/UxVy1tcuTFZdfOBK/QtYeK6wfClAJ7cOY7kIaYR6jn1cVXXJmhAQSh1b2ljP4xiZN4Ybj7Tbs5w== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/querystring-parser@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/querystring-parser/-/querystring-parser-2.1.3.tgz#2786dfa36ac6c7a691eb651339fbcaf160891e69" @@ -6384,13 +5733,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/service-error-classification@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.1.2.tgz#b8b5c23a784bcb1eb229a921d7040575e29e38ed" - integrity sha512-R+gL1pAPuWkH6unFridk57wDH5PFY2IlVg2NUjSAjoaIaU+sxqKf/7AOWIcx9Bdn+xY0/4IRQ69urlC+F3I9gg== - dependencies: - "@smithy/types" "^2.10.0" - "@smithy/service-error-classification@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/service-error-classification/-/service-error-classification-2.1.3.tgz#13dd43ad56576e2b1b7c5a1581affdb9e34dc8ed" @@ -6406,14 +5748,6 @@ "@smithy/types" "^1.2.0" tslib "^2.5.0" -"@smithy/shared-ini-file-loader@^2.3.1", "@smithy/shared-ini-file-loader@^2.3.2": - version "2.3.2" - resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.2.tgz#3e4943b534eaabda15372e611cdb428dfdd88362" - integrity sha512-idHGDJB+gBh+aaIjmWj6agmtNWftoyAenErky74hAtKyUaCvfocSBgEJ2pQ6o68svBluvGIj4NGFgJu0198mow== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/shared-ini-file-loader@^2.3.3", "@smithy/shared-ini-file-loader@^2.3.4": version "2.3.4" resolved "https://registry.yarnpkg.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.4.tgz#2357bd9dfbb67a951ccd06ca9c872aa845fad888" @@ -6422,20 +5756,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/signature-v4@^2.1.1": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.1.2.tgz#a658df8a5fcb57160e1c364d43b46e0d14f5995f" - integrity sha512-DdPWaNGIbxzyocR3ncH8xlxQgsqteRADEdCPoivgBzwv17UzKy2obtdi2vwNc5lAJ955bGEkkWef9O7kc1Eocg== - dependencies: - "@smithy/eventstream-codec" "^2.1.2" - "@smithy/is-array-buffer" "^2.1.1" - "@smithy/types" "^2.10.0" - "@smithy/util-hex-encoding" "^2.1.1" - "@smithy/util-middleware" "^2.1.2" - "@smithy/util-uri-escape" "^2.1.1" - "@smithy/util-utf8" "^2.1.1" - tslib "^2.5.0" - "@smithy/signature-v4@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/signature-v4/-/signature-v4-2.1.3.tgz#ff6b812ce562be97ce182376aeb22e558b64776b" @@ -6450,18 +5770,6 @@ "@smithy/util-utf8" "^2.1.1" tslib "^2.5.0" -"@smithy/smithy-client@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.4.0.tgz#f4cef6f63cdc267a32ded8446ca3db0ebb8fe64d" - integrity sha512-6/jxk0om9l2s9BcgHtrBn+Hd3xcFGDzxfEJ2FvGpZxIz0S7bgvZg1gyR66O1xf1w9WZBH+W7JClhfSn2gETINw== - dependencies: - "@smithy/middleware-endpoint" "^2.4.2" - "@smithy/middleware-stack" "^2.1.2" - "@smithy/protocol-http" "^3.2.0" - "@smithy/types" "^2.10.0" - "@smithy/util-stream" "^2.1.2" - tslib "^2.5.0" - "@smithy/smithy-client@^2.4.2": version "2.4.2" resolved "https://registry.yarnpkg.com/@smithy/smithy-client/-/smithy-client-2.4.2.tgz#79e960c8761ae7dc06f592d2691419706745aab7" @@ -6481,13 +5789,6 @@ dependencies: tslib "^2.5.0" -"@smithy/types@^2.10.0": - version "2.10.0" - resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.10.0.tgz#1cc16e3c04d56c49ecb88efa1b7fa9ca3a90d667" - integrity sha512-QYXQmpIebS8/jYXgyJjCanKZbI4Rr8tBVGBAIdDhA35f025TVjJNW69FJ0TGiDqt+lIGo037YIswq2t2Y1AYZQ== - dependencies: - tslib "^2.5.0" - "@smithy/types@^2.10.1": version "2.10.1" resolved "https://registry.yarnpkg.com/@smithy/types/-/types-2.10.1.tgz#f2a923fd080447ad2ca19bfd8a77abf15be0b8e8" @@ -6504,15 +5805,6 @@ "@smithy/types" "^1.2.0" tslib "^2.5.0" -"@smithy/url-parser@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.1.2.tgz#915590d97a7c6beb0dcebc9e9458345cf6bf7f48" - integrity sha512-KBPi740ciTujUaY+RfQuPABD0QFmgSBN5qNVDCGTryfsbG4jkwC0YnElSzi72m24HegMyxzZDLG4Oh4/97mw2g== - dependencies: - "@smithy/querystring-parser" "^2.1.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/url-parser@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/url-parser/-/url-parser-2.1.3.tgz#f8a7176fb6fdd38a960d546606576541ae6eb7c0" @@ -6559,17 +5851,6 @@ dependencies: tslib "^2.5.0" -"@smithy/util-defaults-mode-browser@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.2.tgz#5f4c328605635656dee624a1686c7616aadccf4d" - integrity sha512-YmojdmsE7VbvFGJ/8btn/5etLm1HOQkgVX6nMWlB0yBL/Vb//s3aTebUJ66zj2+LNrBS3B9S+18+LQU72Yj0AQ== - dependencies: - "@smithy/property-provider" "^2.1.2" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - bowser "^2.11.0" - tslib "^2.5.0" - "@smithy/util-defaults-mode-browser@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.4.tgz#e3e85f44480bf8c83a2e22247dd5a7a820ceb655" @@ -6581,19 +5862,6 @@ bowser "^2.11.0" tslib "^2.5.0" -"@smithy/util-defaults-mode-node@^2.2.1": - version "2.2.1" - resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.1.tgz#034918f2f945974e7414c092cb250f2d45fe0ceb" - integrity sha512-kof7M9Q2qP5yaQn8hHJL3KwozyvIfLe+ys7feifSul6gBAAeoraibo/MWqotb/I0fVLMlCMDwn7WXFsGUwnsew== - dependencies: - "@smithy/config-resolver" "^2.1.2" - "@smithy/credential-provider-imds" "^2.2.2" - "@smithy/node-config-provider" "^2.2.2" - "@smithy/property-provider" "^2.1.2" - "@smithy/smithy-client" "^2.4.0" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/util-defaults-mode-node@^2.2.3": version "2.2.3" resolved "https://registry.yarnpkg.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.3.tgz#23f876eb107ef066c042b4dfdeef637a7c330bb5" @@ -6607,15 +5875,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/util-endpoints@^1.1.2": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.1.2.tgz#92f743ac8c2c3a99b1558a1c956864b565aa23e7" - integrity sha512-2/REfdcJ20y9iF+9kSBRBsaoGzjT5dZ3E6/TA45GHJuJAb/vZTj76VLTcrl2iN3fWXiDK1B8RxchaLGbr7RxxA== - dependencies: - "@smithy/node-config-provider" "^2.2.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/util-endpoints@^1.1.4": version "1.1.4" resolved "https://registry.yarnpkg.com/@smithy/util-endpoints/-/util-endpoints-1.1.4.tgz#4a75de883ac59d042ae5426c9a7d8e274d047980" @@ -6632,14 +5891,6 @@ dependencies: tslib "^2.5.0" -"@smithy/util-middleware@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.1.2.tgz#5e2e13c96e95b65ae5980a658e1b10e222a42482" - integrity sha512-lvSOnwQ7iAajtWb1nAyy0CkOIn8d+jGykQOtt2NXDsPzOTfejZM/Uph+O/TmVgWoXdcGuw5peUMG2f5xEIl6UQ== - dependencies: - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/util-middleware@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/util-middleware/-/util-middleware-2.1.3.tgz#6169d7b1088d2bb29d0129c9146c856a61026e98" @@ -6648,15 +5899,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/util-retry@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.1.2.tgz#4b7d3ac79ad9a3b3cb01d21d8fe5ea0b99390b90" - integrity sha512-pqifOgRqwLfRu+ks3awEKKqPeYxrHLwo4Yu2EarGzeoarTd1LVEyyf5qLE6M7IiCsxnXRhn9FoWIdZOC+oC/VQ== - dependencies: - "@smithy/service-error-classification" "^2.1.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/util-retry@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/util-retry/-/util-retry-2.1.3.tgz#715a5c02c194ae56b9be49fda510b362fb075af3" @@ -6666,20 +5908,6 @@ "@smithy/types" "^2.10.1" tslib "^2.5.0" -"@smithy/util-stream@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.1.2.tgz#c1ab318fa2f14ef044bdec7cb93a9ffc36388f85" - integrity sha512-AbGjvoSok7YeUKv9WRVRSChQfsufLR54YCAabTbaABRdIucywRQs29em0uAP6r4RLj+4aFZStWGYpFgT0P8UlQ== - dependencies: - "@smithy/fetch-http-handler" "^2.4.2" - "@smithy/node-http-handler" "^2.4.0" - "@smithy/types" "^2.10.0" - "@smithy/util-base64" "^2.1.1" - "@smithy/util-buffer-from" "^2.1.1" - "@smithy/util-hex-encoding" "^2.1.1" - "@smithy/util-utf8" "^2.1.1" - tslib "^2.5.0" - "@smithy/util-stream@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/util-stream/-/util-stream-2.1.3.tgz#fd0de1d8dcb0015a95735df7229b4a1ded06b50e" @@ -6709,15 +5937,6 @@ "@smithy/util-buffer-from" "^2.1.1" tslib "^2.5.0" -"@smithy/util-waiter@^2.1.2": - version "2.1.2" - resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.1.2.tgz#194f8cbd9c8c7c6e03d57c22eb057fb6f30e0b44" - integrity sha512-yxLC57GBDmbDmrnH+vJxsrbV4/aYUucBONkSRLZyJIVFAl/QJH+O/h+phITHDaxVZCYZAcudYJw4ERE32BJM7g== - dependencies: - "@smithy/abort-controller" "^2.1.2" - "@smithy/types" "^2.10.0" - tslib "^2.5.0" - "@smithy/util-waiter@^2.1.3": version "2.1.3" resolved "https://registry.yarnpkg.com/@smithy/util-waiter/-/util-waiter-2.1.3.tgz#b3e4c0374e5ee46ecc9eae7812fa870d7b192897" @@ -6758,74 +5977,74 @@ "@types/readline-sync" "^1.4.4" readline-sync "^1.4.10" -"@swc/core-darwin-arm64@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz#3b5677c5b9c5a7a91d953b96cd603c94064e2835" - integrity sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw== +"@swc/core-darwin-arm64@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.4.tgz#1f883b8569374789f582b67399e1ae31f588a7eb" + integrity sha512-goSHS8yvDgha93RHIV2Vn50neYasqbc4K1g/nKOV6T8kiKVv4w/rmqNJu9Aa0mPGVJtjcr0NvX6bBwE0T4HIzg== -"@swc/core-darwin-x64@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz#bbc8bbf420389b12541151255a50f319cc17ef96" - integrity sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ== +"@swc/core-darwin-x64@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.4.4.tgz#9ad946e3413135b7262f76cb9e163ca47c52ec4e" + integrity sha512-PLfgL355qsl5c5kUPsFGITgVXoaqjp9sCd0Y5Z5uN7RtSOvwIX28e23eCxj02dOr7OBr8sq6qBlEMDV03T24Iw== -"@swc/core-linux-arm-gnueabihf@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz#aa9a18f130820717df08c9dd882043fc47e8d35a" - integrity sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ== +"@swc/core-linux-arm-gnueabihf@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.4.tgz#f946e1c67b0f50656d4ba730c16504ca140fb9ac" + integrity sha512-BVEZVOGnaZvEcHm//KyYzhte46vdF67wLVtmQEXPAlrkRgZ3b/JSySeLXqeocAcOANWb1/SPHlEmPK5azP+JvQ== -"@swc/core-linux-arm64-gnu@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz#5ef1de0ca7cc3a034aa3a1c3c1794b78e6ca207e" - integrity sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA== +"@swc/core-linux-arm64-gnu@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.4.tgz#6c65cb9c3e625ead94f7fdce5efe107511f20f2d" + integrity sha512-ZbOJfVbCjVMKdfvvJDOTpa3tGqU6tfxng1CDjA62RUcqa7sRbovrjSiw6mq5/4EoOF4zK8CtPIG+TlxKPapnuw== -"@swc/core-linux-arm64-musl@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz#5dfd2a8c0483770a307de0ccb6019a082ff0d902" - integrity sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw== +"@swc/core-linux-arm64-musl@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.4.tgz#7547931a624b0038579996d77f97b48456856b05" + integrity sha512-+Gjo1W4tY/4kgEe5h22iuCWkpKcPMccXwYaSLNvgBCBQADB0zKFfF0lNf7y6U+81NFEjhRsdwXMsRGZtgTpUrg== -"@swc/core-linux-x64-gnu@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz#314aa76b7c1208e315e3156ab57b7188fb605bc2" - integrity sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg== +"@swc/core-linux-x64-gnu@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.4.tgz#2bb9725df9302d5acb985e0d725969a4d236c8b4" + integrity sha512-PR/VbGm0LEkhpm5qClovZWhE/jYoQSyIeyPh8XY39uUI1u2yEfuz5UCW2sJJIWOvNiAfu7+TjW+9H/I7zBBDJA== -"@swc/core-linux-x64-musl@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz#b2b226657f6a8d48f561cb3dbe2d414cfbafe467" - integrity sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ== +"@swc/core-linux-x64-musl@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.4.tgz#3df80f9dbfffa4a8f9445558cde32c47e607a9de" + integrity sha512-poT9zub4CyVcH1cxwGdrGiZD3urfOaYs/Kd52ve3ymPPeQZq7qQwKqAB/9NxoSiJDaSzJv5OwTEfgaBYCyw0iw== -"@swc/core-win32-arm64-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz#582f79fa328ce0f426ab8313b3d881e7315fab2f" - integrity sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ== +"@swc/core-win32-arm64-msvc@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.4.tgz#1dcc3ae7e2c347a3aea705fd3b40edb542e18b39" + integrity sha512-29V5/fBd6XXFb7J/ri9ZeSS/GTqXfSWa3BiE0zTNbASpQbEXf+YPYiAtO6c1HqNyQobKB9ni+w7sa8KkAGhHXw== -"@swc/core-win32-ia32-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz#15c8289e1c18857f79b9b888100ab1f871bf58f6" - integrity sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA== +"@swc/core-win32-ia32-msvc@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.4.tgz#751c205a539cda8511635f11afa3f562f8cb02f6" + integrity sha512-2lKEGEjpBOq0z4Nk0tFP9wxVwxgz7FonmjCkzJ95GBb5KNvMrgQQrGNGX6L0hoBo/a1kE752I6V5pOaMyIq5xQ== -"@swc/core-win32-x64-msvc@1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz#c999ca7b68124d058b40a1431cdd6f56779670d5" - integrity sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw== +"@swc/core-win32-x64-msvc@1.4.4": + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.4.tgz#96f54b2339c66015a2df96c14973b38cbfe7b7aa" + integrity sha512-xuN0oJhAewga8jNJkT5Wx25RPVnIEMZCYf4irqA5jiK6GckOdcXB8jvEJhggOxnJSW8RDsAtY5q+zw5kNkU+eA== "@swc/core@^1.3.107": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.2.tgz#310b0d5e93e47ca72f54150c8f9efcb434c39b17" - integrity sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg== + version "1.4.4" + resolved "https://registry.yarnpkg.com/@swc/core/-/core-1.4.4.tgz#d4f9f8a494f39da1a454c503027ba0d2cb953ac5" + integrity sha512-P88AHGWM8xPY3Tjj5360V6vqKCS5UfsyffPJVnr7BKSr45rlG4/pjEGGmFYQjg6ztgPyrGLYz1jSyzajTqTVIA== dependencies: "@swc/counter" "^0.1.2" "@swc/types" "^0.1.5" optionalDependencies: - "@swc/core-darwin-arm64" "1.4.2" - "@swc/core-darwin-x64" "1.4.2" - "@swc/core-linux-arm-gnueabihf" "1.4.2" - "@swc/core-linux-arm64-gnu" "1.4.2" - "@swc/core-linux-arm64-musl" "1.4.2" - "@swc/core-linux-x64-gnu" "1.4.2" - "@swc/core-linux-x64-musl" "1.4.2" - "@swc/core-win32-arm64-msvc" "1.4.2" - "@swc/core-win32-ia32-msvc" "1.4.2" - "@swc/core-win32-x64-msvc" "1.4.2" + "@swc/core-darwin-arm64" "1.4.4" + "@swc/core-darwin-x64" "1.4.4" + "@swc/core-linux-arm-gnueabihf" "1.4.4" + "@swc/core-linux-arm64-gnu" "1.4.4" + "@swc/core-linux-arm64-musl" "1.4.4" + "@swc/core-linux-x64-gnu" "1.4.4" + "@swc/core-linux-x64-musl" "1.4.4" + "@swc/core-win32-arm64-msvc" "1.4.4" + "@swc/core-win32-ia32-msvc" "1.4.4" + "@swc/core-win32-x64-msvc" "1.4.4" "@swc/counter@^0.1.2": version "0.1.3" @@ -6980,9 +6199,9 @@ integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== "@types/aws-lambda@^8.10.108", "@types/aws-lambda@^8.10.111": - version "8.10.134" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.134.tgz#8f65d86736839889194f7892b7bec6b8a7ec6fc3" - integrity sha512-cfv422ivDMO+EeA3N4YcshbTHBL+5lLXe+Uz+4HXvIcsCuWvqNFpOs28ZprL8NA3qRCzt95ETiNAJDn4IcC/PA== + version "8.10.135" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.135.tgz#c2f79ca42de77dbd1c7db35704895237c0da1e77" + integrity sha512-kD3aDbS5la1LcS89a4bJTLVSJI5euO2fx3euZTge7SbArH7+kcoLS+lK87cdI5GCEfiBQSio5gz546N0FhMmjg== "@types/aws4@^1.11.3": version "1.11.6" @@ -7144,14 +6363,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@^20.4.2": - version "20.11.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.20.tgz#f0a2aee575215149a62784210ad88b3a34843659" - integrity sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.11.16": +"@types/node@*", "@types/node@^20.11.16", "@types/node@^20.4.2": version "20.11.24" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.24.tgz#cc207511104694e84e9fb17f9a0c4c42d4517792" integrity sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long== @@ -7174,9 +6386,9 @@ integrity sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng== "@types/react-dom@^18.0.0", "@types/react-dom@^18.0.11": - version "18.2.19" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.19.tgz#b84b7c30c635a6c26c6a6dfbb599b2da9788be58" - integrity sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA== + version "18.2.20" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.20.tgz#cbdf7abb3cc2377980bb1294bc51375016a8320f" + integrity sha512-HXN/biJY8nv20Cn9ZbCFq3liERd4CozVZmKbaiZ9KiKTrWqsP7eoGDO6OOGvJQwoVFuiXaiJ7nBBjiFFbRmQMQ== dependencies: "@types/react" "*" @@ -7188,9 +6400,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.0.28": - version "18.2.59" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.59.tgz#14c7bcab22e2ce71d9eaa02f78d3d55067724d7f" - integrity sha512-DE+F6BYEC8VtajY85Qr7mmhTd/79rJKIHCg99MU9SWPB4xvLb6D1za2vYflgZfmPqQVEr6UqJTnLXEwzpVPuOg== + version "18.2.63" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.63.tgz#4637c56146ad90f96d0583171edab953f7e6fe57" + integrity sha512-ppaqODhs15PYL2nGUOaOu2RSCCB4Difu4UFrP4I3NHLloXC/ESQzQMi9nvjfT1+rudd0d2L3fQPJxRSey+rGlQ== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -7917,7 +7129,7 @@ array-ify@^1.0.0: resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.6: +array-includes@^3.1.6, array-includes@^3.1.7: version "3.1.7" resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== @@ -7933,6 +7145,17 @@ array-union@^2.1.0: resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== +array.prototype.findlast@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/array.prototype.findlast/-/array.prototype.findlast-1.2.4.tgz#eeb9e45fc894055c82e5675c463e8077b827ad36" + integrity sha512-BMtLxpV+8BD+6ZPFIWmnUBpQoy+A+ujcg4rhp2iwCRJYA7PEh2MS4NL3lz8EiDlLrJPp2hg9qWihr5pd//jcGw== + dependencies: + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.3.0" + es-shim-unscopables "^1.0.2" + array.prototype.flat@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" @@ -7943,7 +7166,7 @@ array.prototype.flat@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.flatmap@^1.3.1: +array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== @@ -7953,7 +7176,17 @@ array.prototype.flatmap@^1.3.1: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -array.prototype.tosorted@^1.1.1: +array.prototype.toreversed@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba" + integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz#c8c89348337e51b8a3c48a9227f9ce93ceedcba8" integrity sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg== @@ -8056,12 +7289,12 @@ attr-accept@^2.2.2: integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== autoprefixer@^10.4.14: - version "10.4.17" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.17.tgz#35cd5695cbbe82f536a50fa025d561b01fdec8be" - integrity sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg== + version "10.4.18" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.18.tgz#fcb171a3b017be7cb5d8b7a825f5aacbf2045163" + integrity sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g== dependencies: - browserslist "^4.22.2" - caniuse-lite "^1.0.30001578" + browserslist "^4.23.0" + caniuse-lite "^1.0.30001591" fraction.js "^4.3.7" normalize-range "^0.1.2" picocolors "^1.0.0" @@ -8113,9 +7346,9 @@ aws-sdk-client-mock@^2.0.1: tslib "^2.1.0" aws-sdk@^2.1404.0, aws-sdk@^2.346.0, aws-sdk@^2.814.0: - version "2.1566.0" - resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1566.0.tgz#39187aa5fa7fdccae7154b9be54a0a2a9c917f97" - integrity sha512-4LmOUWrHUk/SIIWzn7j6DaGs92zjDH42v0dovPw7l5usb8ZAQ5yk1bDltM/xs1C/L36gkxixEFVjv7Ac1KNgNw== + version "2.1571.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1571.0.tgz#900055174094f621d9e1a21b84a7093fa4d9992a" + integrity sha512-Hixs1aD+7IwsP/Bkb7StFCrOC9ejmw8zBv8xVqEtEughRX6AF8bLKFRoJRbD4V6TrM+gPGpCqoFlpa84HLHkSA== dependencies: buffer "4.9.2" events "1.1.1" @@ -8303,7 +7536,7 @@ brotli@^1.3.3: dependencies: base64-js "^1.1.2" -browserslist@^4.22.2: +browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -8442,7 +7675,7 @@ cacache@^16.1.0: tar "^6.1.11" unique-filename "^2.0.0" -cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.3: +cacache@^17.0.0, cacache@^17.0.4, cacache@^17.1.4: version "17.1.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== @@ -8523,10 +7756,10 @@ camelize@^1.0.0: resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.1.tgz#89b7e16884056331a35d6b5ad064332c91daa6c3" integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== -caniuse-lite@^1.0.30001578, caniuse-lite@^1.0.30001587: - version "1.0.30001589" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" - integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== +caniuse-lite@^1.0.30001587, caniuse-lite@^1.0.30001591: + version "1.0.30001594" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001594.tgz#bea552414cd52c2d0c985ed9206314a696e685f5" + integrity sha512-VblSX6nYqyJVs8DKFMldE2IVCJjZ225LW00ydtUWwh5hk9IfkTOffO6r8gJNsH0qqqeAF8KrbMYA2VEwTlGW5g== cardinal@^2.1.1: version "2.1.1" @@ -8643,11 +7876,16 @@ chownr@^2.0.0: resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== -ci-info@^3.2.0, ci-info@^3.3.2, ci-info@^3.6.1, ci-info@^3.7.1, ci-info@^3.8.0: +ci-info@^3.2.0, ci-info@^3.3.2, ci-info@^3.8.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== +ci-info@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-4.0.0.tgz#65466f8b280fc019b9f50a5388115d17a63a44f2" + integrity sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== + cidr-regex@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d" @@ -8674,13 +7912,13 @@ clean-stack@^5.2.0: dependencies: escape-string-regexp "5.0.0" -cli-color@^2.0.1, cli-color@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.3.tgz#73769ba969080629670f3f2ef69a4bf4e7cc1879" - integrity sha512-OkoZnxyC4ERN3zLzZaY9Emb7f/MhBOIpePv0Ycok0fJYT+Ouo00UBEIwsVsr0yoow++n5YWlSUgST9GKhNHiRQ== +cli-color@^2.0.1, cli-color@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-2.0.4.tgz#d658080290968816b322248b7306fad2346fb2c8" + integrity sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA== dependencies: d "^1.0.1" - es5-ext "^0.10.61" + es5-ext "^0.10.64" es6-iterator "^2.0.3" memoizee "^0.4.15" timers-ext "^0.1.7" @@ -8701,17 +7939,17 @@ cli-cursor@^3, cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-progress-footer@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/cli-progress-footer/-/cli-progress-footer-2.3.2.tgz#1c13ba3c3dd894ef366f4a4f0620b3067284154d" - integrity sha512-uzHGgkKdeA9Kr57eyH1W5HGiNShP8fV1ETq04HDNM1Un6ShXbHhwi/H8LNV9L1fQXKjEw0q5FUkEVNuZ+yZdSw== + version "2.3.3" + resolved "https://registry.yarnpkg.com/cli-progress-footer/-/cli-progress-footer-2.3.3.tgz#b46957f132dea6444158c23921a937a6f95a0783" + integrity sha512-p+hyTPxSZWG1c3Qy1DLBoGZhpeA3Y6AMlKrtbGpMMSKpezbSLel8gW4e5You4FNlHb3wS/M1JU594OAWe/Totg== dependencies: - cli-color "^2.0.2" + cli-color "^2.0.4" d "^1.0.1" - es5-ext "^0.10.61" + es5-ext "^0.10.64" mute-stream "0.0.8" process-utils "^4.0.0" timers-ext "^0.1.7" - type "^2.6.0" + type "^2.7.2" cli-spinners@^2.5.0, cli-spinners@^2.9.2: version "2.9.2" @@ -9133,13 +8371,13 @@ csstype@^3.0.2, csstype@^3.1.3: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== -d@1, d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== +d@1, d@^1.0.1, d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.2.tgz#2aefd554b81981e7dccf72d6842ae725cb17e5de" + integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw== dependencies: - es5-ext "^0.10.50" - type "^1.0.1" + es5-ext "^0.10.64" + type "^2.7.2" dashdash@^1.12.0: version "1.14.1" @@ -9528,9 +8766,9 @@ ecdsa-sig-formatter@1.0.11: safe-buffer "^5.0.1" electron-to-chromium@^1.4.668: - version "1.4.682" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.682.tgz#27577b88ccccc810e09b05093345cf1830f1bd65" - integrity sha512-oCglfs8yYKs9RQjJFOHonSnhikPK3y+0SvSYc/YpYJV//6rqc0/hbwd0c7vgK4vrl6y2gJAwjkhkSGWK+z4KRA== + version "1.4.693" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.693.tgz#001bb5dcb57ba404366ec39e1957d11886fc8a93" + integrity sha512-/if4Ueg0GUQlhCrW2ZlXwDAm40ipuKo+OgeHInlL8sbjt+hzISxZK949fZeJaVsheamrzANXvw1zQTvbxTvSHw== emoji-regex@^8.0.0: version "8.0.0" @@ -9592,17 +8830,17 @@ error-ex@^1.3.1, error-ex@^1.3.2: is-arrayish "^0.2.1" es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: - version "1.22.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.4.tgz#26eb2e7538c3271141f5754d31aabfdb215f27bf" - integrity sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg== + version "1.22.5" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.5.tgz#1417df4e97cc55f09bf7e58d1e614bc61cb8df46" + integrity sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w== dependencies: array-buffer-byte-length "^1.0.1" arraybuffer.prototype.slice "^1.0.3" - available-typed-arrays "^1.0.6" + available-typed-arrays "^1.0.7" call-bind "^1.0.7" es-define-property "^1.0.0" es-errors "^1.3.0" - es-set-tostringtag "^2.0.2" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" get-intrinsic "^1.2.4" @@ -9610,15 +8848,15 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: globalthis "^1.0.3" gopd "^1.0.1" has-property-descriptors "^1.0.2" - has-proto "^1.0.1" + has-proto "^1.0.3" has-symbols "^1.0.3" hasown "^2.0.1" internal-slot "^1.0.7" is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" is-typed-array "^1.1.13" is-weakref "^1.0.2" @@ -9631,10 +8869,10 @@ es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.22.4: string.prototype.trim "^1.2.8" string.prototype.trimend "^1.0.7" string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.1" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.5" unbox-primitive "^1.0.2" which-typed-array "^1.1.14" @@ -9679,7 +8917,7 @@ es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-iterator-helpers@^1.0.12: +es-iterator-helpers@^1.0.17: version "1.0.17" resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.17.tgz#123d1315780df15b34eb181022da43e734388bb8" integrity sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ== @@ -9700,7 +8938,7 @@ es-iterator-helpers@^1.0.12: iterator.prototype "^1.1.2" safe-array-concat "^1.1.0" -es-set-tostringtag@^2.0.2: +es-set-tostringtag@^2.0.2, es-set-tostringtag@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== @@ -9725,10 +8963,10 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.47, es5-ext@^0.10.49, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.61, es5-ext@^0.10.62, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: - version "0.10.63" - resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.63.tgz#9c222a63b6a332ac80b1e373b426af723b895bd6" - integrity sha512-hUCZd2Byj/mNKjfP9jXrdVZ62B8KuA/VoK7X8nUh5qT+AxDmcbvZz041oDVZdbIN1qW6XY9VDNwzkvKnZvK2TQ== +es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.47, es5-ext@^0.10.49, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.62, es5-ext@^0.10.64, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46: + version "0.10.64" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.64.tgz#12e4ffb48f1ba2ea777f1fcdd1918ef73ea21714" + integrity sha512-p2snDhiLaXe6dahss1LddxqEm+SkuDvV8dnIQG0MWjyHpcMNfXKPE+/Cc0y+PhxJX3A4xGNeFCj5oc0BUh6deg== dependencies: es6-iterator "^2.0.3" es6-symbol "^3.1.3" @@ -9757,12 +8995,12 @@ es6-set@^0.1.6: type "^2.7.2" es6-symbol@^3.1.1, es6-symbol@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + version "3.1.4" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.4.tgz#f4e7d28013770b4208ecbf3e0bf14d3bcb557b8c" + integrity sha512-U9bFFjX8tFiATgtkJ1zg25+KviIXpgRvRHS8sau3GfhVzThRQrOeksPeT0BWW2MNZs1OEWJ1DPXOQMn0KKRkvg== dependencies: - d "^1.0.1" - ext "^1.1.2" + d "^1.0.2" + ext "^1.7.0" es6-weak-map@^2.0.3: version "2.0.3" @@ -9868,26 +9106,28 @@ escodegen@^2.0.0: source-map "~0.6.1" eslint-plugin-react@^7.32.2, eslint-plugin-react@^7.33.2: - version "7.33.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" - integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== - dependencies: - array-includes "^3.1.6" - array.prototype.flatmap "^1.3.1" - array.prototype.tosorted "^1.1.1" + version "7.34.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.0.tgz#ab71484d54fc409c37025c5eca00eb4177a5e88c" + integrity sha512-MeVXdReleBTdkz/bvcQMSnCXGi+c9kvy51IpinjnJgutl3YTHWsDdke7Z1ufZpGfDG8xduBDKyjtB9JH1eBKIQ== + dependencies: + array-includes "^3.1.7" + array.prototype.findlast "^1.2.4" + array.prototype.flatmap "^1.3.2" + array.prototype.toreversed "^1.1.2" + array.prototype.tosorted "^1.1.3" doctrine "^2.1.0" - es-iterator-helpers "^1.0.12" + es-iterator-helpers "^1.0.17" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" - object.entries "^1.1.6" - object.fromentries "^2.0.6" - object.hasown "^1.1.2" - object.values "^1.1.6" + object.entries "^1.1.7" + object.fromentries "^2.0.7" + object.hasown "^1.1.3" + object.values "^1.1.7" prop-types "^15.8.1" - resolve "^2.0.0-next.4" + resolve "^2.0.0-next.5" semver "^6.3.1" - string.prototype.matchall "^4.0.8" + string.prototype.matchall "^4.0.10" eslint-scope@^5.1.1: version "5.1.1" @@ -10126,7 +9366,7 @@ ext-name@^5.0.0: ext-list "^2.0.0" sort-keys-length "^1.0.0" -ext@^1.1.2, ext@^1.4.0, ext@^1.6.0, ext@^1.7.0: +ext@^1.4.0, ext@^1.6.0, ext@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f" integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw== @@ -10605,7 +9845,7 @@ fs-minipass@^2.0.0, fs-minipass@^2.1.0: dependencies: minipass "^3.0.0" -fs-minipass@^3.0.0, fs-minipass@^3.0.2: +fs-minipass@^3.0.0, fs-minipass@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== @@ -10801,7 +10041,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^10.2.2, glob@^10.2.7, glob@^10.3.10: +glob@^10.2.2, glob@^10.3.10: version "10.3.10" resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== @@ -11292,9 +10532,9 @@ ini@^1.3.4, ini@~1.3.0: integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== ini@^4.1.0, ini@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" - integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + version "4.1.2" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.2.tgz#7f646dbd9caea595e61f88ef60bfff8b01f8130a" + integrity sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw== init-package-json@^5.0.0: version "5.0.0" @@ -11516,7 +10756,7 @@ is-natural-number@^4.0.1: resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8" integrity sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ== -is-negative-zero@^2.0.2: +is-negative-zero@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== @@ -11576,7 +10816,7 @@ is-set@^2.0.1, is-set@^2.0.2: resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== -is-shared-array-buffer@^1.0.2: +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== @@ -11987,7 +11227,7 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== -json-parse-even-better-errors@^3.0.0: +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz#02bb29fb5da90b5444581749c22cedd3597c6cb0" integrity sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg== @@ -12311,17 +11551,17 @@ levn@^0.4.1: type-check "~0.4.0" libnpmaccess@^7.0.2: - version "7.0.2" - resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.2.tgz#7f056c8c933dd9c8ba771fa6493556b53c5aac52" - integrity sha512-vHBVMw1JFMTgEk15zRsJuSAg7QtGGHpUSEfnbcRL1/gTBag9iEfJbyjpDmdJmwMhvpoLoNBtdAUCdGnaP32hhw== + version "7.0.3" + resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-7.0.3.tgz#9878b75c5cf36ddfff167dd47c1a6cf1fa21193c" + integrity sha512-It+fk/NRdRfv5giLhaVeyebGi/0S2LDSAwuZ0AGQ4x//PtCVb2Hj29wgSHe+XEL+RUkvLBkxbRV+DqLtOzuVTQ== dependencies: npm-package-arg "^10.1.0" npm-registry-fetch "^14.0.3" libnpmdiff@^5.0.20: - version "5.0.20" - resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.20.tgz#fc1d310521ce9765f7bf7693ba6affa02a11bcc1" - integrity sha512-oG+qEc0qzg++1YqLwguQvXAyG8BrKq+23RHr4sCa5XZnf1U+hcKUp8itgaBY9sGRYyGXtsRgXWWFHBmqXIctDA== + version "5.0.21" + resolved "https://registry.yarnpkg.com/libnpmdiff/-/libnpmdiff-5.0.21.tgz#9d3036595a4cf393e1de07df98a40607a054d333" + integrity sha512-Zx+o/qnGoX46osnInyQQ5KI8jn2wIqXXiu4TJzE8GFd+o6kbyblJf+ihG81M1+yHK3AzkD1m4KK3+UTPXh/hBw== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/disparity-colors" "^3.0.0" @@ -12334,13 +11574,13 @@ libnpmdiff@^5.0.20: tar "^6.1.13" libnpmexec@^6.0.4: - version "6.0.4" - resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-6.0.4.tgz#205c7b77be5776576367c39f8d349e388025d77e" - integrity sha512-dhFp5yA9M2g8oLg/Ys9not+pNzW8B20pcz455TGqyU5VesXnEPQwK5EPVY8W24JJn7M0jMJ6/GxosywMPOTebA== + version "6.0.5" + resolved "https://registry.yarnpkg.com/libnpmexec/-/libnpmexec-6.0.5.tgz#36eb7e5a94a653478c8dd66b4a967cadf3f2540d" + integrity sha512-yN/7uJ3iYCPaKagHfrqXuCFLKn2ddcnYpEyC/tVhisHULC95uCy8AhUdNkThRXzhFqqptejO25ZfoWOGrdqnxA== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/run-script" "^6.0.0" - ci-info "^3.7.1" + ci-info "^4.0.0" npm-package-arg "^10.1.0" npmlog "^7.0.1" pacote "^15.0.8" @@ -12351,32 +11591,32 @@ libnpmexec@^6.0.4: walk-up-path "^3.0.1" libnpmfund@^4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.2.1.tgz#f52bed09060e003c001cdaae8904ee97a3d6d5c6" - integrity sha512-2fbmQMk3wPMdPx1gbYLNbzghj48XAsfytKrmy+A0eFXwDxCwL0BLdgXoeLQCZPpLUMSPPXdKyL6Wm4erWezhnA== + version "4.2.2" + resolved "https://registry.yarnpkg.com/libnpmfund/-/libnpmfund-4.2.2.tgz#4e50507212e64fcb6a396e4c02369f6c0fc40369" + integrity sha512-qnkP09tpryxD/iPYasHM7+yG4ZVe0e91sBVI/R8HJ1+ajeR9poWDckwiN2LEWGvtV/T/dqB++6A1NLrA5NPryw== dependencies: "@npmcli/arborist" "^6.5.0" libnpmhook@^9.0.3: - version "9.0.3" - resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.3.tgz#5dbd6a146feb7e11993d36a26f750ae2347bb1d9" - integrity sha512-wMZe58sI7KLhg0+nUWZW5KdMfjNNcOIIbkoP19BDHYoUF9El7eeUWkGNxUGzpHkPKiGoQ1z/v6CYin4deebeuw== + version "9.0.4" + resolved "https://registry.yarnpkg.com/libnpmhook/-/libnpmhook-9.0.4.tgz#43d893e19944a2e729b2b165a74f84a69443880d" + integrity sha512-bYD8nJiPnqeMtSsRc5bztqSh6/v16M0jQjLeO959HJqf9ZRWKRpVnFx971Rz5zbPGOB2BrQa6iopsh5vons5ww== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmorg@^5.0.4: - version "5.0.4" - resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.4.tgz#94eec2b84fbef736457eb27894c972ae6f5cac82" - integrity sha512-YqYXLMAN0Y1eJH4w3hUFN9648xfSdvJANMsdeZTOWJOW4Pqp8qapJFzQdqCfUkg+tEuQmnaFQQKXvkMZC51+Mw== + version "5.0.5" + resolved "https://registry.yarnpkg.com/libnpmorg/-/libnpmorg-5.0.5.tgz#baaba5c77bdfa6808975be9134a330f84b3fa4d4" + integrity sha512-0EbtEIFthVlmaj0hhC3LlEEXUZU3vKfJwfWL//iAqKjHreMhCD3cgdkld+UeWYDgsZzwzvXmopoY0l38I0yx9Q== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmpack@^5.0.20: - version "5.0.20" - resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.20.tgz#982e656e87bdfb69b458260d20c6ab243c661e5d" - integrity sha512-lPQXok0sU0V7hjb8oMD6HjYTR296aZvCJQZ1PGC7PeuKkBGuNeqSKVE2I9bwI80E4bFa9gfQ1I+rGfkNRjn6tQ== + version "5.0.21" + resolved "https://registry.yarnpkg.com/libnpmpack/-/libnpmpack-5.0.21.tgz#bcc608279840448fa8c28d8df0f326694d0b6061" + integrity sha512-mQd3pPx7Xf6i2A6QnYcCmgq34BmfVG3HJvpl422B5dLKfi9acITqcJiJ2K7adhxPKZMF5VbP2+j391cs5w+xww== dependencies: "@npmcli/arborist" "^6.5.0" "@npmcli/run-script" "^6.0.0" @@ -12384,11 +11624,11 @@ libnpmpack@^5.0.20: pacote "^15.0.8" libnpmpublish@^7.5.1: - version "7.5.1" - resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.1.tgz#80f0b5d30210156af7a1b98b1a7bff06bd868684" - integrity sha512-z/7HYMtuRrNgcftrI9ILXezZWHYHG0RaIZFfUvcLktE75vrScE3zOO+qvAbvQodQi4YvYoOGF1ySQ8tdbDCYQQ== + version "7.5.2" + resolved "https://registry.yarnpkg.com/libnpmpublish/-/libnpmpublish-7.5.2.tgz#1b2780a4a56429d6dea332174286179b8d6f930c" + integrity sha512-azAxjEjAgBkbPHUGsGdMbTScyiLcTKdEnNYwGS+9yt+fUsNyiYn8hNH3+HeWKaXzFjvxi50MrHw1yp1gg5pumQ== dependencies: - ci-info "^3.6.1" + ci-info "^4.0.0" normalize-package-data "^5.0.0" npm-package-arg "^10.1.0" npm-registry-fetch "^14.0.3" @@ -12398,24 +11638,24 @@ libnpmpublish@^7.5.1: ssri "^10.0.1" libnpmsearch@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.2.tgz#b6a531a312855dd3bf84dd273b1033dd09b4cbec" - integrity sha512-p+5BF19AvnVg8mcIQhy6yWhI6jHQRVMYaIaKeITEfYAffWsqbottA/WZdMtHL76hViC6SFM1WdclM1w5eAIa1g== + version "6.0.3" + resolved "https://registry.yarnpkg.com/libnpmsearch/-/libnpmsearch-6.0.3.tgz#f6001910b4a68341c2aa3f6f9505e665ed98759e" + integrity sha512-4FLTFsygxRKd+PL32WJlFN1g6gkfx3d90PjgSgd6kl9nJ55sZQAqNyi1M7QROKB4kN8JCNCphK8fQYDMg5bCcg== dependencies: npm-registry-fetch "^14.0.3" libnpmteam@^5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.3.tgz#196657e9d87c0cc914c44fee588ad2b838074a3c" - integrity sha512-7XOGhi45s+ml6TyrhJUTyrErcoDMKGKfEtiTEco4ofU7BGGAUOalVztKMVLLJgJOOXdIAIlzCHqkTXEuSiyCiA== + version "5.0.4" + resolved "https://registry.yarnpkg.com/libnpmteam/-/libnpmteam-5.0.4.tgz#255ac22d94e4b9e911456bf97c1dc1013df03659" + integrity sha512-yN2zxNb8Urvvo7fTWRcP3E/KPtpZJXFweDWcl+H/s3zopGDI9ahpidddGVG98JhnPl3vjqtZvFGU3/sqVTfuIw== dependencies: aproba "^2.0.0" npm-registry-fetch "^14.0.3" libnpmversion@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.2.tgz#cad9cd1b287fcf9576a64edfe71491b49a65d06f" - integrity sha512-n1X70mFHv8Piy4yos+MFWUARSkTbyV5cdsHScaIkuwYvRAF/s2VtYScDzWB4Oe8uNEuGNdjiRR1E/Dh1tMvv6g== + version "4.0.3" + resolved "https://registry.yarnpkg.com/libnpmversion/-/libnpmversion-4.0.3.tgz#f4d85d3eb6bdbf7de8d9317abda92528e84b1a53" + integrity sha512-eD1O5zr0ko5pjOdz+2NyTEzP0kzKG8VIVyU+hIsz61cRmTrTxFRJhVBNOI1Q/inifkcM/UTl8EMfa0vX48zfoQ== dependencies: "@npmcli/git" "^4.0.1" "@npmcli/run-script" "^6.0.0" @@ -12695,9 +11935,9 @@ lz-string@^1.5.0: integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== magic-string@^0.30.0: - version "0.30.7" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.7.tgz#0cecd0527d473298679da95a2d7aeb8c64048505" - integrity sha512-8vBuFF/I/+OSLRmdf2wwFCJCz+nSn0m6DPvGH1fS/KiQoSaR+sETbov0eIk9KhEKy8CYqIkIAnbohxT/4H0kuA== + version "0.30.8" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.8.tgz#14e8624246d2bedba70d5462aa99ac9681844613" + integrity sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ== dependencies: "@jridgewell/sourcemap-codec" "^1.4.15" @@ -13008,7 +12248,7 @@ minipass@^5.0.0: resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3: +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.3, minipass@^7.0.4: version "7.0.4" resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== @@ -13043,13 +12283,6 @@ mlly@^1.2.0: pkg-types "^1.0.3" ufo "^1.3.2" -mnemonist@0.38.3: - version "0.38.3" - resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.38.3.tgz#35ec79c1c1f4357cfda2fe264659c2775ccd7d9d" - integrity sha512-2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw== - dependencies: - obliterator "^1.6.1" - modify-values@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" @@ -13237,7 +12470,7 @@ node-fetch@^2.6.1, node-fetch@^2.6.11, node-fetch@^2.6.7, node-fetch@^2.6.8: dependencies: whatwg-url "^5.0.0" -node-gyp@^9.0.0, node-gyp@^9.4.0: +node-gyp@^9.0.0, node-gyp@^9.4.1: version "9.4.1" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185" integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ== @@ -13345,7 +12578,7 @@ npm-bundled@^3.0.0: dependencies: npm-normalize-package-bin "^3.0.0" -npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0, npm-install-checks@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== @@ -13438,9 +12671,9 @@ npm-user-validate@^2.0.0: integrity sha512-sSWeqAYJ2dUPStJB+AEj0DyLRltr/f6YNcvCA7phkB8/RMLMnVsQ41GMwHo/ERZLYNDsyB2wPm7pZo1mqPOl7Q== npm@^9.5.0: - version "9.9.2" - resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.2.tgz#28133f81643bce36c1c8bcb57b51e1ee53583df7" - integrity sha512-D3tV+W0PzJOlwo8YmO6fNzaB1CrMVYd1V+2TURF6lbCbmZKqMsYgeQfPVvqiM3zbNSJPhFEnmlEXIogH2Vq7PQ== + version "9.9.3" + resolved "https://registry.yarnpkg.com/npm/-/npm-9.9.3.tgz#18272a7b966721417691fec0ca18f7fbe4a9794e" + integrity sha512-Z1l+rcQ5kYb17F3hHtO601arEpvdRYnCLtg8xo3AGtyj3IthwaraEOexI9903uANkifFbqHC8hT53KIrozWg8A== dependencies: "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/arborist" "^6.5.0" @@ -13452,21 +12685,21 @@ npm@^9.5.0: "@npmcli/run-script" "^6.0.2" abbrev "^2.0.0" archy "~1.0.0" - cacache "^17.1.3" + cacache "^17.1.4" chalk "^5.3.0" - ci-info "^3.8.0" + ci-info "^4.0.0" cli-columns "^4.0.0" cli-table3 "^0.6.3" columnify "^1.6.0" fastest-levenshtein "^1.0.16" - fs-minipass "^3.0.2" - glob "^10.2.7" + fs-minipass "^3.0.3" + glob "^10.3.10" graceful-fs "^4.2.11" hosted-git-info "^6.1.1" ini "^4.1.1" init-package-json "^5.0.0" is-cidr "^4.0.2" - json-parse-even-better-errors "^3.0.0" + json-parse-even-better-errors "^3.0.1" libnpmaccess "^7.0.2" libnpmdiff "^5.0.20" libnpmexec "^6.0.4" @@ -13480,14 +12713,14 @@ npm@^9.5.0: libnpmversion "^4.0.2" make-fetch-happen "^11.1.1" minimatch "^9.0.3" - minipass "^5.0.0" + minipass "^7.0.4" minipass-pipeline "^1.2.4" ms "^2.1.2" - node-gyp "^9.4.0" + node-gyp "^9.4.1" nopt "^7.2.0" normalize-package-data "^5.0.0" npm-audit-report "^5.0.0" - npm-install-checks "^6.2.0" + npm-install-checks "^6.3.0" npm-package-arg "^10.1.0" npm-pick-manifest "^8.0.2" npm-profile "^7.0.1" @@ -13500,12 +12733,12 @@ npm@^9.5.0: proc-log "^3.0.0" qrcode-terminal "^0.12.0" read "^2.1.0" - semver "^7.5.4" + semver "^7.6.0" sigstore "^1.9.0" spdx-expression-parse "^3.0.1" - ssri "^10.0.4" + ssri "^10.0.5" supports-color "^9.4.0" - tar "^6.1.15" + tar "^6.2.0" text-table "~0.2.0" tiny-relative-date "^1.3.0" treeverse "^3.0.0" @@ -13559,12 +12792,12 @@ object-inspect@^1.13.1: integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-is@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" - integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + version "1.1.6" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.6.tgz#1a6a53aed2dd8f7e6775ff870bea58545956ab07" + integrity sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" + call-bind "^1.0.7" + define-properties "^1.2.1" object-keys@^1.1.1: version "1.1.1" @@ -13581,7 +12814,7 @@ object.assign@^4.1.4, object.assign@^4.1.5: has-symbols "^1.0.3" object-keys "^1.1.1" -object.entries@^1.1.6: +object.entries@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== @@ -13590,7 +12823,7 @@ object.entries@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.fromentries@^2.0.6: +object.fromentries@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== @@ -13599,7 +12832,7 @@ object.fromentries@^2.0.6: define-properties "^1.2.0" es-abstract "^1.22.1" -object.hasown@^1.1.2: +object.hasown@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== @@ -13607,7 +12840,7 @@ object.hasown@^1.1.2: define-properties "^1.2.0" es-abstract "^1.22.1" -object.values@^1.1.6: +object.values@^1.1.6, object.values@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== @@ -13616,11 +12849,6 @@ object.values@^1.1.6: define-properties "^1.2.0" es-abstract "^1.22.1" -obliterator@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.6.1.tgz#dea03e8ab821f6c4d96a299e17aef6a3af994ef3" - integrity sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig== - on-exit-leak-free@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz#fed195c9ebddb7d9e4c3842f93f281ac8dadd3b8" @@ -14116,17 +13344,17 @@ pkg-types@^1.0.3: mlly "^1.2.0" pathe "^1.1.0" -playwright-core@1.41.2: - version "1.41.2" - resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.41.2.tgz#db22372c708926c697acc261f0ef8406606802d9" - integrity sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA== +playwright-core@1.42.1: + version "1.42.1" + resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.42.1.tgz#13c150b93c940a3280ab1d3fbc945bc855c9459e" + integrity sha512-mxz6zclokgrke9p1vtdy/COWBH+eOZgYUVVU34C73M+4j4HLlQJHtfcqiqqxpP0o8HhMkflvfbquLX5dg6wlfA== -playwright@1.41.2: - version "1.41.2" - resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.41.2.tgz#4e760b1c79f33d9129a8c65cc27953be6dd35042" - integrity sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A== +playwright@1.42.1: + version "1.42.1" + resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.42.1.tgz#79c828b51fe3830211137550542426111dc8239f" + integrity sha512-PgwB03s2DZBcNRoW+1w9E+VkLBxweib6KTXM0M3tkiT4jVxKSi6PmVJ591J+0u10LUrgxB7dLRbiJqO5s2QPMg== dependencies: - playwright-core "1.41.2" + playwright-core "1.42.1" optionalDependencies: fsevents "2.3.2" @@ -14487,9 +13715,9 @@ react-dropzone@^14.2.3: prop-types "^15.8.1" react-hook-form@^7.46.2: - version "7.50.1" - resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.50.1.tgz#f6aeb17a863327e5a0252de8b35b4fc8990377ed" - integrity sha512-3PCY82oE0WgeOgUtIr3nYNNtNvqtJ7BZjsbxh6TnYNbXButaD5WpjOmTjdxZfheuHKR68qfeFnEDVYoSSFPMTQ== + version "7.51.0" + resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.51.0.tgz#757ae71b37c26e00590bd3788508287dcc5ecdaf" + integrity sha512-BggOy5j58RdhdMzzRUHGOYhSz1oeylFAv6jUSG86OvCIvlAvS7KvnRY7yoAf2pfEiPN7BesnR0xx73nEk3qIiw== react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -14548,19 +13776,19 @@ react-remove-scroll@2.5.5: use-sidecar "^1.1.2" react-router-dom@^6.10.0: - version "6.22.1" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.1.tgz#cfa109d4b6b0a4d00bac179bc0ad2a6469455282" - integrity sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw== + version "6.22.2" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.2.tgz#8233968a8a576f3006e5549c80f3527d2598fc9c" + integrity sha512-WgqxD2qySEIBPZ3w0sHH+PUAiamDeszls9tzqMPBDA1YYVucTBXLU7+gtRfcSnhe92A3glPnvSxK2dhNoAVOIQ== dependencies: - "@remix-run/router" "1.15.1" - react-router "6.22.1" + "@remix-run/router" "1.15.2" + react-router "6.22.2" -react-router@6.22.1: - version "6.22.1" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.1.tgz#a5ff849bfe709438f7e139421bb28138209662c7" - integrity sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ== +react-router@6.22.2: + version "6.22.2" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.2.tgz#27e77e4c635a5697693b922d131d773451c98a5b" + integrity sha512-YD3Dzprzpcq+tBMHBS822tCjnWD3iIZbTeSXMY9LPSG541EfoBGyZ3bS25KEnaZjLcmQpw2AVLkFyfgXY8uvcw== dependencies: - "@remix-run/router" "1.15.1" + "@remix-run/router" "1.15.2" react-select@^5.7.4: version "5.8.0" @@ -14841,7 +14069,7 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.19.0, resolve@^1.22.2, resolve@^1.3. path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.4: +resolve@^2.0.0-next.5: version "2.0.0-next.5" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== @@ -15088,7 +14316,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.1.2, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0: version "7.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== @@ -15161,9 +14389,9 @@ serverless-stack-termination-protection@^2.0.2: integrity sha512-pPUVJmH5if8A12KVSTMqNjo7u8rfW0/vJO+UFp19lvkY0t8jfoO3R3DySwTDVcB+jzaCrU/NyEHPtbiDLVjSSw== serverless-step-functions@^3.13.1: - version "3.19.0" - resolved "https://registry.yarnpkg.com/serverless-step-functions/-/serverless-step-functions-3.19.0.tgz#93ccfa6ee7e928d5eaeff3858523ea57b9e46015" - integrity sha512-FrqnOKWIDvfmxKDeMPkBCRCaYc6wT41feuPKE1V6qP+lTp8p/B8ZsILmP04ONynIK5AUzFYshCMVJ1Wz3KntBg== + version "3.20.0" + resolved "https://registry.yarnpkg.com/serverless-step-functions/-/serverless-step-functions-3.20.0.tgz#9a2fa49e0a525d837d1250fcc77f7aa2a11568fd" + integrity sha512-hoBAWvYgCOpcVnhFEXFM7uuLQT9XmCn5wDBKJMzfpA4thljAYah2wnnPuNhsAy1Ieqtyi5YzJhuICYL+DkbdKw== dependencies: "@serverless/utils" "^6.7.0" asl-validator "^3.8.0" @@ -15296,11 +14524,11 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== side-channel@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.5.tgz#9a84546599b48909fb6af1211708d23b1946221b" - integrity sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.6.tgz#abd25fb7cd24baf45466406b1096b7831c9215f2" + integrity sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA== dependencies: - call-bind "^1.0.6" + call-bind "^1.0.7" es-errors "^1.3.0" get-intrinsic "^1.2.4" object-inspect "^1.13.1" @@ -15527,7 +14755,7 @@ sshpk@^1.14.1: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.4: +ssri@^10.0.0, ssri@^10.0.1, ssri@^10.0.5: version "10.0.5" resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== @@ -15632,7 +14860,7 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.matchall@^4.0.8: +string.prototype.matchall@^4.0.10: version "4.0.10" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== @@ -15951,7 +15179,7 @@ tar-stream@^2.2.0: inherits "^2.0.3" readable-stream "^3.1.1" -tar@^6.1.11, tar@^6.1.13, tar@^6.1.15, tar@^6.1.2: +tar@^6.1.11, tar@^6.1.13, tar@^6.1.15, tar@^6.1.2, tar@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== @@ -16352,21 +15580,16 @@ type-fest@^3.0.0, type-fest@^3.8.0: integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== type-fest@^4.2.0, type-fest@^4.9.0: - version "4.10.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.10.3.tgz#ff01cb0a1209f59583d61e1312de9715e7ea4874" - integrity sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA== - -type@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + version "4.11.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.11.1.tgz#7de27117459b926cb56922a4fd565423041e06d3" + integrity sha512-MFMf6VkEVZAETidGGSYW2B1MjXbGX+sWIywn2QPEaJ3j08V+MwVRHMXtf2noB8ENJaD0LIun9wh5Z6OPNf1QzQ== type@^2.1.0, type@^2.5.0, type@^2.6.0, type@^2.6.1, type@^2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0" integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw== -typed-array-buffer@^1.0.1: +typed-array-buffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== @@ -16375,7 +15598,7 @@ typed-array-buffer@^1.0.1: es-errors "^1.3.0" is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: +typed-array-byte-length@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== @@ -16386,7 +15609,7 @@ typed-array-byte-length@^1.0.0: has-proto "^1.0.3" is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: +typed-array-byte-offset@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== @@ -16398,7 +15621,7 @@ typed-array-byte-offset@^1.0.0: has-proto "^1.0.3" is-typed-array "^1.1.13" -typed-array-length@^1.0.4: +typed-array-length@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.5.tgz#57d44da160296d8663fd63180a1802ebf25905d5" integrity sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA== From 54c76a26f746c0789418410789fc26032e82cf30 Mon Sep 17 00:00:00 2001 From: Kristin Grue Date: Fri, 15 Mar 2024 11:29:34 -0400 Subject: [PATCH 04/12] feat(email): Add email service to notify State and CMS of important actions (#427) * update ur-grue to match grue in email service * add more of the CMS email types --------- Co-authored-by: Brandon Flynn --- docs/docs/services/email.md | 33 +- serverless-compose.yml | 9 +- .../action-types/new-submission.ts | 6 + src/services/api/handlers/submit.ts | 6 + src/services/auth/libs/users.json | 60 +- src/services/email/handlers/processEmails.js | 44 -- src/services/email/handlers/processEmails.tsx | 38 + src/services/email/libs/address-lib.js | 20 + src/services/email/libs/bundle-lib.js | 120 ++++ src/services/email/libs/cognito-lib.js | 35 + src/services/email/libs/data-lib.js | 94 +++ src/services/email/libs/handler-lib.js | 51 ++ src/services/email/libs/lookup-lib.js | 26 + src/services/email/libs/os-lib.js | 82 +++ src/services/email/package.json | 9 +- src/services/email/serverless.yml | 94 ++- .../email/ses-email-templates/index.js | 672 ++++++++++++++++++ 17 files changed, 1346 insertions(+), 53 deletions(-) delete mode 100644 src/services/email/handlers/processEmails.js create mode 100644 src/services/email/handlers/processEmails.tsx create mode 100644 src/services/email/libs/address-lib.js create mode 100644 src/services/email/libs/bundle-lib.js create mode 100644 src/services/email/libs/cognito-lib.js create mode 100644 src/services/email/libs/data-lib.js create mode 100644 src/services/email/libs/handler-lib.js create mode 100644 src/services/email/libs/lookup-lib.js create mode 100644 src/services/email/libs/os-lib.js create mode 100644 src/services/email/ses-email-templates/index.js diff --git a/docs/docs/services/email.md b/docs/docs/services/email.md index 738f5e07b..b622f89ab 100644 --- a/docs/docs/services/email.md +++ b/docs/docs/services/email.md @@ -4,11 +4,40 @@ title: email parent: Services --- -# data +# email {: .no_toc } ## Summary The email service deploys the lambdas, SNS topics, and Configuration Sets needed to send email. ## Detail -AWS SES is an account-wide service for basic sending and receiving of email. By creating lambdas to build the emails and sending the email with a branch-specific configuration set, we can follow the events of email sending and take action based on those events. \ No newline at end of file +AWS SES is an account-wide service for basic sending and receiving of email. By creating lambdas to build the emails and sending the email with a branch-specific configuration set, we can follow the events of email sending and take action based on those events. + +### Secrets Manager +The workflow will not successfully deploy unless the emailAddressLookup object is defined: + +Named {project}/default/emailAddressLookup or {project}/{stage}/emailAddressLookup + { + "sourceEmail":"\"CMS MACPro no-reply\" ", + "osgEmail":"\"OSG\" ", + "chipInbox":"\"CHIP Inbox\" ", + "chipCcList":"\"CHIP CC 1\" ;\"CHIP CC 2\" ", + "dpoEmail":"\"DPO Action\" ", + "dmcoEmail":"\"DMCO Action\" ", + "dhcbsooEmail":"\"DHCBSOO Action\" " + } + +These values are set during deployment as environment variables on the lambda. You can edit these values in the AWS Console on the Lambda configuration tab. + +LAUCH NOTE!!! The defined email addresses have been stored as om/default/emailAddressLookup in the production account, with om/production/emailAddressLookup overwriting those email addresses with the test email addresses. Delete the om/production/emailAddressLookup before the real launch deploy (you can also edit the environment variables after the lambda is built). + +### Test accounts +There are gmail accounts created to facilitate email testing. Please contact a MACPro team member for access to these inboxes. At this time, there is only one available email inbox. +- mako.stateuser@gmail.com - a state user account - does have an associated OneMAC login + +### Templates +The email services uses the serverless-ses-template plugin to manage the email templates being used for each stage. To edit the templates, edit index.js in ./ses-email-templates. Each template configuration object requires: +- name: the template name (note, the stage name is appended to this during deployment so branch templates remain unique to that stage). At this time, the naming standard for email templates is based on the event details. Specifically, the action and the authority values from the decoded event. If action is not included in the event data, "new-submission" is assumed. +- subject: the subject line of the email, may contain replacement values using {{name}}. +- html: the email body in html, may contain replacement values using {{name}}. +- text: the email body in text, may contain replacement values using {{name}}. \ No newline at end of file diff --git a/serverless-compose.yml b/serverless-compose.yml index fcdb13bff..b7f7863b7 100644 --- a/serverless-compose.yml +++ b/serverless-compose.yml @@ -9,8 +9,6 @@ services: path: src/services/data params: ECSFailureTopicArn: ${alerts.ECSFailureTopicArn} - email: - path: src/services/email uploads: path: src/services/uploads ui-infra: @@ -44,3 +42,10 @@ services: CognitoUserPoolId: ${auth.UserPoolId} CognitoUserPoolClientId: ${auth.UserPoolClientId} CognitoUserPoolClientDomain: ${auth.UserPoolClientDomain} + email: + path: src/services/email + params: + ApplicationEndpointUrl: ${ui-infra.ApplicationEndpointUrl} + osDomainArn: ${data.OpenSearchDomainArn} + osDomain: ${data.OpenSearchDomainEndpoint} + CognitoUserPoolId: ${auth.UserPoolId} diff --git a/src/packages/shared-types/action-types/new-submission.ts b/src/packages/shared-types/action-types/new-submission.ts index e9615fa81..1be83d315 100644 --- a/src/packages/shared-types/action-types/new-submission.ts +++ b/src/packages/shared-types/action-types/new-submission.ts @@ -13,6 +13,12 @@ export const onemacSchema = z.object({ submitterEmail: z.string(), attachments: z.array(attachmentSchema).nullish(), raiWithdrawEnabled: z.boolean().default(false), + notificationMetadata: z + .object({ + proposedEffectiveDate: z.number().nullish(), + submissionDate: z.number().nullish(), + }) + .nullish(), // these are specific to TEs... should be broken into its own schema statusDate: z.number().optional(), submissionDate: z.number().optional(), diff --git a/src/services/api/handlers/submit.ts b/src/services/api/handlers/submit.ts index e29244947..871fe102d 100644 --- a/src/services/api/handlers/submit.ts +++ b/src/services/api/handlers/submit.ts @@ -229,6 +229,12 @@ export const submit = async (event: APIGatewayEvent) => { ${subTypeIdsInsert} `; + // data for emails + body.notificationMetadata = { + submissionDate, + proposedEffectiveDate: body.proposedEffectiveDate, + }; + const result = await transaction.request().query(query); console.log(result); diff --git a/src/services/auth/libs/users.json b/src/services/auth/libs/users.json index f6439f9c6..5819a2692 100644 --- a/src/services/auth/libs/users.json +++ b/src/services/auth/libs/users.json @@ -309,5 +309,63 @@ "Value": "true" } ] + }, + { + "username": "mako.stateuser@gmail.com", + "attributes": [ + { + "Name": "email", + "Value": "mako.stateuser@gmail.com" + }, + { + "Name": "given_name", + "Value": "Stateuser" + }, + { + "Name": "family_name", + "Value": "Tester" + }, + { + "Name": "email_verified", + "Value": "true" + }, + { + "Name": "custom:state", + "Value": "VA,OH,SC,CO,GA,MD" + }, + { + "Name": "custom:cms-roles", + "Value": "onemac-micro-statesubmitter" + } + ] + }, + { + "username": "mako.cmsuser@outlook.com", + "attributes": [ + { + "Name": "email", + "Value": "mako.cmsuser@outlook.com" + }, + { + "Name": "given_name", + "Value": "CMS Reviewer" + }, + { + "Name": "family_name", + "Value": "Cypress" + }, + { + "Name": "email_verified", + "Value": "true" + }, + { + "Name": "custom:state", + "Value": "" + }, + { + "Name": "custom:cms-roles", + "Value": "onemac-micro-reviewer" + } + ] } -] +] \ No newline at end of file diff --git a/src/services/email/handlers/processEmails.js b/src/services/email/handlers/processEmails.js deleted file mode 100644 index 9d4dc3340..000000000 --- a/src/services/email/handlers/processEmails.js +++ /dev/null @@ -1,44 +0,0 @@ -import { SESClient, SendEmailCommand } from "@aws-sdk/client-ses"; - -const createSendEmailCommand = (event) => - new SendEmailCommand({ - Source: "kgrue@fearless.tech", - Destination: { - ToAddresses: [ - "k.grue.stateuser@gmail.com", - ], - }, - Message: { - Subject: { - Data: event.subject ?? "Subject Required", - Charset: "UTF-8", - }, - Body: { - Text: { - Data: "Body Text", - Charset: "UTF-8", - }, - Html: { - Data: "

HTML body text

yup

", - Charset: "UTF-8", - }, - }, - }, - ConfigurationSetName: process.env.emailConfigSet, - }); - -const SES = new SESClient({ region: process.env.region }); - -export const main = async (event, context, callback) => { - let response; - console.log("Received event (stringified):", JSON.stringify(event, null, 4)); - const sendEmailCommand = createSendEmailCommand(event); - - try { - response = await SES.send(sendEmailCommand); - console.log("sendEmailCommand response: ", response); - } catch (err) { - console.log("Failed to process emails.", err); - } - callback(null, "Success"); -}; diff --git a/src/services/email/handlers/processEmails.tsx b/src/services/email/handlers/processEmails.tsx new file mode 100644 index 000000000..ef2be65e4 --- /dev/null +++ b/src/services/email/handlers/processEmails.tsx @@ -0,0 +1,38 @@ +import { SESClient, SendTemplatedEmailCommand } from "@aws-sdk/client-ses"; + +import handler from "../libs/handler-lib"; +import { getBundle } from "../libs/bundle-lib"; +import { buildDestination } from "../libs/address-lib"; +import { buildEmailData } from "../libs/data-lib"; + +const SES = new SESClient({ region: process.env.region }); + +export const main = handler(async (record) => { + + // get the bundle of emails associated with this action + const emailBundle = getBundle(record, process.env.stage); + console.log("emailBundle: ", emailBundle); + + // not every event has a bundle, and that's ok! + if (!emailBundle || !!emailBundle?.message || !emailBundle?.emailCommands) return { message: "no eventToEmailMapping found, no email sent" }; + + // data is at bundle level since often identical between emails and saves on lookups + const emailData = await buildEmailData(emailBundle, record); + + const sendResults = await Promise.allSettled(emailBundle.emailCommands.map(async (command) => { + try { + return await SES.send(new SendTemplatedEmailCommand({ + Source: process.env.emailSource ?? "kgrue@fearless.tech", + Destination: buildDestination(command, emailData), + TemplateData: JSON.stringify(emailData), + Template: command.Template, + ConfigurationSetName: process.env.emailConfigSet, + })); + } catch (err) { + console.log("Failed to process theEmail.", err, JSON.stringify(command, null, 4)); + return Promise.resolve({ message: err.message}); + } + })); + console.log("sendResults: ", sendResults); + return sendResults; +}); \ No newline at end of file diff --git a/src/services/email/libs/address-lib.js b/src/services/email/libs/address-lib.js new file mode 100644 index 000000000..e19e42f0c --- /dev/null +++ b/src/services/email/libs/address-lib.js @@ -0,0 +1,20 @@ + +const buildAddressList = (addressList, data) => { + const newList = []; + addressList.forEach((address) => { + const mappedAddress = data[address] ? data[address] : address; + + const extraAddresses = mappedAddress.split(";"); + extraAddresses.forEach((oneaddress) => { + newList.push(oneaddress); + }); + }); + return newList; +}; + +export const buildDestination = (command, data) => { + let destination = { ToAddresses: buildAddressList(command.ToAddresses, data) }; + if (command?.CcAddresses) destination.CcAddresses = buildAddressList(command.CcAddresses, data); + if (command?.BccAddresses) destination.BccAddresses = buildAddressList(command.BccAddresses, data); + return destination; +}; \ No newline at end of file diff --git a/src/services/email/libs/bundle-lib.js b/src/services/email/libs/bundle-lib.js new file mode 100644 index 000000000..8ae87c32b --- /dev/null +++ b/src/services/email/libs/bundle-lib.js @@ -0,0 +1,120 @@ +const getBundleFromEvent = (configKey, stage) => { + switch (configKey) { + case "new-submission-medicaid-spa": + return { + "dataList": ["osgEmail", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDateNice", "additionalInformation", "formattedFileList", "textFileList"], + "emailCommands": [{ + "Template": `new-submission-medicaid-spa-cms_${stage}`, + "ToAddresses": ["osgEmail"], + }, + { + "Template": `new-submission-medicaid-spa-state_${stage}`, + "ToAddresses": ["submitter"], + }, + ] + }; + case "respond-to-rai-medicaid-spa": + return { + "lookupList": ["osInsights"], + "dataList": ["osgEmail", "cpoc", "srt", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysLookupNice", "additionalInformation", "formattedFileList", "textFileList"], + "emailCommands": [{ + "Template": `respond-to-rai-medicaid-spa-cms_${stage}`, + "ToAddresses": ["osgEmail", "cpoc", "srt"], + }, + { + "Template": `respond-to-rai-medicaid-spa-state_${stage}`, + "ToAddresses": ["submitter"], + }], + }; + case "withdraw-rai-medicaid-spa": + return { + "lookupList": ["osInsights", "cognito", "osMain"], + "dataList": [ "cpoc", "srt", "dpoEmail", "osgEmail", "allState", "id", "territory", "submitterName", "submitterEmail", "additionalInformation", "formattedFileList", "textFileList", "initialSubmitterName", "initialSubmitterEmail"], + "emailCommands": [{ + "Template": `withdraw-rai-medicaid-spa-cms_${stage}`, + "ToAddresses": ["cpoc", "srt", "dpoEmail", "osgEmail"], + }, + { + "Template": `withdraw-rai-medicaid-spa-state_${stage}`, + "ToAddresses": ["allState"], + }, + ] + }; + case "withdraw-package-medicaid-spa": + return { + "lookupList": ["osInsights","cognito"], + "dataList": ["osgEmail", "dpoEmail", "allState", "id", "territory", "submitterName", "submitterEmail", "additionalInformation"], + "emailCommands": [{ + "Template": `withdraw-package-medicaid-spa-cms_${stage}`, + "ToAddresses": ["osgEmail"], + "CcAddresses": ["dpoEmail"] + }, + { + "Template": `withdraw-package-medicaid-spa-state_${stage}`, + "ToAddresses": ["allState"], + }], + }; + case "new-submission-chip-spa": + return { + "dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysDateNice", "additionalInformation", "formattedFileList", "textFileList"], + "emailCommands": [{ + "Template": `new-submission-chip-spa-cms_${stage}`, + "ToAddresses": ["osgEmail", "chipInbox"], + "CcAddresses": ["chipCcList"] + }, + { + "Template": `new-submission-chip-spa-state_${stage}`, + "ToAddresses": ["submitter"], + }, + ] + }; + case "respond-to-rai-chip-spa": + return { + "lookupList": ["osInsights"], + "dataList": ["osgEmail", "chipInbox", "chipCcList", "submitter", "id", "applicationEndpoint", "territory", "submitterName", "submitterEmail", "proposedEffectiveDateNice", "ninetyDaysLookupNice", "additionalInformation", "formattedFileList", "textFileList"], + "emailCommands": [{ + "Template": `respond-to-rai-chip-spa-cms_${stage}`, + "ToAddresses": ["osgEmail", "chipInbox"], + "CcAddresses": ["chipCcList"] + }, + { + "Template": `respond-to-rai-chip-spa-state_${stage}`, + "ToAddresses": ["submitter"], + }, + ] + }; + case "withdraw-rai-chip-spa": + return { + "lookupList": ["osInsights", "cognito", "osMain"], + "dataList": [ "chipInbox", "cpoc", "srt", "chipCcList", "allState", "submitter", "id", "territory", "submitterName", "submitterEmail", "additionalInformation", "formattedFileList", "textFileList", "initialSubmitterName", "initialSubmitterEmail"], + "emailCommands": [{ + "Template": `withdraw-rai-chip-spa-cms_${stage}`, + "ToAddresses": ["chipInbox", "cpoc", "srt"], + "CcAddresses": ["chipCcList"] + }, + { + "Template": `withdraw-rai-chip-spa-state_${stage}`, + "ToAddresses": ["allState"], + }, + ] + }; + default: + return { message: `no bundle defined for configKey ${configKey}`}; + } +}; + +const buildKeyFromRecord = (record) => { + if (record?.origin !== "micro" || !record?.authority) return; + + const actionType = record?.actionType ? record.actionType : "new-submission"; + + const authority = record.authority.toLowerCase().replace(/\s+/g, "-"); + + return `${actionType}-${authority}`; +}; + +export const getBundle = (record, stage) => { + const configKey = buildKeyFromRecord(record); + + return getBundleFromEvent(configKey, stage); +}; \ No newline at end of file diff --git a/src/services/email/libs/cognito-lib.js b/src/services/email/libs/cognito-lib.js new file mode 100644 index 000000000..adc883056 --- /dev/null +++ b/src/services/email/libs/cognito-lib.js @@ -0,0 +1,35 @@ +import { + CognitoIdentityProviderClient, + ListUsersCommand, + // UserType as CognitoUserType, + } from "@aws-sdk/client-cognito-identity-provider"; + + const Cognito = new CognitoIdentityProviderClient({ + region: process.env.region, + }); + + // have to get all users, as custom attributes (like state and role) are not searchable + export const getCognitoData = async (id) => { + const lookupState = id.toString().substring(0, 2); + try { + + const commandListUsers = new ListUsersCommand({ + UserPoolId: process.env.cognitoPoolId, + }); + const listUsersResponse = await Cognito.send(commandListUsers); + const userList = listUsersResponse.Users.map((user) => { + let oneUser = {}; + user.Attributes.forEach((attribute) => { + oneUser[attribute.Name] = attribute.Value; + }); + if (oneUser["custom:cms-roles"] === "onemac-micro-statesubmitter" && + oneUser["custom:state"].includes(lookupState)) + return `"${oneUser.family_name}, ${oneUser.given_name}" <${oneUser.email}>`; + }).filter(Boolean); + + return { "allState": userList.join(";") }; + } catch (error) { + console.log("Cognito error is: ", error); + return {"message": error.message }; + } + }; \ No newline at end of file diff --git a/src/services/email/libs/data-lib.js b/src/services/email/libs/data-lib.js new file mode 100644 index 000000000..904a74dd9 --- /dev/null +++ b/src/services/email/libs/data-lib.js @@ -0,0 +1,94 @@ +import { DateTime } from "luxon"; + +import { getLookupValues } from "./lookup-lib"; + +const formatAttachments = (formatType, attachmentList) => { + const formatChoices = { + "text": { + begin: "\n\n", + joiner: "\n", + end: "\n\n" + }, + "html": { + begin: "
  • ", + joiner: "
  • ", + end: "
" + }, + }; + const format = formatChoices[formatType]; + if (!format) { + console.log("new format type? ", formatType); + return "attachment List"; + } + if (!attachmentList || attachmentList.length === 0) + return "no attachments"; + else + return `${format.begin}${attachmentList.map(a => `${a.title}: ${a.filename}`).join(format.joiner)}${format.end}`; +}; + +const formatDateFromTimestamp = (timestamp) => { + if (!timestamp || timestamp <= 0) return "Pending"; + return DateTime.fromMillis(timestamp) + .toFormat("DDDD"); + +}; + +function formatNinetyDaysDate(emailBundle) { + if (!emailBundle?.notificationMetadata?.submissionDate) return "Pending"; + return DateTime.fromMillis(emailBundle.notificationMetadata.submissionDate) + .plus({ days: 90 }) + .toFormat("DDDD '@ 11:59pm ET'"); + +} + +export const buildEmailData = async (bundle, data) => { + const returnObject = {}; + + const lookupValues = await getLookupValues(bundle.lookupList, data.id); + + if (!bundle.dataList || !Array.isArray(bundle.dataList) || bundle.dataList.length === 0) + return { error: "init statement fail", bundle, data, lookupValues }; + + bundle.dataList.forEach((dataType) => { + switch (dataType) { + case "territory": + returnObject["territory"] = data.id.toString().substring(0, 2); + break; + case "proposedEffectiveDateNice": + returnObject["proposedEffectiveDateNice"] = formatDateFromTimestamp(data?.notificationMetadata?.proposedEffectiveDate); + break; + case "ninetyDaysLookup": + returnObject["ninetyDaysDateNice"] = formatDateFromTimestamp(lookupValues?.ninetyDaysDateLookup); + break; + case "applicationEndpoint": + returnObject["applicationEndpoint"] = process.env.applicationEndpoint; + break; + case "formattedFileList": + returnObject["formattedFileList"] = formatAttachments("html", data.attachments); + break; + case "textFileList": + returnObject["textFileList"] = formatAttachments("text", data.attachments); + break; + case "ninetyDaysDateNice": + returnObject["ninetyDaysDateNice"] = formatNinetyDaysDate(data); + break; + case "submitter": + returnObject["submitter"] = (data.submitterEmail === "george@example.com") ? "\"George's Substitute\" " : `"${data.submitterName}" <${data.submitterEmail}>`; + break; + case "osgEmail": + case "chipInbox": + case "chipCcList": + case "dpoEmail": + case "dmcoEmail": + case "dhcbsooEmail": + returnObject[dataType] = process?.env[dataType] ? process.env[dataType] : `'${dataType} Substitute' `; + break; + + default: + returnObject[dataType] = data[dataType] ? data[dataType] : (lookupValues[dataType] ? lookupValues[dataType] : "missing data"); + break; + } + }); + console.log("buildEmailData returnObject: ", JSON.stringify(returnObject, null, 4)); + return returnObject; +}; \ No newline at end of file diff --git a/src/services/email/libs/handler-lib.js b/src/services/email/libs/handler-lib.js new file mode 100644 index 000000000..7e75d1f4e --- /dev/null +++ b/src/services/email/libs/handler-lib.js @@ -0,0 +1,51 @@ +import { decode } from "base-64"; + +const decodeRecord = (encodedRecord) => { + if (!encodedRecord.value) return; + return { id: decode(encodedRecord.key), ...JSON.parse(decode(encodedRecord.value)) }; + }; + +export default function handler(lambda) { + return async function (event) { + let eventQueue = []; + let sendResults = []; + const response = { + statusCode: 200, + body: null, + headers: { + "Access-Control-Allow-Origin": "*", + "Access-Control-Allow-Credentials": true, + }, + }; + + // If this invokation is a prewarm, do nothing and return. + if (event.eventSource != "serverless-plugin-warmup") { + try { + // flatten the records so they are iterable + Object.values(event.records).forEach((source) => + source.forEach((record) => { + eventQueue.push({...record}); + })); + sendResults = await Promise.allSettled(eventQueue.map(async (record) => { + try { + const eventData = decodeRecord(record); + if (!eventData) return { error: "no eventData?"}; + console.log("eventData: ", eventData); + + return await lambda(eventData); + } catch (e) { + return { error: e.message }; + } + + })); + response.body = JSON.stringify(sendResults); + } catch (e) { + response.body = e.message; + console.log ("error: ", e); + } + // Return HTTP response + console.log("Response: ", JSON.stringify(response, null, 4)); + return response; + } + }; +} \ No newline at end of file diff --git a/src/services/email/libs/lookup-lib.js b/src/services/email/libs/lookup-lib.js new file mode 100644 index 000000000..5c8ad77bf --- /dev/null +++ b/src/services/email/libs/lookup-lib.js @@ -0,0 +1,26 @@ +import { getOsInsightData, getOsMainData } from "../libs/os-lib"; +import { getCognitoData } from "../libs/cognito-lib"; + +export const getLookupValues = async (lookupList, lookupId) => { + let returnData = {}; + + if (lookupId && lookupList && Array.isArray(lookupList) && lookupList.length > 0) { + const lookupPromises = await Promise.allSettled(lookupList.map(async (lookupType) => { + switch (lookupType) { + case "osInsights": + return await getOsInsightData(lookupId); + case "osMain": + return await getOsMainData(lookupId); + case "cognito": + return await getCognitoData(lookupId); + default: + return await Promise.resolve(`Don't have function for ${lookupType}`); + } + })); + lookupPromises.forEach((promise) => { + if (promise.status === "fulfilled") returnData = { ...returnData, ...promise.value }; + }); + } + + return returnData; +}; \ No newline at end of file diff --git a/src/services/email/libs/os-lib.js b/src/services/email/libs/os-lib.js new file mode 100644 index 000000000..f07f6934f --- /dev/null +++ b/src/services/email/libs/os-lib.js @@ -0,0 +1,82 @@ +import * as os from "../../../libs/opensearch-lib"; + +const buildEmailsToSend = (officerList, officerId) => + officerList.map((officer) => { + if (officerId && officer.OFFICER_ID !== officerId) return; + if (!officer.EMAIL) return; + return `"${officer.LAST_NAME}, ${officer.FIRST_NAME}" <${officer.EMAIL}>`; + }).filter(Boolean).join(";"); + +export const getOsInsightData = async (id) => { + let returnData = {}; + try { + if (!process.env.osDomain) { + throw new Error("process.env.osDomain must be defined"); + } + + const osInsightsItem = await os.getItem( + process.env.osDomain, + "insights", + id + ); + console.log("Insights Item: ", JSON.stringify(osInsightsItem, null, 4)); + returnData.cpoc = osInsightsItem?._source?.LEAD_ANALYST ? buildEmailsToSend(osInsightsItem?._source?.LEAD_ANALYST, osInsightsItem?._source?.STATE_PLAN.LEAD_ANALYST_ID) : "'CPOC Substitute' "; + returnData.srt = osInsightsItem?._source?.ACTION_OFFICERS ? buildEmailsToSend(osInsightsItem?._source?.ACTION_OFFICERS) : "'SRT Substitute' "; + returnData.ninetyDaysLookup = osInsightsItem?._source?.STATE_PLAN.ALERT_90_DAYS_DATE; + + // const osChangeLogItem = await os.search(process.env.osDomain, "changelog", { + // from: 0, + // size: 200, + // sort: [{ timestamp: "desc" }], + // query: { + // bool: { + // must: [{ term: { "packageId.keyword": id } }], + // }, + // }, + // }); + // console.log("ChangeLog Items: ", JSON.stringify(osChangeLogItem, null, 4)); + + // const osTypesItem = await os.getItem( + // process.env.osDomain, + // "types", + // id + // ); + // console.log("osTypesItem Item: ", osTypesItem); + + // const osSubTypesItem = await os.getItem( + // process.env.osDomain, + // "subtypes", + // id + // ); + // console.log("osSubTypesItem Item: ", osSubTypesItem); + + } catch (error) { + console.log("OpenSearch error is: ", error); + } + console.log("OS Lookup ReturnData: ", returnData); + return returnData; +}; + +export const getOsMainData = async (id) => { + let returnData = {}; + try { + if (!process.env.osDomain) { + throw new Error("process.env.osDomain must be defined"); + } + + const osMainItem = await os.getItem( + process.env.osDomain, + "main", + id + ); + console.log("Main Item: ", osMainItem); + + returnData.initialSubmitterName = osMainItem?._source?.submitterName ? osMainItem._source.submitterName : "Submitter Unknown"; + returnData.initialSubmitterEmail = osMainItem?._source?.submitterEmail ? osMainItem._source.submitterEmail : "Submitter Email Unknown"; + + } catch (error) { + console.log("OpenSearch error is: ", error); + } + console.log("OS Main Lookup ReturnData: ", returnData); + return returnData; +}; \ No newline at end of file diff --git a/src/services/email/package.json b/src/services/email/package.json index 8035c136e..4090f56c3 100644 --- a/src/services/email/package.json +++ b/src/services/email/package.json @@ -7,9 +7,12 @@ "author": "", "license": "CC0-1.0", "dependencies": { - "@aws-sdk/client-ses": "^3.499.0" - }, - "scripts": { + "@aws-sdk/client-ses": "^3.499.0", + "@haftahave/serverless-ses-template": "^6.1.0", + "base-64": "^1.0.0", + "luxon": "^3.4.4", + "shared-types": "*" + }, "scripts": { "lint": "eslint '**/*.{ts,js}'" }, "devDependencies": { diff --git a/src/services/email/serverless.yml b/src/services/email/serverless.yml index 2af508dca..a2007cd92 100644 --- a/src/services/email/serverless.yml +++ b/src/services/email/serverless.yml @@ -8,6 +8,7 @@ plugins: - "@stratiformdigital/serverless-iam-helper" - serverless-plugin-scripts - serverless-esbuild + - "@haftahave/serverless-ses-template" provider: name: aws @@ -26,13 +27,30 @@ provider: Action: - ses:ListIdentities - ses:ListConfigurationSets - - ses:SendEmail + - ses:SendTemplatedEmail Resource: "*" - Effect: Allow Action: - sns:Subscribe - sns:Publish Resource: "*" + - Effect: Allow + Action: + - ec2:CreateNetworkInterface + - ec2:DescribeNetworkInterfaces + - ec2:DescribeVpcs + - ec2:DeleteNetworkInterface + - ec2:DescribeSubnets + - ec2:DescribeSecurityGroups + Resource: "*" + - Effect: Allow + Action: + - es:ESHttpGet + Resource: ${param:osDomainArn}/* + - Effect: "Allow" + Action: + - cognito-idp:ListUsers + Resource: "*" stackTags: PROJECT: ${self:custom.project} @@ -41,21 +59,53 @@ provider: custom: project: ${env:PROJECT} emailEventTopicName: ${self:service}-${sls:stage}-email-events + vpc: ${ssm:/aws/reference/secretsmanager/${self:custom.project}/${sls:stage}/vpc, ssm:/aws/reference/secretsmanager/${self:custom.project}/default/vpc} + brokerString: ${ssm:/aws/reference/secretsmanager/${self:custom.project}/${sls:stage}/brokerString, ssm:/aws/reference/secretsmanager/${self:custom.project}/default/brokerString} + emailAddressLookup: ${ssm:/aws/reference/secretsmanager/${self:custom.project}/${sls:stage}/emailAddressLookup, ssm:/aws/reference/secretsmanager/${self:custom.project}/default/emailAddressLookup} serverlessTerminationProtection: stages: # Apply CloudFormation termination protection for these stages - master - val - production + sesTemplates: + addStage: true + +params: + master: + topicNamespace: "" + val: + topicNamespace: "" + production: + topicNamespace: "" + default: + topicNamespace: --${self:custom.project}--${sls:stage}-- functions: processEmails: handler: handlers/processEmails.main environment: region: ${self:provider.region} + stage: ${sls:stage} + osDomain: ${param:osDomain} + cognitoPoolId: ${param:CognitoUserPoolId} + emailSource: ${self:custom.emailAddressLookup.sourceEmail} + osgEmail: ${self:custom.emailAddressLookup.osgEmail} + dpoEmail: ${self:custom.emailAddressLookup.dpoEmail} + dmcoEmail: ${self:custom.emailAddressLookup.dmcoEmail} + dhcbsooEmail: ${self:custom.emailAddressLookup.dhcbsooEmail} + chipInbox: ${self:custom.emailAddressLookup.chipInbox} + chipCcList: ${self:custom.emailAddressLookup.chipCcList} emailConfigSet: ${self:service}-${sls:stage}-configuration + applicationEndpoint: ${param:ApplicationEndpointUrl} maximumRetryAttempts: 0 timeout: 60 memorySize: 1024 + vpc: + securityGroupIds: + - Ref: SecurityGroup + subnetIds: >- + ${self:custom.vpc.privateSubnets} + processEmailEvents: handler: handlers/processEmailEvents.main events: @@ -169,3 +219,45 @@ resources: - "subscription" SnsDestination: TopicARN: !Ref EmailEventTopic + + + SinkEmailTrigger: + Type: AWS::Lambda::EventSourceMapping + Properties: + BatchSize: 10 + Enabled: true + FunctionName: !GetAtt ProcessEmailsLambdaFunction.Arn + SelfManagedEventSource: + Endpoints: + KafkaBootstrapServers: + Fn::Split: + - "," + - ${self:custom.brokerString} + SourceAccessConfigurations: + - Type: VPC_SUBNET + URI: subnet:${self:custom.vpc.privateSubnets.0} + - Type: VPC_SUBNET + URI: subnet:${self:custom.vpc.privateSubnets.1} + - Type: VPC_SUBNET + URI: subnet:${self:custom.vpc.privateSubnets.2} + - Type: VPC_SECURITY_GROUP + URI: !Sub security_group:${SecurityGroup} + StartingPosition: LATEST + Topics: + - ${param:topicNamespace}aws.onemac.migration.cdc + + SecurityGroup: + Type: AWS::EC2::SecurityGroup + DeletionPolicy: Retain # VPC based lambda's are problematic when deleting the SG due to ENI attachmnent out of our control. + Properties: + GroupDescription: Security group for Sink Lambda Function. + VpcId: ${self:custom.vpc.id} + SecurityGroupEgress: + - IpProtocol: tcp + CidrIp: 0.0.0.0/0 + FromPort: 443 + ToPort: 443 + - IpProtocol: tcp + CidrIp: 10.0.0.0/8 + FromPort: 9094 + ToPort: 9094 \ No newline at end of file diff --git a/src/services/email/ses-email-templates/index.js b/src/services/email/ses-email-templates/index.js new file mode 100644 index 000000000..d8bf89794 --- /dev/null +++ b/src/services/email/ses-email-templates/index.js @@ -0,0 +1,672 @@ +/** + * @returns {Promise<{name: string, subject: string, html: string, text}[]>} + */ + +module.exports = async () => [ + // Medicaid SPA email template group + { + name: "new-submission-medicaid-spa-cms", + subject: "Medicaid SPA {{id}} Submitted", + html: ` +

The OneMAC Submission Portal received a Medicaid SPA Submission:

+
    +
  • The submission can be accessed in the OneMAC application, which you +can find at this link.
  • +
  • If you are not already logged in, please click the "Login" link +at the top of the page and log in using your Enterprise User +Administration (EUA) credentials.
  • +
  • After you have logged in, you will be taken to the OneMAC application. +The submission will be listed on the dashboard page, and you can view its +details by clicking on its ID number.
  • +
+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email: {{submitterEmail}} +
Medicaid SPA ID: {{id}} +
Proposed Effective Date: {{proposedEffectiveDateNice}} +

+Summary: +
{{additionalInformation}} +
+

+
Files: +
{{formattedFileList}} +
+

If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a Medicaid SPA Submission: + +The submission can be accessed in the OneMAC application, which you can +find at {{applicationEndpoint}}. + +If you are not already logged in, please click the "Login" link at the top +of the page and log in using your Enterprise User Administration (EUA) +credentials. + +After you have logged in, you will be taken to the OneMAC application. +The submission will be listed on the dashboard page, and you can view its +details by clicking on its ID number. + +State or territory: {{territory}} +Name: {{submitterName}} +Email: {{submitterEmail}} +Medicaid SPA ID: {{id}} +Proposed Effective Date: {{proposedEffectiveDateNice}} + +Summary: +{{additionalInformation}} + +Files: +{{textFileList}} + +If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "new-submission-medicaid-spa-state", + subject: "Your Medicaid SPA {{id}} has been submitted to CMS", + html: ` +

This response confirms that you submitted a Medicaid SPA to CMS for review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
Medicaid SPA ID: {{id}} +
Proposed Effective Date: {{proposedEffectiveDateNice}} +
90th Day Deadline: {{ninetyDaysDateNice}} +

+Summary: +
{{additionalInformation}} +
+

This response confirms the receipt of your Medicaid State Plan Amendment +(SPA or your response to a SPA Request for Additional Information (RAI)). +You can expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysDateNice}}.

+

This mailbox is for the submittal of State Plan Amendments and non-web-based +responses to Requests for Additional Information (RAI) on submitted SPAs only. +Any other correspondence will be disregarded.

+

If you have questions or did not expect this email, please contact +SPA@cms.hhs.gov.

+

Thank you!

`, + text: ` +This response confirms that you submitted a Medicaid SPA to CMS for review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +Medicaid SPA ID: {{id}} +Proposed Effective Date: {{proposedEffectiveDateNice}} +90th Day Deadline: {{ninetyDaysDateNice}} + +Summary: +{{additionalInformation}} + +This response confirms the receipt of your Medicaid State Plan Amendment +(SPA or your response to a SPA Request for Additional Information (RAI)). +You can expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysDateNice}}. + +This mailbox is for the submittal of State Plan Amendments and non-web-based +responses to Requests for Additional Information (RAI) on submitted SPAs only. +Any other correspondence will be disregarded. + +If you have questions or did not expect this email, please contact +SPA@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "respond-to-rai-medicaid-spa-cms", + subject: "Medicaid SPA RAI Response for {{id}} Submitted", + html: ` +

The OneMAC Submission Portal received a Medicaid SPA RAI Response Submission:

+
    +
  • The submission can be accessed in the OneMAC application, which you +can find at this link.
  • +
  • If you are not already logged in, please click the "Login" link +at the top of the page and log in using your Enterprise User +Administration (EUA) credentials.
  • +
  • After you have logged in, you will be taken to the OneMAC application. +The submission will be listed on the dashboard page, and you can view its +details by clicking on its ID number.
  • +
+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email: {{submitterEmail}} +
Medicaid SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+

+
Files: +
{{formattedFileList}} +
+

If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a Medicaid SPA RAI Response Submission: + +The submission can be accessed in the OneMAC application, which you can +find at {{applicationEndpoint}}. + +If you are not already logged in, please click the "Login" link at the top +of the page and log in using your Enterprise User Administration (EUA) +credentials. + +After you have logged in, you will be taken to the OneMAC application. +The submission will be listed on the dashboard page, and you can view its +details by clicking on its ID number. + +State or territory: {{territory}} +Name: {{submitterName}} +Email: {{submitterEmail}} +Medicaid SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +Files: +{{textFileList}} + +If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "respond-to-rai-medicaid-spa-state", + subject: "Your Medicaid SPA RAI Response for {{id}} has been submitted to CMS", + html: ` +

This response confirms you submitted a Medicaid SPA RAI Response to CMS for review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
Medicaid SPA ID: {{id}} +
90th Day Deadline: {{ninetyDaysLookupNice}} +

+Summary: +
{{additionalInformation}} +
+

This response confirms receipt of your Medicaid State Plan Amendment (SPA +or your response to a SPA Request for Additional Information (RAI)). You can +expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysLookupNice}}.

+

This mailbox is for the submittal of State Plan Amendments and non-web +based responses to Requests for Additional Information (RAI) on submitted +SPAs only. Any other correspondence will be disregarded.

+

If you have questions, please contact +SPA@cms.hhs.gov.

+

Thank you!

`, + text: ` +This response confirms you submitted a Medicaid SPA RAI Response to CMS for review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +Medicaid SPA ID: {{id}} +90th Day Deadline: {{ninetyDaysLookupNice}} + +Summary: +{{additionalInformation}} + +This response confirms receipt of your Medicaid State Plan Amendment (SPA +or your response to a SPA Request for Additional Information (RAI)). You can +expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysLookupNice}}. + +This mailbox is for the submittal of State Plan Amendments and non-web +based responses to Requests for Additional Information (RAI) on submitted +SPAs only. Any other correspondence will be disregarded. + +If you have questions, please contact SPA@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "withdraw-rai-medicaid-spa-cms", + subject: "Withdraw Formal RAI Response for SPA Package {{id}}", + html: ` +

The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}.

+

+
State or territory: {{territory}} +
Name: {{initialSubmitterName}} +
Email Address: {{initialSubmitterEmail}} +
SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+
Files: +
{{formattedFileList}} +

If the contents of this email seem suspicious, do not open them, and +instead forward this email to SPAM@cms.hhs.gov. +

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}. + +State or territory: {{territory}} +Name: {{initialSubmitterName}} +Email Address: {{initialSubmitterEmail}} +SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +Files: +{{formattedFileList}} + +If the contents of this email seem suspicious, do not open them, and +instead forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "withdraw-rai-medicaid-spa-state", + subject: "Withdraw Formal RAI Response for SPA Package {{id}}", + html: ` +

The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}.

+

+
State or territory: {{territory}} +
Name: {{initialSubmitterName}} +
Email Address: {{initialSubmitterEmail}} +
Medicaid SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+

If you have questions or did not expect this email, please contact +spa@cms.hhs.gov. +

Thank you!

`, + text: ` +The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}. + +State or territory: {{territory}} +Name: {{initialSubmitterName}} +Email Address: {{initialSubmitterEmail}} +Medicaid SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +If you have questions or did not expect this email, please contact +spa@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "withdraw-package-medicaid-spa-cms", + subject: "SPA Package {{id}} Withdraw Request", + html: ` +

The OneMAC Submission Portal received a request to withdraw the package below. +The package will no longer be considered for CMS review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email: {{submitterEmail}} +
Medicaid SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +

If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a request to withdraw the package below. +The package will no longer be considered for CMS review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email: {{submitterEmail}} +Medicaid SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "withdraw-package-medicaid-spa-state", + subject: "SPA Package {{id}} Withdraw Request", + html: ` +

This is confirmation that you have requested to withdraw the package below. +The package will no longer be considered for CMS review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
Medicaid SPA ID: {{id}} +

+Summary: +
{{additionalInformation}} +

If you have questions or did not expect this email, please contact +SPA@cms.hhs.gov.

+

Thank you!

`, + text: ` +This is confirmation that you have requested to withdraw the package below. +The package will no longer be considered for CMS review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +Medicaid SPA ID: {{id}} + +Summary: +{{additionalInformation}} + +If you have questions or did not expect this email, please contact +spa@cms.hhs.gov. + +Thank you!`, +}, + +// CHIP SPA email template group +{ + name: "new-submission-chip-spa-cms", + subject: "New CHIP SPA {{id}} Submitted", + html: ` +

The OneMAC Submission Portal received a CHIP State Plan Amendment:

+
    +
  • The submission can be accessed in the OneMAC Micro application, which +you can find at +{{applicationEndpoint}}.
  • +
  • If you are not already logged in, please click the "Login" link at the +top of the page and log in using your Enterprise User Administration (EUA) +credentials.
  • +
  • After you have logged in, you will be taken to the OneMAC Micro +application. The submission will be listed on the dashboard page, and you +can view its details by clicking on its ID number.
  • +
+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email: {{submitterEmail}} +
CHIP SPA Package ID: {{id}} +


+Summary: +
{{additionalInformation}} +
+

+
Files: +
{{formattedFileList}} +

+

If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a CHIP State Plan Amendment: + +- The submission can be accessed in the OneMAC Micro application, which you can + find at {{applicationEndpoint}}. +- If you are not already logged in, please click the "Login" link at the + top of the page and log in using your Enterprise User Administration (EUA) + credentials. +- After you have logged in, you will be taken to the OneMAC Micro + application. The submission will be listed on the dashboard page, and you + can view its details by clicking on its ID number. + +State or territory: {{territory}} +Name: {{submitterName}} +Email: {{submitterEmail}} +CHIP SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +Files: +{{formattedFileList}} + +If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "new-submission-chip-spa-state", + subject: "Your CHIP SPA {{id}} has been submitted to CMS", + html: ` +

This is confirmation that you submitted a CHIP State Plan Amendment +to CMS for review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
CHIP SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+

This response confirms the receipt of your CHIP State Plan Amendment +(CHIP SPA). You can expect a formal response to your submittal from CMS +at a later date. +

+

If you have questions or did not expect this email, please contact +CHIPSPASubmissionMailBox@CMS.HHS.gov.

+

Thank you!

`, + text: ` +This is confirmation that you submitted a CHIP State Plan Amendment +to CMS for review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +CHIP SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +This response confirms the receipt of your CHIP State Plan Amendment +(CHIP SPA). You can expect a formal response to your submittal from CMS +at a later date. + +If you have questions or did not expect this email, please contact +CHIPSPASubmissionMailBox@CMS.HHS.gov. + +Thank you!`, +}, +{ + name: "respond-to-rai-chip-spa-cms", + subject: "CHIP SPA RAI Response for {{id}} Submitted", + html: ` +

The OneMAC Submission Portal received a CHIP SPA RAI Response Submission:

+
    +
  • The submission can be accessed in the OneMAC application, which you +can find at this link.
  • +
  • If you are not already logged in, please click the "Login" link +at the top of the page and log in using your Enterprise User +Administration (EUA) credentials.
  • +
  • After you have logged in, you will be taken to the OneMAC application. +The submission will be listed on the dashboard page, and you can view its +details by clicking on its ID number.
  • +
+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
CHIP SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+

+
Files: +
{{formattedFileList}} +
+

If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a CHIP SPA RAI Response Submission: + +- The submission can be accessed in the OneMAC application, which you can + find at {{applicationEndpoint}}. +- If you are not already logged in, please click the "Login" link at the top + of the page and log in using your Enterprise User Administration (EUA) + credentials. +- After you have logged in, you will be taken to the OneMAC application. + The submission will be listed on the dashboard page, and you can view its + details by clicking on its ID number. + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +CHIP SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +Files: +{{textFileList}} + +If the contents of this email seem suspicious, do not open them, and instead +forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "respond-to-rai-chip-spa-state", + subject: "Your CHIP SPA RAI Response for {{id}} has been submitted to CMS", + html: ` +

This response confirms you submitted a CHIP SPA RAI Response to CMS for review:

+

+
State or territory: {{territory}} +
Name: {{submitterName}} +
Email Address: {{submitterEmail}} +
CHIP SPA Package ID: {{id}} +
90th Day Deadline: {{ninetyDaysLookupNice}} +

+Summary: +
{{additionalInformation}} +
+

This response confirms receipt of your CHIP State Plan Amendment (SPA +or your response to a SPA Request for Additional Information (RAI)). You can +expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysLookupNice}}.

+

If you have questions, please contact +CHIPSPASubmissionMailbox@cms.hhs.gov +or your state lead.

+

Thank you!

`, + text: ` +This response confirms you submitted a CHIP SPA RAI Response to CMS for review: + +State or territory: {{territory}} +Name: {{submitterName}} +Email Address: {{submitterEmail}} +CHIP SPA Package ID: {{id}} +90th Day Deadline: {{ninetyDaysLookupNice}} + +Summary: +{{additionalInformation}} + +This response confirms receipt of your CHIP State Plan Amendment (SPA +or your response to a SPA Request for Additional Information (RAI)). You can +expect a formal response to your submittal to be issued within 90 days, +before {{ninetyDaysLookupNice}}. + +If you have questions, please contact CHIPSPASubmissionMailbox@cms.hhs.gov +or your state lead. + +Thank you!`, +}, +{ + name: "withdraw-rai-chip-spa-cms", + subject: "Withdraw Formal RAI Response for CHIP SPA Package {{id}}", + html: ` +

The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}.

+

+
State or territory: {{territory}} +
Name: {{initialSubmitterName}} +
Email Address: {{initialSubmitterEmail}} +
CHIP SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+
Files: +
{{formattedFileList}} +

If the contents of this email seem suspicious, do not open them, and +instead forward this email to SPAM@cms.hhs.gov. +

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}. + +State or territory: {{territory}} +Name: {{initialSubmitterName}} +Email Address: {{initialSubmitterEmail}} +CHIP SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +Files: +{{formattedFileList}} + +If the contents of this email seem suspicious, do not open them, and +instead forward this email to SPAM@cms.hhs.gov. + +Thank you!`, +}, +{ + name: "withdraw-rai-chip-spa-state", + subject: "Withdraw Formal RAI Response for CHIP SPA Package {{id}}", + html: ` +

The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}.

+

+
State or territory: {{territory}} +
Name: {{initialSubmitterName}} +
Email Address: {{initialSubmitterEmail}} +
CHIP SPA Package ID: {{id}} +

+Summary: +
{{additionalInformation}} +
+

If you have any questions, please contact +CHIPSPASubmissionMailbox@cms.hhs.gov +or your state lead.

+

Thank you!

`, + text: ` +The OneMAC Submission Portal received a request to withdraw the Formal +RAI Response. You are receiving this email notification as the Formal RAI +for {{id}} was withdrawn by {{submitterName}} {{submitterEmail}}. + +State or territory: {{territory}} +Name: {{initialSubmitterName}} +Email Address: {{initialSubmitterEmail}} +CHIP SPA Package ID: {{id}} + +Summary: +{{additionalInformation}} + +If you have any questions, please contact CHIPSPASubmissionMailbox@cms.hhs.gov +or your state lead. + +Thank you!`, +} +]; \ No newline at end of file From 5c00dea7158de2feda1705ed099595bb73604129 Mon Sep 17 00:00:00 2001 From: Paul Kim <141361476+pkim-gswell@users.noreply.github.com> Date: Fri, 15 Mar 2024 09:33:31 -0600 Subject: [PATCH 05/12] fix(OY2-25752): os export hide columns (#443) * fix(OY2-25752): os export hide columns * feat(OY3): add rai withdraw enabled bool filter * feat(appk): add form amendment title --------- Co-authored-by: Mike Dial --- src/packages/shared-types/attachments.ts | 5 +- src/packages/shared-types/opensearch/_.ts | 5 - .../opensearch/changelog/index.ts | 2 - .../shared-types/opensearch/main/index.ts | 2 - .../shared-types/opensearch/subtypes/index.ts | 2 - .../shared-types/opensearch/types/index.ts | 2 - .../api/handlers/appkNewSubmission.ts | 13 +++ .../ui/src/components/ExportButton/index.tsx | 78 -------------- .../ui/src/components/Form/content.tsx | 11 ++ .../main/Filtering/Drawer/consts.ts | 9 ++ .../Opensearch/main/Filtering/Drawer/hooks.ts | 23 ++-- .../Opensearch/main/Filtering/Export/hooks.ts | 101 ------------------ .../main/Filtering/Export/index.tsx | 76 +++++++++++-- .../Opensearch/main/Filtering/index.tsx | 7 +- .../Opensearch/main/Settings/Visibility.tsx | 12 ++- .../Opensearch/main/Table/index.tsx | 33 ++---- .../components/Opensearch/main/Table/types.ts | 3 +- .../src/components/Opensearch/main/index.ts | 6 -- .../src/components/Opensearch/main/index.tsx | 62 +++++++++++ src/services/ui/src/components/index.tsx | 1 - .../features/dashboard/Lists/spas/consts.tsx | 45 +++++++- .../features/dashboard/Lists/spas/index.tsx | 34 +----- .../dashboard/Lists/waivers/consts.tsx | 49 ++++++++- .../dashboard/Lists/waivers/index.tsx | 34 +----- .../src/features/submission/app-k/consts.ts | 67 +++--------- .../src/features/submission/app-k/index.tsx | 44 +++++++- 26 files changed, 347 insertions(+), 379 deletions(-) delete mode 100644 src/services/ui/src/components/ExportButton/index.tsx delete mode 100644 src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts delete mode 100644 src/services/ui/src/components/Opensearch/main/index.ts create mode 100644 src/services/ui/src/components/Opensearch/main/index.tsx diff --git a/src/packages/shared-types/attachments.ts b/src/packages/shared-types/attachments.ts index bfdb939fd..08fdfe229 100644 --- a/src/packages/shared-types/attachments.ts +++ b/src/packages/shared-types/attachments.ts @@ -3,7 +3,7 @@ import { s3ParseUrl } from "shared-utils/s3-url-parser"; import { Authority } from "./authority"; export const attachmentTitleMap = ( - authority: Authority + authority: Authority, ): Record => ({ // SPA cmsForm179: "CMS Form 179", @@ -40,6 +40,7 @@ export const attachmentTitleMap = ( "1915(b)(4) FFS Selective Contracting (Streamlined) Waiver Application Pre-print", b4IndependentAssessment: "1915(b)(4) FFS Selective Contracting (Streamlined) Independent Assessment (first two renewals only)", + appk: "1915(c) Appendix K Amendment Waiver Template", waiverExtensionRequest: "Waiver Extension Request", }); export type AttachmentKey = keyof typeof attachmentTitleMap; @@ -65,7 +66,7 @@ export const legacyAttachmentSchema = z.object({ export type LegacyAttachment = z.infer; export function handleLegacyAttachment( - attachment: LegacyAttachment + attachment: LegacyAttachment, ): Attachment | null { const parsedUrl = s3ParseUrl(attachment.url || ""); if (!parsedUrl) return null; diff --git a/src/packages/shared-types/opensearch/_.ts b/src/packages/shared-types/opensearch/_.ts index 195391886..78944cff0 100644 --- a/src/packages/shared-types/opensearch/_.ts +++ b/src/packages/shared-types/opensearch/_.ts @@ -80,9 +80,4 @@ export type AggResult = Record< } >; -export type ExportHeaderOptions = { - transform: (data: TData) => string; - name: string; -}; - export type Index = "main" | "insights" | "changelog" | "types" | "subtypes"; diff --git a/src/packages/shared-types/opensearch/changelog/index.ts b/src/packages/shared-types/opensearch/changelog/index.ts index 69c6be723..b7eb64d22 100644 --- a/src/packages/shared-types/opensearch/changelog/index.ts +++ b/src/packages/shared-types/opensearch/changelog/index.ts @@ -4,7 +4,6 @@ import { Filterable as FIL, QueryState, AggQuery, - ExportHeaderOptions, } from "./../_"; import { OneMac, @@ -36,4 +35,3 @@ export type Field = keyof Document | `${keyof Document}.keyword`; export type Filterable = FIL; export type State = QueryState; export type Aggs = AggQuery; -export type ExportHeader = ExportHeaderOptions; diff --git a/src/packages/shared-types/opensearch/main/index.ts b/src/packages/shared-types/opensearch/main/index.ts index 7b87e4fe3..a5f432319 100644 --- a/src/packages/shared-types/opensearch/main/index.ts +++ b/src/packages/shared-types/opensearch/main/index.ts @@ -4,7 +4,6 @@ import { Filterable as FIL, QueryState, AggQuery, - ExportHeaderOptions, } from "./../_"; import { z } from "zod"; import { ItemResult as Changelog } from "./../changelog"; @@ -38,6 +37,5 @@ export type Field = keyof Document | `${keyof Document}.keyword`; export type Filterable = FIL; export type State = QueryState; export type Aggs = AggQuery; -export type ExportHeader = ExportHeaderOptions; export * from "./transforms"; diff --git a/src/packages/shared-types/opensearch/subtypes/index.ts b/src/packages/shared-types/opensearch/subtypes/index.ts index 751ab1c06..9457fb966 100644 --- a/src/packages/shared-types/opensearch/subtypes/index.ts +++ b/src/packages/shared-types/opensearch/subtypes/index.ts @@ -4,7 +4,6 @@ import { Filterable as FIL, QueryState, AggQuery, - ExportHeaderOptions, } from "./../_"; import { z } from "zod"; import { Type } from "./transforms"; @@ -20,6 +19,5 @@ export type Field = keyof Document | `${keyof Document}.keyword`; export type Filterable = FIL; export type State = QueryState; export type Aggs = AggQuery; -export type ExportHeader = ExportHeaderOptions; export * from "./transforms"; diff --git a/src/packages/shared-types/opensearch/types/index.ts b/src/packages/shared-types/opensearch/types/index.ts index 904e48f4a..75ed5dbd0 100644 --- a/src/packages/shared-types/opensearch/types/index.ts +++ b/src/packages/shared-types/opensearch/types/index.ts @@ -4,7 +4,6 @@ import { Filterable as FIL, QueryState, AggQuery, - ExportHeaderOptions, } from "./../_"; import { z } from "zod"; import { SPA_Type } from "./transforms"; @@ -20,6 +19,5 @@ export type Field = keyof Document | `${keyof Document}.keyword`; export type Filterable = FIL; export type State = QueryState; export type Aggs = AggQuery; -export type ExportHeader = ExportHeaderOptions; export * from "./transforms"; diff --git a/src/services/api/handlers/appkNewSubmission.ts b/src/services/api/handlers/appkNewSubmission.ts index 6e00bc1c6..ab6c8c7c1 100644 --- a/src/services/api/handlers/appkNewSubmission.ts +++ b/src/services/api/handlers/appkNewSubmission.ts @@ -13,6 +13,19 @@ import { search } from "../../../libs/opensearch-lib"; export const submit = async (event: APIGatewayEvent) => { // reject no body + /** + state: z.string(), + parentWaiver: zAppkWaiverNumberSchema, + childWaivers: z.array(zAppkWaiverNumberSchema), + additionalInformation: z.string().max(4000).optional(), + title: z.string(), + attachments: z.object({ + appk: zAttachmentRequired({ min: 1 }), + other: zAttachmentRequired({ min: 1 }), + }), + proposedEffectiveDate: z.date(), + seaActionType: z.string().default("Amend"), + */ if (!event.body) { return response({ statusCode: 400, diff --git a/src/services/ui/src/components/ExportButton/index.tsx b/src/services/ui/src/components/ExportButton/index.tsx deleted file mode 100644 index ae24ec84b..000000000 --- a/src/services/ui/src/components/ExportButton/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { ExportToCsv } from "export-to-csv"; -import { Button, useOsUrl } from "@/components"; -import { Download, Loader } from "lucide-react"; -import { useState } from "react"; -import { motion } from "framer-motion"; -import { format } from "date-fns"; -import { opensearch } from "shared-types"; - -type Props> = { - data: TData[] | (() => Promise); - headers: opensearch.ExportHeaderOptions[]; - // | Record> -}; - -export const ExportButton = >({ - data, - headers, -}: Props) => { - const [loading, setLoading] = useState(false); - const url = useOsUrl(); - - const generateExport = async (): Promise> => { - setLoading(true); - - const exportData: Record[] = []; - let resolvedData: TData[]; - - if (data instanceof Function) { - resolvedData = await data(); - } else { - resolvedData = data; - } - - for (const item of resolvedData) { - const column: Record = {}; - - for (const header of headers) { - column[header.name] = header.transform(item); - } - exportData.push(column); - } - - setLoading(false); - - return exportData; - }; - - const handleExport = (data: Record) => { - const csvExporter = new ExportToCsv({ - useKeysAsHeaders: true, - filename: `${url.state.tab}-export-${format(new Date(), "MM/dd/yyyy")}`, - }); - - csvExporter.generateCsv(data); - }; - - return ( - - ); -}; diff --git a/src/services/ui/src/components/Form/content.tsx b/src/services/ui/src/components/Form/content.tsx index 13a978417..8406912c0 100644 --- a/src/services/ui/src/components/Form/content.tsx +++ b/src/services/ui/src/components/Form/content.tsx @@ -18,6 +18,17 @@ export const FormIntroText = () => (
); +export const FormIntroTextForAppK = () => ( +
+ + + If your Appendix K submission is for more than one waiver number, please + enter one of the applicable waiver numbers. You do not need to create + multiple submissions. + +
+); + export const SpaIdFormattingDesc = () => ( <>

diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts index 71e9bade4..9158dedf2 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts @@ -60,6 +60,15 @@ export const BOOL_INITIALINTAKENEEDED: DrawerFilterableGroup = { value: null, }; +export const BOOL_RAIWITHDRAWENABLED: DrawerFilterableGroup = { + label: "RAI Withdraw Enabled", + field: "raiWithdrawEnabled", + component: "boolean", + prefix: "must", + type: "match", + value: null, +}; + export const CHECK_ACTIONTYPE: DrawerFilterableGroup = { label: "Action Type", field: "actionType.keyword", diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts index f5d88a63b..ca33f2e38 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts @@ -32,6 +32,7 @@ export const useFilterState = () => { ...(!!user?.isCms && { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), + [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, [C.DATE_RAIRECEIVED.field]: C.DATE_RAIRECEIVED, [C.SELECT_CPOC.field]: C.SELECT_CPOC, @@ -52,6 +53,7 @@ export const useFilterState = () => { ...(!!user?.isCms && { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), + [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, [C.DATE_RAIRECEIVED.field]: C.DATE_RAIRECEIVED, [C.SELECT_CPOC.field]: C.SELECT_CPOC, @@ -147,15 +149,18 @@ export const useFilterDrawer = () => { }, [url.state.filters, drawer.drawerOpen]); const aggs = useMemo(() => { - return Object.entries(_aggs || {}).reduce((STATE, [KEY, AGG]) => { - return { - ...STATE, - [KEY]: AGG.buckets.map((BUCK) => ({ - label: `${labelMap[BUCK.key] || BUCK.key}`, - value: BUCK.key, - })), - }; - }, {} as Record); + return Object.entries(_aggs || {}).reduce( + (STATE, [KEY, AGG]) => { + return { + ...STATE, + [KEY]: AGG.buckets.map((BUCK) => ({ + label: `${labelMap[BUCK.key] || BUCK.key}`, + value: BUCK.key, + })), + }; + }, + {} as Record + ); }, [_aggs]); return { diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts deleted file mode 100644 index 168bbe0e1..000000000 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Export/hooks.ts +++ /dev/null @@ -1,101 +0,0 @@ -import { UserRoles, opensearch } from "shared-types"; -import { formatSeatoolDate } from "shared-utils"; -import { useGetUser, getMainExportData } from "@/api"; -import { LABELS } from "@/utils"; -import { BLANK_VALUE } from "@/consts"; -import { DEFAULT_FILTERS, useOsUrl } from "../../useOpensearch"; - -export const useFilterExportGroups = () => { - const { data: user } = useGetUser(); - const url = useOsUrl(); - - const onExport = () => - getMainExportData( - url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []), - ); - - const headers: opensearch.main.ExportHeader[] = [ - { - name: (() => { - if (url.state.tab === "spas") return "SPA ID"; - if (url.state.tab === "waivers") return "Waiver Number"; - return ""; - })(), - transform: (data) => data.id, - }, - { - name: "State", - transform: (data) => data.state ?? BLANK_VALUE, - }, - { - name: "Authority", - transform: (data) => data.authority ?? BLANK_VALUE, - }, - ...((): opensearch.main.ExportHeader[] => { - if (url.state.tab !== "waivers") return []; - return [ - { - name: "Action Type", - transform: (data) => { - if (data.actionType === undefined) { - return BLANK_VALUE; - } - - return ( - LABELS[data.actionType as keyof typeof LABELS] || data.actionType - ); - }, - }, - ]; - })(), - { - name: "Status", - transform: (data) => { - const status = (() => { - if (!user?.isCms) return data.stateStatus; - if (user?.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK)) { - return data.stateStatus; - } - return data.cmsStatus; - })(); - - const subStatusRAI = data.raiWithdrawEnabled - ? " (Withdraw Formal RAI Response - Enabled)" - : ""; - - const subStatusInitialIntake = (() => { - if (!user?.isCms) return ""; - if (!data.initialIntakeNeeded) return ""; - return " (Initial Intake Needed)"; - })(); - - return `${status}${subStatusRAI}${subStatusInitialIntake}`; - }, - }, - { - name: "Initial Submission", - transform: (data) => - data?.submissionDate - ? formatSeatoolDate(data.submissionDate) - : BLANK_VALUE, - }, - { - name: "Formal RAI Received", - transform: (data) => { - return data.raiReceivedDate && !data.raiWithdrawnDate - ? formatSeatoolDate(data.raiReceivedDate) - : BLANK_VALUE; - }, - }, - { - name: "CPOC Name", - transform: (data) => data.leadAnalystName ?? BLANK_VALUE, - }, - { - name: "Submitted By", - transform: (data) => data.submitterName ?? BLANK_VALUE, - }, - ]; - - return { onExport, headers }; -}; diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx b/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx index 6f7702ceb..e0e2f8fbe 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx @@ -1,10 +1,72 @@ -import { ExportButton } from "@/components"; -import { useFilterExportGroups } from "./hooks"; +import { getMainExportData } from "@/api"; +import { Download, Loader } from "lucide-react"; +import { ExportToCsv } from "export-to-csv"; +import { useState } from "react"; +import { motion } from "framer-motion"; +import { format } from "date-fns"; -export const OsFilterExport = () => { - const hook = useFilterExportGroups(); +import { DEFAULT_FILTERS } from "../../useOpensearch"; +import { Button, OsTableColumn, useOsUrl } from "@/components"; +import { FC } from "react"; - return ; -}; +export const OsExportData: FC<{ + columns: OsTableColumn[]; +}> = ({ columns }) => { + const [loading, setLoading] = useState(false); + const url = useOsUrl(); + + const generateExport = async (): Promise> => { + setLoading(true); + + const exportData: Record[] = []; + const resolvedData = await getMainExportData( + url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []) + ); + + for (const item of resolvedData) { + const column: Record = {}; + + for (const header of columns) { + if (!header.transform) continue; + if (header.hidden) continue; + column[header.label] = header.transform(item); + } + exportData.push(column); + } -export * from "./hooks"; + setLoading(false); + + return exportData; + }; + + const handleExport = (data: Record) => { + const csvExporter = new ExportToCsv({ + useKeysAsHeaders: true, + filename: `${url.state.tab}-export-${format(new Date(), "MM/dd/yyyy")}`, + }); + + csvExporter.generateCsv(data); + }; + + return ( + + ); +}; diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/index.tsx b/src/services/ui/src/components/Opensearch/main/Filtering/index.tsx index 212ae8691..b62a96071 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/index.tsx +++ b/src/services/ui/src/components/Opensearch/main/Filtering/index.tsx @@ -1,11 +1,12 @@ -import { SearchForm } from "@/components"; +import { OsTableColumn, SearchForm } from "@/components"; import { FC } from "react"; import { useOsUrl } from "../useOpensearch"; import { useOsContext } from "../Provider"; import { OsFilterDrawer } from "./Drawer"; -import { OsFilterExport } from "./Export"; +import { OsExportData } from "./Export"; export const OsFiltering: FC<{ + columns: OsTableColumn[]; disabled?: boolean; }> = (props) => { const url = useOsUrl(); @@ -29,7 +30,7 @@ export const OsFiltering: FC<{ disabled={!!props.disabled} />

- +
diff --git a/src/services/ui/src/components/Opensearch/main/Settings/Visibility.tsx b/src/services/ui/src/components/Opensearch/main/Settings/Visibility.tsx index 57eb9adc8..037459012 100644 --- a/src/services/ui/src/components/Opensearch/main/Settings/Visibility.tsx +++ b/src/services/ui/src/components/Opensearch/main/Settings/Visibility.tsx @@ -2,14 +2,16 @@ import { cn } from "@/utils"; import { EyeIcon, EyeOffIcon } from "lucide-react"; import * as UI from "@/components"; -type Item = { label: string; field?: string; hidden: boolean }; +// type Item = { label: string; field?: string; hidden: boolean }; -type Props = { +type Props = { list: T[]; onItemClick: (field: string) => void; }; -export const VisibilityPopover = (props: Props) => { +export const VisibilityPopover = ( + props: Props +) => { return ( @@ -25,7 +27,7 @@ export const VisibilityPopover = (props: Props) => { ); }; -export const VisiblityItem = ( +export const VisiblityItem = ( props: T & { onClick: () => void } ) => { const eyeStyles = cn("flex flex-row gap-2 cursor-pointer", { @@ -48,7 +50,7 @@ export const VisiblityItem = ( ); }; -export const VisibilityMenu = (props: Props) => { +export const VisibilityMenu = (props: Props) => { return (
{props.list.map((IT) => { diff --git a/src/services/ui/src/components/Opensearch/main/Table/index.tsx b/src/services/ui/src/components/Opensearch/main/Table/index.tsx index f83af988c..9e8641297 100644 --- a/src/services/ui/src/components/Opensearch/main/Table/index.tsx +++ b/src/services/ui/src/components/Opensearch/main/Table/index.tsx @@ -1,5 +1,5 @@ import * as UI from "@/components"; -import { FC, useState } from "react"; +import type { FC } from "react"; import { OsTableColumn } from "./types"; import { useOsContext } from "../Provider"; import { useOsUrl, LoadingSpinner } from "@/components"; @@ -9,28 +9,11 @@ import { opensearch } from "shared-types"; export const OsTable: FC<{ columns: OsTableColumn[]; + onToggle: (field: string) => void; }> = (props) => { const context = useOsContext(); - const url = useOsUrl(); - const [osColumns, setOsColumns] = useState( - props.columns.map((COL) => ({ - ...COL, - hidden: !(COL?.visible ?? true), - locked: COL?.locked ?? false, - })) - ); - - const onToggle = (field: string) => { - setOsColumns((state) => { - return state?.map((S) => { - if (S.field !== field) return S; - return { ...S, hidden: !S.hidden }; - }); - }); - }; - return ( @@ -39,12 +22,12 @@ export const OsTable: FC<{ className="w-[10px]" icon={ !COL.locked || COL.field)} - onItemClick={onToggle} + list={props.columns.filter((COL) => !COL.locked || COL.field)} + onItemClick={props.onToggle} /> } /> - {osColumns.map((TH) => { + {props.columns.map((TH) => { if (TH.hidden) return null; return ( No Results Found

- Adjust your search and filter to find what you are looking for. + Adjust your search and filter to find what you are looking + for.

- )} {context.data?.hits.map((DAT) => ( - {osColumns.map((COL) => { + {props.columns.map((COL) => { if (COL.hidden) return null; return ( string; cell: (data: opensearch.main.Document) => ReactNode; }; diff --git a/src/services/ui/src/components/Opensearch/main/index.ts b/src/services/ui/src/components/Opensearch/main/index.ts deleted file mode 100644 index 95f3a4e7a..000000000 --- a/src/services/ui/src/components/Opensearch/main/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export * from "./useOpensearch"; -export * from "./types"; -export * from "./Table"; -export * from "./Filtering"; -export * from "./Provider"; -export * from "./Settings"; diff --git a/src/services/ui/src/components/Opensearch/main/index.tsx b/src/services/ui/src/components/Opensearch/main/index.tsx new file mode 100644 index 000000000..6fbc23f51 --- /dev/null +++ b/src/services/ui/src/components/Opensearch/main/index.tsx @@ -0,0 +1,62 @@ +import { FC, useState } from "react"; +import { OsFiltering } from "./Filtering"; +import { OsTable } from "./Table"; +import { Pagination } from "@/components/Pagination"; +import { useOsContext } from "./Provider"; +import { useOsUrl } from "./useOpensearch"; +import { OsTableColumn } from "./types"; + +export const OsMainView: FC<{ + columns: OsTableColumn[]; +}> = (props) => { + const context = useOsContext(); + const url = useOsUrl(); + + const [osColumns, setOsColumns] = useState( + props.columns.map((COL) => ({ + ...COL, + hidden: !!COL?.hidden, + locked: COL?.locked ?? false, + })) + ); + + const onToggle = (field: string) => { + setOsColumns((state) => { + return state?.map((S) => { + if (S.field !== field) return S; + return { ...S, hidden: !S.hidden }; + }); + }); + }; + + return ( +
+ + + + url.onSet((s) => ({ + ...s, + pagination: { ...s.pagination, number }, + })) + } + onSizeChange={(size) => + url.onSet((s) => ({ + ...s, + pagination: { number: 0, size }, + })) + } + /> +
+ ); +}; + +export * from "./useOpensearch"; +export * from "./types"; +export * from "./Table"; +export * from "./Filtering"; +export * from "./Provider"; +export * from "./Settings"; diff --git a/src/services/ui/src/components/index.tsx b/src/services/ui/src/components/index.tsx index f0ce38a65..d48736c47 100644 --- a/src/services/ui/src/components/index.tsx +++ b/src/services/ui/src/components/index.tsx @@ -9,7 +9,6 @@ export * from "./Context"; export * from "./DetailsSection"; export * from "./Dialog"; export * from "./ErrorAlert"; -export * from "./ExportButton"; export * from "./Footer"; export * from "./Form"; export * from "./GovernmentBuildingIcon"; diff --git a/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx b/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx index 5c036f73e..0165b4403 100644 --- a/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx +++ b/src/services/ui/src/features/dashboard/Lists/spas/consts.tsx @@ -9,6 +9,7 @@ import { } from "../renderCells"; import { BLANK_VALUE } from "@/consts"; import { formatSeatoolDate } from "shared-utils"; +import { LABELS } from "@/utils"; export const useSpaTableColumns = (): OsTableColumn[] => { const { data: props } = useGetUser(); @@ -21,17 +22,19 @@ export const useSpaTableColumns = (): OsTableColumn[] => { field: "id.keyword", label: "SPA ID", locked: true, + transform: (data) => data.id, cell: renderCellIdLink((id) => `/details?id=${encodeURIComponent(id)}`), }, { field: "state.keyword", label: "State", - visible: true, + transform: (data) => data.state ?? BLANK_VALUE, cell: (data) => data.state, }, { field: "authority.keyword", label: "Authority", + transform: (data) => data.authority ?? BLANK_VALUE, cell: (data) => data?.authority ? removeUnderscoresAndCapitalize(data.authority) @@ -40,6 +43,27 @@ export const useSpaTableColumns = (): OsTableColumn[] => { { field: props?.isCms ? "cmsStatus.keyword" : "stateStatus.keyword", label: "Status", + transform: (data) => { + const status = (() => { + if (!props?.isCms) return data.stateStatus; + if (props?.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK)) { + return data.stateStatus; + } + return data.cmsStatus; + })(); + + const subStatusRAI = data.raiWithdrawEnabled + ? " (Withdraw Formal RAI Response - Enabled)" + : ""; + + const subStatusInitialIntake = (() => { + if (!props?.isCms) return ""; + if (!data.initialIntakeNeeded) return ""; + return " (Initial Intake Needed)"; + })(); + + return `${status}${subStatusRAI}${subStatusInitialIntake}`; + }, cell: (data) => { const status = (() => { if (!props?.isCms) return data.stateStatus; @@ -66,12 +90,16 @@ export const useSpaTableColumns = (): OsTableColumn[] => { { field: "submissionDate", label: "Initial Submission", + transform: (data) => + data?.submissionDate + ? formatSeatoolDate(data.submissionDate) + : BLANK_VALUE, cell: renderCellDate("submissionDate"), }, { field: "origin", label: "Submission Source", - visible: false, + hidden: true, cell: (data) => { return data.origin; }, @@ -79,12 +107,17 @@ export const useSpaTableColumns = (): OsTableColumn[] => { { field: "raiRequestedDate", label: "Formal RAI Requested", - visible: false, + hidden: true, cell: renderCellDate("raiRequestedDate"), }, { field: "raiReceivedDate", label: "Formal RAI Received", + transform: (data) => { + return data.raiReceivedDate && !data.raiWithdrawnDate + ? formatSeatoolDate(data.raiReceivedDate) + : BLANK_VALUE; + }, cell: (data) => { if (!data.raiReceivedDate || data.raiWithdrawnDate) return null; return formatSeatoolDate(data.raiReceivedDate); @@ -93,17 +126,19 @@ export const useSpaTableColumns = (): OsTableColumn[] => { { field: "leadAnalystName.keyword", label: "CPOC Name", - visible: false, + hidden: true, + transform: (data) => data.leadAnalystName ?? BLANK_VALUE, cell: (data) => data.leadAnalystName, }, { field: "submitterName.keyword", label: "Submitted By", + transform: (data) => data.submitterName ?? BLANK_VALUE, cell: (data) => data.submitterName, }, // hide actions column for: readonly,help desk ...(!CMS_READ_ONLY_ROLES.some((UR) => - props.user?.["custom:cms-roles"].includes(UR) + props.user?.["custom:cms-roles"].includes(UR), ) ? [ { diff --git a/src/services/ui/src/features/dashboard/Lists/spas/index.tsx b/src/services/ui/src/features/dashboard/Lists/spas/index.tsx index 3c9b450de..8fb1d7866 100644 --- a/src/services/ui/src/features/dashboard/Lists/spas/index.tsx +++ b/src/services/ui/src/features/dashboard/Lists/spas/index.tsx @@ -1,41 +1,11 @@ -import { - OsTable, - OsFiltering, - useOsContext, - useOsUrl, - Pagination, - ErrorAlert, -} from "@/components"; +import { useOsContext, ErrorAlert, OsMainView } from "@/components"; import { useSpaTableColumns } from "./consts"; export const SpasList = () => { const context = useOsContext(); - const url = useOsUrl(); const columns = useSpaTableColumns(); if (context.error) return ; - return ( -
- - - - url.onSet((s) => ({ - ...s, - pagination: { ...s.pagination, number }, - })) - } - onSizeChange={(size) => - url.onSet((s) => ({ - ...s, - pagination: { number: 0, size }, - })) - } - /> -
- ); + return ; }; diff --git a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx index e84027cdf..9206ff73f 100644 --- a/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx +++ b/src/services/ui/src/features/dashboard/Lists/waivers/consts.tsx @@ -8,6 +8,7 @@ import { renderCellDate, renderCellIdLink, } from "../renderCells"; +import { formatSeatoolDate } from "shared-utils"; export const useWaiverTableColumns = (): OsTableColumn[] => { const { data: props } = useGetUser(); @@ -20,17 +21,19 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { field: "id.keyword", label: "Waiver Number", locked: true, + transform: (data) => data.id, cell: renderCellIdLink((id) => `/details?id=${encodeURIComponent(id)}`), }, { field: "state.keyword", label: "State", - visible: true, + transform: (data) => data.state ?? BLANK_VALUE, cell: (data) => data.state, }, { field: "authority.keyword", label: "Authority", + transform: (data) => data.authority ?? BLANK_VALUE, cell: (data) => data?.authority ? removeUnderscoresAndCapitalize(data.authority) @@ -39,6 +42,12 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: "actionType.keyword", label: "Action Type", + transform: (data) => { + if (data.actionType === undefined) return BLANK_VALUE; + return ( + LABELS[data.actionType as keyof typeof LABELS] || data.actionType + ); + }, cell: (data) => data.actionType ? LABELS[data.actionType as keyof typeof LABELS] || data.actionType @@ -47,6 +56,27 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: props?.isCms ? "cmsStatus.keyword" : "stateStatus.keyword", label: "Status", + transform: (data) => { + const status = (() => { + if (!props?.isCms) return data.stateStatus; + if (props?.user?.["custom:cms-roles"].includes(UserRoles.HELPDESK)) { + return data.stateStatus; + } + return data.cmsStatus; + })(); + + const subStatusRAI = data.raiWithdrawEnabled + ? " (Withdraw Formal RAI Response - Enabled)" + : ""; + + const subStatusInitialIntake = (() => { + if (!props?.isCms) return ""; + if (!data.initialIntakeNeeded) return ""; + return " (Initial Intake Needed)"; + })(); + + return `${status}${subStatusRAI}${subStatusInitialIntake}`; + }, cell: (data) => { const status = (() => { if (!props?.isCms) return data.stateStatus; @@ -73,12 +103,16 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: "submissionDate", label: "Initial Submission", + transform: (data) => + data?.submissionDate + ? formatSeatoolDate(data.submissionDate) + : BLANK_VALUE, cell: renderCellDate("submissionDate"), }, { field: "origin", label: "Submission Source", - visible: false, + hidden: true, cell: (data) => { return data.origin; }, @@ -86,23 +120,30 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: "raiRequestedDate", label: "Formal RAI Requested", - visible: false, + hidden: true, cell: renderCellDate("raiRequestedDate"), }, { field: "raiReceivedDate", label: "Formal RAI Received", + transform: (data) => { + return data.raiReceivedDate && !data.raiWithdrawnDate + ? formatSeatoolDate(data.raiReceivedDate) + : BLANK_VALUE; + }, cell: renderCellDate("raiReceivedDate"), }, { field: "leadAnalystName.keyword", label: "CPOC Name", - visible: false, + hidden: true, + transform: (data) => data.leadAnalystName ?? BLANK_VALUE, cell: (data) => data.leadAnalystName, }, { field: "submitterName.keyword", label: "Submitted By", + transform: (data) => data.submitterName ?? BLANK_VALUE, cell: (data) => data.submitterName, }, // hide actions column for: readonly,help desk diff --git a/src/services/ui/src/features/dashboard/Lists/waivers/index.tsx b/src/services/ui/src/features/dashboard/Lists/waivers/index.tsx index 3d9b31ce2..7b1c0f1e7 100644 --- a/src/services/ui/src/features/dashboard/Lists/waivers/index.tsx +++ b/src/services/ui/src/features/dashboard/Lists/waivers/index.tsx @@ -1,41 +1,11 @@ -import { - OsTable, - OsFiltering, - useOsContext, - useOsUrl, - Pagination, - ErrorAlert, -} from "@/components"; +import { useOsContext, ErrorAlert, OsMainView } from "@/components"; import { useWaiverTableColumns } from "./consts"; export const WaiversList = () => { const context = useOsContext(); - const url = useOsUrl(); const columns = useWaiverTableColumns(); if (context.error) return ; - return ( -
- - - - url.onSet((s) => ({ - ...s, - pagination: { ...s.pagination, number }, - })) - } - onSizeChange={(size) => - url.onSet((s) => ({ - ...s, - pagination: { number: 0, size }, - })) - } - /> -
- ); + return ; }; diff --git a/src/services/ui/src/features/submission/app-k/consts.ts b/src/services/ui/src/features/submission/app-k/consts.ts index fb40cadb7..4dda9b5ad 100644 --- a/src/services/ui/src/features/submission/app-k/consts.ts +++ b/src/services/ui/src/features/submission/app-k/consts.ts @@ -4,20 +4,14 @@ import { zAppkWaiverNumberSchema } from "@/utils"; export const OPTIONS_STATE = [ { label: "Alabama", value: "AL" }, { label: "Alaska", value: "AK" }, - { - label: "American Samoa", - value: "AS", - }, + { label: "American Samoa", value: "AS" }, { label: "Arizona", value: "AZ" }, { label: "Arkansas", value: "AR" }, { label: "California", value: "CA" }, { label: "Colorado", value: "CO" }, { label: "Connecticut", value: "CT" }, { label: "Delaware", value: "DE" }, - { - label: "District of Columbia", - value: "DC", - }, + { label: "District of Columbia", value: "DC" }, { label: "Florida", value: "FL" }, { label: "Georgia", value: "GA" }, { label: "Guam", value: "GU" }, @@ -31,10 +25,7 @@ export const OPTIONS_STATE = [ { label: "Louisiana", value: "LA" }, { label: "Maine", value: "ME" }, { label: "Maryland", value: "MD" }, - { - label: "Massachusetts", - value: "MA", - }, + { label: "Massachusetts", value: "MA" }, { label: "Michigan", value: "MI" }, { label: "Minnesota", value: "MN" }, { label: "Mississippi", value: "MS" }, @@ -42,59 +33,29 @@ export const OPTIONS_STATE = [ { label: "Montana", value: "MT" }, { label: "Nebraska", value: "NE" }, { label: "Nevada", value: "NV" }, - { - label: "New Hampshire", - value: "NH", - }, + { label: "New Hampshire", value: "NH" }, { label: "New Jersey", value: "NJ" }, { label: "New Mexico", value: "NM" }, { label: "New York", value: "NY" }, - { - label: "North Carolina", - value: "NC", - }, - { - label: "North Dakota", - value: "ND", - }, - { - label: "Northern Mariana Islands", - value: "MP", - }, + { label: "North Carolina", value: "NC" }, + { label: "North Dakota", value: "ND" }, + { label: "Northern Mariana Islands", value: "MP" }, { label: "Ohio", value: "OH" }, { label: "Oklahoma", value: "OK" }, { label: "Oregon", value: "OR" }, - { - label: "Pennsylvania", - value: "PA", - }, + { label: "Pennsylvania", value: "PA" }, { label: "Puerto Rico", value: "PR" }, - { - label: "Rhode Island", - value: "RI", - }, - { - label: "South Carolina", - value: "SC", - }, - { - label: "South Dakota", - value: "SD", - }, + { label: "Rhode Island", value: "RI" }, + { label: "South Carolina", value: "SC" }, + { label: "South Dakota", value: "SD" }, { label: "Tennessee", value: "TN" }, { label: "Texas", value: "TX" }, { label: "Utah", value: "UT" }, { label: "Vermont", value: "VT" }, - { - label: "Virgin Islands", - value: "VI", - }, + { label: "Virgin Islands", value: "VI" }, { label: "Virginia", value: "VA" }, { label: "Washington", value: "WA" }, - { - label: "West Virginia", - value: "WV", - }, + { label: "West Virginia", value: "WV" }, { label: "Wisconsin", value: "WI" }, { label: "Wyoming", value: "WY" }, ]; @@ -104,8 +65,10 @@ export const FORM = z.object({ parentWaiver: zAppkWaiverNumberSchema, childWaivers: z.array(zAppkWaiverNumberSchema), additionalInformation: z.string().max(4000).optional(), + title: z.string(), attachments: z.object({ appk: zAttachmentRequired({ min: 1 }), + other: zAttachmentRequired({ min: 1 }), }), proposedEffectiveDate: z.date(), seaActionType: z.string().default("Amend"), diff --git a/src/services/ui/src/features/submission/app-k/index.tsx b/src/services/ui/src/features/submission/app-k/index.tsx index 3d9f7a268..f2d8cc8fe 100644 --- a/src/services/ui/src/features/submission/app-k/index.tsx +++ b/src/services/ui/src/features/submission/app-k/index.tsx @@ -6,6 +6,7 @@ import { SectionCard, SimplePageContainer, useLocationCrumbs, + FAQ_TAB, } from "@/components"; import { SlotAttachments } from "@/features/actions"; import * as I from "@/components/Inputs"; @@ -22,6 +23,7 @@ import { useNavigate } from "@/components/Routing"; import { useEffect, useState } from "react"; import * as Content from "@/components"; import { zAppkWaiverNumberSchema } from "@/utils"; +import { Link } from "react-router-dom"; export const AppKSubmissionForm = () => { const nav = useNavigate(); @@ -79,23 +81,47 @@ export const AppKSubmissionForm = () => {
- + + ( + + + Amendment Title + + + + )} + />
Waiver Authority 1915(c)
+ - {state && (
- Appendix K ID +
+ + Appendix K ID + + + What is my Appendix K ID? + +
{ className: "my-4", })} /> + + Other + ), + message: , + className: "my-4", + })} + /> From 303b11d4499c7fa5d12bb02e86136896226257a9 Mon Sep 17 00:00:00 2001 From: Mike Dial <48921055+mdial89f@users.noreply.github.com> Date: Fri, 15 Mar 2024 14:46:19 -0400 Subject: [PATCH 06/12] fix(main date columns): Assert type of date columns (#450) * f * m --- src/libs/opensearch-lib.ts | 99 ++++++++++++++----- .../opensearch/main/transforms/changedDate.ts | 7 ++ .../main/transforms/new-submission.ts | 13 ++- src/services/data/handlers/setupIndex.ts | 29 +++--- src/services/data/handlers/sinkMain.ts | 33 ++++--- src/services/data/handlers/sinkSubtypes.ts | 4 +- src/services/data/handlers/sinkTypes.ts | 2 +- 7 files changed, 134 insertions(+), 53 deletions(-) diff --git a/src/libs/opensearch-lib.ts b/src/libs/opensearch-lib.ts index dbed165cd..785eb5802 100644 --- a/src/libs/opensearch-lib.ts +++ b/src/libs/opensearch-lib.ts @@ -37,31 +37,84 @@ export async function updateData(host: string, indexObject: any) { var response = await client.update(indexObject); } +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +interface Document { + id: string; + [key: string]: any; +} + export async function bulkUpdateData( host: string, - index: opensearch.Index, - arrayOfDocuments: any -) { - // Skip if no documents have been supplied + index: string, + arrayOfDocuments: Document[], +): Promise { if (arrayOfDocuments.length === 0) { console.log("No documents to update. Skipping bulk update operation."); return; } + client = client || (await getClient(host)); - var response = await client.helpers.bulk({ - datasource: arrayOfDocuments, - onDocument(doc: any) { - // The update operation always requires a tuple to be returned, with the - // first element being the action and the second being the update options. - return [ - { - update: { _index: index, _id: doc.id }, - }, - { doc_as_upsert: true }, - ]; + + const lastEntries = arrayOfDocuments.reduce( + (acc: { [id: string]: Document }, doc: Document) => { + acc[doc.id] = doc; // This will overwrite any previous entry with the same ID + return acc; }, - }); - console.log(response); + {}, + ); + const filteredDocuments = Object.values(lastEntries); + + const body: any[] = filteredDocuments.flatMap((doc) => [ + { update: { _index: index, _id: doc.id } }, // Action and metadata + { doc: doc, doc_as_upsert: true }, // Document to update or upsert + ]); + + async function attemptBulkUpdate( + retries: number = 5, + delay: number = 1000, + ): Promise { + try { + const response = await client.bulk({ refresh: true, body: body }); + if (response.body.errors) { + // Check for 429 status within response errors + const hasRateLimitErrors = response.body.items.some( + (item: any) => item.update.status === 429, + ); + + if (hasRateLimitErrors && retries > 0) { + console.log(`Rate limit exceeded, retrying in ${delay}ms...`); + await sleep(delay); + return attemptBulkUpdate(retries - 1, delay * 2); // Exponential backoff + } else if (!hasRateLimitErrors) { + // Handle or throw other errors normally + console.error( + "Bulk update errors:", + JSON.stringify(response.body.items, null, 2), + ); + throw "ERROR: Bulk update had an error that was not rate related."; + } + } else { + console.log("Bulk update successful."); + } + } catch (error: any) { + if (error.statusCode === 429 && retries > 0) { + console.log( + `Rate limit exceeded, retrying in ${delay}ms...`, + error.message, + ); + await sleep(delay); + return attemptBulkUpdate(retries - 1, delay * 2); // Exponential backoff + } else { + console.error("An error occurred:", error); + throw error; + } + } + } + + await attemptBulkUpdate(); } export async function deleteIndex(host: string, index: opensearch.Index) { @@ -84,7 +137,7 @@ export async function mapRole( host: string, masterRoleToAssume: string, osRoleName: string, - iamRoleName: string + iamRoleName: string, ) { try { const sts = new STSClient({ @@ -95,7 +148,7 @@ export async function mapRole( RoleArn: masterRoleToAssume, RoleSessionName: "RoleMappingSession", ExternalId: "foo", - }) + }), ); const interceptor = aws4Interceptor({ options: { @@ -117,7 +170,7 @@ export async function mapRole( path: "/and_backend_roles", value: [iamRoleName], }, - ] + ], ); return patchResponse.data; } catch (error) { @@ -129,7 +182,7 @@ export async function mapRole( export async function search( host: string, index: opensearch.Index, - query: any + query: any, ) { client = client || (await getClient(host)); try { @@ -146,7 +199,7 @@ export async function search( export async function getItem( host: string, index: opensearch.Index, - id: string + id: string, ) { client = client || (await getClient(host)); try { @@ -174,7 +227,7 @@ export async function createIndex(host: string, index: opensearch.Index) { export async function updateFieldMapping( host: string, index: opensearch.Index, - properties: object + properties: object, ) { client = client || (await getClient(host)); try { diff --git a/src/packages/shared-types/opensearch/main/transforms/changedDate.ts b/src/packages/shared-types/opensearch/main/transforms/changedDate.ts index 4acbadab3..f0aec6a2e 100644 --- a/src/packages/shared-types/opensearch/main/transforms/changedDate.ts +++ b/src/packages/shared-types/opensearch/main/transforms/changedDate.ts @@ -14,3 +14,10 @@ export const transform = () => { }; export type Schema = ReturnType; + +export const tombstone = (id: string) => { + return { + id, + changedDate: null, + }; +}; diff --git a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts index 4956d6aa7..5bb921ad6 100644 --- a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts +++ b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts @@ -7,7 +7,7 @@ import { const getIdByAuthorityName = (authorityName: string) => { try { const authorityId = Object.keys(SEATOOL_AUTHORITIES).find( - (key) => SEATOOL_AUTHORITIES[key] === authorityName + (key) => SEATOOL_AUTHORITIES[key] === authorityName, ); return authorityId ? parseInt(authorityId, 10) : null; } catch (error) { @@ -17,6 +17,11 @@ const getIdByAuthorityName = (authorityName: string) => { } }; +const getDateStringOrNullFromEpoc = (epocDate: number | null | undefined) => + epocDate !== null && epocDate !== undefined + ? new Date(epocDate).toISOString() + : null; + export const transform = (id: string) => { return onemacSchema.transform((data) => { if (data.seaActionType === "Extend") { @@ -42,9 +47,9 @@ export const transform = (id: string) => { stateStatus: "Submitted", cmsStatus: "Requested", seatoolStatus: SEATOOL_STATUS.PENDING, - statusDate: data.statusDate, - submissionDate: data.submissionDate, - changedDate: data.changedDate, + statusDate: getDateStringOrNullFromEpoc(data.statusDate), + submissionDate: getDateStringOrNullFromEpoc(data.submissionDate), + changedDate: getDateStringOrNullFromEpoc(data.changedDate), // type, subtype, subject, description will soon be collected and available in data; this will need updating then. subject: null, description: null, diff --git a/src/services/data/handlers/setupIndex.ts b/src/services/data/handlers/setupIndex.ts index e6ddcd27e..08afcf10e 100644 --- a/src/services/data/handlers/setupIndex.ts +++ b/src/services/data/handlers/setupIndex.ts @@ -8,16 +8,21 @@ export const handler: Handler = async (_, __, callback) => { }; let errorResponse = null; try { - const indices = [ - "main", - "changelog", - "insights", - "types", - "subtypes", - ] as const; - for (const index of indices) { - await manageIndexResource({ index: index }); - } + await manageIndexResource({ + index: "main", + update: { + approvedEffectiveDate: { type: "date" }, + changedDate: { type: "date" }, + finalDispositionDate: { type: "date" }, + proposedDate: { type: "date" }, + statusDate: { type: "date" }, + submissionDate: { type: "date" }, + }, + }); + await manageIndexResource({ index: "changelog" }); + await manageIndexResource({ index: "insights" }); + await manageIndexResource({ index: "types" }); + await manageIndexResource({ index: "subtypes" }); } catch (error: any) { response.statusCode = 500; errorResponse = error; @@ -36,7 +41,7 @@ const manageIndexResource = async (resource: { const createIndex = await os.createIndex( process.env.osDomain, - resource.index + resource.index, ); console.log(createIndex); @@ -45,7 +50,7 @@ const manageIndexResource = async (resource: { const updateFieldMapping = await os.updateFieldMapping( process.env.osDomain, resource.index, - resource.update + resource.update, ); console.log(updateFieldMapping); }; diff --git a/src/services/data/handlers/sinkMain.ts b/src/services/data/handlers/sinkMain.ts index 0a9c1f9be..5003cbdd0 100644 --- a/src/services/data/handlers/sinkMain.ts +++ b/src/services/data/handlers/sinkMain.ts @@ -22,20 +22,20 @@ export const handler: Handler = async (event) => { throw new Error(); case "aws.onemac.migration.cdc": docs.push( - ...(await onemac(event.records[topicPartition], topicPartition)) + ...(await onemac(event.records[topicPartition], topicPartition)), ); break; case "aws.seatool.ksql.onemac.agg.State_Plan": docs.push( - ...(await ksql(event.records[topicPartition], topicPartition)) + ...(await ksql(event.records[topicPartition], topicPartition)), ); break; case "aws.seatool.debezium.changed_date.SEA.dbo.State_Plan": docs.push( ...(await changed_date( event.records[topicPartition], - topicPartition - )) + topicPartition, + )), ); break; } @@ -140,7 +140,7 @@ const onemac = async (kafkaRecords: KafkaRecord[], topicPartition: string) => { const result = (() => { switch (record?.actionType) { case "new-submission": - case undefined: + case undefined: return opensearch.main.newSubmission .transform(id) .safeParse(record); @@ -163,7 +163,7 @@ const onemac = async (kafkaRecords: KafkaRecord[], topicPartition: string) => { })(); if (result === undefined) { console.log( - `no action to take for ${id} action ${record.actionType}. Continuing...` + `no action to take for ${id} action ${record.actionType}. Continuing...`, ); continue; } @@ -189,17 +189,27 @@ const onemac = async (kafkaRecords: KafkaRecord[], topicPartition: string) => { const changed_date = async ( kafkaRecords: KafkaRecord[], - topicPartition: string + topicPartition: string, ) => { const docs: any[] = []; for (const kafkaRecord of kafkaRecords) { - const { value } = kafkaRecord; + const { key, value } = kafkaRecord; try { - const decodedValue = Buffer.from(value, "base64").toString("utf-8"); - const record = JSON.parse(decodedValue).payload.after; - if (!record) { + // Set id + const id: string = JSON.parse(decode(key)).payload.ID_Number; + + // Handle delete events and continue + if (value === undefined) { continue; } + + // Parse record + const decodedValue = Buffer.from(value, "base64").toString("utf-8"); + const record = JSON.parse(decodedValue).payload.after; + + // Handle tombstone events and continue + if (!record) continue; + const result = opensearch.main.changedDate.transform().safeParse(record); if (!result.success) { logError({ @@ -218,5 +228,6 @@ const changed_date = async ( }); } } + console.log(JSON.stringify(docs, null, 2)); return docs; }; diff --git a/src/services/data/handlers/sinkSubtypes.ts b/src/services/data/handlers/sinkSubtypes.ts index b57c4d34a..7b00cfa3d 100644 --- a/src/services/data/handlers/sinkSubtypes.ts +++ b/src/services/data/handlers/sinkSubtypes.ts @@ -21,7 +21,7 @@ export const handler: Handler = async (event) => { throw new Error(); case "aws.seatool.debezium.cdc.SEA.dbo.Type": docs.push( - ...(await subtypes(event.records[topicPartition], topicPartition)) + ...(await subtypes(event.records[topicPartition], topicPartition)), ); break; } @@ -40,7 +40,7 @@ export const handler: Handler = async (event) => { const subtypes = async ( kafkaRecords: KafkaRecord[], - topicPartition: string + topicPartition: string, ) => { const docs: any[] = []; for (const kafkaRecord of kafkaRecords) { diff --git a/src/services/data/handlers/sinkTypes.ts b/src/services/data/handlers/sinkTypes.ts index f2018e935..48c6122b5 100644 --- a/src/services/data/handlers/sinkTypes.ts +++ b/src/services/data/handlers/sinkTypes.ts @@ -21,7 +21,7 @@ export const handler: Handler = async (event) => { throw new Error(); case "aws.seatool.debezium.cdc.SEA.dbo.SPA_Type": docs.push( - ...(await types(event.records[topicPartition], topicPartition)) + ...(await types(event.records[topicPartition], topicPartition)), ); break; } From bd40de0846af11f81e3226b5e66bba9398850cb3 Mon Sep 17 00:00:00 2001 From: Mike Dial <48921055+mdial89f@users.noreply.github.com> Date: Fri, 15 Mar 2024 20:43:05 -0400 Subject: [PATCH 07/12] fix(te ui): Update screens per jira. (#451) * remove fields * fix --- .../main/transforms/new-submission.ts | 1 + .../ui/src/features/package/index.tsx | 19 ++++++++++- .../package/package-details/hooks.tsx | 34 +++++++++++++++---- .../package/package-details/index.tsx | 10 +++--- yarn.lock | 25 ++++++++++++++ 5 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts index 5bb921ad6..6516ca91e 100644 --- a/src/packages/shared-types/opensearch/main/transforms/new-submission.ts +++ b/src/packages/shared-types/opensearch/main/transforms/new-submission.ts @@ -36,6 +36,7 @@ export const transform = (id: string) => { submitterName: data.submitterName === "-- --" ? null : data.submitterName, origin: "OneMAC", + originalWaiverNumber: data.originalWaiverNumber, // ---------- // The fields below are usually set by way of seatool and the ksql output, but must be set here for TEs. flavor: "WAIVER", diff --git a/src/services/ui/src/features/package/index.tsx b/src/services/ui/src/features/package/index.tsx index 22d91fd75..bdd6e0f9c 100644 --- a/src/services/ui/src/features/package/index.tsx +++ b/src/services/ui/src/features/package/index.tsx @@ -13,6 +13,7 @@ import { detailsAndActionsCrumbs } from "../actions"; import { PackageStatusCard } from "./package-status"; import { PackageActionsCard } from "./package-actions"; import { useDetailsSidebarLinks } from "./hooks"; +import { Authority } from "shared-types"; export const DetailCardWrapper = ({ title, @@ -34,6 +35,22 @@ export const DetailsContent: FC<{ id: string }> = ({ id }) => { if (isLoading) return ; if (!data?._source) return ; if (error) return ; + const title = + (() => { + switch (data._source.authority) { + case Authority["1915b"]: + case Authority["1915c"]: + switch (data._source.actionType) { + case "Extend": + return "Temporary Extension Request Details"; + default: + return undefined; + } + default: + return undefined; + } + })() || `${data._source.authority} Package Details`; + return (
= ({ id }) => {
- +
diff --git a/src/services/ui/src/features/package/package-details/hooks.tsx b/src/services/ui/src/features/package/package-details/hooks.tsx index 8e4e6a19c..661f5cd23 100644 --- a/src/services/ui/src/features/package/package-details/hooks.tsx +++ b/src/services/ui/src/features/package/package-details/hooks.tsx @@ -58,21 +58,28 @@ export const recordDetails = ( { label: "Subject", value:

{data?.subject || BLANK_VALUE}

, - canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), + canView: (u) => + !u || !u.user + ? false + : isCmsUser(u.user) && !(data.actionType === "Extend"), }, { label: "Type", value: data.types ? data.types.map((T) =>

{T?.SPA_TYPE_NAME}

) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Subtype", value: data.subTypes ? data.subTypes.map((T) =>

{T?.TYPE_NAME}

) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Initial submission date", @@ -81,6 +88,13 @@ export const recordDetails = ( : BLANK_VALUE, canView: () => true, }, + { + label: "Approved Initial or Renewal Number", + value: data.originalWaiverNumber, + canView: () => { + return data.actionType === "Extend"; + }, + }, { label: "Proposed effective date", value: data.proposedDate @@ -123,7 +137,9 @@ export const approvedAndAEffectiveDetails = ( value: data.approvedEffectiveDate ? formatSeatoolDate(data.approvedEffectiveDate) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, ]; @@ -133,7 +149,10 @@ export const descriptionDetails = ( { label: "Description", value: data.description ?? BLANK_VALUE, - canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), + canView: (u) => + !u || !u.user + ? false + : isCmsUser(u.user) && !(data.actionType === "Extend"), }, ]; @@ -160,6 +179,9 @@ export const submissionDetails = ( { label: "Review Team (SRT)", value: , - canView: (u) => (!u || !u.user ? false : isCmsUser(u.user)), + canView: (u) => + !u || !u.user + ? false + : isCmsUser(u.user) && !(data.actionType === "Extend"), }, ]; diff --git a/src/services/ui/src/features/package/package-details/index.tsx b/src/services/ui/src/features/package/package-details/index.tsx index 7187581c5..0b9804c06 100644 --- a/src/services/ui/src/features/package/package-details/index.tsx +++ b/src/services/ui/src/features/package/package-details/index.tsx @@ -41,13 +41,13 @@ export const DetailItemsGrid: FC<{ ); }; -export const PackageDetails = () => { +export const PackageDetails: FC<{ + title: string; +}> = (props) => { const { data } = usePackageDetailsCache(); + // const title = props.title || `${data.authority} Package Details`; return ( - +
Date: Mon, 18 Mar 2024 09:49:27 -0400 Subject: [PATCH 08/12] bug(error messages): Fix error messaging for incorrect initial ID on waiver amendments and renewals (#447) --- src/services/ui/src/utils/zod.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/services/ui/src/utils/zod.ts b/src/services/ui/src/utils/zod.ts index 894787335..616116454 100644 --- a/src/services/ui/src/utils/zod.ts +++ b/src/services/ui/src/utils/zod.ts @@ -6,7 +6,7 @@ export const zSpaIdSchema = z .string() .regex( /^[A-Z]{2}-\d{2}-\d{4}(-[A-Z0-9]{1,4})?$/, - "ID doesn't match format SS-YY-NNNN or SS-YY-NNNN-XXXX" + "ID doesn't match format SS-YY-NNNN or SS-YY-NNNN-XXXX", ) .refine((value) => isAuthorizedState(value), { message: @@ -42,7 +42,7 @@ export const zInitialWaiverNumberSchema = z .string() .regex( /^[A-Z]{2}-\d{4,5}\.R00\.00$/, - "The Initial Waiver Number must be in the format of SS-####.R00.00 or SS-#####.R00.00" + "The Initial Waiver Number must be in the format of SS-####.R00.00 or SS-#####.R00.00", ) .refine((value) => isAuthorizedState(value), { message: @@ -57,7 +57,7 @@ export const zRenewalWaiverNumberSchema = z .string() .regex( /^[A-Z]{2}-\d{4,5}\.R(?!00)\d{2}\.\d{2}$/, - "Renewal Number must be in the format of SS-####.R##.00 or SS-#####.R##.00 For renewals, the “R##” starts with '01' and ascends." + "Renewal Number must be in the format of SS-####.R##.00 or SS-#####.R##.00 For renewals, the “R##” starts with '01' and ascends.", ) .refine((value) => isAuthorizedState(value), { message: @@ -72,7 +72,7 @@ export const zAmendmentWaiverNumberSchema = z .string() .regex( /^[A-Z]{2}-\d{4,5}\.R\d{2}\.(?!00)\d{2}$/, - "The 1915(b) Waiver Amendment Number must be in the format of SS-####.R##.## or SS-#####.R##.##. For amendments, the last two digits start with '01' and ascends." + "The 1915(b) Waiver Amendment Number must be in the format of SS-####.R##.## or SS-#####.R##.##. For amendments, the last two digits start with '01' and ascends.", ) .refine((value) => isAuthorizedState(value), { message: @@ -87,7 +87,7 @@ export const zAmendmentOriginalWaiverNumberSchema = z .string() .regex( /^[A-Z]{2}-\d{4,5}\.R\d{2}\.\d{2}$/, - "The 1915(b) Waiver Amendment Number must be in the format of SS-####.R##.## or SS-#####.R##.##. For amendments, the last two digits start with '01' and ascends." + "The approved 1915(b) Initial or Renewal Number must be in the format of SS-####.R##.## or SS-#####.R##.##.", ) .refine((value) => isAuthorizedState(value), { message: @@ -96,17 +96,17 @@ export const zAmendmentOriginalWaiverNumberSchema = z // This should already exist. .refine(async (value) => await itemExists(value), { message: - "According to our records, this 1915(b) Waiver Number does not yet exist. Please check the 1915(b) Waiver Amendment Number and try entering it again.", + "According to our records, this 1915(b) Waiver Number does not yet exist. Please check the 1915(b) Initial or Renewal Waiver Number and try entering it again.", }) .refine(async (value) => idIsApproved(value), { message: - "According to our records, this 1915(b) Waiver Number is not approved. You must supply an approved 1915(b) Waiver Amendment Number.", + "According to our records, this 1915(b) Waiver Number is not approved. You must supply an approved 1915(b) Initial or Renewal Waiver Number.", }); export const zRenewalOriginalWaiverNumberSchema = z .string() .regex( /^[A-Z]{2}-\d{4,5}\.R\d{2}\.\d{2}$/, - "The 1915(b) Waiver Renewal Number must be in the format of SS-####.R##.## or SS-#####.R##.##." + "The approved 1915(b) Initial or Renewal Waiver Number must be in the format of SS-####.R##.## or SS-#####.R##.##.", ) .refine((value) => isAuthorizedState(value), { message: @@ -115,18 +115,18 @@ export const zRenewalOriginalWaiverNumberSchema = z // This should already exist .refine(async (value) => await itemExists(value), { message: - "According to our records, this 1915(b) Waiver Number does not yet exist. Please check the 1915(b) Waiver Amendment Number and try entering it again.", + "According to our records, this 1915(b) Waiver Number does not yet exist. Please check the 1915(b) Initial or Renewal Waiver Number and try entering it again.", }) .refine(async (value) => idIsApproved(value), { message: - "According to our records, this 1915(b) Waiver Number is not approved. You must supply an approved 1915(b) Waiver Amendment Number.", + "According to our records, this 1915(b) Waiver Number is not approved. You must supply an approved 1915(b) Initial or Renewal Waiver Number.", }); export const zAppkWaiverNumberSchema = z .string() .regex( /^\d{4,5}\.R\d{2}\.\d{2}$/, - "The 1915(c) Waiver Amendment Number must be in the format of ####.R##.## or #####.R##.##. For amendments, the last two digits start with '01' and ascends." + "The 1915(c) Waiver Amendment Number must be in the format of ####.R##.## or #####.R##.##. For amendments, the last two digits start with '01' and ascends.", ) .default(""); From 9988959378d910b7f70182d6758103b18921537d Mon Sep 17 00:00:00 2001 From: Paul Kim <141361476+pkim-gswell@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:01:06 -0600 Subject: [PATCH 09/12] feat(os): add final disposition date + csv transform headers (#453) * fix(OY3): final disposition date * fix(OY3): add export columns transform * fix(OY3): Final disposition Waiver Terminated status --------- Co-authored-by: Mike Dial --- src/packages/shared-types/statusHelper.ts | 2 ++ .../main/Filtering/Drawer/consts.ts | 11 ++++++- .../Opensearch/main/Filtering/Drawer/hooks.ts | 8 +++-- .../main/Filtering/Export/index.tsx | 30 +++++++++++++++---- .../Opensearch/main/useOpensearch.ts | 4 +-- .../features/dashboard/Lists/spas/consts.tsx | 20 ++++++++++--- .../dashboard/Lists/waivers/consts.tsx | 6 ++++ 7 files changed, 65 insertions(+), 16 deletions(-) diff --git a/src/packages/shared-types/statusHelper.ts b/src/packages/shared-types/statusHelper.ts index 069656526..8714c3138 100644 --- a/src/packages/shared-types/statusHelper.ts +++ b/src/packages/shared-types/statusHelper.ts @@ -42,6 +42,8 @@ export const finalDispositionStatuses = [ SEATOOL_STATUS.APPROVED, SEATOOL_STATUS.DISAPPROVED, SEATOOL_STATUS.WITHDRAWN, + SEATOOL_STATUS.TERMINATED, + SEATOOL_STATUS.UNSUBMITTED, ]; export const getStatus = (seatoolStatus?: string | null) => { diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts index 9158dedf2..c1829b82d 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/consts.ts @@ -78,7 +78,7 @@ export const CHECK_ACTIONTYPE: DrawerFilterableGroup = { value: [], }; -export const DATE_SUBMISSION: DrawerFilterableGroup = { +export const DATE_INITIALSUBMISSION: DrawerFilterableGroup = { label: "Initial Submission", field: "submissionDate", component: "dateRange", @@ -87,6 +87,15 @@ export const DATE_SUBMISSION: DrawerFilterableGroup = { value: { gte: undefined, lte: undefined }, }; +export const DATE_FINALDISPOSITION: DrawerFilterableGroup = { + label: "Final Disposition", + field: "finalDispositionDate", + component: "dateRange", + prefix: "must", + type: "range", + value: { gte: undefined, lte: undefined }, +}; + export const DATE_RAIRECEIVED: DrawerFilterableGroup = { label: "Formal RAI Received", field: "raiReceivedDate", diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts index ca33f2e38..899eec237 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Drawer/hooks.ts @@ -33,7 +33,8 @@ export const useFilterState = () => { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, - [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, + [C.DATE_INITIALSUBMISSION.field]: C.DATE_INITIALSUBMISSION, + [C.DATE_FINALDISPOSITION.field]: C.DATE_FINALDISPOSITION, [C.DATE_RAIRECEIVED.field]: C.DATE_RAIRECEIVED, [C.SELECT_CPOC.field]: C.SELECT_CPOC, [C.SELECT_ORIGIN.field]: C.SELECT_ORIGIN, @@ -54,7 +55,8 @@ export const useFilterState = () => { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, - [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, + [C.DATE_INITIALSUBMISSION.field]: C.DATE_INITIALSUBMISSION, + [C.DATE_FINALDISPOSITION.field]: C.DATE_FINALDISPOSITION, [C.DATE_RAIRECEIVED.field]: C.DATE_RAIRECEIVED, [C.SELECT_CPOC.field]: C.SELECT_CPOC, [C.SELECT_ORIGIN.field]: C.SELECT_ORIGIN, @@ -159,7 +161,7 @@ export const useFilterDrawer = () => { })), }; }, - {} as Record + {} as Record, ); }, [_aggs]); diff --git a/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx b/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx index e0e2f8fbe..68d2f8cc9 100644 --- a/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx +++ b/src/services/ui/src/components/Opensearch/main/Filtering/Export/index.tsx @@ -20,7 +20,7 @@ export const OsExportData: FC<{ const exportData: Record[] = []; const resolvedData = await getMainExportData( - url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []) + url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []), ); for (const item of resolvedData) { @@ -39,21 +39,39 @@ export const OsExportData: FC<{ return exportData; }; - const handleExport = (data: Record) => { + const handleExport = async () => { + setLoading(true); + + const exportData: Record[] = []; + const resolvedData = await getMainExportData( + url.state.filters.concat(DEFAULT_FILTERS[url.state.tab]?.filters ?? []), + ); + + for (const item of resolvedData) { + const column: Record = {}; + + for (const header of columns) { + if (!header.transform) continue; + if (header.hidden) continue; + column[header.label] = header.transform(item); + } + exportData.push(column); + } + const csvExporter = new ExportToCsv({ useKeysAsHeaders: true, filename: `${url.state.tab}-export-${format(new Date(), "MM/dd/yyyy")}`, }); - csvExporter.generateCsv(data); + csvExporter.generateCsv(exportData); + + setLoading(false); }; return (