Merge branch 'main' into dependabot/npm_and_yarn/sentry-cf90d29063

This commit is contained in:
Robert Helmer 2023-12-29 08:30:12 -08:00 коммит произвёл GitHub
Родитель 5b8c185c57 ce88978d43
Коммит f06dd8623f
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
29 изменённых файлов: 1455 добавлений и 281 удалений

Просмотреть файл

@ -9,3 +9,14 @@ landing-all-hero-emailform-submit-label = Get free scan
# This is a label underneath a big number "14" - it's an image that demos Monitor.
landing-all-hero-image-chart-label = exposures
# Value Proposition
landing-all-value-prop-fix-exposures = Well help you fix your exposures
landing-all-value-prop-fix-exposures-description = Our mission is to put control of your personal data back in your hands. Well help you resolve data breaches and keep your info private — and well <privacy_link>respect your privacy</privacy_link> in the process.
landing-all-value-prop-info-at-risk = What info could be at risk?
landing-all-value-prop-info-at-risk-description = Data leaks are unfortunately part of our digital lives. Your passwords, contact details, financial information, and other personal info can be exposed, putting you at risk of identity theft.
# Quote
landing-all-quote = <data_breaches>Data breaches</data_breaches> happen every 11 minutes, exposing your private information — but dont worry, we can help.

Просмотреть файл

@ -101,3 +101,13 @@ landing-premium-plans-cards-feature-removal-plus = <b>Automatic removal</b> of p
landing-premium-plans-cards-feature-alerts = Get alerts when your data has been breached
landing-premium-plans-cards-feature-guidance = <b>Guided help</b> to fix high-risk data breaches
landing-premium-plans-cards-feature-monitoring = Continuous monitoring
# Value proposition
landing-premium-value-prop-fix-exposures-description = We provide steps to follow when youve been affected by a data breach and can even remove your data from more than 190 sites trying to sell it — and we <privacy_link>respect your privacy</privacy_link> in the process.
landing-premium-value-prop-info-at-risk-description = Details like your <exposure_type_list>home address, family members names, financial info</exposure_type_list> and more can be exposed when a website is hacked — or sold on data broker sites to anyone looking for you. Knowing what info is out there is the first step in protecting yourself.
landing-premium-value-prop-progress-card-illustration-alt = Progress card delineating exposures that are fixed, in progress or manually fixed
# Quote
landing-premium-quote = Theres a $240 billion industry of <data_brokers>data brokers</data_brokers> selling your private information for profit. Its time to take back your privacy.

426
package-lock.json сгенерированный
Просмотреть файл

@ -9,8 +9,8 @@
"version": "1.0.0",
"license": "MPL-2.0",
"dependencies": {
"@aws-sdk/client-s3": "^3.474.0",
"@aws-sdk/lib-storage": "^3.474.0",
"@aws-sdk/client-s3": "^3.481.0",
"@aws-sdk/lib-storage": "^3.481.0",
"@fluent/bundle": "^0.18.0",
"@fluent/langneg": "^0.7.0",
"@fluent/react": "^0.15.2",
@ -268,16 +268,16 @@
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
},
"node_modules/@aws-sdk/client-s3": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.474.0.tgz",
"integrity": "sha512-uqji9u2yIhFMx6E18+iIlKqimZE1SUEewS78iYYzOKRoQQ+XqFnQXtHTvBGfTExEvdwZUXYg8FqSP2UpQiEf/g==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.481.0.tgz",
"integrity": "sha512-W4xpJRTuKKhQf1yCNPoErqAHize140LJf+YU+H60UB6rHy0uI52KJVSdMMKAghwAlAMLwmLWhKeMYWVpBOOtJw==",
"dependencies": {
"@aws-crypto/sha1-browser": "3.0.0",
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.474.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/credential-provider-node": "3.474.0",
"@aws-sdk/client-sts": "3.481.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/middleware-bucket-endpoint": "3.470.0",
"@aws-sdk/middleware-expect-continue": "3.468.0",
"@aws-sdk/middleware-flexible-checksums": "3.468.0",
@ -285,18 +285,19 @@
"@aws-sdk/middleware-location-constraint": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-sdk-s3": "3.474.0",
"@aws-sdk/middleware-sdk-s3": "3.481.0",
"@aws-sdk/middleware-signing": "3.468.0",
"@aws-sdk/middleware-ssec": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/signature-v4-multi-region": "3.474.0",
"@aws-sdk/signature-v4-multi-region": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@aws-sdk/xml-builder": "3.472.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/eventstream-serde-browser": "^2.0.15",
"@smithy/eventstream-serde-config-resolver": "^2.0.15",
"@smithy/eventstream-serde-node": "^2.0.15",
@ -308,20 +309,20 @@
"@smithy/md5-js": "^2.0.17",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-stream": "^2.0.23",
@ -335,42 +336,43 @@
}
},
"node_modules/@aws-sdk/client-sso": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.474.0.tgz",
"integrity": "sha512-6toUmQUIHkDM/P2/nyLEO/mcWOIPByTlegqX9VCHhYh9Fs5MDT2nit7I6fZzBjZjB5oVTwKjbzgxae9cE3bhqw==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz",
"integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -381,44 +383,44 @@
}
},
"node_modules/@aws-sdk/client-sts": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.474.0.tgz",
"integrity": "sha512-qPPMbrDVAUJgYiFWVewFG7dg0VyMfuGNNK4IC1nZr0eXejUTbdm8cio6IZ8OkWtK+A+L+wx1vX5686WYVgQ0dQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz",
"integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/credential-provider-node": "3.474.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.1.0",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-middleware": "^2.0.8",
"@smithy/util-retry": "^2.0.8",
@ -431,14 +433,14 @@
}
},
"node_modules/@aws-sdk/core": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.474.0.tgz",
"integrity": "sha512-eVRdeB+AoTNSzfc4viHfr0jfkHujSlf4ToExJtTuxS1wlgmIyyxRNrVKxbf0K78YK/TXRsRlJPoS5QCD5h1S2w==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz",
"integrity": "sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg==",
"dependencies": {
"@smithy/core": "^1.1.0",
"@smithy/core": "^1.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
},
@ -461,13 +463,13 @@
}
},
"node_modules/@aws-sdk/credential-provider-ini": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.474.0.tgz",
"integrity": "sha512-3Y2fHI4ZCNjdOO47Vh/xBgLXOrKm3KwBkYkBKKT2g02FUGNT8NLjJg8WBo3D4RQX2h34qx4mtW5nTY6YcGP80Q==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz",
"integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.474.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -481,14 +483,14 @@
}
},
"node_modules/@aws-sdk/credential-provider-node": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.474.0.tgz",
"integrity": "sha512-3OVVVGnb8Ru5hWeeHkg76YZT5mrufweIiWr6ge5zn7FYxc7WkyqIJ0XehqUqG5VQfaYhqh7uq/zmk8OE2B04lQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz",
"integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==",
"dependencies": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-ini": "3.474.0",
"@aws-sdk/credential-provider-ini": "3.481.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.474.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -517,12 +519,12 @@
}
},
"node_modules/@aws-sdk/credential-provider-sso": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.474.0.tgz",
"integrity": "sha512-ik4rzhQtcRLSHB/MLQfi/dSpILxPd3zITb79DIEnqT3gpZRNjoARkZ3Hi68pujkU2530NYf8NcFwLCWoV1hS7Q==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz",
"integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==",
"dependencies": {
"@aws-sdk/client-sso": "3.474.0",
"@aws-sdk/token-providers": "3.470.0",
"@aws-sdk/client-sso": "3.481.0",
"@aws-sdk/token-providers": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
@ -548,13 +550,13 @@
}
},
"node_modules/@aws-sdk/lib-storage": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.474.0.tgz",
"integrity": "sha512-cTfoBZmzC6OyXFzBOlzo3nFK10oTY/JJiXIzHLHkU5Oy9z4V3CvQlVqkFjbkguG4plYvPTT+2xPeNi45NYagqQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.481.0.tgz",
"integrity": "sha512-8atrewlLqMi9jPS8yehthh0BnP4eKzBsy4VPgIDj/YCMDtZSIS4BLDFNLeFRyG8vPe2k7gLz3AgeaoI9ff94+Q==",
"dependencies": {
"@smithy/abort-controller": "^2.0.1",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"buffer": "5.6.0",
"events": "3.3.0",
"stream-browserify": "3.0.0",
@ -671,16 +673,16 @@
}
},
"node_modules/@aws-sdk/middleware-sdk-s3": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.474.0.tgz",
"integrity": "sha512-62aAo/8u5daIabeJ+gseYeHeShe9eYH6mH+kfWmLsHybXCCv1EaD/ZkdXWNhL0HZ3bUI1z1SF1p8jjTAWALnwA==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.481.0.tgz",
"integrity": "sha512-LOFXtxZOnU75vB5rL5/rOjSrYrbk/kqJGbnQJywHQosAiPKSVw9BR/6Q6tQIDDvtMYsVqMB7Db5SzA64hr80Rg==",
"dependencies": {
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-arn-parser": "3.465.0",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-config-provider": "^2.0.0",
"tslib": "^2.5.0"
@ -720,12 +722,12 @@
}
},
"node_modules/@aws-sdk/middleware-user-agent": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz",
"integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==",
"version": "3.478.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz",
"integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==",
"dependencies": {
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
@ -750,11 +752,11 @@
}
},
"node_modules/@aws-sdk/signature-v4-multi-region": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.474.0.tgz",
"integrity": "sha512-93OWRQgTJZASXLrlUNX7mmXknNkYxFYldRLARmYQccONmnIqgYQW0lQj8BFwqkHJTzSMik3/UsU0SHKwZ9ynYA==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.481.0.tgz",
"integrity": "sha512-bNQ+5Gb3c6a+AiR4D9o0olPjPkGal8Dqvq4Mt0vWQ+ZOzzKEZZDSjpCMUdkhm3ezYIFr9rnCmQOpTtyf3/KDVg==",
"dependencies": {
"@aws-sdk/middleware-sdk-s3": "3.474.0",
"@aws-sdk/middleware-sdk-s3": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
@ -766,19 +768,19 @@
}
},
"node_modules/@aws-sdk/token-providers": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz",
"integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz",
"integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==",
"dependencies": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
@ -787,7 +789,7 @@
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
@ -795,14 +797,14 @@
"@smithy/property-provider": "^2.0.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -836,9 +838,9 @@
}
},
"node_modules/@aws-sdk/util-endpoints": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz",
"integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==",
"version": "3.478.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz",
"integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==",
"dependencies": {
"@aws-sdk/types": "3.468.0",
"@smithy/util-endpoints": "^1.0.7",
@ -7568,16 +7570,17 @@
}
},
"node_modules/@smithy/core": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.1.0.tgz",
"integrity": "sha512-k1zaT5S4K0bG67Q5TmPZ6PdWNQBTMQErChuDvTi+NTx21kKDt+/4YRidsK6nDbHizN6fn1bafUxrougZdKrpxA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz",
"integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==",
"dependencies": {
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-middleware": "^2.0.8",
"tslib": "^2.5.0"
},
"engines": {
@ -7772,14 +7775,14 @@
}
},
"node_modules/@smithy/middleware-retry": {
"version": "2.0.24",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz",
"integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==",
"version": "2.0.25",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz",
"integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==",
"dependencies": {
"@smithy/node-config-provider": "^2.1.8",
"@smithy/protocol-http": "^3.0.11",
"@smithy/service-error-classification": "^2.0.8",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-middleware": "^2.0.8",
"@smithy/util-retry": "^2.0.8",
@ -7942,11 +7945,13 @@
}
},
"node_modules/@smithy/smithy-client": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz",
"integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz",
"integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==",
"dependencies": {
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/protocol-http": "^3.0.11",
"@smithy/types": "^2.7.0",
"@smithy/util-stream": "^2.0.23",
"tslib": "^2.5.0"
@ -8031,12 +8036,12 @@
}
},
"node_modules/@smithy/util-defaults-mode-browser": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz",
"integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==",
"version": "2.0.23",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz",
"integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==",
"dependencies": {
"@smithy/property-provider": "^2.0.16",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"bowser": "^2.11.0",
"tslib": "^2.5.0"
@ -8046,15 +8051,15 @@
}
},
"node_modules/@smithy/util-defaults-mode-node": {
"version": "2.0.29",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz",
"integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==",
"version": "2.0.30",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz",
"integrity": "sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA==",
"dependencies": {
"@smithy/config-resolver": "^2.0.21",
"@smithy/credential-provider-imds": "^2.1.4",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/property-provider": "^2.0.16",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
},
@ -28398,16 +28403,16 @@
}
},
"@aws-sdk/client-s3": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.474.0.tgz",
"integrity": "sha512-uqji9u2yIhFMx6E18+iIlKqimZE1SUEewS78iYYzOKRoQQ+XqFnQXtHTvBGfTExEvdwZUXYg8FqSP2UpQiEf/g==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.481.0.tgz",
"integrity": "sha512-W4xpJRTuKKhQf1yCNPoErqAHize140LJf+YU+H60UB6rHy0uI52KJVSdMMKAghwAlAMLwmLWhKeMYWVpBOOtJw==",
"requires": {
"@aws-crypto/sha1-browser": "3.0.0",
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/client-sts": "3.474.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/credential-provider-node": "3.474.0",
"@aws-sdk/client-sts": "3.481.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/middleware-bucket-endpoint": "3.470.0",
"@aws-sdk/middleware-expect-continue": "3.468.0",
"@aws-sdk/middleware-flexible-checksums": "3.468.0",
@ -28415,18 +28420,19 @@
"@aws-sdk/middleware-location-constraint": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-sdk-s3": "3.474.0",
"@aws-sdk/middleware-sdk-s3": "3.481.0",
"@aws-sdk/middleware-signing": "3.468.0",
"@aws-sdk/middleware-ssec": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/signature-v4-multi-region": "3.474.0",
"@aws-sdk/signature-v4-multi-region": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@aws-sdk/xml-builder": "3.472.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/eventstream-serde-browser": "^2.0.15",
"@smithy/eventstream-serde-config-resolver": "^2.0.15",
"@smithy/eventstream-serde-node": "^2.0.15",
@ -28438,20 +28444,20 @@
"@smithy/md5-js": "^2.0.17",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-stream": "^2.0.23",
@ -28462,42 +28468,43 @@
}
},
"@aws-sdk/client-sso": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.474.0.tgz",
"integrity": "sha512-6toUmQUIHkDM/P2/nyLEO/mcWOIPByTlegqX9VCHhYh9Fs5MDT2nit7I6fZzBjZjB5oVTwKjbzgxae9cE3bhqw==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.481.0.tgz",
"integrity": "sha512-d+crFfW8HSDXa68MSfMDX6LH0J22P29SxJW4IGgRZKwHWEaSf4UjOP0mjA4V26R50suAV052/WBY6LjtGsZsHg==",
"requires": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -28505,44 +28512,44 @@
}
},
"@aws-sdk/client-sts": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.474.0.tgz",
"integrity": "sha512-qPPMbrDVAUJgYiFWVewFG7dg0VyMfuGNNK4IC1nZr0eXejUTbdm8cio6IZ8OkWtK+A+L+wx1vX5686WYVgQ0dQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.481.0.tgz",
"integrity": "sha512-GSnJiceKpwLSEW5q2KRu9zHNJgtYysiy9Xkey0EKLKCdDRdM62yCJEFerAbvRRVJsF2LTSrmBmUl2zWB5RT8mw==",
"requires": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/core": "3.474.0",
"@aws-sdk/credential-provider-node": "3.474.0",
"@aws-sdk/core": "3.481.0",
"@aws-sdk/credential-provider-node": "3.481.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
"@smithy/core": "^1.1.0",
"@smithy/core": "^1.2.1",
"@smithy/fetch-http-handler": "^2.3.1",
"@smithy/hash-node": "^2.0.17",
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/node-http-handler": "^2.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-middleware": "^2.0.8",
"@smithy/util-retry": "^2.0.8",
@ -28552,14 +28559,14 @@
}
},
"@aws-sdk/core": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.474.0.tgz",
"integrity": "sha512-eVRdeB+AoTNSzfc4viHfr0jfkHujSlf4ToExJtTuxS1wlgmIyyxRNrVKxbf0K78YK/TXRsRlJPoS5QCD5h1S2w==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.481.0.tgz",
"integrity": "sha512-UeyAc2FnWQDts81vPVBWKEj0WagYK4SVAgNfGcg6zCzzqsUG4unr4NPKQoca2L+XOU55yMCy+5l2K6R3YsFGKg==",
"requires": {
"@smithy/core": "^1.1.0",
"@smithy/core": "^1.2.1",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
}
@ -28576,13 +28583,13 @@
}
},
"@aws-sdk/credential-provider-ini": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.474.0.tgz",
"integrity": "sha512-3Y2fHI4ZCNjdOO47Vh/xBgLXOrKm3KwBkYkBKKT2g02FUGNT8NLjJg8WBo3D4RQX2h34qx4mtW5nTY6YcGP80Q==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.481.0.tgz",
"integrity": "sha512-QXMlILewLV/yQHkyjXsu7PhvmTZIDAaQ4uAfhjnqbH1B8mErRpZKkzHWwp4yeZdTcHfenTVqoTnx9WDa+SnK/Q==",
"requires": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.474.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -28593,14 +28600,14 @@
}
},
"@aws-sdk/credential-provider-node": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.474.0.tgz",
"integrity": "sha512-3OVVVGnb8Ru5hWeeHkg76YZT5mrufweIiWr6ge5zn7FYxc7WkyqIJ0XehqUqG5VQfaYhqh7uq/zmk8OE2B04lQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.481.0.tgz",
"integrity": "sha512-148Ztn2FjlS3VdGWJnAMjuXiZ55/tD823I/koawgp80LnDqMiKfmSGAioXIikqaBHl40K7ZvtBMqP/n/6GM41A==",
"requires": {
"@aws-sdk/credential-provider-env": "3.468.0",
"@aws-sdk/credential-provider-ini": "3.474.0",
"@aws-sdk/credential-provider-ini": "3.481.0",
"@aws-sdk/credential-provider-process": "3.468.0",
"@aws-sdk/credential-provider-sso": "3.474.0",
"@aws-sdk/credential-provider-sso": "3.481.0",
"@aws-sdk/credential-provider-web-identity": "3.468.0",
"@aws-sdk/types": "3.468.0",
"@smithy/credential-provider-imds": "^2.0.0",
@ -28623,12 +28630,12 @@
}
},
"@aws-sdk/credential-provider-sso": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.474.0.tgz",
"integrity": "sha512-ik4rzhQtcRLSHB/MLQfi/dSpILxPd3zITb79DIEnqT3gpZRNjoARkZ3Hi68pujkU2530NYf8NcFwLCWoV1hS7Q==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.481.0.tgz",
"integrity": "sha512-3MrSIQPQDOxhZDppC2XpOLVfuUm7iqRfTrwjSYGeWc//pUZtUI7nMXYjEDL+li5gvasw1lYfYX3VHNdwNnvyOQ==",
"requires": {
"@aws-sdk/client-sso": "3.474.0",
"@aws-sdk/token-providers": "3.470.0",
"@aws-sdk/client-sso": "3.481.0",
"@aws-sdk/token-providers": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@smithy/property-provider": "^2.0.0",
"@smithy/shared-ini-file-loader": "^2.0.6",
@ -28648,13 +28655,13 @@
}
},
"@aws-sdk/lib-storage": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.474.0.tgz",
"integrity": "sha512-cTfoBZmzC6OyXFzBOlzo3nFK10oTY/JJiXIzHLHkU5Oy9z4V3CvQlVqkFjbkguG4plYvPTT+2xPeNi45NYagqQ==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/lib-storage/-/lib-storage-3.481.0.tgz",
"integrity": "sha512-8atrewlLqMi9jPS8yehthh0BnP4eKzBsy4VPgIDj/YCMDtZSIS4BLDFNLeFRyG8vPe2k7gLz3AgeaoI9ff94+Q==",
"requires": {
"@smithy/abort-controller": "^2.0.1",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"buffer": "5.6.0",
"events": "3.3.0",
"stream-browserify": "3.0.0",
@ -28744,16 +28751,16 @@
}
},
"@aws-sdk/middleware-sdk-s3": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.474.0.tgz",
"integrity": "sha512-62aAo/8u5daIabeJ+gseYeHeShe9eYH6mH+kfWmLsHybXCCv1EaD/ZkdXWNhL0HZ3bUI1z1SF1p8jjTAWALnwA==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.481.0.tgz",
"integrity": "sha512-LOFXtxZOnU75vB5rL5/rOjSrYrbk/kqJGbnQJywHQosAiPKSVw9BR/6Q6tQIDDvtMYsVqMB7Db5SzA64hr80Rg==",
"requires": {
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-arn-parser": "3.465.0",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-config-provider": "^2.0.0",
"tslib": "^2.5.0"
@ -28784,12 +28791,12 @@
}
},
"@aws-sdk/middleware-user-agent": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.470.0.tgz",
"integrity": "sha512-s0YRGgf4fT5KwwTefpoNUQfB5JghzXyvmPfY1QuFEMeVQNxv0OPuydzo3rY2oXPkZjkulKDtpm5jzIHwut75hA==",
"version": "3.478.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.478.0.tgz",
"integrity": "sha512-Rec+nAPIzzwxgHPW+xqY6tooJGFOytpYg/xSRv8/IXl3xKGhmpMGs6gDWzmMBv/qy5nKTvLph/csNWJ98GWXCw==",
"requires": {
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
@ -28808,11 +28815,11 @@
}
},
"@aws-sdk/signature-v4-multi-region": {
"version": "3.474.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.474.0.tgz",
"integrity": "sha512-93OWRQgTJZASXLrlUNX7mmXknNkYxFYldRLARmYQccONmnIqgYQW0lQj8BFwqkHJTzSMik3/UsU0SHKwZ9ynYA==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.481.0.tgz",
"integrity": "sha512-bNQ+5Gb3c6a+AiR4D9o0olPjPkGal8Dqvq4Mt0vWQ+ZOzzKEZZDSjpCMUdkhm3ezYIFr9rnCmQOpTtyf3/KDVg==",
"requires": {
"@aws-sdk/middleware-sdk-s3": "3.474.0",
"@aws-sdk/middleware-sdk-s3": "3.481.0",
"@aws-sdk/types": "3.468.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/signature-v4": "^2.0.0",
@ -28821,19 +28828,19 @@
}
},
"@aws-sdk/token-providers": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.470.0.tgz",
"integrity": "sha512-rzxnJxEUJiV69Cxsf0AHXTqJqTACITwcSH/PL4lWP4uvtzdrzSi3KA3u2aWHWpOcdE6+JFvdICscsbBSo3/TOg==",
"version": "3.481.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.481.0.tgz",
"integrity": "sha512-G4ObHF2A/FlvQG7Lb/2sjuklG89IiH3TI1EiNZSzgu6TvY904Js72Slldls4VeJLY2zAnZgyZ9903pBMkDrcxQ==",
"requires": {
"@aws-crypto/sha256-browser": "3.0.0",
"@aws-crypto/sha256-js": "3.0.0",
"@aws-sdk/middleware-host-header": "3.468.0",
"@aws-sdk/middleware-logger": "3.468.0",
"@aws-sdk/middleware-recursion-detection": "3.468.0",
"@aws-sdk/middleware-user-agent": "3.470.0",
"@aws-sdk/middleware-user-agent": "3.478.0",
"@aws-sdk/region-config-resolver": "3.470.0",
"@aws-sdk/types": "3.468.0",
"@aws-sdk/util-endpoints": "3.470.0",
"@aws-sdk/util-endpoints": "3.478.0",
"@aws-sdk/util-user-agent-browser": "3.468.0",
"@aws-sdk/util-user-agent-node": "3.470.0",
"@smithy/config-resolver": "^2.0.21",
@ -28842,7 +28849,7 @@
"@smithy/invalid-dependency": "^2.0.15",
"@smithy/middleware-content-length": "^2.0.17",
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/node-config-provider": "^2.1.8",
@ -28850,14 +28857,14 @@
"@smithy/property-provider": "^2.0.0",
"@smithy/protocol-http": "^3.0.11",
"@smithy/shared-ini-file-loader": "^2.0.6",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/url-parser": "^2.0.15",
"@smithy/util-base64": "^2.0.1",
"@smithy/util-body-length-browser": "^2.0.1",
"@smithy/util-body-length-node": "^2.1.0",
"@smithy/util-defaults-mode-browser": "^2.0.22",
"@smithy/util-defaults-mode-node": "^2.0.29",
"@smithy/util-defaults-mode-browser": "^2.0.23",
"@smithy/util-defaults-mode-node": "^2.0.30",
"@smithy/util-endpoints": "^1.0.7",
"@smithy/util-retry": "^2.0.8",
"@smithy/util-utf8": "^2.0.2",
@ -28882,9 +28889,9 @@
}
},
"@aws-sdk/util-endpoints": {
"version": "3.470.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.470.0.tgz",
"integrity": "sha512-6N6VvPCmu+89p5Ez/+gLf+X620iQ9JpIs8p8ECZiCodirzFOe8NC1O2S7eov7YiG9IHSuodqn/0qNq+v+oLe0A==",
"version": "3.478.0",
"resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.478.0.tgz",
"integrity": "sha512-u9Mcg3euGJGs5clPt9mBuhBjHiEKiD0PnfvArhfq9i+dcY5mbCq/i1Dezp3iv1fZH9xxQt7hPXDfSpt1yUSM6g==",
"requires": {
"@aws-sdk/types": "3.468.0",
"@smithy/util-endpoints": "^1.0.7",
@ -33553,16 +33560,17 @@
}
},
"@smithy/core": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.1.0.tgz",
"integrity": "sha512-k1zaT5S4K0bG67Q5TmPZ6PdWNQBTMQErChuDvTi+NTx21kKDt+/4YRidsK6nDbHizN6fn1bafUxrougZdKrpxA==",
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.2.1.tgz",
"integrity": "sha512-f6cwmMuHo7RIw/c184NBd2rGeGvGIX6p55HSrG5jfR3qkNYo80PHRfhzkJMq1+mv1ZjI5p8NhenWMMkIRJR4tw==",
"requires": {
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-retry": "^2.0.24",
"@smithy/middleware-retry": "^2.0.25",
"@smithy/middleware-serde": "^2.0.15",
"@smithy/protocol-http": "^3.0.11",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-middleware": "^2.0.8",
"tslib": "^2.5.0"
}
},
@ -33724,14 +33732,14 @@
}
},
"@smithy/middleware-retry": {
"version": "2.0.24",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.24.tgz",
"integrity": "sha512-q2SvHTYu96N7lYrn3VSuX3vRpxXHR/Cig6MJpGWxd0BWodUQUWlKvXpWQZA+lTaFJU7tUvpKhRd4p4MU3PbeJg==",
"version": "2.0.25",
"resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.0.25.tgz",
"integrity": "sha512-FXhafCPvx/9L9OgHJ3cdo/pD1f7ngC7DKsjDV2J7k6LO/Yl69POoBLk4sI1OZPUGc4dfxriENlTma9Nj1hI+IQ==",
"requires": {
"@smithy/node-config-provider": "^2.1.8",
"@smithy/protocol-http": "^3.0.11",
"@smithy/service-error-classification": "^2.0.8",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"@smithy/util-middleware": "^2.0.8",
"@smithy/util-retry": "^2.0.8",
@ -33857,11 +33865,13 @@
}
},
"@smithy/smithy-client": {
"version": "2.1.18",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.1.18.tgz",
"integrity": "sha512-7FqdbaJiVaHJDD9IfDhmzhSDbpjyx+ZsfdYuOpDJF09rl8qlIAIlZNoSaflKrQ3cEXZN2YxGPaNWGhbYimyIRQ==",
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.2.0.tgz",
"integrity": "sha512-C/bkNue5H5Obgl83SnlBt4v6VM68CqIjIELh3vAabud87xFYznLNKtj6Qb69Z+QOnLp9T+We++sEem/f2AHE+Q==",
"requires": {
"@smithy/middleware-endpoint": "^2.2.3",
"@smithy/middleware-stack": "^2.0.9",
"@smithy/protocol-http": "^3.0.11",
"@smithy/types": "^2.7.0",
"@smithy/util-stream": "^2.0.23",
"tslib": "^2.5.0"
@ -33928,27 +33938,27 @@
}
},
"@smithy/util-defaults-mode-browser": {
"version": "2.0.22",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.22.tgz",
"integrity": "sha512-qcF20IHHH96FlktvBRICDXDhLPtpVmtksHmqNGtotb9B0DYWXsC6jWXrkhrrwF7tH26nj+npVTqh9isiFV1gdA==",
"version": "2.0.23",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.23.tgz",
"integrity": "sha512-2u+7t7Wgz1jlfsf6il3pz6DIzyJHS3qrnNnmATICm00pQeqp2D4kUOYauOgKGIeKgVpwzzq8+hFQe749r3xR5w==",
"requires": {
"@smithy/property-provider": "^2.0.16",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"bowser": "^2.11.0",
"tslib": "^2.5.0"
}
},
"@smithy/util-defaults-mode-node": {
"version": "2.0.29",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.29.tgz",
"integrity": "sha512-+uG/15VoUh6JV2fdY9CM++vnSuMQ1VKZ6BdnkUM7R++C/vLjnlg+ToiSR1FqKZbMmKBXmsr8c/TsDWMAYvxbxQ==",
"version": "2.0.30",
"resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.30.tgz",
"integrity": "sha512-nmcmEyRlClNprp7mBnUzfmW6HrKQK+yvl+cyXCRUoQSxRvZuLDrztV+JD+zr3qV/oirEc4Q0QNIrrhTDCE6JeA==",
"requires": {
"@smithy/config-resolver": "^2.0.21",
"@smithy/credential-provider-imds": "^2.1.4",
"@smithy/node-config-provider": "^2.1.8",
"@smithy/property-provider": "^2.0.16",
"@smithy/smithy-client": "^2.1.18",
"@smithy/smithy-client": "^2.2.0",
"@smithy/types": "^2.7.0",
"tslib": "^2.5.0"
}

Просмотреть файл

@ -48,8 +48,8 @@
"npm": "10.2.4"
},
"dependencies": {
"@aws-sdk/client-s3": "^3.474.0",
"@aws-sdk/lib-storage": "^3.474.0",
"@aws-sdk/client-s3": "^3.481.0",
"@aws-sdk/lib-storage": "^3.481.0",
"@fluent/bundle": "^0.18.0",
"@fluent/langneg": "^0.7.0",
"@fluent/react": "^0.15.2",

Просмотреть файл

@ -23,7 +23,7 @@ export type Props = {
export function StartFreeScanView(props: Props) {
const l10n = useL10n();
const record = useTelemetry();
const recordTelemetry = useTelemetry();
return (
<FixView
@ -59,7 +59,7 @@ export function StartFreeScanView(props: Props) {
href={process.env.NEXT_PUBLIC_HOW_IT_WORKS_SUMO_URL}
target="_blank"
onClick={() => {
record("link", "click", {
recordTelemetry("link", "click", {
link_id: "returning_user_info_scan_learn_more",
});
}}
@ -75,7 +75,7 @@ export function StartFreeScanView(props: Props) {
variant="primary"
href="/redesign/user/welcome/free-scan?referrer=fix"
onPress={() => {
record("ctaButton", "click", {
recordTelemetry("ctaButton", "click", {
button_id: "intent_to_start_free_scan",
});
}}
@ -88,7 +88,7 @@ export function StartFreeScanView(props: Props) {
variant="secondary"
href="/redesign/user/dashboard/fix/high-risk-data-breaches"
onPress={() => {
record("ctaButton", "click", {
recordTelemetry("ctaButton", "click", {
button_id: "skipped_free_scan",
});
}}

Просмотреть файл

@ -72,7 +72,7 @@ export const EnterInfo = ({
const [invalidInputs, setInvalidInputs] = useState<Array<string>>([]);
const [requestingScan, setRequestingScan] = useState(false);
const record = useTelemetry();
const recordTelemetry = useTelemetry();
const explainerDialogState = useOverlayTriggerState({});
const explainerDialogTrigger = useOverlayTrigger(
{ type: "dialog" },
@ -88,11 +88,11 @@ export const EnterInfo = ({
if (isOpen) {
// TODO: Uncomment popup_id after it has been added to metrics.yaml
// in https://github.com/mozilla/blurts-server/pull/3913.
record("popup", "view", {
recordTelemetry("popup", "view", {
// popup_id: "enter_scan_info_confirmation_modal",
});
} else {
record("button", "click", {
recordTelemetry("button", "click", {
button_id: "edit_free_scan",
});
}
@ -189,7 +189,7 @@ export const EnterInfo = ({
const handleOnSubmit = (event: FormEvent<HTMLFormElement>) => {
event.preventDefault();
record("ctaButton", "click", {
recordTelemetry("ctaButton", "click", {
button_id: "started_free_scan",
});
@ -301,7 +301,7 @@ export const EnterInfo = ({
// TODO: Figure out how to intercept the fetch request in a test:
/* c8 ignore next */
onPress={() => {
record("ctaButton", "click", {
recordTelemetry("ctaButton", "click", {
button_id: "confirmed_free_scan",
});
handleRequestScan();
@ -335,7 +335,7 @@ export const EnterInfo = ({
// TODO: Add unit test when changing this code:
/* c8 ignore next */
onClick={() => {
record("button", "click", {
recordTelemetry("button", "click", {
button_id: "why_do_we_need_this_info",
});
explainerDialogState.open();
@ -365,7 +365,7 @@ export const EnterInfo = ({
validationState={validationState}
inputValue={value}
onFocus={() => {
record("field", "focus", {
recordTelemetry("field", "focus", {
field_id: key,
});
}}
@ -384,7 +384,7 @@ export const EnterInfo = ({
validationState={validationState}
value={value}
onFocus={() => {
record("field", "focus", {
recordTelemetry("field", "focus", {
field_id: key,
});
}}

Просмотреть файл

@ -24,7 +24,7 @@ export type Props = {
export const GetStarted = (props: Props) => {
const l10n = useL10n();
const record = useTelemetry();
const recordTelemetry = useTelemetry();
const explainerDialogState = useOverlayTriggerState({});
const explainerDialogTrigger = useOverlayTrigger(
{ type: "dialog" },
@ -47,7 +47,7 @@ export const GetStarted = (props: Props) => {
{...buttonProps}
ref={triggerRef}
onClick={() => {
record("button", "click", {
recordTelemetry("button", "click", {
button_id: "welcome_data_protection",
});
explainerDialogState.open();

Просмотреть файл

@ -42,7 +42,7 @@ export const View = ({
const skipInitialStep = stepId === "enterInfo";
const [currentStep, setCurrentStep] = useState<StepId>(stepId);
const router = useRouter();
const record = useTelemetry();
const recordTelemetry = useTelemetry();
useEffect(() => {
let pageName = "welcome";
@ -52,11 +52,11 @@ export const View = ({
pageName = "scanning_for_exposures";
}
record("page", "view", {
recordTelemetry("page", "view", {
utm_campaign: skipInitialStep ? "legacy_user" : "new_user",
utm_source: pageName,
});
}, [currentStep, record, skipInitialStep]);
}, [currentStep, recordTelemetry, skipInitialStep]);
const currentComponent =
currentStep === "findExposures" ? (
@ -74,7 +74,7 @@ export const View = ({
previousRoute={previousRoute}
skipInitialStep={skipInitialStep}
onGoBack={() => {
record("button", "click", {
recordTelemetry("button", "click", {
button_id: "declined_free_scan",
});
@ -89,7 +89,7 @@ export const View = ({
<GetStarted
dataBrokerCount={dataBrokerCount}
onStart={() => {
record("ctaButton", "click", {
recordTelemetry("ctaButton", "click", {
button_id: "welcome_start",
});
setCurrentStep("enterInfo");

Просмотреть файл

@ -76,30 +76,6 @@
font: $text-body-lg;
color: $color-grey-50;
}
form {
display: flex;
flex-wrap: wrap;
gap: $spacing-sm;
input {
flex: 1 0 auto;
border-radius: $border-radius-md;
border: 1px solid $color-grey-20;
padding: $spacing-md;
font: $text-body-xl;
}
button {
flex: 1 0 auto;
font: $text-title-xs;
}
label {
font: $text-body-sm;
font-weight: 500;
}
}
}
.heroImage {
@ -163,3 +139,107 @@
text-align: center;
}
}
.quoteWrapper {
padding: $layout-lg $spacing-md;
display: flex;
justify-content: center;
@media screen and (min-width: $content-md) {
padding: $layout-lg;
}
.quote {
max-width: $content-lg;
text-align: center;
font: $text-title-2xs;
line-height: 1.5;
font-family: var(--font-inter);
font-weight: normal;
b {
em {
font-style: normal;
display: inline;
color: $color-violet-50;
}
}
}
}
.valuePropositionWrapper {
.item {
display: flex;
flex-direction: column-reverse;
align-items: center;
justify-content: space-between;
padding: $spacing-2xl $spacing-md;
gap: $spacing-lg;
&.grayBg {
background: $color-grey-05;
}
.exposureTypeList {
font-weight: 600;
color: $color-purple-70;
display: inline;
}
@media screen and (min-width: $screen-md) {
padding-inline: $layout-lg;
padding-block: $layout-sm;
flex-direction: row;
gap: $spacing-xl;
&.reverseRow {
flex-direction: row-reverse;
}
@media screen and (min-width: $screen-lg) {
padding-inline: $layout-lg;
gap: $layout-xl;
@media screen and (min-width: $screen-xl) {
padding-inline: $layout-xl;
}
}
}
span {
gap: $spacing-md;
display: flex;
flex-direction: column;
h2 {
font: $text-title-xs;
font-family: var(--font-inter);
font-weight: 600;
}
p {
font: $text-body-lg;
}
}
.illustration {
width: 100%;
display: flex;
justify-content: center;
img {
height: auto;
}
@media screen and (min-width: $screen-md) {
flex: 1;
}
}
@media screen and (min-width: $screen-md) {
span,
.illustration {
flex: 1;
}
}
}
}

Просмотреть файл

@ -21,6 +21,7 @@ export const LandingUs: Story = {
name: "US visitors",
args: {
eligibleForPremium: true,
countryCode: "us",
},
};
@ -28,5 +29,22 @@ export const LandingNonUs: Story = {
name: "Non-US visitors",
args: {
eligibleForPremium: false,
countryCode: "nz",
},
};
export const LandingNonUsDe: Story = {
name: "German",
args: {
eligibleForPremium: false,
countryCode: "de",
},
};
export const LandingNonUsFr: Story = {
name: "French",
args: {
eligibleForPremium: false,
countryCode: "fr",
},
};

Просмотреть файл

@ -16,9 +16,15 @@ import {
import { userEvent } from "@testing-library/user-event";
import { axe } from "jest-axe";
import { signIn } from "next-auth/react";
import Meta, { LandingNonUs, LandingUs } from "./LandingView.stories";
import Meta, {
LandingNonUs,
LandingNonUsDe,
LandingNonUsFr,
LandingUs,
} from "./LandingView.stories";
jest.mock("next-auth/react");
jest.mock("../../../hooks/useTelemetry");
describe("When Premium is not available", () => {
it("passes the axe accessibility test suite", async () => {
@ -33,19 +39,64 @@ describe("When Premium is not available", () => {
const ComposedDashboard = composeStory(LandingNonUs, Meta);
render(<ComposedDashboard />);
const inputField = screen.getByLabelText(
const inputField = screen.getAllByLabelText(
"Enter your email address to check for data breach exposures.",
);
await user.type(inputField, "mail@example.com");
await user.type(inputField[0], "mail@example.com");
const submitButton = screen.getByRole("button", { name: "Get free scan" });
await user.click(submitButton);
const submitButton = screen.getAllByRole("button", {
name: "Get free scan",
});
await user.click(submitButton[0]);
expect(signIn).toHaveBeenCalledTimes(1);
expect(signIn).toHaveBeenCalledWith("fxa", expect.any(Object), {
email: "mail@example.com",
});
});
it("shows the data breaches quote", () => {
const ComposedDashboard = composeStory(LandingNonUs, Meta);
render(<ComposedDashboard />);
const quote = screen.getByText(
"Data breaches happen every 11 minutes, exposing your private information — but dont worry, we can help.",
);
expect(quote).toBeInTheDocument();
});
it("shows the scanning for exposures illustration in the fix your exposures section", () => {
const ComposedDashboard = composeStory(LandingNonUs, Meta);
render(<ComposedDashboard />);
const scanningForExposuresIllustration = screen.getByTestId(
"scanning-for-exposures-image",
);
expect(scanningForExposuresIllustration).toBeInTheDocument();
});
it("shows the german scanning for exposures illustration", () => {
const ComposedDashboard = composeStory(LandingNonUsDe, Meta);
render(<ComposedDashboard />);
const scanningForExposuresIllustration = screen.getByTestId(
"scanning-for-exposures-image",
);
expect(scanningForExposuresIllustration).toHaveAttribute(
"data-country-code",
"de",
);
});
it("shows the french scanning for exposures illustration", () => {
const ComposedDashboard = composeStory(LandingNonUsFr, Meta);
render(<ComposedDashboard />);
const scanningForExposuresIllustration = screen.getByTestId(
"scanning-for-exposures-image",
);
expect(scanningForExposuresIllustration).toHaveAttribute(
"data-country-code",
"fr",
);
});
});
describe("When Premium is available", () => {
@ -306,4 +357,21 @@ describe("When Premium is available", () => {
expect(signIn).toHaveBeenCalledTimes(1);
});
it("shows the data brokers quote", () => {
const ComposedDashboard = composeStory(LandingUs, Meta);
render(<ComposedDashboard />);
const quote = screen.getByText(
"Theres a $240 billion industry of data brokers selling your private information for profit. Its time to take back your privacy.",
);
expect(quote).toBeInTheDocument();
});
it("shows the progress card illustration in the fix your exposures section", () => {
const ComposedDashboard = composeStory(LandingUs, Meta);
render(<ComposedDashboard />);
const progressCardIllustration = screen.getByTestId("progress-card-image");
expect(progressCardIllustration).toBeInTheDocument();
});
});

Просмотреть файл

@ -9,10 +9,18 @@ import { ExtendedReactLocalization } from "../../../hooks/l10n";
import { PlansTable } from "./PlansTable";
import { useId } from "react";
import getPremiumSubscriptionUrl from "../../../functions/server/getPremiumSubscriptionUrl";
import Image from "next/image";
import ProgressCardImage from "./value-prop-images/progress-card.svg";
import {
LeakedPasswordExampleIllustration,
ScanningForExposuresIllustration,
} from "./WalkthroughImages";
import { TelemetryLink } from "./TelemetryLink";
export type Props = {
eligibleForPremium: boolean;
l10n: ExtendedReactLocalization;
countryCode: string;
};
export const View = (props: Props) => {
@ -32,14 +40,135 @@ export const View = (props: Props) => {
)}
</p>
<SignUpForm
isHero
eligibleForPremium={props.eligibleForPremium}
signUpCallbackUrl={`${process.env.SERVER_URL}/redesign/user/dashboard/`}
eventId={{
cta: "clicked_get_scan_header",
field: "entered_email_address_header",
}}
/>
</div>
<div className={styles.heroImage}>
<HeroImage {...props} />
</div>
</header>
<div className={styles.quoteWrapper}>
<div className={styles.quote}>
<b>
{props.eligibleForPremium
? props.l10n.getFragment("landing-premium-quote", {
elems: {
data_brokers: <em />,
},
})
: props.l10n.getFragment("landing-all-quote", {
elems: {
data_breaches: <em />,
},
})}
</b>
</div>
</div>
<div className={styles.valuePropositionWrapper}>
<div className={`${styles.item} ${styles.grayBg}`}>
<span>
<h2>
{props.l10n.getString("landing-all-value-prop-fix-exposures")}
</h2>
<p>
{props.eligibleForPremium
? props.l10n.getFragment(
"landing-premium-value-prop-fix-exposures-description",
{
elems: {
privacy_link: (
<TelemetryLink
eventData={{ button_id: "privacy_information" }}
href="https://www.mozilla.org/en-US/firefox/privacy/"
target="_blank"
/>
),
},
},
)
: props.l10n.getFragment(
"landing-all-value-prop-fix-exposures-description",
{
elems: {
privacy_link: (
<TelemetryLink
eventData={{ button_id: "privacy_information" }}
href="https://www.mozilla.org/en-US/firefox/privacy/"
target="_blank"
/>
),
},
},
)}
</p>
<SignUpForm
eligibleForPremium={props.eligibleForPremium}
signUpCallbackUrl={`${process.env.SERVER_URL}/redesign/user/dashboard/`}
eventId={{
cta: "clicked_get_scan_second",
field: "entered_email_address_second",
}}
/>
</span>
<div className={styles.illustration}>
{props.eligibleForPremium ? (
<Image
src={ProgressCardImage}
alt={props.l10n.getString(
"landing-premium-value-prop-progress-card-illustration-alt",
)}
data-testid="progress-card-image"
/>
) : (
<ScanningForExposuresIllustration {...props} />
)}
</div>
</div>
<div className={`${styles.item} ${styles.reverseRow}`}>
<span>
<h2>
{props.l10n.getString("landing-all-value-prop-info-at-risk")}
</h2>
<p>
{props.eligibleForPremium
? props.l10n.getFragment(
"landing-premium-value-prop-info-at-risk-description",
{
elems: {
exposure_type_list: (
<span className={styles.exposureTypeList} />
),
},
},
)
: props.l10n.getString(
"landing-all-value-prop-info-at-risk-description",
)}
</p>
<SignUpForm
eligibleForPremium={props.eligibleForPremium}
signUpCallbackUrl={`${process.env.SERVER_URL}/redesign/user/dashboard/`}
eventId={{
cta: "clicked_get_scan_third",
field: "entered_email_address_third",
}}
/>
</span>
<div className={styles.illustration}>
<LeakedPasswordExampleIllustration {...props} />
</div>
</div>
</div>
<Plans {...props} />
</main>
);
@ -83,7 +212,7 @@ const Plans = (props: Props) => {
}
return (
<section className={styles.plans}>
<div className={styles.plans}>
<h2 id={headingId} className={styles.planName}>
{props.l10n.getString("landing-premium-plans-heading")}
</h2>
@ -97,6 +226,6 @@ const Plans = (props: Props) => {
yearly: getPremiumSubscriptionUrl({ type: "yearly" }),
}}
/>
</section>
</div>
);
};

Просмотреть файл

@ -0,0 +1,38 @@
@import "../../../tokens";
.form {
display: flex;
flex-wrap: wrap;
gap: $spacing-xl;
input {
flex: 1 0 auto;
border-radius: $border-radius-md;
border: 1px solid $color-grey-20;
padding: $spacing-md;
font: $text-body-md;
}
button {
flex: 1 0 auto;
font: $text-body-md;
font-weight: 600;
}
label {
font: $text-body-sm;
font-weight: 500;
}
}
form.isHero {
gap: $spacing-sm;
}
input.isHero {
font: $text-body-xl;
}
button.isHero {
font: $text-title-xs;
}

Просмотреть файл

@ -8,20 +8,28 @@ import { FormEventHandler, useId, useState } from "react";
import { signIn } from "next-auth/react";
import { useL10n } from "../../../hooks/l10n";
import { Button } from "../../../components/client/Button";
import styles from "./SignUpForm.module.scss";
import { useTelemetry } from "../../../hooks/useTelemetry";
import { VisuallyHidden } from "../../../components/server/VisuallyHidden";
export type Props = {
eligibleForPremium: boolean;
signUpCallbackUrl: string;
isHero?: boolean;
eventId: {
cta: string;
field: string;
};
};
export const SignUpForm = (props: Props) => {
const emailInputId = useId();
const l10n = useL10n();
const [emailInput, setEmailInput] = useState("");
const record = useTelemetry();
const onSubmit: FormEventHandler = (event) => {
event.preventDefault();
void signIn(
"fxa",
{ callbackUrl: props.signUpCallbackUrl },
@ -30,30 +38,54 @@ export const SignUpForm = (props: Props) => {
// https://mozilla.github.io/ecosystem-platform/relying-parties/reference/query-parameters#email
{ email: emailInput },
);
record("ctaButton", "click", {
button_id: props.eventId.cta,
});
};
const labelContent = (
<label htmlFor={emailInputId}>
{l10n.getString(
props.eligibleForPremium
? "landing-premium-hero-emailform-input-label"
: "landing-all-hero-emailform-input-label",
)}
</label>
);
return (
<form onSubmit={onSubmit}>
<form className={styles.form} onSubmit={onSubmit}>
<input
className={props.isHero ? styles.isHero : ""}
name={emailInputId}
id={emailInputId}
onChange={(e) => setEmailInput(e.target.value)}
onChange={(e) => {
setEmailInput(e.target.value);
}}
onFocus={() => {
record("field", "focus", {
field_id: props.eventId.field,
});
}}
value={emailInput}
type="email"
placeholder={l10n.getString(
"landing-all-hero-emailform-input-placeholder",
)}
/>
<Button type="submit" variant="primary" wide>
<Button
type="submit"
variant="primary"
wide
className={props.isHero ? styles.isHero : ""}
>
{l10n.getString("landing-all-hero-emailform-submit-label")}
</Button>
<label htmlFor={emailInputId}>
{l10n.getString(
props.eligibleForPremium
? "landing-premium-hero-emailform-input-label"
: "landing-all-hero-emailform-input-label",
)}
</label>
{props.isHero ? (
labelContent
) : (
<VisuallyHidden>{labelContent}</VisuallyHidden>
)}
</form>
);
};

Просмотреть файл

@ -0,0 +1,34 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use client";
import { useTelemetry } from "../../../hooks/useTelemetry";
import { GleanMetricMap } from "../../../../telemetry/generated/_map";
import { HTMLAttributes } from "react";
// Telemetry link is shown in a fluent getFragment (which does not get rendered in tests)
/* c8 ignore start */
export const TelemetryLink = ({
eventData,
...props
}: {
eventData: GleanMetricMap["button"]["click"];
href: string;
target: string;
} & HTMLAttributes<HTMLAnchorElement>) => {
const record = useTelemetry();
return (
<a
{...props}
onClick={(event) => {
record("button", "click", eventData);
props.onClick?.(event);
}}
/>
);
};
/* c8 ignore stop */

Просмотреть файл

@ -0,0 +1,73 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { ExtendedReactLocalization } from "../../../hooks/l10n";
import Image from "next/image";
import ScanningForExposuresImage from "./value-prop-images/scanning-for-exposures.svg";
import LeakedPasswordExampleImage from "./value-prop-images/leaked-password-example.svg";
import ScanningForExposuresImageDe from "./value-prop-images/de/scanning-for-exposures-de.svg";
import LeakedPasswordExampleImageDe from "./value-prop-images/de/leaked-password-example-de.svg";
import ScanningForExposuresImageFr from "./value-prop-images/fr/scanning-for-exposures-fr.svg";
import LeakedPasswordExampleImageFr from "./value-prop-images/fr/leaked-password-example-fr.svg";
const IllustrationWrapper = ({
image,
testId,
countryCode,
}: {
image: string;
l10n: ExtendedReactLocalization;
testId: string;
countryCode: string;
}) => (
<Image
src={image}
alt=""
data-testid={testId}
data-country-code={countryCode}
/>
);
type Props = {
countryCode: string;
l10n: ExtendedReactLocalization;
};
export const ScanningForExposuresIllustration = (props: Props) => {
let imageSrc = ScanningForExposuresImage;
if (props.countryCode === "de") {
imageSrc = ScanningForExposuresImageDe;
} else if (props.countryCode === "fr") {
imageSrc = ScanningForExposuresImageFr;
}
return (
<IllustrationWrapper
{...props}
image={imageSrc}
testId="scanning-for-exposures-image"
countryCode={props.countryCode}
/>
);
};
export const LeakedPasswordExampleIllustration = (props: Props) => {
let imageSrc = LeakedPasswordExampleImage;
if (props.countryCode === "de") {
imageSrc = LeakedPasswordExampleImageDe;
} else if (props.countryCode === "fr") {
imageSrc = LeakedPasswordExampleImageFr;
}
return (
<IllustrationWrapper
{...props}
image={imageSrc}
testId="leaked-password-example"
countryCode={props.countryCode}
/>
);
};

Просмотреть файл

@ -14,5 +14,11 @@ export default async function Page() {
const countryCode = getCountryCode(headers());
const eligibleForPremium = isEligibleForPremium(countryCode, enabledFlags);
return <View eligibleForPremium={eligibleForPremium} l10n={getL10n()} />;
return (
<View
eligibleForPremium={eligibleForPremium}
l10n={getL10n()}
countryCode={countryCode}
/>
);
}

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 41 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 30 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 49 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 35 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 40 KiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 6.2 MiB

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

После

Ширина:  |  Высота:  |  Размер: 26 KiB

Просмотреть файл

@ -73,7 +73,7 @@ function PremiumUpsellDialogContent({
const l10n = useL10n();
const defaultSelectedKey = "yearly";
const [selectedTab, setSelectedTab] = useState<Key>(defaultSelectedKey);
const record = useTelemetry();
const recordTelemetry = useTelemetry();
const isMonthly = selectedTab === "monthly";
const tabsData = [
@ -100,7 +100,7 @@ function PremiumUpsellDialogContent({
tabs={tabsData}
defaultSelectedKey={defaultSelectedKey}
onSelectionChange={(selectedKey) => {
record("button", "click", {
recordTelemetry("button", "click", {
button_id:
selectedKey === "monthly"
? "selected_monthly_plan"
@ -156,7 +156,7 @@ function PremiumUpsellDialogContent({
// the back-end because the page unloads before we can do so.
// This will be dealt with in upstream Glean:
// https://matrix.to/#/!SCdsJdSTaQHjzEVrAE:mozilla.org/$muLULIgsOMaLwe3HR6HI_oJbMkyD5gZBoRN3GmDL8Ko
record("upgradeIntent", "click", {
recordTelemetry("upgradeIntent", "click", {
button_id: isMonthly
? "intent_to_purchase_monthly_plan_nav_modal"
: "intent_to_purchase_yearly_plan_nav_modal",
@ -183,7 +183,7 @@ function PremiumUpsellDialog({
...otherProps
}: PremiumUpsellDialogProps & OverlayTriggerProps) {
const l10n = useL10n();
const record = useTelemetry();
const recordTelemetry = useTelemetry();
return (
<div className={styles.modal}>
@ -193,7 +193,7 @@ function PremiumUpsellDialog({
title={l10n.getString("premium-upsell-dialog-title")}
illustration={<Image src={ModalImage} alt="" />}
onDismiss={() => {
record("button", "click", {
recordTelemetry("button", "click", {
button_id: "close_upsell_modal",
});
return void state.close();

Просмотреть файл

@ -86,6 +86,16 @@ export type ScanResult = {
created_at: ISO8601DateString;
updated_at: ISO8601DateString;
};
export type ProfileStats = {
created: number;
deleted: number;
activated: number;
reactivated: number;
deactivated: number;
total_active: number;
total_inactive: number;
total: number;
};
export type ListScanResultsResponse = OneRepResponse<ScanResult[]>;
async function onerepFetch(
@ -439,3 +449,42 @@ export async function fetchAllPages<Data>(
return dataList.flat();
}
// Local instance map to cache results to prevent excessive API requests
// Would be nice to share this cache with other pod via Redis in the future
const profileStatsCache = new Map<string, ProfileStats>();
export async function getProfilesStats(
from?: Date,
to?: Date,
): Promise<ProfileStats | undefined> {
const queryParams = new URLSearchParams();
if (from) queryParams.set("from", from.toISOString().substring(0, 10));
if (to) queryParams.set("to", to.toISOString().substring(0, 10));
const queryParamsString = queryParams.toString();
// check for cache map first
if (profileStatsCache.has(queryParamsString))
return profileStatsCache.get(queryParamsString);
const response: Response = await onerepFetch(
`/stats/profiles?${queryParamsString}`,
{
method: "GET",
},
);
if (!response.ok) {
logger.error(
`Failed to fetch OneRep profile: [${response.status}] [${response.statusText}]`,
);
throw new Error(
`Failed to fetch OneRep profile: [${response.status}] [${response.statusText}]`,
);
}
const profileStats: ProfileStats = await response.json();
// cache results in map, with a flush hack to keep the size low
if (profileStatsCache.size > 5) profileStatsCache.clear();
profileStatsCache.set(queryParamsString, profileStats);
return profileStats;
}

Просмотреть файл

@ -4,8 +4,8 @@
import type { useTelemetry as ogUseTelemetry } from "../useTelemetry";
const mockRecord = jest.fn();
const mockedRecordTelemetry = jest.fn();
export const useTelemetry: typeof ogUseTelemetry = () => {
return mockRecord as ReturnType<typeof ogUseTelemetry>;
return mockedRecordTelemetry as ReturnType<typeof ogUseTelemetry>;
};

Просмотреть файл

@ -23,7 +23,7 @@ export const useTelemetry = () => {
const { gtag } = useGa();
const { Glean, Ga } = TelemetryPlatforms;
const record = <
const recordTelemetry = <
EventModule extends keyof GleanMetricMap,
EventName extends keyof GleanMetricMap[EventModule],
>(
@ -53,5 +53,5 @@ export const useTelemetry = () => {
}
};
return record;
return recordTelemetry;
};

Просмотреть файл

@ -153,6 +153,8 @@ popup:
flow_id:
description: A randomly generated unique identifier for following user flows within the FxA system.
type: string
popup_id:
description: The ID of the popup that was shown, or some way to identify where on the page the interaction is located.
button:
click: