diff --git a/.eslintrc.json b/.eslintrc.json index bb8b1c09..80500b47 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,3 +1,7 @@ { - "extends": ["next/core-web-vitals", "plugin:storybook/recommended"] + "extends": [ + "next/core-web-vitals", + "plugin:storybook/recommended", + "plugin:jsx-a11y/recommended" + ] } diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..6c25f486 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,5 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn lint-staged +git add -A diff --git a/README.md b/README.md index 30b4a3a6..9aac244a 100644 --- a/README.md +++ b/README.md @@ -57,10 +57,3 @@ yarn yarn build yarn export ``` - -## Todo - -- Ajouter des CSP -- Husky pour avant de commit faire des verifications -- Finir la documentation, en mode si vous créez un fichier faut le mettre là, etc. -- Rajouter une config sur un linter pour next 12 et accessibilité plugin diff --git a/csp.config.js b/csp.config.js new file mode 100644 index 00000000..e80d5123 --- /dev/null +++ b/csp.config.js @@ -0,0 +1,13 @@ +const ContentSecurityPolicy = ` + default-src 'self' *.fabrique.social.gouv.fr; + img-src 'self' data: *.fabrique.social.gouv.fr https://dummyimage.com/; + script-src 'self' *.fabrique.social.gouv.fr ${ + process.env.NODE_ENV !== "production" && "'unsafe-eval'" + }; + frame-src 'self' *.fabrique.social.gouv.fr; + style-src 'self' 'unsafe-inline'; + font-src 'self' data: blob:; + prefetch-src 'self' *.fabrique.social.gouv.fr; +`; + +module.exports = ContentSecurityPolicy; diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 00000000..cbdd62dd --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,11 @@ +const path = require("path"); + +const buildEslintCommand = filenames => + `next lint --fix --file ${filenames + .map(f => path.relative(process.cwd(), f)) + .join(" --file ")}`; + +module.exports = { + "**/*.ts?(x)": () => "tsc -p tsconfig.json --noEmit", + "*.{js,ts,tsx,jsx}": ["jest --bail --findRelatedTests", buildEslintCommand], +}; diff --git a/next-seo.config.js b/next-seo.config.js new file mode 100644 index 00000000..5f95d5b3 --- /dev/null +++ b/next-seo.config.js @@ -0,0 +1,18 @@ +import ContentSecurityPolicy from "./csp.config"; + +const DEFAULT_SEO_CONFIG = { + additionalLinkTags: [ + { + rel: "icon", + href: "/favicon.ico", + }, + ], + additionalMetaTags: [ + { + httpEquiv: "Content-Security-Policy", + content: ContentSecurityPolicy.replace(/\n/g, " ").trim(), + }, + ], +}; + +export default DEFAULT_SEO_CONFIG; diff --git a/next.config.js b/next.config.js index a15952ec..eae98495 100644 --- a/next.config.js +++ b/next.config.js @@ -2,6 +2,8 @@ const { withSentryConfig } = require("@sentry/nextjs"); const { version } = require("./package.json"); +const ContentSecurityPolicy = require("./csp.config"); + /** @type {import('next').NextConfig} */ const moduleExports = { reactStrictMode: true, @@ -16,4 +18,25 @@ const moduleExports = { }, }; -module.exports = withSentryConfig(moduleExports, { silent: true }); +module.exports = { + async headers() { + return [ + { + source: "/:path*", + headers: [ + { + key: "Content-Security-Policy", + value: ContentSecurityPolicy.replace(/\n/g, " ").trim(), + }, + { + key: "X-Robots-Tag", + value: process.env.NEXT_PUBLIC_IS_PRODUCTION_DEPLOYMENT + ? "all" + : "noindex, nofollow, nosnippet", + }, + ], + }, + ]; + }, + ...withSentryConfig(moduleExports, { silent: true }), +}; diff --git a/package.json b/package.json index 9c74867d..07eb38e4 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,8 @@ "build": "next build", "start": "next start", "lint": "next lint", + "prepare": "husky install", + "lint-staged": "lint-staged", "export": "next export", "build:export": "npm run build && npm run export", "e2e": "cypress open", @@ -49,9 +51,12 @@ "cypress": "^9.4.1", "eslint": "8.10.0", "eslint-config-next": "12.1.0", + "eslint-plugin-jsx-a11y": "^6.5.1", "eslint-plugin-storybook": "^0.5.7", "gh-pages": "^3.2.3", + "husky": "^7.0.4", "jest": "^27.5.1", + "lint-staged": "^12.3.7", "start-server-and-test": "^1.14.0", "typescript": "4.6.2" } diff --git a/src/components/footer/bottom.tsx b/src/components/footer/bottom.tsx index e1b817d2..563c4da5 100644 --- a/src/components/footer/bottom.tsx +++ b/src/components/footer/bottom.tsx @@ -1,35 +1,59 @@ -import { FooterBottom, FooterCopy, FooterLink } from "@dataesr/react-dsfr"; +import { + FooterBottom, + FooterCopy, + FooterLink, + SwitchTheme, +} from "@dataesr/react-dsfr"; +import { useState } from "react"; import { FooterBottomSectionProps } from "./type"; -export const Bottom = (props: FooterBottomSectionProps): JSX.Element => ( - - {props.links.map((link, index) => ( - - {link.title} - - ))} - -

- Sauf mention contraire, tous les contenus de ce site sont sous{" "} - - licence etalab-2.0 - -

-

- Version {props.version} ( - - {props.commitHash.substring(0, 8)} - - ) -

-
-
-); +export const Bottom = (props: FooterBottomSectionProps): JSX.Element => { + const [isOpen, setIsOpen] = useState(false); + + return ( + + {props.links.map((link, index) => ( + + {link.title} + + ))} + {props.hasSwitchMode && ( + setIsOpen(true)} href="/"> + + Paramètres d’affichage + + + )} + +

+ Sauf mention contraire, tous les contenus de ce site sont sous{" "} + + licence etalab-2.0 + +

+

+ Version {props.version} ( + + {props.commitHash.substring(0, 8)} + + ) +

+
+ {props.hasSwitchMode && ( + + )} +
+ ); +}; diff --git a/src/components/footer/type.ts b/src/components/footer/type.ts index 6d04e690..e2bb39f2 100644 --- a/src/components/footer/type.ts +++ b/src/components/footer/type.ts @@ -27,6 +27,7 @@ export type FooterBottomSectionProps = { version: string; repositoryUrl: string; commitHash: string; + hasSwitchMode: boolean; }; export type FooterTopSectionProps = { diff --git a/src/components/landing/head.stories.tsx b/src/components/landing/head.stories.tsx new file mode 100644 index 00000000..7ed82c9c --- /dev/null +++ b/src/components/landing/head.stories.tsx @@ -0,0 +1,22 @@ +import React from "react"; +import { ComponentStory, ComponentMeta } from "@storybook/react"; + +import { Head } from "./head"; + +export default { + title: "Header", + component: Head, +} as ComponentMeta; + +const Template: ComponentStory = args => ; + +export const Default = Template.bind({}); +Default.args = { + title: "Random title", + textLead: "Random text lead", + description: "Random description", + image: { + src: "https://via.placeholder.com/600x400", + alt: "Random image", + }, +}; diff --git a/src/components/landing/testimonial.stories.tsx b/src/components/landing/testimonial.stories.tsx new file mode 100644 index 00000000..18752657 --- /dev/null +++ b/src/components/landing/testimonial.stories.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { ComponentStory, ComponentMeta } from "@storybook/react"; +import { Testimonial } from "./testimonial"; + +export default { + title: "Testimonial", + component: Testimonial, +} as ComponentMeta; + +const Template: ComponentStory = args => ( + +); + +export const Default = Template.bind({}); +Default.args = { + description: "Random description", + image: { + src: "https://via.placeholder.com/600x400", + alt: "Random image", + }, + link: { + href: "https://www.google.com", + title: "Random link", + }, +}; diff --git a/src/components/landing/tile.stories.tsx b/src/components/landing/tile.stories.tsx new file mode 100644 index 00000000..73712642 --- /dev/null +++ b/src/components/landing/tile.stories.tsx @@ -0,0 +1,21 @@ +import React from "react"; +import { ComponentStory, ComponentMeta } from "@storybook/react"; +import { Tile } from "./tile"; + +export default { + title: "Tile", + component: Tile, +} as ComponentMeta; + +const Template: ComponentStory = args => ; + +export const Default = Template.bind({}); +Default.args = { + title: "Random title", + description: "Random description", + image: { + src: "https://via.placeholder.com/600x400", + alt: "Random image", + }, + href: "https://www.fabrique.social.gouv.fr/", +}; diff --git a/src/components/landing/tile.tsx b/src/components/landing/tile.tsx index 64eff191..8b2834d3 100644 --- a/src/components/landing/tile.tsx +++ b/src/components/landing/tile.tsx @@ -16,8 +16,10 @@ export const Tile = (props: TileProps): JSX.Element => {

- - {props.title} + + + {props.title} +

{props.description}

diff --git a/src/components/mention/part.stories.tsx b/src/components/mention/index.stories.tsx similarity index 100% rename from src/components/mention/part.stories.tsx rename to src/components/mention/index.stories.tsx diff --git a/src/components/stats/tile.stories.tsx b/src/components/stats/index.stories.tsx similarity index 96% rename from src/components/stats/tile.stories.tsx rename to src/components/stats/index.stories.tsx index 0827d141..4234424d 100644 --- a/src/components/stats/tile.stories.tsx +++ b/src/components/stats/index.stories.tsx @@ -14,7 +14,7 @@ const Template: ComponentStory = args => ( export const Default = Template.bind({}); Default.args = { title: "Nombre de visites", - stats: "1.000.000" + stats: "1.000.000", }; export const WithDescription = Template.bind({}); diff --git a/src/config/layout.ts b/src/config/layout.ts index db338474..55895587 100644 --- a/src/config/layout.ts +++ b/src/config/layout.ts @@ -168,6 +168,7 @@ export const footerPartnerSection: FooterPartnerSectionProps = { }; export const footerBottomSection: FooterBottomSectionProps = { + hasSwitchMode: true, links: [ { title: "Accessibilité : non conforme", diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx index b6f194ea..906bd2cf 100644 --- a/src/pages/_app.tsx +++ b/src/pages/_app.tsx @@ -1,5 +1,6 @@ import "@gouvfr/dsfr/dist/dsfr/dsfr.min.css"; import type { AppProps } from "next/app"; +import SEO from "../../next-seo.config"; import { Layout } from "@components"; import { footerBodySection, @@ -10,6 +11,7 @@ import { } from "@config"; import { useEffect } from "react"; import { init } from "@socialgouv/matomo-next"; +import { DefaultSeo } from "next-seo"; function MyApp({ Component, pageProps }: AppProps) { useEffect(() => { @@ -29,6 +31,7 @@ function MyApp({ Component, pageProps }: AppProps) { topSection: footerTopSection, }} > + ); diff --git a/src/pages/cgu.tsx b/src/pages/cgu.tsx index 63597315..2f0a2c3a 100644 --- a/src/pages/cgu.tsx +++ b/src/pages/cgu.tsx @@ -15,6 +15,20 @@ const Cgu: NextPage = () => { href: "/favicon.ico", }, ]} + additionalMetaTags={[ + { + property: "dc:creator", + content: "Jane Doe", + }, + { + name: "application-name", + content: "NextSeo", + }, + { + httpEquiv: "x-ua-compatible", + content: "IE=edge; chrome=1", + }, + ]} />

Conditions générales d'utilisation

diff --git a/tsconfig.json b/tsconfig.json index 9c6de69f..a5825865 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -24,7 +24,7 @@ "@lib": ["./src/lib"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "jest-setup.ts"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], "exclude": [ "node_modules", "next-sitemap.js", diff --git a/yarn.lock b/yarn.lock index efe876a7..63d0b103 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3661,6 +3661,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -3680,6 +3685,11 @@ ansi-styles@^5.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== +ansi-styles@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" + integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== + ansi-to-html@^0.6.11: version "0.6.15" resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.6.15.tgz#ac6ad4798a00f6aa045535d7f6a9cb9294eebea7" @@ -4783,6 +4793,14 @@ cli-truncate@^2.1.0: slice-ansi "^3.0.0" string-width "^4.2.0" +cli-truncate@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" + integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== + dependencies: + slice-ansi "^5.0.0" + string-width "^5.0.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -4905,6 +4923,11 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-path-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" @@ -5616,6 +5639,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" @@ -6160,7 +6188,7 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@5.1.1, execa@^5.0.0: +execa@5.1.1, execa@^5.0.0, execa@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -7372,6 +7400,11 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== +husky@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" + integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -7702,6 +7735,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-fullwidth-code-point@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" + integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== + is-function@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" @@ -8714,11 +8752,36 @@ lie@3.1.1: dependencies: immediate "~3.0.5" +lilconfig@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" + integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +lint-staged@^12.3.7: + version "12.3.7" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.3.7.tgz#ad0e2014302f704f9cf2c0ebdb97ac63d0f17be0" + integrity sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ== + dependencies: + cli-truncate "^3.1.0" + colorette "^2.0.16" + commander "^8.3.0" + debug "^4.3.3" + execa "^5.1.1" + lilconfig "2.0.4" + listr2 "^4.0.1" + micromatch "^4.0.4" + normalize-path "^3.0.0" + object-inspect "^1.12.0" + pidtree "^0.5.0" + string-argv "^0.3.1" + supports-color "^9.2.1" + yaml "^1.10.2" + listr2@^3.8.3: version "3.14.0" resolved "https://registry.yarnpkg.com/listr2/-/listr2-3.14.0.tgz#23101cc62e1375fd5836b248276d1d2b51fdbe9e" @@ -8733,6 +8796,20 @@ listr2@^3.8.3: through "^2.3.8" wrap-ansi "^7.0.0" +listr2@^4.0.1: + version "4.0.5" + resolved "https://registry.yarnpkg.com/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" + integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== + dependencies: + cli-truncate "^2.1.0" + colorette "^2.0.16" + log-update "^4.0.0" + p-map "^4.0.0" + rfdc "^1.3.0" + rxjs "^7.5.5" + through "^2.3.8" + wrap-ansi "^7.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -9495,7 +9572,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.11.0, object-inspect@^1.9.0: +object-inspect@^1.11.0, object-inspect@^1.12.0, object-inspect@^1.9.0: version "1.12.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== @@ -9947,6 +10024,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.0: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pidtree@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" + integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== + pify@^2.0.0, pify@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -10913,7 +10995,7 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rxjs@^7.1.0, rxjs@^7.5.1: +rxjs@^7.1.0, rxjs@^7.5.1, rxjs@^7.5.5: version "7.5.5" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== @@ -11205,6 +11287,14 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" +slice-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" + integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== + dependencies: + ansi-styles "^6.0.0" + is-fullwidth-code-point "^4.0.0" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -11463,6 +11553,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +string-argv@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" + integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -11489,6 +11584,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^5.0.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + "string.prototype.matchall@^4.0.0 || ^3.0.1", string.prototype.matchall@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa" @@ -11565,6 +11669,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -11652,6 +11763,11 @@ supports-color@^8.0.0, supports-color@^8.1.1: dependencies: has-flag "^4.0.0" +supports-color@^9.2.1: + version "9.2.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" + integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== + supports-hyperlinks@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" @@ -12740,7 +12856,7 @@ yallist@^4.0.0: resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== -yaml@^1.10.0, yaml@^1.7.2: +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: version "1.10.2" resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==