diff --git a/.ebextensions/99datadog.config b/.ebextensions/99datadog.config new file mode 100644 index 0000000000..d917ea1cfe --- /dev/null +++ b/.ebextensions/99datadog.config @@ -0,0 +1,111 @@ +# Documentation: # Reference: https://docs.datadoghq.com/integrations/amazon_elasticbeanstalk/?tab=singlecontainer#alternate-datadog-agent-configuration +# Source file for datadog.yaml.example: https://github.com/DataDog/datadog-agent/blob/main/pkg/config/config_template.yaml + +# .ebextensions/99datadog.config +option_settings: + - namespace: aws:elasticbeanstalk:application:environment + option_name: DD_API_KEY + value: "" # To set in AWS EB console only + - namespace: aws:elasticbeanstalk:application:environment + option_name: DD_AGENT_VERSION + value: "7.31.0" + - namespace: aws:elasticbeanstalk:application:environment + option_name: DD_ENV + value: "staging" # staging | production +files: + "/configure_datadog_yaml.sh": + mode: "000700" + owner: root + group: root + content: | + #!/bin/bash + + sed -e "s/api_key:.*/api_key: ${DD_API_KEY}/" \ + -e "s/# dogstatsd_non_local_traffic: false/dogstatsd_non_local_traffic: true/" \ + -e "s/# hostname_file:/hostname_file:/" \ + /etc/datadog-agent/datadog.yaml.example > /etc/datadog-agent/datadog.yaml + + # Use the following command if you're in the EU. Replace datadoghq.eu with another region if in a different region. + # sed -i 's/datadoghq.com/datadoghq.eu/' /etc/datadog-agent/datadog.yaml + + echo "tags:" >> /etc/datadog-agent/datadog.yaml + echo " - service:formsg" >> /etc/datadog-agent/datadog.yaml + echo " - env:${DD_ENV}" >> /etc/datadog-agent/datadog.yaml + + "/datadog/datadog.repo": + mode: "000644" + owner: root + group: root + content: | + [datadog] + name = Datadog, Inc. + baseurl = https://yum.datadoghq.com/stable/7/x86_64/ + enabled=1 + gpgcheck=1 + repo_gpgcheck=1 + gpgkey=https://keys.datadoghq.com/DATADOG_RPM_KEY_CURRENT.public + https://keys.datadoghq.com/DATADOG_RPM_KEY_FD4BF915.public + https://keys.datadoghq.com/DATADOG_RPM_KEY_E09422B3.public + + "/datadog/hooks/99start_datadog.sh": + mode: "000755" + owner: root + group: root + content: | + #!/bin/bash + STATUS=`sudo initctl status datadog-agent` + if [[ "$STATUS" == *"datadog-agent start/running"* ]] + then + echo "Agent already running" + else + echo "Agent starting..." + sudo initctl start datadog-agent + fi + + "/datadog/hooks/99stop_datadog.sh": + mode: "000755" + owner: root + group: root + content: | + #!/bin/bash + STATUS=`sudo initctl status datadog-agent` + if [[ "$STATUS" == *"datadog-agent stop/waiting"* ]] + then + echo "Agent already stopped" + else + echo "Agent stopping..." + sudo initctl stop datadog-agent + fi + + +container_commands: + 02mkdir_appdeploy_post: + test: '[ ! -d /opt/elasticbeanstalk/hooks/appdeploy/post ]' + command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post" + 02mkdir_configdeploy_post: + test: '[ ! -d /opt/elasticbeanstalk/hooks/configdeploy/post ]' + command: "mkdir /opt/elasticbeanstalk/hooks/configdeploy/post" + 10appdeploy_pre_stop: + test: '[ -f /datadog/hooks/99stop_datadog.sh ]' + command: "cp /datadog/hooks/99stop_datadog.sh /opt/elasticbeanstalk/hooks/appdeploy/pre/" + 11appdeploy_post_start: + test: '[ -f /datadog/hooks/99start_datadog.sh ]' + command: "cp /datadog/hooks/99start_datadog.sh /opt/elasticbeanstalk/hooks/appdeploy/post/" + 20preinit_stop: + test: '[ -f /datadog/hooks/99stop_datadog.sh ]' + command: "cp /datadog/hooks/99stop_datadog.sh /opt/elasticbeanstalk/hooks/preinit" + 21postinit_start: + test: '[ -f /datadog/hooks/99start_datadog.sh ]' + command: "cp /datadog/hooks/99start_datadog.sh /opt/elasticbeanstalk/hooks/postinit" + 30configdeploy_pre_stop: + test: '[ -f /datadog/hooks/99stop_datadog.sh ]' + command: "cp /datadog/hooks/99stop_datadog.sh /opt/elasticbeanstalk/hooks/configdeploy/pre/" + 31configdeploy_post_start: + test: '[ -f /datadog/hooks/99start_datadog.sh ]' + command: "cp /datadog/hooks/99start_datadog.sh /opt/elasticbeanstalk/hooks/configdeploy/post/" + 90install_datadog: + test: '[ -f /datadog/datadog.repo ]' + command: 'cp /datadog/datadog.repo /etc/yum.repos.d/datadog.repo; yum -y makecache; DD_AGENT_VERSION="$(/opt/elasticbeanstalk/bin/get-config environment -k DD_AGENT_VERSION)"; yum -y install datadog-agent${DD_AGENT_VERSION:+-$DD_AGENT_VERSION-1}' + 91setup_datadog: + test: '[ -x /configure_datadog_yaml.sh ]' + command: "/configure_datadog_yaml.sh" diff --git a/.github/mergify.yml b/.github/mergify.yml index 09c26823d9..abb7e6dda8 100644 --- a/.github/mergify.yml +++ b/.github/mergify.yml @@ -1,8 +1,41 @@ pull_request_rules: - - name: Approve and merge non-major dependency upgrades + - name: Approve and merge non-major dependabot dependency upgrades conditions: - - 'author=dependabot[bot]' - - 'title~=bump [^\s]+ from ([\d]+)\..+ to \1\.' + - author=dependabot[bot] + - title~=bump [^\s]+ from ([\d]+)\..+ to \1\. + - check-success~=install + - check-success~=test-frontend + - check-success~=test-backend + - check-success~=test-e2e + - check-success~=Analyze # CodeQL / Analyze + - check-success~=CodeQL # CodeQL code scanning results + - check-success~=GitGuardian + - check-success~=Semantic Pull Request + - check-success~=Travis CI - Branch + - check-success~=coverage/coveralls + - check-success~=license/snyk + - check-success~=security/snyk + actions: + review: + type: APPROVE + merge: + method: squash + - name: Approve and merge non-major Snyk.io upgrades + conditions: + - author=snyk-bot + - title~=\[Snyk\] Security upgrade [^\s]+ from ([\d]+)\..+ to \1\. + - check-success~=install + - check-success~=test-frontend + - check-success~=test-backend + - check-success~=test-e2e + - check-success~=Analyze # CodeQL / Analyze + - check-success~=CodeQL # CodeQL code scanning results + - check-success~=GitGuardian + - check-success~=Semantic Pull Request + - check-success~=Travis CI - Branch + - check-success~=coverage/coveralls + - check-success~=license/snyk + - check-success~=security/snyk actions: review: type: APPROVE diff --git a/CHANGELOG.md b/CHANGELOG.md index 8062492e14..99d8a881d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,8 +4,77 @@ 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). +#### [v5.29.0](https://github.com/opengovsg/FormSG/compare/v5.28.0...v5.29.0) + +- fix(deps): bump fp-ts from 2.11.2 to 2.11.3 [`#2847`](https://github.com/opengovsg/FormSG/pull/2847) +- chore(deps-dev): bump @types/node from 14.17.17 to 14.17.18 [`#2848`](https://github.com/opengovsg/FormSG/pull/2848) +- feat: Datadog agent integration [`#2824`](https://github.com/opengovsg/FormSG/pull/2824) +- chore(deps-dev): bump jest-localstorage-mock from 2.4.17 to 2.4.18 [`#2845`](https://github.com/opengovsg/FormSG/pull/2845) +- refactor: update NRIC validation [`#2842`](https://github.com/opengovsg/FormSG/pull/2842) +- fix(deps): bump aws-sdk from 2.991.0 to 2.992.0 [`#2846`](https://github.com/opengovsg/FormSG/pull/2846) +- fix(deps): bump @sentry/integrations from 6.12.0 to 6.13.2 [`#2844`](https://github.com/opengovsg/FormSG/pull/2844) +- fix(deps): bump @sentry/browser from 6.13.1 to 6.13.2 [`#2843`](https://github.com/opengovsg/FormSG/pull/2843) +- fix: Revert "refactor: use modern JS constructs to validate NRIC (#2785)" [`#2836`](https://github.com/opengovsg/FormSG/pull/2836) +- chore(deps-dev): bump htmlhint from 0.15.1 to 0.15.2 [`#2838`](https://github.com/opengovsg/FormSG/pull/2838) +- chore(deps-dev): bump eslint-plugin-jest from 24.4.0 to 24.4.2 [`#2837`](https://github.com/opengovsg/FormSG/pull/2837) +- chore(deps-dev): bump @typescript-eslint/parser from 4.31.1 to 4.31.2 [`#2835`](https://github.com/opengovsg/FormSG/pull/2835) +- chore(deps-dev): bump @types/jest from 27.0.1 to 27.0.2 [`#2834`](https://github.com/opengovsg/FormSG/pull/2834) +- fix(deps): bump date-fns from 2.23.0 to 2.24.0 [`#2833`](https://github.com/opengovsg/FormSG/pull/2833) +- chore(deps-dev): bump type-fest from 2.3.2 to 2.3.4 [`#2832`](https://github.com/opengovsg/FormSG/pull/2832) +- fix(deps): bump @sentry/browser from 6.12.0 to 6.13.1 [`#2831`](https://github.com/opengovsg/FormSG/pull/2831) +- chore(deps-dev): bump @types/express-request-id from 1.4.2 to 1.4.3 [`#2827`](https://github.com/opengovsg/FormSG/pull/2827) +- chore(deps-dev): bump @typescript-eslint/eslint-plugin [`#2828`](https://github.com/opengovsg/FormSG/pull/2828) +- chore(deps-dev): bump prettier from 2.4.0 to 2.4.1 [`#2829`](https://github.com/opengovsg/FormSG/pull/2829) +- chore(deps): remove has-ansi package [`#2781`](https://github.com/opengovsg/FormSG/pull/2781) +- fix(deps): bump aws-sdk from 2.987.0 to 2.991.0 [`#2820`](https://github.com/opengovsg/FormSG/pull/2820) +- build(mergify): specify checks and include Snyk [`#2825`](https://github.com/opengovsg/FormSG/pull/2825) +- chore(deps-dev): bump @types/node from 14.17.15 to 14.17.17 [`#2821`](https://github.com/opengovsg/FormSG/pull/2821) +- fix(deps): bump libphonenumber-js from 1.9.32 to 1.9.34 [`#2810`](https://github.com/opengovsg/FormSG/pull/2810) +- refactor: use modern JS constructs to validate NRIC [`#2785`](https://github.com/opengovsg/FormSG/pull/2785) +- chore(deps-dev): bump @typescript-eslint/parser from 4.31.0 to 4.31.1 [`#2812`](https://github.com/opengovsg/FormSG/pull/2812) +- build: merge release 5.28.0 into develop [`#2804`](https://github.com/opengovsg/FormSG/pull/2804) +- build: release v5.28.0 [`#2798`](https://github.com/opengovsg/FormSG/pull/2798) +- build: release 5.27.0 [`#2751`](https://github.com/opengovsg/FormSG/pull/2751) +- build: release v5.26.0 [`#2708`](https://github.com/opengovsg/FormSG/pull/2708) +- build: release v5.25.0 [`#2661`](https://github.com/opengovsg/FormSG/pull/2661) +- build: hotfix release v5.24.1 [`#2646`](https://github.com/opengovsg/FormSG/pull/2646) +- build: Release 5.24.0 [`#2626`](https://github.com/opengovsg/FormSG/pull/2626) +- build: release v5.23.0 [`#2566`](https://github.com/opengovsg/FormSG/pull/2566) +- build: release v5.22.0 [`#2511`](https://github.com/opengovsg/FormSG/pull/2511) +- build: hotfix release v5.21.2, remove esrvcId validation when logging form logins [`#2484`](https://github.com/opengovsg/FormSG/pull/2484) +- build: hotfix release v5.21.1, update esrvcId validation [`#2470`](https://github.com/opengovsg/FormSG/pull/2470) +- build: Release 5.21.0 [`#2443`](https://github.com/opengovsg/FormSG/pull/2443) +- build: release v5.20.0 [`#2391`](https://github.com/opengovsg/FormSG/pull/2391) +- build: release v5.19.2 - fixes for SGID and MyInfo cookies [`#2372`](https://github.com/opengovsg/FormSG/pull/2372) +- build: Release 5.19.1 [`#2342`](https://github.com/opengovsg/FormSG/pull/2342) +- build: Release 5.19.0 [`#2310`](https://github.com/opengovsg/FormSG/pull/2310) +- build: release v5.18.0 [`#2282`](https://github.com/opengovsg/FormSG/pull/2282) +- build: release v5.17.0 [`#2249`](https://github.com/opengovsg/FormSG/pull/2249) +- build: release 5.16.0 [`#2229`](https://github.com/opengovsg/FormSG/pull/2229) +- build: release v5.15.0 - webhook attachments [`#2176`](https://github.com/opengovsg/FormSG/pull/2176) +- build: hotfix v5.14.1 - allow read key in permissionList when updating collaborators [`#2178`](https://github.com/opengovsg/FormSG/pull/2178) +- build: release v5.14.0 [`#2167`](https://github.com/opengovsg/FormSG/pull/2167) +- build: release v5.13.1 - increase OTP expiry to 30 minutes [`#2142`](https://github.com/opengovsg/FormSG/pull/2142) +- build: release v5.13.0 [`#2099`](https://github.com/opengovsg/FormSG/pull/2099) +- build: release v5.12.1 - hotfix to block RP and SP student domains [`#2047`](https://github.com/opengovsg/FormSG/pull/2047) +- build: release v5.12.0 [`#2041`](https://github.com/opengovsg/FormSG/pull/2041) +- build: release v5.11.0 [`#1965`](https://github.com/opengovsg/FormSG/pull/1965) +- build: hotfix release v5.10.1 [`#1896`](https://github.com/opengovsg/FormSG/pull/1896) +- build: Release v5.10.0 [`#1856`](https://github.com/opengovsg/FormSG/pull/1856) +- build: release v5.9.0 [`#1783`](https://github.com/opengovsg/FormSG/pull/1783) +- build: release v5.8.0 [`#1737`](https://github.com/opengovsg/FormSG/pull/1737) +- build: hotfix release v5.7.1 [`#1706`](https://github.com/opengovsg/FormSG/pull/1706) +- build: release 5.7.0 [`#1680`](https://github.com/opengovsg/FormSG/pull/1680) +- build: hotfix release v5.6.1 [`#1634`](https://github.com/opengovsg/FormSG/pull/1634) +- build: release v5.6.0 [`#1630`](https://github.com/opengovsg/FormSG/pull/1630) +- build: Release v5.5.1 [`#1603`](https://github.com/opengovsg/FormSG/pull/1603) +- build: Release 5.5.0 [`#1565`](https://github.com/opengovsg/FormSG/pull/1565) +- build: release 5.4.1 - server to respond with status code if storage mode form is archived [`#1541`](https://github.com/opengovsg/FormSG/pull/1541) + #### [v5.28.0](https://github.com/opengovsg/FormSG/compare/v5.27.0...v5.28.0) +> 14 September 2021 + - fix(deps): bump fp-ts from 2.11.1 to 2.11.2 [`#2796`](https://github.com/opengovsg/FormSG/pull/2796) - chore(deps-dev): bump @typescript-eslint/eslint-plugin [`#2795`](https://github.com/opengovsg/FormSG/pull/2795) - feat: Add 4MB attachment support [`#2777`](https://github.com/opengovsg/FormSG/pull/2777) @@ -32,6 +101,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - fix(deps): bump web-streams-polyfill from 3.1.0 to 3.1.1 [`#2755`](https://github.com/opengovsg/FormSG/pull/2755) - chore(deps-dev): bump @typescript-eslint/parser from 4.30.0 to 4.31.0 [`#2754`](https://github.com/opengovsg/FormSG/pull/2754) - chore(deps-dev): bump ngrok from 4.1.0 to 4.2.2 [`#2753`](https://github.com/opengovsg/FormSG/pull/2753) +- chore: bump version to 5.28.0 [`59fe066`](https://github.com/opengovsg/FormSG/commit/59fe0663df7fb3c8ffad0d5a174ee4856996763b) #### [v5.27.0](https://github.com/opengovsg/FormSG/compare/v5.26.0...v5.27.0) @@ -59,15 +129,16 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - chore(deps-dev): bump @types/node from 14.17.12 to 14.17.14 [`#2722`](https://github.com/opengovsg/FormSG/pull/2722) - fix(deps): bump aws-sdk from 2.978.0 to 2.979.0 [`#2717`](https://github.com/opengovsg/FormSG/pull/2717) - chore: merge release v5.26.0 back to develop [`#2711`](https://github.com/opengovsg/FormSG/pull/2711) +- fix: only check for sms quota on verified mobile field OTP verifications instead of all verified fields [`#2710`](https://github.com/opengovsg/FormSG/pull/2710) +- fix: Add 10 MB max length checks to form field editor [`#2584`](https://github.com/opengovsg/FormSG/pull/2584) +- chore(deps-dev): bump @typescript-eslint/eslint-plugin [`#2706`](https://github.com/opengovsg/FormSG/pull/2706) +- chore: bump version to v5.26.0 [`cdf7e1b`](https://github.com/opengovsg/FormSG/commit/cdf7e1b13f641a278489f89792e51eb7639d2a39) - chore: bump version to 5.27.0 [`ffb85d2`](https://github.com/opengovsg/FormSG/commit/ffb85d2ff0d902baac9b497d66c520f4c4f7e018) #### [v5.26.0](https://github.com/opengovsg/FormSG/compare/v5.25.0...v5.26.0) > 31 August 2021 -- fix: only check for sms quota on verified mobile field OTP verifications instead of all verified fields [`#2710`](https://github.com/opengovsg/FormSG/pull/2710) -- fix: Add 10 MB max length checks to form field editor [`#2584`](https://github.com/opengovsg/FormSG/pull/2584) -- chore(deps-dev): bump @typescript-eslint/eslint-plugin [`#2706`](https://github.com/opengovsg/FormSG/pull/2706) - chore(deps-dev): bump @typescript-eslint/parser from 4.29.3 to 4.30.0 [`#2707`](https://github.com/opengovsg/FormSG/pull/2707) - fix: Email domain validation should be case-insensitive [`#2682`](https://github.com/opengovsg/FormSG/pull/2682) - fix: upgrade jszip from 3.7.0 to 3.7.1 [`#2692`](https://github.com/opengovsg/FormSG/pull/2692) @@ -99,7 +170,7 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - chore: merge v5.25.0 into develop [`#2667`](https://github.com/opengovsg/FormSG/pull/2667) - fix: upgrade zod from 3.6.1 to 3.7.1 [`#2662`](https://github.com/opengovsg/FormSG/pull/2662) - fix: upgrade type-fest from 1.2.3 to 1.3.0 [`#2663`](https://github.com/opengovsg/FormSG/pull/2663) -- chore: bump version to v5.26.0 [`cdf7e1b`](https://github.com/opengovsg/FormSG/commit/cdf7e1b13f641a278489f89792e51eb7639d2a39) +- chore: bump version to v5.26.0 [`35de314`](https://github.com/opengovsg/FormSG/commit/35de3145f8d18b8145c78a2da6dae38458ac5536) #### [v5.25.0](https://github.com/opengovsg/FormSG/compare/v5.24.1...v5.25.0) @@ -248,13 +319,15 @@ Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog). - ref: remove backend package dependencies from Form (sub-)types and move to shared dir [`#2385`](https://github.com/opengovsg/FormSG/pull/2385) - chore: add postinstall script to install /shared modules [`#2438`](https://github.com/opengovsg/FormSG/pull/2438) - chore: bump version to 5.22.0 [`d7616cc`](https://github.com/opengovsg/FormSG/commit/d7616cc9066a4bfb8dfea655ad3e7e3546e9d8d1) +- feat: remove validation when logging esrvcId to login collection [`90a0fb0`](https://github.com/opengovsg/FormSG/commit/90a0fb04c450607c5e246c153583844bfe6d42dc) +- chore: bump version to v5.21.2 [`7c87b10`](https://github.com/opengovsg/FormSG/commit/7c87b106400c1fbd197fe503cfa716a0b169f8c0) #### [v5.21.2](https://github.com/opengovsg/FormSG/compare/v5.21.1...v5.21.2) > 30 July 2021 -- feat: remove validation when logging esrvcId to login collection [`90a0fb0`](https://github.com/opengovsg/FormSG/commit/90a0fb04c450607c5e246c153583844bfe6d42dc) -- chore: bump version to v5.21.2 [`7c87b10`](https://github.com/opengovsg/FormSG/commit/7c87b106400c1fbd197fe503cfa716a0b169f8c0) +- chore: bump version to v5.21.2 [`08cf7d4`](https://github.com/opengovsg/FormSG/commit/08cf7d4a838dde0ca3c418451f72eefd9ef88d19) +- feat: remove validation when logging esrvcId to login collection [`5bea425`](https://github.com/opengovsg/FormSG/commit/5bea4252707eb1bd6e2776175dab591dd0738ec8) #### [v5.21.1](https://github.com/opengovsg/FormSG/compare/v5.21.0...v5.21.1) diff --git a/package-lock.json b/package-lock.json index 02c7a05ffd..d93b28cd26 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "FormSG", - "version": "5.28.0", + "version": "5.29.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -4952,125 +4952,125 @@ "integrity": "sha512-UdkG3mLEqXgnlKsWanWcgb6dOjUzJ+XC5f+aWw30qrtjxeNUSfKX1cd5FBzOaXQumoe9nIqeZUvrRJS03HCCtw==" }, "@sentry/browser": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.12.0.tgz", - "integrity": "sha512-wsJi1NLOmfwtPNYxEC50dpDcVY7sdYckzwfqz1/zHrede1mtxpqSw+7iP4bHADOJXuF+ObYYTHND0v38GSXznQ==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-6.13.2.tgz", + "integrity": "sha512-bkFXK4vAp2UX/4rQY0pj2Iky55Gnwr79CtveoeeMshoLy5iDgZ8gvnLNAz7om4B9OQk1u7NzLEa4IXAmHTUyag==", "requires": { - "@sentry/core": "6.12.0", - "@sentry/types": "6.12.0", - "@sentry/utils": "6.12.0", + "@sentry/core": "6.13.2", + "@sentry/types": "6.13.2", + "@sentry/utils": "6.13.2", "tslib": "^1.9.3" }, "dependencies": { "@sentry/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz", - "integrity": "sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==" + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.13.2.tgz", + "integrity": "sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg==" }, "@sentry/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-foF4PbxqPMWNbuqdXkdoOmKm3quu3PP7Q7j/0pXkri4DtCuvF/lKY92mbY0V9rHS/phCoj+3/Se5JvM2ymh2/w==", "requires": { - "@sentry/types": "6.12.0", + "@sentry/types": "6.13.2", "tslib": "^1.9.3" } } } }, "@sentry/core": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.12.0.tgz", - "integrity": "sha512-mU/zdjlzFHzdXDZCPZm8OeCw7c9xsbL49Mq0TrY0KJjLt4CJBkiq5SDTGfRsenBLgTedYhe5Z/J8Z+xVVq+MfQ==", - "requires": { - "@sentry/hub": "6.12.0", - "@sentry/minimal": "6.12.0", - "@sentry/types": "6.12.0", - "@sentry/utils": "6.12.0", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.13.2.tgz", + "integrity": "sha512-snXNNFLwlS7yYxKTX4DBXebvJK+6ikBWN6noQ1CHowvM3ReFBlrdrs0Z0SsSFEzXm2S4q7f6HHbm66GSQZ/8FQ==", + "requires": { + "@sentry/hub": "6.13.2", + "@sentry/minimal": "6.13.2", + "@sentry/types": "6.13.2", + "@sentry/utils": "6.13.2", "tslib": "^1.9.3" }, "dependencies": { "@sentry/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz", - "integrity": "sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==" + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.13.2.tgz", + "integrity": "sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg==" }, "@sentry/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-foF4PbxqPMWNbuqdXkdoOmKm3quu3PP7Q7j/0pXkri4DtCuvF/lKY92mbY0V9rHS/phCoj+3/Se5JvM2ymh2/w==", "requires": { - "@sentry/types": "6.12.0", + "@sentry/types": "6.13.2", "tslib": "^1.9.3" } } } }, "@sentry/hub": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.12.0.tgz", - "integrity": "sha512-yR/UQVU+ukr42bSYpeqvb989SowIXlKBanU0cqLFDmv5LPCnaQB8PGeXwJAwWhQgx44PARhmB82S6Xor8gYNxg==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.13.2.tgz", + "integrity": "sha512-sppSuJdNMiMC/vFm/dQowCBh11uTrmvks00fc190YWgxHshodJwXMdpc+pN61VSOmy2QA4MbQ5aMAgHzPzel3A==", "requires": { - "@sentry/types": "6.12.0", - "@sentry/utils": "6.12.0", + "@sentry/types": "6.13.2", + "@sentry/utils": "6.13.2", "tslib": "^1.9.3" }, "dependencies": { "@sentry/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz", - "integrity": "sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==" + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.13.2.tgz", + "integrity": "sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg==" }, "@sentry/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-foF4PbxqPMWNbuqdXkdoOmKm3quu3PP7Q7j/0pXkri4DtCuvF/lKY92mbY0V9rHS/phCoj+3/Se5JvM2ymh2/w==", "requires": { - "@sentry/types": "6.12.0", + "@sentry/types": "6.13.2", "tslib": "^1.9.3" } } } }, "@sentry/integrations": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.12.0.tgz", - "integrity": "sha512-M9gsVdWZp5fAFFpTjK2IBuWzW4SBxGAI3tVbYZvVx16S/BY0GsPC1dYpjJx9OTBS/8CmCWdGxnUmjACo/8w1LA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-6.13.2.tgz", + "integrity": "sha512-CzxMtNr4nkZbifD0Rb6tXwqfqm+fWKl4IQTaFrJ92VNdgihBMVWYmflRqkMkGh1iFN8bVPpXrGyplY5tFN+2kA==", "requires": { - "@sentry/types": "6.12.0", - "@sentry/utils": "6.12.0", + "@sentry/types": "6.13.2", + "@sentry/utils": "6.13.2", "localforage": "^1.8.1", "tslib": "^1.9.3" } }, "@sentry/minimal": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.12.0.tgz", - "integrity": "sha512-r3C54Q1KN+xIqUvcgX9DlcoWE7ezWvFk2pSu1Ojx9De81hVqR9u5T3sdSAP2Xma+um0zr6coOtDJG4WtYlOtsw==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.13.2.tgz", + "integrity": "sha512-6iJfEvHzzpGBHDfLxSHcGObh73XU1OSQKWjuhDOe7UQDyI4BQmTfcXAC+Fr8sm8C/tIsmpVi/XJhs8cubFdSMw==", "requires": { - "@sentry/hub": "6.12.0", - "@sentry/types": "6.12.0", + "@sentry/hub": "6.13.2", + "@sentry/types": "6.13.2", "tslib": "^1.9.3" }, "dependencies": { "@sentry/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz", - "integrity": "sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==" + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.13.2.tgz", + "integrity": "sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg==" } } }, "@sentry/types": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.12.0.tgz", - "integrity": "sha512-urtgLzE4EDMAYQHYdkgC0Ei9QvLajodK1ntg71bGn0Pm84QUpaqpPDfHRU+i6jLeteyC7kWwa5O5W1m/jrjGXA==" + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.13.2.tgz", + "integrity": "sha512-6WjGj/VjjN8LZDtqJH5ikeB1o39rO1gYS6anBxiS3d0sXNBb3Ux0pNNDFoBxQpOhmdDHXYS57MEptX9EV82gmg==" }, "@sentry/utils": { - "version": "6.12.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.12.0.tgz", - "integrity": "sha512-oRHQ7TH5TSsJqoP9Gqq25Jvn9LKexXfAh/OoKwjMhYCGKGhqpDNUIZVgl9DWsGw5A5N5xnQyLOxDfyRV5RshdA==", + "version": "6.13.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.13.2.tgz", + "integrity": "sha512-foF4PbxqPMWNbuqdXkdoOmKm3quu3PP7Q7j/0pXkri4DtCuvF/lKY92mbY0V9rHS/phCoj+3/Se5JvM2ymh2/w==", "requires": { - "@sentry/types": "6.12.0", + "@sentry/types": "6.13.2", "tslib": "^1.9.3" } }, @@ -5299,6 +5299,27 @@ "@types/node": "*" } }, + "@types/connect-datadog": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/connect-datadog/-/connect-datadog-0.0.6.tgz", + "integrity": "sha512-bvdBW3zaqIzFmGda7zTDd4VTwFK/vzaEJJWG9MUiaftHMi9YbEXn8gA+T038km6quffP8P0/Zd1LSZso6OYYlQ==", + "dev": true, + "requires": { + "@types/express": "*", + "hot-shots": "^6.3.0" + }, + "dependencies": { + "hot-shots": { + "version": "6.8.7", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-6.8.7.tgz", + "integrity": "sha512-XH8iezBSZgVw2jegu96pUfF1Zv0VZ/iXjb7L5yE3F7mn7/bdhf4qeniXjO0wQWeefe433rhOsazNKLxM+XMI9w==", + "dev": true, + "requires": { + "unix-dgram": "2.0.x" + } + } + } + }, "@types/convict": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/@types/convict/-/convict-6.1.1.tgz", @@ -5369,9 +5390,9 @@ } }, "@types/express-request-id": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@types/express-request-id/-/express-request-id-1.4.2.tgz", - "integrity": "sha512-K0rhnzYklvOur+6eHOKDa3HYPLT9rbx1bLBbUvQew7CgBHnKnkfu9H+p2guCOTW/oDyJSCpPj/T6vd38Lz7tIQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@types/express-request-id/-/express-request-id-1.4.3.tgz", + "integrity": "sha512-vOQzyPe5Y5LNefpEiBwD8RpXu2ZD2Vy5pTMEzVrOLRKYk5iSE1kMC+4FIQD5xtMEwmrYuVhEpC/xLD479XK8Xg==", "dev": true, "requires": { "@types/express-serve-static-core": "*" @@ -5470,9 +5491,9 @@ } }, "@types/jest": { - "version": "27.0.1", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.1.tgz", - "integrity": "sha512-HTLpVXHrY69556ozYkcq47TtQJXpcWAWfkoqz+ZGz2JnmZhzlRjprCIyFnetSy8gpDWwTTGBcRVv1J1I1vBrHw==", + "version": "27.0.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", + "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", "dev": true, "requires": { "jest-diff": "^27.0.0", @@ -5480,9 +5501,9 @@ }, "dependencies": { "@jest/types": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.0.6.tgz", - "integrity": "sha512-aSquT1qa9Pik26JK5/3rvnYb4bGtm1VFNesHKmNTwmPIgOrixvhL2ghIvFRNEpzy3gU+rUgjIF/KodbkFAl++g==", + "version": "27.1.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.1.1.tgz", + "integrity": "sha512-yqJPDDseb0mXgKqmNqypCsb85C22K1aY5+LUxh7syIM9n/b0AsaltxNy+o6tt29VcfGDpYEve175bm3uOhcehA==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -5502,9 +5523,9 @@ } }, "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { @@ -5554,15 +5575,15 @@ "dev": true }, "jest-diff": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.0.6.tgz", - "integrity": "sha512-Z1mqgkTCSYaFgwTlP/NUiRzdqgxmmhzHY1Tq17zL94morOHfHu3K4bgSgl+CR4GLhpV8VxkuOYuIWnQ9LnFqmg==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.2.0.tgz", + "integrity": "sha512-QSO9WC6btFYWtRJ3Hac0sRrkspf7B01mGrrQEiCW6TobtViJ9RWL0EmOs/WnBsZDsI/Y2IoSHZA2x6offu0sYw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^27.0.6", "jest-get-type": "^27.0.6", - "pretty-format": "^27.0.6" + "pretty-format": "^27.2.0" } }, "jest-get-type": { @@ -5572,12 +5593,12 @@ "dev": true }, "pretty-format": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.0.6.tgz", - "integrity": "sha512-8tGD7gBIENgzqA+UBzObyWqQ5B778VIFZA/S66cclyd5YkFLYs2Js7gxDKf0MXtTc9zcS7t1xhdfcElJ3YIvkQ==", + "version": "27.2.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.2.0.tgz", + "integrity": "sha512-KyJdmgBkMscLqo8A7K77omgLx5PWPiXJswtTtFV7XgVZv2+qPk6UivpXXO+5k6ZEbWIbLoKdx1pZ6ldINzbwTA==", "dev": true, "requires": { - "@jest/types": "^27.0.6", + "@jest/types": "^27.1.1", "ansi-regex": "^5.0.0", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" @@ -5677,9 +5698,32 @@ "dev": true }, "@types/node": { - "version": "14.17.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.15.tgz", - "integrity": "sha512-D1sdW0EcSCmNdLKBGMYb38YsHUS6JcM7yQ6sLQ9KuZ35ck7LYCKE7kYFHOO59ayFOY3zobWVZxf4KXhYHcHYFA==" + "version": "14.17.18", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.18.tgz", + "integrity": "sha512-haYyibw4pbteEhkSg0xdDLAI3679L75EJ799ymVrPxOA922bPx3ML59SoDsQ//rHlvqpu+e36kcbR3XRQtFblA==" + }, + "@types/node-fetch": { + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz", + "integrity": "sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw==", + "dev": true, + "requires": { + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } + } }, "@types/nodemailer": { "version": "6.4.4", @@ -5890,13 +5934,13 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.1.tgz", - "integrity": "sha512-UDqhWmd5i0TvPLmbK5xY3UZB0zEGseF+DHPghZ37Sb83Qd3p8ujhvAtkU4OF46Ka5Pm5kWvFIx0cCTBFKo0alA==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.31.2.tgz", + "integrity": "sha512-w63SCQ4bIwWN/+3FxzpnWrDjQRXVEGiTt9tJTRptRXeFvdZc/wLiz3FQUwNQ2CVoRGI6KUWMNUj/pk63noUfcA==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "4.31.1", - "@typescript-eslint/scope-manager": "4.31.1", + "@typescript-eslint/experimental-utils": "4.31.2", + "@typescript-eslint/scope-manager": "4.31.2", "debug": "^4.3.1", "functional-red-black-tree": "^1.0.1", "regexpp": "^3.1.0", @@ -5911,43 +5955,43 @@ "dev": true }, "@typescript-eslint/experimental-utils": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.1.tgz", - "integrity": "sha512-NtoPsqmcSsWty0mcL5nTZXMf7Ei0Xr2MT8jWjXMVgRK0/1qeQ2jZzLFUh4QtyJ4+/lPUyMw5cSfeeME+Zrtp9Q==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.31.1", - "@typescript-eslint/types": "4.31.1", - "@typescript-eslint/typescript-estree": "4.31.1", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" } }, "@typescript-eslint/scope-manager": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.1.tgz", - "integrity": "sha512-N1Uhn6SqNtU2XpFSkD4oA+F0PfKdWHyr4bTX0xTj8NRx1314gBDRL1LUuZd5+L3oP+wo6hCbZpaa1in6SwMcVQ==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.1", - "@typescript-eslint/visitor-keys": "4.31.1" + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" } }, "@typescript-eslint/types": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.1.tgz", - "integrity": "sha512-kixltt51ZJGKENNW88IY5MYqTBA8FR0Md8QdGbJD2pKZ+D5IvxjTYDNtJPDxFBiXmka2aJsITdB1BtO1fsgmsQ==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.1.tgz", - "integrity": "sha512-EGHkbsUvjFrvRnusk6yFGqrqMBTue5E5ROnS5puj3laGQPasVUgwhrxfcgkdHNFECHAewpvELE1Gjv0XO3mdWg==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.1", - "@typescript-eslint/visitor-keys": "4.31.1", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -5956,12 +6000,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.31.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.1.tgz", - "integrity": "sha512-PCncP8hEqKw6SOJY+3St4LVtoZpPPn+Zlpm7KW5xnviMhdqcsBty4Lsg4J/VECpJjw1CkROaZhH4B8M1OfnXTQ==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.1", + "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" } }, @@ -6015,23 +6059,23 @@ } }, "@typescript-eslint/experimental-utils": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.28.4.tgz", - "integrity": "sha512-OglKWOQRWTCoqMSy6pm/kpinEIgdcXYceIcH3EKWUl4S8xhFtN34GQRaAvTIZB9DD94rW7d/U7tUg3SYeDFNHA==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.31.2.tgz", + "integrity": "sha512-3tm2T4nyA970yQ6R3JZV9l0yilE2FedYg8dcXrTar34zC9r6JB7WyBQbpIVongKPlhEMjhQ01qkwrzWy38Bk1Q==", "dev": true, "requires": { "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.28.4", - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/typescript-estree": "4.28.4", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", "eslint-scope": "^5.1.1", "eslint-utils": "^3.0.0" }, "dependencies": { "@types/json-schema": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.8.tgz", - "integrity": "sha512-YSBPTLTVm2e2OoQIDYx8HaeWJ5tTToLH67kXR7zYNGupXMEHa2++G8k+DczX2cFVgalypqtyZIcU19AFcmOpmg==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, "eslint-utils": { @@ -6052,41 +6096,41 @@ } }, "@typescript-eslint/parser": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.0.tgz", - "integrity": "sha512-oWbzvPh5amMuTmKaf1wp0ySxPt2ZXHnFQBN2Szu1O//7LmOvgaKTCIDNLK2NvzpmVd5A2M/1j/rujBqO37hj3w==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.31.2.tgz", + "integrity": "sha512-EcdO0E7M/sv23S/rLvenHkb58l3XhuSZzKf6DBvLgHqOYdL6YFMYVtreGFWirxaU2mS1GYDby3Lyxco7X5+Vjw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "4.31.0", - "@typescript-eslint/types": "4.31.0", - "@typescript-eslint/typescript-estree": "4.31.0", + "@typescript-eslint/scope-manager": "4.31.2", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/typescript-estree": "4.31.2", "debug": "^4.3.1" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.0.tgz", - "integrity": "sha512-LJ+xtl34W76JMRLjbaQorhR0hfRAlp3Lscdiz9NeI/8i+q0hdBZ7BsiYieLoYWqy+AnRigaD3hUwPFugSzdocg==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.0", - "@typescript-eslint/visitor-keys": "4.31.0" + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" } }, "@typescript-eslint/types": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.0.tgz", - "integrity": "sha512-9XR5q9mk7DCXgXLS7REIVs+BaAswfdHhx91XqlJklmqWpTALGjygWVIb/UnLh4NWhfwhR5wNe1yTyCInxVhLqQ==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.0.tgz", - "integrity": "sha512-QHl2014t3ptg+xpmOSSPn5hm4mY8D4s97ftzyk9BZ8RxYQ3j73XcwuijnJ9cMa6DO4aLXeo8XS3z1omT9LA/Eg==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.0", - "@typescript-eslint/visitor-keys": "4.31.0", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -6095,12 +6139,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.0.tgz", - "integrity": "sha512-HUcRp2a9I+P21+O21yu3ezv3GEPGjyGiXoEUQwZXjR8UxRApGeLyWH4ZIIUSalE28aG4YsV6GjtaAVB3QKOu0w==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, "requires": { - "@typescript-eslint/types": "4.31.0", + "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" } }, @@ -6145,29 +6189,29 @@ } }, "@typescript-eslint/scope-manager": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.28.4.tgz", - "integrity": "sha512-ZJBNs4usViOmlyFMt9X9l+X0WAFcDH7EdSArGqpldXu7aeZxDAuAzHiMAeI+JpSefY2INHrXeqnha39FVqXb8w==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.31.2.tgz", + "integrity": "sha512-2JGwudpFoR/3Czq6mPpE8zBPYdHWFGL6lUNIGolbKQeSNv4EAiHaR5GVDQaLA0FwgcdcMtRk+SBJbFGL7+La5w==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4" + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2" } }, "@typescript-eslint/types": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.28.4.tgz", - "integrity": "sha512-3eap4QWxGqkYuEmVebUGULMskR6Cuoc/Wii0oSOddleP4EGx1tjLnZQ0ZP33YRoMDCs5O3j56RBV4g14T4jvww==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.31.2.tgz", + "integrity": "sha512-kWiTTBCTKEdBGrZKwFvOlGNcAsKGJSBc8xLvSjSppFO88AqGxGNYtF36EuEYG6XZ9vT0xX8RNiHbQUKglbSi1w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.28.4.tgz", - "integrity": "sha512-z7d8HK8XvCRyN2SNp+OXC2iZaF+O2BTquGhEYLKLx5k6p0r05ureUtgEfo5f6anLkhCxdHtCf6rPM1p4efHYDQ==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.31.2.tgz", + "integrity": "sha512-ieBq8U9at6PvaC7/Z6oe8D3czeW5d//Fo1xkF/s9394VR0bg/UaMYPdARiWyKX+lLEjY3w/FNZJxitMsiWv+wA==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.4", - "@typescript-eslint/visitor-keys": "4.28.4", + "@typescript-eslint/types": "4.31.2", + "@typescript-eslint/visitor-keys": "4.31.2", "debug": "^4.3.1", "globby": "^11.0.3", "is-glob": "^4.0.1", @@ -6198,15 +6242,6 @@ "slash": "^3.0.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -6215,22 +6250,16 @@ "requires": { "lru-cache": "^6.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, "@typescript-eslint/visitor-keys": { - "version": "4.28.4", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.28.4.tgz", - "integrity": "sha512-NIAXAdbz1XdOuzqkJHjNKXKj8QQ4cv5cxR/g0uQhCYf/6//XrmfpaYsM7PnBcNbfvTDLUkqQ5TPNm1sozDdTWg==", + "version": "4.31.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.31.2.tgz", + "integrity": "sha512-PrBId7EQq2Nibns7dd/ch6S6/M4/iwLM9McbgeEbCXfxdwRUNxJ4UNreJ6Gh3fI2GNKNrWnQxKL7oCPmngKBug==", "dev": true, "requires": { - "@typescript-eslint/types": "4.28.4", + "@typescript-eslint/types": "4.31.2", "eslint-visitor-keys": "^2.0.0" }, "dependencies": { @@ -7014,9 +7043,9 @@ "integrity": "sha512-24q5Rh3bno7ldoyCq99d6hpnLI+PAMocdeVaaGt/5BTQMprvDwQToHfNnruqN11odCHZZIQbRBw+nZo1lTCH9g==" }, "aws-sdk": { - "version": "2.987.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.987.0.tgz", - "integrity": "sha512-XgMrHWHE3aKg11D4QSlpyLvsGw6mHHiUQuowbswd11k89Q6wEfA+jMbYMC7/jsx3LrH9EKti70qhfZyw/wQIfg==", + "version": "2.992.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.992.0.tgz", + "integrity": "sha512-FP/AOu1nxfaPJ6to05eHriBUzvPiNapEwy96sm5GNOL8/T38k9//H6UhxLJ/46CzxFMH/Mo/WFp0qwpS39ev5A==", "requires": { "buffer": "4.9.2", "events": "1.1.1", @@ -9091,6 +9120,24 @@ } } }, + "connect-datadog": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/connect-datadog/-/connect-datadog-0.0.9.tgz", + "integrity": "sha512-CThcRgy6AAStdBRsrNdneeJkEuH0/2G1QanYFfl0F+ZkbQaRMMM9/apvZ1R3SMD9iAST/Xa78Q0jC51KCB/4LQ==", + "requires": { + "hot-shots": "^6.3.0" + }, + "dependencies": { + "hot-shots": { + "version": "6.8.7", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-6.8.7.tgz", + "integrity": "sha512-XH8iezBSZgVw2jegu96pUfF1Zv0VZ/iXjb7L5yE3F7mn7/bdhf4qeniXjO0wQWeefe433rhOsazNKLxM+XMI9w==", + "requires": { + "unix-dgram": "2.0.x" + } + } + } + }, "connect-mongo": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-4.4.1.tgz", @@ -9946,9 +9993,9 @@ } }, "date-fns": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.23.0.tgz", - "integrity": "sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA==" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.24.0.tgz", + "integrity": "sha512-6ujwvwgPID6zbI0o7UbURi2vlLDR9uP26+tW6Lg+Ji3w7dd0i3DOcjcClLjLPranT60SSEFBwdSyYwn/ZkPIuw==" }, "dayjs": { "version": "1.10.6", @@ -11452,9 +11499,9 @@ } }, "eslint-plugin-jest": { - "version": "24.4.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz", - "integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==", + "version": "24.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.2.tgz", + "integrity": "sha512-jNMnqwX75z0RXRMXkxwb/+9ylKJYJLJ8nT8nBT0XFM5qx4IQGxP4edMawa0qGkSbHae0BDPBmi8I2QF0/F04XQ==", "dev": true, "requires": { "@typescript-eslint/experimental-utils": "^4.0.1" @@ -12463,9 +12510,9 @@ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, "fp-ts": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.11.2.tgz", - "integrity": "sha512-G1rD89nmbbgTNRBKohjB3Qv4IxOHQ5KV3ZvYfpaQZyrGt+ZQUFrcnCqE567bcEdvwoAUKDQM7isOcv7xcM/qAQ==" + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/fp-ts/-/fp-ts-2.11.3.tgz", + "integrity": "sha512-qHI5iaVSFNFmdl6yDensWfFMk32iafAINCnqx8m486DV1+Jht/bTnA9CyahL+Xm7h2y3erinviVBIAWvv5bPYw==" }, "fragment-cache": { "version": "0.2.1", @@ -13103,21 +13150,6 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-4.0.1.tgz", - "integrity": "sha512-Qr4RtTm30xvEdqUXbSBVWDu+PrTokJOwe/FU+VdfJPk+MXAPoeOzKpRyrDTnZIJwAkQ4oBLTU53nu0HrkF/Z2A==", - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - } - } - }, "has-bigints": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", @@ -13316,6 +13348,14 @@ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, + "hot-shots": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/hot-shots/-/hot-shots-8.5.1.tgz", + "integrity": "sha512-LHqIVuoFDdKvtn9nNAC16KgdiinVsPHKSNuGIMoFlAxFzHL782SaWgQ/MTuOkPbwgEEtEmOGaiBeH25UeL/gRA==", + "requires": { + "unix-dgram": "2.0.x" + } + }, "hpagent": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-0.1.2.tgz", @@ -13393,17 +13433,18 @@ "dev": true }, "htmlhint": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.15.1.tgz", - "integrity": "sha512-uNbgqqBiD2ko4QQOYAHTPwDMluc9X81NwzlrJN7yExCoM6dHNgRFjVI+4TEdRrF/EqUzl1dpMUn7GYbu/qCKmA==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/htmlhint/-/htmlhint-0.15.2.tgz", + "integrity": "sha512-ciCpeMEGZ7CbfK+MgK8ykV+wzUHz5he06mAiq8OQLuYN6pxFxZDAhwPwByirOYwdF3GV2M4s7spq2A/g/XMncQ==", "dev": true, "requires": { + "@types/node-fetch": "^2.5.12", "async": "3.2.0", "chalk": "4.1.0", "commander": "5.1.0", - "glob": "7.1.6", + "glob": "7.1.7", + "node-fetch": "^2.6.2", "parse-glob": "3.0.4", - "request": "2.88.2", "strip-json-comments": "3.1.0", "xml": "1.0.1" }, @@ -13454,12 +13495,35 @@ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "node-fetch": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.3.tgz", + "integrity": "sha512-BXSmNTLLDHT0UjQDg5E23x+0n/hPDjySqc0ELE4NpCa2wE5qmmaEWFRP/+v8pfuocchR9l5vFLbSB7CPE2ahvQ==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, "strip-json-comments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", @@ -13474,6 +13538,28 @@ "requires": { "has-flag": "^4.0.0" } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } } } }, @@ -15323,9 +15409,9 @@ } }, "jest-localstorage-mock": { - "version": "2.4.17", - "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.17.tgz", - "integrity": "sha512-Rs1i1Dbz2j8lRgpRuTAXCp8jHjYn1dgmldBCQy08yLu3K+Ujz9em9WEu9ZZlM0WYsoUlJZDU1jUXL+dVsSWfLg==", + "version": "2.4.18", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.18.tgz", + "integrity": "sha512-zQTrtPeyGXvqM9Vw8nYd39Z0YAD2SK2hptyxLLaR/Ci5X72pcPBaiTDTfTeNq8FOuH/aVUSp8jhJUeFHMhuNeg==", "dev": true }, "jest-matcher-utils": { @@ -16422,9 +16508,9 @@ } }, "libphonenumber-js": { - "version": "1.9.32", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.32.tgz", - "integrity": "sha512-sXuNLzTU/lNUZ78eWUi5JvqaHAhwBMuMT17613EjLZl/ejIoDe0EV225Xhw4vuZ6FcqkiwsF8qHcOyyn1dBEWQ==" + "version": "1.9.34", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.9.34.tgz", + "integrity": "sha512-gHTNU9xTtVgSp30IDX/57W4pETMXDIYXFfwEOJVXiYosiY7Hc7ogJwlBjOqlCcU04X0aA8DT57hdwUC1sJBJnA==" }, "lie": { "version": "3.3.0", @@ -20079,9 +20165,9 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" }, "prettier": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.0.tgz", - "integrity": "sha512-DsEPLY1dE5HF3BxCRBmD4uYZ+5DCbvatnolqTqcxEgKVZnL2kUfyu7b8pPQ5+hTBkdhU9SLUmK0/pHb07RE4WQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==", "dev": true }, "prettier-linter-helpers": { @@ -24689,9 +24775,9 @@ "dev": true }, "type-fest": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.3.2.tgz", - "integrity": "sha512-cfvZ1nOC/VqAt8bVOIlFz8x+HdDASpiFYrSi0U0nzcAFlOnzzQ/gsPg2PP1uqjreO7sQCtraYJHMduXSewQsSA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.3.4.tgz", + "integrity": "sha512-2UdQc7cx8F4Ky81Xj7NYQKPhZVtDFbtorrkairIW66rW7xQj5msAhioXa04HqEdP4MD4K2G6QAF7Zyiw/Hju1Q==", "dev": true }, "type-is": { @@ -24908,6 +24994,16 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unix-dgram": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/unix-dgram/-/unix-dgram-2.0.4.tgz", + "integrity": "sha512-7tpK6x7ls7J7pDrrAU63h93R0dVhRbPwiRRCawR10cl+2e1VOvF3bHlVJc6WI1dl/8qk5He673QU+Ogv7bPNaw==", + "optional": true, + "requires": { + "bindings": "^1.3.0", + "nan": "^2.13.2" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 18b148decd..78ffe85df1 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "FormSG", "description": "Form Manager for Government", - "version": "5.28.0", + "version": "5.29.0", "homepage": "https://form.gov.sg", "authors": [ "FormSG " @@ -63,8 +63,8 @@ "@opengovsg/ng-file-upload": "^12.2.15", "@opengovsg/sgid-client": "0.0.12", "@opengovsg/spcp-auth-client": "^1.4.11", - "@sentry/browser": "^6.12.0", - "@sentry/integrations": "^6.12.0", + "@sentry/browser": "^6.13.2", + "@sentry/integrations": "^6.13.2", "@stablelib/base64": "^1.0.1", "JSONStream": "^1.3.5", "abortcontroller-polyfill": "^1.7.3", @@ -82,7 +82,7 @@ "angular-ui-bootstrap": "~2.5.6", "angular-ui-router": "~1.0.29", "aws-info": "^1.2.0", - "aws-sdk": "^2.987.0", + "aws-sdk": "^2.992.0", "axios": "^0.21.4", "bcrypt": "^5.0.1", "bluebird": "^3.5.2", @@ -93,13 +93,14 @@ "busboy": "^0.3.1", "celebrate": "^15.0.0", "compression": "~1.7.2", + "connect-datadog": "0.0.9", "connect-mongo": "^4.4.1", "convict": "^6.2.0", "convict-format-with-validator": "^6.2.0", "cookie-parser": "~1.4.0", "css-toggle-switch": "^4.1.0", "csv-string": "^4.0.1", - "date-fns": "^2.23.0", + "date-fns": "^2.24.0", "dedent-js": "~1.0.1", "dotenv": "^10.0.0", "ejs": "^3.1.6", @@ -111,15 +112,15 @@ "fetch-readablestream": "^0.2.0", "file-saver": "^2.0.5", "font-awesome": "4.7.0", - "fp-ts": "^2.11.2", - "has-ansi": "^4.0.1", + "fp-ts": "^2.11.3", "helmet": "^4.6.0", + "hot-shots": "^8.5.1", "http-status-codes": "^2.1.4", "intl-tel-input": "~12.4.0", "json-stringify-safe": "^5.0.1", "jszip": "^3.7.1", "jwt-decode": "^3.1.2", - "libphonenumber-js": "^1.9.32", + "libphonenumber-js": "^1.9.34", "lodash": "^4.17.21", "moment-timezone": "0.5.33", "mongodb-uri": "^0.9.7", @@ -166,22 +167,23 @@ "@types/bluebird": "^3.5.36", "@types/busboy": "^0.2.4", "@types/compression": "^1.7.2", + "@types/connect-datadog": "0.0.6", "@types/convict": "^6.1.1", "@types/cookie-parser": "^1.4.2", "@types/dedent": "^0.7.0", "@types/ejs": "^3.1.0", "@types/express": "^4.17.13", "@types/express-rate-limit": "^5.1.3", - "@types/express-request-id": "^1.4.2", + "@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/ip": "^1.1.0", - "@types/jest": "^27.0.1", + "@types/jest": "^27.0.2", "@types/json-stringify-safe": "^5.0.0", "@types/mongodb": "^3.6.20", "@types/mongodb-uri": "^0.9.1", - "@types/node": "^14.17.15", + "@types/node": "^14.17.18", "@types/nodemailer": "^6.4.4", "@types/opossum": "^6.2.0", "@types/promise-retry": "^1.1.3", @@ -192,8 +194,8 @@ "@types/uid-generator": "^2.0.2", "@types/uuid": "^8.3.1", "@types/validator": "^13.6.3", - "@typescript-eslint/eslint-plugin": "^4.31.1", - "@typescript-eslint/parser": "^4.31.0", + "@typescript-eslint/eslint-plugin": "^4.31.2", + "@typescript-eslint/parser": "^4.31.2", "auto-changelog": "^2.3.0", "axios-mock-adapter": "^1.20.0", "babel-loader": "^8.2.2", @@ -208,7 +210,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-angular": "^4.0.1", "eslint-plugin-import": "^2.24.2", - "eslint-plugin-jest": "^24.4.0", + "eslint-plugin-jest": "^24.4.2", "eslint-plugin-prettier": "^4.0.0", "eslint-plugin-simple-import-sort": "^7.0.0", "eslint-plugin-typesafe": "^0.5.2", @@ -216,11 +218,11 @@ "form-data": "^4.0.0", "google-fonts-plugin": "4.1.0", "html-loader": "~0.5.5", - "htmlhint": "^0.15.1", + "htmlhint": "^0.15.2", "husky": "^7.0.2", "jest": "^26.6.3", "jest-extended": "^0.11.5", - "jest-localstorage-mock": "^2.4.17", + "jest-localstorage-mock": "^2.4.18", "jest-mock-axios": "^4.4.0", "lint-staged": "^11.1.2", "maildev": "^1.1.0", @@ -230,7 +232,7 @@ "mongodb-memory-server-core": "^6.9.6", "ngrok": "^4.2.2", "optimize-css-assets-webpack-plugin": "^5.0.8", - "prettier": "^2.4.0", + "prettier": "^2.4.1", "proxyquire": "^2.1.3", "regenerator": "^0.14.4", "rimraf": "^3.0.2", @@ -247,7 +249,7 @@ "ts-loader": "^7.0.5", "ts-node": "^10.2.1", "ts-node-dev": "^1.1.8", - "type-fest": "^2.3.2", + "type-fest": "^2.3.4", "typescript": "^4.4.3", "url-loader": "^1.1.2", "webpack": "^4.46.0", diff --git a/shared/utils/nric-validation.ts b/shared/utils/nric-validation.ts index 721c82fece..0abdd75563 100644 --- a/shared/utils/nric-validation.ts +++ b/shared/utils/nric-validation.ts @@ -1,41 +1,29 @@ +const NRIC_FORMAT = /^([STFG])(\d{7})([A-Z])$/ + /** * Validates whether a provided string value adheres to the UIN/FIN format * as provided on the Singapore Government's National Registration Identity Card. * @param value The value to be validated */ export const isNricValid = (value: string): boolean => { - return isFormatValid(value) && isChecksumValid(value) -} + const parsed = value?.toUpperCase().match(NRIC_FORMAT) -/** - * Tests whether a provided string value obeys a simple format check - * @param value The value to be validated - */ -const isFormatValid = (value: string): boolean => { - return /^([STFGstfg]{1})([0-9]{7})([A-Za-z]{1})$/.test(value) -} + if (!parsed) return false -/** - * Algorithm to test whether the NRIC checksum is valid - * @param value The value to be validated - */ -const isChecksumValid = (value: string): boolean => { - // http://www.ngiam.net/NRIC/NRIC_numbers.pdf - value = value.toUpperCase() - const prefix = value.charAt(0) - const suffix = value.charAt(value.length - 1) - const coefficients = [2, 7, 6, 5, 4, 3, 2] - const constant = prefix === 'S' || prefix === 'F' ? 0 : 4 - const coding = - prefix === 'S' || prefix === 'T' - ? ['J', 'Z', 'I', 'H', 'G', 'F', 'E', 'D', 'C', 'B', 'A'] - : ['X', 'W', 'U', 'T', 'R', 'Q', 'P', 'N', 'M', 'L', 'K'] - const sum = value - .substring(1, value.length - 1) - .split('') - .reduce(function (sum, digit, idx) { - sum += parseInt(digit) * coefficients[idx] - return sum - }, constant) - return suffix === coding[sum % 11] + const prefix = parsed[1] + const digits = parsed[2] + const checksum = parsed[3] + + // Specifications at: http://www.ngiam.net/NRIC/NRIC_numbers.pdf + const weights = [2, 7, 6, 5, 4, 3, 2] + const startConstant = prefix === 'S' || prefix === 'F' ? 0 : 4 + const checksumEncoding = + prefix === 'S' || prefix === 'T' ? 'JZIHGFEDCBA' : 'XWUTRQPNMLK' + + const weightedSum = weights.reduce( + (acc, weight, idx) => acc + weight * parseInt(digits[idx]), + startConstant, + ) + + return checksum === checksumEncoding[weightedSum % 11] } diff --git a/src/app/config/logger.ts b/src/app/config/logger.ts index 7cde0760e4..978316349b 100644 --- a/src/app/config/logger.ts +++ b/src/app/config/logger.ts @@ -1,4 +1,3 @@ -import hasAnsi from 'has-ansi' import omit from 'lodash/omit' import logform from 'logform' import path from 'path' @@ -84,7 +83,7 @@ const formatWithInspect = (val: any): string => { return '' } - const shouldFormat = typeof val !== 'string' && !hasAnsi(val) + const shouldFormat = typeof val !== 'string' const formattedVal = shouldFormat ? inspect(val, { depth: null, colors: true }) : val diff --git a/src/app/loaders/express/index.ts b/src/app/loaders/express/index.ts index a70d67626f..06afe5d97a 100644 --- a/src/app/loaders/express/index.ts +++ b/src/app/loaders/express/index.ts @@ -1,6 +1,8 @@ import compression from 'compression' +import connectDatadog from 'connect-datadog' import express, { Express } from 'express' import addRequestId from 'express-request-id' +import { StatsD } from 'hot-shots' import http from 'http' import { Connection } from 'mongoose' import nocache from 'nocache' @@ -141,6 +143,17 @@ const loadExpressApp = async (connection: Connection) => { // Log intranet usage app.use(IntranetMiddleware.logIntranetUsage) + app.use( + connectDatadog({ + method: true, + response_code: true, + path: false, // !! Important: do not turn this true or the tag cardinality will explode + dogstatsd: new StatsD({ + useDefaultRoute: true, + }), + }), + ) + app.use('/', HomeRouter) app.use('/frontend', FrontendRouter) app.use('/auth', AuthRouter)