From 915fc33dd74c9bfac6a6038dff7ebe292158b1d0 Mon Sep 17 00:00:00 2001 From: TomPenguin <tom.penguin.zoo@gmail.com> Date: Wed, 30 Aug 2023 19:30:09 +0900 Subject: [PATCH] Add NotionReader --- packages/core/package.json | 2 + packages/core/src/readers/NotionReader.ts | 271 +++++++++++++++ pnpm-lock.yaml | 386 ++++++++-------------- 3 files changed, 408 insertions(+), 251 deletions(-) create mode 100644 packages/core/src/readers/NotionReader.ts diff --git a/packages/core/package.json b/packages/core/package.json index 4b641c355..6005f163b 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -3,7 +3,9 @@ "version": "0.0.25", "dependencies": { "@anthropic-ai/sdk": "^0.6.2", + "@notionhq/client": "^2.2.12", "lodash": "^4.17.21", + "md-utils-ts": "^1.0.4", "openai": "^4.3.1", "papaparse": "^5.4.1", "pdf-parse": "^1.1.1", diff --git a/packages/core/src/readers/NotionReader.ts b/packages/core/src/readers/NotionReader.ts new file mode 100644 index 000000000..62c7e0141 --- /dev/null +++ b/packages/core/src/readers/NotionReader.ts @@ -0,0 +1,271 @@ +import { Client, collectPaginatedAPI } from "@notionhq/client"; +import md from "md-utils-ts"; +import { Document } from "../Node"; +import { BaseReader } from "./base"; + +type NotionClient = InstanceType<typeof Client>; + +// Notion Page +type NotionPageRetrieveMethod = NotionClient["pages"]["retrieve"]; +type NotionPartialPageObjectResponse = Awaited< + ReturnType<NotionPageRetrieveMethod> +>; + +// Notion Block +type NotionBlockListMethod = NotionClient["blocks"]["children"]["list"]; +type NotionBlockListResponse = Awaited<ReturnType<NotionBlockListMethod>>; +type NotionBlockObjectResponse = NotionBlockListResponse["results"][number]; +type ExtractBlockObjectResponse<T> = T extends { type: string } ? T : never; +type NotionBlock = ExtractBlockObjectResponse<NotionBlockObjectResponse>; +type NotionChildPageBlock = Extract<NotionBlock, { type: "child_page" }>; +type NotionParagraphBlock = Extract<NotionBlock, { type: "paragraph" }>; +type NotionTableRowBlock = Extract<NotionBlock, { type: "table_row" }>; +type NotionRichText = NotionParagraphBlock["paragraph"]["rich_text"]; +type NotionAnnotations = NotionRichText[number]["annotations"]; + +const fetchNotionBlocks = (client: Client) => async (blockId: string) => + collectPaginatedAPI(client.blocks.children.list, { + block_id: blockId, + }); + +const fetchNotionPage = (client: Client) => (pageId: string) => + client.pages.retrieve({ page_id: pageId }); + +type Page = { + metadata: { + id: string; + title: string; + createdTime: string; + lastEditedTime: string; + parentId?: string; + }; + lines: string[]; +}; + +type Pages = Record<string, Page>; + +const hasType = (block: NotionBlockObjectResponse): block is NotionBlock => + "type" in block; + +const blockIs = <T extends NotionBlock["type"]>( + block: NotionBlock, + type: T, +): block is Extract<NotionBlock, { type: T }> => block.type === type; + +const getCursor = ( + pageBlock: NotionChildPageBlock, + parentId?: string, +): Page => ({ + metadata: { + id: pageBlock.id, + title: pageBlock.child_page.title, + createdTime: pageBlock.created_time, + lastEditedTime: pageBlock.last_edited_time, + parentId, + }, + lines: [], +}); + +const annotateText = (text: string, annotations: NotionAnnotations) => { + if (annotations.code) text = md.inlineCode(text); + if (annotations.bold) text = md.bold(text); + if (annotations.italic) text = md.italic(text); + if (annotations.strikethrough) text = md.del(text); + if (annotations.underline) text = md.underline(text); + + return text; +}; + +const richTextToString = (richText: NotionRichText) => + richText + .map(({ plain_text, annotations, href }) => { + if (plain_text.match(/^\s*$/)) return plain_text; + + const leadingSpaceMatch = plain_text.match(/^(\s*)/); + const trailingSpaceMatch = plain_text.match(/(\s*)$/); + + const leading_space = leadingSpaceMatch ? leadingSpaceMatch[0] : ""; + const trailing_space = trailingSpaceMatch ? trailingSpaceMatch[0] : ""; + + const text = plain_text.trim(); + + if (text === "") return leading_space + trailing_space; + + const annotatedText = annotateText(text, annotations); + const linkedText = href ? md.anchor(annotatedText, href) : annotatedText; + + return leading_space + linkedText + trailing_space; + }) + .join(""); + +const tableRowToString = (block: NotionTableRowBlock) => + `| ${block.table_row.cells + .flatMap((row) => row.map((column) => richTextToString([column]))) + .join(" | ")} |`; + +const blockToString = (block: NotionBlock): string => { + switch (block.type) { + case "divider": + return md.hr(); + case "equation": + return md.equationBlock(block.equation.expression); + case "bookmark": + return md.anchor( + richTextToString(block.bookmark.caption), + block.bookmark.url, + ); + case "link_preview": + return md.anchor(block.type, block.link_preview.url); + case "link_to_page": + const href = + block.link_to_page.type === "page_id" ? block.link_to_page.page_id : ""; + return md.anchor(block.type, href); + case "child_page": + return `[${block.child_page.title}]`; + case "child_database": + return `[${block.child_database.title}]`; + case "paragraph": + return richTextToString(block.paragraph.rich_text); + case "heading_1": + return md.h1(richTextToString(block.heading_1.rich_text)); + case "heading_2": + return md.h2(richTextToString(block.heading_2.rich_text)); + case "heading_3": + return md.h3(richTextToString(block.heading_3.rich_text)); + case "bulleted_list_item": + return md.bullet(richTextToString(block.bulleted_list_item.rich_text)); + case "numbered_list_item": + return md.bullet(richTextToString(block.numbered_list_item.rich_text), 1); + case "quote": + return md.quote(richTextToString(block.quote.rich_text)); + case "table_row": + return tableRowToString(block); + case "to_do": + return md.todo( + richTextToString(block.to_do.rich_text), + block.to_do.checked, + ); + case "template": + return richTextToString(block.template.rich_text); + case "code": + return md.codeBlock(block.code.language)( + richTextToString(block.code.rich_text), + ); + case "callout": + return md.quote(richTextToString(block.callout.rich_text)); + + case "image": + case "video": + case "audio": + case "file": + case "pdf": + case "table": + case "embed": + case "breadcrumb": + case "synced_block": + case "table_of_contents": + case "unsupported": + default: + return ""; + } +}; + +const getNest = (block: NotionBlock, baseNest: number) => { + switch (block.type) { + // Reset nest + case "child_page": + return 0; + + // Eliminates unnecessary nests due to NotionBlock structure + case "table_row": + case "column_list": + case "column": + case "synced_block": + return baseNest; + + default: + return baseNest + 1; + } +}; + +const crawlPages = + (client: Client) => + async ( + blocks: NotionBlockObjectResponse[], + cursor: Page, + pages: Pages = {}, + nest = 0, + ): Promise<Pages> => { + pages[cursor.metadata.id] = pages[cursor.metadata.id] || cursor; + + for (const block of blocks) { + if (!hasType(block)) continue; + + const line = md.indent()(blockToString(block), nest); + cursor.lines.push(line); + + if (block.has_children) { + const blockId = blockIs(block, "synced_block") + ? block.synced_block.synced_from?.block_id || block.id + : block.id; + const childBlocks = await fetchNotionBlocks(client)(blockId); + const nextCursor = blockIs(block, "child_page") + ? getCursor(block, cursor.metadata.id) + : cursor; + const childPages = await crawlPages(client)( + childBlocks, + nextCursor, + pages, + getNest(block, nest), + ); + pages = { ...pages, ...childPages }; + } + } + + return pages; + }; + +const extractPageTitle = (page: NotionPartialPageObjectResponse) => { + if (!("properties" in page)) return ""; + + if (page.properties.title.type !== "title") return ""; + + return page.properties.title.title[0].plain_text; +}; + +const nestHeading = (text: string) => (text.match(/^#+\s/) ? "#" + text : text); + +const pagesToDocuments = (pages: Pages): Document[] => + Object.entries(pages).map(([, { lines, metadata }]) => { + const title = md.h1(metadata.title); + const body = lines.map(nestHeading); + const text = [title, ...body].join("\n"); + return new Document({ text, metadata }); + }); + +export class NotionReader implements BaseReader { + private client: Client; + + constructor(options: { client: Client }) { + this.client = options.client; + } + + async loadData(pageId: string): Promise<Document[]> { + const rootPage = (await fetchNotionPage(this.client)(pageId)) as any; + const rootPageTitle = extractPageTitle(rootPage); + const rootBlocks = await fetchNotionBlocks(this.client)(rootPage.id); + + const cursor: Page = { + metadata: { + id: rootPage.id, + title: rootPageTitle, + createdTime: rootPage.created_time, + lastEditedTime: rootPage.last_edited_time, + }, + lines: [], + }; + const pages = await crawlPages(this.client)(rootBlocks, cursor); + + return pagesToDocuments(pages); + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 880b34e54..c8e5e2697 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,7 +17,7 @@ importers: devDependencies: '@turbo/gen': specifier: ^1.10.13 - version: 1.10.13(@types/node@20.5.7)(typescript@5.2.2) + version: 1.10.13(@types/node@18.17.12)(typescript@4.9.5) '@types/jest': specifier: ^29.5.4 version: 29.5.4 @@ -32,16 +32,16 @@ importers: version: 8.0.3 jest: specifier: ^29.6.4 - version: 29.6.4(@types/node@20.5.7) + version: 29.6.4(@types/node@18.17.12) prettier: specifier: ^3.0.3 version: 3.0.3 prettier-plugin-organize-imports: specifier: ^3.2.3 - version: 3.2.3(prettier@3.0.3)(typescript@5.2.2) + version: 3.2.3(prettier@3.0.3)(typescript@4.9.5) ts-jest: specifier: ^29.1.1 - version: 29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@5.2.2) + version: 29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@4.9.5) turbo: specifier: ^1.10.13 version: 1.10.13 @@ -116,9 +116,15 @@ importers: '@anthropic-ai/sdk': specifier: ^0.6.2 version: 0.6.2 + '@notionhq/client': + specifier: ^2.2.12 + version: 2.2.12 lodash: specifier: ^4.17.21 version: 4.17.21 + md-utils-ts: + specifier: ^1.0.4 + version: 1.0.4 openai: specifier: ^4.3.1 version: 4.3.1 @@ -161,22 +167,22 @@ importers: version: 1.2.0 tsup: specifier: ^7.2.0 - version: 7.2.0(typescript@5.2.2) + version: 7.2.0(typescript@4.9.5) packages/eslint-config-custom: dependencies: eslint-config-next: specifier: ^13.4.1 - version: 13.4.1(eslint@8.48.0)(typescript@5.2.2) + version: 13.4.1(eslint@7.32.0)(typescript@4.9.5) eslint-config-prettier: specifier: ^8.3.0 - version: 8.8.0(eslint@8.48.0) + version: 8.8.0(eslint@7.32.0) eslint-config-turbo: specifier: ^1.9.3 - version: 1.9.3(eslint@8.48.0) + version: 1.9.3(eslint@7.32.0) eslint-plugin-react: specifier: 7.28.0 - version: 7.28.0(eslint@8.48.0) + version: 7.28.0(eslint@7.32.0) devDependencies: next: specifier: ^13.4.10 @@ -2698,7 +2704,7 @@ packages: peerDependencies: react: '*' dependencies: - '@types/react': 18.2.20 + '@types/react': 18.2.21 prop-types: 15.8.1 react: 17.0.2 @@ -3147,21 +3153,6 @@ packages: dev: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.48.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.48.0 - eslint-visitor-keys: 3.4.3 - dev: false - - /@eslint-community/regexpp@4.8.0: - resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: false - /@eslint/eslintrc@0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3178,28 +3169,6 @@ packages: transitivePeerDependencies: - supports-color - /@eslint/eslintrc@2.1.2: - resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.21.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@eslint/js@8.48.0: - resolution: {integrity: sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - /@hapi/hoek@9.3.0: resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} @@ -3208,17 +3177,6 @@ packages: dependencies: '@hapi/hoek': 9.3.0 - /@humanwhocodes/config-array@0.11.11: - resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: false - /@humanwhocodes/config-array@0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -3229,11 +3187,6 @@ packages: transitivePeerDependencies: - supports-color - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: false - /@humanwhocodes/object-schema@1.2.1: resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} @@ -3258,7 +3211,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 jest-message-util: 29.6.3 jest-util: 29.6.3 @@ -3279,14 +3232,14 @@ packages: '@jest/test-result': 29.6.4 '@jest/transform': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.8.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.6.3 - jest-config: 29.6.4(@types/node@20.5.7) + jest-config: 29.6.4(@types/node@18.17.12) jest-haste-map: 29.6.4 jest-message-util: 29.6.3 jest-regex-util: 29.6.3 @@ -3314,7 +3267,7 @@ packages: dependencies: '@jest/fake-timers': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-mock: 29.6.3 dev: true @@ -3341,7 +3294,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-message-util: 29.6.3 jest-mock: 29.6.3 jest-util: 29.6.3 @@ -3374,7 +3327,7 @@ packages: '@jest/transform': 29.6.4 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -3461,7 +3414,7 @@ packages: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.4 '@types/istanbul-reports': 3.0.1 - '@types/node': 20.5.7 + '@types/node': 18.17.12 '@types/yargs': 17.0.24 chalk: 4.1.2 @@ -3674,6 +3627,16 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@notionhq/client@2.2.12: + resolution: {integrity: sha512-LCzbOyVjVtui9GQPFEuvFd8JIWZbY/tgyCqrmxzGSjpGCwqjsEldeNC4qYjsMzVB4MIbP5y1vlWzLsUw/M9QAQ==} + engines: {node: '>=12'} + dependencies: + '@types/node-fetch': 2.6.4 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + /@pkgr/utils@2.4.0: resolution: {integrity: sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -3929,7 +3892,7 @@ packages: resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} dev: true - /@turbo/gen@1.10.13(@types/node@20.5.7)(typescript@5.2.2): + /@turbo/gen@1.10.13(@types/node@18.17.12)(typescript@4.9.5): resolution: {integrity: sha512-fwGVjeun2i0RIdq/20d2wpatPw9vE4Mbk60uB8rk8NENDXn2JLfbsh00mZ5KAEX5ZQUibh6tD+B7xROV8Eb7dQ==} hasBin: true dependencies: @@ -3941,7 +3904,7 @@ packages: minimatch: 9.0.3 node-plop: 0.26.3 proxy-agent: 6.3.0 - ts-node: 10.9.1(@types/node@20.5.7)(typescript@5.2.2) + ts-node: 10.9.1(@types/node@18.17.12)(typescript@4.9.5) update-check: 1.5.4 validate-npm-package-name: 5.0.0 transitivePeerDependencies: @@ -4003,26 +3966,26 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/bonjour@3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/connect-history-api-fallback@1.5.0: resolution: {integrity: sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==} dependencies: '@types/express-serve-static-core': 4.17.35 - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/connect@3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/eslint-scope@3.7.4: @@ -4043,7 +4006,7 @@ packages: /@types/express-serve-static-core@4.17.35: resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 '@types/send': 0.17.1 @@ -4062,13 +4025,13 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: true /@types/graceful-fs@4.1.6: resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: true /@types/hast@2.3.5: @@ -4091,7 +4054,7 @@ packages: /@types/http-proxy@1.17.11: resolution: {integrity: sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/inquirer@6.5.0: @@ -4137,7 +4100,7 @@ packages: /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/lodash@4.14.197: @@ -4188,9 +4151,6 @@ packages: resolution: {integrity: sha512-fGmT/P7z7ecA6bv/ia5DlaWCH4YeZvAQMNpUhrJjtAhOhZfoxS1VLUgU2pdk63efSjQaOJWdXMuAJsws+8I6dg==} dev: true - /@types/node@20.5.7: - resolution: {integrity: sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==} - /@types/normalize-package-data@2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} dev: false @@ -4242,7 +4202,7 @@ packages: resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} dependencies: '@types/history': 4.7.11 - '@types/react': 18.2.20 + '@types/react': 18.2.21 /@types/react@18.2.20: resolution: {integrity: sha512-WKNtmsLWJM/3D5mG4U84cysVY31ivmyw85dE84fOCk5Hx78wezB/XEjVPWl2JTZ5FkEeaTJf+VgUAUn3PE7Isw==} @@ -4257,12 +4217,11 @@ packages: '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.3 csstype: 3.1.2 - dev: false /@types/responselike@1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/retry@0.12.0: @@ -4272,7 +4231,7 @@ packages: /@types/sax@1.2.4: resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==} dependencies: - '@types/node': 17.0.45 + '@types/node': 18.17.12 dev: false /@types/scheduler@0.16.3: @@ -4286,7 +4245,7 @@ packages: resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} dependencies: '@types/mime': 1.3.2 - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/serve-index@1.9.1: @@ -4300,13 +4259,13 @@ packages: dependencies: '@types/http-errors': 2.0.1 '@types/mime': 3.0.1 - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/sockjs@0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/stack-utils@2.0.1: @@ -4316,7 +4275,7 @@ packages: /@types/through@0.0.30: resolution: {integrity: sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: true /@types/tinycolor2@1.4.3: @@ -4334,7 +4293,7 @@ packages: /@types/ws@8.5.5: resolution: {integrity: sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 dev: false /@types/yargs-parser@21.0.0: @@ -4345,7 +4304,7 @@ packages: dependencies: '@types/yargs-parser': 21.0.0 - /@typescript-eslint/parser@5.59.2(eslint@8.48.0)(typescript@5.2.2): + /@typescript-eslint/parser@5.59.2(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4357,10 +4316,10 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.59.2 '@typescript-eslint/types': 5.59.2 - '@typescript-eslint/typescript-estree': 5.59.2(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.59.2(typescript@4.9.5) debug: 4.3.4 - eslint: 8.48.0 - typescript: 5.2.2 + eslint: 7.32.0 + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: false @@ -4378,7 +4337,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /@typescript-eslint/typescript-estree@5.59.2(typescript@5.2.2): + /@typescript-eslint/typescript-estree@5.59.2(typescript@4.9.5): resolution: {integrity: sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4393,8 +4352,8 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - supports-color dev: false @@ -4533,14 +4492,6 @@ packages: dependencies: acorn: 7.4.1 - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: false - /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} engines: {node: '>=0.4.0'} @@ -6843,7 +6794,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-config-next@13.4.1(eslint@8.48.0)(typescript@5.2.2): + /eslint-config-next@13.4.1(eslint@7.32.0)(typescript@4.9.5): resolution: {integrity: sha512-ajuxjCkW1hvirr0EQZb3/B/bFH52Z7CT89uCtTcICFL9l30i5c8hN4p0LXvTjdOXNPV5fEDcxBgGHgXdzTj1/A==} peerDependencies: eslint: ^7.23.0 || ^8.0.0 @@ -6854,36 +6805,36 @@ packages: dependencies: '@next/eslint-plugin-next': 13.4.1 '@rushstack/eslint-patch': 1.2.0 - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) - eslint: 8.48.0 + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) - eslint-plugin-jsx-a11y: 6.7.1(eslint@8.48.0) - eslint-plugin-react: 7.32.2(eslint@8.48.0) - eslint-plugin-react-hooks: 4.6.0(eslint@8.48.0) - typescript: 5.2.2 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-plugin-jsx-a11y: 6.7.1(eslint@7.32.0) + eslint-plugin-react: 7.32.2(eslint@7.32.0) + eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0) + typescript: 4.9.5 transitivePeerDependencies: - eslint-import-resolver-webpack - supports-color dev: false - /eslint-config-prettier@8.8.0(eslint@8.48.0): + /eslint-config-prettier@8.8.0(eslint@7.32.0): resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false - /eslint-config-turbo@1.9.3(eslint@8.48.0): + /eslint-config-turbo@1.9.3(eslint@7.32.0): resolution: {integrity: sha512-QG6jxFQkrGSpQqlFKefPdtgUfr20EbU0s4tGGIuGFOcPuJEdsY6VYZpZUxNJvmMcTGqPgMyOPjAFBKhy/DPHLA==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.48.0 - eslint-plugin-turbo: 1.9.3(eslint@8.48.0) + eslint: 7.32.0 + eslint-plugin-turbo: 1.9.3(eslint@7.32.0) dev: false /eslint-import-resolver-node@0.3.7: @@ -6896,7 +6847,7 @@ packages: - supports-color dev: false - /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0): + /eslint-import-resolver-typescript@3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0): resolution: {integrity: sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==} engines: {node: ^14.18.0 || >=16.0.0} peerDependencies: @@ -6905,9 +6856,9 @@ packages: dependencies: debug: 4.3.4 enhanced-resolve: 5.13.0 - eslint: 8.48.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) - eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) + eslint: 7.32.0 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) + eslint-plugin-import: 2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) get-tsconfig: 4.5.0 globby: 13.1.4 is-core-module: 2.12.0 @@ -6920,7 +6871,7 @@ packages: - supports-color dev: false - /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -6941,16 +6892,16 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) debug: 3.2.7 - eslint: 8.48.0 + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@8.48.0) + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-plugin-import@2.27.5)(eslint@7.32.0) transitivePeerDependencies: - supports-color dev: false - /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0): + /eslint-plugin-import@2.27.5(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0): resolution: {integrity: sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==} engines: {node: '>=4'} peerDependencies: @@ -6960,15 +6911,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.59.2(eslint@8.48.0)(typescript@5.2.2) + '@typescript-eslint/parser': 5.59.2(eslint@7.32.0)(typescript@4.9.5) array-includes: 3.1.6 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 eslint-import-resolver-node: 0.3.7 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.48.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.59.2)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@7.32.0) has: 1.0.3 is-core-module: 2.12.0 is-glob: 4.0.3 @@ -6983,7 +6934,7 @@ packages: - supports-color dev: false - /eslint-plugin-jsx-a11y@6.7.1(eslint@8.48.0): + /eslint-plugin-jsx-a11y@6.7.1(eslint@7.32.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} peerDependencies: @@ -6998,7 +6949,7 @@ packages: axobject-query: 3.1.1 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 8.48.0 + eslint: 7.32.0 has: 1.0.3 jsx-ast-utils: 3.3.3 language-tags: 1.0.5 @@ -7008,16 +6959,16 @@ packages: semver: 6.3.0 dev: false - /eslint-plugin-react-hooks@4.6.0(eslint@8.48.0): + /eslint-plugin-react-hooks@4.6.0(eslint@7.32.0): resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false - /eslint-plugin-react@7.28.0(eslint@8.48.0): + /eslint-plugin-react@7.28.0(eslint@7.32.0): resolution: {integrity: sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==} engines: {node: '>=4'} peerDependencies: @@ -7026,7 +6977,7 @@ packages: array-includes: 3.1.6 array.prototype.flatmap: 1.3.1 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -7040,7 +6991,7 @@ packages: string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-react@7.32.2(eslint@8.48.0): + /eslint-plugin-react@7.32.2(eslint@7.32.0): resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==} engines: {node: '>=4'} peerDependencies: @@ -7050,7 +7001,7 @@ packages: array.prototype.flatmap: 1.3.1 array.prototype.tosorted: 1.1.1 doctrine: 2.1.0 - eslint: 8.48.0 + eslint: 7.32.0 estraverse: 5.3.0 jsx-ast-utils: 3.3.3 minimatch: 3.1.2 @@ -7064,12 +7015,12 @@ packages: string.prototype.matchall: 4.0.8 dev: false - /eslint-plugin-turbo@1.9.3(eslint@8.48.0): + /eslint-plugin-turbo@1.9.3(eslint@7.32.0): resolution: {integrity: sha512-ZsRtksdzk3v+z5/I/K4E50E4lfZ7oYmLX395gkrUMBz4/spJlYbr+GC8hP9oVNLj9s5Pvnm9rLv/zoj5PVYaVw==} peerDependencies: eslint: '>6.6.0' dependencies: - eslint: 8.48.0 + eslint: 7.32.0 dev: false /eslint-scope@5.1.1: @@ -7079,14 +7030,6 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: false - /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -7106,11 +7049,6 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: false - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: false - /eslint@7.32.0: resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7159,52 +7097,6 @@ packages: transitivePeerDependencies: - supports-color - /eslint@8.48.0: - resolution: {integrity: sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.48.0) - '@eslint-community/regexpp': 4.8.0 - '@eslint/eslintrc': 2.1.2 - '@eslint/js': 8.48.0 - '@humanwhocodes/config-array': 0.11.11 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.21.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: false - /espree@7.3.1: resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} engines: {node: ^10.12.0 || >=12.0.0} @@ -7213,15 +7105,6 @@ packages: acorn-jsx: 5.3.2(acorn@7.4.1) eslint-visitor-keys: 1.3.0 - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: false - /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -7265,7 +7148,7 @@ packages: resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} engines: {node: '>= 0.8'} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 require-like: 0.1.2 dev: false @@ -7986,10 +7869,6 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: false - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: false - /gray-matter@4.0.3: resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} engines: {node: '>=6.0'} @@ -9016,7 +8895,7 @@ packages: '@jest/expect': 29.6.4 '@jest/test-result': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.1 @@ -9037,7 +8916,7 @@ packages: - supports-color dev: true - /jest-cli@29.6.4(@types/node@20.5.7): + /jest-cli@29.6.4(@types/node@18.17.12): resolution: {integrity: sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9054,7 +8933,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 import-local: 3.1.0 - jest-config: 29.6.4(@types/node@20.5.7) + jest-config: 29.6.4(@types/node@18.17.12) jest-util: 29.6.3 jest-validate: 29.6.3 prompts: 2.4.2 @@ -9066,7 +8945,7 @@ packages: - ts-node dev: true - /jest-config@29.6.4(@types/node@20.5.7): + /jest-config@29.6.4(@types/node@18.17.12): resolution: {integrity: sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -9081,7 +8960,7 @@ packages: '@babel/core': 7.22.11 '@jest/test-sequencer': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 babel-jest: 29.6.4(@babel/core@7.22.11) chalk: 4.1.2 ci-info: 3.8.0 @@ -9141,7 +9020,7 @@ packages: '@jest/environment': 29.6.4 '@jest/fake-timers': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-mock: 29.6.3 jest-util: 29.6.3 dev: true @@ -9157,7 +9036,7 @@ packages: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.6 - '@types/node': 20.5.7 + '@types/node': 18.17.12 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -9208,7 +9087,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-util: 29.6.3 dev: true @@ -9263,7 +9142,7 @@ packages: '@jest/test-result': 29.6.4 '@jest/transform': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -9294,7 +9173,7 @@ packages: '@jest/test-result': 29.6.4 '@jest/transform': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 cjs-module-lexer: 1.2.3 collect-v8-coverage: 1.0.2 @@ -9346,7 +9225,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 chalk: 4.1.2 ci-info: 3.8.0 graceful-fs: 4.2.11 @@ -9370,7 +9249,7 @@ packages: dependencies: '@jest/test-result': 29.6.4 '@jest/types': 29.6.3 - '@types/node': 20.5.7 + '@types/node': 18.17.12 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -9382,7 +9261,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9390,7 +9269,7 @@ packages: resolution: {integrity: sha512-l3ccBOabTdkng8I/ORCkADz4eSMKejTYv1vB/Z83UiubqhC1oQ5Li6dWCyqOIvSifGjUBxuvxvlm6KGK2DtuAQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-util: 29.6.3 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -9400,13 +9279,13 @@ packages: resolution: {integrity: sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@types/node': 20.5.7 + '@types/node': 18.17.12 jest-util: 29.6.3 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true - /jest@29.6.4(@types/node@20.5.7): + /jest@29.6.4(@types/node@18.17.12): resolution: {integrity: sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -9419,7 +9298,7 @@ packages: '@jest/core': 29.6.4 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.6.4(@types/node@20.5.7) + jest-cli: 29.6.4(@types/node@18.17.12) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9798,12 +9677,22 @@ packages: resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==} dev: false + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + /marked@4.3.0: resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} engines: {node: '>= 12'} hasBin: true dev: true + /md-utils-ts@1.0.4: + resolution: {integrity: sha512-RW09NtsRLCqJasXdbgTIG7BjWM8ET5PWip/19O5Ilw1Jph1WJn2IFh6Th0UzNq3Q+jtqx87hzWMy4SpsSxqfgA==} + dependencies: + markdown-table: 3.0.3 + dev: false + /md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} dependencies: @@ -11236,7 +11125,7 @@ packages: engines: {node: '>=4'} dev: false - /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@5.2.2): + /prettier-plugin-organize-imports@3.2.3(prettier@3.0.3)(typescript@4.9.5): resolution: {integrity: sha512-KFvk8C/zGyvUaE3RvxN2MhCLwzV6OBbFSkwZ2OamCrs9ZY4i5L77jQ/w4UmUr+lqX8qbaqVq6bZZkApn+IgJSg==} peerDependencies: '@volar/vue-language-plugin-pug': ^1.0.4 @@ -11250,7 +11139,7 @@ packages: optional: true dependencies: prettier: 3.0.3 - typescript: 5.2.2 + typescript: 4.9.5 dev: true /prettier@2.8.8: @@ -13071,7 +12960,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest@29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@5.2.2): + /ts-jest@29.1.1(@babel/core@7.22.11)(jest@29.6.4)(typescript@4.9.5): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -13095,17 +12984,17 @@ packages: '@babel/core': 7.22.11 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.6.4(@types/node@20.5.7) + jest: 29.6.4(@types/node@18.17.12) jest-util: 29.6.3 json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 semver: 7.5.4 - typescript: 5.2.2 + typescript: 4.9.5 yargs-parser: 21.1.1 dev: true - /ts-node@10.9.1(@types/node@20.5.7)(typescript@5.2.2): + /ts-node@10.9.1(@types/node@18.17.12)(typescript@4.9.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -13124,14 +13013,14 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.5.7 + '@types/node': 18.17.12 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.2.2 + typescript: 4.9.5 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 dev: true @@ -13155,7 +13044,7 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /tsup@7.2.0(typescript@5.2.2): + /tsup@7.2.0(typescript@4.9.5): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -13185,20 +13074,20 @@ packages: source-map: 0.8.0-beta.0 sucrase: 3.34.0 tree-kill: 1.2.2 - typescript: 5.2.2 + typescript: 4.9.5 transitivePeerDependencies: - supports-color - ts-node dev: true - /tsutils@3.21.0(typescript@5.2.2): + /tsutils@3.21.0(typescript@4.9.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.2.2 + typescript: 4.9.5 dev: false /tty-browserify@0.0.1: @@ -13369,11 +13258,6 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - /ua-parser-js@1.0.35: resolution: {integrity: sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==} dev: false -- GitLab