diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 839aaf2b2..98f2bbf23 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -64,6 +64,7 @@ jobs: NPM_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Validate markdown authors and posts + id: validate_markdown run: yarn validate-markdown env: NPM_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -137,7 +138,7 @@ jobs: - name: Update deployment status uses: bobheadxi/deployments@v1 - if: always() + if: success() with: step: finish token: ${{ secrets.GITHUB_TOKEN }} diff --git a/_posts/fr/2023-06-07-agile-travail-distance.md b/_posts/fr/2023-06-07-agile-travail-distance.md index a2ba8f82b..40e7e6ed3 100644 --- a/_posts/fr/2023-06-07-agile-travail-distance.md +++ b/_posts/fr/2023-06-07-agile-travail-distance.md @@ -2,12 +2,12 @@ lang: fr date: '2023-06-07' slug: agile-travail-distance -title: 'Optimisez votre travail à distance : Conseils pour une équipe agile 100% remote' +title: >- + 'Optimisez votre travail à distance : Conseils pour une équipe agile 100% remote' excerpt: Retours d’expérience de gestion de projet agile en télétravail avec une équipe de production importante et plusieurs clients répartis dans toute la France. Ce rapport présente les défis rencontrés ainsi que des conseils pour améliorer la communication et la transparence dans votre projet. categories: - agile keywords: - - agile - travail - distance - remote @@ -24,7 +24,7 @@ De plus en plus d'entreprises optent pour le travail à distance depuis la péri Pendant ces 3 ans de projets, nous avons mis en place des méthodes pour améliorer les processus de travail à distance. Voici ce que nous avons réalisé dans les deux domaines clés impactés par la distance des équipes : la collaboration et la transparence. -**Collaboration entre l’équipe et les parties prenantes** +**Collaboration entre l’équipe et les parties prenantes** Au cours de cette expérience, nous avons constaté qu'en raison du télétravail et de la situation où chaque partie prenante se trouvait dans des bureaux séparés, la communication avec l'équipe de production (PO, développeurs, UX) était difficile. En effet, étant donné que chacun gérait sa propre entreprise, le projet était perçu comme une utilisation de temps qui empiétait sur la gestion de leurs activités individuelles. @@ -43,7 +43,7 @@ Pour la communication externe, toutes les réunions avec les parties prenantes s Pour finir, afin de maintenir la motivation de nos clients lors des démonstrations nous avons travaillé pour rendre les sessions **interactives et engageantes**. On communiquait en amont sur les fonctionnalités qui allaient être présentées afin que seuls les clients concernés assistent à la démonstration. -**Collaboration entre les membres de l’équipe de production** +**Collaboration entre les membres de l’équipe de production** En ce qui concerne l'équipe de production, nous étions composés de plusieurs profils différents (PPO, UX, PO, PM, développeurs) chacun ayant sa propre façon de travailler. Cependant, en raison du nombre élevé de membres, certaines informations se perdaient lors des discussions, ce qui entraînait des réponses répétitives aux questions et une confusion dans les processus de communication, rendant le travail plus complexe. Afin de simplifier la communication entre tous les membres et de faciliter la collaboration, nous avons mis en place les actions suivantes : @@ -58,7 +58,7 @@ Afin de simplifier la communication entre tous les membres et de faciliter la co - La mise en place d'un système de **mentorat** pour aider les nouveaux membres de l'équipe à s'adapter au travail à distance et à s'intégrer rapidement. Nous avons organisé des séances de coaching régulières pour répondre aux questions et résoudre les éventuels blocages. -**Transparence entre l’équipe et les parties prenantes** +**Transparence entre l’équipe et les parties prenantes** Au cours de ce projet, nous avons identifié un véritable manque de transparence entre l'équipe de production et les parties prenantes. Ce manque s'est principalement manifesté par une incompréhension de l'intérêt commercial du produit de la part de l'équipe de production, ainsi qu'un manque de retour sur les utilisations réelles des clients. Du côté des parties prenantes, il s'agissait de l'un de leurs premiers projets numériques d'une telle envergure, et nous avons constaté une méconnaissance des difficultés techniques de certaines fonctionnalités, ce qui a entraîné une incompréhension du temps nécessaire pour répondre aux demandes exprimées. Afin d'améliorer ces aspects, nous avons mis en œuvre les actions suivantes : @@ -71,7 +71,7 @@ Afin d'améliorer ces aspects, nous avons mis en œuvre les actions suivantes : - L’établissement d’une méthode de **suivi hebdomadaire pour la partie commerciale**, en identifiant les blocages et en informant efficacement l'équipe des avancements et des défis à relever. -**Transparence entre les membres de l’équipe de développement** +**Transparence entre les membres de l’équipe de développement** Enfin, nous avons constaté que de nombreuses informations et outils n'étaient pas utilisés par l'équipe, ce qui entraînait des demandes répétées d'informations et une perte de temps dans les activités opérationnelles. De plus, en travaillant de manière isolée, certaines actions étaient réalisées en double, ce qui n'était pas optimal pour les processus de travail. Afin de garantir l'accès à des informations pertinentes pour tous et de simplifier les processus, nous avons mis en place les mesures suivantes : - Communication **transparente sur l'objectif du produit,** son avancement et les retours utilisateurs en intégrant toutes les informations dans l'outil de gestion de projet et en organisant des communications régulières avec l'équipe. diff --git a/bin/binHelper.ts b/bin/binHelper.ts new file mode 100644 index 000000000..908d11103 --- /dev/null +++ b/bin/binHelper.ts @@ -0,0 +1,15 @@ +export const getArgs = (): TArgs => { + const args = process.argv.slice(2); + const formattedArgs: { [key: string]: boolean | string | number } = {}; + + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + + if (arg.startsWith('--')) { + const [key, value] = arg.substring(2).split('='); + formattedArgs[key] = value ? value : true; + } + } + + return formattedArgs as TArgs; +}; diff --git a/bin/validateMarkdown.ts b/bin/validateMarkdown.ts index b0bd31c95..04554dac9 100644 --- a/bin/validateMarkdown.ts +++ b/bin/validateMarkdown.ts @@ -1,17 +1,32 @@ import { createServer as createViteServer } from 'vite'; +import { MarkdownInvalidError } from '../src/helpers/markdownHelper'; +import { getArgs } from './binHelper'; + (async (): Promise => { + const args = getArgs<{ ci: boolean }>(); + const vite = await createViteServer({ server: { middlewareMode: true }, appType: 'custom', }); try { - const { validateMarkdown } = await vite.ssrLoadModule('/src/helpers/validateMarkdownHelper.ts'); + const { validateMarkdown } = await vite.ssrLoadModule('/src/helpers/markdownHelper.ts'); validateMarkdown(); + vite.close(); } catch (e) { - console.error(e); - } finally { vite.close(); + + const markdownInvalidError = e as MarkdownInvalidError; + if (args.ci) { + console.log(`::set-output name=filePath::${markdownInvalidError.markdownFilePathRelative}`); + console.log(`::set-output name=reason::${markdownInvalidError.reason}`); + console.log(`::set-output name=line::${markdownInvalidError.line}`); + console.log(`::set-output name=column::${markdownInvalidError.column}`); + process.exit(1); + } + + console.error(markdownInvalidError); } })(); diff --git a/package.json b/package.json index d38478dc8..cf38e9a0e 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,7 @@ "devDependencies": { "@babel/core": "^7.20.12", "@elevenlabs/eslint-config": "^0.0.1", + "@octokit/core": "^4.2.1", "@storybook/addon-actions": "^7.0.2", "@storybook/addon-essentials": "^7.0.2", "@storybook/addon-interactions": "^7.0.2", @@ -66,6 +67,7 @@ "@testing-library/react": "^14.0.0", "@types/express": "^4.17.17", "@types/i18next": "^13.0.0", + "@types/js-yaml": "^4.0.5", "@types/markdown-it": "^12.2.3", "@types/node": "^18.13.0", "@types/react": "^18.0.28", @@ -92,7 +94,7 @@ "rehype-raw": "^6.1.1", "rehype-react": "^7.1.2", "rehype-rewrite": "^3.0.6", - "remark-parse": "^10.0.1", + "remark-parse": "^10.0.2", "remark-rehype": "^10.1.0", "rollup-plugin-visualizer": "^5.9.0", "sanitize-html": "^2.10.0", diff --git a/src/helpers/contentHelper.ts b/src/helpers/contentHelper.ts index ab19fb69d..56ee5d18f 100644 --- a/src/helpers/contentHelper.ts +++ b/src/helpers/contentHelper.ts @@ -5,7 +5,7 @@ import path, { dirname, resolve } from 'node:path'; import { ASSETS_DIR, DATA_DIR, MARKDOWN_FILE_PATHS } from '@/app-paths'; import { CATEGORIES } from '@/constants'; import { getPathFile } from '@/helpers/assetHelper'; -import { markdownToHtml } from '@/helpers/markdownHelper'; +import { markdownToHtml } from '@/helpers/markdownToHtmlHelper'; import { intersection } from '@/helpers/objectHelper'; import { AuthorData, diff --git a/src/helpers/validateMarkdownHelper.test.ts b/src/helpers/markdownHelper.test.ts similarity index 64% rename from src/helpers/validateMarkdownHelper.test.ts rename to src/helpers/markdownHelper.test.ts index 23d3dfca8..0cdaf8147 100644 --- a/src/helpers/validateMarkdownHelper.test.ts +++ b/src/helpers/markdownHelper.test.ts @@ -1,11 +1,41 @@ import * as glob from 'glob'; import { vi } from 'vitest'; +import { z } from 'zod'; -import { validateAuthor, validateMarkdown, validatePost } from './validateMarkdownHelper'; +import { frontmatter, getDataInMarkdownFile, validateAuthor, validateMarkdown, validatePost } from './markdownHelper'; vi.mock('node:fs', () => ({ readFileSync: vi.fn().mockImplementation((path: string) => { switch (path) { + case '/path/to/dir/valid-file.md': + return `--- +title: Example Title +slug: example-title +--- +This is the content`; + case '/path/to/dir/invalid-file-with-markdown-contains-disallowed-syntax.md': + return `--- +title: Example Title +date: 2023-06-13 +--- + +This is the content with a disallowed syntax {:{key}}`; + case '/path/to/dir/invalid-file-with-validation-schema.md': + return `--- +title: Example Title +date: invalid-date +--- + +This is the content`; + case '/path/to/dir/invalid-file-syntax.md': + return `--- +title: Example Title +slug: example-title +description: -> +'lorem ipsum' +--- + +This is the content`; case '/path/to/dir/invalid-author.md': return `--- username: jdoe @@ -124,11 +154,91 @@ This is some valid content`; })); vi.mock('glob'); +describe('frontmatter', () => { + it('should extract frontmatter data and remove it from the content', () => { + const content = `--- +title: Example Title +slug: example-title +--- +This is the content`; + + const expectedResult = { + data: { + title: 'Example Title', + slug: 'example-title', + }, + content: 'This is the content', + }; + + const result = frontmatter(content); + expect(result).toMatchObject(expectedResult); + }); +}); + +describe('getDataInMarkdownFile', () => { + const ValidationSchema = z.object({ + title: z.string(), + slug: z.string(), + }); + + it('should parse markdown file and validate frontmatter data', () => { + const result = getDataInMarkdownFile({ + ValidationSchema, + markdownFilePath: '/path/to/dir/valid-file.md', + }); + + expect(result).toMatchObject({ + title: 'Example Title', + slug: 'example-title', + content: 'This is the content', + }); + }); + + it('should throw an error if markdown contains disallowed syntax', () => { + const markdownFilePath = '/path/to/dir/invalid-file-with-markdown-contains-disallowed-syntax.md'; + expect(() => { + getDataInMarkdownFile({ + ValidationSchema, + markdownFilePath, + }); + }).toThrow( + `The markdown of the file "${markdownFilePath}" is invalid ! Is not compliant, it contains a syntax that is not allowed !` + ); + }); + + it('should throw an error if frontmatter data is invalid', () => { + const markdownFilePath = '/path/to/dir/invalid-file-with-validation-schema.md'; + expect(() => { + getDataInMarkdownFile({ + ValidationSchema: z.object({ + title: z.string(), + date: z.coerce.date(), + }), + markdownFilePath, + }); + }).toThrow( + `The markdown of the file "/path/to/dir/invalid-file-with-validation-schema.md" is invalid ! Invalid date at "date"` + ); + }); + + it('should throw an error if an error occurs during parsing or validation', () => { + const markdownFilePath = '/path/to/dir/invalid-file-syntax.md'; + expect(() => { + getDataInMarkdownFile({ + ValidationSchema, + markdownFilePath, + }); + }).toThrow( + `The markdown of the file "${markdownFilePath}" is invalid ! Can not read an implicit mapping pair; a colon is missed at line 5, column 14` + ); + }); +}); + describe('validateAuthor', () => { it('should throw an error if markdown is invalid', () => { const options = { markdownFilePath: '/path/to/dir/invalid-author.md' }; expect(() => validateAuthor(options)).toThrowError( - 'The markdown of the file "/path/to/dir/invalid-author.md" is invalid ! Validation error: Required at "name"' + 'The markdown of the file "/path/to/dir/invalid-author.md" is invalid ! Required at "name"' ); }); @@ -153,7 +263,7 @@ describe('validatePost', () => { markdownFilePath: '/path/to/dir/invalid-post.md', }; expect(() => validatePost(options)).toThrowError( - 'The markdown of the file "/path/to/dir/invalid-post.md" is invalid ! Validation error: Required at "title"' + 'The markdown of the file "/path/to/dir/invalid-post.md" is invalid ! Required at "title"' ); }); @@ -164,7 +274,7 @@ describe('validatePost', () => { }; expect(() => validatePost(options)).toThrow( - 'The markdown of the file "/path/to/dir/invalid-post-keyword-includes-in-categories.md" is invalid ! Validation error: Must not include a category. at "keywords"' + 'The markdown of the file "/path/to/dir/invalid-post-keyword-includes-in-categories.md" is invalid ! Must not include a category. at "keywords"' ); }); @@ -175,7 +285,7 @@ describe('validatePost', () => { }; expect(() => validatePost(options)).toThrow( - 'The markdown of the file "/path/to/dir/invalid-post-too-many-keywords.md" is invalid ! Validation error: Too many items 😡. at "keywords"' + 'The markdown of the file "/path/to/dir/invalid-post-too-many-keywords.md" is invalid ! Too many items 😡. at "keywords"' ); }); @@ -186,7 +296,7 @@ describe('validatePost', () => { }; expect(() => validatePost(options)).toThrow( - 'The markdown of the file "/path/to/dir/invalid-post-duplicates-keywords.md" is invalid ! Validation error: No duplicates allowed. at "keywords"' + 'The markdown of the file "/path/to/dir/invalid-post-duplicates-keywords.md" is invalid ! No duplicates allowed. at "keywords"' ); }); @@ -197,7 +307,7 @@ describe('validatePost', () => { }; expect(() => validatePost(options)).toThrow( - 'The markdown of the file "/path/to/dir/invalid-post-bad-syntax-on-markdown.md" is not compliant, it contains a syntax that is not allowed !' + 'The markdown of the file "/path/to/dir/invalid-post-bad-syntax-on-markdown.md" is invalid ! Is not compliant, it contains a syntax that is not allowed !' ); }); diff --git a/src/helpers/validateMarkdownHelper.ts b/src/helpers/markdownHelper.ts similarity index 51% rename from src/helpers/validateMarkdownHelper.ts rename to src/helpers/markdownHelper.ts index bcc776900..3904f3fb8 100644 --- a/src/helpers/validateMarkdownHelper.ts +++ b/src/helpers/markdownHelper.ts @@ -1,14 +1,84 @@ import { globSync } from 'glob'; import matter from 'gray-matter'; +import { YAMLException } from 'js-yaml'; import { readFileSync } from 'node:fs'; -import { z } from 'zod'; +import * as path from 'path'; +import { z, ZodSchema } from 'zod'; import { fromZodError } from 'zod-validation-error'; import { AUTHORS_DIR, POSTS_DIR } from '@/app-paths'; import { AUTHORIZED_LANGUAGES, CATEGORIES } from '@/constants'; import { intersection } from '@/helpers/objectHelper'; +import { capitalize } from '@/helpers/stringHelper'; import { AuthorData, PostData } from '@/types'; +export class MarkdownInvalidError extends Error { + markdownFilePathRelative: string; + reason: string; + line?: number; + column?: number; + + constructor(options: { markdownFilePath: string; reason: string; line?: number; column?: number }) { + const globalMessage = `The markdown of the file "${options.markdownFilePath}" is invalid ! ${capitalize( + options.reason + )}`; + super(globalMessage); + this.markdownFilePathRelative = path.relative(process.cwd(), options.markdownFilePath); + this.reason = options.reason; + this.line = options.line; + this.column = options.column; + } +} + +export const frontmatter = ( + content: string +): Omit, 'data'> & { data: TData } => { + return matter(content) as Omit, 'data'> & { data: TData }; +}; + +export const getDataInMarkdownFile = (options: { + markdownFilePath: string; + ValidationSchema: ZodSchema; +}): TData & { content: string } => { + const markdownContent = readFileSync(options.markdownFilePath, { encoding: 'utf-8' }); + + if (markdownContent.match(/{:[^}]+}/)) { + throw new MarkdownInvalidError({ + markdownFilePath: options.markdownFilePath, + reason: 'is not compliant, it contains a syntax that is not allowed !', + }); + } + + try { + const frontmatterResult = matter(markdownContent); + + const result = options.ValidationSchema.safeParse(frontmatterResult.data); + + if (!result.success) { + const validationError = fromZodError(result.error); + + throw new MarkdownInvalidError({ + markdownFilePath: options.markdownFilePath, + reason: validationError.message.replace('Validation error: ', ''), + }); + } + + return { ...result.data, content: frontmatterResult.content }; + } catch (error) { + if (error instanceof MarkdownInvalidError) { + throw error; + } + const yamlException = error as YAMLException; + + throw new MarkdownInvalidError({ + markdownFilePath: options.markdownFilePath, + reason: (error as Error)?.message, + line: yamlException?.mark?.line, + column: yamlException?.mark?.column, + }); + } +}; + export const validateAuthor = (options: { markdownFilePath: string }): AuthorData & { content: string } => { const AuhorValidationSchema = z .object({ @@ -20,15 +90,10 @@ export const validateAuthor = (options: { markdownFilePath: string }): AuthorDat }) .strict(); - const markdownContent = readFileSync(options.markdownFilePath, { encoding: 'utf-8' }); - const matterResult = matter(markdownContent); - const result = AuhorValidationSchema.safeParse(matterResult.data); - if (!result.success) { - const validationError = fromZodError(result.error); - throw new Error(`The markdown of the file "${options.markdownFilePath}" is invalid ! ${validationError.message}`); - } - - return { ...result.data, content: matterResult.content }; + return getDataInMarkdownFile({ + markdownFilePath: options.markdownFilePath, + ValidationSchema: AuhorValidationSchema, + }); }; export const validatePost = (options: { @@ -76,23 +141,10 @@ export const validatePost = (options: { }) .strict(); - const markdownContent = readFileSync(options.markdownFilePath, { encoding: 'utf-8' }); - - if (markdownContent.match(/{:[^}]+}/)) { - throw new Error( - `The markdown of the file "${options.markdownFilePath}" is not compliant, it contains a syntax that is not allowed !` - ); - } - - const matterResult = matter(markdownContent); - const result = PostValidationSchema.safeParse(matterResult.data); - - if (!result.success) { - const validationError = fromZodError(result.error); - throw new Error(`The markdown of the file "${options.markdownFilePath}" is invalid ! ${validationError.message}`); - } - - return { ...result.data, content: matterResult.content }; + return getDataInMarkdownFile({ + markdownFilePath: options.markdownFilePath, + ValidationSchema: PostValidationSchema, + }); }; export const validateMarkdown = (): boolean => { @@ -104,7 +156,10 @@ export const validateMarkdown = (): boolean => { for (const markdownFilePath of authorMarkdownFilePaths) { const author = validateAuthor({ markdownFilePath }); if (authors.includes(author.username)) { - throw new Error('This author already exists with the same username !'); + throw new MarkdownInvalidError({ + markdownFilePath, + reason: 'This author already exists with the same username !', + }); } authors.push(author.username); } @@ -115,7 +170,10 @@ export const validateMarkdown = (): boolean => { const post = validatePost({ authors: authors as [string, ...string[]], markdownFilePath }); const postId = `${post.lang}-${post.slug}`; if (postIds.includes(postId)) { - throw new Error('This article already exists with the same slug and the same language !'); + throw new MarkdownInvalidError({ + markdownFilePath, + reason: 'This article already exists with the same slug and the same language !', + }); } postIds.push(postId); } diff --git a/src/helpers/markdownHelper.tsx b/src/helpers/markdownToHtmlHelper.tsx similarity index 96% rename from src/helpers/markdownHelper.tsx rename to src/helpers/markdownToHtmlHelper.tsx index 3592dbed1..d14210094 100644 --- a/src/helpers/markdownHelper.tsx +++ b/src/helpers/markdownToHtmlHelper.tsx @@ -9,7 +9,6 @@ import { SyntaxHighlighter, Text, } from '@eleven-labs/design-system'; -import matter from 'gray-matter'; import React from 'react'; import ReactDOMServer from 'react-dom/server'; import rehypeRaw from 'rehype-raw'; @@ -19,6 +18,7 @@ import remarkParse from 'remark-parse'; import remark2rehype from 'remark-rehype'; import { unified } from 'unified'; +import { frontmatter } from '@/helpers/markdownHelper'; import { intersection } from '@/helpers/objectHelper'; const getReminderVariantByAdmonitionVariant = (admonitionVariant: string): ReminderVariantType => { @@ -75,7 +75,7 @@ const cleanMarkdown = (markdownContent: string): string => export const markdownToHtml = function >( markdownContent: string ): { data: TData; html: string } { - const matterResult = matter(markdownContent); + const frontmatterResult = frontmatter(markdownContent); const reactComponent = unified() .use(remarkParse) @@ -186,10 +186,10 @@ export const markdownToHtml = function >( }, }, }) - .processSync(cleanMarkdown(matterResult.content)).result; + .processSync(cleanMarkdown(frontmatterResult.content)).result; return { - data: matterResult.data as TData, + data: frontmatterResult.data, html: String(ReactDOMServer.renderToStaticMarkup(reactComponent)), }; }; diff --git a/yarn.lock b/yarn.lock index 81b7d514f..e5f62ebe6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2034,6 +2034,75 @@ mkdirp "^1.0.4" rimraf "^3.0.2" +"@octokit/auth-token@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== + +"@octokit/core@^4.2.1": + version "4.2.1" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.1.tgz#fee6341ad0ce60c29cc455e056cd5b500410a588" + integrity sha512-tEDxFx8E38zF3gT7sSMDrT1tGumDgsw5yPG6BBh/X+5ClIQfMH/Yqocxz1PnHx6CHyF6pxmovUTOfZAUvQ0Lvw== + dependencies: + "@octokit/auth-token" "^3.0.0" + "@octokit/graphql" "^5.0.0" + "@octokit/request" "^6.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + +"@octokit/endpoint@^7.0.0": + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== + dependencies: + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" + +"@octokit/graphql@^5.0.0": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== + dependencies: + "@octokit/request" "^6.0.0" + "@octokit/types" "^9.0.0" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^18.0.0": + version "18.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.0.0.tgz#f43d765b3c7533fd6fb88f3f25df079c24fccf69" + integrity sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw== + +"@octokit/request-error@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== + dependencies: + "@octokit/types" "^9.0.0" + deprecation "^2.0.0" + once "^1.4.0" + +"@octokit/request@^6.0.0": + version "6.2.6" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.6.tgz#ff8f503c690f84e3ebd33d2d43e63c0a27ac50e0" + integrity sha512-T/waXf/xjie8Qn5IyFYAcI/HXvw9SPkcQWErGP9H471IWRDRCN+Gn/QOptPMAZRT4lJb2bLHxQfCXjU0mJRyng== + dependencies: + "@octokit/endpoint" "^7.0.0" + "@octokit/request-error" "^3.0.0" + "@octokit/types" "^9.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.7" + universal-user-agent "^6.0.0" + +"@octokit/types@^9.0.0": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== + dependencies: + "@octokit/openapi-types" "^18.0.0" + "@pkgjs/parseargs@^0.11.0": version "0.11.0" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" @@ -2931,9 +3000,9 @@ integrity sha512-LKVP3cgXBT9RYj+t+9FDKwS5tdI+rPBXaNSkma7hvqy35lc7mAokC2zsqWJH0LaqIt3B962nuYI77hsJoT1gow== "@types/debug@^4.0.0": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.8" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.8.tgz#cef723a5d0a90990313faec2d1e22aee5eecb317" + integrity sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ== dependencies: "@types/ms" "*" @@ -3058,6 +3127,11 @@ expect "^29.0.0" pretty-format "^29.0.0" +"@types/js-yaml@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/js-yaml/-/js-yaml-4.0.5.tgz#738dd390a6ecc5442f35e7f03fa1431353f7e138" + integrity sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA== + "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.9": version "7.0.11" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" @@ -3939,6 +4013,11 @@ bcp-47-match@^2.0.0: resolved "https://registry.yarnpkg.com/bcp-47-match/-/bcp-47-match-2.0.3.tgz#603226f6e5d3914a581408be33b28a53144b09d0" integrity sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ== +before-after-hook@^2.2.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" + integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== + better-opn@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/better-opn/-/better-opn-2.1.1.tgz#94a55b4695dc79288f31d7d0e5f658320759f7c6" @@ -4816,6 +4895,11 @@ depd@2.0.0, depd@^2.0.0: resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +deprecation@^2.0.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" + integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== + dequal@^2.0.0, dequal@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.3.tgz#2644214f1997d39ed0ee0ece72335490a7ac67be" @@ -7696,9 +7780,9 @@ mdast-util-definitions@^5.0.0: unist-util-visit "^4.0.0" mdast-util-from-markdown@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz#0214124154f26154a2b3f9d401155509be45e894" - integrity sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g== + version "1.3.1" + resolved "https://registry.yarnpkg.com/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz#9421a5a247f10d31d2faed2a30df5ec89ceafcf0" + integrity sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww== dependencies: "@types/mdast" "^3.0.0" "@types/unist" "^2.0.0" @@ -7733,9 +7817,9 @@ mdast-util-to-string@^1.0.0: integrity sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A== mdast-util-to-string@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz#db859050d79d48cf9896d294de06f3ede7474d16" - integrity sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.2.0.tgz#66f7bb6324756741c5f47a53557f0cbf16b6f789" + integrity sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg== dependencies: "@types/mdast" "^3.0.0" @@ -7795,9 +7879,9 @@ methods@~1.1.2: integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== micromark-core-commonmark@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz#edff4c72e5993d93724a3c206970f5a15b0585ad" - integrity sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz#1386628df59946b2d39fb2edfd10f3e8e0a75bb8" + integrity sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw== dependencies: decode-named-character-reference "^1.0.0" micromark-factory-destination "^1.0.0" @@ -7817,18 +7901,18 @@ micromark-core-commonmark@^1.0.1: uvu "^0.5.0" micromark-factory-destination@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz#fef1cb59ad4997c496f887b6977aa3034a5a277e" - integrity sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz#eb815957d83e6d44479b3df640f010edad667b9f" + integrity sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-label@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz#6be2551fa8d13542fcbbac478258fb7a20047137" - integrity sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz#cc95d5478269085cfa2a7282b3de26eb2e2dec68" + integrity sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" @@ -7836,28 +7920,27 @@ micromark-factory-label@^1.0.0: uvu "^0.5.0" micromark-factory-space@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz#cebff49968f2b9616c0fcb239e96685cb9497633" - integrity sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz#c8f40b0640a0150751d3345ed885a080b0d15faf" + integrity sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ== dependencies: micromark-util-character "^1.0.0" micromark-util-types "^1.0.0" micromark-factory-title@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz#7e09287c3748ff1693930f176e1c4a328382494f" - integrity sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz#dd0fe951d7a0ac71bdc5ee13e5d1465ad7f50ea1" + integrity sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" - uvu "^0.5.0" micromark-factory-whitespace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz#e991e043ad376c1ba52f4e49858ce0794678621c" - integrity sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz#798fb7489f4c8abafa7ca77eed6b5745853c9705" + integrity sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ== dependencies: micromark-factory-space "^1.0.0" micromark-util-character "^1.0.0" @@ -7873,25 +7956,25 @@ micromark-util-character@^1.0.0: micromark-util-types "^1.0.0" micromark-util-chunked@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz#5b40d83f3d53b84c4c6bce30ed4257e9a4c79d06" - integrity sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz#37a24d33333c8c69a74ba12a14651fd9ea8a368b" + integrity sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ== dependencies: micromark-util-symbol "^1.0.0" micromark-util-classify-character@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz#cbd7b447cb79ee6997dd274a46fc4eb806460a20" - integrity sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz#6a7f8c8838e8a120c8e3c4f2ae97a2bff9190e9d" + integrity sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw== dependencies: micromark-util-character "^1.0.0" micromark-util-symbol "^1.0.0" micromark-util-types "^1.0.0" micromark-util-combine-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz#91418e1e74fb893e3628b8d496085639124ff3d5" - integrity sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz#192e2b3d6567660a85f735e54d8ea6e3952dbe84" + integrity sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA== dependencies: micromark-util-chunked "^1.0.0" micromark-util-types "^1.0.0" @@ -7919,25 +8002,34 @@ micromark-util-encode@^1.0.0: integrity sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA== micromark-util-html-tag-name@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz#eb227118befd51f48858e879b7a419fc0df20497" - integrity sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA== + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz#48fd7a25826f29d2f71479d3b4e83e94829b3588" + integrity sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q== micromark-util-normalize-identifier@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz#4a3539cb8db954bbec5203952bfe8cedadae7828" - integrity sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz#7a73f824eb9f10d442b4d7f120fecb9b38ebf8b7" + integrity sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q== dependencies: micromark-util-symbol "^1.0.0" micromark-util-resolve-all@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz#a7c363f49a0162e931960c44f3127ab58f031d88" - integrity sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz#4652a591ee8c8fa06714c9b54cd6c8e693671188" + integrity sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA== dependencies: micromark-util-types "^1.0.0" -micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: +micromark-util-sanitize-uri@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz#613f738e4400c6eedbc53590c67b197e30d7f90d" + integrity sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A== + dependencies: + micromark-util-character "^1.0.0" + micromark-util-encode "^1.0.0" + micromark-util-symbol "^1.0.0" + +micromark-util-sanitize-uri@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz#f12e07a85106b902645e0364feb07cf253a85aee" integrity sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg== @@ -7947,9 +8039,9 @@ micromark-util-sanitize-uri@^1.0.0, micromark-util-sanitize-uri@^1.1.0: micromark-util-symbol "^1.0.0" micromark-util-subtokenize@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz#ff6f1af6ac836f8bfdbf9b02f40431760ad89105" - integrity sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA== + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz#941c74f93a93eaf687b9054aeb94642b0e92edb1" + integrity sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A== dependencies: micromark-util-chunked "^1.0.0" micromark-util-symbol "^1.0.0" @@ -7961,15 +8053,20 @@ micromark-util-symbol@^1.0.0: resolved "https://registry.yarnpkg.com/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz#b90344db62042ce454f351cf0bebcc0a6da4920e" integrity sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ== -micromark-util-types@^1.0.0, micromark-util-types@^1.0.1: +micromark-util-types@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.0.2.tgz#f4220fdb319205812f99c40f8c87a9be83eded20" integrity sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w== +micromark-util-types@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/micromark-util-types/-/micromark-util-types-1.1.0.tgz#e6676a8cae0bb86a2171c498167971886cb7e283" + integrity sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg== + micromark@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.1.0.tgz#eeba0fe0ac1c9aaef675157b52c166f125e89f62" - integrity sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA== + version "3.2.0" + resolved "https://registry.yarnpkg.com/micromark/-/micromark-3.2.0.tgz#1af9fef3f995ea1ea4ac9c7e2f19c48fd5c006e9" + integrity sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA== dependencies: "@types/debug" "^4.0.0" debug "^4.0.0" @@ -9385,10 +9482,10 @@ remark-external-links@^8.0.0: space-separated-tokens "^1.0.0" unist-util-visit "^2.0.0" -remark-parse@^10.0.1: - version "10.0.1" - resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.1.tgz#6f60ae53edbf0cf38ea223fe643db64d112e0775" - integrity sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw== +remark-parse@^10.0.2: + version "10.0.2" + resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-10.0.2.tgz#ca241fde8751c2158933f031a4e3efbaeb8bc262" + integrity sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw== dependencies: "@types/mdast" "^3.0.0" mdast-util-from-markdown "^1.0.0" @@ -10786,6 +10883,11 @@ universal-cookie@^4.0.0: "@types/cookie" "^0.3.3" cookie "^0.4.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"