From aa97ae749ada2fab00bea0967b886ea739ef3e06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 7 Mar 2024 18:34:10 +0000 Subject: [PATCH 01/13] fix(deps): bump jose from 4.14.4 to 4.15.5 (#7130) Bumps [jose](https://github.com/panva/jose) from 4.14.4 to 4.15.5. - [Release notes](https://github.com/panva/jose/releases) - [Changelog](https://github.com/panva/jose/blob/v4.15.5/CHANGELOG.md) - [Commits](https://github.com/panva/jose/compare/v4.14.4...v4.15.5) --- updated-dependencies: - dependency-name: jose dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3378e184a6..cb6191f105 100644 --- a/package-lock.json +++ b/package-lock.json @@ -63,7 +63,7 @@ "http-status-codes": "^2.2.0", "intl-tel-input": "~12.4.0", "ip": "^1.1.9", - "jose": "^4.13.1", + "jose": "^4.15.5", "jsdom": "^21.1.1", "json-stringify-safe": "^5.0.1", "JSONStream": "^1.3.5", @@ -20303,9 +20303,9 @@ } }, "node_modules/jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==", + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", + "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -44466,9 +44466,9 @@ } }, "jose": { - "version": "4.14.4", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.4.tgz", - "integrity": "sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==" + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.15.5.tgz", + "integrity": "sha512-jc7BFxgKPKi94uOvEmzlSWFFe2+vASyXaKUpdQKatWAESU2MWjDfFf0fdfc83CDKcA5QecabZeNLyfhe3yKNkg==" }, "js-md5": { "version": "0.7.3", diff --git a/package.json b/package.json index bc0e74f399..fa9e9d5803 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "http-status-codes": "^2.2.0", "intl-tel-input": "~12.4.0", "ip": "^1.1.9", - "jose": "^4.13.1", + "jose": "^4.15.5", "jsdom": "^21.1.1", "json-stringify-safe": "^5.0.1", "JSONStream": "^1.3.5", From da0d5b75c32d38d908b15b9558f19c9bdbb9b8fd Mon Sep 17 00:00:00 2001 From: Kathleen Koh <89055608+kathleenkhy@users.noreply.github.com> Date: Fri, 8 Mar 2024 15:12:16 +0800 Subject: [PATCH 02/13] chore: add logs for virus scanning duration (#7129) --- src/app/modules/submission/submission.service.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/app/modules/submission/submission.service.ts b/src/app/modules/submission/submission.service.ts index 15a7b898fe..3ee78d48f5 100644 --- a/src/app/modules/submission/submission.service.ts +++ b/src/app/modules/submission/submission.service.ts @@ -385,11 +385,20 @@ export const downloadCleanFile = (cleanFileKey: string, versionId: string) => { }) .createReadStream() + logger.info({ + message: 'File download from S3 has started', + meta: logMeta, + }) + readStream.pipe(writeStream) return ResultAsync.fromPromise( new Promise((resolve, reject) => { readStream.on('end', () => { + logger.info({ + message: 'Successfully downloaded file from S3', + meta: logMeta, + }) resolve(buffer) }) From d68b84a85456135ba0df6bf8ec0d0c415a226c12 Mon Sep 17 00:00:00 2001 From: LoneRifle Date: Fri, 8 Mar 2024 22:52:45 +0800 Subject: [PATCH 03/13] fix(virus-scanner): rework error logging in pino (#7128) Pino has in-built serialisers for logging Errors, but only on Errors or Errors in nested `err` properties. Change logging accordingly. --- .../virus-scanner/src/__tests/index.spec.ts | 6 +++--- .../src/__tests/s3.service.spec.ts | 4 ++-- serverless/virus-scanner/src/index.ts | 16 ++++++++-------- serverless/virus-scanner/src/s3.service.ts | 18 +++++++++--------- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/serverless/virus-scanner/src/__tests/index.spec.ts b/serverless/virus-scanner/src/__tests/index.spec.ts index 6b1911a2bb..c1826e48e5 100644 --- a/serverless/virus-scanner/src/__tests/index.spec.ts +++ b/serverless/virus-scanner/src/__tests/index.spec.ts @@ -97,7 +97,7 @@ describe('handler', () => { expect(mockLoggerWarn).toHaveBeenCalledWith( expect.objectContaining({ message: 'File not found', - error: new Error('File not found'), + err: new Error('File not found'), quarantineFileKey: mockUUID, }), ) @@ -175,7 +175,7 @@ describe('handler', () => { expect(mockLoggerError).toHaveBeenCalledWith( expect.objectContaining({ message: 'Failed to scan file', - error: new Error('Failed to scan file'), + err: new Error('Failed to scan file'), quarantineFileKey: mockUUID, }), ) @@ -248,7 +248,7 @@ describe('handler', () => { expect(mockLoggerError).toHaveBeenCalledWith( expect.objectContaining({ message: 'Failed to move file to clean bucket', - error: new Error('Failed to move file'), + err: new Error('Failed to move file'), bucket: 'local-virus-scanner-quarantine-bucket', key: mockUUID, }), diff --git a/serverless/virus-scanner/src/__tests/s3.service.spec.ts b/serverless/virus-scanner/src/__tests/s3.service.spec.ts index c8bbee5c7f..958fdfbaf0 100644 --- a/serverless/virus-scanner/src/__tests/s3.service.spec.ts +++ b/serverless/virus-scanner/src/__tests/s3.service.spec.ts @@ -145,7 +145,7 @@ describe('S3Service', () => { expect.objectContaining({ bucketName: 'bucketName', objectKey: 'objectKey', - error: new Error('Body is empty'), + err: new Error('Body is empty'), }), 'Failed to get object from s3', ) @@ -172,7 +172,7 @@ describe('S3Service', () => { expect.objectContaining({ bucketName: 'bucketName', objectKey: 'objectKey', - error: new Error('VersionId is empty'), + err: new Error('VersionId is empty'), }), 'Failed to get object from s3', ) diff --git a/serverless/virus-scanner/src/index.ts b/serverless/virus-scanner/src/index.ts index a31fc37280..6f55c325e8 100644 --- a/serverless/virus-scanner/src/index.ts +++ b/serverless/virus-scanner/src/index.ts @@ -66,10 +66,10 @@ export const handler = async ( bucketName: quarantineBucket, objectKey: quarantineFileKey, }) - } catch (error) { + } catch (err) { logger.warn({ message: 'File not found', - error, + err, quarantineFileKey, }) return { @@ -88,10 +88,10 @@ export const handler = async ( let scanResult try { scanResult = await scanFileStream(body) - } catch (error) { + } catch (err) { logger.error({ message: 'Failed to scan file', - error, + err, quarantineFileKey, }) return { @@ -122,11 +122,11 @@ export const handler = async ( objectKey: quarantineFileKey, versionId, }) - } catch (error) { + } catch (err) { // Log but do not halt execution as we still want to return 400 for malicious file logger.error({ message: 'Failed to delete file from quarantine bucket', - error, + err, key: quarantineFileKey, }) } @@ -158,10 +158,10 @@ export const handler = async ( destinationBucketName: cleanBucket, destinationObjectKey: cleanFileKey, }) - } catch (error) { + } catch (err) { logger.error({ message: 'Failed to move file to clean bucket', - error, + err, bucket: quarantineBucket, key: quarantineFileKey, }) diff --git a/serverless/virus-scanner/src/s3.service.ts b/serverless/virus-scanner/src/s3.service.ts index 1dd6c78f0f..9ec6fb5ed8 100644 --- a/serverless/virus-scanner/src/s3.service.ts +++ b/serverless/virus-scanner/src/s3.service.ts @@ -72,17 +72,17 @@ export class S3Service { ) return { body, versionId } as GetS3FileStreamResult - } catch (error) { + } catch (err) { this.logger.error( { bucketName, objectKey, - error, + err, }, 'Failed to get object from s3', ) - throw error + throw err } } @@ -112,17 +112,17 @@ export class S3Service { }, 'Deleted document from s3', ) - } catch (error) { + } catch (err) { this.logger.error( { bucketName, objectKey, - error, + err, }, 'Failed to delete object from s3', ) - throw error + throw err } } @@ -189,7 +189,7 @@ export class S3Service { ) return VersionId - } catch (error) { + } catch (err) { this.logger.error( { sourceBucketName, @@ -197,12 +197,12 @@ export class S3Service { sourceObjectVersionId, destinationBucketName, destinationObjectKey, - error, + err, }, 'Failed to move object in s3', ) - throw error + throw err } } } From 51f538d368a952bbe0479714a15145fd081c48fa Mon Sep 17 00:00:00 2001 From: Kathleen Koh <89055608+kathleenkhy@users.noreply.github.com> Date: Thu, 14 Mar 2024 14:07:49 +0800 Subject: [PATCH 04/13] chore: file download duration from S3 (#7135) * chore: add logs for virus scanning duration * chore: adding duration logs for virus scan file download * chore: rename downloadStartTime const * chore: update downloadEndTime const name --- src/app/modules/submission/submission.service.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/app/modules/submission/submission.service.ts b/src/app/modules/submission/submission.service.ts index 3ee78d48f5..db23ec3ca8 100644 --- a/src/app/modules/submission/submission.service.ts +++ b/src/app/modules/submission/submission.service.ts @@ -385,6 +385,7 @@ export const downloadCleanFile = (cleanFileKey: string, versionId: string) => { }) .createReadStream() + const downloadStartTime = Date.now() logger.info({ message: 'File download from S3 has started', meta: logMeta, @@ -399,6 +400,12 @@ export const downloadCleanFile = (cleanFileKey: string, versionId: string) => { message: 'Successfully downloaded file from S3', meta: logMeta, }) + const downloadEndTime = Date.now() + logger.info({ + message: 'File download from S3 duration', + meta: { ...logMeta, time: downloadEndTime - downloadStartTime }, + }) + resolve(buffer) }) From 51972bb1f77999721cfe07ace03ca0d577bf1af6 Mon Sep 17 00:00:00 2001 From: LoneRifle Date: Fri, 15 Mar 2024 16:07:44 +0800 Subject: [PATCH 05/13] refactor(i18n): modularize and shard by feature (#7134) * refactor(i18n): move locale files to specific directories Prepare for sharding up of locale resources by moving each locale into its own directory. Use this as the base to manage future growth and expansion of locale resources to cover most text in FormSG. No code change. * refactor(i18n): add features dir, shard login locale Hold feature-specific locale resources in a `features/` dir for each locale, to minimise clutter even as we add more text to hold as resources. * refactor(i18n): reorg translations by feature, not locale --- frontend/src/i18n/locales/en-sg.ts | 16 ++-------------- .../src/i18n/locales/features/login/en-sg.ts | 16 ++++++++++++++++ .../src/i18n/locales/features/login/index.ts | 16 ++++++++++++++++ .../src/i18n/locales/features/login/zh-sg.ts | 16 ++++++++++++++++ frontend/src/i18n/locales/types.ts | 16 +++------------- frontend/src/i18n/locales/zh-sg.ts | 16 ++-------------- 6 files changed, 55 insertions(+), 41 deletions(-) create mode 100644 frontend/src/i18n/locales/features/login/en-sg.ts create mode 100644 frontend/src/i18n/locales/features/login/index.ts create mode 100644 frontend/src/i18n/locales/features/login/zh-sg.ts diff --git a/frontend/src/i18n/locales/en-sg.ts b/frontend/src/i18n/locales/en-sg.ts index fa27ecd2cc..78bf442ac5 100644 --- a/frontend/src/i18n/locales/en-sg.ts +++ b/frontend/src/i18n/locales/en-sg.ts @@ -1,22 +1,10 @@ +import { enSG as login } from './features/login' import Translation from './types' export const enSG: Translation = { translation: { features: { - login: { - LoginPage: { - slogan: 'Build secure government forms in minutes', - }, - components: { - LoginForm: { - onlyAvailableForPublicOfficers: - 'Log in with a .gov.sg or other whitelisted email address', - emailEmptyErrorMsg: 'Please enter an email address', - login: 'Log in', - haveAQuestion: 'Have a question?', - }, - }, - }, + login, }, }, } diff --git a/frontend/src/i18n/locales/features/login/en-sg.ts b/frontend/src/i18n/locales/features/login/en-sg.ts new file mode 100644 index 0000000000..e596523b6c --- /dev/null +++ b/frontend/src/i18n/locales/features/login/en-sg.ts @@ -0,0 +1,16 @@ +import { Login } from '.' + +export const enSG: Login = { + LoginPage: { + slogan: 'Build secure government forms in minutes', + }, + components: { + LoginForm: { + onlyAvailableForPublicOfficers: + 'Log in with a .gov.sg or other whitelisted email address', + emailEmptyErrorMsg: 'Please enter an email address', + login: 'Log in', + haveAQuestion: 'Have a question?', + }, + }, +} diff --git a/frontend/src/i18n/locales/features/login/index.ts b/frontend/src/i18n/locales/features/login/index.ts new file mode 100644 index 0000000000..83c08cda3c --- /dev/null +++ b/frontend/src/i18n/locales/features/login/index.ts @@ -0,0 +1,16 @@ +export * from './en-sg' +export * from './zh-sg' + +export interface Login { + components: { + LoginForm: { + onlyAvailableForPublicOfficers: string + emailEmptyErrorMsg: string + login: string + haveAQuestion: string + } + } + LoginPage: { + slogan: string + } +} diff --git a/frontend/src/i18n/locales/features/login/zh-sg.ts b/frontend/src/i18n/locales/features/login/zh-sg.ts new file mode 100644 index 0000000000..76138731e6 --- /dev/null +++ b/frontend/src/i18n/locales/features/login/zh-sg.ts @@ -0,0 +1,16 @@ +import { Login } from '.' + +export const zhSG: Login = { + LoginPage: { + slogan: '在几分钟内创建安全的政府表格', + }, + components: { + LoginForm: { + onlyAvailableForPublicOfficers: + '只供拥有 gov.sg 或其他列入白名单的电子邮件的公职人员使用', + emailEmptyErrorMsg: '请输入电子邮件地址', + login: '登录', + haveAQuestion: '有问题?', + }, + }, +} diff --git a/frontend/src/i18n/locales/types.ts b/frontend/src/i18n/locales/types.ts index a275ee7343..78d1264af8 100644 --- a/frontend/src/i18n/locales/types.ts +++ b/frontend/src/i18n/locales/types.ts @@ -1,19 +1,9 @@ +import { Login } from './features/login' + interface Translation { translation: { features: { - login: { - components: { - LoginForm: { - onlyAvailableForPublicOfficers: string - emailEmptyErrorMsg: string - login: string - haveAQuestion: string - } - } - LoginPage: { - slogan: string - } - } + login: Login } } } diff --git a/frontend/src/i18n/locales/zh-sg.ts b/frontend/src/i18n/locales/zh-sg.ts index 2e22dbb229..22bb261d47 100644 --- a/frontend/src/i18n/locales/zh-sg.ts +++ b/frontend/src/i18n/locales/zh-sg.ts @@ -1,22 +1,10 @@ +import { zhSG as login } from './features/login' import Translation from './types' export const zhSG: Translation = { translation: { features: { - login: { - LoginPage: { - slogan: '在几分钟内创建安全的政府表格', - }, - components: { - LoginForm: { - onlyAvailableForPublicOfficers: - '只供拥有 gov.sg 或其他列入白名单的电子邮件的公职人员使用', - emailEmptyErrorMsg: '请输入电子邮件地址', - login: '登录', - haveAQuestion: '有问题?', - }, - }, - }, + login, }, }, } From 0cba9339a1fd8c32433c7ed59d409a92f0581304 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 22:38:48 +0000 Subject: [PATCH 06/13] build(deps): bump follow-redirects from 1.15.4 to 1.15.6 in /serverless/virus-scanner (#7137) build(deps): bump follow-redirects in /serverless/virus-scanner Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- serverless/virus-scanner/package-lock.json | 1099 +------------------- 1 file changed, 11 insertions(+), 1088 deletions(-) diff --git a/serverless/virus-scanner/package-lock.json b/serverless/virus-scanner/package-lock.json index 1df94e62c8..44416a71b4 100644 --- a/serverless/virus-scanner/package-lock.json +++ b/serverless/virus-scanner/package-lock.json @@ -1951,17 +1951,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -2979,35 +2968,6 @@ "@types/node": "*" } }, - "node_modules/@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3074,13 +3034,6 @@ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -3175,181 +3128,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, "node_modules/2-thenable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", @@ -3404,16 +3182,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -4513,16 +4281,6 @@ "node": ">=10" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, "node_modules/ci-info": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", @@ -5574,13 +5332,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true, - "peer": true - }, "node_modules/es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -5691,30 +5442,6 @@ "source-map": "~0.6.1" } }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esniff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", @@ -5738,19 +5465,6 @@ "node": ">=4" } }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, "node_modules/essentials": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", @@ -6136,9 +5850,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -6381,13 +6095,6 @@ "node": ">= 6" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7999,16 +7706,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -8510,13 +8207,6 @@ "node": ">= 0.6" } }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -9337,16 +9027,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -9680,59 +9360,6 @@ "node": ">=v12.22.7" } }, - "node_modules/schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/schema-utils/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/schema-utils/node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/schema-utils/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -9766,16 +9393,6 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serverless": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.19.0.tgz", @@ -10385,93 +10002,6 @@ "node": ">= 6" } }, - "node_modules/terser": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", - "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/terser/node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -11125,20 +10655,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -11154,98 +10670,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/webpack/node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -13134,17 +12558,6 @@ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", "dev": true }, - "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -13987,35 +13400,6 @@ "@types/node": "*" } }, - "@types/eslint": { - "version": "8.56.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz", - "integrity": "sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==", - "dev": true, - "peer": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true, - "peer": true - }, "@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -14082,13 +13466,6 @@ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, - "@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "peer": true - }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -14182,181 +13559,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", - "dev": true, - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", - "dev": true, - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true, - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.6", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, "2-thenable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", @@ -14402,14 +13604,6 @@ "acorn-walk": "^8.0.2" } }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peer": true, - "requires": {} - }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -15231,13 +14425,6 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true - }, "ci-info": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", @@ -15835,8 +15022,7 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true, - "requires": {} + "dev": true }, "deepmerge": { "version": "4.3.1", @@ -16070,13 +15256,6 @@ "is-arrayish": "^0.2.1" } }, - "es-module-lexer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", - "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", - "dev": true, - "peer": true - }, "es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -16170,26 +15349,6 @@ "source-map": "~0.6.1" } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "dependencies": { - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true - } - } - }, "esniff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", @@ -16206,16 +15365,6 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "requires": { - "estraverse": "^5.2.0" - } - }, "essentials": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", @@ -16508,9 +15657,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "for-each": { "version": "0.3.3", @@ -16681,13 +15830,6 @@ "is-glob": "^4.0.1" } }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -17130,8 +16272,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true, - "requires": {} + "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -17475,8 +16616,7 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "29.6.3", @@ -17746,8 +16886,7 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true, - "requires": {} + "dev": true } } }, @@ -17898,13 +17037,6 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true - }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -18306,13 +17438,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -18909,16 +18034,6 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -19163,48 +18278,6 @@ "xmlchars": "^2.2.0" } }, - "schema-utils": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", - "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", - "dev": true, - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "dependencies": { - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - } - } - }, "seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -19230,16 +18303,6 @@ "lru-cache": "^6.0.0" } }, - "serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dev": true, - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } - }, "serverless": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.19.0.tgz", @@ -19719,67 +18782,6 @@ } } }, - "terser": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.2.tgz", - "integrity": "sha512-sHXmLSkImesJ4p5apTeT63DsV4Obe1s37qT8qvwHRmVxKTBH7Rv9Wr26VcAMmLbmk9UliiwK8z+657NyJHHy/w==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } - } - }, - "terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/trace-mapping": "^0.3.20", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" - }, - "dependencies": { - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - } - } - }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -20243,17 +19245,6 @@ "makeerror": "1.0.12" } }, - "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -20269,73 +19260,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "webpack": { - "version": "5.90.3", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", - "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.2.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "dependencies": { - "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true - } - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true - }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -20421,8 +19345,7 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "dev": true, - "requires": {} + "dev": true }, "xml-name-validator": { "version": "4.0.0", From ce5dfd680f829e600b7382c3e6a898639c97cf35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 22:39:26 +0000 Subject: [PATCH 07/13] build(deps): bump follow-redirects from 1.15.4 to 1.15.6 in /frontend (#7138) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frontend/package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index e45e01aa06..74214f5a7b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -25212,9 +25212,9 @@ "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -67478,9 +67478,9 @@ "integrity": "sha512-Rwix9pBtC1Nuy5wysTmKy+UjbDJpIfg8eHjw0rjZ1mX4GNLz1Bmd16uDpI3Gk1i70Fgcs8Csg2lPm8HULFg9DQ==" }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "for-in": { "version": "1.0.2", From c2330c6b29e4c7aa15be8b55ab64fb4dce3704b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 16 Mar 2024 22:44:43 +0000 Subject: [PATCH 08/13] fix(deps): bump follow-redirects from 1.15.4 to 1.15.6 (#7139) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index cb6191f105..607a82bc7a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15912,9 +15912,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "funding": [ { "type": "individual", @@ -41423,9 +41423,9 @@ "dev": true }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==" + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, "font-awesome": { "version": "4.7.0" From b9c6e57717cf91f548487420798aa9e361f29eb7 Mon Sep 17 00:00:00 2001 From: Ken Lee Shu Ming Date: Mon, 18 Mar 2024 13:43:24 +0800 Subject: [PATCH 09/13] chore(dd): link source code to dd (#7120) * add env vars to docker * chore: rename create-env to aws-ssm config * add dd into ebextension * add workflow cmd to insert values in eb script * remove unused envvars from dockerfile * fix: use + as sed delimiter * fix: typo on comments --- ...ation.config => 01env-file-aws-ssm.config} | 0 .ebextensions/02env-file-datadog.config | 32 +++++++++++++++++++ .github/workflows/deploy-eb.yml | 4 +++ 3 files changed, 36 insertions(+) rename .ebextensions/{env-file-creation.config => 01env-file-aws-ssm.config} (100%) create mode 100644 .ebextensions/02env-file-datadog.config diff --git a/.ebextensions/env-file-creation.config b/.ebextensions/01env-file-aws-ssm.config similarity index 100% rename from .ebextensions/env-file-creation.config rename to .ebextensions/01env-file-aws-ssm.config diff --git a/.ebextensions/02env-file-datadog.config b/.ebextensions/02env-file-datadog.config new file mode 100644 index 0000000000..380dac987a --- /dev/null +++ b/.ebextensions/02env-file-datadog.config @@ -0,0 +1,32 @@ +# adds datadog config into environment + +commands: + 01-datadog: + command: "/tmp/add-datadog-env.sh" + +files: + "/tmp/add-datadog-env.sh": + mode: "000755" + content : | + #!/bin/bash + # Reach into the undocumented container config + AWS_REGION='`{"Ref": "AWS::Region"}`' + ENV_TYPE=$(/opt/elasticbeanstalk/bin/get-config environment -k SSM_PREFIX) + ENV_SITE_NAME=$(/opt/elasticbeanstalk/bin/get-config environment -k SSM_ENV_SITE_NAME) + TARGET_DIR=/etc/formsg + + echo "Checking if ${TARGET_DIR} exists..." + if [ ! -d ${TARGET_DIR} ]; then + echo "Creating directory ${TARGET_DIR} ..." + mkdir -p ${TARGET_DIR} + if [ $? -ne 0 ]; then + echo 'ERROR: Directory creation failed!' + exit 1 + fi + else + echo "Directory ${TARGET_DIR} already exists!" + fi + + echo "Adding datadog config for ${ENV_SITE_NAME} in ${AWS_REGION}" + echo "DD_GIT_REPOSITORY_URL=@DD_GIT_REPOSITORY_URL" >> $TARGET_DIR/.env + echo "DD_GIT_COMMIT_SHA=@DD_GIT_COMMIT_SHA" >> $TARGET_DIR/.env diff --git a/.github/workflows/deploy-eb.yml b/.github/workflows/deploy-eb.yml index 28496d0238..c0c2626185 100644 --- a/.github/workflows/deploy-eb.yml +++ b/.github/workflows/deploy-eb.yml @@ -93,11 +93,15 @@ jobs: ECR_REPOSITORY: ${{ secrets.ECR_REPO }} DD_API_KEY: ${{ secrets.DD_API_KEY }} DD_ENV: ${{ secrets.DD_ENV }} + DD_GIT_REPOSITORY_URL: ${{ github.server_url }}/${{ github.repository }} + DD_GIT_COMMIT_SHA: ${{ github.sha }} run: | docker tag $ECR_REPOSITORY:$IMAGE_TAG $ECR_REPOSITORY:$BRANCH docker push -a $ECR_REPOSITORY sed -i -e "s/@TAG/$IMAGE_TAG/g" Dockerrun.aws.json sed -i -e "s/@DD_API_KEY/$DD_API_KEY/g" -e "s/@DD_ENV/$DD_ENV/g" .ebextensions/99datadog-amazon-linux-2.config + # Using "+" as delimiter to avoid escaping / in DD_GIT_REPOSITORY_URL + sed -i -e "s+@DD_GIT_REPOSITORY_URL+$DD_GIT_REPOSITORY_URL+g" -e "s/@DD_GIT_COMMIT_SHA/$DD_GIT_COMMIT_SHA/g" .ebextensions/02env-file-datadog.config zip -r "$IMAGE_TAG.zip" .ebextensions Dockerrun.aws.json - name: Copy Image to S3 From 8c5a160e8c94d49ffeaf84016b806d0e2a637b3e Mon Sep 17 00:00:00 2001 From: tshuli <63710093+tshuli@users.noreply.github.com> Date: Mon, 18 Mar 2024 20:56:07 +0800 Subject: [PATCH 10/13] chore: Security upgrade nodemailer from 6.9.1 to 6.9.9 (#7057) chore: upgrade nodemailer to 6.9.12 Co-authored-by: Ken --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 607a82bc7a..3a30669e4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -82,7 +82,7 @@ "neverthrow": "^6.0.0", "nocache": "^3.0.4", "node-cache": "^5.1.2", - "nodemailer": "^6.9.1", + "nodemailer": "^6.9.12", "openid-client": "^5.3.1", "opossum": "^7.1.0", "p-queue": "^6.6.2", @@ -23043,9 +23043,9 @@ } }, "node_modules/nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==", + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.12.tgz", + "integrity": "sha512-pnLo7g37Br3jXbF0bl5DekBJihm2q+3bB3l2o/B060sWmb5l+VqeScAQCBqaQ+5ezRZFzW5SciZNGdRDEbq89w==", "engines": { "node": ">=6.0.0" } @@ -46414,9 +46414,9 @@ "dev": true }, "nodemailer": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.1.tgz", - "integrity": "sha512-qHw7dOiU5UKNnQpXktdgQ1d3OFgRAekuvbJLcdG5dnEo/GtcTHRYM7+UfJARdOFU9WUQO8OiIamgWPmiSFHYAA==" + "version": "6.9.12", + "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-6.9.12.tgz", + "integrity": "sha512-pnLo7g37Br3jXbF0bl5DekBJihm2q+3bB3l2o/B060sWmb5l+VqeScAQCBqaQ+5ezRZFzW5SciZNGdRDEbq89w==" }, "noms": { "version": "0.0.0", diff --git a/package.json b/package.json index fa9e9d5803..ed6cbf1bf0 100644 --- a/package.json +++ b/package.json @@ -128,7 +128,7 @@ "neverthrow": "^6.0.0", "nocache": "^3.0.4", "node-cache": "^5.1.2", - "nodemailer": "^6.9.1", + "nodemailer": "^6.9.12", "openid-client": "^5.3.1", "opossum": "^7.1.0", "p-queue": "^6.6.2", From 520c5bf25bedd7f6d29a38b34440cdc6576c2dd4 Mon Sep 17 00:00:00 2001 From: Justyn Oh Date: Tue, 19 Mar 2024 11:44:25 +0800 Subject: [PATCH 11/13] refactor(logic): consolidate logic functions into shared (#7136) * refactor(logic): consolidate logic functions into shared * test: fix test import paths * chore: add more details to comments, use shared function for isNonEmpty * refactor: move internal radio field constant over to shared as SSOT * chore: add comment to unreachable code path --- .../logic/utils/allConditionsExist.ts | 16 - .../utils/getLogicUnitPreventingSubmit.tsx | 95 --- .../logic/utils/getVisibleFieldIds.ts | 93 --- .../logic/utils/groupLogicUnitsByField.ts | 106 --- frontend/src/features/logic/utils/index.ts | 3 +- .../logic/utils/isConditionFulfilled.ts | 134 ---- .../src/features/logic/utils/logic-adaptor.ts | 116 +++ .../src/features/logic/utils/typeguards.ts | 53 +- .../public-form/utils/filterHiddenInputs.ts | 2 +- .../src/templates/Field/Radio/constants.ts | 3 +- shared/constants/form.ts | 3 + .../utils}/__tests__/logic.spec.ts | 759 +++++++++++++----- {src/shared/util => shared/utils}/logic.ts | 319 +++++--- src/app/models/form.server.model.ts | 2 +- .../ParsedResponsesObject.class.spec.ts | 2 +- .../IncomingEncryptSubmission.class.spec.ts | 2 +- src/app/utils/logic-adaptor.ts | 23 +- 17 files changed, 917 insertions(+), 814 deletions(-) delete mode 100644 frontend/src/features/logic/utils/allConditionsExist.ts delete mode 100644 frontend/src/features/logic/utils/getLogicUnitPreventingSubmit.tsx delete mode 100644 frontend/src/features/logic/utils/getVisibleFieldIds.ts delete mode 100644 frontend/src/features/logic/utils/groupLogicUnitsByField.ts delete mode 100644 frontend/src/features/logic/utils/isConditionFulfilled.ts create mode 100644 frontend/src/features/logic/utils/logic-adaptor.ts rename {src/shared/util => shared/utils}/__tests__/logic.spec.ts (55%) rename {src/shared/util => shared/utils}/logic.ts (56%) diff --git a/frontend/src/features/logic/utils/allConditionsExist.ts b/frontend/src/features/logic/utils/allConditionsExist.ts deleted file mode 100644 index 03a14fb168..0000000000 --- a/frontend/src/features/logic/utils/allConditionsExist.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { FormCondition } from '~shared/types' - -import { FieldIdToType } from '../types' - -/** - * Checks if the field ids in logic's conditions all exist in the fieldIds. - * @param conditions the list of conditions to check - * @param visibleFieldMap map containing all visible field ids to their corresponding field - * @returns true if every condition's related form field id exists in the set of formFieldIds, false otherwise. - */ -export const allConditionsExist = ( - conditions: FormCondition[], - visibleFieldMap: FieldIdToType, -): boolean => { - return conditions.every((c) => visibleFieldMap[c.field]) -} diff --git a/frontend/src/features/logic/utils/getLogicUnitPreventingSubmit.tsx b/frontend/src/features/logic/utils/getLogicUnitPreventingSubmit.tsx deleted file mode 100644 index 7cb23f2420..0000000000 --- a/frontend/src/features/logic/utils/getLogicUnitPreventingSubmit.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import { DeepPartialSkipArrayKey, UnpackNestedValue } from 'react-hook-form' - -import { FormCondition, FormDto, PreventSubmitLogicDto } from '~shared/types' - -import { FormFieldValues } from '~templates/Field' - -import { filterHiddenInputs } from '~features/public-form/utils' - -import { FieldIdToType } from '../types' - -import { allConditionsExist } from './allConditionsExist' -import { isConditionFulfilled } from './isConditionFulfilled' -import { isPreventSubmitLogic } from './typeguards' - -/** - * Parse logic to get a list of conditions where, if any condition in this list - * is fulfilled, form submission is prevented. - * @param formLogics the form logics to check - * @param visibleFieldMap the map containing keys of visible field ids to check if the logic is fulfilled - * @returns array of conditions that prevent submission, can be empty - */ -const getPreventSubmitConditions = ( - formLogics: FormDto['form_logics'], - visibleFieldMap: FieldIdToType, -) => { - return formLogics.filter( - (formLogic): formLogic is PreventSubmitLogicDto => - isPreventSubmitLogic(formLogic) && - allConditionsExist(formLogic.conditions, visibleFieldMap), - ) -} - -/** - * Checks if an array of conditions is satisfied. - * @param formInputs the responses to retrieve logic units for. - * @param logicUnit an unit representing a single logic condition slice. - * @param visibleFieldMap the map with keys of field IDs that are visible, which is used to ensure that conditions are visible - * @returns true if all the conditions are satisfied, false otherwise - */ -const isLogicUnitSatisfied = ( - formInputs: UnpackNestedValue>, - logicUnit: FormCondition[], - fieldIdToType: FieldIdToType, -): boolean => { - return logicUnit.every((condition) => { - const conditionField = formInputs[condition.field] - const conditionFieldType = fieldIdToType[condition.field] - return ( - conditionField !== undefined && - !!conditionFieldType && - isConditionFulfilled(conditionField, condition, conditionFieldType) - ) - }) -} - -/** - * Determines whether the submission should be prevented by form logic. If so, - * return the condition preventing the submission. If not, return undefined. - * @param params.formInputs the responses to retrieve logic units for. - * @param params.formLogics the logic conditions on the form - * @param params.visibleFieldIds the set of currently visible fields id. - * @returns a condition if submission is to prevented, otherwise `undefined` - */ -export const getLogicUnitPreventingSubmit = ({ - formFields, - formInputs, - formLogics, -}: { - formFields: FormDto['form_fields'] - formLogics: FormDto['form_logics'] - formInputs: FormFieldValues -}) => { - const filteredFormInputs = filterHiddenInputs({ - formFields, - formInputs, - formLogics, - }) - - const fieldIdToType = formFields.reduce((acc, ff) => { - acc[ff._id] = ff.fieldType - return acc - }, {}) - - const preventSubmitConditions = getPreventSubmitConditions( - formLogics, - fieldIdToType, - ) - return preventSubmitConditions.find((logicUnit) => - isLogicUnitSatisfied( - filteredFormInputs, - logicUnit.conditions, - fieldIdToType, - ), - ) -} diff --git a/frontend/src/features/logic/utils/getVisibleFieldIds.ts b/frontend/src/features/logic/utils/getVisibleFieldIds.ts deleted file mode 100644 index caef5c9c77..0000000000 --- a/frontend/src/features/logic/utils/getVisibleFieldIds.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { - DeepPartial, - DeepPartialSkipArrayKey, - UnpackNestedValue, -} from 'react-hook-form' -import { CamelCasedProperties } from 'type-fest' - -import { FormCondition, FormDto } from '~shared/types/form' - -import { FormFieldValues } from '~templates/Field' - -import { FieldIdSet, FieldIdToType } from '../types' - -import { groupLogicUnitsByField } from './groupLogicUnitsByField' -import { isConditionFulfilled } from './isConditionFulfilled' - -/** - * Checks if an array of conditions is satisfied. - * @param formInputs the inputs to the form to retrieve logic units for. - * @param logicUnit the logic units to check. - * @param visibleFieldMap the map with visible field ids as keys, which is used to ensure that conditions are visible - * @returns true if all the conditions are satisfied, false otherwise - */ -const isLogicUnitSatisfied = ( - formInputs: DeepPartial, - logicUnit: FormCondition[], - visibleFieldMap: FieldIdToType, -): boolean => { - return logicUnit.every((condition) => { - const inputFieldType = visibleFieldMap[condition.field] - // If the field is not visible, then the field type will not be in the map. - if (!inputFieldType) return false - const input = formInputs[condition.field] - return ( - input !== undefined && - isConditionFulfilled(input, condition, inputFieldType) - ) - }) -} - -/** - * Gets the IDs of visible fields in a form according to its responses. - * This function loops through all the form fields until the set of visible - * fields no longer changes. The first loop adds all the fields with no - * conditions attached, the second adds fields which are made visible due to fields added in the previous loop, and so on. - * @param formInputs the field responses to retrieve logic units for. - * @param formProps the form fields and form logics to determine visible field ids. - * @returns a set of IDs of visible fields in the submission - */ -export const getVisibleFieldIds = ( - formInputs: UnpackNestedValue>, - { - formFields, - formLogics, - }: CamelCasedProperties>, -): FieldIdSet => { - const idToFieldTypeMap = formFields.reduce((acc, ff) => { - acc[ff._id] = ff.fieldType - return acc - }, {}) - - const { groupedLogic } = groupLogicUnitsByField(formLogics, idToFieldTypeMap) - const visibleFieldMap: FieldIdToType = {} - // Loop continues until no more changes made - let changesMade = true - while (changesMade) { - changesMade = false - // eslint-disable-next-line no-loop-func - formFields.forEach((field) => { - const logicUnits = groupedLogic[field._id] - // If a field's visibility does not have any conditions, it is always - // visible. - // Otherwise, a field's visibility can be toggled by a combination of - // conditions. - // Eg. the following are logicUnits - just one of them has to be satisfied - // 1) Show X if Y=yes and Z=yes - // Or - // 2) Show X if A=1 - if ( - !visibleFieldMap[field._id] && - (!logicUnits || - logicUnits.some((logicUnit) => - isLogicUnitSatisfied(formInputs, logicUnit, visibleFieldMap), - )) - ) { - visibleFieldMap[field._id] = field.fieldType - changesMade = true - } - }) - } - - return new Set(Object.keys(visibleFieldMap)) -} diff --git a/frontend/src/features/logic/utils/groupLogicUnitsByField.ts b/frontend/src/features/logic/utils/groupLogicUnitsByField.ts deleted file mode 100644 index 44f6a515fb..0000000000 --- a/frontend/src/features/logic/utils/groupLogicUnitsByField.ts +++ /dev/null @@ -1,106 +0,0 @@ -import { LogicDto } from '~shared/types/form' - -import { FieldIdToType, GroupedLogicMeta } from '../types' - -import { allConditionsExist } from './allConditionsExist' -import { isShowFieldsLogic } from './typeguards' - -/** - * Parse logic into a map of fields that are shown/hidden depending on the - * values of other fields. - * Discards invalid logic, where the id in show or conditions do not exist in - * the form_field. - * - * @example - * // Show email (_id: 1001) and Number (_id: 1002) if Dropdown (_id: 1003) is "Option 1" and Yes_No (_id: 1004) is "Yes" - * formLogics = [ - * { - * show: ['1001', '1002'], - * conditions: [ - * { - * field: '1003', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Option 1', - * }, - * { - * field: '1004', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Yes', - * }, - * ], - * }, - * ] - * - * meta.groupedLogic = { - * '1001': [ - * [ - * { - * field: '1003', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Option 1', - * }, - * { - * field: '1004', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Yes', - * }, - * ], - * ], - * '1002': [ - * [ - * { - * field: '1003', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Option 1', - * }, - * { - * field: '1004', - * ifValueType: 'single-select', - * state: 'is equals to', - * value: 'Yes', - * }, - * ], - * ], - * } - * @caption If "1001" is deleted, "1002" will still be rendered since we just won't add "1001" into logicUnitsGroupedByField - * - * @param formLogics the logic units to group using the form field ids - * @param idToFieldTypeMap map whose keys are used to group logic units with. - * @returns an object containing the grouped logic units and a boolean indicating if any of the form logic units are invalid. - */ -export const groupLogicUnitsByField = ( - formLogics: LogicDto[], - idToFieldTypeMap: FieldIdToType, -) => { - const filteredFormLogics = formLogics.filter(isShowFieldsLogic) - - /** An index of logic units keyed by the field id to be shown. */ - const logicUnitsGroupedByField = filteredFormLogics.reduce( - (acc, logicUnit) => { - const hasAllConditions = allConditionsExist( - logicUnit.conditions, - idToFieldTypeMap, - ) - if (!hasAllConditions) { - acc.hasInvalidLogic = true - return acc - } - logicUnit.show.forEach((fieldId) => { - if (idToFieldTypeMap[fieldId]) { - acc.groupedLogic[fieldId] = acc.groupedLogic[fieldId] - ? acc.groupedLogic[fieldId] - : [] - acc.groupedLogic[fieldId].push(logicUnit.conditions) - } - }) - return acc - }, - { hasInvalidLogic: false, groupedLogic: {} }, - ) - return logicUnitsGroupedByField -} diff --git a/frontend/src/features/logic/utils/index.ts b/frontend/src/features/logic/utils/index.ts index 58f4859348..3fd54fe452 100644 --- a/frontend/src/features/logic/utils/index.ts +++ b/frontend/src/features/logic/utils/index.ts @@ -1,3 +1,2 @@ export * from './getIfLogicType' -export * from './getLogicUnitPreventingSubmit' -export * from './getVisibleFieldIds' +export * from './logic-adaptor' diff --git a/frontend/src/features/logic/utils/isConditionFulfilled.ts b/frontend/src/features/logic/utils/isConditionFulfilled.ts deleted file mode 100644 index 16f01bd5f6..0000000000 --- a/frontend/src/features/logic/utils/isConditionFulfilled.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { DeepPartial } from 'react-hook-form' - -import { BasicField } from '~shared/types/field' -import { - FormCondition, - LogicableField, - LogicConditionState, -} from '~shared/types/form' - -import { FormFieldValue } from '~templates/Field' -import { RADIO_OTHERS_INPUT_VALUE } from '~templates/Field/Radio/constants' - -import { - isLogicableField, - isRadioFormFieldValue, - isValueStringArray, -} from './typeguards' - -const getCurrentFieldValue = ( - input: DeepPartial>, - fieldType: LogicableField, -) => { - switch (fieldType) { - case BasicField.Radio: - case BasicField.Number: - case BasicField.Decimal: - case BasicField.Dropdown: - case BasicField.Rating: - case BasicField.YesNo: - return input - } -} - -/** - * Utility function to trim condition.value strings - * Trim logic condition for backward compability as some logic conditions have trailing whitespac - * Similar to current implementation in `src/shared/util/logic.ts` for backend - * TODO #4279: Revisit decision to trim after React rollout is complete - */ -const trimConditionValue = (condition: FormCondition) => { - if (isValueStringArray(condition.value)) { - return { - ...condition, - value: condition.value.map((value) => value.trim()), - } - } else if (typeof condition.value === 'string') { - return { - ...condition, - value: condition.value.trim(), - } - } else { - return condition - } -} - -export const isConditionFulfilled = ( - input: DeepPartial, - condition: FormCondition, - fieldType: BasicField, -): boolean => { - const conditionTrimmed = trimConditionValue(condition) - - // Not logic field, early return. - const args = { fieldType, input } - if (!isLogicableField(args)) return false - - // TODO #4279: Revisit decision to trim after React rollout is complete - let currentValueTrimmed - const currentValue = getCurrentFieldValue(args.input, args.fieldType) - if (currentValue === '') { - return false - } - if (typeof currentValue === 'string') { - currentValueTrimmed = currentValue.trim() - } else if (typeof currentValue.value === 'string') { - currentValueTrimmed = { - ...currentValue, - value: currentValue.value.trim(), - } - } else { - currentValueTrimmed = currentValue - } - - switch (conditionTrimmed.state) { - case LogicConditionState.Lte: - return Number(currentValueTrimmed) <= Number(conditionTrimmed.value) - case LogicConditionState.Gte: - return Number(currentValueTrimmed) >= Number(conditionTrimmed.value) - case LogicConditionState.Either: { - // currentValue must be in a value in condition.value - const condValuesArray = Array.isArray(conditionTrimmed.value) - ? conditionTrimmed.value.map(String) - : [String(conditionTrimmed.value)] - if (isRadioFormFieldValue(currentValueTrimmed, args.fieldType)) { - if (condValuesArray.includes('Others')) { - // If the condition value is 'Others', - // then the condition must be satisfied if the current value is the special input value AND - // if the othersInput subfield has a value. - const satisfiesOthers = - currentValueTrimmed.value === RADIO_OTHERS_INPUT_VALUE && - !!currentValueTrimmed.othersInput - if (satisfiesOthers) return true - } - return condValuesArray.includes(String(currentValueTrimmed.value)) - } - return condValuesArray.includes(String(currentValueTrimmed)) - } - case LogicConditionState.Equal: { - if (isRadioFormFieldValue(currentValueTrimmed, args.fieldType)) { - // It's possible that the condition.value is in a single-valued array. - const condValue = Array.isArray(conditionTrimmed.value) - ? conditionTrimmed.value[0] - : conditionTrimmed.value - if ( - condValue === 'Others' && - currentValueTrimmed.value === RADIO_OTHERS_INPUT_VALUE - ) { - // If the condition value is 'Others', then the condition must be - // satisfied if the current value is the special input value. - // Otherwise, we still fall through in case the 'Others' was a custom - // value created by the user. - return true - } - return String(condValue) === String(currentValueTrimmed.value) - } - // In angular, number equality is string=== but decimal equality is number===. - // Need to replicate this behavior for backward-compatibility. - if (fieldType === BasicField.Decimal) { - return Number(currentValueTrimmed) === Number(conditionTrimmed.value) - } - return String(conditionTrimmed.value) === String(currentValueTrimmed) - } - } -} diff --git a/frontend/src/features/logic/utils/logic-adaptor.ts b/frontend/src/features/logic/utils/logic-adaptor.ts new file mode 100644 index 0000000000..0fa26121a8 --- /dev/null +++ b/frontend/src/features/logic/utils/logic-adaptor.ts @@ -0,0 +1,116 @@ +import { DeepPartialSkipArrayKey, UnpackNestedValue } from 'react-hook-form' +import { CamelCasedProperties } from 'type-fest' + +import { FormDto } from '~shared/types' +import { isNonEmpty } from '~shared/utils/isNonEmpty' +import { + FieldIdSet, + getLogicUnitPreventingSubmit as sharedGetLogicUnitPreventingSubmit, + getVisibleFieldIds as sharedGetVisibleFieldIds, +} from '~shared/utils/logic' + +import { FormFieldValues } from '~templates/Field' + +import { filterHiddenInputs } from '~features/public-form/utils' + +import { isLogicableField, isNotLogicableField } from './typeguards' + +/** + * Determines whether the submission should be prevented by form logic. If so, + * return the condition preventing the submission. If not, return undefined. + * @param params.formInputs the responses to retrieve logic units for. + * @param params.formLogics the logic conditions on the form + * @param params.visibleFieldIds the set of currently visible fields id. + * @returns a condition if submission is to prevented, otherwise `undefined` + */ +export const getLogicUnitPreventingSubmit = ({ + formFields, + formInputs, + formLogics, +}: { + formFields: FormDto['form_fields'] + formLogics: FormDto['form_logics'] + formInputs: FormFieldValues +}) => { + const filteredFormInputs = filterHiddenInputs({ + formFields, + formInputs, + formLogics, + }) + + const responseData = Object.keys(filteredFormInputs) + .map((_id) => { + const field = formFields.find((ff) => ff._id === _id) + if (!field) return null + const fieldTypeAndInput = { + fieldType: field.fieldType, + input: filteredFormInputs[_id], + } + // Type narrowing to help the typechecker along with complex if-else types + // Unfortunately, this requires the runtime check where isNotLogicableField + // is defined as !isLogicableField, allowing the final "else" case to be + // an unreachable code path. + if (isNotLogicableField(fieldTypeAndInput)) { + return { _id, fieldType: fieldTypeAndInput.fieldType } + } else if (isLogicableField(fieldTypeAndInput)) { + return { _id, ...fieldTypeAndInput } + } else { + // Unreachable branch + throw new Error('Unexpected fallthrough') + } + }) + .filter(isNonEmpty) + + const visibleFieldIds = new Set(Object.keys(filteredFormInputs)) + + return sharedGetLogicUnitPreventingSubmit( + responseData, + { form_fields: formFields, form_logics: formLogics }, + visibleFieldIds, + ) +} + +/** + * Gets the IDs of visible fields in a form according to its responses. + * This function loops through all the form fields until the set of visible + * fields no longer changes. The first loop adds all the fields with no + * conditions attached, the second adds fields which are made visible due to fields added in the previous loop, and so on. + * @param formInputs the field responses to retrieve logic units for. + * @param formProps the form fields and form logics to determine visible field ids. + * @returns a set of IDs of visible fields in the submission + */ +export const getVisibleFieldIds = ( + formInputs: UnpackNestedValue>, + { + formFields, + formLogics, + }: CamelCasedProperties>, +): FieldIdSet => { + const responseData = formFields + .map((ff) => { + const input = formInputs[ff._id] + if (!input) return null + const fieldTypeAndInput = { + fieldType: ff.fieldType, + input, + } + // Type narrowing to help the typechecker along with complex if-else types + // Unfortunately, this requires the runtime check where isNotLogicableField + // is defined as !isLogicableField, allowing the final "else" case to be + // an unreachable code path. + if (isNotLogicableField(fieldTypeAndInput)) { + return { _id: ff._id, fieldType: fieldTypeAndInput.fieldType } + } else if (isLogicableField(fieldTypeAndInput)) { + return { _id: ff._id, ...fieldTypeAndInput } + } else { + // Unreachable branch + throw new Error('Unexpected fallthrough') + } + }) + .filter(isNonEmpty) + + return sharedGetVisibleFieldIds(responseData, { + form_fields: formFields, + form_logics: formLogics, + }) +} diff --git a/frontend/src/features/logic/utils/typeguards.ts b/frontend/src/features/logic/utils/typeguards.ts index 7bd39d5429..a5e8004da0 100644 --- a/frontend/src/features/logic/utils/typeguards.ts +++ b/frontend/src/features/logic/utils/typeguards.ts @@ -1,50 +1,35 @@ import { DeepPartial } from 'react-hook-form' import { BasicField } from '~shared/types/field' -import { - FormCondition, - LogicableField, - LogicDto, - LogicType, - PreventSubmitLogicDto, - ShowFieldLogicDto, -} from '~shared/types/form' +import { LogicableField } from '~shared/types/form' import { FormFieldValue } from '~templates/Field' import { ALLOWED_LOGIC_FIELDS } from '../constants' -export const isShowFieldsLogic = ( - formLogic: LogicDto, -): formLogic is ShowFieldLogicDto => { - return formLogic.logicType === LogicType.ShowFields -} - -export const isPreventSubmitLogic = ( - formLogic: LogicDto, -): formLogic is PreventSubmitLogicDto => { - return formLogic.logicType === LogicType.PreventSubmit -} +type SingleAnswerLogicableField = Exclude -export const isRadioFormFieldValue = ( - value: DeepPartial>, - fieldType: F, -): value is FormFieldValue => { - return fieldType === BasicField.Radio && value !== undefined -} export const isLogicableField = (args: { fieldType: BasicField input: DeepPartial -}): args is { - fieldType: LogicableField - input: FormFieldValue -} => { +}): args is + | { + fieldType: SingleAnswerLogicableField + input: FormFieldValue + } + | { + fieldType: BasicField.Radio + input: FormFieldValue + } => { return ALLOWED_LOGIC_FIELDS.has(args.fieldType) } -export const isValueStringArray = ( - value: FormCondition['value'], -): value is string[] => { - // use .some because of limitation of typescript in calling .every() on union of array types: https://github.com/microsoft/TypeScript/issues/44373 - return Array.isArray(value) && !value.some((v) => typeof v === 'number') +export const isNotLogicableField = (args: { + fieldType: BasicField + input: DeepPartial +}): args is { + fieldType: Exclude + input: DeepPartial +} => { + return !isLogicableField(args) } diff --git a/frontend/src/features/public-form/utils/filterHiddenInputs.ts b/frontend/src/features/public-form/utils/filterHiddenInputs.ts index f50d560458..87851969c4 100644 --- a/frontend/src/features/public-form/utils/filterHiddenInputs.ts +++ b/frontend/src/features/public-form/utils/filterHiddenInputs.ts @@ -5,7 +5,7 @@ import type { FormDto, FormFieldDto } from '~shared/types' import type { FormFieldValues } from '~templates/Field/types' // Cannot import from directory index because of circular imports. -import { getVisibleFieldIds } from '~features/logic/utils/getVisibleFieldIds' +import { getVisibleFieldIds } from '~features/logic/utils/logic-adaptor' export const filterHiddenInputs = ({ formFields, diff --git a/frontend/src/templates/Field/Radio/constants.ts b/frontend/src/templates/Field/Radio/constants.ts index 7eb884b332..e1f409115e 100644 --- a/frontend/src/templates/Field/Radio/constants.ts +++ b/frontend/src/templates/Field/Radio/constants.ts @@ -1,2 +1,3 @@ +export { CLIENT_RADIO_OTHERS_INPUT_VALUE as RADIO_OTHERS_INPUT_VALUE } from '~shared/constants' + export const RADIO_OTHERS_INPUT_KEY = 'othersInput' -export const RADIO_OTHERS_INPUT_VALUE = '!!FORMSG_INTERNAL_RADIO_OTHERS_VALUE!!' diff --git a/shared/constants/form.ts b/shared/constants/form.ts index 4443ac5600..bf4f8688e5 100644 --- a/shared/constants/form.ts +++ b/shared/constants/form.ts @@ -73,6 +73,9 @@ export const PAYMENT_PRODUCT_FIELD_ID = 'payment_products' export const PAYMENT_VARIABLE_INPUT_AMOUNT_FIELD_ID = 'payment_variable_input_amount_field_id' +export const CLIENT_RADIO_OTHERS_INPUT_VALUE = + '!!FORMSG_INTERNAL_RADIO_OTHERS_VALUE!!' + // The current encrypt version to assign to the encrypted submission. // This is needed if we ever break backwards compatibility with // end-to-end encryption diff --git a/src/shared/util/__tests__/logic.spec.ts b/shared/utils/__tests__/logic.spec.ts similarity index 55% rename from src/shared/util/__tests__/logic.spec.ts rename to shared/utils/__tests__/logic.spec.ts index 1ab28a0d2c..2c709f8e5d 100644 --- a/src/shared/util/__tests__/logic.spec.ts +++ b/shared/utils/__tests__/logic.spec.ts @@ -1,32 +1,32 @@ import { ObjectId } from 'bson' import { - getApplicableIfFields, getApplicableIfStates, getLogicUnitPreventingSubmit, getVisibleFieldIds, -} from 'src/shared/util/logic' -import { - FieldResponse, - FormFieldSchema, - IFormDocument, - IPreventSubmitLogicSchema, - IRadioFieldSchema, - IShortTextFieldSchema, - IShowFieldsLogicSchema, -} from 'src/types' + LogicFieldClientRadioResponseInput, + LogicFieldResponse, + LogicFieldServerResponse, +} from '../logic' import { BasicField, - FieldBase, + FormDto, + FormFieldDto, LogicConditionState, LogicIfValue, LogicType, -} from '../../../../shared/types' + PreventSubmitLogicDto, + RadioFieldBase, + ShortTextFieldBase, + ShowFieldLogicDto, +} from '../../types' +import { CLIENT_RADIO_OTHERS_INPUT_VALUE } from '../../constants' describe('Logic validation', () => { /** Mock a field's bare essentials */ - const makeField = (fieldId: string) => ({ _id: fieldId } as FormFieldSchema) + const makeField = (fieldId: string, fieldType: BasicField) => + ({ _id: fieldId, fieldType } as FormFieldDto) /** * Mock a response @@ -37,30 +37,43 @@ describe('Logic validation', () => { */ const makeResponse = ( fieldId: string, - answer: string | number, - answerArray: string[] | null = null, - isVisible = true, - ): FieldResponse => { - const response: Record = { _id: fieldId, answer, isVisible } - if (answerArray) { - response.answerArray = answerArray + fieldType: BasicField, + answer?: string | number, + ): LogicFieldServerResponse => { + return { + _id: fieldId, + fieldType, + answer: String(answer), } - return response as FieldResponse } describe('visibility for different states', () => { - const CONDITION_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_RESPONSE = makeResponse(LOGIC_FIELD._id, 'lorem') + const CONDITION_FIELD_NUMBER = makeField( + new ObjectId().toHexString(), + BasicField.Number, + ) + const CONDITION_FIELD_DROPDOWN = makeField( + new ObjectId().toHexString(), + BasicField.Dropdown, + ) + const LOGIC_FIELD = makeField( + new ObjectId().toHexString(), + BasicField.ShortText, + ) + const LOGIC_RESPONSE = makeResponse( + LOGIC_FIELD._id, + BasicField.ShortText, + 'lorem', + ) const MOCK_LOGIC_ID = new ObjectId().toHexString() - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { _id: new ObjectId(), - form_fields: [CONDITION_FIELD, LOGIC_FIELD], - } as IFormDocument + form_fields: [CONDITION_FIELD_NUMBER, LOGIC_FIELD], + } as unknown as FormDto }) it('should compute the correct visibility for "is equals to"', () => { @@ -71,28 +84,42 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Equal, value: 0, }, ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto form.form_logics = [equalsCondition] // Act + Assert expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 0), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 0, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 1), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 1, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(false) @@ -106,35 +133,56 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Lte, value: 99, }, ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto form.form_logics = [lteCondition] // Act + Assert expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 98), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 98, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 99), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 99, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 100), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 100, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(false) @@ -148,32 +196,53 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Gte, value: 22, }, ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto form.form_logics = [gteCondition] // Act + Assert expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 23), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 23, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 22), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 22, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 21), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 21, + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(false) @@ -188,35 +257,58 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.MultiSelect, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_DROPDOWN._id, state: LogicConditionState.Either, value: validOptions, }, ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto + // Override the default condition field for this test only + form.form_fields = [CONDITION_FIELD_DROPDOWN, LOGIC_FIELD] form.form_logics = [eitherCondition] // Act + Assert expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, validOptions[0]), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + validOptions[0], + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, validOptions[1]), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + validOptions[1], + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [makeResponse(CONDITION_FIELD._id, 'invalid option'), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + 'invalid option', + ), + LOGIC_RESPONSE, + ], form, ).has(LOGIC_FIELD._id), ).toEqual(false) @@ -224,18 +316,33 @@ describe('Logic validation', () => { }) describe('preventing submission for different states', () => { - const CONDITION_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_RESPONSE = makeResponse(LOGIC_FIELD._id, 'lorem') + const CONDITION_FIELD_NUMBER = makeField( + new ObjectId().toHexString(), + BasicField.Number, + ) + const CONDITION_FIELD_DROPDOWN = makeField( + new ObjectId().toHexString(), + BasicField.Dropdown, + ) + + const LOGIC_FIELD = makeField( + new ObjectId().toHexString(), + BasicField.ShortText, + ) + const LOGIC_RESPONSE = makeResponse( + LOGIC_FIELD._id, + BasicField.ShortText, + 'lorem', + ) const MOCK_LOGIC_ID = new ObjectId().toHexString() - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { _id: new ObjectId(), - form_fields: [CONDITION_FIELD, LOGIC_FIELD], - } as IFormDocument + form_fields: [CONDITION_FIELD_NUMBER, LOGIC_FIELD], + } as unknown as FormDto }) it('should compute that submission should be prevented for "is equals to"', () => { @@ -245,7 +352,7 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Equal, value: 0, }, @@ -253,21 +360,35 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, preventSubmitMessage: "oh no you don't", - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto form.form_logics = [equalCondition] // Act + Assert expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 0), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 0, + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 1), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 1, + ), + LOGIC_RESPONSE, + ], form, ), ).toBeUndefined() @@ -280,7 +401,7 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Lte, value: 99, }, @@ -288,26 +409,47 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, preventSubmitMessage: "oh no you don't", - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto form.form_logics = [lteCondition] // Act + Assert expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 98), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 98, + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 99), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 99, + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 100), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 100, + ), + LOGIC_RESPONSE, + ], form, ), ).toBeUndefined() @@ -320,7 +462,7 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.Number, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_NUMBER._id, state: LogicConditionState.Gte, value: 22, }, @@ -328,28 +470,49 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, preventSubmitMessage: "oh no you don't", - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto form.form_logics = [gteCondition] // Act + Assert expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 23), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 23, + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 22), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 22, + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 21), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_NUMBER._id, + CONDITION_FIELD_NUMBER.fieldType, + 21, + ), + LOGIC_RESPONSE, + ], form, ), ).toBeUndefined() @@ -363,7 +526,7 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.MultiSelect, _id: '58169', - field: CONDITION_FIELD._id, + field: CONDITION_FIELD_DROPDOWN._id, state: LogicConditionState.Either, value: validOptions, }, @@ -371,28 +534,50 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, preventSubmitMessage: "oh no you don't", - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto + form.form_fields = [CONDITION_FIELD_DROPDOWN, LOGIC_FIELD] form.form_logics = [eitherCondition] // Act + Assert expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, validOptions[0]), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + validOptions[0], + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, validOptions[1]), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + validOptions[1], + ), + LOGIC_RESPONSE, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(CONDITION_FIELD._id, 'Option 3'), LOGIC_RESPONSE], + [ + makeResponse( + CONDITION_FIELD_DROPDOWN._id, + CONDITION_FIELD_DROPDOWN.fieldType, + 'Option 3', + ), + LOGIC_RESPONSE, + ], form, ), ).toBeUndefined() @@ -400,20 +585,37 @@ describe('Logic validation', () => { }) describe('show fields with multiple conditions', () => { - const CONDITION_FIELD_1 = makeField(new ObjectId().toHexString()) - const CONDITION_FIELD_2 = makeField(new ObjectId().toHexString()) - const LOGIC_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_RESPONSE = makeResponse(LOGIC_FIELD._id, 'lorem') + const CONDITION_FIELD_1_YESNO = makeField( + new ObjectId().toHexString(), + BasicField.YesNo, + ) + const CONDITION_FIELD_2_NUMBER = makeField( + new ObjectId().toHexString(), + BasicField.Number, + ) + const LOGIC_FIELD = makeField( + new ObjectId().toHexString(), + BasicField.ShortText, + ) + const LOGIC_RESPONSE = makeResponse( + LOGIC_FIELD._id, + BasicField.ShortText, + 'lorem', + ) const MOCK_LOGIC_ID_1 = new ObjectId().toHexString() const MOCK_LOGIC_ID_2 = new ObjectId().toHexString() - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { _id: new ObjectId(), - form_fields: [CONDITION_FIELD_1, CONDITION_FIELD_2, LOGIC_FIELD], - } as IFormDocument + form_fields: [ + CONDITION_FIELD_1_YESNO, + CONDITION_FIELD_2_NUMBER, + LOGIC_FIELD, + ], + } as unknown as FormDto }) it('should compute the correct visibility for AND conditions', () => { @@ -425,20 +627,20 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.SingleSelect, _id: '9577', - field: CONDITION_FIELD_1._id, + field: CONDITION_FIELD_1_YESNO._id, state: LogicConditionState.Equal, value: 'Yes', }, { ifValueType: LogicIfValue.SingleSelect, _id: '45633', - field: CONDITION_FIELD_2._id, + field: CONDITION_FIELD_2_NUMBER._id, state: LogicConditionState.Equal, value: 20, }, ], logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto form.form_logics = [multipleEqualConditions] @@ -446,8 +648,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -457,8 +667,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -468,8 +686,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -485,14 +711,14 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.SingleSelect, _id: '9577', - field: CONDITION_FIELD_1._id, + field: CONDITION_FIELD_1_YESNO._id, state: LogicConditionState.Equal, value: 'Yes', }, ], _id: MOCK_LOGIC_ID_1, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto const equalCondition2 = { show: [LOGIC_FIELD._id], @@ -500,14 +726,14 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.SingleSelect, _id: '89906', - field: CONDITION_FIELD_2._id, + field: CONDITION_FIELD_2_NUMBER._id, state: LogicConditionState.Equal, value: 20, }, ], _id: MOCK_LOGIC_ID_2, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto form.form_logics = [equalCondition, equalCondition2] @@ -515,8 +741,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -526,8 +760,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -537,8 +779,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -548,8 +798,16 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -559,20 +817,37 @@ describe('Logic validation', () => { }) describe('prevent submit with multiple conditions', () => { - const CONDITION_FIELD_1 = makeField(new ObjectId().toHexString()) - const CONDITION_FIELD_2 = makeField(new ObjectId().toHexString()) - const LOGIC_FIELD = makeField(new ObjectId().toHexString()) - const LOGIC_RESPONSE = makeResponse(LOGIC_FIELD._id, 'lorem') + const CONDITION_FIELD_1_YESNO = makeField( + new ObjectId().toHexString(), + BasicField.YesNo, + ) + const CONDITION_FIELD_2_NUMBER = makeField( + new ObjectId().toHexString(), + BasicField.Number, + ) + const LOGIC_FIELD = makeField( + new ObjectId().toHexString(), + BasicField.ShortText, + ) + const LOGIC_RESPONSE = makeResponse( + LOGIC_FIELD._id, + BasicField.ShortText, + 'lorem', + ) const MOCK_LOGIC_ID_1 = new ObjectId().toHexString() const MOCK_LOGIC_ID_2 = new ObjectId().toHexString() - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { _id: new ObjectId(), - form_fields: [CONDITION_FIELD_1, CONDITION_FIELD_2, LOGIC_FIELD], - } as IFormDocument + form_fields: [ + CONDITION_FIELD_1_YESNO, + CONDITION_FIELD_2_NUMBER, + LOGIC_FIELD, + ], + } as unknown as FormDto }) it('should correctly prevent submission for AND conditions', () => { @@ -583,29 +858,37 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.SingleSelect, _id: '9577', - field: CONDITION_FIELD_1._id, + field: CONDITION_FIELD_1_YESNO._id, state: LogicConditionState.Equal, value: 'Yes', }, { ifValueType: LogicIfValue.SingleSelect, _id: '45633', - field: CONDITION_FIELD_2._id, + field: CONDITION_FIELD_2_NUMBER._id, state: LogicConditionState.Equal, value: 20, }, ], logicType: LogicType.PreventSubmit, preventSubmitMessage: 'orh hor i tell teacher', - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto form.form_logics = [multipleEqualConditions] // Act + Assert expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -615,8 +898,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -626,8 +917,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -642,7 +941,7 @@ describe('Logic validation', () => { { ifValueType: LogicIfValue.SingleSelect, _id: '9577', - field: CONDITION_FIELD_1._id, + field: CONDITION_FIELD_1_YESNO._id, state: LogicConditionState.Equal, value: 'Yes', }, @@ -650,14 +949,14 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID_1, logicType: LogicType.PreventSubmit, preventSubmitMessage: 'this one cannot', - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto const equalCondition2 = { conditions: [ { ifValueType: LogicIfValue.SingleSelect, _id: '89906', - field: CONDITION_FIELD_2._id, + field: CONDITION_FIELD_2_NUMBER._id, state: LogicConditionState.Equal, value: 20, }, @@ -665,7 +964,7 @@ describe('Logic validation', () => { _id: MOCK_LOGIC_ID_2, logicType: LogicType.PreventSubmit, preventSubmitMessage: 'this one also cannot', - } as IPreventSubmitLogicSchema + } as unknown as PreventSubmitLogicDto form.form_logics = [equalCondition, equalCondition2] @@ -673,8 +972,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -684,8 +991,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'Yes'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'Yes', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -695,8 +1010,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 20), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 20, + ), LOGIC_RESPONSE, ], form, @@ -706,8 +1029,16 @@ describe('Logic validation', () => { expect( getLogicUnitPreventingSubmit( [ - makeResponse(CONDITION_FIELD_1._id, 'No'), - makeResponse(CONDITION_FIELD_2._id, 100), + makeResponse( + CONDITION_FIELD_1_YESNO._id, + CONDITION_FIELD_1_YESNO.fieldType, + 'No', + ), + makeResponse( + CONDITION_FIELD_2_NUMBER._id, + CONDITION_FIELD_2_NUMBER.fieldType, + 100, + ), LOGIC_RESPONSE, ], form, @@ -724,22 +1055,22 @@ describe('Logic validation', () => { fieldType: BasicField.Radio, fieldOptions: ['Option 1', 'Option 2'], othersRadioButton: true, - } as IRadioFieldSchema + } as FormFieldDto const MOCK_TEXT_FIELD = { _id: new ObjectId().toHexString(), fieldType: BasicField.ShortText, - } as IShortTextFieldSchema + } as FormFieldDto - const fillInRadioButton = (fieldValue: string) => - Object.assign({}, MOCK_RADIO_FIELD, { fieldValue, isVisible: true }) + const fillInRadioButton = (input: LogicFieldClientRadioResponseInput) => + Object.assign({}, MOCK_RADIO_FIELD, { input, isVisible: true }) - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { _id: new ObjectId(), - } as IFormDocument + } as unknown as FormDto }) it('should compute the correct visibility for radiobutton Others on clientside', () => { @@ -757,9 +1088,9 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto - const textFieldResponse = Object.assign({}, MOCK_TEXT_FIELD, { + const textLogicFieldServerResponse = Object.assign({}, MOCK_TEXT_FIELD, { fieldValue: 'lorem', }) form.form_fields = [MOCK_RADIO_FIELD, MOCK_TEXT_FIELD] @@ -767,14 +1098,25 @@ describe('Logic validation', () => { // Act + Assert expect( getVisibleFieldIds( - [fillInRadioButton('radioButtonOthers'), textFieldResponse], + [ + fillInRadioButton({ + value: CLIENT_RADIO_OTHERS_INPUT_VALUE, + othersInput: 'test', + }) as unknown as LogicFieldResponse, + textLogicFieldServerResponse, + ], form, ).has(MOCK_TEXT_FIELD._id), ).toEqual(true) expect( getVisibleFieldIds( - [fillInRadioButton('Option 1'), textFieldResponse], + [ + fillInRadioButton({ + value: 'Option 1', + }) as unknown as LogicFieldResponse, + textLogicFieldServerResponse, + ], form, ).has(MOCK_TEXT_FIELD._id), ).toEqual(false) @@ -795,10 +1137,11 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema + } as unknown as ShowFieldLogicDto - const textFieldResponse = makeResponse( + const textLogicFieldServerResponse = makeResponse( new ObjectId().toHexString(), + BasicField.ShortText, 'lorem', ) form.form_fields = [MOCK_RADIO_FIELD, MOCK_TEXT_FIELD] @@ -808,8 +1151,12 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( [ - makeResponse(MOCK_RADIO_FIELD._id, 'Others: School'), - textFieldResponse, + makeResponse( + MOCK_RADIO_FIELD._id, + MOCK_RADIO_FIELD.fieldType, + 'Others: School', + ), + textLogicFieldServerResponse, ], form, ).has(MOCK_TEXT_FIELD._id), @@ -817,7 +1164,14 @@ describe('Logic validation', () => { expect( getVisibleFieldIds( - [makeResponse(MOCK_RADIO_FIELD._id, 'Option 1'), textFieldResponse], + [ + makeResponse( + MOCK_RADIO_FIELD._id, + MOCK_RADIO_FIELD.fieldType, + 'Option 1', + ), + textLogicFieldServerResponse, + ], form, ).has(MOCK_TEXT_FIELD._id), ).toEqual(false) @@ -825,13 +1179,16 @@ describe('Logic validation', () => { }) describe('visibility for circular logic', () => { - const FIELD_1 = makeField(new ObjectId().toHexString()) - const FIELD_2 = makeField(new ObjectId().toHexString()) - const VISIBLE_FIELD = makeField(new ObjectId().toHexString()) + const FIELD_1 = makeField(new ObjectId().toHexString(), BasicField.YesNo) + const FIELD_2 = makeField(new ObjectId().toHexString(), BasicField.YesNo) + const VISIBLE_FIELD = makeField( + new ObjectId().toHexString(), + BasicField.ShortText, + ) const MOCK_LOGIC_ID_1 = new ObjectId() const MOCK_LOGIC_ID_2 = new ObjectId() - let form: IFormDocument + let form: FormDto beforeEach(() => { form = { @@ -850,7 +1207,7 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID_1, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema, + } as unknown as ShowFieldLogicDto, { show: [FIELD_1._id], conditions: [ @@ -864,9 +1221,9 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID_2, logicType: LogicType.ShowFields, - } as IShowFieldsLogicSchema, + } as unknown as ShowFieldLogicDto, ], - } as unknown as IFormDocument + } as unknown as FormDto }) it('should compute the correct visibility for circular logic where all fields are hidden', () => { @@ -875,8 +1232,8 @@ describe('Logic validation', () => { for (const field2Response of ['Yes', 'No']) { const visibleFieldIds = getVisibleFieldIds( [ - makeResponse(FIELD_1._id, field1Response), - makeResponse(FIELD_2._id, field2Response), + makeResponse(FIELD_1._id, FIELD_1.fieldType, field1Response), + makeResponse(FIELD_2._id, FIELD_2.fieldType, field2Response), ], form, ) @@ -892,9 +1249,9 @@ describe('Logic validation', () => { for (const field2Response of ['Yes', 'No']) { const visibleFieldIds = getVisibleFieldIds( [ - makeResponse(FIELD_1._id, field1Response), - makeResponse(FIELD_2._id, field2Response), - makeResponse(VISIBLE_FIELD._id, 'Yes'), + makeResponse(FIELD_1._id, FIELD_1.fieldType, field1Response), + makeResponse(FIELD_2._id, FIELD_2.fieldType, field2Response), + makeResponse(VISIBLE_FIELD._id, VISIBLE_FIELD.fieldType, 'Yes'), ], form, ) @@ -913,24 +1270,24 @@ describe('Logic validation', () => { fieldType: BasicField.Radio, fieldOptions: ['Option 1', 'Option 2'], othersRadioButton: true, - } as IRadioFieldSchema + } as unknown as FormFieldDto const MOCK_TEXT_FIELD = { _id: new ObjectId(), fieldType: BasicField.ShortText, - } as IShortTextFieldSchema + } as unknown as FormFieldDto - const fillInRadioButton = (fieldValue: string) => - Object.assign({}, MOCK_RADIO_FIELD, { fieldValue, isVisible: true }) + const fillInRadioButton = (input: LogicFieldClientRadioResponseInput) => + Object.assign({}, MOCK_RADIO_FIELD, { input, isVisible: true }) - let form: IFormDocument + let form: FormDto beforeEach(() => { - form = { _id: new ObjectId() } as IFormDocument + form = { _id: new ObjectId() } as unknown as FormDto }) it('should correctly prevent submission for radiobutton Others on clientside', () => { // Arrange - const textFieldResponse = Object.assign({}, MOCK_TEXT_FIELD, { + const textLogicFieldServerResponse = Object.assign({}, MOCK_TEXT_FIELD, { fieldValue: 'lorem', }) form.form_fields = [MOCK_RADIO_FIELD, MOCK_TEXT_FIELD] @@ -947,20 +1304,31 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, - } as IPreventSubmitLogicSchema, + } as unknown as PreventSubmitLogicDto, ] // Act + Assert expect( getLogicUnitPreventingSubmit( - [fillInRadioButton('radioButtonOthers'), textFieldResponse], + [ + fillInRadioButton({ + value: CLIENT_RADIO_OTHERS_INPUT_VALUE, + othersInput: 'test', + }) as unknown as LogicFieldResponse, + textLogicFieldServerResponse, + ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [fillInRadioButton('Option 1'), textFieldResponse], + [ + fillInRadioButton({ + value: 'Option 1', + }) as unknown as LogicFieldResponse, + textLogicFieldServerResponse, + ], form, ), ).toBeUndefined() @@ -968,8 +1336,9 @@ describe('Logic validation', () => { it('should correctly prevent submission for radiobutton Others on serverside', () => { // Arrange - const textFieldResponse = makeResponse( + const textLogicFieldServerResponse = makeResponse( new ObjectId().toHexString(), + BasicField.ShortText, 'lorem', ) form.form_fields = [MOCK_RADIO_FIELD, MOCK_TEXT_FIELD] @@ -986,22 +1355,33 @@ describe('Logic validation', () => { ], _id: MOCK_LOGIC_ID, logicType: LogicType.PreventSubmit, - } as IPreventSubmitLogicSchema, + } as unknown as PreventSubmitLogicDto, ] // Act + Assert expect( getLogicUnitPreventingSubmit( [ - makeResponse(MOCK_RADIO_FIELD._id, 'Others: School'), - textFieldResponse, + makeResponse( + MOCK_RADIO_FIELD._id, + MOCK_RADIO_FIELD.fieldType, + 'Others: School', + ), + textLogicFieldServerResponse, ], form, ), ).toEqual(form.form_logics[0]) expect( getLogicUnitPreventingSubmit( - [makeResponse(MOCK_RADIO_FIELD._id, 'Option 1'), textFieldResponse], + [ + makeResponse( + MOCK_RADIO_FIELD._id, + MOCK_RADIO_FIELD.fieldType, + 'Option 1', + ), + textLogicFieldServerResponse, + ], form, ), ).toBeUndefined() @@ -1023,39 +1403,20 @@ describe('Logic util', () => { (fieldType) => !VALID_IF_CONDITION_FIELDS.includes(fieldType), ) - describe('getApplicableIfFields', () => { - it('should not filter fields suitable as an if-conditional', () => { - const validIfFields: FieldBase[] = VALID_IF_CONDITION_FIELDS.map( - (fieldType) => ({ fieldType } as unknown as FieldBase), - ) - const fields = getApplicableIfFields(validIfFields) - validIfFields.forEach((v, i) => expect(v).toStrictEqual(fields[i])) - }) - it('should filter fields not suitable as an if-conditional', () => { - const invalidIfFields: FieldBase[] = INVALID_IF_CONDITION_FIELDS.map( - (x) => x as unknown as FieldBase, - ) - const fields = getApplicableIfFields(invalidIfFields) - expect(fields).toStrictEqual([]) - }) - }) - describe('getApplicableIfStates', () => { it('should return valid logic states for categorical field types', () => { const categoricalFields = [BasicField.Dropdown, BasicField.Radio] categoricalFields.forEach((fieldType) => { const states = getApplicableIfStates(fieldType) - expect(states).toIncludeSameMembers([ - LogicConditionState.Equal, - LogicConditionState.Either, - ]) - expect(states).toBeArrayOfSize(2) + expect(states).toContain(LogicConditionState.Equal) + expect(states).toContain(LogicConditionState.Either) + expect(states.length).toEqual(2) }) }) it('should return valid logic states for binary field types', () => { const states = getApplicableIfStates(BasicField.YesNo) - expect(states).toIncludeSameMembers([LogicConditionState.Equal]) - expect(states).toBeArrayOfSize(1) + expect(states).toContain(LogicConditionState.Equal) + expect(states.length).toEqual(1) }) it('should return valid logic states for numerical field types', () => { const numericalFields = [ @@ -1065,12 +1426,10 @@ describe('Logic util', () => { ] numericalFields.forEach((fieldType) => { const states = getApplicableIfStates(fieldType) - expect(states).toIncludeSameMembers([ - LogicConditionState.Equal, - LogicConditionState.Lte, - LogicConditionState.Gte, - ]) - expect(states).toBeArrayOfSize(3) + expect(states).toContain(LogicConditionState.Equal) + expect(states).toContain(LogicConditionState.Lte) + expect(states).toContain(LogicConditionState.Gte) + expect(states.length).toEqual(3) }) }) it('should return empty array for invalid conditional fields', () => { diff --git a/src/shared/util/logic.ts b/shared/utils/logic.ts similarity index 56% rename from src/shared/util/logic.ts rename to shared/utils/logic.ts index 210e920059..2ef97815b8 100644 --- a/src/shared/util/logic.ts +++ b/shared/utils/logic.ts @@ -1,20 +1,16 @@ -// TODO: Import shared code from shared/logic.ts when possible. +import { CLIENT_RADIO_OTHERS_INPUT_VALUE } from '../constants' import { BasicField, - FieldBase, + FormDto, LogicConditionState, LogicType, -} from '../../../shared/types' -import { - FieldResponse, - IClientFieldSchema, - IConditionSchema, - IFormDocument, - ILogicSchema, - IPreventSubmitLogicSchema, - IShowFieldsLogicSchema, + FormCondition, + LogicDto, + ShowFieldLogicDto, + PreventSubmitLogicDto, LogicCondition, -} from '../../types' + LogicableField, +} from '../types' const LOGIC_CONDITIONS: LogicCondition[] = [ [ @@ -53,13 +49,6 @@ export const LOGIC_MAP = new Map( LOGIC_CONDITIONS, ) -/** - * Given a list of form fields, returns only the fields that are - * allowed to be present in the if-condition dropdown in the Logic tab. - */ -export const getApplicableIfFields = (formFields: FieldBase[]): FieldBase[] => - formFields.filter((field) => !!LOGIC_MAP.get(field.fieldType)) - /** * Given a single form field type, returns the applicable logic states for that field type. */ @@ -67,23 +56,84 @@ export const getApplicableIfStates = ( fieldType: BasicField, ): LogicConditionState[] => LOGIC_MAP.get(fieldType) ?? [] -type GroupedLogic = Record -export type FieldIdSet = Set -// This module handles logic on both the client side (IFieldSchema[]) -// and server side (FieldResponse[]) -type LogicFieldSchemaOrResponse = IClientFieldSchema | FieldResponse +export const isValueStringArray = ( + value: FormCondition['value'], +): value is string[] => { + // use .some because of limitation of typescript in calling .every() on union of array types: https://github.com/microsoft/TypeScript/issues/44373 + return Array.isArray(value) && !value.some((v) => typeof v === 'number') +} + +/** + * Utility function to trim condition.value strings + * Trim logic condition for backward compability as some logic conditions have trailing whitespace + */ +const trimConditionValue = (condition: FormCondition) => ({ + field: condition.field, + state: condition.state, + value: isValueStringArray(condition.value) + ? condition.value.map((value) => value.trim()) + : typeof condition.value === 'string' + ? condition.value.trim() + : condition.value, + ifValueType: condition.ifValueType, +}) + +type GroupedLogic = Record + +export type FieldIdSet = Set +// This module handles logic on both the client side (LogicFieldClientResponse) +// and server side (LogicFieldServerResponse) +export type LogicFieldClientRadioResponseInput = { + value?: string + othersInput?: string +} +type LogicFieldClientLogicableRadioResponse = { + _id: string + fieldType: BasicField.Radio + input: LogicFieldClientRadioResponseInput +} +type LogicFieldClientLogicableNonRadioResponse = { + _id: string + fieldType: Exclude + input?: string +} +type LogicFieldClientNonLogicableResponse = { + _id: string + fieldType: Exclude +} +export type LogicFieldClientResponse = + | LogicFieldClientLogicableRadioResponse + | LogicFieldClientLogicableNonRadioResponse + | LogicFieldClientNonLogicableResponse + +type LogicFieldServerLogicableResponse = { + _id: string + fieldType: LogicableField + answer: string +} +type LogicFieldServerNonLogicableResponse = { + _id: string + fieldType: Exclude +} +export type LogicFieldServerResponse = + | LogicFieldServerLogicableResponse + | LogicFieldServerNonLogicableResponse + +export type LogicFieldResponse = + | LogicFieldClientResponse + | LogicFieldServerResponse // Returns typed ShowFields logic unit const isShowFieldsLogic = ( - formLogic: ILogicSchema, -): formLogic is IShowFieldsLogicSchema => { + formLogic: LogicDto, +): formLogic is ShowFieldLogicDto => { return formLogic.logicType === LogicType.ShowFields } // Returns typed PreventSubmit logic unit const isPreventSubmitLogic = ( - formLogic: ILogicSchema, -): formLogic is IPreventSubmitLogicSchema => { + formLogic: LogicDto, +): formLogic is PreventSubmitLogicDto => { return formLogic.logicType === LogicType.PreventSubmit } @@ -118,17 +168,16 @@ const isPreventSubmitLogic = ( * @param form the form object to group its logic by field for * @returns an object containing fields to be displayed and their corresponding conditions, keyed by id of the displayable field */ -export const groupLogicUnitsByField = (form: IFormDocument): GroupedLogic => { - const formId = form._id - const formLogics = form.form_logics?.filter(isShowFieldsLogic) ?? [] - const formFieldIds = new Set( - form.form_fields?.map((field) => String(field._id)), - ) +export const groupLogicUnitsByField = ({ + form_logics, + form_fields, +}: Pick): GroupedLogic => { + const formLogics = form_logics?.filter(isShowFieldsLogic) ?? [] + const formFieldIds = new Set(form_fields?.map((field) => String(field._id))) /** An index of logic units keyed by the field id to be shown. */ const logicUnitsGroupedByField: GroupedLogic = {} - let hasInvalidLogic = false formLogics.forEach(function (logicUnit) { // Only add fields with valid logic conditions to the returned map. if (allConditionsExist(logicUnit.conditions, formFieldIds)) { @@ -141,12 +190,8 @@ export const groupLogicUnitsByField = (form: IFormDocument): GroupedLogic => { logicUnitsGroupedByField[fieldId].push(logicUnit.conditions) } }) - } else { - hasInvalidLogic = true } }) - if (hasInvalidLogic && formId) - console.info(`formId="${form._id}" message="Form has invalid logic"`) return logicUnitsGroupedByField } @@ -156,16 +201,15 @@ export const groupLogicUnitsByField = (form: IFormDocument): GroupedLogic => { * @param form the form document to check * @returns array of conditions that prevent submission, can be empty */ -const getPreventSubmitConditions = ( - form: IFormDocument, -): IPreventSubmitLogicSchema[] => { - const formFieldIds = new Set( - form.form_fields?.map((field) => String(field._id)), - ) +const getPreventSubmitConditions = ({ + form_fields, + form_logics, +}: Pick): PreventSubmitLogicDto[] => { + const formFieldIds = new Set(form_fields?.map((field) => String(field._id))) const preventFormLogics = - form.form_logics?.filter( - (formLogic): formLogic is IPreventSubmitLogicSchema => + form_logics?.filter( + (formLogic): formLogic is PreventSubmitLogicDto => isPreventSubmitLogic(formLogic) && allConditionsExist(formLogic.conditions, formFieldIds), ) ?? [] @@ -178,14 +222,14 @@ const getPreventSubmitConditions = ( * return the condition preventing the submission. If not, return undefined. * @param submission the submission responses to retrieve logic units for. Can be `form_fields` (on client), or `req.body.responses` (on server) * @param form the form document for the submission - * @param optionalVisibleFieldIds the optional set of currently visible fields. If this is not provided, it will be recomputed using the given form parameter. + * @param visibleFieldIds the set of currently visible fields. Optional for testing purposes * @returns a condition if submission is to prevented, otherwise `undefined` */ export const getLogicUnitPreventingSubmit = ( - submission: LogicFieldSchemaOrResponse[], - form: IFormDocument, + submission: LogicFieldResponse[], + form: Pick, visibleFieldIds?: FieldIdSet, -): IPreventSubmitLogicSchema | undefined => { +): PreventSubmitLogicDto | undefined => { const definedVisibleFieldIds = visibleFieldIds ?? getVisibleFieldIds(submission, form) const preventSubmitConditions = getPreventSubmitConditions(form) @@ -205,7 +249,7 @@ export const getLogicUnitPreventingSubmit = ( * @returns true if every condition's related form field id exists in the set of formFieldIds, false otherwise. */ const allConditionsExist = ( - conditions: IConditionSchema[], + conditions: FormCondition[], formFieldIds: FieldIdSet, ): boolean => { return conditions.every((condition) => @@ -223,8 +267,8 @@ const allConditionsExist = ( * @returns a set of IDs of visible fields in the submission */ export const getVisibleFieldIds = ( - submission: LogicFieldSchemaOrResponse[], - form: IFormDocument, + submission: LogicFieldResponse[], + form: Pick, ): FieldIdSet => { const logicUnitsGroupedByField = groupLogicUnitsByField(form) const visibleFieldIds: FieldIdSet = new Set() @@ -265,11 +309,11 @@ export const getVisibleFieldIds = ( * @returns true if all the conditions are satisfied, false otherwise */ const isLogicUnitSatisfied = ( - submission: LogicFieldSchemaOrResponse[], - logicUnit: IConditionSchema[], + submission: LogicFieldResponse[], + logicUnit: FormCondition[], visibleFieldIds: FieldIdSet, -): boolean => { - return logicUnit.every((condition) => { +): boolean => + logicUnit.every((condition) => { const conditionField = findConditionField(submission, condition.field) return ( conditionField && @@ -277,20 +321,20 @@ const isLogicUnitSatisfied = ( isConditionFulfilled(conditionField, condition) ) }) -} const getCurrentValue = ( - field: LogicFieldSchemaOrResponse, -): string | null | undefined | string[] => { - if ('fieldValue' in field) { + field: LogicFieldResponse, +): string | LogicFieldClientRadioResponseInput | null | undefined => { + if ('input' in field) { // client - return field.fieldValue + return field.input } else if ('answer' in field) { // server return field.answer } return null } + /** * Checks if the field's value matches the condition * @param {Object} field @@ -298,69 +342,108 @@ const getCurrentValue = ( * @param {String} condition.state - The type of condition */ const isConditionFulfilled = ( - field: LogicFieldSchemaOrResponse, - condition: IConditionSchema, + field: LogicFieldResponse, + condition: FormCondition, ): boolean => { - if (!field || !condition) { - return false - } let currentValue = getCurrentValue(field) + + // Trim the current value + if (typeof currentValue === 'string') { + currentValue = currentValue.trim() + } + if ( currentValue === null || currentValue === undefined || - currentValue.length === 0 + currentValue === '' ) { return false } - if ( - condition.state === LogicConditionState.Equal || - condition.state === LogicConditionState.Either - ) { - // condition.value can be a string (is equals to), or an array (is either) (not strictly true either...) - const conditionValues = ([] as unknown[]) - .concat(condition.value) - .map(String) - // TODO #4279: Revisit decision to trim in backend after React rollout is complete - .map((opt) => opt.trim()) - currentValue = String(currentValue) - /* - Handling 'Others' for radiobutton - - form_logics: [{ ... value : 'Others' }] - - Client-side: - When an Others radiobutton is checked, the fieldValue is 'radioButtonOthers' - - Server-side: - When an Others radiobutton is checked, and submitted with the required value, - the answer is: 'Others: value' - */ - - // TODO: An option that is named "Others: Something..." will also pass this test, - // even if the field has not been configured to set othersRadioButton=true - if (conditionValues.indexOf('Others') > -1) { - // TODO: This is used for angular's client. The server has no need for these magic values, as they are never seen by the server. - if (field.fieldType === 'radiobutton') { - conditionValues.push('radioButtonOthers') - } else if (field.fieldType === 'checkbox') { - conditionValues.push('checkboxOthers') // Checkbox currently doesn't have logic, but the 'Others' will work in the future if it in implemented + if (typeof currentValue !== 'string') { + // Handle the case where the value is a client radio field value. + currentValue = { + ...currentValue, + value: currentValue.value?.trim(), + } + } + + // Evaluate condition + const trimmedCondition = trimConditionValue(condition) + + switch (trimmedCondition.state) { + case LogicConditionState.Lte: + return Number(currentValue) <= Number(trimmedCondition.value) + case LogicConditionState.Gte: + return Number(currentValue) >= Number(trimmedCondition.value) + case LogicConditionState.Equal: + case LogicConditionState.Either: { + const conditionValues = Array.isArray(trimmedCondition.value) + ? trimmedCondition.value + : [trimmedCondition.value] + + /** + * Field type Radio Decimal Everything else + * Server-side (1) (2) (3) + * Client-side (4) (5) (6) + * + * (1) If conditionValues includes "Others", must check for radio answer + * starting with "Others: ". + * If not, continue the usual string-based check with (3). + * (4) If conditionValues includes "Others", check for the value being + * special radio value and the othersInput subfield having a value. + * If not, continue the usual string-based check with (3). + * (2) + (5) Use Number equality for decimals + * (3) + (6) Use String equality for everything else + */ + + // Special radio others check + if ( + field.fieldType === BasicField.Radio && + conditionValues.includes('Others') + ) { + if (typeof currentValue === 'string') { + // (1) Server-side handling + if (currentValue.startsWith('Others: ')) { + return true + } + } else { + // (4) Client-side handling + if ( + currentValue.value === CLIENT_RADIO_OTHERS_INPUT_VALUE && + !!currentValue.othersInput + ) { + return true + } + } } - // This needs to work for manual "Others" options created by users as well. - // The only reason this works is that manual "Others" will satisfy the client-side - // condition, albeit on the server. See #5318 for more info. - return ( - conditionValues.indexOf(currentValue) > -1 || // Client-side - currentValue.startsWith('Others: ') - ) // Server-side + + // Bump client-side radio value nested in the object back up to the main level + // This is fine since the "Others" check above would have caught if the othersInput + // satisfied the logic. + let currentValueString: string | undefined + if (typeof currentValue !== 'string') { + currentValueString = currentValue.value + } else { + currentValueString = currentValue + } + + // (2) + (5) Handle the decimal case + if (field.fieldType === BasicField.Decimal) { + return conditionValues.some( + (conditionValue) => + Number(conditionValue) === Number(currentValueString), + ) + } + + // (3) + (6) Handle everything else + return conditionValues.some( + (conditionValue) => + String(conditionValue) === String(currentValueString), + ) } - return conditionValues.indexOf(currentValue) > -1 - } else if (condition.state === LogicConditionState.Lte) { - return Number(currentValue) <= Number(condition.value) - } else if (condition.state === LogicConditionState.Gte) { - return Number(currentValue) >= Number(condition.value) - } else { - return false + default: + return false } } @@ -372,9 +455,9 @@ const isConditionFulfilled = ( * @returns the condition field if it exists, `undefined` otherwise */ const findConditionField = ( - submission: LogicFieldSchemaOrResponse[], - fieldId: IConditionSchema['field'], -): LogicFieldSchemaOrResponse | undefined => { + submission: LogicFieldResponse[], + fieldId: FormCondition['field'], +): LogicFieldResponse | undefined => { return submission.find( (submittedField) => String(submittedField._id) === String(fieldId), ) diff --git a/src/app/models/form.server.model.ts b/src/app/models/form.server.model.ts index 1497da9fe4..275f0aa1d0 100644 --- a/src/app/models/form.server.model.ts +++ b/src/app/models/form.server.model.ts @@ -51,7 +51,7 @@ import { WorkflowType, } from '../../../shared/types' import { reorder } from '../../../shared/utils/immutable-array-fns' -import { getApplicableIfStates } from '../../shared/util/logic' +import { getApplicableIfStates } from '../../../shared/utils/logic' import { FormFieldSchema, FormLogicSchema, diff --git a/src/app/modules/submission/__tests__/ParsedResponsesObject.class.spec.ts b/src/app/modules/submission/__tests__/ParsedResponsesObject.class.spec.ts index 4e0892e3eb..2e5109e0ec 100644 --- a/src/app/modules/submission/__tests__/ParsedResponsesObject.class.spec.ts +++ b/src/app/modules/submission/__tests__/ParsedResponsesObject.class.spec.ts @@ -9,7 +9,7 @@ import { LogicType, MyInfoAttribute, } from '../../../../../shared/types' -import * as LogicUtil from '../../../../shared/util/logic' +import * as LogicUtil from '../../../../../shared/utils/logic' import { FormFieldSchema, IFormDocument, diff --git a/src/app/modules/submission/encrypt-submission/__tests__/IncomingEncryptSubmission.class.spec.ts b/src/app/modules/submission/encrypt-submission/__tests__/IncomingEncryptSubmission.class.spec.ts index 235d1aba6f..963153bbed 100644 --- a/src/app/modules/submission/encrypt-submission/__tests__/IncomingEncryptSubmission.class.spec.ts +++ b/src/app/modules/submission/encrypt-submission/__tests__/IncomingEncryptSubmission.class.spec.ts @@ -12,7 +12,7 @@ import { FormResponseMode, LogicType, } from '../../../../../../shared/types' -import * as LogicUtil from '../../../../../shared/util/logic' +import * as LogicUtil from '../../../../../../shared/utils/logic' import { IPopulatedEncryptedForm, IPreventSubmitLogicSchema, diff --git a/src/app/utils/logic-adaptor.ts b/src/app/utils/logic-adaptor.ts index e93ee2ef8f..36c61accbe 100644 --- a/src/app/utils/logic-adaptor.ts +++ b/src/app/utils/logic-adaptor.ts @@ -1,32 +1,33 @@ import { ok, Result } from 'neverthrow' +import { FormDto, PreventSubmitLogicDto } from '../../../shared/types' import { FieldIdSet, getLogicUnitPreventingSubmit as logicGetLogicUnitPreventingSubmit, getVisibleFieldIds as logicGetVisibleFieldIds, -} from '../../shared/util/logic' -import { - FieldResponse, - IFormDocument, - IPreventSubmitLogicSchema, -} from '../../types' +} from '../../../shared/utils/logic' +import { FieldResponse, IFormDocument } from '../../types' import { ProcessingError } from '../modules/submission/submission.errors' -export { FieldIdSet } from '../../shared/util/logic' +export { FieldIdSet } from '../../../shared/utils/logic' export const getVisibleFieldIds = ( submission: FieldResponse[], form: IFormDocument, ): Result => { - return ok(logicGetVisibleFieldIds(submission, form)) + return ok(logicGetVisibleFieldIds(submission, form as unknown as FormDto)) } export const getLogicUnitPreventingSubmit = ( submission: FieldResponse[], form: IFormDocument, - visibleFieldIds?: FieldIdSet, -): Result => { + visibleFieldIds: FieldIdSet, +): Result => { return ok( - logicGetLogicUnitPreventingSubmit(submission, form, visibleFieldIds), + logicGetLogicUnitPreventingSubmit( + submission, + form as unknown as FormDto, + visibleFieldIds, + ), ) } From 770d28fb8dc63e2d2632cac71f826940f002ee09 Mon Sep 17 00:00:00 2001 From: Ken Lee Shu Ming Date: Tue, 19 Mar 2024 14:13:47 +0800 Subject: [PATCH 12/13] chore: package cleanup (#7141) * chore: remove unused html-loder * chore: remove old webpack deps * chore: remove angular-era deps * clear off winston todo * chore: update package-lock.json --- package-lock.json | 1163 +------------------- package.json | 9 - serverless/virus-scanner/package-lock.json | 1131 ++++++++++++++++++- src/app/config/logger.ts | 7 - 4 files changed, 1113 insertions(+), 1197 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a30669e4a..83a346786e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,7 +38,6 @@ "convict": "^6.2.4", "convict-format-with-validator": "^6.2.0", "cookie-parser": "~1.4.6", - "css-toggle-switch": "^4.1.0", "csv-string": "^4.1.1", "cuid": "^2.1.8", "date-fns": "^2.30.0", @@ -102,7 +101,6 @@ "ts-essentials": "^9.3.1", "tweetnacl": "^1.0.1", "twilio": "~4.19.3", - "ui-select": "^0.19.8", "uid-generator": "^2.0.0", "ulid": "^2.3.0", "uuid": "^9.0.0", @@ -134,7 +132,6 @@ "@types/express": "^4.17.17", "@types/express-request-id": "^1.4.3", "@types/express-session": "^1.17.4", - "@types/has-ansi": "^3.0.0", "@types/helmet": "4.0.0", "@types/html-escaper": "^3.0.0", "@types/http-errors": "^2.0.1", @@ -168,7 +165,6 @@ "copyfiles": "^2.4.1", "core-js": "^3.28.0", "coveralls": "^3.1.1", - "css-loader": "^2.1.1", "csv-parse": "^5.3.6", "env-cmd": "^10.1.0", "eslint": "^8.30.0", @@ -180,9 +176,7 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-typesafe": "^0.5.2", - "file-loader": "^4.3.0", "form-data": "^4.0.0", - "html-loader": "~0.5.5", "htmlhint": "^1.1.4", "husky": "^8.0.3", "jest": "^29.5.0", @@ -193,9 +187,7 @@ "lint-staged": "^13.1.0", "maildev": "^2.1.0", "mockdate": "^3.0.5", - "ngrok": "^4.3.3", "prettier": "^2.8.1", - "proxyquire": "^2.1.3", "react-dev-inspector": "^1.8.6", "regenerator": "^0.14.10", "rimraf": "^4.4.0", @@ -208,7 +200,6 @@ "ts-node-dev": "^2.0.0", "type-fest": "^3.10.0", "typescript": "^4.9.4", - "url-loader": "^1.1.2", "webpack": "^4.46.0", "webpack-cli": "^3.3.12", "worker-loader": "^2.0.0" @@ -6560,17 +6551,6 @@ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" - } - }, "node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -8341,17 +8321,6 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -8458,17 +8427,6 @@ "@types/node": "*" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "node_modules/@types/compression": { "version": "1.7.2", "dev": true, @@ -8600,11 +8558,6 @@ "@types/node": "*" } }, - "node_modules/@types/has-ansi": { - "version": "3.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/@types/helmet": { "version": "4.0.0", "dev": true, @@ -8618,11 +8571,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/@types/http-errors": { "version": "2.0.1", "dev": true, @@ -8716,14 +8664,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", @@ -8813,14 +8753,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/responselike": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/retry": { "version": "0.12.0", "dev": true, @@ -11186,42 +11118,6 @@ "node": ">=0.10.0" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/normalize-url": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/call-bind": { "version": "1.0.2", "license": "MIT", @@ -11247,15 +11143,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "node_modules/camelcase": { "version": "5.3.1", "dev": true, @@ -11468,25 +11355,6 @@ "node": ">=0.10.0" } }, - "node_modules/clean-css": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "dev": true, @@ -11625,17 +11493,6 @@ "node": ">=0.8" } }, - "node_modules/clone-response": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -12407,43 +12264,6 @@ "version": "1.0.0", "license": "MIT" }, - "node_modules/css-loader": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, - "node_modules/css-loader/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -12456,13 +12276,6 @@ "nth-check": "~1.0.1" } }, - "node_modules/css-toggle-switch": { - "version": "4.1.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", @@ -12472,17 +12285,6 @@ "node": "*" } }, - "node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/cssstyle": { "version": "2.3.0", "dev": true, @@ -12716,14 +12518,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -13408,15 +13202,6 @@ "version": "4.2.8", "license": "MIT" }, - "node_modules/es6-templates": { - "version": "0.2.3", - "dev": true, - "license": "Apache 2", - "dependencies": { - "recast": "~0.11.12", - "through": "~2.3.6" - } - }, "node_modules/escalade": { "version": "3.1.1", "license": "MIT", @@ -15500,11 +15285,6 @@ "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", "dev": true }, - "node_modules/fastparse": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/fastq": { "version": "1.8.0", "dev": true, @@ -15565,21 +15345,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-loader": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - }, - "engines": { - "node": ">= 8.9.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } - }, "node_modules/file-saver": { "version": "2.0.5", "license": "MIT" @@ -15631,18 +15396,6 @@ "node": ">= 0.4.0" } }, - "node_modules/fill-keys": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/fill-range": { "version": "7.0.1", "dev": true, @@ -16733,55 +16486,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "11.8.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/got/node_modules/decompress-response": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/got/node_modules/mimic-response": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -17038,14 +16742,6 @@ "minimalistic-assert": "^1.0.1" } }, - "node_modules/he": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, "node_modules/helmet": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.0.1.tgz", @@ -17099,12 +16795,6 @@ "integrity": "sha512-Z+N573ycUKIGwFYS3ID1RzMJiGmtWMGKMiaNLyJS8B1ei+MllF4ZYmKS2T0kMWBktOz+WZLVNikftEgnukOrXg==", "dev": true }, - "node_modules/hpagent": { - "version": "0.1.2", - "dev": true, - "license": "MIT", - "optional": true - }, "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -17114,43 +16804,6 @@ "version": "3.0.3", "license": "MIT" }, - "node_modules/html-loader": { - "version": "0.5.5", - "dev": true, - "license": "MIT", - "dependencies": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "node_modules/html-minifier": { - "version": "3.5.21", - "dev": true, - "license": "MIT", - "dependencies": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/html-minifier/node_modules/commander": { - "version": "2.17.1", - "dev": true, - "license": "MIT" - }, "node_modules/htmlhint": { "version": "1.1.4", "dev": true, @@ -17296,12 +16949,6 @@ "node": ">= 6" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, "node_modules/http-errors": { "version": "2.0.0", "license": "MIT", @@ -17363,29 +17010,6 @@ "version": "2.2.0", "license": "MIT" }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, - "node_modules/http2-wrapper/node_modules/quick-lru": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/https-browserify": { "version": "1.0.0", "dev": true, @@ -17433,22 +17057,6 @@ "node": ">=0.10.0" } }, - "node_modules/icss-replace-symbols": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, - "node_modules/icss-utils": { - "version": "4.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.14" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/ieee754": { "version": "1.1.13", "license": "BSD-3-Clause" @@ -17564,11 +17172,6 @@ "node": ">=8" } }, - "node_modules/indexes-of": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/infer-owner": { "version": "1.0.4", "dev": true, @@ -17912,11 +17515,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-object": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/is-plain-object": { "version": "2.0.4", "dev": true, @@ -20619,11 +20217,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "dev": true, @@ -20878,14 +20471,6 @@ "node": ">=12.0.0" } }, - "node_modules/keyv": { - "version": "4.5.0", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "6.0.3", "dev": true, @@ -21616,19 +21201,6 @@ "version": "5.2.1", "license": "Apache-2.0" }, - "node_modules/lower-case": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "license": "ISC", @@ -22144,14 +21716,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "license": "ISC" @@ -22284,11 +21848,6 @@ "version": "1.0.3", "license": "MIT" }, - "node_modules/module-not-found-error": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/moment": { "version": "2.29.4", "license": "MIT", @@ -22743,55 +22302,11 @@ "node": ">=12.22.0" } }, - "node_modules/ngrok": { - "version": "4.3.3", - "dev": true, - "hasInstallScript": true, - "license": "BSD-2-Clause", - "dependencies": { - "@types/node": "^8.10.50", - "extract-zip": "^2.0.1", - "got": "^11.8.5", - "lodash.clonedeep": "^4.5.0", - "uuid": "^7.0.0 || ^8.0.0", - "yaml": "^1.10.0" - }, - "bin": { - "ngrok": "bin/ngrok" - }, - "engines": { - "node": ">=10.19.0 <14 || >=14.2" - }, - "optionalDependencies": { - "hpagent": "^0.1.2" - } - }, - "node_modules/ngrok/node_modules/@types/node": { - "version": "8.10.66", - "dev": true, - "license": "MIT" - }, - "node_modules/ngrok/node_modules/uuid": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/nice-try": { "version": "1.0.5", "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^1.1.1" - } - }, "node_modules/nocache": { "version": "3.0.4", "license": "MIT", @@ -23399,14 +22914,6 @@ "dev": true, "license": "MIT" }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/p-defer": { "version": "1.0.0", "dev": true, @@ -23558,14 +23065,6 @@ "readable-stream": "^2.1.5" } }, - "node_modules/param-case": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^2.2.0" - } - }, "node_modules/parent-module": { "version": "1.0.1", "dev": true, @@ -24038,105 +23537,6 @@ "node": ">=0.10.0" } }, - "node_modules/postcss": { - "version": "7.0.36", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "engines": { - "node": ">=6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - } - }, - "node_modules/postcss-modules-extract-imports": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-scope": { - "version": "2.2.0", - "dev": true, - "license": "ISC", - "dependencies": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/postcss-modules-values": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "3.3.1", - "dev": true, - "license": "MIT" - }, - "node_modules/postcss/node_modules/source-map": { - "version": "0.6.1", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postcss/node_modules/supports-color": { - "version": "6.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/postman-collection": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.3.0.tgz", @@ -24431,16 +23831,6 @@ "version": "1.1.0", "license": "MIT" }, - "node_modules/proxyquire": { - "version": "2.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - } - }, "node_modules/prr": { "version": "1.0.1", "dev": true, @@ -25267,14 +24657,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/relateurl": { - "version": "0.2.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "dev": true, @@ -25398,11 +24780,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "dev": true, - "license": "MIT" - }, "node_modules/resolve-cwd": { "version": "3.0.0", "dev": true, @@ -25476,17 +24853,6 @@ "node": ">=10" } }, - "node_modules/responselike": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -27703,6 +27069,7 @@ "version": "3.4.10", "dev": true, "license": "BSD-2-Clause", + "optional": true, "dependencies": { "commander": "~2.19.0", "source-map": "~0.6.1" @@ -27717,20 +27084,18 @@ "node_modules/uglify-js/node_modules/commander": { "version": "2.19.0", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/uglify-js/node_modules/source-map": { "version": "0.6.1", "dev": true, "license": "BSD-3-Clause", + "optional": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/ui-select": { - "version": "0.19.8", - "license": "MIT" - }, "node_modules/uid-generator": { "version": "2.0.0", "license": "MIT", @@ -27843,11 +27208,6 @@ "node": ">=0.10.0" } }, - "node_modules/uniq": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/unique-filename": { "version": "1.1.1", "dev": true, @@ -27983,11 +27343,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, "node_modules/uri-js": { "version": "4.2.2", "dev": true, @@ -28021,46 +27376,6 @@ "querystring": "0.2.0" } }, - "node_modules/url-loader": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "engines": { - "node": ">= 6.9.0" - }, - "peerDependencies": { - "webpack": "^3.0.0 || ^4.0.0" - } - }, - "node_modules/url-loader/node_modules/mime": { - "version": "2.4.6", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/url-loader/node_modules/schema-utils": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - }, - "engines": { - "node": ">= 4" - } - }, "node_modules/url-parse": { "version": "1.5.10", "license": "MIT", @@ -34512,10 +33827,6 @@ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "dev": true }, - "@sindresorhus/is": { - "version": "4.6.0", - "dev": true - }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -36053,13 +35364,6 @@ "integrity": "sha512-sV+51I7WYnLJnKPn2EMWgS4EUfoP4iWEbrWwbXsj0MZCB/xOK8j6+C9fntIdOM50kpx45ZLC3s6kwKivWuqvyg==", "dev": true }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "dev": true, - "requires": { - "defer-to-connect": "^2.0.0" - } - }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -36157,16 +35461,6 @@ "@types/node": "*" } }, - "@types/cacheable-request": { - "version": "6.0.2", - "dev": true, - "requires": { - "@types/http-cache-semantics": "*", - "@types/keyv": "*", - "@types/node": "*", - "@types/responselike": "*" - } - }, "@types/compression": { "version": "1.7.2", "dev": true, @@ -36286,10 +35580,6 @@ "@types/node": "*" } }, - "@types/has-ansi": { - "version": "3.0.0", - "dev": true - }, "@types/helmet": { "version": "4.0.0", "dev": true, @@ -36301,10 +35591,6 @@ "version": "3.0.0", "dev": true }, - "@types/http-cache-semantics": { - "version": "4.0.1", - "dev": true - }, "@types/http-errors": { "version": "2.0.1", "dev": true @@ -36389,13 +35675,6 @@ "version": "2.0.1", "dev": true }, - "@types/keyv": { - "version": "3.1.4", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/lodash": { "version": "4.14.191", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz", @@ -36476,13 +35755,6 @@ "version": "1.2.4", "dev": true }, - "@types/responselike": { - "version": "1.0.0", - "dev": true, - "requires": { - "@types/node": "*" - } - }, "@types/retry": { "version": "0.12.0", "dev": true @@ -38141,29 +37413,6 @@ "unset-value": "^1.0.0" } }, - "cacheable-lookup": { - "version": "5.0.4", - "dev": true - }, - "cacheable-request": { - "version": "7.0.2", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "dependencies": { - "normalize-url": { - "version": "6.1.0", - "dev": true - } - } - }, "call-bind": { "version": "1.0.2", "requires": { @@ -38181,14 +37430,6 @@ "version": "3.1.0", "dev": true }, - "camel-case": { - "version": "3.0.0", - "dev": true, - "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, "camelcase": { "version": "5.3.1", "dev": true @@ -38334,19 +37575,6 @@ } } }, - "clean-css": { - "version": "4.2.3", - "dev": true, - "requires": { - "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - } - } - }, "clean-stack": { "version": "2.2.0", "dev": true @@ -38423,13 +37651,6 @@ "clone": { "version": "2.1.2" }, - "clone-response": { - "version": "1.0.3", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -38999,34 +38220,6 @@ "crypto-randomuuid": { "version": "1.0.0" }, - "css-loader": { - "version": "2.1.1", - "dev": true, - "requires": { - "camelcase": "^5.2.0", - "icss-utils": "^4.1.0", - "loader-utils": "^1.2.3", - "normalize-path": "^3.0.0", - "postcss": "^7.0.14", - "postcss-modules-extract-imports": "^2.0.0", - "postcss-modules-local-by-default": "^2.0.6", - "postcss-modules-scope": "^2.1.0", - "postcss-modules-values": "^2.0.0", - "postcss-value-parser": "^3.3.0", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "css-select": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", @@ -39039,19 +38232,12 @@ "nth-check": "~1.0.1" } }, - "css-toggle-switch": { - "version": "4.1.0" - }, "css-what": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, - "cssesc": { - "version": "3.0.0", - "dev": true - }, "cssstyle": { "version": "2.3.0", "dev": true, @@ -39222,10 +38408,6 @@ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, - "defer-to-connect": { - "version": "2.0.1", - "dev": true - }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -39707,14 +38889,6 @@ "es6-promise": { "version": "4.2.8" }, - "es6-templates": { - "version": "0.2.3", - "dev": true, - "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" - } - }, "escalade": { "version": "3.1.1" }, @@ -41109,10 +40283,6 @@ "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", "dev": true }, - "fastparse": { - "version": "1.1.2", - "dev": true - }, "fastq": { "version": "1.8.0", "dev": true, @@ -41161,14 +40331,6 @@ "flat-cache": "^3.0.4" } }, - "file-loader": { - "version": "4.3.0", - "dev": true, - "requires": { - "loader-utils": "^1.2.3", - "schema-utils": "^2.5.0" - } - }, "file-saver": { "version": "2.0.5" }, @@ -41208,14 +40370,6 @@ "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", "dev": true }, - "fill-keys": { - "version": "1.0.2", - "dev": true, - "requires": { - "is-object": "~1.0.1", - "merge-descriptors": "~1.0.0" - } - }, "fill-range": { "version": "7.0.1", "dev": true, @@ -41965,36 +41119,6 @@ } } }, - "got": { - "version": "11.8.5", - "dev": true, - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "dependencies": { - "decompress-response": { - "version": "6.0.0", - "dev": true, - "requires": { - "mimic-response": "^3.1.0" - } - }, - "mimic-response": { - "version": "3.1.0", - "dev": true - } - } - }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -42166,10 +41290,6 @@ "minimalistic-assert": "^1.0.1" } }, - "he": { - "version": "1.2.0", - "dev": true - }, "helmet": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/helmet/-/helmet-6.0.1.tgz", @@ -42208,11 +41328,6 @@ "integrity": "sha512-Z+N573ycUKIGwFYS3ID1RzMJiGmtWMGKMiaNLyJS8B1ei+MllF4ZYmKS2T0kMWBktOz+WZLVNikftEgnukOrXg==", "dev": true }, - "hpagent": { - "version": "0.1.2", - "dev": true, - "optional": true - }, "html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", @@ -42221,36 +41336,6 @@ "html-escaper": { "version": "3.0.3" }, - "html-loader": { - "version": "0.5.5", - "dev": true, - "requires": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" - } - }, - "html-minifier": { - "version": "3.5.21", - "dev": true, - "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" - }, - "dependencies": { - "commander": { - "version": "2.17.1", - "dev": true - } - } - }, "htmlhint": { "version": "1.1.4", "dev": true, @@ -42351,12 +41436,6 @@ } } }, - "http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", - "dev": true - }, "http-errors": { "version": "2.0.0", "requires": { @@ -42404,20 +41483,6 @@ "http-status-codes": { "version": "2.2.0" }, - "http2-wrapper": { - "version": "1.0.3", - "dev": true, - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "dependencies": { - "quick-lru": { - "version": "5.1.1", - "dev": true - } - } - }, "https-browserify": { "version": "1.0.0", "dev": true @@ -42444,17 +41509,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "icss-replace-symbols": { - "version": "1.1.0", - "dev": true - }, - "icss-utils": { - "version": "4.1.1", - "dev": true, - "requires": { - "postcss": "^7.0.14" - } - }, "ieee754": { "version": "1.1.13" }, @@ -42533,10 +41587,6 @@ "version": "4.0.0", "dev": true }, - "indexes-of": { - "version": "1.0.1", - "dev": true - }, "infer-owner": { "version": "1.0.4", "dev": true @@ -42745,10 +41795,6 @@ "version": "1.0.5", "dev": true }, - "is-object": { - "version": "1.0.1", - "dev": true - }, "is-plain-object": { "version": "2.0.4", "dev": true, @@ -44685,10 +43731,6 @@ "version": "2.5.2", "dev": true }, - "json-buffer": { - "version": "3.0.1", - "dev": true - }, "json-parse-better-errors": { "version": "1.0.2", "dev": true @@ -44896,13 +43938,6 @@ "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.5.1.tgz", "integrity": "sha512-7jFxRVm+jD+rkq3kY0iZDJfsO2/t4BBPeEb2qKn2lR/9KhuksYk5hxzfRYWMPV8P/x2d0kHD306YyWLzjjH+uA==" }, - "keyv": { - "version": "4.5.0", - "dev": true, - "requires": { - "json-buffer": "3.0.1" - } - }, "kind-of": { "version": "6.0.3", "dev": true @@ -45425,14 +44460,6 @@ "long": { "version": "5.2.1" }, - "lower-case": { - "version": "1.1.4", - "dev": true - }, - "lowercase-keys": { - "version": "2.0.0", - "dev": true - }, "lru-cache": { "version": "6.0.0", "requires": { @@ -45773,10 +44800,6 @@ "version": "2.1.0", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "dev": true - }, "minimalistic-assert": { "version": "1.0.1" }, @@ -45879,10 +44902,6 @@ "module-details-from-path": { "version": "1.0.3" }, - "module-not-found-error": { - "version": "1.0.1", - "dev": true - }, "moment": { "version": "2.29.4" }, @@ -46195,40 +45214,10 @@ "debug": "^4.3.4" } }, - "ngrok": { - "version": "4.3.3", - "dev": true, - "requires": { - "@types/node": "^8.10.50", - "extract-zip": "^2.0.1", - "got": "^11.8.5", - "hpagent": "^0.1.2", - "lodash.clonedeep": "^4.5.0", - "uuid": "^7.0.0 || ^8.0.0", - "yaml": "^1.10.0" - }, - "dependencies": { - "@types/node": { - "version": "8.10.66", - "dev": true - }, - "uuid": { - "version": "8.3.2", - "dev": true - } - } - }, "nice-try": { "version": "1.0.5", "dev": true }, - "no-case": { - "version": "2.3.2", - "dev": true, - "requires": { - "lower-case": "^1.1.1" - } - }, "nocache": { "version": "3.0.4" }, @@ -46668,10 +45657,6 @@ "version": "0.3.0", "dev": true }, - "p-cancelable": { - "version": "2.1.1", - "dev": true - }, "p-defer": { "version": "1.0.0", "dev": true @@ -46770,13 +45755,6 @@ "readable-stream": "^2.1.5" } }, - "param-case": { - "version": "2.1.1", - "dev": true, - "requires": { - "no-case": "^2.2.0" - } - }, "parent-module": { "version": "1.0.1", "dev": true, @@ -47107,73 +46085,6 @@ "version": "0.1.1", "dev": true }, - "postcss": { - "version": "7.0.36", - "dev": true, - "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "postcss-modules-extract-imports": { - "version": "2.0.0", - "dev": true, - "requires": { - "postcss": "^7.0.5" - } - }, - "postcss-modules-local-by-default": { - "version": "2.0.6", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0", - "postcss-value-parser": "^3.3.1" - } - }, - "postcss-modules-scope": { - "version": "2.2.0", - "dev": true, - "requires": { - "postcss": "^7.0.6", - "postcss-selector-parser": "^6.0.0" - } - }, - "postcss-modules-values": { - "version": "2.0.0", - "dev": true, - "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^7.0.6" - } - }, - "postcss-selector-parser": { - "version": "6.0.2", - "dev": true, - "requires": { - "cssesc": "^3.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" - } - }, - "postcss-value-parser": { - "version": "3.3.1", - "dev": true - }, "postman-collection": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/postman-collection/-/postman-collection-4.3.0.tgz", @@ -47388,15 +46299,6 @@ "proxy-from-env": { "version": "1.1.0" }, - "proxyquire": { - "version": "2.1.3", - "dev": true, - "requires": { - "fill-keys": "^1.0.2", - "module-not-found-error": "^1.0.1", - "resolve": "^1.11.1" - } - }, "prr": { "version": "1.0.1", "dev": true @@ -48001,10 +46903,6 @@ } } }, - "relateurl": { - "version": "0.2.7", - "dev": true - }, "remove-trailing-separator": { "version": "1.1.0", "dev": true, @@ -48090,10 +46988,6 @@ "supports-preserve-symlinks-flag": "^1.0.0" } }, - "resolve-alpn": { - "version": "1.2.1", - "dev": true - }, "resolve-cwd": { "version": "3.0.0", "dev": true, @@ -48147,13 +47041,6 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, - "responselike": { - "version": "2.0.1", - "dev": true, - "requires": { - "lowercase-keys": "^2.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -49702,6 +48589,7 @@ "uglify-js": { "version": "3.4.10", "dev": true, + "optional": true, "requires": { "commander": "~2.19.0", "source-map": "~0.6.1" @@ -49709,17 +48597,16 @@ "dependencies": { "commander": { "version": "2.19.0", - "dev": true + "dev": true, + "optional": true }, "source-map": { "version": "0.6.1", - "dev": true + "dev": true, + "optional": true } } }, - "ui-select": { - "version": "0.19.8" - }, "uid-generator": { "version": "2.0.0" }, @@ -49795,10 +48682,6 @@ "set-value": "^2.0.1" } }, - "uniq": { - "version": "1.0.1", - "dev": true - }, "unique-filename": { "version": "1.1.1", "dev": true, @@ -49878,10 +48761,6 @@ "picocolors": "^1.0.0" } }, - "upper-case": { - "version": "1.1.3", - "dev": true - }, "uri-js": { "version": "4.2.2", "dev": true, @@ -49917,30 +48796,6 @@ } } }, - "url-loader": { - "version": "1.1.2", - "dev": true, - "requires": { - "loader-utils": "^1.1.0", - "mime": "^2.0.3", - "schema-utils": "^1.0.0" - }, - "dependencies": { - "mime": { - "version": "2.4.6", - "dev": true - }, - "schema-utils": { - "version": "1.0.0", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } - } - }, "url-parse": { "version": "1.5.10", "requires": { diff --git a/package.json b/package.json index ed6cbf1bf0..62875d59fe 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,6 @@ "convict": "^6.2.4", "convict-format-with-validator": "^6.2.0", "cookie-parser": "~1.4.6", - "css-toggle-switch": "^4.1.0", "csv-string": "^4.1.1", "cuid": "^2.1.8", "date-fns": "^2.30.0", @@ -148,7 +147,6 @@ "ts-essentials": "^9.3.1", "tweetnacl": "^1.0.1", "twilio": "~4.19.3", - "ui-select": "^0.19.8", "uid-generator": "^2.0.0", "ulid": "^2.3.0", "uuid": "^9.0.0", @@ -180,7 +178,6 @@ "@types/express": "^4.17.17", "@types/express-request-id": "^1.4.3", "@types/express-session": "^1.17.4", - "@types/has-ansi": "^3.0.0", "@types/helmet": "4.0.0", "@types/html-escaper": "^3.0.0", "@types/http-errors": "^2.0.1", @@ -214,7 +211,6 @@ "copyfiles": "^2.4.1", "core-js": "^3.28.0", "coveralls": "^3.1.1", - "css-loader": "^2.1.1", "csv-parse": "^5.3.6", "env-cmd": "^10.1.0", "eslint": "^8.30.0", @@ -226,9 +222,7 @@ "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-simple-import-sort": "^10.0.0", "eslint-plugin-typesafe": "^0.5.2", - "file-loader": "^4.3.0", "form-data": "^4.0.0", - "html-loader": "~0.5.5", "htmlhint": "^1.1.4", "husky": "^8.0.3", "jest": "^29.5.0", @@ -239,9 +233,7 @@ "lint-staged": "^13.1.0", "maildev": "^2.1.0", "mockdate": "^3.0.5", - "ngrok": "^4.3.3", "prettier": "^2.8.1", - "proxyquire": "^2.1.3", "react-dev-inspector": "^1.8.6", "regenerator": "^0.14.10", "rimraf": "^4.4.0", @@ -254,7 +246,6 @@ "ts-node-dev": "^2.0.0", "type-fest": "^3.10.0", "typescript": "^4.9.4", - "url-loader": "^1.1.2", "webpack": "^4.46.0", "webpack-cli": "^3.3.12", "worker-loader": "^2.0.0" diff --git a/serverless/virus-scanner/package-lock.json b/serverless/virus-scanner/package-lock.json index 44416a71b4..deae1eab44 100644 --- a/serverless/virus-scanner/package-lock.json +++ b/serverless/virus-scanner/package-lock.json @@ -1920,14 +1920,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1943,14 +1943,25 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -1958,9 +1969,9 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -2968,6 +2979,35 @@ "@types/node": "*" } }, + "node_modules/@types/eslint": { + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3034,6 +3074,13 @@ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -3128,6 +3175,181 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "node_modules/2-thenable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", @@ -3182,6 +3404,16 @@ "acorn-walk": "^8.0.2" } }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -4281,6 +4513,16 @@ "node": ">=10" } }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, "node_modules/ci-info": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", @@ -5332,6 +5574,13 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-module-lexer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.2.tgz", + "integrity": "sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==", + "dev": true, + "peer": true + }, "node_modules/es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -5442,6 +5691,30 @@ "source-map": "~0.6.1" } }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/esniff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", @@ -5465,6 +5738,19 @@ "node": ">=4" } }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, "node_modules/essentials": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", @@ -6095,6 +6381,13 @@ "node": ">= 6" } }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -7706,6 +7999,16 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, "node_modules/loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -8207,6 +8510,13 @@ "node": ">= 0.6" } }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, "node_modules/next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -9027,6 +9337,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -9360,6 +9680,59 @@ "node": ">=v12.22.7" } }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, "node_modules/seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -9393,6 +9766,16 @@ "node": ">=10" } }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, "node_modules/serverless": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.19.0.tgz", @@ -10002,6 +10385,93 @@ "node": ">= 6" } }, + "node_modules/terser": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -10655,6 +11125,20 @@ "makeerror": "1.0.12" } }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -10670,6 +11154,98 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, + "node_modules/webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/webpack/node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -12536,14 +13112,14 @@ } }, "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -12553,11 +13129,22 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, + "@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", @@ -12565,9 +13152,9 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.20", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", - "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", @@ -13400,6 +13987,35 @@ "@types/node": "*" } }, + "@types/eslint": { + "version": "8.56.5", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.5.tgz", + "integrity": "sha512-u5/YPJHo1tvkSF2CE0USEkxon82Z5DBy2xR+qfyYNszpX9qcs4sT6uq2kBbj4BXY1+DBGDPnrhMZV3pKWGNukw==", + "dev": true, + "peer": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true, + "peer": true + }, "@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -13466,6 +14082,13 @@ "integrity": "sha512-3YP80IxxFJB4b5tYC2SUPwkg0XQLiu0nWvhRgEatgjf+29IcWO9X1k8xRv5DGssJ/lCrjYTjQPcobJr2yWIVuQ==", "dev": true }, + "@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, "@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -13559,6 +14182,181 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "peer": true, + "requires": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, "2-thenable": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/2-thenable/-/2-thenable-1.0.0.tgz", @@ -13604,6 +14402,14 @@ "acorn-walk": "^8.0.2" } }, + "acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "requires": {} + }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", @@ -14425,6 +15231,13 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true + }, "ci-info": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", @@ -15022,7 +15835,8 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", - "dev": true + "dev": true, + "requires": {} }, "deepmerge": { "version": "4.3.1", @@ -15256,6 +16070,13 @@ "is-arrayish": "^0.2.1" } }, + "es-module-lexer": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.2.tgz", + "integrity": "sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==", + "dev": true, + "peer": true + }, "es5-ext": { "version": "0.10.61", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.61.tgz", @@ -15349,6 +16170,26 @@ "source-map": "~0.6.1" } }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true + } + } + }, "esniff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/esniff/-/esniff-1.1.0.tgz", @@ -15365,6 +16206,16 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "requires": { + "estraverse": "^5.2.0" + } + }, "essentials": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/essentials/-/essentials-1.2.0.tgz", @@ -15830,6 +16681,13 @@ "is-glob": "^4.0.1" } }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -16272,7 +17130,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", - "dev": true + "dev": true, + "requires": {} }, "istanbul-lib-coverage": { "version": "3.2.0", @@ -16616,7 +17475,8 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true + "dev": true, + "requires": {} }, "jest-regex-util": { "version": "29.6.3", @@ -16886,7 +17746,8 @@ "version": "8.13.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true + "dev": true, + "requires": {} } } }, @@ -17037,6 +17898,13 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true + }, "loader-utils": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", @@ -17438,6 +18306,13 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, "next-tick": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", @@ -18034,6 +18909,16 @@ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", "dev": true }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", @@ -18278,6 +19163,48 @@ "xmlchars": "^2.2.0" } }, + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "requires": {} + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + } + } + }, "seek-bzip": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", @@ -18303,6 +19230,16 @@ "lru-cache": "^6.0.0" } }, + "serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "peer": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serverless": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/serverless/-/serverless-3.19.0.tgz", @@ -18782,6 +19719,67 @@ } } }, + "terser": { + "version": "5.29.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.29.2.tgz", + "integrity": "sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "peer": true, + "requires": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "dependencies": { + "jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + } + } + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -19245,6 +20243,17 @@ "makeerror": "1.0.12" } }, + "watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "peer": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, "wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -19260,6 +20269,73 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, + "webpack": { + "version": "5.90.3", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.3.tgz", + "integrity": "sha512-h6uDYlWCctQRuXBs1oYpVe6sFcWedl0dpcVaTf/YF67J9bKvwJajFulMVSYKHrksMB3I/pIagRzDxwxkebuzKA==", + "dev": true, + "peer": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "dependencies": { + "enhanced-resolve": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz", + "integrity": "sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==", + "dev": true, + "peer": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true + } + } + }, + "webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true + }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", @@ -19345,7 +20421,8 @@ "version": "7.5.8", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz", "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==", - "dev": true + "dev": true, + "requires": {} }, "xml-name-validator": { "version": "4.0.0", diff --git a/src/app/config/logger.ts b/src/app/config/logger.ts index 978316349b..41798476c3 100644 --- a/src/app/config/logger.ts +++ b/src/app/config/logger.ts @@ -11,12 +11,6 @@ import { Environment } from '../../types' import { aws, customCloudWatchGroup, isDev, nodeEnv } from './config' -// WINSTON_CLOUDWATCH_NAME is not actually needed, but the typescript definition has -// an error (presumably?), and so we must supply a dummy value. -// See issue: https://github.com/lazywithclass/winston-cloudwatch/issues/159 -// TODO: remove if/when typescript definition is updated correctly -const WINSTON_CLOUDWATCH_NAME = 'FormSGCloudWatch' - // Params to enforce the logging format. export type CustomLoggerParams = { message: string @@ -238,7 +232,6 @@ export const createCloudWatchLogger = (label: string) => { if (!isDev && customCloudWatchGroup) { loggerOptions.transports = [ new WinstonCloudWatch({ - name: WINSTON_CLOUDWATCH_NAME, logGroupName: customCloudWatchGroup, // Every EC2 instance needs its own unique stream name, or else they // will run into InvalidSequenceTokenException errors because they do From 50ff75be48273526825cc596931b94c88be41fc2 Mon Sep 17 00:00:00 2001 From: Ken Date: Tue, 19 Mar 2024 14:23:11 +0800 Subject: [PATCH 13/13] chore: bump version to v6.113.0 --- CHANGELOG.md | 26 +++++++++++++++++++++++--- frontend/package-lock.json | 4 ++-- frontend/package.json | 2 +- package-lock.json | 4 ++-- package.json | 2 +- 5 files changed, 29 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cc0c5958d8..13364586f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,19 +4,39 @@ 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.112.0](https://github.com/opengovsg/FormSG/compare/v6.112.0...v6.112.0) +#### [v6.113.0](https://github.com/opengovsg/FormSG/compare/v6.113.0...v6.113.0) -- fix: add wogaa config into .env [`#7125`](https://github.com/opengovsg/FormSG/pull/7125) +- chore: package cleanup [`#7141`](https://github.com/opengovsg/FormSG/pull/7141) + +#### [v6.113.0](https://github.com/opengovsg/FormSG/compare/v6.112.0...v6.113.0) + +> 19 March 2024 + +- refactor(logic): consolidate logic functions into shared [`#7136`](https://github.com/opengovsg/FormSG/pull/7136) +- chore: Security upgrade nodemailer from 6.9.1 to 6.9.9 [`#7057`](https://github.com/opengovsg/FormSG/pull/7057) +- chore(dd): link source code to dd [`#7120`](https://github.com/opengovsg/FormSG/pull/7120) +- fix(deps): bump follow-redirects from 1.15.4 to 1.15.6 [`#7139`](https://github.com/opengovsg/FormSG/pull/7139) +- build(deps): bump follow-redirects from 1.15.4 to 1.15.6 in /frontend [`#7138`](https://github.com/opengovsg/FormSG/pull/7138) +- build(deps): bump follow-redirects from 1.15.4 to 1.15.6 in /serverless/virus-scanner [`#7137`](https://github.com/opengovsg/FormSG/pull/7137) +- refactor(i18n): modularize and shard by feature [`#7134`](https://github.com/opengovsg/FormSG/pull/7134) +- chore: file download duration from S3 [`#7135`](https://github.com/opengovsg/FormSG/pull/7135) +- fix(virus-scanner): rework error logging in pino [`#7128`](https://github.com/opengovsg/FormSG/pull/7128) +- chore: add logs for virus scanning duration [`#7129`](https://github.com/opengovsg/FormSG/pull/7129) +- fix(deps): bump jose from 4.14.4 to 4.15.5 [`#7130`](https://github.com/opengovsg/FormSG/pull/7130) +- build: merge release v6.112.0 into develop [`#7127`](https://github.com/opengovsg/FormSG/pull/7127) +- build: release v6.112.0 [`#7126`](https://github.com/opengovsg/FormSG/pull/7126) +- chore: bump version to v6.113.0 [`67821dc`](https://github.com/opengovsg/FormSG/commit/67821dcd7787b2c48920e706e87357245972459b) #### [v6.112.0](https://github.com/opengovsg/FormSG/compare/v6.111.0...v6.112.0) > 6 March 2024 +- fix: add wogaa config into .env [`#7125`](https://github.com/opengovsg/FormSG/pull/7125) - feat(tracking): wogaa tracking [`#7123`](https://github.com/opengovsg/FormSG/pull/7123) - chore(deps-dev): bump json5 from 1.0.1 to 1.0.2 [`#7119`](https://github.com/opengovsg/FormSG/pull/7119) - build: merge v6.111.0 back into develop [`#7118`](https://github.com/opengovsg/FormSG/pull/7118) - build: release v6.111.0 [`#7117`](https://github.com/opengovsg/FormSG/pull/7117) -- chore: bump version to v6.112.0 [`54946e9`](https://github.com/opengovsg/FormSG/commit/54946e99d101d48512fce17e0c4d6f9c09db315a) +- chore: bump version to v6.112.0 [`a6438f9`](https://github.com/opengovsg/FormSG/commit/a6438f99d72df0f760fb026a81feb45ef09dabe1) #### [v6.111.0](https://github.com/opengovsg/FormSG/compare/v6.110.0...v6.111.0) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 74214f5a7b..3066e80bfe 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,12 +1,12 @@ { "name": "form-frontend", - "version": "6.112.0", + "version": "6.113.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "form-frontend", - "version": "6.112.0", + "version": "6.113.0", "hasInstallScript": true, "dependencies": { "@chakra-ui/react": "^1.8.6", diff --git a/frontend/package.json b/frontend/package.json index a580dd7881..9d5308d69f 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "form-frontend", - "version": "6.112.0", + "version": "6.113.0", "homepage": ".", "private": true, "dependencies": { diff --git a/package-lock.json b/package-lock.json index 83a346786e..95ba59d763 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "FormSG", - "version": "6.112.0", + "version": "6.113.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "FormSG", - "version": "6.112.0", + "version": "6.113.0", "hasInstallScript": true, "dependencies": { "@aws-sdk/client-cloudwatch-logs": "^3.347.1", diff --git a/package.json b/package.json index 62875d59fe..90af16d7e6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "FormSG", "description": "Form Manager for Government", - "version": "6.112.0", + "version": "6.113.0", "homepage": "https://form.gov.sg", "authors": [ "FormSG "