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/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/libs/opensearch-lib.ts b/src/libs/opensearch-lib.ts index dbed165cd..b73c235c2 100644 --- a/src/libs/opensearch-lib.ts +++ b/src/libs/opensearch-lib.ts @@ -37,31 +37,75 @@ 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 }, - ]; - }, - }); - console.log(response); + + const body: any[] = arrayOfDocuments.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 +128,7 @@ export async function mapRole( host: string, masterRoleToAssume: string, osRoleName: string, - iamRoleName: string + iamRoleName: string, ) { try { const sts = new STSClient({ @@ -95,7 +139,7 @@ export async function mapRole( RoleArn: masterRoleToAssume, RoleSessionName: "RoleMappingSession", ExternalId: "foo", - }) + }), ); const interceptor = aws4Interceptor({ options: { @@ -117,7 +161,7 @@ export async function mapRole( path: "/and_backend_roles", value: [iamRoleName], }, - ] + ], ); return patchResponse.data; } catch (error) { @@ -129,7 +173,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 +190,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 +218,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/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/action-types/new-submission.ts b/src/packages/shared-types/action-types/new-submission.ts index ab6ba19dd..1be83d315 100644 --- a/src/packages/shared-types/action-types/new-submission.ts +++ b/src/packages/shared-types/action-types/new-submission.ts @@ -7,11 +7,22 @@ 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), + 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(), + 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..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,8 @@ 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; export type AttachmentTitle = (typeof attachmentTitleMap)[AttachmentKey]; @@ -64,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/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/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/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 06fed5850..6516ca91e 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,78 @@ -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; + } +}; + +const getDateStringOrNullFromEpoc = (epocDate: number | null | undefined) => + epocDate !== null && epocDate !== undefined + ? new Date(epocDate).toISOString() + : 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", + 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", + 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: 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, + 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-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-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/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/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/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/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/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 85448f186..e6f17d406 100644 --- a/src/services/api/handlers/submit.ts +++ b/src/services/api/handlers/submit.ts @@ -1,66 +1,200 @@ 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, + SEATOOL_AUTHORITIES, + 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"; + +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"], + 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}`, + }, + }); + } + + const authDetails = getAuthDetails(event); + const userAttr = await lookupUserAttributes( + authDetails.userId, + authDetails.poolId, + ); - const activeSubmissionTypes = [ - Authority.CHIP_SPA, - Authority.MED_SPA, - Authority["1915b"], - ]; - if (!activeSubmissionTypes.includes(body.authority)) { + // 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: 400, + statusCode: 401, body: { - message: `OneMAC (micro) Submissions API does not support the following authority: ${body.authority}`, + message: `You are not authorized to perform ${actionType} on ${id}`, }, }); } - const today = seaToolFriendlyTimestamp(); - const submissionDate = getNextBusinessDayTimestamp(); + // 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( - "Initial Submission Date determined to be: " + - new Date(submissionDate).toISOString() + "Safe parsed event body" + JSON.stringify(eventBody.data, null, 2), ); - 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", + + 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" }, }); - 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;"; + + // perhaps someday... but for now... it is but a memory. + + // // 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; @@ -73,18 +207,18 @@ export const submit = async (event: APIGatewayEvent) => { DECLARE @StatusMemo NVARCHAR(MAX) = ${buildStatusMemoQuery( body.id, "Package Submitted", - "insert" + "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(${ @@ -92,73 +226,63 @@ 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); - - // 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 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)); - // `; - - const result = await sql.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}'; - + 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); `; - const actionTypeQueryResult = await sql.query(actionTypeQuery); - console.log(actionTypeQueryResult); - } - await pool.close(); + // -- Insert all types into State_Plan_Service_Types + // ${typeIdsInsert} - 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 - ); - } + // -- Insert all types into State_Plan_Service_SubTypes + // ${subTypeIdsInsert} + + // data for emails + body.notificationMetadata = { + submissionDate, + proposedEffectiveDate: body.proposedEffectiveDate, + }; + + const result = await transaction.request().query(query); + console.log(result); - 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) + 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 61a604715..9be5425d2 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 @@ -68,7 +71,8 @@ params: master: formsProvisionedConcurrency: 2 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 4 itemProvisionedConcurrency: 2 getAttachmentUrlProvisionedConcurrency: 2 @@ -77,7 +81,8 @@ params: val: formsProvisionedConcurrency: 2 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 4 itemProvisionedConcurrency: 2 getAttachmentUrlProvisionedConcurrency: 2 @@ -86,7 +91,8 @@ params: production: formsProvisionedConcurrency: 5 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 2 + getSubTypesProvisionedConcurrency: 2 searchProvisionedConcurrency: 10 itemProvisionedConcurrency: 5 getAttachmentUrlProvisionedConcurrency: 5 @@ -95,7 +101,8 @@ params: default: formsProvisionedConcurrency: 0 getAllFormsProvisionedConcurrency: 1 - getSeaTypesProvisionedConcurrency: 2 + getTypesProvisionedConcurrency: 1 + getSubTypesProvisionedConcurrency: 1 searchProvisionedConcurrency: 0 itemProvisionedConcurrency: 0 getAttachmentUrlProvisionedConcurrency: 0 @@ -188,15 +195,33 @@ 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: /getTypes + method: post + cors: true + authorizer: aws_iam + vpc: + securityGroupIds: + - Ref: SecurityGroup + subnetIds: >- + ${self:custom.vpc.privateSubnets} + provisionedConcurrency: ${param:getTypesProvisionedConcurrency} + getSubTypes: + handler: handlers/getSubTypes.handler maximumRetryAttempts: 0 environment: region: ${self:provider.region} osDomain: ${param:osDomain} events: - http: - path: /getSeaTypes + path: /getSubTypes method: post cors: true authorizer: aws_iam @@ -205,7 +230,7 @@ functions: - Ref: SecurityGroup subnetIds: >- ${self:custom.vpc.privateSubnets} - provisionedConcurrency: ${param:getSeaTypesProvisionedConcurrency} + provisionedConcurrency: ${param:getSubTypesProvisionedConcurrency} itemExists: handler: handlers/itemExists.handler maximumRetryAttempts: 0 @@ -235,6 +260,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/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/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/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 5460bbbf3..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; } @@ -139,6 +139,7 @@ const onemac = async (kafkaRecords: KafkaRecord[], topicPartition: string) => { // Handle everything else const result = (() => { switch (record?.actionType) { + case "new-submission": case undefined: return opensearch.main.newSubmission .transform(id) @@ -162,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; } @@ -188,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({ @@ -217,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; } 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 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/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/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/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 7ffc7b27d..8406912c0 100644 --- a/src/services/ui/src/components/Form/content.tsx +++ b/src/services/ui/src/components/Form/content.tsx @@ -6,24 +6,35 @@ 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 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 = () => ( <> -

+

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 +48,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 +83,7 @@ export const AttachmentsSizeTypesDesc = ({ } .

- +
); export const PreSubmissionMessage = () => ( 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/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..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 @@ -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", @@ -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", @@ -69,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", @@ -78,8 +87,17 @@ 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 Response", + label: "Formal RAI Received", field: "raiReceivedDate", component: "dateRange", prefix: "must", 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..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 @@ -32,7 +32,9 @@ export const useFilterState = () => { ...(!!user?.isCms && { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), - [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, + [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, + [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, @@ -52,7 +54,9 @@ export const useFilterState = () => { ...(!!user?.isCms && { [C.BOOL_INITIALINTAKENEEDED.field]: C.BOOL_INITIALINTAKENEEDED, }), - [C.DATE_SUBMISSION.field]: C.DATE_SUBMISSION, + [C.BOOL_RAIWITHDRAWENABLED.field]: C.BOOL_RAIWITHDRAWENABLED, + [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, @@ -147,15 +151,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 995cb9c90..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: "Type", - 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 Response", - 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..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 @@ -1,10 +1,90 @@ -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); + } + + setLoading(false); + + return exportData; + }; + + const handleExport = async () => { + setLoading(true); -export * from "./hooks"; + 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(exportData); + + setLoading(false); + }; + + 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/Opensearch/main/useOpensearch.ts b/src/services/ui/src/components/Opensearch/main/useOpensearch.ts index 5b98b6fa7..5e2a62899 100644 --- a/src/services/ui/src/components/Opensearch/main/useOpensearch.ts +++ b/src/services/ui/src/components/Opensearch/main/useOpensearch.ts @@ -62,7 +62,7 @@ export const useOsData = () => { ...(DEFAULT_FILTERS[params.state.tab].filters || []), ], }, - { ...options, onSuccess: (res) => setData(res.hits) } + { ...options, onSuccess: (res) => setData(res.hits) }, ); } catch (error) { console.error("Error occurred during search:", error); @@ -144,7 +144,7 @@ export const useOsUrl = () => { search: "", tab: "spas", pagination: { number: 0, size: 25 }, - sort: { field: "changedDate", order: "desc" }, + sort: { field: "submissionDate", order: "desc" }, }, }); }; 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"; 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/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/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/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: "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: "Type", + label: "Authority", + transform: (data) => data.authority ?? BLANK_VALUE, cell: (data) => data?.authority ? removeUnderscoresAndCapitalize(data.authority) @@ -40,6 +42,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,25 +89,48 @@ export const useSpaTableColumns = (): OsTableColumn[] => { { field: "submissionDate", label: "Initial Submission", + transform: (data) => + data?.submissionDate + ? formatSeatoolDate(data.submissionDate) + : BLANK_VALUE, cell: renderCellDate("submissionDate"), }, + { + field: "finalDispositionDate", + label: "Final Disposition", + hidden: true, + transform: (data) => + data?.finalDispositionDate + ? formatSeatoolDate(data.finalDispositionDate) + : BLANK_VALUE, + cell: renderCellDate("finalDispositionDate"), + }, { field: "origin", label: "Submission Source", - visible: false, - cell: (data) => { - return data.origin; - }, + hidden: true, + transform: (data) => data.origin, + cell: (data) => data.origin, }, { field: "raiRequestedDate", label: "Formal RAI Requested", - visible: false, + hidden: true, + transform: (data) => { + return data.raiRequestedDate + ? formatSeatoolDate(data.raiRequestedDate) + : BLANK_VALUE; + }, cell: renderCellDate("raiRequestedDate"), }, { field: "raiReceivedDate", - label: "Formal RAI Response", + 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 +139,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 cc4b70ce6..602563146 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: "Type", + 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,27 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: "submissionDate", label: "Initial Submission", + transform: (data) => + data?.submissionDate + ? formatSeatoolDate(data.submissionDate) + : BLANK_VALUE, cell: renderCellDate("submissionDate"), }, + { + field: "finalDispositionDate", + label: "Final Disposition", + hidden: true, + transform: (data) => + data?.finalDispositionDate + ? formatSeatoolDate(data.finalDispositionDate) + : BLANK_VALUE, + cell: renderCellDate("finalDispositionDate"), + }, { field: "origin", label: "Submission Source", - visible: false, + hidden: true, + transform: (data) => data.origin, cell: (data) => { return data.origin; }, @@ -86,28 +131,40 @@ export const useWaiverTableColumns = (): OsTableColumn[] => { { field: "raiRequestedDate", label: "Formal RAI Requested", - visible: false, + hidden: true, + transform: (data) => { + return data.raiRequestedDate + ? formatSeatoolDate(data.raiRequestedDate) + : BLANK_VALUE; + }, cell: renderCellDate("raiRequestedDate"), }, { field: "raiReceivedDate", - label: "Formal RAI Response", + 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 ...(!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/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/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..abdbe4d52 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 && } + )} /> @@ -159,7 +165,7 @@ export const PackageSection = () => {

{id}

-

Type

+

Authority

{authority === Authority["1915b"] && "1915(b) Waiver"} {authority === Authority["CHIP_SPA"] && "CHIP SPA"} @@ -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/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 a48fdcdd1..bdd6e0f9c 100644 --- a/src/services/ui/src/features/package/index.tsx +++ b/src/services/ui/src/features/package/index.tsx @@ -1,166 +1,69 @@ 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 { getStatus } from "shared-types/statusHelper"; -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"; +import { Authority } from "shared-types"; -const DetailCardWrapper = ({ +export const DetailCardWrapper = ({ title, children, }: PropsWithChildren<{ title: string; }>) => ( - -
+ +

{title}

{children}
); -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.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 ; + 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 ( -
- -
-
- - -
-
- - - -
+
+
+ + +
+
+ + +
); @@ -171,20 +74,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 c2015837b..661f5cd23 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,99 +37,151 @@ 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) && !(data.actionType === "Extend"), + }, { label: "Type", - value: data?.authority - ? removeUnderscoresAndCapitalize(data.authority) + 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: () => { + return !(data.actionType === "Extend"); + }, }, { - label: "Initial Submission Date", + label: "Initial submission date", value: data.submissionDate ? formatSeatoolDate(data.submissionDate) : BLANK_VALUE, canView: () => true, }, { - label: "Proposed Effective Date", + label: "Approved Initial or Renewal Number", + value: data.originalWaiverNumber, + canView: () => { + return data.actionType === "Extend"; + }, + }, + { + label: "Proposed effective date", 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) + label: "Formal RAI received", + value: data.raiReceivedDate + ? formatSeatoolDate(data.raiReceivedDate) : BLANK_VALUE, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { label: "Status Date", 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, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, + }, + { + label: "Approved effective date", + value: data.approvedEffectiveDate + ? formatSeatoolDate(data.approvedEffectiveDate) + : BLANK_VALUE, + canView: () => { + return !(data.actionType === "Extend"); + }, + }, +]; + +export const descriptionDetails = ( + data: opensearch.main.Document, +): DetailSectionItem[] => [ + { + label: "Description", + value: data.description ?? BLANK_VALUE, + canView: (u) => + !u || !u.user + ? false + : isCmsUser(u.user) && !(data.actionType === "Extend"), }, ]; 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}

, - canView: () => true, + canView: () => { + return !(data.actionType === "Extend"); + }, }, { 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 cc10cd3af..0b9804c06 100644 --- a/src/services/ui/src/features/package/package-details/index.tsx +++ b/src/services/ui/src/features/package/package-details/index.tsx @@ -1,44 +1,64 @@ 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}
- ); - })} -
-
- +
+ ); + })} +
); }; -export const PackageDetails = () => { +export const PackageDetails: FC<{ + title: string; +}> = (props) => { const { data } = usePackageDetailsCache(); + // const title = props.title || `${data.authority} Package Details`; 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/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/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", + })} + /> 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..6a50d3e98 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,25 @@ import { } from "@/utils"; import { useQuery as useQueryString } from "@/hooks"; -import { AdditionalInfoInput } from "../shared-components"; +import { + DescriptionInput, + SubjectInput, + 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" }), attachments: z.object({ currentStatePlan: zAttachmentRequired({ min: 1 }), amendedLanguage: zAttachmentRequired({ min: 1 }), @@ -52,6 +61,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 +121,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 +158,9 @@ export const ChipSpaFormPage = () => {
- + { if (e.target instanceof HTMLInputElement) { @@ -181,21 +192,16 @@ export const ChipSpaFormPage = () => { )} /> - {/* TODO: FFF */} - {/* - - - - */}
@@ -214,7 +220,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..57a0b407a 100644 --- a/src/services/ui/src/features/submission/spa/medicaid-initial.tsx +++ b/src/services/ui/src/features/submission/spa/medicaid-initial.tsx @@ -33,19 +33,22 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, - TypeSelect, } 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" }), attachments: z.object({ cmsForm179: zAttachmentRequired({ min: 1, @@ -121,7 +124,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 +160,9 @@ export const MedicaidSpaFormPage = () => {
- + { if (e.target instanceof HTMLInputElement) { @@ -190,21 +194,16 @@ 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..39f12001b 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 @@ -1,17 +1,13 @@ -import { useCallback } from "react"; import { type SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Link, useLocation } from "react-router-dom"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, formCrumbsFromPath, FAQ_TAB, - useModalContext, useAlertContext, useNavigate, } from "@/components"; @@ -34,19 +30,24 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features/submission/shared-components"; +import { SubmitAndCancelBtnSection } from "../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" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -88,15 +89,10 @@ export const Capitated1915BWaiverAmendmentPage = () => { const urlQuery = useQueryString(); const { data: user } = useGetUser(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -115,7 +111,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) { @@ -230,16 +226,16 @@ export const Capitated1915BWaiverAmendmentPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */} @@ -254,7 +250,10 @@ export const Capitated1915BWaiverAmendmentPage = () => { {label} {required ? : null} - + )} @@ -266,41 +265,7 @@ export const Capitated1915BWaiverAmendmentPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ 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..e1d3531f4 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 @@ -6,9 +6,7 @@ import * as Content from "../../../../components/Form/content"; import { Link, useLocation } from "react-router-dom"; import { useGetUser } from "@/api"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, formCrumbsFromPath, @@ -23,26 +21,29 @@ import { zInitialWaiverNumberSchema, } from "@/utils"; import { FAQ_TAB } from "@/components/Routing/consts"; -import { useModalContext } from "@/components/Context/modalContext"; import { useAlertContext } from "@/components/Context/alertContext"; -import { useCallback } from "react"; import { Origin, ORIGIN, originRoute, useOriginPath } from "@/utils/formOrigin"; import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features/submission/shared-components"; +import { SubmitAndCancelBtnSection } from "../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" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -52,7 +53,7 @@ const formSchema = z.object({ additionalInformation: zAdditionalInfo.optional(), seaActionType: z.string().default("New"), }); -type Waiver1915BCapitatedAmendment = z.infer; +export type Waiver1915BCapitatedAmendment = z.infer; // first argument in the array is the name that will show up in the form submission // second argument is used when mapping over for the label @@ -86,14 +87,10 @@ export const Capitated1915BWaiverInitialPage = () => { const navigate = useNavigate(); const urlQuery = useQueryString(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); + const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { console.log("testing"); @@ -113,7 +110,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 +196,16 @@ export const Capitated1915BWaiverInitialPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */}
@@ -223,7 +220,10 @@ export const Capitated1915BWaiverInitialPage = () => { {label} {required ? : null} - + )} @@ -235,41 +235,7 @@ export const Capitated1915BWaiverInitialPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ 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..238e3057f 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 @@ -1,18 +1,14 @@ -import { useCallback } from "react"; import { type SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Link, useLocation } from "react-router-dom"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, formCrumbsFromPath, FAQ_TAB, useAlertContext, - useModalContext, useNavigate, } from "@/components"; import * as Content from "@/components/Form/content"; @@ -34,20 +30,25 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features/submission/shared-components"; +import { SubmitAndCancelBtnSection } from "../shared-components"; const formSchema = z .object({ 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" }), attachments: z.object({ bCapWaiverApplication: zAttachmentRequired({ min: 1 }), bCapCostSpreadsheets: zAttachmentRequired({ min: 1 }), @@ -115,14 +116,10 @@ export const Capitated1915BWaiverRenewalPage = () => { const navigate = useNavigate(); const urlQuery = useQueryString(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); + const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { // AK-0260.R04.02 @@ -142,7 +139,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 +256,16 @@ export const Capitated1915BWaiverRenewalPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */}
@@ -283,7 +280,10 @@ export const Capitated1915BWaiverRenewalPage = () => { {label} {required ? : null} - + )} @@ -295,41 +295,7 @@ export const Capitated1915BWaiverRenewalPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ 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..b362b8b3a 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 @@ -1,16 +1,12 @@ -import { useCallback } from "react"; import { type SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Link, useLocation } from "react-router-dom"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, FAQ_TAB, - useModalContext, useNavigate, useAlertContext, formCrumbsFromPath, @@ -34,19 +30,24 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features"; +import { SubmitAndCancelBtnSection } from "../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" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), tribalConsultation: zAttachmentOptional, @@ -85,14 +86,10 @@ export const Contracting1915BWaiverAmendmentPage = () => { const navigate = useNavigate(); const urlQuery = useQueryString(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); + const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -111,7 +108,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 +223,16 @@ export const Contracting1915BWaiverAmendmentPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */}
@@ -250,7 +247,10 @@ export const Contracting1915BWaiverAmendmentPage = () => { {label} {required ? : null} - + )} @@ -262,41 +262,7 @@ export const Contracting1915BWaiverAmendmentPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ 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..e30ed244d 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 @@ -1,16 +1,12 @@ -import { useCallback } from "react"; import { type SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Link, useLocation } from "react-router-dom"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, FAQ_TAB, - useModalContext, useAlertContext, formCrumbsFromPath, useNavigate, @@ -33,18 +29,23 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features"; +import { SubmitAndCancelBtnSection } from "../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" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), tribalConsultation: zAttachmentOptional, @@ -82,14 +83,10 @@ export const Contracting1915BWaiverInitialPage = () => { const navigate = useNavigate(); const urlQuery = useQueryString(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); + const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { await submit({ @@ -108,7 +105,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 +191,16 @@ export const Contracting1915BWaiverInitialPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */}
@@ -217,7 +214,10 @@ export const Contracting1915BWaiverInitialPage = () => { {label} {required ? : null} - + )} @@ -229,41 +229,7 @@ export const Contracting1915BWaiverInitialPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ 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..6ff73cf8b 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 @@ -1,18 +1,14 @@ -import { useCallback } from "react"; import { type SubmitHandler, useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Link, useLocation } from "react-router-dom"; import { - Alert, BreadCrumbs, - LoadingSpinner, SimplePageContainer, SectionCard, FAQ_TAB, formCrumbsFromPath, useAlertContext, - useModalContext, useNavigate, } from "@/components"; import * as Content from "@/components/Form/content"; @@ -34,20 +30,25 @@ import { useQuery as useQueryString } from "@/hooks"; import { AdditionalInfoInput, DescriptionInput, - SubTypeSelect, SubjectInput, } from "@/features"; +import { SubmitAndCancelBtnSection } from "../shared-components"; const formSchema = z .object({ 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" }), attachments: z.object({ b4WaiverApplication: zAttachmentRequired({ min: 1 }), b4IndependentAssessment: zAttachmentOptional, @@ -108,14 +109,10 @@ export const Contracting1915BWaiverRenewalPage = () => { const navigate = useNavigate(); const urlQuery = useQueryString(); const alert = useAlertContext(); - const modal = useModalContext(); const originPath = useOriginPath(); - const cancelOnAccept = useCallback(() => { - modal.setModalOpen(false); - navigate(originPath ? { path: originPath } : { path: "/dashboard" }); - }, []); + const handleSubmit: SubmitHandler = async ( - formData + formData, ) => { try { // AK-0260.R04.02 @@ -135,7 +132,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 +249,16 @@ export const Contracting1915BWaiverRenewalPage = () => { )} /> - {/* // TODO: FFF */} - {/* + - - - */}
@@ -276,7 +273,10 @@ export const Contracting1915BWaiverRenewalPage = () => { {label} {required ? : null} - + )} @@ -288,41 +288,7 @@ export const Contracting1915BWaiverRenewalPage = () => { name="additionalInformation" /> - {Object.keys(form.formState.errors).length !== 0 ? ( - - Missing or malformed information. Please see errors above. - - ) : null} - {form.formState.isSubmitting ? ( -
- -
- ) : null} -
- - Submit - - { - modal.setContent({ - header: "Stop form submission?", - body: "All information you've entered on this form will be lost if you leave this page.", - acceptButtonText: "Yes, leave form", - cancelButtonText: "Return to form", - }); - modal.setOnAccept(() => cancelOnAccept); - modal.setModalOpen(true); - }} - > - Cancel - -
+ diff --git a/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx b/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx new file mode 100644 index 000000000..ddc591d76 --- /dev/null +++ b/src/services/ui/src/features/submission/waiver/shared-components/SubmitAndCancelBtnSection.tsx @@ -0,0 +1,60 @@ +import { LoadingSpinner, useNavigate } from "@/components"; +import * as Inputs from "@/components"; + +import { useCallback } from "react"; +import { useFormContext } from "react-hook-form"; +import { useOriginPath } from "@/utils"; + +export const SubmitAndCancelBtnSection = () => { + const form = useFormContext(); + const navigate = useNavigate(); + const originPath = useOriginPath(); + + const modal = Inputs.useModalContext(); + const cancelOnAccept = useCallback(() => { + modal.setModalOpen(false); + navigate(originPath ? { path: originPath } : { path: "/dashboard" }); + }, []); + + return ( + <> + {form.formState.isSubmitting && ( +
+ +
+ )} + + {Object.keys(form.formState.errors).length !== 0 && ( + + Missing or malformed information. Please see errors above. + + )} + +
+ + Submit + + { + modal.setContent({ + header: "Stop form submission?", + body: "All information you've entered on this form will be lost if you leave this page.", + acceptButtonText: "Yes, leave form", + cancelButtonText: "Return to form", + }); + modal.setOnAccept(() => cancelOnAccept); + modal.setModalOpen(true); + }} + > + Cancel + +
+ + ); +}; diff --git a/src/services/ui/src/features/submission/waiver/shared-components/index.ts b/src/services/ui/src/features/submission/waiver/shared-components/index.ts new file mode 100644 index 000000000..01afcdc0c --- /dev/null +++ b/src/services/ui/src/features/submission/waiver/shared-components/index.ts @@ -0,0 +1 @@ +export * from "./SubmitAndCancelBtnSection"; 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..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,17 +115,52 @@ 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(""); + +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.", + }); 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..3cde5cbcb 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,15 +3769,23 @@ 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" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== +"@haftahave/serverless-ses-template@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@haftahave/serverless-ses-template/-/serverless-ses-template-6.1.0.tgz#b8df446b376aa4a8ad39dbb857704090b4a8ad22" + integrity sha512-oEvQ0Ow8zRH+hCjmvwDSREOlhpX49RiU+l3A42u6CMCfIqcQMrqMcqLf9ypEKC/Xi1Qt2U4eQ2P1FY8en5cUnw== + dependencies: + chalk "^4.1.2" + cli-table "^0.3.11" + "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -4366,34 +3913,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 +4001,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 +4050,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 +4070,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 +4092,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 +4111,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 +4122,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 +4154,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 +4166,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 +4193,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 +4308,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 +4367,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 +4451,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 +5047,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 +5208,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 +5414,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 +5437,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 +5448,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 +5473,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" @@ -5978,17 +5481,7 @@ "@smithy/node-config-provider" "^2.2.4" "@smithy/property-provider" "^2.1.3" "@smithy/types" "^2.10.1" - "@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" + "@smithy/url-parser" "^2.1.3" tslib "^2.5.0" "@smithy/eventstream-codec@^2.1.3": @@ -6001,50 +5494,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 +5540,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 +5560,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 +5584,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 +5617,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 +5630,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 +5645,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 +5653,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 +5671,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 +5681,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 +5700,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 +5708,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 +5716,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 +5733,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 +5741,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 +5756,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 +5764,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 +5778,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 +5797,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 +5813,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 +5859,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 +5870,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 +5883,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 +5899,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 +5907,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 +5916,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 +5945,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 +5985,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 +6207,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 +6371,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 +6394,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 +6408,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 +7137,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 +7153,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 +7174,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 +7184,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 +7297,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 +7354,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 +7544,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 +7683,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 +7764,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 +7884,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 +7920,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 +7947,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" @@ -8737,6 +7983,13 @@ cli-table3@^0.6.3: optionalDependencies: "@colors/colors" "1.5.0" +cli-table@^0.3.11: + version "0.3.11" + resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.11.tgz#ac69cdecbe81dccdba4889b9a18b7da312a9d3ee" + integrity sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ== + dependencies: + colors "1.0.3" + cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" @@ -8821,6 +8074,11 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== +colors@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== + colors@1.3.x: version "1.3.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" @@ -9133,13 +8391,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 +8786,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 +8850,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 +8868,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 +8889,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 +8937,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 +8958,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 +8983,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 +9015,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 +9126,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 +9386,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 +9865,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 +10061,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 +10552,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 +10776,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 +10836,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 +11247,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 +11571,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 +11594,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 +11611,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 +11644,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 +11658,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" @@ -12689,15 +11949,20 @@ lucide-react@^0.291.0: resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.291.0.tgz#d6db8f5117a68c8bbc6ed51d800879fa6a471978" integrity sha512-79jHlT9Je2PXSvXIBGDkItCK7In2O9iKnnSJ/bJxvIBOFaX2Ex0xEcC4fRS/g0F2uQGFejjmn2qWhwdc5wicMQ== +luxon@^3.4.4: + version "3.4.4" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.4.4.tgz#cf20dc27dc532ba41a169c43fdcc0063601577af" + integrity sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA== + lz-string@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.5.0.tgz#c1ab50f77887b712621201ba9fd4e3a6ed099941" 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 +12273,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 +12308,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 +12495,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 +12603,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 +12696,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 +12710,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 +12738,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 +12758,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 +12817,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 +12839,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 +12848,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 +12857,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 +12865,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 +12874,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 +13369,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 +13740,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 +13801,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 +14094,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 +14341,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 +14414,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 +14549,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 +14780,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 +14885,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 +15204,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 +15605,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 +15623,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 +15634,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 +15646,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==