diff --git a/frontend/package.json b/frontend/package.json
index 5e73026cd..758321776 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,8 +1,8 @@
{
"dependencies": {
"@aws-amplify/adapter-nextjs": "^1.7.1",
- "@aws-amplify/ui-react": "^6.9.4",
- "aws-amplify": "^6.13.6",
+ "@aws-amplify/ui-react": "^6.15.2",
+ "aws-amplify": "^6.16.3",
"classnames": "^2.5.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
diff --git a/frontend/src/__tests__/app/edit-template-campaign/[templateId]/page.test.tsx b/frontend/src/__tests__/app/edit-template-campaign/[templateId]/page.test.tsx
index 534a74f98..627b0ed03 100644
--- a/frontend/src/__tests__/app/edit-template-campaign/[templateId]/page.test.tsx
+++ b/frontend/src/__tests__/app/edit-template-campaign/[templateId]/page.test.tsx
@@ -7,6 +7,7 @@ import { getTemplate } from '@utils/form-actions';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
import { editTemplateCampaign } from '@app/edit-template-campaign/[templateId]/server-action';
import Page, { metadata } from '@app/edit-template-campaign/[templateId]/page';
+import { PdfLetterTemplate } from 'nhs-notify-web-template-management-utils';
jest.mock('next/navigation');
jest.mock('@utils/server-features');
@@ -42,6 +43,27 @@ const mockTemplate: TemplateDto = {
},
};
+const mockPdfTemplate: PdfLetterTemplate = {
+ id: 'template-123',
+ name: 'PDF Letter Template',
+ templateType: 'LETTER',
+ templateStatus: 'NOT_YET_SUBMITTED',
+ lockNumber: 5,
+ language: 'en',
+ letterType: 'x0',
+ letterVersion: 'PDF',
+ files: {
+ pdfTemplate: {
+ fileName: 'test.pdf',
+ currentVersion: 'v1',
+ virusScanStatus: 'PASSED',
+ },
+ },
+ createdAt: '2026-01-01T00:00:00.000Z',
+ updatedAt: '2026-01-01T00:00:00.000Z',
+ clientId: 'client-123',
+};
+
beforeEach(() => {
jest.resetAllMocks();
jest.mocked(editTemplateCampaign).mockResolvedValue({});
@@ -104,26 +126,7 @@ describe('template is not a letter', () => {
describe('letter version is not AUTHORING', () => {
beforeEach(() => {
- jest.mocked(getTemplate).mockResolvedValue({
- id: 'template-123',
- name: 'PDF Letter Template',
- templateType: 'LETTER',
- templateStatus: 'NOT_YET_SUBMITTED',
- lockNumber: 5,
- language: 'en',
- letterType: 'x0',
- letterVersion: 'PDF',
- files: {
- pdfTemplate: {
- fileName: 'test.pdf',
- currentVersion: 'v1',
- virusScanStatus: 'PASSED',
- },
- },
- createdAt: '2026-01-01T00:00:00.000Z',
- updatedAt: '2026-01-01T00:00:00.000Z',
- clientId: 'client-123',
- });
+ jest.mocked(getTemplate).mockResolvedValue(mockPdfTemplate);
});
it('redirects to preview letter template page', async () => {
@@ -156,10 +159,10 @@ describe('client has letter authoring feature flag disabled', () => {
});
});
-describe('template has been submitted', () => {
+describe('template has been submitted - PDF', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
- ...mockTemplate,
+ ...mockPdfTemplate,
templateStatus: 'SUBMITTED',
});
});
@@ -174,6 +177,24 @@ describe('template has been submitted', () => {
});
});
+describe('template has been submitted - authoring', () => {
+ beforeEach(() => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...mockTemplate,
+ templateStatus: 'SUBMITTED',
+ });
+ });
+
+ it('redirects to preview submitted letter template page', async () => {
+ await Page({ params: Promise.resolve({ templateId: 'template-123' }) });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/preview-approved-letter-template/template-123',
+ RedirectType.replace
+ );
+ });
+});
+
describe('client only has one campaign', () => {
beforeEach(() => {
jest.mocked(fetchClient).mockResolvedValue({
diff --git a/frontend/src/__tests__/app/edit-template-name/[templateId]/page.test.tsx b/frontend/src/__tests__/app/edit-template-name/[templateId]/page.test.tsx
index d9bfedba1..eb278ac66 100644
--- a/frontend/src/__tests__/app/edit-template-name/[templateId]/page.test.tsx
+++ b/frontend/src/__tests__/app/edit-template-name/[templateId]/page.test.tsx
@@ -1,7 +1,10 @@
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { redirect, RedirectType } from 'next/navigation';
-import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
+import type {
+ AuthoringLetterTemplate,
+ PdfLetterTemplate,
+} from 'nhs-notify-web-template-management-utils';
import { fetchClient } from '@utils/server-features';
import { getTemplate } from '@utils/form-actions';
import { verifyFormCsrfToken } from '@utils/csrf-utils';
@@ -42,6 +45,27 @@ const mockTemplate: AuthoringLetterTemplate = {
systemPersonalisation: [],
};
+const mockPdfTemplate: PdfLetterTemplate = {
+ id: 'template-123',
+ name: 'PDF Letter Template',
+ templateType: 'LETTER',
+ templateStatus: 'NOT_YET_SUBMITTED',
+ lockNumber: 5,
+ language: 'en',
+ letterType: 'x0',
+ letterVersion: 'PDF',
+ files: {
+ pdfTemplate: {
+ fileName: 'test.pdf',
+ currentVersion: 'v1',
+ virusScanStatus: 'PASSED',
+ },
+ },
+ createdAt: '2026-01-01T00:00:00.000Z',
+ updatedAt: '2026-01-01T00:00:00.000Z',
+ clientId: 'client-123',
+};
+
beforeEach(() => {
jest.resetAllMocks();
jest.mocked(editTemplateName).mockResolvedValue({});
@@ -104,26 +128,7 @@ describe('template is not a letter', () => {
describe('letter version is not AUTHORING', () => {
beforeEach(() => {
- jest.mocked(getTemplate).mockResolvedValue({
- id: 'template-123',
- name: 'PDF Letter Template',
- templateType: 'LETTER',
- templateStatus: 'NOT_YET_SUBMITTED',
- lockNumber: 5,
- language: 'en',
- letterType: 'x0',
- letterVersion: 'PDF',
- files: {
- pdfTemplate: {
- fileName: 'test.pdf',
- currentVersion: 'v1',
- virusScanStatus: 'PASSED',
- },
- },
- createdAt: '2026-01-01T00:00:00.000Z',
- updatedAt: '2026-01-01T00:00:00.000Z',
- clientId: 'client-123',
- });
+ jest.mocked(getTemplate).mockResolvedValue(mockPdfTemplate);
});
it('redirects to preview letter template page', async () => {
@@ -156,10 +161,10 @@ describe('client has letter authoring feature flag disabled', () => {
});
});
-describe('template has been submitted', () => {
+describe('template has been submitted - PDF', () => {
beforeEach(() => {
jest.mocked(getTemplate).mockResolvedValue({
- ...mockTemplate,
+ ...mockPdfTemplate,
templateStatus: 'SUBMITTED',
});
});
@@ -174,6 +179,24 @@ describe('template has been submitted', () => {
});
});
+describe('template has been submitted - authoring', () => {
+ beforeEach(() => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...mockTemplate,
+ templateStatus: 'SUBMITTED',
+ });
+ });
+
+ it('redirects to preview submitted letter template page', async () => {
+ await Page({ params: Promise.resolve({ templateId: 'template-123' }) });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/preview-approved-letter-template/template-123',
+ RedirectType.replace
+ );
+ });
+});
+
describe('valid template', () => {
it('matches snapshot on initial render', async () => {
expect(
diff --git a/frontend/src/__tests__/app/preview-approved-letter-template/__snapshots__/page.test.tsx.snap b/frontend/src/__tests__/app/preview-approved-letter-template/__snapshots__/page.test.tsx.snap
new file mode 100644
index 000000000..3a2fc8e43
--- /dev/null
+++ b/frontend/src/__tests__/app/preview-approved-letter-template/__snapshots__/page.test.tsx.snap
@@ -0,0 +1,356 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`valid authoring letter template matches snapshot 1`] = `
+
+
+
+
+
+
+
+
+
+ Template
+
+
+ authoring letter template name
+
+
+
+
+
+
-
+ Template ID
+
+ -
+ authoring-letter-template-id
+
+
+
+
+
-
+ Template type
+
+ -
+ Standard letter
+
+
+
+
+
-
+ Campaign
+
+
+
+
+
+
-
+ Total pages
+
+ -
+ 2
+
+
+
+
+
+
-
+ Printing and postage
+
+ -
+ variant-123
+
+
+
+
+
+
+
+
+
+
+
+ Letter preview
+
+
+ Check how your personalisation fields will appear in your letter.
+
+
+ Learn more about personalising your letters (opens in a new tab).
+
+
+
+ Example personalisation data
+
+
+
+
+
+
+ PDS personalisation fields
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PDS personalisation fields
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+`;
diff --git a/frontend/src/__tests__/app/preview-approved-letter-template/page.test.tsx b/frontend/src/__tests__/app/preview-approved-letter-template/page.test.tsx
new file mode 100644
index 000000000..82cb1830c
--- /dev/null
+++ b/frontend/src/__tests__/app/preview-approved-letter-template/page.test.tsx
@@ -0,0 +1,200 @@
+import { render, screen } from '@testing-library/react';
+import { redirect, RedirectType } from 'next/navigation';
+import { getTemplate } from '@utils/form-actions';
+import { verifyFormCsrfToken } from '@utils/csrf-utils';
+import {
+ AUTHORING_LETTER_TEMPLATE,
+ EMAIL_TEMPLATE,
+ NHS_APP_TEMPLATE,
+ SMS_TEMPLATE,
+} from '@testhelpers/helpers';
+import Page, {
+ generateMetadata,
+} from '@app/preview-approved-letter-template/[templateId]/page';
+import content from '@content/content';
+import { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
+
+const mockTemplate: AuthoringLetterTemplate = {
+ ...AUTHORING_LETTER_TEMPLATE,
+ templateStatus: 'PROOF_APPROVED',
+};
+
+jest.mock('@utils/form-actions');
+jest.mock('next/navigation');
+jest.mock('@utils/csrf-utils');
+
+const { approvedPageTitle } = content.pages.previewLetterTemplate;
+
+const NOW = new Date('2025-06-15T12:00:00.000Z');
+
+beforeEach(() => {
+ jest.resetAllMocks();
+ jest.useFakeTimers({ now: NOW });
+ jest.mocked(verifyFormCsrfToken).mockResolvedValue(true);
+});
+
+afterEach(() => {
+ jest.useRealTimers();
+});
+
+test('metadata', async () => {
+ expect(await generateMetadata()).toEqual({
+ title: approvedPageTitle,
+ });
+});
+
+describe('template does not exist', () => {
+ beforeEach(() => {
+ jest.mocked(getTemplate).mockResolvedValue(undefined);
+ });
+
+ it('redirects to invalid template page', async () => {
+ await Page({ params: Promise.resolve({ templateId: 'template-123' }) });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+});
+
+describe('template is not a letter', () => {
+ it('redirects to invalid template page when template is an email', async () => {
+ jest.mocked(getTemplate).mockResolvedValue(EMAIL_TEMPLATE);
+
+ await Page({ params: Promise.resolve({ templateId: EMAIL_TEMPLATE.id }) });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+
+ it('redirects to invalid template page when template is an SMS', async () => {
+ jest.mocked(getTemplate).mockResolvedValue(SMS_TEMPLATE);
+
+ await Page({ params: Promise.resolve({ templateId: SMS_TEMPLATE.id }) });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+
+ it('redirects to invalid template page when template is an NHS App message', async () => {
+ jest.mocked(getTemplate).mockResolvedValue(NHS_APP_TEMPLATE);
+
+ await Page({
+ params: Promise.resolve({ templateId: NHS_APP_TEMPLATE.id }),
+ });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+});
+
+describe('authoring letter template is invalid', () => {
+ it('redirects to invalid template page when name is missing', async () => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...mockTemplate,
+ name: undefined as unknown as string,
+ });
+
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+
+ it('redirects to invalid template page when language is missing', async () => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...mockTemplate,
+ language: undefined as unknown as 'en',
+ });
+
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+
+ it('redirects to invalid template page when letterType is missing', async () => {
+ jest.mocked(getTemplate).mockResolvedValue({
+ ...mockTemplate,
+ letterType: undefined as unknown as 'x0',
+ });
+
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ });
+
+ expect(redirect).toHaveBeenCalledWith(
+ '/invalid-template',
+ RedirectType.replace
+ );
+ });
+});
+
+describe('valid authoring letter template', () => {
+ beforeEach(() => {
+ jest.mocked(getTemplate).mockResolvedValue(mockTemplate);
+ });
+
+ it('renders the page without redirecting', async () => {
+ const page = await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ });
+
+ expect(page).toBeTruthy();
+ expect(redirect).not.toHaveBeenCalled();
+ });
+
+ it('matches snapshot', async () => {
+ const { asFragment } = render(
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ })
+ );
+
+ expect(asFragment()).toMatchSnapshot();
+ });
+
+ it('displays the back link with correct href', async () => {
+ render(
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ })
+ );
+
+ const backLink = screen.getByTestId('back-link-top');
+ expect(backLink).toHaveAttribute('href', '/message-templates');
+ });
+
+ it('displays the letter renderer when initialRender file is RENDERED', async () => {
+ render(
+ await Page({
+ params: Promise.resolve({ templateId: mockTemplate.id }),
+ })
+ );
+
+ expect(
+ screen.getByRole('heading', { name: 'Letter preview' })
+ ).toBeInTheDocument();
+ expect(
+ screen.getByRole('tab', { name: 'Short examples' })
+ ).toBeInTheDocument();
+ expect(
+ screen.getByRole('tab', { name: 'Long examples' })
+ ).toBeInTheDocument();
+ });
+});
diff --git a/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx b/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx
index dc629c9ba..34fbba6df 100644
--- a/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx
+++ b/frontend/src/__tests__/app/preview-submitted-letter-template/page.test.tsx
@@ -9,14 +9,13 @@ import { getTemplate } from '@utils/form-actions';
import { redirect } from 'next/navigation';
import { TemplateDto } from 'nhs-notify-web-template-management-types';
import {
- AUTHORING_LETTER_TEMPLATE,
EMAIL_TEMPLATE,
NHS_APP_TEMPLATE,
SMS_TEMPLATE,
PDF_LETTER_TEMPLATE,
} from '@testhelpers/helpers';
import content from '@content/content';
-import PreviewTemplateDetailsLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter';
+import PreviewTemplateDetailsPdfLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter';
import { PreviewSubmittedTemplate } from '@molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate';
import { NHSNotifyContainer } from '@layouts/container/container';
@@ -72,31 +71,7 @@ describe('PreviewSubmittedLetterTemplatePage', () => {
-
- );
- });
-
- it('should load page with authoring letter template', async () => {
- const templateDTO = {
- ...AUTHORING_LETTER_TEMPLATE,
- templateStatus: 'SUBMITTED',
- } satisfies TemplateDto;
-
- getTemplateMock.mockResolvedValueOnce(templateDTO);
-
- const page = await PreviewSubmittedLetterTemplatePage({
- params: Promise.resolve({
- templateId: AUTHORING_LETTER_TEMPLATE.id,
- }),
- });
-
- expect(page).toEqual(
-
-
);
@@ -134,10 +109,6 @@ describe('PreviewSubmittedLetterTemplatePage', () => {
...PDF_LETTER_TEMPLATE,
templateStatus: 'NOT_YET_SUBMITTED' as const,
},
- {
- ...AUTHORING_LETTER_TEMPLATE,
- templateStatus: 'NOT_YET_SUBMITTED' as const,
- },
])(
'should redirect to invalid-template when template is $templateType, name is $name, and status is $templateStatus',
async (value) => {
diff --git a/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderDetails.test.tsx b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderDetails.test.tsx
new file mode 100644
index 000000000..698540dc4
--- /dev/null
+++ b/frontend/src/__tests__/components/molecules/LetterRender/LetterRenderDetails.test.tsx
@@ -0,0 +1,148 @@
+import { render, screen } from '@testing-library/react';
+import { LetterRenderDetails } from '@molecules/LetterRender/LetterRenderDetails';
+import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
+
+const baseTemplate: AuthoringLetterTemplate = {
+ id: 'template-123',
+ clientId: 'client-123',
+ name: 'Test Letter',
+ templateStatus: 'NOT_YET_SUBMITTED',
+ templateType: 'LETTER',
+ letterType: 'x0',
+ letterVersion: 'AUTHORING',
+ letterVariantId: 'variant-123',
+ language: 'en',
+ files: {
+ docxTemplate: {
+ currentVersion: 'version-id',
+ fileName: 'template.docx',
+ virusScanStatus: 'PASSED',
+ },
+ initialRender: {
+ status: 'RENDERED',
+ currentVersion: '1234',
+ fileName: '1234.pdf',
+ pageCount: 1,
+ },
+ shortFormRender: {
+ status: 'RENDERED',
+ currentVersion: 'short-version',
+ fileName: 'short.pdf',
+ pageCount: 1,
+ systemPersonalisationPackId: 'short-1',
+ personalisationParameters: {
+ appointmentDate: '2025-01-15',
+ clinicName: 'Riverside Clinic',
+ },
+ },
+ longFormRender: {
+ status: 'RENDERED',
+ currentVersion: 'long-version',
+ fileName: 'long.pdf',
+ pageCount: 2,
+ systemPersonalisationPackId: 'long-1',
+ personalisationParameters: {
+ appointmentDate: '2025-02-20',
+ },
+ },
+ },
+ systemPersonalisation: ['firstName', 'lastName'],
+ createdAt: '2025-01-13T10:19:25.579Z',
+ updatedAt: '2025-01-13T10:19:25.579Z',
+ lockNumber: 1,
+};
+
+describe('LetterRenderDetails', () => {
+ describe('PDS personalisation section', () => {
+ it('renders the selected short example recipient name', () => {
+ render(
+
+ );
+
+ expect(
+ screen.getByRole('heading', { name: 'PDS personalisation fields' })
+ ).toBeInTheDocument();
+ expect(screen.getByText('Jo Bloggs')).toBeInTheDocument();
+ });
+
+ it('renders the selected long example recipient name', () => {
+ render(
+
+ );
+
+ expect(
+ screen.getByText('Mr Michael James Richardson-Clarke')
+ ).toBeInTheDocument();
+ });
+ });
+
+ describe('Custom personalisation section', () => {
+ it('renders custom field labels and values when present', () => {
+ const templateWithCustom: AuthoringLetterTemplate = {
+ ...baseTemplate,
+ customPersonalisation: ['appointmentDate', 'clinicName'],
+ };
+
+ render(
+
+ );
+
+ expect(
+ screen.getByRole('heading', { name: 'Custom personalisation fields' })
+ ).toBeInTheDocument();
+ expect(screen.getByText('appointmentDate')).toBeInTheDocument();
+ expect(screen.getByText('2025-01-15')).toBeInTheDocument();
+ expect(screen.getByText('clinicName')).toBeInTheDocument();
+ expect(screen.getByText('Riverside Clinic')).toBeInTheDocument();
+ });
+
+ it('does not render the custom section when customPersonalisation is missing', () => {
+ render(
+
+ );
+
+ expect(
+ screen.queryByRole('heading', { name: 'Custom personalisation fields' })
+ ).not.toBeInTheDocument();
+ });
+
+ it('does not render the custom section when customPersonalisation is empty', () => {
+ const templateWithEmptyCustom: AuthoringLetterTemplate = {
+ ...baseTemplate,
+ customPersonalisation: [],
+ };
+
+ render(
+
+ );
+
+ expect(
+ screen.queryByRole('heading', { name: 'Custom personalisation fields' })
+ ).not.toBeInTheDocument();
+ });
+ });
+
+ describe('snapshots', () => {
+ it('matches snapshot', () => {
+ const templateWithCustom: AuthoringLetterTemplate = {
+ ...baseTemplate,
+ customPersonalisation: ['appointmentDate'],
+ };
+
+ const container = render(
+
+ );
+
+ expect(container.asFragment()).toMatchSnapshot();
+ });
+ });
+});
diff --git a/frontend/src/__tests__/components/molecules/LetterRender/__snapshots__/LetterRenderDetails.test.tsx.snap b/frontend/src/__tests__/components/molecules/LetterRender/__snapshots__/LetterRenderDetails.test.tsx.snap
new file mode 100644
index 000000000..b67cf6c19
--- /dev/null
+++ b/frontend/src/__tests__/components/molecules/LetterRender/__snapshots__/LetterRenderDetails.test.tsx.snap
@@ -0,0 +1,38 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`LetterRenderDetails snapshots matches snapshot 1`] = `
+
+
+ PDS personalisation fields
+
+
+
+ Jo Bloggs
+
+
+ Custom personalisation fields
+
+
+
+
+ 2025-01-15
+
+
+
+`;
diff --git a/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx b/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx
index ec18a37c4..529078d7d 100644
--- a/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx
+++ b/frontend/src/__tests__/components/molecules/MessageTemplates.test.tsx
@@ -139,6 +139,31 @@ describe('MessageTemplates component', () => {
},
},
},
+ {
+ id: '2',
+ templateType: 'LETTER',
+ templateStatus: 'PROOF_APPROVED',
+ name: 'Template 2',
+ createdAt: '2021-02-01T00:00:00.000Z',
+ letterType: 'x0',
+ letterVersion: 'AUTHORING',
+ language: 'en',
+ updatedAt: '2021-02-01T00:00:00.000Z',
+ lockNumber: 1,
+ files: {
+ docxTemplate: {
+ currentVersion: 'version-id',
+ fileName: 'template.docx',
+ virusScanStatus: 'PASSED',
+ },
+ initialRender: {
+ fileName: 'render.pdf',
+ currentVersion: 'v1',
+ status: 'RENDERED',
+ pageCount: 2,
+ },
+ },
+ },
],
}}
/>
diff --git a/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap b/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap
index d8db0de9b..125da52a8 100644
--- a/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap
+++ b/frontend/src/__tests__/components/molecules/__snapshots__/MessageTemplates.test.tsx.snap
@@ -1132,6 +1132,106 @@ exports[`MessageTemplates component matches snapshot with proof approved status
+
+ |
+
+ Name
+
+
+ Template 2
+
+ |
+
+
+ ID
+
+ 2
+ |
+
+
+ Type
+
+ Standard letter
+ |
+
+
+ Status
+
+
+ Approved
+
+ |
+
+
+ Last edited
+
+ 1st Feb 2021
+
+ 00:00
+ |
+
+
+ Action
+
+
+ |
+
diff --git a/frontend/src/app/edit-template-campaign/[templateId]/page.tsx b/frontend/src/app/edit-template-campaign/[templateId]/page.tsx
index 9a0d94589..934584486 100644
--- a/frontend/src/app/edit-template-campaign/[templateId]/page.tsx
+++ b/frontend/src/app/edit-template-campaign/[templateId]/page.tsx
@@ -1,6 +1,7 @@
import type { Metadata } from 'next';
import Link from 'next/link';
import { redirect, RedirectType } from 'next/navigation';
+import type { TemplateDto } from 'nhs-notify-web-template-management-types';
import type { TemplatePageProps } from 'nhs-notify-web-template-management-utils';
import { HintText, Label } from '@atoms/nhsuk-components';
import * as NHSNotifyForm from '@atoms/NHSNotifyForm';
@@ -20,6 +21,26 @@ export const metadata: Metadata = {
title: content.pageTitle,
};
+const getPreviewURL = (template: TemplateDto) => {
+ if (
+ template.templateType === 'LETTER' &&
+ template.letterVersion === 'AUTHORING' &&
+ ['PROOF_APPROVED', 'SUBMITTED'].includes(template.templateStatus)
+ ) {
+ return `/preview-approved-letter-template/${template.id}`;
+ }
+
+ if (
+ template.templateType === 'LETTER' &&
+ template.letterVersion === 'PDF' &&
+ template.templateStatus === 'SUBMITTED'
+ ) {
+ return `/preview-submitted-letter-template/${template.id}`;
+ }
+
+ return `/preview-letter-template/${template.id}`;
+};
+
export default async function EditTemplateCampaignPage({
params,
}: TemplatePageProps) {
@@ -39,17 +60,12 @@ export default async function EditTemplateCampaignPage({
return redirect('/message-templates', RedirectType.replace);
}
- const previewUrl =
- template.templateStatus === 'SUBMITTED'
- ? `/preview-submitted-letter-template/${templateId}`
- : `/preview-letter-template/${templateId}`;
-
if (
template.templateStatus === 'SUBMITTED' ||
template.letterVersion !== 'AUTHORING' ||
campaignIds.length < 2
) {
- return redirect(previewUrl, RedirectType.replace);
+ return redirect(getPreviewURL(template), RedirectType.replace);
}
if (!client?.features.letterAuthoring) {
diff --git a/frontend/src/app/edit-template-name/[templateId]/page.tsx b/frontend/src/app/edit-template-name/[templateId]/page.tsx
index b0853fe86..43d97c825 100644
--- a/frontend/src/app/edit-template-name/[templateId]/page.tsx
+++ b/frontend/src/app/edit-template-name/[templateId]/page.tsx
@@ -1,6 +1,7 @@
import type { Metadata } from 'next';
import Link from 'next/link';
import { redirect, RedirectType } from 'next/navigation';
+import type { TemplateDto } from 'nhs-notify-web-template-management-types';
import type { TemplatePageProps } from 'nhs-notify-web-template-management-utils';
import { NHSNotifyContainer } from '@layouts/container/container';
import { HintText, Label } from '@atoms/nhsuk-components';
@@ -20,6 +21,26 @@ export const metadata: Metadata = {
title: content.pageTitle,
};
+const getPreviewURL = (template: TemplateDto) => {
+ if (
+ template.templateType === 'LETTER' &&
+ template.letterVersion === 'AUTHORING' &&
+ ['PROOF_APPROVED', 'SUBMITTED'].includes(template.templateStatus)
+ ) {
+ return `/preview-approved-letter-template/${template.id}`;
+ }
+
+ if (
+ template.templateType === 'LETTER' &&
+ template.letterVersion === 'PDF' &&
+ template.templateStatus === 'SUBMITTED'
+ ) {
+ return `/preview-submitted-letter-template/${template.id}`;
+ }
+
+ return `/preview-letter-template/${template.id}`;
+};
+
export default async function EditTemplateNamePage({
params,
}: TemplatePageProps) {
@@ -37,16 +58,11 @@ export default async function EditTemplateNamePage({
return redirect('/message-templates', RedirectType.replace);
}
- const previewUrl =
- template.templateStatus === 'SUBMITTED'
- ? `/preview-submitted-letter-template/${templateId}`
- : `/preview-letter-template/${templateId}`;
-
if (
template.templateStatus === 'SUBMITTED' ||
template.letterVersion !== 'AUTHORING'
) {
- return redirect(previewUrl, RedirectType.replace);
+ return redirect(getPreviewURL(template), RedirectType.replace);
}
if (!client?.features.letterAuthoring) {
diff --git a/frontend/src/app/preview-approved-letter-template/[templateId]/page.tsx b/frontend/src/app/preview-approved-letter-template/[templateId]/page.tsx
new file mode 100644
index 000000000..6f677b077
--- /dev/null
+++ b/frontend/src/app/preview-approved-letter-template/[templateId]/page.tsx
@@ -0,0 +1,69 @@
+import { redirect, RedirectType } from 'next/navigation';
+import type { Metadata } from 'next';
+import type { TemplatePageProps } from 'nhs-notify-web-template-management-utils';
+import {
+ $AuthoringLetterTemplate,
+ zodValidate,
+} from 'nhs-notify-web-template-management-utils';
+import { z } from 'zod';
+import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
+import { NHSNotifyBackLink } from '@atoms/NHSNotifyBackLink/NHSNotifyBackLink';
+import { LetterRender } from '@molecules/LetterRender';
+import PreviewTemplateDetailsAuthoringLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsAuthoringLetter';
+import { getTemplate } from '@utils/form-actions';
+import content from '@content/content';
+import { NHSNotifyContainer } from '@layouts/container/container';
+
+const { approvedPageTitle, backLinkText, links } =
+ content.pages.previewLetterTemplate;
+
+export async function generateMetadata(): Promise {
+ return {
+ title: approvedPageTitle,
+ };
+}
+
+export default async function PreviewApprovedLetterTemplatePage({
+ params,
+}: TemplatePageProps) {
+ const { templateId } = await params;
+
+ const template = await getTemplate(templateId);
+
+ const validatedTemplate = zodValidate(
+ z.intersection(
+ $AuthoringLetterTemplate,
+ z.object({
+ templateStatus: z.enum(['PROOF_APPROVED', 'SUBMITTED']),
+ })
+ ),
+ template
+ );
+
+ if (!validatedTemplate) {
+ return redirect('/invalid-template', RedirectType.replace);
+ }
+
+ return (
+
+
+
+ {backLinkText}
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/frontend/src/app/preview-submitted-letter-template/[templateId]/page.tsx b/frontend/src/app/preview-submitted-letter-template/[templateId]/page.tsx
index 1d86da630..be1026f29 100644
--- a/frontend/src/app/preview-submitted-letter-template/[templateId]/page.tsx
+++ b/frontend/src/app/preview-submitted-letter-template/[templateId]/page.tsx
@@ -1,16 +1,18 @@
'use server';
import {
+ $PdfLetterTemplate,
TemplatePageProps,
- validateSubmittedLetterTemplate,
+ zodValidate,
} from 'nhs-notify-web-template-management-utils';
import { getTemplate } from '@utils/form-actions';
import { redirect, RedirectType } from 'next/navigation';
import { Metadata } from 'next';
import content from '@content/content';
import { PreviewSubmittedTemplate } from '@molecules/PreviewSubmittedTemplate/PreviewSubmittedTemplate';
-import PreviewTemplateDetailsLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsLetter';
+import PreviewTemplateDetailsPdfLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter';
import { NHSNotifyContainer } from '@layouts/container/container';
+import { z } from 'zod';
const { pageTitle } = content.pages.previewSubmittedLetterTemplate;
@@ -25,7 +27,15 @@ const PreviewSubmittedLetterTemplatePage = async (props: TemplatePageProps) => {
const template = await getTemplate(templateId);
- const validatedTemplate = validateSubmittedLetterTemplate(template);
+ const validatedTemplate = zodValidate(
+ z.intersection(
+ $PdfLetterTemplate,
+ z.object({
+ templateStatus: z.literal('SUBMITTED'),
+ })
+ ),
+ template
+ );
if (!validatedTemplate) {
redirect('/invalid-template', RedirectType.replace);
@@ -35,7 +45,7 @@ const PreviewSubmittedLetterTemplatePage = async (props: TemplatePageProps) => {
);
diff --git a/frontend/src/components/molecules/LetterRender/LetterRender.tsx b/frontend/src/components/molecules/LetterRender/LetterRender.tsx
index 8cc802466..fd350a19d 100644
--- a/frontend/src/components/molecules/LetterRender/LetterRender.tsx
+++ b/frontend/src/components/molecules/LetterRender/LetterRender.tsx
@@ -8,8 +8,10 @@ import Link from 'next/link';
export function LetterRender({
template,
+ hideEditActions,
}: {
template: AuthoringLetterTemplate;
+ hideEditActions?: boolean;
}) {
const { letterRender: copy } = content.components;
@@ -28,10 +30,18 @@ export function LetterRender({
{copy.tabs.long}
-
+
-
+
diff --git a/frontend/src/components/molecules/LetterRender/LetterRenderDetails.tsx b/frontend/src/components/molecules/LetterRender/LetterRenderDetails.tsx
new file mode 100644
index 000000000..73e3d5cf8
--- /dev/null
+++ b/frontend/src/components/molecules/LetterRender/LetterRenderDetails.tsx
@@ -0,0 +1,60 @@
+'use client';
+
+import { Label } from 'nhsuk-react-components';
+import type { AuthoringLetterTemplate } from 'nhs-notify-web-template-management-utils';
+import content from '@content/content';
+import {
+ LONG_EXAMPLE_RECIPIENTS,
+ SHORT_EXAMPLE_RECIPIENTS,
+} from '@content/example-recipients';
+import type { PersonalisedRenderKey } from '@utils/types';
+
+type LetterRenderDetailsProps = {
+ template: AuthoringLetterTemplate;
+ tab: PersonalisedRenderKey;
+};
+
+export function LetterRenderDetails({
+ template,
+ tab,
+}: LetterRenderDetailsProps) {
+ const { letterRender: copy } = content.components;
+
+ const hasCustomFields =
+ template.customPersonalisation && template.customPersonalisation.length > 0;
+
+ const render = template.files[tab];
+
+ return (
+ <>
+ {copy.pdsSection.heading}
+
+
+
+ {
+ [...SHORT_EXAMPLE_RECIPIENTS, ...LONG_EXAMPLE_RECIPIENTS].find(
+ ({ id }) => id === render?.systemPersonalisationPackId
+ )?.name
+ }
+
+
+ {hasCustomFields && (
+ <>
+
+ {copy.customSection.heading}
+
+ {template.customPersonalisation!.map((field) => {
+ return (
+
+
+
+ {render?.personalisationParameters?.[field]}
+
+
+ );
+ })}
+ >
+ )}
+ >
+ );
+}
diff --git a/frontend/src/components/molecules/LetterRender/LetterRenderForm.tsx b/frontend/src/components/molecules/LetterRender/LetterRenderForm.tsx
index 8bbca6e03..8a9794338 100644
--- a/frontend/src/components/molecules/LetterRender/LetterRenderForm.tsx
+++ b/frontend/src/components/molecules/LetterRender/LetterRenderForm.tsx
@@ -17,6 +17,7 @@ import { PERSONALISATION_FORMDATA_PREFIX } from '@utils/constants';
type LetterRenderFormProps = {
template: AuthoringLetterTemplate;
tab: PersonalisedRenderKey;
+ hideEditActions?: boolean;
};
export function LetterRenderForm({ template, tab }: LetterRenderFormProps) {
diff --git a/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx b/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
index d34ac8e4d..41c4f3fab 100644
--- a/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
+++ b/frontend/src/components/molecules/LetterRender/LetterRenderTab.tsx
@@ -10,6 +10,7 @@ import {
useNHSNotifyForm,
} from '@providers/form-provider';
import type { RenderDetails } from 'nhs-notify-web-template-management-types';
+import { LetterRenderDetails } from './LetterRenderDetails';
import { LetterRenderForm } from './LetterRenderForm';
import { LetterRenderIframe } from './LetterRenderIframe';
import { updateLetterPreview } from './server-action';
@@ -24,6 +25,7 @@ const { loadingText } = content.components.letterRender;
type LetterRenderTabProps = {
template: AuthoringLetterTemplate;
tab: PersonalisedRenderKey;
+ hideEditActions?: boolean;
};
function buildPdfUrl(template: AuthoringLetterTemplate, fileName: string) {
@@ -74,34 +76,48 @@ function LetterRenderTabContent({
template,
tab,
pdfUrl,
+ hideEditActions,
}: {
template: AuthoringLetterTemplate;
tab: PersonalisedRenderKey;
pdfUrl: string | null;
+ hideEditActions?: boolean;
}) {
const [_state, _dispatch, isPending] = useNHSNotifyForm();
return (
-
+ {hideEditActions ? (
+
+ ) : (
+
+ )}
-
{loadingText}}
- forcePolling={isPending}
- >
+ {hideEditActions ? (
-
+ ) : (
+
{loadingText}}
+ forcePolling={isPending}
+ >
+
+
+ )}
);
}
-export function LetterRenderTab({ template, tab }: LetterRenderTabProps) {
+export function LetterRenderTab({
+ template,
+ tab,
+ hideEditActions,
+}: LetterRenderTabProps) {
const personalisedRender = template.files[tab];
const formState = deriveFormState(template, personalisedRender);
@@ -112,7 +128,12 @@ export function LetterRenderTab({ template, tab }: LetterRenderTabProps) {
initialState={formState}
serverAction={updateLetterPreview}
>
-
+
);
}
diff --git a/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx b/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx
index 5246b778f..c420bdf9e 100644
--- a/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx
+++ b/frontend/src/components/molecules/MessageTemplates/MessageTemplates.tsx
@@ -11,6 +11,7 @@ import {
previewTemplatePages,
templateTypeDisplayMappings,
previewSubmittedTemplatePages,
+ previewApprovedTemplatePages,
templateDisplayCopyAction,
templateDisplayDeleteAction,
statusToDisplayMapping,
@@ -23,6 +24,14 @@ import { useFeatureFlags } from '@providers/client-config-provider';
const messageTemplatesContent = content.pages.messageTemplates;
const generateViewTemplateLink = (template: TemplateDto): string => {
+ if (
+ template.templateStatus === 'PROOF_APPROVED' &&
+ template.templateType === 'LETTER' &&
+ template.letterVersion === 'AUTHORING'
+ ) {
+ return `/${previewApprovedTemplatePages(template.templateType)}/${template.id}`;
+ }
+
if (template.templateStatus === 'SUBMITTED') {
return `/${previewSubmittedTemplatePages(template.templateType)}/${template.id}`;
}
diff --git a/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx b/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
index fd7695557..d58a5f643 100644
--- a/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
+++ b/frontend/src/components/organisms/PreviewPdfLetterTemplate/PreviewPdfLetterTemplate.tsx
@@ -1,7 +1,7 @@
'use client';
import Link from 'next/link';
-import PreviewTemplateDetailsLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter';
+import PreviewTemplateDetailsPdfLetter from '@molecules/PreviewTemplateDetails/PreviewTemplateDetailsPdfLetter';
import content from '@content/content';
import type { PdfLetterTemplate } from 'nhs-notify-web-template-management-utils';
import { isRightToLeft } from 'nhs-notify-web-template-management-utils/enum';
@@ -94,7 +94,7 @@ export function PreviewPdfLetterTemplate({
}}
/>
)}
-
+
{template.templateStatus === 'PROOF_AVAILABLE' ? (
diff --git a/frontend/src/content/content.ts b/frontend/src/content/content.ts
index 5390949a5..2e2d50cd1 100644
--- a/frontend/src/content/content.ts
+++ b/frontend/src/content/content.ts
@@ -522,6 +522,7 @@ const previewLetterTitle = generatePageTitle('Preview letter template');
const previewLetterTemplate = {
pageTitle: previewLetterTitle,
+ approvedPageTitle: generatePageTitle('Preview approved letter template'),
backLinkText: backToAllTemplates,
approveButtonText: 'Approve template',
submitText: 'Submit template',
diff --git a/frontend/src/middleware.ts b/frontend/src/middleware.ts
index 09d175b13..8b2c870b0 100644
--- a/frontend/src/middleware.ts
+++ b/frontend/src/middleware.ts
@@ -44,6 +44,7 @@ const protectedPaths = [
/^\/message-plans$/,
/^\/message-templates$/,
/^\/nhs-app-template-submitted\/[^/]+$/,
+ /^\/preview-approved-letter-template\/[^/]+$/,
/^\/preview-email-template\/[^/]+$/,
/^\/preview-letter-template\/[^/]+$/,
/^\/preview-nhs-app-template\/[^/]+$/,
diff --git a/package-lock.json b/package-lock.json
index 2141c4d2b..726f3d1f3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -57,8 +57,8 @@
"version": "0.1.0",
"dependencies": {
"@aws-amplify/adapter-nextjs": "^1.7.1",
- "@aws-amplify/ui-react": "^6.9.4",
- "aws-amplify": "^6.13.6",
+ "@aws-amplify/ui-react": "^6.15.2",
+ "aws-amplify": "^6.16.3",
"classnames": "^2.5.1",
"clsx": "^2.1.1",
"date-fns": "^4.1.0",
@@ -104,6 +104,88 @@
"whatwg-fetch": "^3.6.20"
}
},
+ "frontend/node_modules/@aws-amplify/ui": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/@aws-amplify/ui/-/ui-6.15.2.tgz",
+ "integrity": "sha512-w8ElY62cjBIKGOPEkEMXAtwrAoDYMLizfdIuR3KWDI8ta8Riv0l8nZt7N2EtraUnD7RxWUKgzR3kcBtFoPUbRA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "csstype": "^3.1.1",
+ "lodash": "4.17.23",
+ "tslib": "^2.5.2"
+ },
+ "peerDependencies": {
+ "@aws-amplify/core": "*",
+ "aws-amplify": "^6.14.3",
+ "xstate": "^4.33.6"
+ },
+ "peerDependenciesMeta": {
+ "xstate": {
+ "optional": true
+ }
+ }
+ },
+ "frontend/node_modules/@aws-amplify/ui-react": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/@aws-amplify/ui-react/-/ui-react-6.15.2.tgz",
+ "integrity": "sha512-8eXVnyl8eLPKGXaJ3CEt1mNwWKJ98El5nVz9NnKzoW1/B5cPhc96yVzIzHmyAyMROLKArzWOC4unx/RLN1YDBA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-amplify/ui": "6.15.2",
+ "@aws-amplify/ui-react-core": "3.6.2",
+ "@radix-ui/react-direction": "^1.1.0",
+ "@radix-ui/react-dropdown-menu": "^2.1.10",
+ "@radix-ui/react-slider": "^1.3.2",
+ "@xstate/react": "^3.2.2",
+ "lodash": "4.17.23",
+ "qrcode": "1.5.0",
+ "tslib": "^2.5.2"
+ },
+ "peerDependencies": {
+ "@aws-amplify/core": "*",
+ "aws-amplify": "^6.14.3",
+ "react": "^16.14.0 || ^17.0 || ^18.0 || ^19",
+ "react-dom": "^16.14 || ^17 || ^18 || ^19"
+ },
+ "peerDependenciesMeta": {
+ "aws-amplify": {
+ "optional": true
+ }
+ }
+ },
+ "frontend/node_modules/@aws-amplify/ui-react-core": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/@aws-amplify/ui-react-core/-/ui-react-core-3.6.2.tgz",
+ "integrity": "sha512-wVyE9DFMJebGp1pLkcvohtGPFL6fpXH7lHiU/1fndPLUrUpHJFxslHAT3LGTwztThC27iM3hap+BcEewFiaqJA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-amplify/ui": "6.15.2",
+ "@xstate/react": "^3.2.2",
+ "lodash": "4.17.23",
+ "react-hook-form": "7.53.2",
+ "xstate": "^4.33.6"
+ },
+ "peerDependencies": {
+ "aws-amplify": "^6.14.3",
+ "react": "^16.14 || ^17 || ^18 || ^19"
+ }
+ },
+ "frontend/node_modules/aws-amplify": {
+ "version": "6.16.3",
+ "resolved": "https://registry.npmjs.org/aws-amplify/-/aws-amplify-6.16.3.tgz",
+ "integrity": "sha512-yWuvctncVzSI5K40k2LiZTTKu6p1O7YpbmFfbM9luAFssUj2P2DmgJgs2IQ0ArpJTi++QrAT5L4F60qxTpGTIA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-amplify/analytics": "7.0.93",
+ "@aws-amplify/api": "6.3.24",
+ "@aws-amplify/auth": "6.19.1",
+ "@aws-amplify/core": "6.16.1",
+ "@aws-amplify/datastore": "5.1.5",
+ "@aws-amplify/notifications": "2.0.93",
+ "@aws-amplify/storage": "6.13.2",
+ "tslib": "^2.5.0"
+ }
+ },
"lambdas/authorizer": {
"name": "nhs-notify-templates-api-authorizer",
"version": "0.0.1",
@@ -2566,20 +2648,6 @@
"@aws-sdk/client-dynamodb": "^3.995.0"
}
},
- "lambdas/backend-api/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"lambdas/backend-api/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -2589,24 +2657,6 @@
"node": ">=18.0.0"
}
},
- "lambdas/backend-api/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"lambdas/backend-client": {
"name": "nhs-notify-backend-client",
"version": "0.0.1",
@@ -3204,20 +3254,6 @@
}
}
},
- "lambdas/event-publisher/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"lambdas/event-publisher/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -3227,24 +3263,6 @@
"node": ">=18.0.0"
}
},
- "lambdas/event-publisher/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"lambdas/letter-preview-renderer": {
"name": "nhs-notify-templates-letter-preview-renderer",
"version": "0.0.1",
@@ -4046,20 +4064,6 @@
}
}
},
- "lambdas/letter-preview-renderer/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"lambdas/letter-preview-renderer/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -4069,24 +4073,6 @@
"node": ">=18.0.0"
}
},
- "lambdas/letter-preview-renderer/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"lambdas/sftp-letters": {
"name": "nhs-notify-sftp-letters-lambdas",
"version": "0.0.1",
@@ -4927,20 +4913,6 @@
}
}
},
- "lambdas/sftp-letters/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"lambdas/sftp-letters/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -4950,24 +4922,6 @@
"node": ">=18.0.0"
}
},
- "lambdas/sftp-letters/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"node_modules/@adobe/css-tools": {
"version": "4.4.4",
"resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz",
@@ -5293,16 +5247,16 @@
}
},
"node_modules/@aws-amplify/storage": {
- "version": "6.13.1",
- "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-6.13.1.tgz",
- "integrity": "sha512-iNDUmdvevcujcW4PBY7IGBMeTm+nohsZgswH6k99tG0myVsZRg0lVC4l5lcwoXoyVLpQjOmfZ0JgwV0oQbZ6zg==",
+ "version": "6.13.2",
+ "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-6.13.2.tgz",
+ "integrity": "sha512-XMhFXrEYD/x/cd5qvTnMa/xhbpJjZZyva2ea0wmLedLqY1glWyhKPmSi2PAfhhpkWcvA50XnQ/g9KaZsog5hww==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "3.973.1",
"@smithy/md5-js": "2.0.7",
"buffer": "4.9.2",
"crc-32": "1.2.2",
- "fast-xml-parser": "^5.3.4",
+ "fast-xml-parser": "^5.3.6",
"tslib": "^2.5.0"
},
"peerDependencies": {
@@ -5322,18 +5276,6 @@
"node": ">=20.0.0"
}
},
- "node_modules/@aws-amplify/storage/node_modules/@smithy/is-array-buffer": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
- "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
"node_modules/@aws-amplify/storage/node_modules/@smithy/md5-js": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.7.tgz",
@@ -5345,110 +5287,6 @@
"tslib": "^2.5.0"
}
},
- "node_modules/@aws-amplify/storage/node_modules/@smithy/md5-js/node_modules/@smithy/types": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
- "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
- "license": "Apache-2.0",
- "dependencies": {
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@aws-amplify/storage/node_modules/@smithy/util-buffer-from": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
- "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/is-array-buffer": "^2.2.0",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@aws-amplify/storage/node_modules/@smithy/util-utf8": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
- "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/util-buffer-from": "^2.2.0",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@aws-amplify/ui": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/@aws-amplify/ui/-/ui-6.15.0.tgz",
- "integrity": "sha512-oHI0GrIiTKivqeBUZdcj/WbF+1iHa2U89Dk1wHWDgyNi9IX7LCADCvbL8EFZBC1/Z0GgzP9kS/nDG5AP9DOsLg==",
- "license": "Apache-2.0",
- "dependencies": {
- "csstype": "^3.1.1",
- "lodash": "4.17.23",
- "tslib": "^2.5.2"
- },
- "peerDependencies": {
- "@aws-amplify/core": "*",
- "aws-amplify": "^6.14.3",
- "xstate": "^4.33.6"
- },
- "peerDependenciesMeta": {
- "xstate": {
- "optional": true
- }
- }
- },
- "node_modules/@aws-amplify/ui-react": {
- "version": "6.15.0",
- "resolved": "https://registry.npmjs.org/@aws-amplify/ui-react/-/ui-react-6.15.0.tgz",
- "integrity": "sha512-aH0H40TKl0KQ0pPCiopBS82Et5d8md1LlgiEBdQjbDK4ATMTa8qYGt1wAKgj8e74Q8S0PH+vxODJeTrbi/jdUw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-amplify/ui": "6.15.0",
- "@aws-amplify/ui-react-core": "3.6.0",
- "@radix-ui/react-direction": "^1.1.0",
- "@radix-ui/react-dropdown-menu": "^2.1.10",
- "@radix-ui/react-slider": "^1.3.2",
- "@xstate/react": "^3.2.2",
- "lodash": "4.17.23",
- "qrcode": "1.5.0",
- "tslib": "^2.5.2"
- },
- "peerDependencies": {
- "@aws-amplify/core": "*",
- "aws-amplify": "^6.14.3",
- "react": "^16.14.0 || ^17.0 || ^18.0 || ^19",
- "react-dom": "^16.14 || ^17 || ^18 || ^19"
- },
- "peerDependenciesMeta": {
- "aws-amplify": {
- "optional": true
- }
- }
- },
- "node_modules/@aws-amplify/ui-react-core": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/@aws-amplify/ui-react-core/-/ui-react-core-3.6.0.tgz",
- "integrity": "sha512-RkKuTQjBZH4q/XoVEAn8w/1B88WHRBw/+HFZt/u08tqRcxNU3fTMp5XcnVGWALCyD/ji5TkGdrmAG09qjKr7ow==",
- "license": "Apache-2.0",
- "dependencies": {
- "@aws-amplify/ui": "6.15.0",
- "@xstate/react": "^3.2.2",
- "lodash": "4.17.23",
- "react-hook-form": "7.53.2",
- "xstate": "^4.33.6"
- },
- "peerDependencies": {
- "aws-amplify": "^6.14.3",
- "react": "^16.14 || ^17 || ^18 || ^19"
- }
- },
"node_modules/@aws-crypto/crc32": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@aws-crypto/crc32/-/crc32-5.2.0.tgz",
@@ -6107,20 +5945,6 @@
}
}
},
- "node_modules/@aws-sdk/client-firehose/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.6",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.6.tgz",
- "integrity": "sha512-YrXu+UnfC8IdARa4ZkrpcyuRmA/TVgYW6Lcdtvi34NQgRjM1hTirNirN+rGb+s/kNomby8oJiIAu0KNbiZC7PA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.12.1",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/@aws-sdk/client-firehose/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -6590,20 +6414,6 @@
}
}
},
- "node_modules/@aws-sdk/client-kinesis/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.6",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.6.tgz",
- "integrity": "sha512-YrXu+UnfC8IdARa4ZkrpcyuRmA/TVgYW6Lcdtvi34NQgRjM1hTirNirN+rGb+s/kNomby8oJiIAu0KNbiZC7PA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.12.1",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/@aws-sdk/client-kinesis/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -7069,20 +6879,6 @@
}
}
},
- "node_modules/@aws-sdk/client-personalize-events/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.6",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.6.tgz",
- "integrity": "sha512-YrXu+UnfC8IdARa4ZkrpcyuRmA/TVgYW6Lcdtvi34NQgRjM1hTirNirN+rGb+s/kNomby8oJiIAu0KNbiZC7PA==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.12.1",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/@aws-sdk/client-personalize-events/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -7548,20 +7344,6 @@
}
}
},
- "node_modules/@aws-sdk/client-sns/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.8",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.8.tgz",
- "integrity": "sha512-Ql8elcUdYCha83Ol7NznBsgN5GVZnv3vUd86fEc6waU6oUdY0T1O9NODkEEOS/Uaogr87avDrUC6DSeM4oXjZg==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/@aws-sdk/client-sns/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -7719,13 +7501,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-login": {
- "version": "3.972.20",
- "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz",
- "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==",
+ "version": "3.972.21",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.21.tgz",
+ "integrity": "sha512-ENU+YCiuQocQjfIf9bPxZ+ZY0wIBkl3SMH22optBQwy8UFpSfonHynXzGT27xQxer4cYTNOpwDqbfo57BusbpQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "^3.973.20",
- "@aws-sdk/nested-clients": "^3.996.10",
+ "@aws-sdk/core": "^3.973.21",
+ "@aws-sdk/nested-clients": "^3.996.11",
"@aws-sdk/types": "^3.973.6",
"@smithy/property-provider": "^4.2.12",
"@smithy/protocol-http": "^5.3.12",
@@ -7738,19 +7520,19 @@
}
},
"node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/core": {
- "version": "3.973.20",
- "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.20.tgz",
- "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==",
+ "version": "3.973.21",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.973.21.tgz",
+ "integrity": "sha512-OTUcDX9Yfz/FLKbHjiMaP9D4Hs44lYJzN7zBcrK2nDmBt0Wr8D6nYt12QoBkZsW0nVMFsTIGaZCrsU9zCcIMXQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-sdk/types": "^3.973.6",
- "@aws-sdk/xml-builder": "^3.972.11",
- "@smithy/core": "^3.23.11",
+ "@aws-sdk/xml-builder": "^3.972.12",
+ "@smithy/core": "^3.23.12",
"@smithy/node-config-provider": "^4.3.12",
"@smithy/property-provider": "^4.2.12",
"@smithy/protocol-http": "^5.3.12",
"@smithy/signature-v4": "^5.3.12",
- "@smithy/smithy-client": "^4.12.5",
+ "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1",
"@smithy/util-base64": "^4.3.2",
"@smithy/util-middleware": "^4.2.12",
@@ -7807,15 +7589,15 @@
}
},
"node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/middleware-user-agent": {
- "version": "3.972.21",
- "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz",
- "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==",
+ "version": "3.972.22",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.22.tgz",
+ "integrity": "sha512-pZPNGWZVQvgUIO/P9PXZNz7ciq9mLYb/wQEurg3phKTa3DiBIunIRcgA0eBNwmog6S3oy0KR1bv4EJ4ld9A5sQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/core": "^3.973.20",
+ "@aws-sdk/core": "^3.973.21",
"@aws-sdk/types": "^3.973.6",
"@aws-sdk/util-endpoints": "^3.996.5",
- "@smithy/core": "^3.23.11",
+ "@smithy/core": "^3.23.12",
"@smithy/protocol-http": "^5.3.12",
"@smithy/types": "^4.13.1",
"@smithy/util-retry": "^4.2.12",
@@ -7826,44 +7608,44 @@
}
},
"node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/nested-clients": {
- "version": "3.996.10",
- "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz",
- "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==",
+ "version": "3.996.11",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.996.11.tgz",
+ "integrity": "sha512-i7SwoSR4JB/79JoGDUACnFUQOZwXGLWNX35lIb1Pq72nUGlVV+RFZp+BLa8S+mog2pbXU9+6Kc5YwGiMi5bKhQ==",
"license": "Apache-2.0",
"dependencies": {
"@aws-crypto/sha256-browser": "5.2.0",
"@aws-crypto/sha256-js": "5.2.0",
- "@aws-sdk/core": "^3.973.20",
+ "@aws-sdk/core": "^3.973.21",
"@aws-sdk/middleware-host-header": "^3.972.8",
"@aws-sdk/middleware-logger": "^3.972.8",
"@aws-sdk/middleware-recursion-detection": "^3.972.8",
- "@aws-sdk/middleware-user-agent": "^3.972.21",
+ "@aws-sdk/middleware-user-agent": "^3.972.22",
"@aws-sdk/region-config-resolver": "^3.972.8",
"@aws-sdk/types": "^3.973.6",
"@aws-sdk/util-endpoints": "^3.996.5",
"@aws-sdk/util-user-agent-browser": "^3.972.8",
- "@aws-sdk/util-user-agent-node": "^3.973.7",
+ "@aws-sdk/util-user-agent-node": "^3.973.8",
"@smithy/config-resolver": "^4.4.11",
- "@smithy/core": "^3.23.11",
+ "@smithy/core": "^3.23.12",
"@smithy/fetch-http-handler": "^5.3.15",
"@smithy/hash-node": "^4.2.12",
"@smithy/invalid-dependency": "^4.2.12",
"@smithy/middleware-content-length": "^4.2.12",
- "@smithy/middleware-endpoint": "^4.4.25",
- "@smithy/middleware-retry": "^4.4.42",
- "@smithy/middleware-serde": "^4.2.14",
+ "@smithy/middleware-endpoint": "^4.4.26",
+ "@smithy/middleware-retry": "^4.4.43",
+ "@smithy/middleware-serde": "^4.2.15",
"@smithy/middleware-stack": "^4.2.12",
"@smithy/node-config-provider": "^4.3.12",
- "@smithy/node-http-handler": "^4.4.16",
+ "@smithy/node-http-handler": "^4.5.0",
"@smithy/protocol-http": "^5.3.12",
- "@smithy/smithy-client": "^4.12.5",
+ "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1",
"@smithy/url-parser": "^4.2.12",
"@smithy/util-base64": "^4.3.2",
"@smithy/util-body-length-browser": "^4.2.2",
"@smithy/util-body-length-node": "^4.2.3",
- "@smithy/util-defaults-mode-browser": "^4.3.41",
- "@smithy/util-defaults-mode-node": "^4.2.44",
+ "@smithy/util-defaults-mode-browser": "^4.3.42",
+ "@smithy/util-defaults-mode-node": "^4.2.45",
"@smithy/util-endpoints": "^3.3.3",
"@smithy/util-middleware": "^4.2.12",
"@smithy/util-retry": "^4.2.12",
@@ -7932,12 +7714,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/util-user-agent-node": {
- "version": "3.973.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz",
- "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==",
+ "version": "3.973.8",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.8.tgz",
+ "integrity": "sha512-Kvb96TafGPLYo4Z2GRCzQTne77epXgiZEo0DDXwavzkWmgDV/1XD1tMA766gzRcHHFUraWsE+4T8DKtPTZUxgQ==",
"license": "Apache-2.0",
"dependencies": {
- "@aws-sdk/middleware-user-agent": "^3.972.21",
+ "@aws-sdk/middleware-user-agent": "^3.972.22",
"@aws-sdk/types": "^3.973.6",
"@smithy/node-config-provider": "^4.3.12",
"@smithy/types": "^4.13.1",
@@ -7956,20 +7738,6 @@
}
}
},
- "node_modules/@aws-sdk/credential-provider-login/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.11",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz",
- "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.1",
- "fast-xml-parser": "5.4.1",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"node_modules/@aws-sdk/credential-provider-login/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.4.tgz",
@@ -8352,17 +8120,17 @@
}
},
"node_modules/@aws-sdk/xml-builder": {
- "version": "3.911.0",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.911.0.tgz",
- "integrity": "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==",
+ "version": "3.972.13",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.13.tgz",
+ "integrity": "sha512-I/+BMxM4WE/6xL0tyV7tAUDOAXmyw/va1oGr/eSly43HmLUcD1G+v96vEKAA8VoLcZ03ZQo/PWzjmN9zQErqPQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/types": "^4.7.1",
- "fast-xml-parser": "5.2.5",
+ "@smithy/types": "^4.13.1",
+ "fast-xml-parser": "5.5.6",
"tslib": "^2.6.2"
},
"engines": {
- "node": ">=18.0.0"
+ "node": ">=20.0.0"
}
},
"node_modules/@aws/lambda-invoke-store": {
@@ -12876,9 +12644,9 @@
}
},
"node_modules/@smithy/core": {
- "version": "3.23.11",
- "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.11.tgz",
- "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==",
+ "version": "3.23.12",
+ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz",
+ "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/protocol-http": "^5.3.12",
@@ -12887,7 +12655,7 @@
"@smithy/util-base64": "^4.3.2",
"@smithy/util-body-length-browser": "^4.2.2",
"@smithy/util-middleware": "^4.2.12",
- "@smithy/util-stream": "^4.5.19",
+ "@smithy/util-stream": "^4.5.20",
"@smithy/util-utf8": "^4.2.2",
"@smithy/uuid": "^1.1.2",
"tslib": "^2.6.2"
@@ -13096,13 +12864,13 @@
}
},
"node_modules/@smithy/middleware-endpoint": {
- "version": "4.4.25",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz",
- "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==",
+ "version": "4.4.26",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz",
+ "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.23.11",
- "@smithy/middleware-serde": "^4.2.14",
+ "@smithy/core": "^3.23.12",
+ "@smithy/middleware-serde": "^4.2.15",
"@smithy/node-config-provider": "^4.3.12",
"@smithy/shared-ini-file-loader": "^4.4.7",
"@smithy/types": "^4.13.1",
@@ -13115,15 +12883,15 @@
}
},
"node_modules/@smithy/middleware-retry": {
- "version": "4.4.42",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz",
- "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==",
+ "version": "4.4.43",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz",
+ "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/node-config-provider": "^4.3.12",
"@smithy/protocol-http": "^5.3.12",
"@smithy/service-error-classification": "^4.2.12",
- "@smithy/smithy-client": "^4.12.5",
+ "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1",
"@smithy/util-middleware": "^4.2.12",
"@smithy/util-retry": "^4.2.12",
@@ -13135,12 +12903,12 @@
}
},
"node_modules/@smithy/middleware-serde": {
- "version": "4.2.14",
- "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz",
- "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==",
+ "version": "4.2.15",
+ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz",
+ "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.23.11",
+ "@smithy/core": "^3.23.12",
"@smithy/protocol-http": "^5.3.12",
"@smithy/types": "^4.13.1",
"tslib": "^2.6.2"
@@ -13178,9 +12946,9 @@
}
},
"node_modules/@smithy/node-http-handler": {
- "version": "4.4.16",
- "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz",
- "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==",
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz",
+ "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/abort-controller": "^4.2.12",
@@ -13291,17 +13059,17 @@
}
},
"node_modules/@smithy/smithy-client": {
- "version": "4.12.5",
- "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.5.tgz",
- "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==",
+ "version": "4.12.6",
+ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.12.6.tgz",
+ "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==",
"license": "Apache-2.0",
"dependencies": {
- "@smithy/core": "^3.23.11",
- "@smithy/middleware-endpoint": "^4.4.25",
+ "@smithy/core": "^3.23.12",
+ "@smithy/middleware-endpoint": "^4.4.26",
"@smithy/middleware-stack": "^4.2.12",
"@smithy/protocol-http": "^5.3.12",
"@smithy/types": "^4.13.1",
- "@smithy/util-stream": "^4.5.19",
+ "@smithy/util-stream": "^4.5.20",
"tslib": "^2.6.2"
},
"engines": {
@@ -13398,13 +13166,13 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
- "version": "4.3.41",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz",
- "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==",
+ "version": "4.3.42",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz",
+ "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/property-provider": "^4.2.12",
- "@smithy/smithy-client": "^4.12.5",
+ "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1",
"tslib": "^2.6.2"
},
@@ -13413,16 +13181,16 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
- "version": "4.2.44",
- "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz",
- "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==",
+ "version": "4.2.45",
+ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz",
+ "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/config-resolver": "^4.4.11",
"@smithy/credential-provider-imds": "^4.2.12",
"@smithy/node-config-provider": "^4.3.12",
"@smithy/property-provider": "^4.2.12",
- "@smithy/smithy-client": "^4.12.5",
+ "@smithy/smithy-client": "^4.12.6",
"@smithy/types": "^4.13.1",
"tslib": "^2.6.2"
},
@@ -13484,13 +13252,13 @@
}
},
"node_modules/@smithy/util-stream": {
- "version": "4.5.19",
- "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.19.tgz",
- "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==",
+ "version": "4.5.20",
+ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.20.tgz",
+ "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==",
"license": "Apache-2.0",
"dependencies": {
"@smithy/fetch-http-handler": "^5.3.15",
- "@smithy/node-http-handler": "^4.4.16",
+ "@smithy/node-http-handler": "^4.5.0",
"@smithy/types": "^4.13.1",
"@smithy/util-base64": "^4.3.2",
"@smithy/util-buffer-from": "^4.2.2",
@@ -15456,6 +15224,97 @@
"tslib": "^2.5.0"
}
},
+ "node_modules/aws-amplify/node_modules/@aws-amplify/storage": {
+ "version": "6.13.1",
+ "resolved": "https://registry.npmjs.org/@aws-amplify/storage/-/storage-6.13.1.tgz",
+ "integrity": "sha512-iNDUmdvevcujcW4PBY7IGBMeTm+nohsZgswH6k99tG0myVsZRg0lVC4l5lcwoXoyVLpQjOmfZ0JgwV0oQbZ6zg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@aws-sdk/types": "3.973.1",
+ "@smithy/md5-js": "2.0.7",
+ "buffer": "4.9.2",
+ "crc-32": "1.2.2",
+ "fast-xml-parser": "^5.3.4",
+ "tslib": "^2.5.0"
+ },
+ "peerDependencies": {
+ "@aws-amplify/core": "^6.1.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@aws-sdk/types": {
+ "version": "3.973.1",
+ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.973.1.tgz",
+ "integrity": "sha512-DwHBiMNOB468JiX6+i34c+THsKHErYUdNQ3HexeXZvVn4zouLjgaS4FejiGSi2HyBuzuyHg7SuOPmjSvoU9NRg==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^4.12.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@smithy/is-array-buffer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz",
+ "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@smithy/md5-js": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@smithy/md5-js/-/md5-js-2.0.7.tgz",
+ "integrity": "sha512-2i2BpXF9pI5D1xekqUsgQ/ohv5+H//G9FlawJrkOJskV18PgJ8LiNbLiskMeYt07yAsSTZR7qtlcAaa/GQLWww==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/types": "^2.3.1",
+ "@smithy/util-utf8": "^2.0.0",
+ "tslib": "^2.5.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@smithy/md5-js/node_modules/@smithy/types": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz",
+ "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@smithy/util-buffer-from": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz",
+ "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/is-array-buffer": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/aws-amplify/node_modules/@smithy/util-utf8": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz",
+ "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@smithy/util-buffer-from": "^2.2.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/aws-jwt-verify": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/aws-jwt-verify/-/aws-jwt-verify-4.0.1.tgz",
@@ -18604,21 +18463,24 @@
"license": "BSD-3-Clause"
},
"node_modules/fast-xml-builder": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz",
- "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==",
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz",
+ "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
- "license": "MIT"
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.1.3"
+ }
},
"node_modules/fast-xml-parser": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz",
- "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==",
+ "version": "5.5.6",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz",
+ "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==",
"funding": [
{
"type": "github",
@@ -18627,7 +18489,8 @@
],
"license": "MIT",
"dependencies": {
- "fast-xml-builder": "^1.0.0",
+ "fast-xml-builder": "^1.1.4",
+ "path-expression-matcher": "^1.1.3",
"strnum": "^2.1.2"
},
"bin": {
@@ -23419,6 +23282,21 @@
"node": ">=8"
}
},
+ "node_modules/path-expression-matcher": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz",
+ "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
@@ -30848,20 +30726,6 @@
"@aws-sdk/client-dynamodb": "^3.995.0"
}
},
- "tests/test-team/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"tests/test-team/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -30871,24 +30735,6 @@
"node": ">=18.0.0"
}
},
- "tests/test-team/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
- },
"utils/backend-config": {
"name": "nhs-notify-web-template-management-util-backend-config",
"version": "0.0.1",
@@ -32424,20 +32270,6 @@
"node": ">=20.0.0"
}
},
- "utils/utils/node_modules/@aws-sdk/xml-builder": {
- "version": "3.972.7",
- "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.7.tgz",
- "integrity": "sha512-9GF86s6mHuc1TYCbuKatMDWl2PyK3KIkpRaI7ul2/gYZPfaLzKZ+ISHhxzVb9KVeakf75tUQe6CXW2gugSCXNw==",
- "license": "Apache-2.0",
- "dependencies": {
- "@smithy/types": "^4.13.0",
- "fast-xml-parser": "5.3.6",
- "tslib": "^2.6.2"
- },
- "engines": {
- "node": ">=20.0.0"
- }
- },
"utils/utils/node_modules/@aws/lambda-invoke-store": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.3.tgz",
@@ -32446,24 +32278,6 @@
"engines": {
"node": ">=18.0.0"
}
- },
- "utils/utils/node_modules/fast-xml-parser": {
- "version": "5.3.6",
- "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.3.6.tgz",
- "integrity": "sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "strnum": "^2.1.2"
- },
- "bin": {
- "fxparser": "src/cli/cli.js"
- }
}
}
}
diff --git a/package.json b/package.json
index df1b30227..16f461361 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,7 @@
},
"name": "nhs-notify-web-template-management",
"overrides": {
- "fast-xml-parser": "^5.3.6",
+ "fast-xml-parser": "^5.5.6",
"flatted": "^3.4.0",
"immutable": "^5.1.5",
"nhsuk-react-components": {
diff --git a/tests/test-team/pages/letter/index.ts b/tests/test-team/pages/letter/index.ts
index ce9976760..3616e9561 100644
--- a/tests/test-team/pages/letter/index.ts
+++ b/tests/test-team/pages/letter/index.ts
@@ -1,5 +1,6 @@
export * from './template-mgmt-edit-template-campaign-page';
export * from './template-mgmt-edit-template-name-page';
+export * from './template-mgmt-preview-approved-letter-page';
export * from './template-mgmt-preview-letter-page';
export * from './template-mgmt-preview-submitted-letter-page';
export * from './template-mgmt-submit-letter-page';
diff --git a/tests/test-team/pages/letter/template-mgmt-preview-approved-letter-page.ts b/tests/test-team/pages/letter/template-mgmt-preview-approved-letter-page.ts
new file mode 100644
index 000000000..2a2dd019c
--- /dev/null
+++ b/tests/test-team/pages/letter/template-mgmt-preview-approved-letter-page.ts
@@ -0,0 +1,6 @@
+import { TemplateMgmtPreviewSubmittedBasePage } from '../template-mgmt-preview-submitted-base-page';
+
+export class TemplateMgmtPreviewApprovedLetterPage extends TemplateMgmtPreviewSubmittedBasePage {
+ static readonly pathTemplate =
+ '/preview-approved-letter-template/:templateId';
+}
diff --git a/tests/test-team/template-mgmt-accessibility/letter-templates.accessibility.spec.ts b/tests/test-team/template-mgmt-accessibility/letter-templates.accessibility.spec.ts
index 39d331b7e..a81ee986c 100644
--- a/tests/test-team/template-mgmt-accessibility/letter-templates.accessibility.spec.ts
+++ b/tests/test-team/template-mgmt-accessibility/letter-templates.accessibility.spec.ts
@@ -10,6 +10,7 @@ import { TemplateFactory } from 'helpers/factories/template-factory';
import {
TemplateMgmtEditTemplateCampaignPage,
TemplateMgmtEditTemplateNamePage,
+ TemplateMgmtPreviewApprovedLetterPage,
TemplateMgmtPreviewLetterPage,
TemplateMgmtPreviewSubmittedLetterPage,
TemplateMgmtSubmitLetterPage,
@@ -33,6 +34,7 @@ const templateIds = {
LETTER_ERROR: randomUUID(),
LETTER_SUBMITTED: randomUUID(),
LETTER_PROOF: randomUUID(),
+ LETTER_PROOF_APPROVED: randomUUID(),
LETTER_PROOF_DISABLED: randomUUID(),
};
let defaultUser: TestUser;
@@ -79,6 +81,13 @@ test.beforeAll(async () => {
'VALIDATION_FAILED'
);
+ const letterProofApproved = TemplateFactory.createAuthoringLetterTemplate(
+ templateIds.LETTER_PROOF_APPROVED,
+ defaultUser,
+ `Proof approved letter template - ${templateIds.LETTER_PROOF_APPROVED}`,
+ 'PROOF_APPROVED'
+ );
+
const letterSubmitted = TemplateFactory.uploadLetterTemplate(
templateIds.LETTER_SUBMITTED,
defaultUser,
@@ -107,6 +116,7 @@ test.beforeAll(async () => {
letterSubmitted,
letterProof,
letterProofDisabled,
+ letterProofApproved,
]);
});
@@ -155,6 +165,14 @@ test.describe('Letter templates', () => {
)
));
+ test('Preview approved letter template', async ({ page, analyze }) =>
+ analyze(
+ new TemplateMgmtPreviewApprovedLetterPage(page).setPathParam(
+ 'templateId',
+ templateIds.LETTER_PROOF_APPROVED
+ )
+ ));
+
test('Preview submitted letter template', async ({ page, analyze }) =>
analyze(
new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam(
diff --git a/tests/test-team/template-mgmt-accessibility/route-coverage.accessibility.spec.ts b/tests/test-team/template-mgmt-accessibility/route-coverage.accessibility.spec.ts
index e10c1099a..1cbbde04b 100644
--- a/tests/test-team/template-mgmt-accessibility/route-coverage.accessibility.spec.ts
+++ b/tests/test-team/template-mgmt-accessibility/route-coverage.accessibility.spec.ts
@@ -47,6 +47,7 @@ import {
import {
TemplateMgmtEditTemplateCampaignPage,
TemplateMgmtEditTemplateNamePage,
+ TemplateMgmtPreviewApprovedLetterPage,
TemplateMgmtPreviewLetterPage,
TemplateMgmtPreviewSubmittedLetterPage,
TemplateMgmtSubmitLetterPage,
@@ -136,6 +137,7 @@ const allPages: (typeof TemplateMgmtBasePage)[] = [
TemplateMgmtUploadLetterMissingCampaignClientIdPage,
TemplateMgmtEditTemplateNamePage,
TemplateMgmtEditTemplateCampaignPage,
+ TemplateMgmtPreviewApprovedLetterPage,
TemplateMgmtPreviewLetterPage,
TemplateMgmtPreviewSubmittedLetterPage,
TemplateMgmtSubmitLetterPage,
diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-campaign.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-campaign.component.spec.ts
index ada5e23b9..3f36c88b3 100644
--- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-campaign.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-campaign.component.spec.ts
@@ -270,7 +270,7 @@ test.describe('Edit Template Campaign page', () => {
await editPage.loadPage();
await expect(page).toHaveURL(
- `/templates/preview-submitted-letter-template/${template.id}`
+ `/templates/preview-approved-letter-template/${template.id}`
);
});
});
diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-name.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-name.component.spec.ts
index c047379fd..d75ef1abd 100644
--- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-name.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-edit-template-name.component.spec.ts
@@ -243,7 +243,7 @@ test.describe('Edit Template Name page', () => {
await editPage.loadPage();
await expect(page).toHaveURL(
- `/templates/preview-submitted-letter-template/${template.id}`
+ `/templates/preview-approved-letter-template/${template.id}`
);
});
});
diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-approved-letter-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-approved-letter-page.component.spec.ts
new file mode 100644
index 000000000..17c2c992c
--- /dev/null
+++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-approved-letter-page.component.spec.ts
@@ -0,0 +1,134 @@
+import { test, expect } from '@playwright/test';
+import { TemplateStorageHelper } from '../../helpers/db/template-storage-helper';
+import { TemplateMgmtPreviewApprovedLetterPage } from '../../pages/letter/template-mgmt-preview-approved-letter-page';
+import { TemplateFactory } from '../../helpers/factories/template-factory';
+import {
+ assertFooterLinks,
+ assertSignOutLink,
+ assertHeaderLogoLink,
+ assertSkipToMainContent,
+ assertAndClickBackLinkTop,
+} from '../../helpers/template-mgmt-common.steps';
+import {
+ createAuthHelper,
+ TestUser,
+ testUsers,
+} from '../../helpers/auth/cognito-auth-helper';
+
+function createTemplates(user: TestUser) {
+ return {
+ valid: TemplateFactory.createAuthoringLetterTemplate(
+ 'e8b5f3a1-2c4d-4e6f-8a9b-1c2d3e4f5a6b',
+ user,
+ 'authoring-letter-template-preview-approved-valid',
+ 'SUBMITTED'
+ ),
+ invalid: TemplateFactory.createAuthoringLetterTemplate(
+ 'e2a5b238-ecbf-42c8-90f1-0cf544a9c0ae',
+ user,
+ 'authoring-letter-template-preview-approved-invalid',
+ 'NOT_A_STATUS'
+ ),
+ };
+}
+
+test.describe('Preview submitted Letter message template Page', () => {
+ let templates: ReturnType;
+ const templateStorageHelper = new TemplateStorageHelper();
+
+ test.beforeAll(async () => {
+ const user = await createAuthHelper().getTestUser(testUsers.User1.userId);
+ templates = createTemplates(user);
+ await templateStorageHelper.seedTemplateData(Object.values(templates));
+ });
+
+ test.afterAll(async () => {
+ await templateStorageHelper.deleteSeededTemplates();
+ });
+
+ test('when user visits page, then page is loaded with template details', async ({
+ page,
+ baseURL,
+ }) => {
+ const previewSubmittedLetterTemplatePage =
+ new TemplateMgmtPreviewApprovedLetterPage(page).setPathParam(
+ 'templateId',
+ templates.valid.id
+ );
+
+ await previewSubmittedLetterTemplatePage.loadPage();
+
+ await expect(page).toHaveURL(
+ `${baseURL}/templates/preview-approved-letter-template/${templates.valid.id}`
+ );
+
+ await expect(previewSubmittedLetterTemplatePage.pageHeading).toContainText(
+ templates.valid.name
+ );
+
+ expect(templates.valid.campaignId).toBeTruthy();
+
+ await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText(
+ templates.valid.campaignId!
+ );
+
+ await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText(
+ 'Locked'
+ );
+
+ await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0);
+ });
+
+ test.describe('Page functionality', () => {
+ test('common page tests', async ({ page, baseURL }) => {
+ const props = {
+ page: new TemplateMgmtPreviewApprovedLetterPage(page).setPathParam(
+ 'templateId',
+ templates.valid.id
+ ),
+ baseURL,
+ };
+
+ await assertSkipToMainContent(props);
+ await assertHeaderLogoLink(props);
+ await assertSignOutLink(props);
+ await assertFooterLinks(props);
+ await assertAndClickBackLinkTop({
+ ...props,
+ expectedUrl: `templates/message-templates`,
+ });
+ });
+ });
+
+ test.describe('Error handling', () => {
+ test('when user visits page with an unsubmitted template, then an invalid template error is displayed', async ({
+ baseURL,
+ page,
+ }) => {
+ const previewSubmittedLetterTemplatePage =
+ new TemplateMgmtPreviewApprovedLetterPage(page).setPathParam(
+ 'templateId',
+ templates.invalid.id
+ );
+
+ await previewSubmittedLetterTemplatePage.loadPage();
+
+ await expect(page).toHaveURL(`${baseURL}/templates/invalid-template`);
+ });
+
+ test('when user visits page with a fake template, then an invalid template error is displayed', async ({
+ baseURL,
+ page,
+ }) => {
+ const previewSubmittedLetterTemplatePage =
+ new TemplateMgmtPreviewApprovedLetterPage(page).setPathParam(
+ 'templateId',
+ 'fake-template-id'
+ );
+
+ await previewSubmittedLetterTemplatePage.loadPage();
+
+ await expect(page).toHaveURL(`${baseURL}/templates/invalid-template`);
+ });
+ });
+});
diff --git a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
index 42d29d411..667f26eeb 100644
--- a/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/letter/template-mgmt-preview-submitted-letter-page.component.spec.ts
@@ -39,16 +39,8 @@ function createTemplates(user: TestUser) {
},
};
- const authoringValid = TemplateFactory.createAuthoringLetterTemplate(
- 'e8b5f3a1-2c4d-4e6f-8a9b-1c2d3e4f5a6b',
- user,
- 'authoring-letter-template-preview-submitted',
- 'SUBMITTED'
- );
-
return {
valid,
- authoringValid,
invalid: {
...TemplateFactory.uploadLetterTemplate(
'621456cf-ace3-49c3-941e-4df5eba11373',
@@ -74,74 +66,37 @@ test.describe('Preview submitted Letter message template Page', () => {
await templateStorageHelper.deleteSeededTemplates();
});
- test.describe('PDF letter', () => {
- test('when user visits page, then page is loaded', async ({
- page,
- baseURL,
- }) => {
- const previewSubmittedLetterTemplatePage =
- new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam(
- 'templateId',
- templates.valid.id
- );
-
- await previewSubmittedLetterTemplatePage.loadPage();
-
- await expect(page).toHaveURL(
- `${baseURL}/templates/preview-submitted-letter-template/${templates.valid.id}`
+ test('when user visits page, then page is loaded', async ({
+ page,
+ baseURL,
+ }) => {
+ const previewSubmittedLetterTemplatePage =
+ new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam(
+ 'templateId',
+ templates.valid.id
);
- await expect(
- previewSubmittedLetterTemplatePage.pageHeading
- ).toContainText(templates.valid.name);
+ await previewSubmittedLetterTemplatePage.loadPage();
- expect(templates.valid.campaignId).toBeTruthy();
+ await expect(page).toHaveURL(
+ `${baseURL}/templates/preview-submitted-letter-template/${templates.valid.id}`
+ );
- await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText(
- templates.valid.campaignId!
- );
+ await expect(previewSubmittedLetterTemplatePage.pageHeading).toContainText(
+ templates.valid.name
+ );
- await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText(
- 'Submitted'
- );
+ expect(templates.valid.campaignId).toBeTruthy();
- await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0);
- });
- });
+ await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText(
+ templates.valid.campaignId!
+ );
- test.describe('AUTHORING letter', () => {
- test('when user visits page, then page is loaded with template details', async ({
- page,
- baseURL,
- }) => {
- const previewSubmittedLetterTemplatePage =
- new TemplateMgmtPreviewSubmittedLetterPage(page).setPathParam(
- 'templateId',
- templates.authoringValid.id
- );
-
- await previewSubmittedLetterTemplatePage.loadPage();
+ await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText(
+ 'Submitted'
+ );
- await expect(page).toHaveURL(
- `${baseURL}/templates/preview-submitted-letter-template/${templates.authoringValid.id}`
- );
-
- await expect(
- previewSubmittedLetterTemplatePage.pageHeading
- ).toContainText(templates.authoringValid.name);
-
- expect(templates.authoringValid.campaignId).toBeTruthy();
-
- await expect(previewSubmittedLetterTemplatePage.campaignId).toContainText(
- templates.authoringValid.campaignId!
- );
-
- await expect(previewSubmittedLetterTemplatePage.statusTag).toHaveText(
- 'Locked'
- );
-
- await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0);
- });
+ await expect(previewSubmittedLetterTemplatePage.copyLink).toHaveCount(0);
});
test.describe('Page functionality', () => {
diff --git a/tests/test-team/template-mgmt-component-tests/template-protected-routes.component.spec.ts b/tests/test-team/template-mgmt-component-tests/template-protected-routes.component.spec.ts
index 7f7258b94..ffd8f2ac3 100644
--- a/tests/test-team/template-mgmt-component-tests/template-protected-routes.component.spec.ts
+++ b/tests/test-team/template-mgmt-component-tests/template-protected-routes.component.spec.ts
@@ -60,6 +60,7 @@ import { RoutingGetReadyToMovePage } from 'pages/routing/get-ready-to-move-page'
import { RoutingPreviewMessagePlanPage } from 'pages/routing/preview-message-plan-page';
import { RoutingReviewAndMoveToProductionPage } from 'pages/routing';
import { getAppRoutes } from 'helpers/get-app-routes';
+import { TemplateMgmtPreviewApprovedLetterPage } from 'pages/letter/template-mgmt-preview-approved-letter-page';
// Reset storage state for this file to avoid being authenticated
test.use({ storageState: { cookies: [], origins: [] } });
@@ -101,6 +102,7 @@ const protectedPages = [
TemplateMgmtEditTemplateNamePage,
TemplateMgmtInvalidTemplatePage,
TemplateMgmtMessageTemplatesPage,
+ TemplateMgmtPreviewApprovedLetterPage,
TemplateMgmtPreviewEmailPage,
TemplateMgmtPreviewLetterPage,
TemplateMgmtPreviewNhsAppPage,
diff --git a/tests/test-team/template-mgmt-e2e-tests/routing.e2e.spec.ts b/tests/test-team/template-mgmt-e2e-tests/routing.e2e.spec.ts
index 159faf373..87e1f518e 100644
--- a/tests/test-team/template-mgmt-e2e-tests/routing.e2e.spec.ts
+++ b/tests/test-team/template-mgmt-e2e-tests/routing.e2e.spec.ts
@@ -164,6 +164,8 @@ test.describe('Routing', () => {
test('templates are added to the routing config, and the routing config is completed', async ({
page,
}) => {
+ test.setTimeout(90_000);
+
const rcName = 'E2E TEST RC';
const messageTemplatesPage = new TemplateMgmtMessageTemplatesPage(page);
@@ -180,12 +182,12 @@ test.describe('Routing', () => {
{ template: templates.POLISH_LETTER, expectedStatus: 'Locked' },
{ template: templates.EMAIL, expectedStatus: 'Draft' },
{ template: templates.SMS, expectedStatus: 'Draft' },
- { template: templates.LETTER, expectedStatus: 'Proof approved' },
+ { template: templates.LETTER, expectedStatus: 'Approved' },
{
template: templates.LARGE_PRINT_LETTER,
- expectedStatus: 'Proof approved',
+ expectedStatus: 'Approved',
},
- { template: templates.ARABIC_LETTER, expectedStatus: 'Proof approved' },
+ { template: templates.ARABIC_LETTER, expectedStatus: 'Approved' },
]);
});
@@ -432,7 +434,7 @@ test.describe('Routing', () => {
{
template: templates.LARGE_PRINT_LETTER,
// this was removed before going to production
- expectedStatus: 'Proof approved',
+ expectedStatus: 'Approved',
},
]);
});
diff --git a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap
index cae975aac..a3bd95392 100644
--- a/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap
+++ b/utils/utils/src/__tests__/__snapshots__/enum.test.ts.snap
@@ -324,11 +324,11 @@ exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=false l
exports[`statusToDisplayMapping status=PROOF_APPROVED type=EMAIL routing=true letterVersion=undefined 1`] = `"Proof approved"`;
-exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Proof approved"`;
+exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=AUTHORING 1`] = `"Approved"`;
exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=false letterVersion=PDF 1`] = `"Proof approved"`;
-exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Proof approved"`;
+exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=AUTHORING 1`] = `"Approved"`;
exports[`statusToDisplayMapping status=PROOF_APPROVED type=LETTER routing=true letterVersion=PDF 1`] = `"Proof approved"`;
diff --git a/utils/utils/src/__tests__/enum.test.ts b/utils/utils/src/__tests__/enum.test.ts
index 7b733c01b..52606698d 100644
--- a/utils/utils/src/__tests__/enum.test.ts
+++ b/utils/utils/src/__tests__/enum.test.ts
@@ -42,6 +42,7 @@ import {
isLanguage,
getMessageOrderOptions,
MESSAGE_ORDER_OPTIONS_LIST,
+ previewApprovedTemplatePages,
} from '../enum';
describe('templateTypeDisplayMappings', () => {
@@ -367,6 +368,14 @@ describe('previewSubmittedTemplatePages', () => {
});
});
+describe('previewApprovedTemplatePages', () => {
+ test('EMAIL', () => {
+ expect(previewApprovedTemplatePages('LETTER')).toEqual(
+ 'preview-approved-letter-template'
+ );
+ });
+});
+
describe('templateDisplayCopyAction', () => {
test.each<[TemplateType, TemplateStatus, boolean]>([
['NHS_APP', 'SUBMITTED', true],
diff --git a/utils/utils/src/enum.ts b/utils/utils/src/enum.ts
index f5534cb2b..6c212efd2 100644
--- a/utils/utils/src/enum.ts
+++ b/utils/utils/src/enum.ts
@@ -167,7 +167,8 @@ export const statusToDisplayMapping = (
VIRUS_SCAN_FAILED: 'Checks failed',
WAITING_FOR_PROOF: 'Waiting for proof',
PROOF_AVAILABLE: 'Proof available',
- PROOF_APPROVED: 'Proof approved',
+ PROOF_APPROVED:
+ template.letterVersion === 'AUTHORING' ? 'Approved' : 'Proof approved',
};
return statusToDisplayMappings[template.templateStatus];
@@ -279,6 +280,8 @@ export const previewTemplatePages = (type: TemplateType) =>
`preview-${legacyTemplateTypeToUrlTextMappings(type)}-template`;
export const previewSubmittedTemplatePages = (type: TemplateType) =>
`preview-submitted-${legacyTemplateTypeToUrlTextMappings(type)}-template`;
+export const previewApprovedTemplatePages = (type: TemplateType) =>
+ `preview-approved-${legacyTemplateTypeToUrlTextMappings(type)}-template`;
export const messagePlanChooseTemplateUrl = (
type: TemplateType,