diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 73c74fa917de3..c920db365822d 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -14,12 +14,14 @@ jobs: validate-docs-links: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - name: "Setup Node" - uses: ./.github/actions/setup-node + - uses: ./.github/actions/setup-node + with: + node-version: 20 - - name: "Run link checker" + - name: Run link checker run: cd docs && pnpm run check-links env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/docs/package.json b/docs/package.json index 87d663c202714..28b7a4811d976 100644 --- a/docs/package.json +++ b/docs/package.json @@ -9,21 +9,17 @@ "check-links": "tsx src/validate-docs-links.ts" }, "devDependencies": { - "@types/github-slugger": "^1.3.0", - "@types/node": "^22.1.0", - "@vercel/ncc": "0.34.0", - "tsx": "^4.7.2", - "typescript": "5.1.6" + "@types/node": "22.7.8", + "tsx": "4.19.1", + "typescript": "5.3.3" }, "dependencies": { - "@actions/core": "^1.10.0", - "@actions/github": "^5.1.1", - "github-slugger": "1.2.0", - "gray-matter": "4.0.2", - "rehype-raw": "4.0.1", - "remark-parse": "7.0.1", - "remark-rehype": "5.0.0", - "unified": "8.4.1", - "unist-util-visit": "2.0.0" + "github-slugger": "2.0.0", + "gray-matter": "4.0.3", + "rehype-raw": "7.0.0", + "remark-parse": "11.0.0", + "remark-rehype": "11.1.1", + "unified": "11.0.5", + "unist-util-visit": "5.0.0" } } diff --git a/docs/repo-docs/guides/tools/typescript.mdx b/docs/repo-docs/guides/tools/typescript.mdx index d0f6257b25763..4a5f8dbae5dc3 100644 --- a/docs/repo-docs/guides/tools/typescript.mdx +++ b/docs/repo-docs/guides/tools/typescript.mdx @@ -292,15 +292,15 @@ In [Compiled packages](https://turbo.build/repo/docs/core-concepts/internal-pack + ```tsx title="./packages/ui/button.tsx" -import { MY_STRING } from "#utils.js" // Uses .js extension // [!code highlight] +import { MY_STRING } from "#utils.js"; // Uses .js extension // [!code highlight] export const Button = () => { - return ( - - ) -} + return ; +}; ``` + diff --git a/docs/src/github.ts b/docs/src/github.ts deleted file mode 100644 index 480281a63018c..0000000000000 --- a/docs/src/github.ts +++ /dev/null @@ -1,126 +0,0 @@ -import * as github from "@actions/github"; -import { setFailed } from "@actions/core"; - -interface Comment { - id: number; -} - -export { setFailed }; -export const COMMENT_TAG = ""; - -const { context, getOctokit } = github; -const octokit = getOctokit(process.env.GITHUB_TOKEN!); -const { owner, repo } = context.repo; -const pullRequest = context.payload.pull_request; -if (!pullRequest) { - console.log("Skipping since this is not a pull request"); - process.exit(0); -} -export const sha = pullRequest.head.sha; -const isFork = pullRequest.head.repo.fork; -const prNumber = pullRequest.number; - -export async function findBotComment(): Promise { - try { - const { data: comments } = await octokit.rest.issues.listComments({ - owner, - repo, - issue_number: prNumber, - }); - - return comments.find((c) => c.body?.includes(COMMENT_TAG)); - } catch (error) { - setFailed("Error finding bot comment: " + error); - return undefined; - } -} - -export async function updateComment( - comment: string, - botComment: Comment -): Promise { - try { - const { data } = await octokit.rest.issues.updateComment({ - owner, - repo, - comment_id: botComment.id, - body: comment, - }); - - return data.html_url; - } catch (error) { - setFailed("Error updating comment: " + error); - return ""; - } -} - -export async function createComment(comment: string): Promise { - if (isFork) { - setFailed( - "The action could not create a GitHub comment because it is initiated from a forked repo. View the action logs for a list of broken links." - ); - - return ""; - } else { - try { - const { data } = await octokit.rest.issues.createComment({ - owner, - repo, - issue_number: prNumber, - body: comment, - }); - - return data.html_url; - } catch (error) { - setFailed("Error creating comment: " + error); - return ""; - } - } -} - -export async function updateCheckStatus( - errorsExist: boolean, - commentUrl?: string -): Promise { - const checkName = "Docs Link Validation"; - - let summary, text; - - if (errorsExist) { - summary = - "This PR introduces broken links to the docs. Click details for a list."; - text = `[See the comment for details](${commentUrl})`; - } else { - summary = "No broken links found"; - } - - const checkParams = { - owner, - repo, - name: checkName, - head_sha: sha, - status: "completed", - conclusion: errorsExist ? "failure" : "success", - output: { - title: checkName, - summary: summary, - text: text, - }, - }; - - if (isFork) { - if (errorsExist) { - setFailed( - "This PR introduces broken links to the docs. The action could not create a GitHub check because it is initiated from a forked repo." - ); - } else { - console.log("Link validation was successful."); - } - } else { - try { - await octokit.rest.checks.create(checkParams); - } catch (error) { - setFailed("Failed to create check: " + error); - } - } -} diff --git a/docs/src/markdown.ts b/docs/src/markdown.ts new file mode 100644 index 0000000000000..13f4043480427 --- /dev/null +++ b/docs/src/markdown.ts @@ -0,0 +1,248 @@ +import fs from "fs/promises"; +import { unified } from "unified"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import rehypeRaw from "rehype-raw"; +import { visit } from "unist-util-visit"; +import GitHubSlugger from "github-slugger"; +import matter from "gray-matter"; + +export interface Document { + /** the Markdown file itself, without from-matter */ + content: string; + + /** the path to this markdown file */ + path: string; + + /** the headings found in this markdown file */ + headings: string[]; + + frontMatter: { + title: string; + description: string; + }; +} + +export type ErrorType = "link" | "hash" | "source" | "related"; + +export type LinkError = { + type: ErrorType; + href: string; + doc: Document; +}; + +/** where to look for docs (.mdx files) */ +const DOCS_PATH = "."; +const EXCLUDED_HASHES = ["top"]; + +/** These paths exist, just not in our Markdown files */ +const EXCLUDED_PATHS = ["/api/remote-cache-spec", "/repo"]; + +const slugger = new GitHubSlugger(); + +/** Collect the paths of all .mdx files we care about */ +const getAllMdxFilePaths = async (): Promise => { + const allFiles = await fs.readdir(DOCS_PATH, { recursive: true }); + return allFiles.filter((file) => file.endsWith(".mdx")); +}; + +// Returns the slugs of all headings in a tree +const getHeadingsFromMarkdownTree = ( + tree: ReturnType +): string[] => { + const headings: string[] = []; + slugger.reset(); + + visit(tree, "heading", (node) => { + let headingText = ""; + // Account for headings with inline code blocks by concatenating the + // text values of all children of a heading node. + visit(node, (innerNode: any) => { + if (innerNode.value) { + headingText += innerNode.value; + } + }); + const slugified = slugger.slug(headingText); + headings.push(slugified); + }); + + return headings; +}; + +/** Create a processor to parse MDX content */ +const markdownProcessor = unified() + .use(remarkParse) + .use(remarkRehype) + .use(rehypeRaw) + .use(function compiler() { + // A compiler is required, and we only need the AST, so we can + // just return it. + // @ts-ignore + this.Compiler = function treeCompiler(tree) { + return tree; + }; + }); + +const filePathToUrl = (filePath: string): string => + filePath + .replace("repo-docs", "/repo/docs") + .replace("pack-docs", "/pack/docs") + .replace(".mdx", ""); + +const validateFrontmatter = (path: string, data: Record) => { + if (!data.title) { + throw new Error(`Document is missing a title: ${path}`); + } + if (!data.description) { + throw new Error(`Document is missing a description: ${path}`); + } + return data as { + title: string; + description: string; + }; +}; + +/** + * Create a map of documents with their paths as keys and + * document content and metadata as values + * The key varies between doc pages and error pages + * error pages: `/docs/messages/example` + * doc pages: `api/example` + */ +const prepareDocumentMapEntry = async ( + path: string +): Promise<[string, Document]> => { + try { + const mdxContent = await fs.readFile(path, "utf8"); + const { content, data } = matter(mdxContent); + const frontMatter = validateFrontmatter(path, data); + + const tree = markdownProcessor.parse(content); + const headings = getHeadingsFromMarkdownTree(tree); + const normalizedUrlPath = filePathToUrl(path); + + return [normalizedUrlPath, { content, path, headings, frontMatter }]; + } catch (error) { + throw new Error(`Error preparing document map for file ${path}: ${error}`); + } +}; + +/** Checks if the links point to existing documents */ +const validateInternalLink = + (documentMap: Map) => (doc: Document, href: string) => { + // /docs/api/example#heading -> ["/docs/api/example", "heading""] + const [link, hash] = href.replace(DOCS_PATH, "").split("#", 2); + + if (EXCLUDED_PATHS.includes(link)) { + return []; + } + + let foundPage = documentMap.get(link); + + if (!foundPage) { + foundPage = documentMap.get(`${link}/index`); + } + + let errors: LinkError[] = []; + + if (!foundPage) { + errors.push({ + type: "link", + href, + doc, + }); + } else if (hash && !EXCLUDED_HASHES.includes(hash)) { + // Check if the hash link points to an existing section within the document + const hashFound = foundPage.headings.includes(hash); + + if (!hashFound) { + errors.push({ + type: "hash", + href, + doc, + }); + } + } + + return errors; + }; + +/** Checks if the hash links point to existing sections within the same document */ +const validateHashLink = (doc: Document, href: string) => { + const hashLink = href.replace("#", ""); + if (EXCLUDED_HASHES.includes(hashLink)) { + return []; + } + + if (doc.headings.includes(hashLink)) { + return []; + } + + let linkError: LinkError = { + type: "hash", + href, + doc, + }; + const { content, ...docWithoutContent } = doc; + return [linkError]; +}; + +/** Traverse the document tree and validate links */ +const traverseTreeAndValidateLinks = ( + documentMap: Map, + tree: unknown, + doc: Document +): LinkError[] => { + let errors: LinkError[] = []; + + try { + visit(tree, (node: any) => { + if (node.type === "element" && node.tagName === "a") { + const href = node.properties.href; + + if (!href) { + return; + } + + if (href.startsWith("/")) { + errors.push(...validateInternalLink(documentMap)(doc, href)); + } else if (href.startsWith("#")) { + errors.push(...validateHashLink(doc, href)); + } + } + }); + } catch (error) { + throw new Error(`Error traversing tree: ${error}`); + } + + return errors; +}; + +/** + * this function will look through all Mdx files and compile a list of `LinkError`s + */ +export const collectLinkErrors = async (): Promise => { + const allMdxFilePaths = await getAllMdxFilePaths(); + + const documentMap = new Map( + await Promise.all(allMdxFilePaths.map(prepareDocumentMapEntry)) + ); + + const reportsWithErrors = allMdxFilePaths.map(async (filePath) => { + const doc = documentMap.get(filePathToUrl(filePath)); + if (!doc) { + return null; + } + const vFile = await markdownProcessor.process(doc.content); + const tree = vFile.result; + const linkErrors = traverseTreeAndValidateLinks(documentMap, tree, doc); + if (linkErrors.length > 0) { + return linkErrors; + } + return null; + }); + + const results = await Promise.all(reportsWithErrors); + const linkErrors = results.filter((report) => report !== null).flat(); + return linkErrors; +}; diff --git a/docs/src/validate-docs-links.ts b/docs/src/validate-docs-links.ts index 788fe32c54961..380dce1bad713 100644 --- a/docs/src/validate-docs-links.ts +++ b/docs/src/validate-docs-links.ts @@ -1,333 +1,46 @@ -import fs from "fs/promises"; -import path from "path"; -import unified from "unified"; -import markdown from "remark-parse"; -import remarkToRehype from "remark-rehype"; -import raw from "rehype-raw"; -import visit from "unist-util-visit"; -import GitHubSlugger from "github-slugger"; -import matter from "gray-matter"; -import { - COMMENT_TAG, - createComment, - findBotComment, - updateCheckStatus, - updateComment, - setFailed, - sha, -} from "./github"; - -/** - * This script validates internal links in /docs and /errors including internal, - * hash, source and related links. It does not validate external links. - * 1. Collects all .mdx files in /docs. - * 2. For each file, it extracts the content, metadata, and heading slugs. - * 3. It creates a document map to efficiently lookup documents by path. - * 4. It then traverses each document modified in the PR and... - * - Checks if each internal link (links starting with "/docs/") points - * to an existing document - * - Validates hash links (links starting with "#") against the list of - * headings in the current document. - * - Checks the source and related links found in the metadata of each - * document. - * 5. Any broken links discovered during these checks are categorized and a - * comment is added to the PR. - */ - -interface Document { - body: string; - path: string; - headings: string[]; - source?: string; - related?: { - links: string[]; - }; -} - -interface Errors { - doc: Document; - link: string[]; - hash: string[]; - source: string[]; - related: string[]; -} - -type ErrorType = Exclude; - -const DOCS_PATH = "."; -const EXCLUDED_HASHES = ["top"]; - -const slugger = new GitHubSlugger(); - -// Collect the paths of all .mdx files in the passed directories -async function getAllMdxFilePaths( - directoriesToScan: string[], - fileList: string[] = [] -): Promise { - for (const dir of directoriesToScan) { - const dirPath = path.join(".", dir); - const files = await fs.readdir(dirPath); - for (const file of files) { - const filePath = path.join(dirPath, file); - const stats = await fs.stat(filePath); - if (stats.isDirectory()) { - fileList = await getAllMdxFilePaths([filePath], fileList); - } else if (path.extname(file) === ".mdx") { - fileList.push(filePath); - } - } - } - - return fileList; -} - -// Returns the slugs of all headings in a tree -function getHeadingsFromMarkdownTree( - tree: ReturnType -): string[] { - const headings: string[] = []; - slugger.reset(); - - visit(tree, "heading", (node) => { - let headingText = ""; - // Account for headings with inline code blocks by concatenating the - // text values of all children of a heading node. - visit(node, (innerNode: any) => { - if (innerNode.value) { - headingText += innerNode.value; - } - }); - headings.push(slugger.slug(headingText)); - }); - - return headings; -} - -// Create a processor to parse MDX content -const markdownProcessor = unified() - .use(markdown) - .use(remarkToRehype, { allowDangerousHTML: true }) - .use(raw) - .use(function compiler() { - // A compiler is required, and we only need the AST, so we can - // just return it. - // @ts-ignore - this.Compiler = function treeCompiler(tree) { - return tree; - }; - }); - -function normalizePath(filePath: string): string { - const normalized = filePath - .replace("repo-docs", "/repo/docs") - .replace("pack-docs", "/pack/docs") - .replace(".mdx", ""); - - return normalized; -} - -// use Map for faster lookup -let documentMap: Map; - -// Create a map of documents with their paths as keys and -// document content and metadata as values -// The key varies between doc pages and error pages -// error pages: `/docs/messages/example` -// doc pages: `api/example` -async function prepareDocumentMapEntry( - filePath: string -): Promise<[string, Document]> { - try { - const mdxContent = await fs.readFile(filePath, "utf8"); - const { content, data } = matter(mdxContent); - const tree = markdownProcessor.parse(content); - const headings = getHeadingsFromMarkdownTree(tree); - const normalizedUrlPath = normalizePath(filePath); - - return [ - normalizedUrlPath, - { body: content, path: filePath, headings, ...data }, - ]; - } catch (error) { - setFailed(`Error preparing document map for file ${filePath}: ${error}`); - return ["", {} as Document]; - } -} - -// Checks if the links point to existing documents -function validateInternalLink(errors: Errors, href: string): void { - // /docs/api/example#heading -> ["api/example", "heading""] - const [link, hash] = href.replace(DOCS_PATH, "").split("#", 2); - - // These paths exist, just not in our Markdown files - const ignorePaths = ["/api/remote-cache-spec", "/repo"]; - if (ignorePaths.includes(link)) { +import { collectLinkErrors } from "./markdown"; + +/* + This script validates internal links in /docs and /errors including internal, + hash, source and related links. It does not validate external links. + 1. Collects all .mdx files in /docs. + 2. For each file, it extracts the content, metadata, and heading slugs. + 3. It creates a document map to efficiently lookup documents by path. + 4. It then traverses each document modified in the PR and... + - Checks if each internal link (links starting with "/docs/") points + to an existing document + - Validates hash links (links starting with "#") against the list of + headings in the current document. + - Checks the source and related links found in the metadata of each + document. + 5. Any broken links discovered during these checks are categorized and a + comment is added to the PR. +*/ + +/** Main function that triggers link validation across .mdx files */ +const validateAllInternalLinks = async (): Promise => { + let errorReports = await collectLinkErrors(); + if (errorReports.length === 0) { + console.log("Link validation was successful."); return; } - let foundPage = documentMap.get(link); - - if (!foundPage) { - foundPage = documentMap.get(`${link}/index`); - } - - if (!foundPage) { - errors.link.push(href); - } else if (hash && !EXCLUDED_HASHES.includes(hash)) { - // Check if the hash link points to an existing section within the document - const hashFound = foundPage.headings.includes(hash); - - if (!hashFound) { - errors.hash.push(href); - } - } -} - -// Checks if the hash links point to existing sections within the same document -function validateHashLink(errors: Errors, href: string, doc: Document): void { - const hashLink = href.replace("#", ""); - - if (!EXCLUDED_HASHES.includes(hashLink) && !doc.headings.includes(hashLink)) { - errors.hash.push(href); - } -} - -// Traverse the document tree and validate links -function traverseTreeAndValidateLinks(tree: any, doc: Document): Errors { - const errors: Errors = { - doc, - link: [], - hash: [], - source: [], - related: [], - }; - - try { - visit(tree, (node: any) => { - if (node.type === "element" && node.tagName === "a") { - const href = node.properties.href; - - if (!href) return; - - if (href.startsWith("/")) { - validateInternalLink(errors, href); - } else if (href.startsWith("#")) { - validateHashLink(errors, href, doc); - } - } - }); - } catch (error) { - setFailed("Error traversing tree: " + error); - } - - return errors; -} - -const formatTableRow = ( - link: string, - errorType: ErrorType, - rawDocPath: string -) => { - const docPath = rawDocPath.replace("../../../", ""); - - return `| ${link} | ${errorType} | [/${docPath}](https://github.com/vercel/turborepo/blob/${sha}/${docPath}) | \n`; + const reportRows = errorReports + .map((linkError) => ({ + link: linkError.href, + type: linkError.type, + path: linkError.doc.path, + })) + .sort((a, b) => a.type.localeCompare(b.type)); + + const plural = errorReports.length > 1; + console.log( + `Found ${plural ? "these" : "a"} broken link${ + plural ? "s" : "" + } in the docs:` + ); + console.table(reportRows); + process.exit(1); }; -// Main function that triggers link validation across .mdx files -async function validateAllInternalLinks(): Promise { - try { - const allMdxFilePaths = await getAllMdxFilePaths([DOCS_PATH]); - - documentMap = new Map( - await Promise.all(allMdxFilePaths.map(prepareDocumentMapEntry)) - ); - - const docProcessingPromises = allMdxFilePaths.map(async (filePath) => { - const doc = documentMap.get(normalizePath(filePath)); - if (doc) { - const tree = (await markdownProcessor.process(doc.body)).contents; - return traverseTreeAndValidateLinks(tree, doc); - } else { - return { - doc: {} as Document, - link: [], - hash: [], - source: [], - related: [], - } as Errors; - } - }); - - const allErrors = await Promise.all(docProcessingPromises); - - let errorsExist = false; - - let errorRows: string[] = []; - - const errorTypes: ErrorType[] = ["link", "hash", "source", "related"]; - allErrors.forEach((errors) => { - const { - doc: { path: docPath }, - } = errors; - - errorTypes.forEach((errorType) => { - if (errors[errorType].length > 0) { - errorsExist = true; - errors[errorType].forEach((link) => { - errorRows.push(formatTableRow(link, errorType, docPath)); - }); - } - }); - }); - - const errorComment = [ - "Hi there :wave:\n\nIt looks like this PR introduces broken links to the docs, please take a moment to fix them before merging:\n\n| Broken link | Type | File | \n| ----------- | ----------- | ----------- | \n", - ...errorRows, - "\nThank you :pray:", - ].join(""); - - let commentUrl; - let botComment; - let comment; - - botComment = await findBotComment(); - - if (errorsExist) { - comment = `${COMMENT_TAG}\n${errorComment}`; - if (botComment) { - commentUrl = await updateComment(comment, botComment); - } else { - commentUrl = await createComment(comment); - } - - const errorTableData = allErrors.flatMap((errors) => { - const { doc } = errors; - - return errorTypes.flatMap((errorType) => - errors[errorType].map((link) => ({ - docPath: doc.path, - errorType, - link, - })) - ); - }); - - console.log("This PR introduces broken links to the docs:"); - console.table(errorTableData, ["link", "type", "docPath"]); - process.exit(1); - } else if (botComment) { - const comment = `${COMMENT_TAG}\nAll broken links are now fixed, thank you!`; - commentUrl = await updateComment(comment, botComment); - } - - try { - await updateCheckStatus(errorsExist, commentUrl); - } catch (error) { - setFailed("Failed to create GitHub check: " + error); - } - } catch (error) { - setFailed("Error validating internal links: " + error); - } -} - validateAllInternalLinks(); diff --git a/docs/types.d.ts b/docs/types.d.ts deleted file mode 100644 index 0d78462e62f01..0000000000000 --- a/docs/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module "remark-rehype"; -declare module "rehype-raw"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 87d0714c5a9bb..ea2b5fcefa3b8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -53,49 +53,37 @@ importers: docs: dependencies: - '@actions/core': - specifier: ^1.10.0 - version: 1.10.1 - '@actions/github': - specifier: ^5.1.1 - version: 5.1.1 github-slugger: - specifier: 1.2.0 - version: 1.2.0 + specifier: 2.0.0 + version: 2.0.0 gray-matter: - specifier: 4.0.2 - version: 4.0.2 + specifier: 4.0.3 + version: 4.0.3 rehype-raw: - specifier: 4.0.1 - version: 4.0.1 + specifier: 7.0.0 + version: 7.0.0 remark-parse: - specifier: 7.0.1 - version: 7.0.1 + specifier: 11.0.0 + version: 11.0.0 remark-rehype: - specifier: 5.0.0 - version: 5.0.0 + specifier: 11.1.1 + version: 11.1.1 unified: - specifier: 8.4.1 - version: 8.4.1 + specifier: 11.0.5 + version: 11.0.5 unist-util-visit: - specifier: 2.0.0 - version: 2.0.0 + specifier: 5.0.0 + version: 5.0.0 devDependencies: - '@types/github-slugger': - specifier: ^1.3.0 - version: 1.3.0 '@types/node': - specifier: ^22.1.0 - version: 22.1.0 - '@vercel/ncc': - specifier: 0.34.0 - version: 0.34.0 + specifier: 22.7.8 + version: 22.7.8 tsx: - specifier: ^4.7.2 - version: 4.7.2 + specifier: 4.19.1 + version: 4.19.1 typescript: - specifier: 5.1.6 - version: 5.1.6 + specifier: 5.3.3 + version: 5.3.3 examples: {} @@ -1017,7 +1005,7 @@ packages: /@actions/core@1.10.1: resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==} dependencies: - '@actions/http-client': 2.2.0 + '@actions/http-client': 2.1.1 uuid: 8.3.2 dev: false @@ -1044,6 +1032,12 @@ packages: tunnel: 0.0.6 dev: false + /@actions/http-client@2.1.1: + resolution: {integrity: sha512-qhrkRMB40bbbLo7gF+0vu+X+UawOvQQqNAA/5Unx774RS8poaOhThDOG6BGmxvAnxhQnDp2BG/ZUm65xZILTpw==} + dependencies: + tunnel: 0.0.6 + dev: false + /@actions/http-client@2.2.0: resolution: {integrity: sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==} dependencies: @@ -2886,6 +2880,12 @@ packages: '@types/node': 20.11.30 '@types/responselike': 1.0.0 + /@types/debug@4.1.12: + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + dependencies: + '@types/ms': 0.7.34 + dev: false + /@types/diff@5.0.2: resolution: {integrity: sha512-uw8eYMIReOwstQ0QKF0sICefSy8cNO/v7gOTiIy9SbwuHyEecJUm7qlgueOO5S1udZ5I/irVydHVwMchgzbKTg==} dev: true @@ -2927,10 +2927,6 @@ packages: resolution: {integrity: sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==} dev: false - /@types/github-slugger@1.3.0: - resolution: {integrity: sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==} - dev: true - /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: @@ -2949,6 +2945,12 @@ packages: '@types/tinycolor2': 1.4.3 dev: true + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/http-cache-semantics@4.0.1: resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} @@ -3027,9 +3029,19 @@ packages: '@types/node': 20.11.30 dev: true + /@types/mdast@4.0.4: + resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + dependencies: + '@types/unist': 3.0.3 + dev: false + /@types/minimatch@5.1.1: resolution: {integrity: sha512-v55NF6Dz0wrj14Rn8iEABTWrhYRmgkJYuokduunSiq++t3hZ9VZ6dvcDt+850Pm5sGJZk8RaHzkFCXPxVINZ+g==} + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: false + /@types/ndjson@2.0.2: resolution: {integrity: sha512-bvLIjknQTfXdWoJ2iljOpZXNB14d8VOH6NMXAlDle9T8jdpMsKqQs4M5+F7NnlU8WMPErtuGnJsLfERO8W9Oow==} dependencies: @@ -3066,10 +3078,10 @@ packages: resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} dev: true - /@types/node@22.1.0: - resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} + /@types/node@22.7.8: + resolution: {integrity: sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==} dependencies: - undici-types: 6.13.0 + undici-types: 6.19.8 dev: true /@types/normalize-package-data@2.4.1: @@ -3139,8 +3151,8 @@ packages: /@types/tinycolor2@1.4.3: resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} - /@types/unist@2.0.10: - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + /@types/unist@3.0.3: + resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} dev: false /@types/uuid@9.0.0: @@ -3361,7 +3373,6 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true /@vercel/blob@0.22.1: resolution: {integrity: sha512-LtHmiYAdJhiSAfBP+5hHXtVyqZUND2G+ild/XVY0SOiB46ab7VUrQctwUMGcVx+yZyXZ2lXPT1HvRJtXFnKvHA==} @@ -3373,11 +3384,6 @@ packages: undici: 5.28.3 dev: false - /@vercel/ncc@0.34.0: - resolution: {integrity: sha512-G9h5ZLBJ/V57Ou9vz5hI8pda/YQX5HQszCs3AmIus3XzsmRn/0Ptic5otD3xVST8QLKk7AMk7AqpsyQGN7MZ9A==} - hasBin: true - dev: true - /@vercel/ncc@0.36.0: resolution: {integrity: sha512-/ZTUJ/ZkRt694k7KJNimgmHjtQcRuVwsST2Z6XfYveQIuBbHR+EqkTc1jfgPkQmMyk/vtpxo3nVxe8CNuau86A==} hasBin: true @@ -3839,8 +3845,8 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.6) dev: true - /bail@1.0.5: - resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==} + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} dev: false /balanced-match@1.0.2: @@ -4109,10 +4115,6 @@ packages: upper-case-first: 2.0.2 dev: true - /ccount@1.1.0: - resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==} - dev: false - /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -4185,16 +4187,8 @@ packages: engines: {node: '>=10'} dev: true - /character-entities-legacy@1.1.4: - resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} - dev: false - - /character-entities@1.2.4: - resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} - dev: false - - /character-reference-invalid@1.1.4: - resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} dev: false /chardet@0.7.0: @@ -4315,10 +4309,6 @@ packages: engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} dev: true - /collapse-white-space@1.0.6: - resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} - dev: false - /collect-v8-coverage@1.0.1: resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} dev: true @@ -4373,8 +4363,8 @@ packages: dependencies: delayed-stream: 1.0.0 - /comma-separated-tokens@1.0.8: - resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==} + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} dev: false /commander@10.0.0: @@ -4694,6 +4684,12 @@ packages: resolution: {integrity: sha512-Nv6ENEzyPQ6AItkGwLE2PGKinZZ9g59vSh2BeH6NqPu0OTKZ5ruJsVqh/orbAnqXc9pBbgXAIrc2EyaCj8NpGg==} dev: true + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + dev: false + /decode-uri-component@0.2.2: resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} engines: {node: '>=0.10'} @@ -4848,13 +4844,6 @@ packages: /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - dev: true - - /detab@2.0.4: - resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==} - dependencies: - repeat-string: 1.6.1 - dev: false /detect-file@1.0.0: resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} @@ -4881,6 +4870,12 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + dev: false + /diff-sequences@27.5.1: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -4956,10 +4951,6 @@ packages: engines: {node: '>=10'} dev: true - /emoji-regex@6.1.1: - resolution: {integrity: sha512-WfVwM9e+M9B/4Qjh9SRnPX2A74Tom3WlVfWF9QWJ8f2BPa1u+/q4aEp1tizZ3vBKAZTg7B6yxn3t9iMjT+dv4w==} - dev: false - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4980,6 +4971,11 @@ packages: tapable: 2.2.1 dev: true + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + /error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -6554,10 +6550,8 @@ packages: resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} dev: true - /github-slugger@1.2.0: - resolution: {integrity: sha512-wIaa75k1vZhyPm9yWrD08A5Xnx/V+RmzGrpjQuLemGKSb77Qukiaei58Bogrl/LZSADDfPzKJX8jhLs4CRTl7Q==} - dependencies: - emoji-regex: 6.1.1 + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} dev: false /glob-parent@5.1.2: @@ -6728,8 +6722,8 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - /gray-matter@4.0.2: - resolution: {integrity: sha512-7hB/+LxrOjq/dd8APlK0r24uL/67w7SkYnfwhNFwg/VDIGWGmduTDYf3WNstLW2fbbmRwrDGCVSJ2isuf2+4Hw==} + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} dependencies: js-yaml: 3.14.1 @@ -6822,61 +6816,63 @@ packages: dependencies: function-bind: 1.1.1 - /hast-to-hyperscript@7.0.4: - resolution: {integrity: sha512-vmwriQ2H0RPS9ho4Kkbf3n3lY436QKLq6VaGA1pzBh36hBi3tm1DO9bR+kaJIbpT10UqaANDkMjxvjVfr+cnOA==} + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} dependencies: - comma-separated-tokens: 1.0.8 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 - style-to-object: 0.2.3 - unist-util-is: 3.0.0 - web-namespaces: 1.1.4 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.5.0 + vfile: 6.0.3 + vfile-location: 5.0.3 + web-namespaces: 2.0.1 dev: false - /hast-util-from-parse5@5.0.3: - resolution: {integrity: sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==} + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} dependencies: - ccount: 1.1.0 - hastscript: 5.1.2 - property-information: 5.6.0 - web-namespaces: 1.1.4 - xtend: 4.0.2 - dev: false - - /hast-util-parse-selector@2.2.5: - resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==} + '@types/hast': 3.0.4 dev: false - /hast-util-raw@5.0.2: - resolution: {integrity: sha512-3ReYQcIHmzSgMq8UrDZHFL0oGlbuVGdLKs8s/Fe8BfHFAyZDrdv1fy/AGn+Fim8ZuvAHcJ61NQhVMtyfHviT/g==} + /hast-util-raw@9.0.4: + resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} dependencies: - hast-util-from-parse5: 5.0.3 - hast-util-to-parse5: 5.1.2 - html-void-elements: 1.0.5 - parse5: 5.1.1 - unist-util-position: 3.1.0 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + parse5: 7.2.0 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 + web-namespaces: 2.0.1 + zwitch: 2.0.4 dev: false - /hast-util-to-parse5@5.1.2: - resolution: {integrity: sha512-ZgYLJu9lYknMfsBY0rBV4TJn2xiwF1fXFFjbP6EE7S0s5mS8LIKBVWzhA1MeIs1SWW6GnnE4In6c3kPb+CWhog==} + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} dependencies: - hast-to-hyperscript: 7.0.4 - property-information: 5.6.0 - web-namespaces: 1.1.4 - xtend: 4.0.2 - zwitch: 1.0.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 dev: false - /hastscript@5.1.2: - resolution: {integrity: sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==} + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} dependencies: - comma-separated-tokens: 1.0.8 - hast-util-parse-selector: 2.2.5 - property-information: 5.6.0 - space-separated-tokens: 1.1.5 + '@types/hast': 3.0.4 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 dev: false /header-case@1.0.1: @@ -6915,8 +6911,8 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /html-void-elements@1.0.5: - resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==} + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} dev: false /http-cache-semantics@4.1.1: @@ -7060,10 +7056,6 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - /inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - dev: false - /inquirer-file-tree-selection-prompt@1.0.19: resolution: {integrity: sha512-aL01njANm5bJhQtUNBKWurniroUJ9I+rnJ20DBG3xY9gtKBxgpRFSRs0lzjx42iCRJ4J083IZ2SrN4t8ejPlEQ==} dependencies: @@ -7178,17 +7170,6 @@ packages: kind-of: 6.0.3 dev: false - /is-alphabetical@1.0.4: - resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} - dev: false - - /is-alphanumerical@1.0.4: - resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} - dependencies: - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - dev: false - /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -7288,10 +7269,6 @@ packages: has-tostringtag: 1.0.0 dev: true - /is-decimal@1.0.4: - resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} - dev: false - /is-descriptor@0.1.6: resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==} engines: {node: '>=0.10.0'} @@ -7380,10 +7357,6 @@ packages: dependencies: is-extglob: 2.1.1 - /is-hexadecimal@1.0.4: - resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} - dev: false - /is-inside-container@1.0.0: resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} engines: {node: '>=14.16'} @@ -7447,15 +7420,9 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - /is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - dev: false - /is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} - dev: true /is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} @@ -7575,18 +7542,10 @@ packages: get-intrinsic: 1.2.1 dev: true - /is-whitespace-character@1.0.4: - resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==} - dev: false - /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} - /is-word-character@1.0.4: - resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==} - dev: false - /is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -8570,10 +8529,6 @@ packages: object-visit: 1.0.1 dev: false - /markdown-escapes@1.0.4: - resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} - dev: false - /maxstache-stream@1.0.4: resolution: {integrity: sha512-v8qlfPN0pSp7bdSoLo1NTjG43GXGqk5W2NWFnOCq2GlmFFqebGzPCjLKSbShuqIOVorOtZSAy7O/S1OCCRONUw==} dependencies: @@ -8587,30 +8542,43 @@ packages: resolution: {integrity: sha512-53ZBxHrZM+W//5AcRVewiLpDunHnucfdzZUGz54Fnvo4tE+J3p8EL66kBrs2UhBXvYKTWckWYYWBqJqoTcenqg==} dev: false - /mdast-util-definitions@1.2.5: - resolution: {integrity: sha512-CJXEdoLfiISCDc2JB6QLb79pYfI6+GcIH+W2ox9nMc7od0Pz+bovcHsiq29xAQY6ayqe/9CsK2VzkSJdg1pFYA==} - dependencies: - unist-util-visit: 1.4.1 + /mdast-util-from-markdown@2.0.1: + resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} + dependencies: + '@types/mdast': 4.0.4 + '@types/unist': 3.0.3 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color dev: false - /mdast-util-to-hast@6.0.2: - resolution: {integrity: sha512-GjcOimC9qHI0yNFAQdBesrZXzUkRdFleQlcoU8+TVNfDW6oLUazUx8MgUoTaUyCJzBOnE5AOgqhpURrSlf0QwQ==} + /mdast-util-to-hast@13.2.0: + resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} dependencies: - collapse-white-space: 1.0.6 - detab: 2.0.4 - mdast-util-definitions: 1.2.5 - mdurl: 1.0.1 - trim: 0.0.1 - trim-lines: 1.1.3 - unist-builder: 1.0.4 - unist-util-generated: 1.1.6 - unist-util-position: 3.1.0 - unist-util-visit: 1.4.1 - xtend: 4.0.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.3 dev: false - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.4 dev: false /merge-stream@2.0.0: @@ -8620,6 +8588,181 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} + /micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + dev: false + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + dev: false + + /micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + dev: false + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + dev: false + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + /micromatch@3.1.10: resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==} engines: {node: '>=0.10.0'} @@ -9274,17 +9417,6 @@ packages: dependencies: callsites: 3.1.0 - /parse-entities@1.2.2: - resolution: {integrity: sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==} - dependencies: - character-entities: 1.2.4 - character-entities-legacy: 1.1.4 - character-reference-invalid: 1.1.4 - is-alphanumerical: 1.0.4 - is-decimal: 1.0.4 - is-hexadecimal: 1.0.4 - dev: false - /parse-filepath@1.0.2: resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} engines: {node: '>=0.8'} @@ -9309,14 +9441,16 @@ packages: engines: {node: '>=0.10.0'} dev: true - /parse5@5.1.1: - resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: false - /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} dev: true + /parse5@7.2.0: + resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} + dependencies: + entities: 4.5.0 + dev: false + /pascal-case@2.0.1: resolution: {integrity: sha512-qjS4s8rBOJa2Xm0jmxXiyh1+OFf6ekCWOvUaRgAQSktzlTbMotS0nmG9gyYAybCWBcuP4fsBeRCKNwGBnMe2OQ==} dependencies: @@ -9527,10 +9661,8 @@ packages: react-is: 16.13.1 dev: true - /property-information@5.6.0: - resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==} - dependencies: - xtend: 4.0.2 + /property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} dev: false /proxy-agent@6.2.2: @@ -9750,36 +9882,33 @@ packages: jsesc: 0.5.0 dev: true - /rehype-raw@4.0.1: - resolution: {integrity: sha512-g74dPCUWeB9EBfTfGF3lGOHSnZwFwN1ssc3Je9OwQO9f8yTkkAIrMqUVxT34h8zpi4ICU051tTLBZbOrzRWpxg==} + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} dependencies: - hast-util-raw: 5.0.2 + '@types/hast': 3.0.4 + hast-util-raw: 9.0.4 + vfile: 6.0.3 dev: false - /remark-parse@7.0.1: - resolution: {integrity: sha512-WOZLa545jYXtSy+txza6ACudKWByQac4S2DmGk+tAGO/3XnVTOxwyCIxB7nTcLlk8Aayhcuf3cV1WV6U6L7/DQ==} + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} dependencies: - collapse-white-space: 1.0.6 - is-alphabetical: 1.0.4 - is-decimal: 1.0.4 - is-whitespace-character: 1.0.4 - is-word-character: 1.0.4 - markdown-escapes: 1.0.4 - parse-entities: 1.2.2 - repeat-string: 1.6.1 - state-toggle: 1.0.3 - trim: 0.0.1 - trim-trailing-lines: 1.1.4 - unherit: 1.1.3 - unist-util-remove-position: 1.1.4 - vfile-location: 2.0.6 - xtend: 4.0.2 + '@types/mdast': 4.0.4 + mdast-util-from-markdown: 2.0.1 + micromark-util-types: 2.0.0 + unified: 11.0.5 + transitivePeerDependencies: + - supports-color dev: false - /remark-rehype@5.0.0: - resolution: {integrity: sha512-tgo+AeOotuh9FnGMkEPbE6C3OfdARqqSxT0H/KNGAiTwJLiDoRSm6x/ytqPZTyYSiQ/exbi/kx7k6uUvqYL1wQ==} + /remark-rehype@11.1.1: + resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} dependencies: - mdast-util-to-hast: 6.0.2 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.4 + mdast-util-to-hast: 13.2.0 + unified: 11.0.5 + vfile: 6.0.3 dev: false /repeat-element@1.1.4: @@ -10322,8 +10451,8 @@ packages: whatwg-url: 7.1.0 dev: true - /space-separated-tokens@1.1.5: - resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==} + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} dev: false /spdx-correct@3.1.1: @@ -10377,10 +10506,6 @@ packages: escape-string-regexp: 2.0.0 dev: true - /state-toggle@1.0.3: - resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} - dev: false - /static-extend@0.1.2: resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==} engines: {node: '>=0.10.0'} @@ -10526,12 +10651,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - /style-to-object@0.2.3: - resolution: {integrity: sha512-1d/k4EY2N7jVLOqf2j04dTc37TPOv/hHxZmvpg8Pdh8UYydxeu/C1W1U4vD8alzf5V2Gt7rLsmkr4dxAlDm9ng==} - dependencies: - inline-style-parser: 0.1.1 - dev: false - /sucrase@3.24.0: resolution: {integrity: sha512-SevqflhW356TKEyWjFHg2e5f3eH+5rzmsMJxrVMDvZIEHh/goYrpzDGA6APEj4ME9MdGm8oNgIzi1eF3c3dDQA==} engines: {node: '>=8'} @@ -10777,21 +10896,12 @@ packages: hasBin: true dev: true - /trim-lines@1.1.3: - resolution: {integrity: sha512-E0ZosSWYK2mkSu+KEtQ9/KqarVjA9HztOSX+9FDdNacRAq29RRV6ZQNgob3iuW8Htar9vAfEa6yyt5qBAHZDBA==} - dev: false - - /trim-trailing-lines@1.1.4: - resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==} + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} dev: false - /trim@0.0.1: - resolution: {integrity: sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==} - deprecated: Use String.prototype.trim() instead - dev: false - - /trough@1.0.5: - resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==} + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} dev: false /ts-api-utils@1.0.2(typescript@5.3.3): @@ -10927,7 +11037,7 @@ packages: normalize-path: 3.0.0 safe-stable-stringify: 2.4.3 tslib: 2.6.3 - typescript: 5.5.4 + typescript: 5.6.3 dev: true /ts-node@10.9.1(@types/node@18.17.4)(typescript@5.3.3): @@ -11107,6 +11217,17 @@ packages: fsevents: 2.3.3 dev: true + /tsx@4.19.1: + resolution: {integrity: sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.23.1 + get-tsconfig: 4.7.6 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tsx@4.7.2: resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} engines: {node: '>=18.0.0'} @@ -11202,12 +11323,6 @@ packages: is-typedarray: 1.0.0 dev: true - /typescript@5.1.6: - resolution: {integrity: sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /typescript@5.2.2: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} @@ -11219,8 +11334,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - /typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + /typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -11249,8 +11364,8 @@ packages: /undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - /undici-types@6.13.0: - resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} + /undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} dev: true /undici@5.28.3: @@ -11260,22 +11375,16 @@ packages: '@fastify/busboy': 2.1.0 dev: false - /unherit@1.1.3: - resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==} - dependencies: - inherits: 2.0.4 - xtend: 4.0.2 - dev: false - - /unified@8.4.1: - resolution: {integrity: sha512-YPj/uIIZSO7mMIZQj/5Z3hDl4lshWYRQGs5TgUCjHTVdklUWH+O94mK5Cy77SEcmEUwGhnUcudMuH/zIwporqw==} + /unified@11.0.5: + resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} dependencies: - '@types/unist': 2.0.10 - bail: 1.0.5 + '@types/unist': 3.0.3 + bail: 2.0.2 + devlop: 1.1.0 extend: 3.0.2 - is-plain-obj: 2.1.0 - trough: 1.0.5 - vfile: 4.2.1 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.3 dev: false /union-value@1.0.1: @@ -11288,65 +11397,37 @@ packages: set-value: 2.0.1 dev: false - /unist-builder@1.0.4: - resolution: {integrity: sha512-v6xbUPP7ILrT15fHGrNyHc1Xda8H3xVhP7/HAIotHOhVPjH5dCXA097C3Rry1Q2O+HbOLCao4hfPB+EYEjHgVg==} + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} dependencies: - object-assign: 4.1.1 + '@types/unist': 3.0.3 dev: false - /unist-util-generated@1.1.6: - resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==} - dev: false - - /unist-util-is@3.0.0: - resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} - dev: false - - /unist-util-is@4.1.0: - resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==} - dev: false - - /unist-util-position@3.1.0: - resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==} - dev: false - - /unist-util-remove-position@1.1.4: - resolution: {integrity: sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==} + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} dependencies: - unist-util-visit: 1.4.1 + '@types/unist': 3.0.3 dev: false - /unist-util-stringify-position@2.0.3: - resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} dependencies: - '@types/unist': 2.0.10 + '@types/unist': 3.0.3 dev: false - /unist-util-visit-parents@2.1.2: - resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} dependencies: - unist-util-is: 3.0.0 + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 dev: false - /unist-util-visit-parents@3.1.1: - resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==} + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - dev: false - - /unist-util-visit@1.4.1: - resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} - dependencies: - unist-util-visit-parents: 2.1.2 - dev: false - - /unist-util-visit@2.0.0: - resolution: {integrity: sha512-kiTpWKsF54u/78L/UU/i7lxrnqGiEWBgqCpaIZBYP0gwUC+Akq0Ajm4U8JiNIoQNfAioBdsyarnOcTEAb9mLeQ==} - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 4.1.0 - unist-util-visit-parents: 3.1.1 + '@types/unist': 3.0.3 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 dev: false /universal-user-agent@6.0.0: @@ -11804,24 +11885,25 @@ packages: - encoding dev: false - /vfile-location@2.0.6: - resolution: {integrity: sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==} + /vfile-location@5.0.3: + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} + dependencies: + '@types/unist': 3.0.3 + vfile: 6.0.3 dev: false - /vfile-message@2.0.4: - resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==} + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 2.0.3 + '@types/unist': 3.0.3 + unist-util-stringify-position: 4.0.0 dev: false - /vfile@4.2.1: - resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==} + /vfile@6.0.3: + resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 2.0.3 - vfile-message: 2.0.4 + '@types/unist': 3.0.3 + vfile-message: 4.0.2 dev: false /vm2@3.9.19: @@ -11884,8 +11966,8 @@ packages: dependencies: defaults: 1.0.4 - /web-namespaces@1.1.4: - resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==} + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} dev: false /webidl-conversions@3.0.1: @@ -12128,6 +12210,6 @@ packages: resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} dev: false - /zwitch@1.0.5: - resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false