From 7c5f4366c22851d8c76f04b18fb4dadf41a4cd34 Mon Sep 17 00:00:00 2001 From: Tejas G Date: Tue, 2 Jul 2024 13:15:39 +0800 Subject: [PATCH 1/9] fix(encrypt-submission): add missing ndi response fields (#7425) * fix(encrypt-submission): add missing ndi response fields * fix(tests): fix e2e testing for email notifs on encrypt-form * fix: remove attachment tests temporarily * fix: fix comment for email test * test: add encrypt tests for nric masking in email notifs * test: enable jest tests * fix: fix comment for tests * test: fix verifyEncryptSubmission test --- .github/workflows/playwright.yml | 2 + __tests__/e2e/email-submission.spec.ts | 26 ++--- __tests__/e2e/encrypt-submission.spec.ts | 14 +-- __tests__/e2e/helpers/createForm.ts | 7 +- __tests__/e2e/helpers/verifySubmission.ts | 51 +++++++-- __tests__/e2e/utils/mail.ts | 22 +++- __tests__/e2e/utils/settings.ts | 26 ++++- playwright.config.ts | 9 +- .../submission/ParsedResponsesObject.class.ts | 2 +- .../email-submission.controller.spec.ts | 2 +- .../encrypt-submission.controller.spec.ts | 101 +++++++++++++++++- .../encrypt-submission.controller.ts | 37 ++++++- 12 files changed, 247 insertions(+), 52 deletions(-) diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index 9beadd2eba..fc1aa5608b 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -8,6 +8,8 @@ jobs: test: timeout-minutes: 40 runs-on: ubuntu-latest + env: + AWS_SDK_JS_SUPPRESS_MAINTENANCE_MODE_MESSAGE: 1 steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 diff --git a/__tests__/e2e/email-submission.spec.ts b/__tests__/e2e/email-submission.spec.ts index 8fcc03bfbe..93ff448eb9 100644 --- a/__tests__/e2e/email-submission.spec.ts +++ b/__tests__/e2e/email-submission.spec.ts @@ -28,7 +28,7 @@ import { createMyInfoField, createOptionalVersion, deleteDocById, - getSettings, + getEmailSettings, makeModel, makeMongooseFixtures, } from './utils' @@ -58,7 +58,7 @@ test.describe('Email form submission', () => { // Define const formFields = ALL_FIELDS const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -76,7 +76,7 @@ test.describe('Email form submission', () => { createBlankVersion(createOptionalVersion(ff)), ) const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -98,10 +98,10 @@ test.describe('Email form submission', () => { title: `Attachment ${i}`, path: `__tests__/e2e/files/att-folder-${i}/test-att.txt`, val: `${i === 2 ? '' : `${2 - i}-`}test-att.txt`, - } as E2eFieldMetadata), + }) as E2eFieldMetadata, ) const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -135,7 +135,7 @@ test.describe('Email form submission', () => { } as E2eFieldMetadata, ] const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -151,7 +151,7 @@ test.describe('Email form submission', () => { // Define const formFields = ALL_FIELDS const formLogics = NO_LOGIC - const formSettings = getSettings({ + const formSettings = getEmailSettings({ authType: FormAuthType.SP, }) @@ -169,7 +169,7 @@ test.describe('Email form submission', () => { // Define const formFields = ALL_FIELDS const formLogics = NO_LOGIC - const formSettings = getSettings({ + const formSettings = getEmailSettings({ authType: FormAuthType.CP, }) @@ -187,7 +187,7 @@ test.describe('Email form submission', () => { // Define const formFields = ALL_FIELDS const formLogics = NO_LOGIC - const formSettings = getSettings({ + const formSettings = getEmailSettings({ authType: FormAuthType.SGID, }) @@ -216,7 +216,7 @@ test.describe('Email form submission', () => { createMyInfoField(MyInfoAttribute.WorkpassStatus, 'Live', false), ] const formLogics = NO_LOGIC - const formSettings = getSettings({ + const formSettings = getEmailSettings({ authType: FormAuthType.MyInfo, }) @@ -233,7 +233,7 @@ test.describe('Email form submission', () => { }) => { // Define const { formFields, formLogics } = TEST_ALL_FIELDS_SHOWN_BY_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -248,7 +248,7 @@ test.describe('Email form submission', () => { }) => { // Define const { formFields, formLogics } = TEST_FIELD_HIDDEN_BY_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test await runEmailSubmissionTest(page, Form, { @@ -264,7 +264,7 @@ test.describe('Email form submission', () => { // Define const { formFields, formLogics, preventSubmitMessage } = TEST_SUBMISSION_DISABLED_BY_CHAINED_LOGIC - const formSettings = getSettings() + const formSettings = getEmailSettings() // Test const { form } = await createForm(page, Form, FormResponseMode.Email, { diff --git a/__tests__/e2e/encrypt-submission.spec.ts b/__tests__/e2e/encrypt-submission.spec.ts index e487065a13..03325670c6 100644 --- a/__tests__/e2e/encrypt-submission.spec.ts +++ b/__tests__/e2e/encrypt-submission.spec.ts @@ -26,7 +26,7 @@ import { createMyInfoField, createOptionalVersion, deleteDocById, - getSettings, + getEncryptSettings, makeModel, makeMongooseFixtures, } from './utils' @@ -61,7 +61,7 @@ test.describe('Storage form submission', () => { // Define const formFields = ALL_FIELDS const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEncryptSettings() // Test await runEncryptSubmissionTest(page, Form, { @@ -79,7 +79,7 @@ test.describe('Storage form submission', () => { createBlankVersion(createOptionalVersion(ff)), ) const formLogics = NO_LOGIC - const formSettings = getSettings() + const formSettings = getEncryptSettings() // Test await runEncryptSubmissionTest(page, Form, { @@ -94,7 +94,7 @@ test.describe('Storage form submission', () => { }) => { // Define const { formFields, formLogics } = TEST_ALL_FIELDS_SHOWN_BY_LOGIC - const formSettings = getSettings() + const formSettings = getEncryptSettings() // Test await runEncryptSubmissionTest(page, Form, { @@ -109,7 +109,7 @@ test.describe('Storage form submission', () => { }) => { // Define const { formFields, formLogics } = TEST_FIELD_HIDDEN_BY_LOGIC - const formSettings = getSettings() + const formSettings = getEncryptSettings() // Test await runEncryptSubmissionTest(page, Form, { @@ -125,7 +125,7 @@ test.describe('Storage form submission', () => { // Define const { formFields, formLogics, preventSubmitMessage } = TEST_SUBMISSION_DISABLED_BY_CHAINED_LOGIC - const formSettings = getSettings() + const formSettings = getEncryptSettings() // Test const { form } = await createForm(page, Form, FormResponseMode.Encrypt, { @@ -158,7 +158,7 @@ test.describe('Storage form submission', () => { createMyInfoField(MyInfoAttribute.WorkpassStatus, 'Live', false), ] const formLogics = NO_LOGIC - const formSettings = getSettings({ + const formSettings = getEncryptSettings({ authType: FormAuthType.MyInfo, }) diff --git a/__tests__/e2e/helpers/createForm.ts b/__tests__/e2e/helpers/createForm.ts index f8f19603c5..01f6a9dcff 100644 --- a/__tests__/e2e/helpers/createForm.ts +++ b/__tests__/e2e/helpers/createForm.ts @@ -171,10 +171,7 @@ const addSettings = async ( await expect(page).toHaveURL(ADMIN_FORM_PAGE_SETTINGS(formId)) await addGeneralSettings(page, formSettings) - // Encrypt mode forms don't have an email - if (formResponseMode.responseMode === FormResponseMode.Encrypt) { - await addAdminEmails(page, formSettings) - } + await addAdminEmails(page, formSettings) await addAuthSettings(page, formSettings) await addCollaborators(page, formSettings) @@ -385,6 +382,8 @@ const addAdminEmails = async ( await emailInput.fill(formSettings.emails.join(', ')) + await page.keyboard.press('Tab') + await expectToast(page, /emails successfully updated/i) } } diff --git a/__tests__/e2e/helpers/verifySubmission.ts b/__tests__/e2e/helpers/verifySubmission.ts index 5ed73f0fe8..a13dbe7437 100644 --- a/__tests__/e2e/helpers/verifySubmission.ts +++ b/__tests__/e2e/helpers/verifySubmission.ts @@ -50,7 +50,7 @@ export const verifySubmission = async ( // Verify the submission content switch (formResponseMode.responseMode) { case FormResponseMode.Email: - await verifyEmailSubmission(data) + await verifyEmailSubmission(page, data) break case FormResponseMode.Encrypt: await verifyEncryptSubmission(page, { @@ -87,14 +87,17 @@ export const verifySubmission = async ( * @param {E2eFieldMetadata[]} formFields the field metadata used to create and fill the form * @param {E2eSettingsOptions} formSettings the form settings used to create the form */ -export const verifyEmailSubmission = async ({ - form, - responseId, - formFields, - formSettings, -}: VerifySubmissionBaseInputs): Promise => { +export const verifyEmailSubmission = async ( + page: Page, + { form, responseId, formFields, formSettings }: VerifySubmissionBaseInputs, +): Promise => { // Get the submission from the email, via the subject. - const submission = await getSubmission(form.title, responseId) + const submission = await getSubmission( + page, + form.title, + responseId, + FormResponseMode.Email, + ) // Verify email metadata expect(submission.from).toContain(MAIL_FROM) @@ -120,6 +123,7 @@ export const verifyEmailSubmission = async ({ getResponseTitle(field, { mode: FormResponseMode.Email }), ...responseArray, ]) + if (!submission.attachments) continue expectAttachment(field, submission.attachments) } @@ -166,7 +170,21 @@ export const verifyEncryptSubmission = async ( if (formSettings.emails) { // (Optional) Step 1: Verify that there's an email notification in maildev // Get the submission from the email, via the subject. - const submission = await getSubmission(form.title, responseId) + await page.evaluate( + ([responseId, form_title]) => { + console.log( + `Checking maildev for submission_id=${responseId} for form=${form_title}`, + ) + }, + [responseId, form.title], + ) + + const submission = await getSubmission( + page, + form.title, + responseId, + FormResponseMode.Encrypt, + ) // Verify email metadata expect(submission.from).toContain(MAIL_FROM) @@ -186,13 +204,15 @@ export const verifyEncryptSubmission = async ( // Verify form responses in email for (const field of formFields) { const responseArray = getResponseArray(field, { - mode: FormResponseMode.Email, + mode: FormResponseMode.Encrypt, + csv: false, }) if (!responseArray) continue expectSubmissionContains([ - getResponseTitle(field, { mode: FormResponseMode.Email }), + getResponseTitle(field, { mode: FormResponseMode.Encrypt, csv: false }), ...responseArray, ]) + if (!submission.attachments) continue expectAttachment(field, submission.attachments) } @@ -218,6 +238,15 @@ export const verifyEncryptSubmission = async ( // Step 2: Download the response using secret key + // await page.evaluate( + // ([responseId, form_title]) => { + // console.log( + // `Downloading response using secret key for submission_id=${responseId} for form=${form_title}`, + // ) + // }, + // [responseId, form.title], + // ) + // Go to the responses summary page and enter the secret key await page.goto(ADMIN_FORM_PAGE_RESPONSES(form._id)) await page.getByLabel(/Enter or upload Secret Key/).fill(secretKey) diff --git a/__tests__/e2e/utils/mail.ts b/__tests__/e2e/utils/mail.ts index f42207ba88..64e9b2fd6b 100644 --- a/__tests__/e2e/utils/mail.ts +++ b/__tests__/e2e/utils/mail.ts @@ -1,4 +1,6 @@ +import { Page } from '@playwright/test' import axios from 'axios' +import { FormResponseMode } from 'shared/types' // Maildev default port is 1080. const MAIL_URL = 'http://0.0.0.0:1080' @@ -29,7 +31,7 @@ type EmailSubmission = { from: string[] subject: string html: string - attachments: Record + attachments?: Record } // Sleep util, needed before getting mail to give mail server some time to receive email. @@ -82,15 +84,26 @@ export const extractOtp = async (recipient: string): Promise => { * @returns {object} subject, sender, recipient and html content of email */ export const getSubmission = async ( + page: Page, formName: string, responseId: string, + responseMode: FormResponseMode, ): Promise => { const subject = `formsg-auto: ${formName} (#${responseId})` const emails = await getEmailsBy((e) => e.subject === subject) const lastEmail = emails.pop() - if (!lastEmail) throw Error(`mailbox does not contain subject "${subject}"`) + if (!lastEmail) { + const err_msg = `mailbox does not contain subject "${subject}"` + await page.evaluate( + ([err_msg]) => { + console.log(err_msg) + }, + [err_msg], + ) + throw Error(err_msg) + } const submission = { responseId, @@ -98,7 +111,10 @@ export const getSubmission = async ( from: lastEmail.from.map((p) => p.address), subject: lastEmail.subject, html: lastEmail.html, - attachments: await getSubmissionAttachments(lastEmail), + attachments: + responseMode === FormResponseMode.Email + ? await getSubmissionAttachments(lastEmail) + : undefined, } await MAIL_CLIENT.deleteById(lastEmail.id) diff --git a/__tests__/e2e/utils/settings.ts b/__tests__/e2e/utils/settings.ts index f92581f6d0..3a6664a241 100644 --- a/__tests__/e2e/utils/settings.ts +++ b/__tests__/e2e/utils/settings.ts @@ -1,8 +1,21 @@ -import { FormAuthType, FormStatus } from 'shared/types' +import { FormAuthType, FormResponseMode, FormStatus } from 'shared/types' +import { ADMIN_EMAIL } from '../constants' import { E2eSettingsOptions } from '../constants/settings' -export const getSettings = ( +export const getEncryptSettings = ( + custom?: Partial, +): E2eSettingsOptions => { + return _getSettings(FormResponseMode.Encrypt, custom) +} + +export const getEmailSettings = ( + custom?: Partial, +): E2eSettingsOptions => { + return _getSettings(FormResponseMode.Email, custom) +} +const _getSettings = ( + responseMode: FormResponseMode, custom?: Partial, ): E2eSettingsOptions => { // Inject form auth settings @@ -24,11 +37,18 @@ export const getSettings = ( } } - return { + // Create + const settings: E2eSettingsOptions = { status: FormStatus.Public, collaborators: [], authType: FormAuthType.NIL, // By default, if emails is undefined, only the admin (current user) will receive. ...custom, } + + if (responseMode === FormResponseMode.Encrypt) { + settings.emails = [ADMIN_EMAIL] + } + + return settings } diff --git a/playwright.config.ts b/playwright.config.ts index df42a70499..c9410c09c3 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -1,5 +1,4 @@ -import type { PlaywrightTestConfig } from '@playwright/test' -import { devices } from '@playwright/test' +import { defineConfig, devices } from '@playwright/test' import dotenv from 'dotenv' import path from 'path' @@ -10,7 +9,7 @@ dotenv.config({ /** * See https://playwright.dev/docs/test-configuration. */ -const config: PlaywrightTestConfig = { +export default defineConfig({ testDir: './__tests__/e2e', /* Maximum time one test can run for. */ timeout: 120 * 1000, @@ -107,6 +106,4 @@ const config: PlaywrightTestConfig = { reuseExistingServer: !process.env.CI, }, ], -} - -export default config +}) diff --git a/src/app/modules/submission/ParsedResponsesObject.class.ts b/src/app/modules/submission/ParsedResponsesObject.class.ts index 2ee6e0d03d..db774149d7 100644 --- a/src/app/modules/submission/ParsedResponsesObject.class.ts +++ b/src/app/modules/submission/ParsedResponsesObject.class.ts @@ -41,7 +41,7 @@ type NdiUserInfo = export default class ParsedResponsesObject { public ndiResponses: ProcessedFieldResponse[] = [] - private constructor(public responses: ProcessedFieldResponse[]) {} + constructor(public responses: ProcessedFieldResponse[]) {} addNdiResponses(info: NdiUserInfo): ParsedResponsesObject { /** diff --git a/src/app/modules/submission/email-submission/__tests__/email-submission.controller.spec.ts b/src/app/modules/submission/email-submission/__tests__/email-submission.controller.spec.ts index b9ef3b1e08..9dc71a6b3e 100644 --- a/src/app/modules/submission/email-submission/__tests__/email-submission.controller.spec.ts +++ b/src/app/modules/submission/email-submission/__tests__/email-submission.controller.spec.ts @@ -163,7 +163,7 @@ describe('email-submission.controller', () => { expect( MockSubmissionService.sendEmailConfirmations, ).toHaveBeenCalledTimes(1) - // Assert nric is masked + // Assert nric is not masked expect( MockMailService.sendSubmissionToAdmin.mock.calls[0][0].formData[0] .answer, diff --git a/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.controller.spec.ts b/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.controller.spec.ts index 35e1916447..f46f8e1cbd 100644 --- a/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.controller.spec.ts +++ b/src/app/modules/submission/encrypt-submission/__tests__/encrypt-submission.controller.spec.ts @@ -59,7 +59,10 @@ const EncryptSubmission = getEncryptSubmissionModel(mongoose) describe('encrypt-submission.controller', () => { describe('nricMask', () => { beforeAll(async () => await dbHandler.connect()) - afterEach(async () => await dbHandler.clearDatabase()) + afterEach(async () => { + await dbHandler.clearDatabase() + jest.clearAllMocks() + }) afterAll(async () => await dbHandler.closeDatabase()) beforeEach(() => { @@ -189,5 +192,101 @@ describe('encrypt-submission.controller', () => { expect(savedSubmission).toBeDefined() expect(savedSubmission!.verifiedContent).toEqual(MOCK_NRIC) }) + + it('should not mask nric in email notification if form isNricMaskEnabled is false', async () => { + // Arrange + const mockFormId = new ObjectId() + const mockSpAuthTypeAndNricMaskingDisabledForm = { + _id: mockFormId, + title: 'some form', + authType: FormAuthType.SP, + isNricMaskEnabled: false, + form_fields: [] as FormFieldSchema[], + emails: ['test@example.com'], + getUniqueMyInfoAttrs: () => [] as MyInfoAttribute[], + } as IPopulatedEncryptedForm + + const MOCK_REQ = merge( + expressHandler.mockRequest({ + params: { formId: 'some id' }, + body: { + responses: [], + }, + }), + { + formsg: { + encryptedPayload: { + encryptedContent: 'encryptedContent', + version: 1, + }, + formDef: { + authType: FormAuthType.SP, + }, + encryptedFormDef: mockSpAuthTypeAndNricMaskingDisabledForm, + } as unknown as EncryptSubmissionDto, + } as unknown as FormCompleteDto, + ) as unknown as SubmitEncryptModeFormHandlerRequest + const mockRes = expressHandler.mockResponse() + + // Act + await submitEncryptModeFormForTest(MOCK_REQ, mockRes) + + // Assert + // email notification should be sent with the unmasked nric + expect(MockMailService.sendSubmissionToAdmin).toHaveBeenCalledTimes(1) + // Assert nric is not masked + expect( + MockMailService.sendSubmissionToAdmin.mock.calls[0][0].formData[0] + .answer, + ).toEqual(MOCK_NRIC) + }) + + it('should mask nric in email notification if form isNricMaskEnabled is true', async () => { + // Arrange + const mockFormId = new ObjectId() + const mockSpAuthTypeAndNricMaskingEnabledForm = { + _id: mockFormId, + title: 'some form', + authType: FormAuthType.SP, + isNricMaskEnabled: true, + form_fields: [] as FormFieldSchema[], + emails: ['test@example.com'], + getUniqueMyInfoAttrs: () => [] as MyInfoAttribute[], + } as IPopulatedEncryptedForm + + const MOCK_REQ = merge( + expressHandler.mockRequest({ + params: { formId: 'some id' }, + body: { + responses: [], + }, + }), + { + formsg: { + encryptedPayload: { + encryptedContent: 'encryptedContent', + version: 1, + }, + formDef: { + authType: FormAuthType.SP, + }, + encryptedFormDef: mockSpAuthTypeAndNricMaskingEnabledForm, + } as unknown as EncryptSubmissionDto, + } as unknown as FormCompleteDto, + ) as unknown as SubmitEncryptModeFormHandlerRequest + const mockRes = expressHandler.mockResponse() + + // Act + await submitEncryptModeFormForTest(MOCK_REQ, mockRes) + + // Assert + // email notification should be sent with the masked nric + expect(MockMailService.sendSubmissionToAdmin).toHaveBeenCalledTimes(1) + // Assert nric is masked + expect( + MockMailService.sendSubmissionToAdmin.mock.calls[0][0].formData[0] + .answer, + ).toEqual(MOCK_MASKED_NRIC) + }) }) }) diff --git a/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts b/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts index c19aac09a6..a2e5236d5b 100644 --- a/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts +++ b/src/app/modules/submission/encrypt-submission/encrypt-submission.controller.ts @@ -51,9 +51,11 @@ import * as VerifiedContentService from '../../verified-content/verified-content import * as EmailSubmissionService from '../email-submission/email-submission.service' import { SubmissionEmailObj } from '../email-submission/email-submission.util' import * as EncryptSubmissionMiddleware from '../encrypt-submission/encrypt-submission.middleware' +import ParsedResponsesObject from '../ParsedResponsesObject.class' import * as ReceiverMiddleware from '../receiver/receiver.middleware' import { SubmissionFailedError } from '../submission.errors' import { uploadAttachments } from '../submission.service' +import { ProcessedFieldResponse } from '../submission.types' import { mapRouteError } from '../submission.utils' import { reportSubmissionResponseTime } from '../submissions.statsd-client' @@ -132,6 +134,10 @@ const submitEncryptModeForm = async ( const { encryptedContent, responseMetadata, paymentProducts } = encryptedPayload + // This is because NRIC masking is done in the controller, but we parse the fields in the + // middleware for encrypt forms + const parsedResponses = new ParsedResponsesObject(req.body.responses) + // Checks if user is SPCP-authenticated before allowing submission let uinFin let userInfo @@ -257,6 +263,30 @@ const submitEncryptModeForm = async ( uinFin = maskNric(uinFin) } + // Add NDI responses + switch (form.authType) { + case FormAuthType.CP: { + if (!uinFin || !userInfo) break + parsedResponses.addNdiResponses({ + authType, + uinFin, + userInfo, + }) + break + } + case FormAuthType.SP: + case FormAuthType.SGID: + case FormAuthType.MyInfo: + case FormAuthType.SGID_MyInfo: { + if (!uinFin) break + parsedResponses.addNdiResponses({ + authType: form.authType, + uinFin, + }) + break + } + } + // Encrypt Verified SPCP Fields let verified if ( @@ -351,6 +381,7 @@ const submitEncryptModeForm = async ( formId, form, responses: req.formsg.filteredResponses, + emailFields: parsedResponses.getAllResponses(), responseMetadata, submissionContent, }) @@ -613,11 +644,13 @@ const _createSubmission = async ({ form, responseMetadata, responses, + emailFields, }: { req: Parameters[0] res: Parameters[1] responseMetadata: EncryptSubmissionDto['responseMetadata'] responses: ParsedClearFormFieldResponse[] + emailFields: ProcessedFieldResponse[] formId: string form: IPopulatedEncryptedForm submissionContent: EncryptSubmissionContent @@ -667,7 +700,7 @@ const _createSubmission = async ({ }) const emailData = new SubmissionEmailObj( - responses, + emailFields, new Set(), // the MyInfo prefixes are already inserted in middleware form.authType, ) @@ -677,7 +710,7 @@ const _createSubmission = async ({ // stop the storage of the data in the db if (((form as IEncryptedForm)?.emails || []).length > 0) { void MailService.sendSubmissionToAdmin({ - replyToEmails: EmailSubmissionService.extractEmailAnswers(responses), + replyToEmails: EmailSubmissionService.extractEmailAnswers(emailFields), form, submission: { created: createdTime, From 91cedd306d95107e3a1310a9ea3ffc72872d40c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 18:12:30 +0800 Subject: [PATCH 2/9] fix(deps): bump validator and @types/validator (#7440) Bumps [validator](https://github.com/validatorjs/validator.js) and [@types/validator](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/validator). These dependencies needed to be updated together. Updates `validator` from 13.7.0 to 13.12.0 - [Release notes](https://github.com/validatorjs/validator.js/releases) - [Changelog](https://github.com/validatorjs/validator.js/blob/master/CHANGELOG.md) - [Commits](https://github.com/validatorjs/validator.js/compare/13.7.0...13.12.0) Updates `@types/validator` from 13.7.10 to 13.12.0 - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/validator) --- updated-dependencies: - dependency-name: validator dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: "@types/validator" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 16 +++++++++------- package.json | 4 ++-- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e4a096f63..fb0679b429 100644 --- a/package-lock.json +++ b/package-lock.json @@ -106,7 +106,7 @@ "ulid": "^2.3.0", "uuid": "^9.0.0", "uuid-by-string": "^4.0.0", - "validator": "^13.7.0", + "validator": "^13.12.0", "web-streams-polyfill": "^3.2.1", "whatwg-fetch": "^3.6.2", "winston": "^3.13.0", @@ -156,7 +156,7 @@ "@types/triple-beam": "^1.3.2", "@types/uid-generator": "^2.0.3", "@types/uuid": "^9.0.8", - "@types/validator": "^13.7.10", + "@types/validator": "^13.12.0", "@typescript-eslint/eslint-plugin": "^7.7.1", "@typescript-eslint/parser": "^7.7.1", "auto-changelog": "^2.4.0", @@ -9736,9 +9736,10 @@ "dev": true }, "node_modules/@types/validator": { - "version": "13.7.10", - "dev": true, - "license": "MIT" + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==", + "dev": true }, "node_modules/@types/webidl-conversions": { "version": "7.0.2", @@ -29187,8 +29188,9 @@ "dev": true }, "node_modules/validator": { - "version": "13.7.0", - "license": "MIT", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } diff --git a/package.json b/package.json index ae4e9fd3c4..2c6acdd4d6 100644 --- a/package.json +++ b/package.json @@ -152,7 +152,7 @@ "ulid": "^2.3.0", "uuid": "^9.0.0", "uuid-by-string": "^4.0.0", - "validator": "^13.7.0", + "validator": "^13.12.0", "web-streams-polyfill": "^3.2.1", "whatwg-fetch": "^3.6.2", "winston": "^3.13.0", @@ -202,7 +202,7 @@ "@types/triple-beam": "^1.3.2", "@types/uid-generator": "^2.0.3", "@types/uuid": "^9.0.8", - "@types/validator": "^13.7.10", + "@types/validator": "^13.12.0", "@typescript-eslint/eslint-plugin": "^7.7.1", "@typescript-eslint/parser": "^7.7.1", "auto-changelog": "^2.4.0", From 52f9aec4739fae9d0023fbab01c2644f52147d89 Mon Sep 17 00:00:00 2001 From: Zhu Liang Date: Tue, 2 Jul 2024 18:15:21 +0800 Subject: [PATCH 3/9] feat(i18n): replace hardcoded text in PublicFormSubmitButton (#7427) --- .../FormFields/PublicFormSubmitButton.tsx | 24 +++++++++++++++---- .../locales/features/public-form/en-sg.ts | 9 +++++++ .../locales/features/public-form/index.ts | 9 +++++++ 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/frontend/src/features/public-form/components/FormFields/PublicFormSubmitButton.tsx b/frontend/src/features/public-form/components/FormFields/PublicFormSubmitButton.tsx index 0f511cb413..8f6e414c80 100644 --- a/frontend/src/features/public-form/components/FormFields/PublicFormSubmitButton.tsx +++ b/frontend/src/features/public-form/components/FormFields/PublicFormSubmitButton.tsx @@ -1,5 +1,6 @@ import { MouseEventHandler, useMemo, useState } from 'react' import { useFormState, UseFormTrigger, useWatch } from 'react-hook-form' +import { useTranslation } from 'react-i18next' import { Stack, useDisclosure, VisuallyHidden } from '@chakra-ui/react' import { PAYMENT_CONTACT_FIELD_ID } from '~shared/constants' @@ -37,6 +38,7 @@ export const PublicFormSubmitButton = ({ onSubmit, trigger, }: PublicFormSubmitButtonProps): JSX.Element => { + const { t } = useTranslation() const [prevPaymentId, setPrevPaymentId] = useState('') const isMobile = useIsMobile() @@ -103,15 +105,27 @@ export const PublicFormSubmitButton = ({ type="button" isLoading={isSubmitting} isDisabled={!!preventSubmissionLogic || !onSubmit} - loadingText="Submitting" + loadingText={t( + 'features.publicForm.components.PublicFormSubmitButton.loadingText', + )} onClick={isPaymentEnabled && !isPreview ? checkBeforeOpen : onSubmit} > - End of form. + + {t( + 'features.publicForm.components.PublicFormSubmitButton.visuallyHidden', + )} + {preventSubmissionLogic - ? 'Submission disabled' + ? t( + 'features.publicForm.components.PublicFormSubmitButton.preventSubmission', + ) : isPaymentEnabled - ? 'Proceed to pay' - : 'Submit now'} + ? t( + 'features.publicForm.components.PublicFormSubmitButton.proceedToPay', + ) + : t( + 'features.publicForm.components.PublicFormSubmitButton.submitNow', + )} {preventSubmissionLogic ? ( diff --git a/frontend/src/i18n/locales/features/public-form/en-sg.ts b/frontend/src/i18n/locales/features/public-form/en-sg.ts index 3a9d75f48a..e77678a330 100644 --- a/frontend/src/i18n/locales/features/public-form/en-sg.ts +++ b/frontend/src/i18n/locales/features/public-form/en-sg.ts @@ -24,4 +24,13 @@ export const enSG: PublicForm = { verifiedFieldExpired_other: 'Your verified fields {{count}} have expired. Please verify those {{count}} fields again.', }, + components: { + PublicFormSubmitButton: { + loadingText: 'Submitting', + visuallyHidden: 'End of form.', + preventSubmission: 'Submission disabled', + proceedToPay: 'Proceed to pay', + submitNow: 'Submit now', + }, + }, } diff --git a/frontend/src/i18n/locales/features/public-form/index.ts b/frontend/src/i18n/locales/features/public-form/index.ts index 3fba8cd57f..8cea5476ac 100644 --- a/frontend/src/i18n/locales/features/public-form/index.ts +++ b/frontend/src/i18n/locales/features/public-form/index.ts @@ -17,4 +17,13 @@ export interface PublicForm { verifiedFieldExpired_one: string verifiedFieldExpired_other: string } + components: { + PublicFormSubmitButton: { + loadingText: string + visuallyHidden: string + preventSubmission: string + proceedToPay: string + submitNow: string + } + } } From d3b45d205b8bf59d27b815cff63a68d3fb891afd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:53:58 +0000 Subject: [PATCH 4/9] chore(deps-dev): bump @types/compression from 1.7.2 to 1.7.5 (#7464) Bumps [@types/compression](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/compression) from 1.7.2 to 1.7.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/compression) --- updated-dependencies: - dependency-name: "@types/compression" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 7 ++++--- package.json | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index fb0679b429..4b551dca4c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -124,7 +124,7 @@ "@types/bcrypt": "^5.0.0", "@types/bluebird": "^3.5.38", "@types/busboy": "^1.5.3", - "@types/compression": "^1.7.2", + "@types/compression": "^1.7.5", "@types/connect-datadog": "0.0.6", "@types/convict": "^6.1.6", "@types/cookie-parser": "^1.4.7", @@ -9254,9 +9254,10 @@ } }, "node_modules/@types/compression": { - "version": "1.7.2", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@types/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-AAQvK5pxMpaT+nDvhHrsBhLSYG5yQdtkaJE1WYieSNY2mVFKAgmU4ks65rkZD5oqnGCFLyQpUr1CqI4DmUMyDg==", "dev": true, - "license": "MIT", "dependencies": { "@types/express": "*" } diff --git a/package.json b/package.json index 2c6acdd4d6..e579d4e194 100644 --- a/package.json +++ b/package.json @@ -170,7 +170,7 @@ "@types/bcrypt": "^5.0.0", "@types/bluebird": "^3.5.38", "@types/busboy": "^1.5.3", - "@types/compression": "^1.7.2", + "@types/compression": "^1.7.5", "@types/connect-datadog": "0.0.6", "@types/convict": "^6.1.6", "@types/cookie-parser": "^1.4.7", From e62fa2b6e890c6e2d2d835ca0ee77333376fff92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:55:25 +0000 Subject: [PATCH 5/9] chore(deps-dev): bump prettier from 3.2.5 to 3.3.2 (#7465) Bumps [prettier](https://github.com/prettier/prettier) from 3.2.5 to 3.3.2. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/3.2.5...3.3.2) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4b551dca4c..1c7d404293 100644 --- a/package-lock.json +++ b/package-lock.json @@ -186,7 +186,7 @@ "lint-staged": "^13.1.0", "maildev": "^2.1.0", "mockdate": "^3.0.5", - "prettier": "^3.2.5", + "prettier": "^3.3.2", "regenerator": "^0.14.10", "rimraf": "^5.0.5", "stripe-event-types": "^3.1.0", @@ -24673,9 +24673,9 @@ } }, "node_modules/prettier": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", - "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz", + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" diff --git a/package.json b/package.json index e579d4e194..45ed9446c7 100644 --- a/package.json +++ b/package.json @@ -232,7 +232,7 @@ "lint-staged": "^13.1.0", "maildev": "^2.1.0", "mockdate": "^3.0.5", - "prettier": "^3.2.5", + "prettier": "^3.3.2", "regenerator": "^0.14.10", "rimraf": "^5.0.5", "stripe-event-types": "^3.1.0", From 1fd07441cb210a8458f1932809184953920d50ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 17:56:55 +0000 Subject: [PATCH 6/9] fix(deps): bump @babel/runtime from 7.24.1 to 7.24.7 (#7466) Bumps [@babel/runtime](https://github.com/babel/babel/tree/HEAD/packages/babel-runtime) from 7.24.1 to 7.24.7. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.24.7/packages/babel-runtime) --- updated-dependencies: - dependency-name: "@babel/runtime" dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1c7d404293..08d7373ed7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@aws-sdk/client-cloudwatch-logs": "^3.536.0", "@aws-sdk/client-lambda": "^3.414.0", - "@babel/runtime": "^7.24.1", + "@babel/runtime": "^7.24.7", "@faker-js/faker": "^8.4.1", "@joi/date": "^2.1.0", "@opengovsg/formsg-sdk": "^0.12.0-alpha.1", @@ -4236,9 +4236,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", "dependencies": { "regenerator-runtime": "^0.14.0" }, diff --git a/package.json b/package.json index 45ed9446c7..827e75bc9f 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "dependencies": { "@aws-sdk/client-cloudwatch-logs": "^3.536.0", "@aws-sdk/client-lambda": "^3.414.0", - "@babel/runtime": "^7.24.1", + "@babel/runtime": "^7.24.7", "@faker-js/faker": "^8.4.1", "@joi/date": "^2.1.0", "@opengovsg/formsg-sdk": "^0.12.0-alpha.1", From 890bf6976bd98ff268aa86e1b3daa26f4712f2ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jul 2024 19:48:56 +0000 Subject: [PATCH 7/9] fix(deps): bump type-fest from 4.20.1 to 4.21.0 in /shared (#7468) Bumps [type-fest](https://github.com/sindresorhus/type-fest) from 4.20.1 to 4.21.0. - [Release notes](https://github.com/sindresorhus/type-fest/releases) - [Commits](https://github.com/sindresorhus/type-fest/compare/v4.20.1...v4.21.0) --- updated-dependencies: - dependency-name: type-fest dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- shared/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/shared/package-lock.json b/shared/package-lock.json index d92e743cc7..602e94b501 100644 --- a/shared/package-lock.json +++ b/shared/package-lock.json @@ -872,9 +872,9 @@ "dev": true }, "node_modules/type-fest": { - "version": "4.20.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz", - "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.21.0.tgz", + "integrity": "sha512-ADn2w7hVPcK6w1I0uWnM//y1rLXZhzB9mr0a3OirzclKF1Wp6VzevUmzz/NRAWunOT6E8HrnpGY7xOfc6K57fA==", "engines": { "node": ">=16" }, From 3e48ffd8adb1bb03b35528f36518f233ea6cc591 Mon Sep 17 00:00:00 2001 From: Kevin Foong <55353265+kevin9foong@users.noreply.github.com> Date: Thu, 4 Jul 2024 15:19:33 +0800 Subject: [PATCH 8/9] chore: remove nric mask toggle if nricmask is false (#7472) --- .../AuthSettingsSingpassSection.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/frontend/src/features/admin-form/settings/components/AuthSettingsSection/AuthSettingsSingpassSection.tsx b/frontend/src/features/admin-form/settings/components/AuthSettingsSection/AuthSettingsSingpassSection.tsx index 2a1ab54b33..540e86aa15 100644 --- a/frontend/src/features/admin-form/settings/components/AuthSettingsSection/AuthSettingsSingpassSection.tsx +++ b/frontend/src/features/admin-form/settings/components/AuthSettingsSection/AuthSettingsSingpassSection.tsx @@ -22,8 +22,15 @@ export const AuthSettingsSingpassSection = ({ settings={settings} isDisabled={isFormPublic || containsMyInfoFields} /> - - + + {/* Hide the NRIC mask toggle if they have not yet enabled it as part of + PMO circular */} + {settings.isNricMaskEnabled ? ( + <> + + + + ) : null} ) } From 82da6acb265f9ddfbcaac07f2475c9418b633976 Mon Sep 17 00:00:00 2001 From: Ken Date: Thu, 4 Jul 2024 15:20:31 +0800 Subject: [PATCH 9/9] chore: bump version to v6.132.0 --- CHANGELOG.md | 16 ++++++++++++++++ frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f514caa19e..724226e13c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,23 @@ All notable changes to this project will be documented in this file. Dates are d Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). +#### [v6.132.0](https://github.com/opengovsg/FormSG/compare/v6.131.0...v6.132.0) + +- chore: remove nric mask toggle if nricmask is false [`#7472`](https://github.com/opengovsg/FormSG/pull/7472) +- fix(deps): bump type-fest from 4.20.1 to 4.21.0 in /shared [`#7468`](https://github.com/opengovsg/FormSG/pull/7468) +- fix(deps): bump @babel/runtime from 7.24.1 to 7.24.7 [`#7466`](https://github.com/opengovsg/FormSG/pull/7466) +- chore(deps-dev): bump prettier from 3.2.5 to 3.3.2 [`#7465`](https://github.com/opengovsg/FormSG/pull/7465) +- chore(deps-dev): bump @types/compression from 1.7.2 to 1.7.5 [`#7464`](https://github.com/opengovsg/FormSG/pull/7464) +- feat(i18n): replace hardcoded text in PublicFormSubmitButton [`#7427`](https://github.com/opengovsg/FormSG/pull/7427) +- fix(deps): bump validator and @types/validator [`#7440`](https://github.com/opengovsg/FormSG/pull/7440) +- fix(encrypt-submission): add missing ndi response fields [`#7425`](https://github.com/opengovsg/FormSG/pull/7425) +- build: merge release v6.131.0 to develop [`#7460`](https://github.com/opengovsg/FormSG/pull/7460) +- build: release v6.131.0 [`#7459`](https://github.com/opengovsg/FormSG/pull/7459) + #### [v6.131.0](https://github.com/opengovsg/FormSG/compare/v6.130.1...v6.131.0) +> 1 July 2024 + - fix: update husky commit hook status msg [`#7458`](https://github.com/opengovsg/FormSG/pull/7458) - build: merge release v6.130.1 to develop [`#7455`](https://github.com/opengovsg/FormSG/pull/7455) - fix(attachment): convoy separation (#7449) [`#7451`](https://github.com/opengovsg/FormSG/pull/7451) @@ -16,6 +31,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - chore: add minor changes to sample form submission api [`#7442`](https://github.com/opengovsg/FormSG/pull/7442) - fix: silence aws-sdk deprecation warnings [`#7445`](https://github.com/opengovsg/FormSG/pull/7445) - fix: move link to constants file, move out helper text as own component [`b549278`](https://github.com/opengovsg/FormSG/commit/b549278906a6960879066760c574340119cc7832) +- chore: bump version to v6.131.0 [`ef1599b`](https://github.com/opengovsg/FormSG/commit/ef1599b9e4dc236994dbff7b7c1c04b15770d6a1) - fix: remove memo from low cost component [`10b037d`](https://github.com/opengovsg/FormSG/commit/10b037d707f096591ebbd1bdaba90ecc9da7175f) #### [v6.130.1](https://github.com/opengovsg/FormSG/compare/v6.130.0...v6.130.1) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 9c5c4ebce8..16cddf316f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "form-frontend", - "version": "6.131.0", + "version": "6.132.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "form-frontend", - "version": "6.131.0", + "version": "6.132.0", "hasInstallScript": true, "dependencies": { "@chakra-ui/react": "^1.8.6", diff --git a/frontend/package.json b/frontend/package.json index 6f6fabca59..2b9bce4e42 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "form-frontend", - "version": "6.131.0", + "version": "6.132.0", "homepage": ".", "private": true, "dependencies": { diff --git a/package-lock.json b/package-lock.json index 08d7373ed7..6ce28aa1c3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "FormSG", - "version": "6.131.0", + "version": "6.132.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "FormSG", - "version": "6.131.0", + "version": "6.132.0", "hasInstallScript": true, "dependencies": { "@aws-sdk/client-cloudwatch-logs": "^3.536.0", diff --git a/package.json b/package.json index 827e75bc9f..9ac80af3b6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "FormSG", "description": "Form Manager for Government", - "version": "6.131.0", + "version": "6.132.0", "homepage": "https://form.gov.sg", "authors": [ "FormSG "