From b7c7a5cc93b33ef6e7f4e4714bd32c8fe9f98546 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=8B=9C=ED=98=95?= <77565951+sihyeong671@users.noreply.github.com> Date: Sat, 19 Oct 2024 15:58:28 +0900 Subject: [PATCH 01/27] Remove model type and refactor code for Yorkie Intelligence (#374) * Update backend.env - change default llm model to llama3.2:1b - fix typo * remove llm model type * refactor code - change process to configService.get("YORKIE_INTELLIGENCE") * fix: process to configService, add throw Error in langchain module --- backend/.env.development | 4 +- backend/src/langchain/langchain.module.ts | 45 +++++++---------------- 2 files changed, 15 insertions(+), 34 deletions(-) diff --git a/backend/.env.development b/backend/.env.development index 0ecfa7ba..a05e2938 100644 --- a/backend/.env.development +++ b/backend/.env.development @@ -42,9 +42,9 @@ YORKIE_PROJECT_NAME=default YORKIE_PROJECT_SECRET_KEY="" # YORKIE_INTELLIGENCE: Whether to enable Yorkie Intelligence for collaborative editing. -# Available options: false, ollama:lamma3.1, ollama:gemma2, ollama:gemma2:2b, ollama:phi3, ollama:mistral, ollama:neural-chat, ollama:starling-lm, ollama:solar, openai:gpt-3.5-turbo, openai:gpt-4o-mini +# Available options: false, ollama:llama3.1, ollama:gemma2, ollama:gemma2:2b, ollama:phi3, ollama:mistral, ollama:neural-chat, ollama:starling-lm, ollama:solar, openai:gpt-3.5-turbo, openai:gpt-4o-mini, etc. # If set to openai:gpt-3.5-turbo or openai:gpt-4o-mini, OPENAI_API_KEY is not required. -YORKIE_INTELLIGENCE="ollama:gemma2:2b" +YORKIE_INTELLIGENCE="ollama:llama3.2:1b" # OLLAMA_HOST_URL: yorkie-intelligence ollama url OLLAMA_HOST_URL=http://localhost:11434 diff --git a/backend/src/langchain/langchain.module.ts b/backend/src/langchain/langchain.module.ts index 63e381c5..712c3b1c 100644 --- a/backend/src/langchain/langchain.module.ts +++ b/backend/src/langchain/langchain.module.ts @@ -2,46 +2,26 @@ import { Module } from "@nestjs/common"; import { ChatOpenAI } from "@langchain/openai"; import { ChatOllama } from "@langchain/ollama"; import { BaseChatModel } from "@langchain/core/language_models/chat_models"; - -type ModelList = { - [key: string]: string[]; -}; - -const modelList: ModelList = { - ollama: [ - "lamma3.1", - "gemma2", - "gemma2:2b", - "phi3", - "mistral", - "neural-chat", - "starling-lm", - "solar", - ], - openai: ["gpt-3.5-turbo", "gpt-4o-mini"], -}; +import { ConfigService } from "@nestjs/config"; const chatModelFactory = { provide: "ChatModel", - useFactory: () => { - const modelType = process.env.YORKIE_INTELLIGENCE; + useFactory: (configService: ConfigService) => { + const modelType = configService.get("YORKIE_INTELLIGENCE"); try { // Split the modelType string into provider and model // ex) "ollama:gemma2:2b" => ["ollama", "gemma2:2b"] const [provider, model] = modelType.split(/:(.+)/); let chatModel: BaseChatModel | ChatOllama; - - if (modelList[provider]?.includes(model)) { - if (provider === "ollama") { - chatModel = new ChatOllama({ - model: model, - baseUrl: process.env.OLLAMA_HOST_URL, - checkOrPullModel: true, - streaming: true, - }); - } else if (provider === "openai") { - chatModel = new ChatOpenAI({ modelName: model }); - } + if (provider === "ollama") { + chatModel = new ChatOllama({ + model: model, + baseUrl: configService.get("OLLAMA_HOST_URL"), + checkOrPullModel: true, + streaming: true, + }); + } else if (provider === "openai") { + chatModel = new ChatOpenAI({ modelName: model }); } if (!chatModel) throw new Error(); @@ -51,6 +31,7 @@ const chatModelFactory = { throw new Error(`${modelType} is not found. Please check your model name`); } }, + inject: [ConfigService], }; @Module({ From 16f32c773b27945f8307983634816a7b5ede28ff Mon Sep 17 00:00:00 2001 From: Youngteac Hong Date: Tue, 22 Oct 2024 14:51:57 +0900 Subject: [PATCH 02/27] Update `yorkie-js-sdk` to `v0.5.2` (#380) --- frontend/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 91e0dbe2..00009808 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -77,7 +77,7 @@ "remark-math": "^6.0.0", "validator": "^13.12.0", "vite-plugin-package-version": "^1.1.0", - "yorkie-js-sdk": "0.5.1" + "yorkie-js-sdk": "0.5.2" }, "devDependencies": { "@sentry/vite-plugin": "^2.20.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc185809..5c6ca489 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -76,7 +76,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/swagger': specifier: ^7.1.17 - version: 7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + version: 7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) '@prisma/client': specifier: ^5.8.1 version: 5.19.1(prisma@5.19.1) @@ -122,7 +122,7 @@ importers: version: 10.1.4(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)) + version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -334,8 +334,8 @@ importers: specifier: ^1.1.0 version: 1.1.0(vite@5.4.7(@types/node@20.16.6)(terser@5.33.0)) yorkie-js-sdk: - specifier: 0.5.1 - version: 0.5.1 + specifier: 0.5.2 + version: 0.5.2 devDependencies: '@sentry/vite-plugin': specifier: ^2.20.1 @@ -6537,8 +6537,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yorkie-js-sdk@0.5.1: - resolution: {integrity: sha512-/GYo9deTs2QIz9jZTYM9wnTupnzifw9vgTx6/pZavy3W9YPH6qtuer4PKCX129VQAJGTXeOLiNCb28c/jq7QHg==} + yorkie-js-sdk@0.5.2: + resolution: {integrity: sha512-tlvNxDESiRX6H2R42lpqVkY6TxBglXOruFWulAz09+STn/HF3XzrBIqWDVN+KCilAz7T75oEdyw1Ip9rnQauUw==} engines: {node: '>=18.0.0', npm: '>=7.1.0'} zod-to-json-schema@3.23.3: @@ -8215,7 +8215,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': + '@nestjs/swagger@7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': dependencies: '@microsoft/tsdoc': 0.15.0 '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -8230,7 +8230,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4))': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -13599,7 +13599,7 @@ snapshots: yocto-queue@0.1.0: {} - yorkie-js-sdk@0.5.1: + yorkie-js-sdk@0.5.2: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.5.0(@bufbuild/protobuf@1.10.0) From 726af331be49ef1f6c63d10272d8fe332d5feaed Mon Sep 17 00:00:00 2001 From: choidabom <48302257+choidabom@users.noreply.github.com> Date: Wed, 23 Oct 2024 12:03:08 +0900 Subject: [PATCH 03/27] Add `postinstall` script for prisma schema generation (#370) * Update README to include database schema generation instruction * Remove README and add `postinstall` in backend/package.json * Fix postinstall command * Fix format --- Dockerfile | 1 - backend/package.json | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 524f811e..21664696 100644 --- a/Dockerfile +++ b/Dockerfile @@ -28,7 +28,6 @@ RUN mkdir /usr/share/fonts/nanumfont && \ fc-cache -f -v # Set the environment variables -ENV NODE_ENV production ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD true ENV PUPPETEER_EXECUTABLE_PATH /usr/bin/chromium-browser diff --git a/backend/package.json b/backend/package.json index 17ed4360..b21d5b4d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -6,6 +6,7 @@ "license": "Apache-2.0", "scripts": { "build": "nest build", + "postinstall": "pnpm run db:generate", "db:generate": "prisma generate --schema=prisma/schema.prisma", "start": "nest start", "start:dev": "nest start --watch", From 901acc74c37f9e2337274dbad19497d7deeaf4bd Mon Sep 17 00:00:00 2001 From: Youngteac Hong Date: Wed, 23 Oct 2024 22:10:08 +0900 Subject: [PATCH 04/27] Update `yorkie-js-sdk` to `v0.5.3` (#381) --- frontend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 00009808..22acced4 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -77,7 +77,7 @@ "remark-math": "^6.0.0", "validator": "^13.12.0", "vite-plugin-package-version": "^1.1.0", - "yorkie-js-sdk": "0.5.2" + "yorkie-js-sdk": "0.5.3" }, "devDependencies": { "@sentry/vite-plugin": "^2.20.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c6ca489..07dd6839 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -334,8 +334,8 @@ importers: specifier: ^1.1.0 version: 1.1.0(vite@5.4.7(@types/node@20.16.6)(terser@5.33.0)) yorkie-js-sdk: - specifier: 0.5.2 - version: 0.5.2 + specifier: 0.5.3 + version: 0.5.3 devDependencies: '@sentry/vite-plugin': specifier: ^2.20.1 @@ -6537,8 +6537,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yorkie-js-sdk@0.5.2: - resolution: {integrity: sha512-tlvNxDESiRX6H2R42lpqVkY6TxBglXOruFWulAz09+STn/HF3XzrBIqWDVN+KCilAz7T75oEdyw1Ip9rnQauUw==} + yorkie-js-sdk@0.5.3: + resolution: {integrity: sha512-psMg/cICvgFeH2FxZ0wKxJpciaKlNq2DhU4eJpdxhn0mv3kuXdDtKev1qJkTk/KXPVW91QMpyLlR9un4akLlGw==} engines: {node: '>=18.0.0', npm: '>=7.1.0'} zod-to-json-schema@3.23.3: @@ -13599,7 +13599,7 @@ snapshots: yocto-queue@0.1.0: {} - yorkie-js-sdk@0.5.2: + yorkie-js-sdk@0.5.3: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.5.0(@bufbuild/protobuf@1.10.0) From eda0444ed34d8087a9d903052f3e233d56bb80b0 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Thu, 24 Oct 2024 17:23:35 +0900 Subject: [PATCH 05/27] Update `CHANGELOG.md` for `v0.1.16` (#382) --- CHANGELOG.md | 9 +++++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 76913f9a..143ab1f8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,15 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.16] - 2024-10-24 + +### Changed + +- Update `yorkie-js-sdk` to `v0.5.1` by @devleejb in https://github.com/yorkie-team/codepair/pull/369 +- Remove model type and refactor code for Yorkie Intelligence by @sihyeong671 in https://github.com/yorkie-team/codepair/pull/374 +- Update `yorkie-js-sdk` to `v0.5.2` by @hackerwins in https://github.com/yorkie-team/codepair/pull/380 +- Update `yorkie-js-sdk` to `v0.5.3` by @hackerwins in https://github.com/yorkie-team/codepair/pull/381 + ## [0.1.15] - 2024-10-14 ### Added diff --git a/backend/package.json b/backend/package.json index b21d5b4d..12859e31 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.15", + "version": "0.1.16", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 22acced4..fcc551fd 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.15", + "version": "0.1.16", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index ffbc64d4..4435799b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.15", + "version": "0.1.16", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From f45c03d0610c0fab65763f88fe472df19ec98a9c Mon Sep 17 00:00:00 2001 From: Youngteac Hong Date: Fri, 25 Oct 2024 17:44:35 +0900 Subject: [PATCH 06/27] Disable devtools (#383) --- .husky/pre-commit | 2 +- frontend/src/hooks/useYorkieDocument.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.husky/pre-commit b/.husky/pre-commit index d39179a8..9d94235f 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -31,4 +31,4 @@ if [ "$LINT_BACKEND" = true ]; then exit 1 fi cd .. -fi \ No newline at end of file +fi diff --git a/frontend/src/hooks/useYorkieDocument.ts b/frontend/src/hooks/useYorkieDocument.ts index d853bd31..ef73d1d7 100644 --- a/frontend/src/hooks/useYorkieDocument.ts +++ b/frontend/src/hooks/useYorkieDocument.ts @@ -41,7 +41,7 @@ export const useYorkieDocument = ( const newDocument = new yorkie.Document< YorkieCodeMirrorDocType, YorkieCodeMirrorPresenceType - >(yorkieDocumentId, { enableDevtools: true }); + >(yorkieDocumentId, { enableDevtools: false }); return client.attach(newDocument, { initialPresence: { name: presenceName, From 204dc3e65a0021ce8c1faea8be61056f084af9b0 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:30:42 +0900 Subject: [PATCH 07/27] Activate SourceMap for Sentry and resolve TypeScript version conflict with ESLint (#384) * Add `.eslintignore` * Update eslint to fix version conflict * Update `vite.config.ts` to enable sourcemap --- frontend/package.json | 4 +- frontend/vite.config.ts | 10 ++-- package.json | 4 +- pnpm-lock.yaml | 114 ++++++++++++++++++++-------------------- 4 files changed, 66 insertions(+), 66 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index fcc551fd..8a8b4c27 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -9,7 +9,7 @@ "dev": "vite", "build": "tsc && vite build", "preview": "vite preview", - "lint": "eslint . --report-unused-disable-directives --max-warnings 0", + "lint": "eslint . --report-unused-disable-directives", "format": "prettier . --write", "format:check": "prettier . --check" }, @@ -92,7 +92,7 @@ "@types/react-scroll-sync": "^0.9.0", "@types/validator": "^13.12.1", "@vitejs/plugin-react": "^4.2.1", - "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-hooks": "^5.0.0", "eslint-plugin-react-refresh": "^0.4.5", "vite": "^5.0.8" }, diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index bd8a8202..326cbaa8 100755 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -6,11 +6,7 @@ import { sentryVitePlugin } from "@sentry/vite-plugin"; // https://vitejs.dev/config/ export default defineConfig({ build: { - // Source map generation must be turned on - // Only enable Sentry plugin if the environment variables are set - sourcemap: Boolean( - process.env.SENTRY_ORG && process.env.SENTRY_PROJECT && process.env.SENTRY_AUTH_TOKEN - ), + sourcemap: true, }, plugins: [ react(), @@ -19,6 +15,10 @@ export default defineConfig({ org: process.env.SENTRY_ORG, project: process.env.SENTRY_PROJECT, authToken: process.env.SENTRY_AUTH_TOKEN, + // sourcemaps: { + // assets: "./dist/**", + // filesToDeleteAfterUpload: "./dist/**/*.map", // Delete after upload sourcemap + // }, }), ], }); diff --git a/package.json b/package.json index 4435799b..82ee2ae5 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "format:check": "pnpm run --parallel format:check" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^8.7.0", - "@typescript-eslint/parser": "^8.7.0", + "@typescript-eslint/eslint-plugin": "^8.11.0", + "@typescript-eslint/parser": "^8.11.0", "eslint": "^9.11.1", "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^5.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07dd6839..6255aa37 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,11 +9,11 @@ importers: .: devDependencies: '@typescript-eslint/eslint-plugin': - specifier: ^8.7.0 - version: 8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) + specifier: ^8.11.0 + version: 8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2) '@typescript-eslint/parser': - specifier: ^8.7.0 - version: 8.7.0(eslint@9.11.1)(typescript@5.6.2) + specifier: ^8.11.0 + version: 8.11.0(eslint@9.11.1)(typescript@5.6.2) eslint: specifier: ^9.11.1 version: 9.11.1 @@ -76,7 +76,7 @@ importers: version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4) '@nestjs/swagger': specifier: ^7.1.17 - version: 7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) + version: 7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14) '@prisma/client': specifier: ^5.8.1 version: 5.19.1(prisma@5.19.1) @@ -122,7 +122,7 @@ importers: version: 10.1.4(chokidar@3.6.0)(typescript@5.3.3) '@nestjs/testing': specifier: ^10.0.0 - version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4) + version: 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)) '@types/express': specifier: ^4.17.17 version: 4.17.21 @@ -374,8 +374,8 @@ importers: specifier: ^4.2.1 version: 4.3.1(vite@5.4.7(@types/node@20.16.6)(terser@5.33.0)) eslint-plugin-react-hooks: - specifier: ^4.6.0 - version: 4.6.2(eslint@9.11.1) + specifier: ^5.0.0 + version: 5.0.0(eslint@9.11.1) eslint-plugin-react-refresh: specifier: ^0.4.5 version: 0.4.12(eslint@9.11.1) @@ -2720,8 +2720,8 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.7.0': - resolution: {integrity: sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==} + '@typescript-eslint/eslint-plugin@8.11.0': + resolution: {integrity: sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -2731,8 +2731,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.7.0': - resolution: {integrity: sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==} + '@typescript-eslint/parser@8.11.0': + resolution: {integrity: sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -2741,12 +2741,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.7.0': - resolution: {integrity: sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==} + '@typescript-eslint/scope-manager@8.11.0': + resolution: {integrity: sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.7.0': - resolution: {integrity: sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==} + '@typescript-eslint/type-utils@8.11.0': + resolution: {integrity: sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2754,12 +2754,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.7.0': - resolution: {integrity: sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==} + '@typescript-eslint/types@8.11.0': + resolution: {integrity: sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.7.0': - resolution: {integrity: sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==} + '@typescript-eslint/typescript-estree@8.11.0': + resolution: {integrity: sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -2767,14 +2767,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.7.0': - resolution: {integrity: sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==} + '@typescript-eslint/utils@8.11.0': + resolution: {integrity: sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.7.0': - resolution: {integrity: sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==} + '@typescript-eslint/visitor-keys@8.11.0': + resolution: {integrity: sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@uiw/codemirror-extensions-basic-setup@4.23.3': @@ -3644,11 +3644,11 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + eslint-plugin-react-hooks@5.0.0: + resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} engines: {node: '>=10'} peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 eslint-plugin-react-refresh@0.4.12: resolution: {integrity: sha512-9neVjoGv20FwYtCP6CB1dzR1vr57ZDNOXst21wd2xJ/cTlM2xLq0GWVlSNTdMn/4BtP6cHYBMCSp1wFBJ9jBsg==} @@ -8215,7 +8215,7 @@ snapshots: transitivePeerDependencies: - chokidar - '@nestjs/swagger@7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': + '@nestjs/swagger@7.4.2(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)': dependencies: '@microsoft/tsdoc': 0.15.0 '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -8230,7 +8230,7 @@ snapshots: class-transformer: 0.5.1 class-validator: 0.14.1 - '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4)(@nestjs/platform-express@10.4.4)': + '@nestjs/testing@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/core@10.4.4))': dependencies: '@nestjs/common': 10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) '@nestjs/core': 10.4.4(@nestjs/common@10.4.4(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1))(@nestjs/platform-express@10.4.4)(reflect-metadata@0.1.14)(rxjs@7.8.1) @@ -9086,14 +9086,14 @@ snapshots: '@types/node': 20.16.6 optional: true - '@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2)': + '@typescript-eslint/eslint-plugin@8.11.0(@typescript-eslint/parser@8.11.0(eslint@9.11.1)(typescript@5.6.2))(eslint@9.11.1)(typescript@5.6.2)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.7.0(eslint@9.11.1)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/type-utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/parser': 8.11.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/type-utils': 8.11.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/utils': 8.11.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.11.0 eslint: 9.11.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -9104,12 +9104,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.7.0(eslint@9.11.1)(typescript@5.6.2)': + '@typescript-eslint/parser@8.11.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.2) + '@typescript-eslint/visitor-keys': 8.11.0 debug: 4.3.7 eslint: 9.11.1 optionalDependencies: @@ -9117,15 +9117,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.7.0': + '@typescript-eslint/scope-manager@8.11.0': dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/visitor-keys': 8.11.0 - '@typescript-eslint/type-utils@8.7.0(eslint@9.11.1)(typescript@5.6.2)': + '@typescript-eslint/type-utils@8.11.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) - '@typescript-eslint/utils': 8.7.0(eslint@9.11.1)(typescript@5.6.2) + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.2) + '@typescript-eslint/utils': 8.11.0(eslint@9.11.1)(typescript@5.6.2) debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.2) optionalDependencies: @@ -9134,12 +9134,12 @@ snapshots: - eslint - supports-color - '@typescript-eslint/types@8.7.0': {} + '@typescript-eslint/types@8.11.0': {} - '@typescript-eslint/typescript-estree@8.7.0(typescript@5.6.2)': + '@typescript-eslint/typescript-estree@8.11.0(typescript@5.6.2)': dependencies: - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/visitor-keys': 8.7.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/visitor-keys': 8.11.0 debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 @@ -9151,20 +9151,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.7.0(eslint@9.11.1)(typescript@5.6.2)': + '@typescript-eslint/utils@8.11.0(eslint@9.11.1)(typescript@5.6.2)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.11.1) - '@typescript-eslint/scope-manager': 8.7.0 - '@typescript-eslint/types': 8.7.0 - '@typescript-eslint/typescript-estree': 8.7.0(typescript@5.6.2) + '@typescript-eslint/scope-manager': 8.11.0 + '@typescript-eslint/types': 8.11.0 + '@typescript-eslint/typescript-estree': 8.11.0(typescript@5.6.2) eslint: 9.11.1 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.7.0': + '@typescript-eslint/visitor-keys@8.11.0': dependencies: - '@typescript-eslint/types': 8.7.0 + '@typescript-eslint/types': 8.11.0 eslint-visitor-keys: 3.4.3 '@uiw/codemirror-extensions-basic-setup@4.23.3(@codemirror/autocomplete@6.18.1(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.23.1)(@lezer/common@1.2.1))(@codemirror/commands@6.1.2)(@codemirror/language@6.10.3)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.23.1)': @@ -10092,7 +10092,7 @@ snapshots: optionalDependencies: eslint-config-prettier: 9.1.0(eslint@9.11.1) - eslint-plugin-react-hooks@4.6.2(eslint@9.11.1): + eslint-plugin-react-hooks@5.0.0(eslint@9.11.1): dependencies: eslint: 9.11.1 From f2de864d0a683b0dbc358858e2f26868dba58709 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Fri, 25 Oct 2024 18:35:07 +0900 Subject: [PATCH 08/27] Update `CHANGELOG.md` for `v0.1.17` (#385) --- CHANGELOG.md | 7 +++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 143ab1f8..7c38d807 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.17] - 2024-10-25 + +### Changed + +- Disable devtools by @hackerwins in https://github.com/yorkie-team/codepair/pull/383 +- Activate SourceMap for Sentry and resolve TypeScript version conflict with ESLint by @devleejb in https://github.com/yorkie-team/codepair/pull/384 + ## [0.1.16] - 2024-10-24 ### Changed diff --git a/backend/package.json b/backend/package.json index 12859e31..8f56de82 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.16", + "version": "0.1.17", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 8a8b4c27..87633bfb 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.16", + "version": "0.1.17", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 82ee2ae5..56cff446 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.16", + "version": "0.1.17", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From 5f47edc984f1d3a11b599ec9adbb47a092a10af2 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:30:10 +0900 Subject: [PATCH 09/27] Change default `syncLoopDuration` and Expose `yorkie.Document` (#386) --- frontend/src/hooks/useYorkieDocument.ts | 4 ++++ frontend/src/vite-env.d.ts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/frontend/src/hooks/useYorkieDocument.ts b/frontend/src/hooks/useYorkieDocument.ts index ef73d1d7..60cf4270 100644 --- a/frontend/src/hooks/useYorkieDocument.ts +++ b/frontend/src/hooks/useYorkieDocument.ts @@ -28,9 +28,11 @@ export const useYorkieDocument = ( }, [authStore.accessToken, searchParams]); const createYorkieClient = useCallback(async (yorkieToken: string) => { + const syncLoopDuration = Number(searchParams.get("syncLoopDuration")) || 200; const newClient = new yorkie.Client(YORKIE_API_ADDR, { apiKey: YORKIE_API_KEY, token: yorkieToken, + syncLoopDuration, }); await newClient.activate(); return newClient; @@ -88,6 +90,8 @@ export const useYorkieDocument = ( setClient(newClient); setDoc(newDoc); + // Expose the document to the window for debugging purposes + window.doc = newDoc; } catch (error) { console.error("Error initializing Yorkie: ", error); } diff --git a/frontend/src/vite-env.d.ts b/frontend/src/vite-env.d.ts index 11f02fe2..d8f07b7b 100755 --- a/frontend/src/vite-env.d.ts +++ b/frontend/src/vite-env.d.ts @@ -1 +1,4 @@ /// +interface Window { + doc: CodePairDocType; +} From eb034ea066c26fd69bdfb48bfe2d7dcf24f06b98 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sat, 26 Oct 2024 22:33:51 +0900 Subject: [PATCH 10/27] Update `CHANGELOG.md` for `v0.1.18` (#387) --- CHANGELOG.md | 6 ++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c38d807..13ee4958 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.18] - 2024-10-26 + +### Changed + +- Change default `syncLoopDuration` and Expose `yorkie.Document` by @devleejb in https://github.com/yorkie-team/codepair/pull/386 + ## [0.1.17] - 2024-10-25 ### Changed diff --git a/backend/package.json b/backend/package.json index 8f56de82..fe352d85 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.17", + "version": "0.1.18", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 87633bfb..00177306 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.17", + "version": "0.1.18", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 56cff446..0a435719 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.17", + "version": "0.1.18", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From 34f52c9b259d3a2762b5d75db132e9051d46202f Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:24:57 +0900 Subject: [PATCH 11/27] Disable model checking when intelligence is `false` (#388) --- backend/src/langchain/langchain.module.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/backend/src/langchain/langchain.module.ts b/backend/src/langchain/langchain.module.ts index 712c3b1c..73b159fe 100644 --- a/backend/src/langchain/langchain.module.ts +++ b/backend/src/langchain/langchain.module.ts @@ -8,6 +8,9 @@ const chatModelFactory = { provide: "ChatModel", useFactory: (configService: ConfigService) => { const modelType = configService.get("YORKIE_INTELLIGENCE"); + + if (modelType === "false") return null; + try { // Split the modelType string into provider and model // ex) "ollama:gemma2:2b" => ["ollama", "gemma2:2b"] From c7b927fbca25c41145cfd28a06abc9813e424640 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:28:45 +0900 Subject: [PATCH 12/27] Update `CHANGELOG.md` for `v0.1.19` (#389) --- CHANGELOG.md | 6 ++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13ee4958..ac03c0ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.19] - 2024-10-28 + +### Fixed + +- Disable model checking when intelligence is `false` by @devleejb in https://github.com/yorkie-team/codepair/pull/388 + ## [0.1.18] - 2024-10-26 ### Changed diff --git a/backend/package.json b/backend/package.json index fe352d85..fff3ec91 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.18", + "version": "0.1.19", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 00177306..637787e2 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.18", + "version": "0.1.19", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 0a435719..e0fada22 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.18", + "version": "0.1.19", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From cc42135c18f7655159706f08b1bb224014eec2dc Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:00:03 +0900 Subject: [PATCH 13/27] Fix ESLint Rules to Ensure Proper Code Compliance (#392) * Add lint rules * Fix backend lint * Fix frontend lint --- backend/eslint.config.mjs | 2 ++ .../src/documents/documents.service.spec.ts | 2 -- backend/src/documents/documents.service.ts | 4 ++-- backend/src/files/files.service.ts | 4 ++-- .../workspace-documents.service.ts | 10 ++++---- .../workspace-users.service.ts | 2 +- backend/src/workspaces/workspaces.service.ts | 8 +++---- frontend/eslint.config.mjs | 4 +++- .../components/modals/ChangeNicknameModal.tsx | 2 +- frontend/src/components/modals/ShareModal.tsx | 2 +- frontend/src/hooks/useYorkieDocument.ts | 23 +++++++++++-------- 11 files changed, 34 insertions(+), 29 deletions(-) diff --git a/backend/eslint.config.mjs b/backend/eslint.config.mjs index 990d0140..53a931cb 100644 --- a/backend/eslint.config.mjs +++ b/backend/eslint.config.mjs @@ -20,6 +20,8 @@ export default [ prettier: prettierPlugin, }, rules: { + ...typescriptPlugin.configs.recommended.rules, + ...prettierPlugin.configs.recommended.rules, "@typescript-eslint/interface-name-prefix": "off", "@typescript-eslint/explicit-function-return-type": "off", "@typescript-eslint/explicit-module-boundary-types": "off", diff --git a/backend/src/documents/documents.service.spec.ts b/backend/src/documents/documents.service.spec.ts index d2d34123..188273ea 100644 --- a/backend/src/documents/documents.service.spec.ts +++ b/backend/src/documents/documents.service.spec.ts @@ -32,8 +32,6 @@ describe("DocumentsService", () => { }); it("should be defined", async () => { - prismaService; - expect(documentsService).toBeDefined(); }); diff --git a/backend/src/documents/documents.service.ts b/backend/src/documents/documents.service.ts index dec88286..b38ce35d 100644 --- a/backend/src/documents/documents.service.ts +++ b/backend/src/documents/documents.service.ts @@ -30,7 +30,7 @@ export class DocumentsService { ) { throw new Error(); } - } catch (e) { + } catch { throw new UnauthorizedException("Invalid sharing token"); } @@ -42,7 +42,7 @@ export class DocumentsService { id: documentId, }, }); - } catch (e) { + } catch { throw new NotFoundException("Document not found"); } diff --git a/backend/src/files/files.service.ts b/backend/src/files/files.service.ts index 6c378d59..cc47bb2a 100644 --- a/backend/src/files/files.service.ts +++ b/backend/src/files/files.service.ts @@ -45,7 +45,7 @@ export class FilesService { id: workspaceId, }, }); - } catch (e) { + } catch { throw new UnauthorizedException("Client unauthorized."); } @@ -74,7 +74,7 @@ export class FilesService { Key: fileKey, }); return getSignedUrl(this.s3Client, command, { expiresIn: 3600 }); - } catch (e) { + } catch { throw new NotFoundException("File not found."); } } diff --git a/backend/src/workspace-documents/workspace-documents.service.ts b/backend/src/workspace-documents/workspace-documents.service.ts index 1b100674..f44dd749 100644 --- a/backend/src/workspace-documents/workspace-documents.service.ts +++ b/backend/src/workspace-documents/workspace-documents.service.ts @@ -30,7 +30,7 @@ export class WorkspaceDocumentsService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "The workspace does not exist, or the user lacks the appropriate permissions." ); @@ -50,7 +50,7 @@ export class WorkspaceDocumentsService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "The workspace does not exist, or the user lacks the appropriate permissions." ); @@ -78,7 +78,7 @@ export class WorkspaceDocumentsService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "The workspace does not exist, or the user lacks the appropriate permissions." ); @@ -146,7 +146,7 @@ export class WorkspaceDocumentsService { }, }); return document; - } catch (e) { + } catch { throw new NotFoundException( "The workspace or document does not exist, or the user lacks the appropriate permissions." ); @@ -176,7 +176,7 @@ export class WorkspaceDocumentsService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "The workspace or document does not exist, or the user lacks the appropriate permissions." ); diff --git a/backend/src/workspace-users/workspace-users.service.ts b/backend/src/workspace-users/workspace-users.service.ts index dd2ff0bc..0489ced1 100644 --- a/backend/src/workspace-users/workspace-users.service.ts +++ b/backend/src/workspace-users/workspace-users.service.ts @@ -20,7 +20,7 @@ export class WorkspaceUsersService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "The workspace does not exist, or the user lacks the appropriate permissions." ); diff --git a/backend/src/workspaces/workspaces.service.ts b/backend/src/workspaces/workspaces.service.ts index 6d9a6cce..f011f043 100644 --- a/backend/src/workspaces/workspaces.service.ts +++ b/backend/src/workspaces/workspaces.service.ts @@ -61,7 +61,7 @@ export class WorkspacesService { }); return foundWorkspace; - } catch (e) { + } catch { throw new NotFoundException( "Workspace not found, or the user lacks the appropriate permissions." ); @@ -114,7 +114,7 @@ export class WorkspacesService { workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException( "Worksapce does not exist, or the user lacks the appropriate permissions." ); @@ -154,7 +154,7 @@ export class WorkspacesService { ) { throw new Error(); } - } catch (err) { + } catch { throw new UnauthorizedException("Invitation token is invalid or expired."); } @@ -164,7 +164,7 @@ export class WorkspacesService { id: workspaceId, }, }); - } catch (e) { + } catch { throw new NotFoundException("The workspace is deleted."); } diff --git a/frontend/eslint.config.mjs b/frontend/eslint.config.mjs index d6c4a63b..f1fd522c 100755 --- a/frontend/eslint.config.mjs +++ b/frontend/eslint.config.mjs @@ -25,7 +25,9 @@ export default [ }, rules: { "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], - "prettier/prettier": "error", + ...reactHooksPlugin.configs.recommended.rules, + ...prettierPlugin.configs.recommended.rules, + ...typescriptPlugin.configs.recommended.rules, }, settings: { react: { diff --git a/frontend/src/components/modals/ChangeNicknameModal.tsx b/frontend/src/components/modals/ChangeNicknameModal.tsx index 2c151809..73472804 100644 --- a/frontend/src/components/modals/ChangeNicknameModal.tsx +++ b/frontend/src/components/modals/ChangeNicknameModal.tsx @@ -5,7 +5,7 @@ import { useMemo, useState } from "react"; import { useDebounce } from "react-use"; import { useUpdateUserNicknameMutation } from "../../hooks/api/user"; -interface ChangeNicknameModalProps extends Omit {} +type ChangeNicknameModalProps = Omit; function ChangeNicknameModal(props: ChangeNicknameModalProps) { const [nickname, setNickname] = useState(""); diff --git a/frontend/src/components/modals/ShareModal.tsx b/frontend/src/components/modals/ShareModal.tsx index 8f94fc57..43069b84 100644 --- a/frontend/src/components/modals/ShareModal.tsx +++ b/frontend/src/components/modals/ShareModal.tsx @@ -23,7 +23,7 @@ import CloseIcon from "@mui/icons-material/Close"; import { useSelector } from "react-redux"; import { selectDocument } from "../../store/documentSlice"; -interface ShareModalProps extends Omit {} +type ShareModalProps = Omit; function ShareModal(props: ShareModalProps) { const { ...modalProps } = props; diff --git a/frontend/src/hooks/useYorkieDocument.ts b/frontend/src/hooks/useYorkieDocument.ts index 60cf4270..300f78dd 100644 --- a/frontend/src/hooks/useYorkieDocument.ts +++ b/frontend/src/hooks/useYorkieDocument.ts @@ -27,16 +27,19 @@ export const useYorkieDocument = ( return shareToken ? `share:${shareToken}` : `default:${authStore.accessToken}`; }, [authStore.accessToken, searchParams]); - const createYorkieClient = useCallback(async (yorkieToken: string) => { - const syncLoopDuration = Number(searchParams.get("syncLoopDuration")) || 200; - const newClient = new yorkie.Client(YORKIE_API_ADDR, { - apiKey: YORKIE_API_KEY, - token: yorkieToken, - syncLoopDuration, - }); - await newClient.activate(); - return newClient; - }, []); + const createYorkieClient = useCallback( + async (yorkieToken: string) => { + const syncLoopDuration = Number(searchParams.get("syncLoopDuration")) || 200; + const newClient = new yorkie.Client(YORKIE_API_ADDR, { + apiKey: YORKIE_API_KEY, + token: yorkieToken, + syncLoopDuration, + }); + await newClient.activate(); + return newClient; + }, + [searchParams] + ); const createYorkieDocument = useCallback( (client: yorkie.Client, yorkieDocumentId: string, presenceName: string) => { From 265c0ea5515493c6f396045e9ba3189b77aa6ef1 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:00:27 +0900 Subject: [PATCH 14/27] Update `yorkie-js-sdk` to `v0.5.4` (#390) --- backend/docker/docker-compose-full.yml | 2 +- backend/docker/docker-compose.yml | 2 +- frontend/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/backend/docker/docker-compose-full.yml b/backend/docker/docker-compose-full.yml index f78c0f80..8dcd2d06 100644 --- a/backend/docker/docker-compose-full.yml +++ b/backend/docker/docker-compose-full.yml @@ -38,7 +38,7 @@ services: - "yorkie:yorkie" yorkie: - image: "yorkieteam/yorkie:0.5.0" + image: "yorkieteam/yorkie:0.5.4" command: ["server", "--enable-pprof"] restart: always ports: diff --git a/backend/docker/docker-compose.yml b/backend/docker/docker-compose.yml index f5c24d5f..29afd18a 100644 --- a/backend/docker/docker-compose.yml +++ b/backend/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.8" services: yorkie: - image: "yorkieteam/yorkie:0.5.0" + image: "yorkieteam/yorkie:0.5.4" command: ["server", "--enable-pprof"] restart: always ports: diff --git a/frontend/package.json b/frontend/package.json index 637787e2..cb8083af 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -77,7 +77,7 @@ "remark-math": "^6.0.0", "validator": "^13.12.0", "vite-plugin-package-version": "^1.1.0", - "yorkie-js-sdk": "0.5.3" + "yorkie-js-sdk": "0.5.4" }, "devDependencies": { "@sentry/vite-plugin": "^2.20.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6255aa37..32c4d30a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -334,8 +334,8 @@ importers: specifier: ^1.1.0 version: 1.1.0(vite@5.4.7(@types/node@20.16.6)(terser@5.33.0)) yorkie-js-sdk: - specifier: 0.5.3 - version: 0.5.3 + specifier: 0.5.4 + version: 0.5.4 devDependencies: '@sentry/vite-plugin': specifier: ^2.20.1 @@ -6537,8 +6537,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yorkie-js-sdk@0.5.3: - resolution: {integrity: sha512-psMg/cICvgFeH2FxZ0wKxJpciaKlNq2DhU4eJpdxhn0mv3kuXdDtKev1qJkTk/KXPVW91QMpyLlR9un4akLlGw==} + yorkie-js-sdk@0.5.4: + resolution: {integrity: sha512-D7DwdeyE2/CrVIAva/yHAb8hgp/YdmIdvNpq1J8YlyEjsb9XmCMcsu+dG0vX8+0+JtugOuKxoF5Kq7B7WaI71w==} engines: {node: '>=18.0.0', npm: '>=7.1.0'} zod-to-json-schema@3.23.3: @@ -13599,7 +13599,7 @@ snapshots: yocto-queue@0.1.0: {} - yorkie-js-sdk@0.5.3: + yorkie-js-sdk@0.5.4: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.5.0(@bufbuild/protobuf@1.10.0) From 20a84cf8268cb4d8744226c1c78d7d72e7a7499a Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Fri, 1 Nov 2024 11:31:37 +0900 Subject: [PATCH 15/27] Add option to toggle Scroll Sync On/Off (#394) * Add scroll sync enable options * Change `themeMode` comparison to strict equality --- .../src/components/editor/DocumentView.tsx | 4 +- frontend/src/components/editor/Editor.tsx | 2 +- .../src/components/headers/DocumentHeader.tsx | 23 ++++++- .../components/popovers/DocumentPopover.tsx | 64 +++++++++++++++++++ .../components/popovers/ProfilePopover.tsx | 2 +- frontend/src/store/configSlice.ts | 8 ++- 6 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 frontend/src/components/popovers/DocumentPopover.tsx diff --git a/frontend/src/components/editor/DocumentView.tsx b/frontend/src/components/editor/DocumentView.tsx index 1209458c..de756adc 100644 --- a/frontend/src/components/editor/DocumentView.tsx +++ b/frontend/src/components/editor/DocumentView.tsx @@ -6,10 +6,12 @@ import { ScrollSync, ScrollSyncPane } from "react-scroll-sync"; import { EditorModeType, selectEditor } from "../../store/editorSlice"; import Editor from "./Editor"; import Preview from "./Preview"; +import { selectConfig } from "../../store/configSlice"; function DocumentView() { const editorStore = useSelector(selectEditor); const windowWidth = useWindowWidth(); + const configStore = useSelector(selectConfig); if (!editorStore.doc || !editorStore.client) return ( @@ -23,7 +25,7 @@ function DocumentView() { {editorStore.mode === EditorModeType.BOTH && ( {({ position: width, separatorProps }) => ( - +
{ diff --git a/frontend/src/components/headers/DocumentHeader.tsx b/frontend/src/components/headers/DocumentHeader.tsx index 1575ffdf..e6a4374f 100644 --- a/frontend/src/components/headers/DocumentHeader.tsx +++ b/frontend/src/components/headers/DocumentHeader.tsx @@ -14,7 +14,7 @@ import { Grid2 as Grid, Typography, } from "@mui/material"; -import { useEffect } from "react"; +import { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { useNavigate } from "react-router-dom"; import { useUserPresence } from "../../hooks/useUserPresence"; @@ -23,11 +23,12 @@ import { selectWorkspace } from "../../store/workspaceSlice"; import { ShareRole } from "../../utils/share"; import DownloadMenu from "../common/DownloadMenu"; import ShareButton from "../common/ShareButton"; -import ThemeButton from "../common/ThemeButton"; import UserPresenceList from "./UserPresenceList"; import { selectDocument } from "../../store/documentSlice"; import { useUpdateDocumentTitleMutation } from "../../hooks/api/workspaceDocument"; import { useSnackbar } from "notistack"; +import DocumentPopover from "../popovers/DocumentPopover"; +import MoreVertIcon from "@mui/icons-material/MoreVert"; function DocumentHeader() { const dispatch = useDispatch(); @@ -42,6 +43,7 @@ function DocumentHeader() { ); const isEditingDisabled = Boolean(editorState.shareRole); const { enqueueSnackbar } = useSnackbar(); + const [moreButtonanchorEl, setMoreButtonAnchorEl] = useState(null); useEffect(() => { if (editorState.shareRole === ShareRole.READ) { @@ -83,6 +85,14 @@ function DocumentHeader() { enqueueSnackbar("The title is changed successfully", { variant: "success" }); }; + const handleMoreButtonClick: React.MouseEventHandler = (e) => { + setMoreButtonAnchorEl(e.currentTarget); + }; + + const handleDocumentMenuClose = () => { + setMoreButtonAnchorEl(null); + }; + return ( @@ -148,7 +158,14 @@ function DocumentHeader() { {!editorState.shareRole && } - + + + + diff --git a/frontend/src/components/popovers/DocumentPopover.tsx b/frontend/src/components/popovers/DocumentPopover.tsx new file mode 100644 index 00000000..bb1fc562 --- /dev/null +++ b/frontend/src/components/popovers/DocumentPopover.tsx @@ -0,0 +1,64 @@ +import { + ListItemIcon, + ListItemText, + MenuItem, + MenuList, + Popover, + PopoverProps, +} from "@mui/material"; +import { useDispatch, useSelector } from "react-redux"; +import { selectConfig, setDisableScrollSync, setTheme, ThemeType } from "../../store/configSlice"; +import { useCurrentTheme } from "../../hooks/useCurrentTheme"; +import DarkModeIcon from "@mui/icons-material/DarkMode"; +import LightModeIcon from "@mui/icons-material/LightMode"; +import ToggleOnIcon from "@mui/icons-material/ToggleOn"; +import ToggleOffIcon from "@mui/icons-material/ToggleOff"; + +function DocumentPopover(props: PopoverProps) { + const dispatch = useDispatch(); + const themeMode = useCurrentTheme(); + const configStore = useSelector(selectConfig); + + const handleChangeTheme = () => { + dispatch(setTheme(themeMode === ThemeType.LIGHT ? ThemeType.DARK : ThemeType.LIGHT)); + }; + + const handleScrollSyncChange = () => { + dispatch(setDisableScrollSync(!configStore.disableScrollSync)); + }; + + return ( + + + + + {themeMode === "light" ? : } + + Appearance + + + + {configStore.disableScrollSync ? ( + + ) : ( + + )} + + Panel Scroll Sync + + + + ); +} + +export default DocumentPopover; diff --git a/frontend/src/components/popovers/ProfilePopover.tsx b/frontend/src/components/popovers/ProfilePopover.tsx index 566f7981..f8c29583 100644 --- a/frontend/src/components/popovers/ProfilePopover.tsx +++ b/frontend/src/components/popovers/ProfilePopover.tsx @@ -32,7 +32,7 @@ function ProfilePopover(props: PopoverProps) { }; const handleChangeTheme = () => { - dispatch(setTheme(themeMode == ThemeType.LIGHT ? ThemeType.DARK : ThemeType.LIGHT)); + dispatch(setTheme(themeMode === ThemeType.LIGHT ? ThemeType.DARK : ThemeType.LIGHT)); }; return ( diff --git a/frontend/src/store/configSlice.ts b/frontend/src/store/configSlice.ts index f4f40a09..8f8c67a1 100644 --- a/frontend/src/store/configSlice.ts +++ b/frontend/src/store/configSlice.ts @@ -17,12 +17,14 @@ export interface ConfigState { theme: ThemeType; drawerOpen: boolean; codeKey: CodeKeyType; + disableScrollSync: boolean; } const initialState: ConfigState = { theme: ThemeType.DEFAULT, drawerOpen: true, codeKey: CodeKeyType.SUBLIME, + disableScrollSync: false, }; export const configSlice = createSlice({ @@ -38,10 +40,14 @@ export const configSlice = createSlice({ setCodeKeyType: (state, action: PayloadAction) => { state.codeKey = action.payload; }, + setDisableScrollSync: (state, action: PayloadAction) => { + state.disableScrollSync = action.payload; + }, }, }); -export const { setTheme, setDrawerOpen, setCodeKeyType } = configSlice.actions; +export const { setTheme, setDrawerOpen, setCodeKeyType, setDisableScrollSync } = + configSlice.actions; export const selectConfig = (state: RootState) => state.config; From a77f30d7e7b6460c8b800a0ba0655957b50ec199 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sun, 3 Nov 2024 23:46:09 +0900 Subject: [PATCH 16/27] Synchronize cursor when the snapshot event is published (#398) --- frontend/src/utils/yorkie/yorkieSync.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/frontend/src/utils/yorkie/yorkieSync.ts b/frontend/src/utils/yorkie/yorkieSync.ts index eec7e022..f3ca8a14 100644 --- a/frontend/src/utils/yorkie/yorkieSync.ts +++ b/frontend/src/utils/yorkie/yorkieSync.ts @@ -53,10 +53,22 @@ class YorkieSyncPluginValue implements cmView.PluginValue { // The text is replaced to snapshot and must be re-synced. const text = this._doc.getRoot().content; - view.dispatch({ + const selection = this._doc.getMyPresence().selection; + const transactionSpec: cmState.TransactionSpec = { changes: { from: 0, to: view.state.doc.length, insert: text.toString() }, annotations: [cmState.Transaction.remote.of(true)], - }); + }; + + if (selection) { + // Restore the cursor position when the text is replaced. + const cursor = text.posRangeToIndexRange(selection); + transactionSpec["selection"] = { + anchor: cursor[0], + head: cursor[1], + }; + } + + view.dispatch(transactionSpec); }); this._doc.update((root) => { From 9e086123493af963ddf760e84d5fa003a05dc1c5 Mon Sep 17 00:00:00 2001 From: changhui lee Date: Mon, 4 Nov 2024 00:31:48 +0900 Subject: [PATCH 17/27] Apply incremental DOM to markdown preview (#397) * feat: Apply incremental dom update * fix: build error * fix: pin incremental-dom version to 0.6.0 --- frontend/package.json | 16 +- frontend/src/components/editor/Preview.tsx | 133 +- frontend/src/components/editor/preview.css | 1251 ++++++++++++++ pnpm-lock.yaml | 1722 ++++++++++++++++++-- 4 files changed, 2888 insertions(+), 234 deletions(-) create mode 100644 frontend/src/components/editor/preview.css diff --git a/frontend/package.json b/frontend/package.json index cb8083af..cc5e2611 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -38,8 +38,8 @@ "@tanstack/react-query": "^5.17.15", "@uiw/codemirror-extensions-basic-setup": "^4.23.2", "@uiw/codemirror-theme-xcode": "^4.21.21", - "@uiw/codemirror-themes": "^4.21.21", "@uiw/react-markdown-preview": "^5.0.7", + "@vscode/markdown-it-katex": "^1.1.0", "axios": "^1.6.5", "browser-image-resizer": "^2.4.1", "clipboardy": "^4.0.0", @@ -49,9 +49,15 @@ "codemirror-toolbar": "^0.0.4", "color": "^4.2.3", "form-data": "^4.0.0", + "hast-util-to-html": "^9.0.3", + "incremental-dom": "^0.6.0", "katex": "^0.16.9", "lib0": "^0.2.88", "lodash": "^4.17.21", + "markdown-it": "^14.1.0", + "markdown-it-incremental-dom": "^2.1.0", + "markdown-it-prism": "^2.3.0", + "markdown-it-sanitizer": "^0.4.3", "match-sorter": "^6.3.3", "moment": "^2.30.1", "notistack": "^3.0.1", @@ -70,11 +76,7 @@ "react-social-login-buttons": "^3.9.1", "react-use": "^17.5.0", "redux-persist": "^6.0.0", - "rehype-external-links": "^3.0.0", - "rehype-katex": "^7.0.1", - "rehype-rewrite": "^4.0.2", - "rehype-sanitize": "^6.0.0", - "remark-math": "^6.0.0", + "refractor": "^4.8.1", "validator": "^13.12.0", "vite-plugin-package-version": "^1.1.0", "yorkie-js-sdk": "0.5.4" @@ -82,8 +84,10 @@ "devDependencies": { "@sentry/vite-plugin": "^2.20.1", "@types/color": "^3.0.6", + "@types/incremental-dom": "^0.5.0", "@types/katex": "^0.16.7", "@types/lodash": "^4.14.202", + "@types/markdown-it": "^14.1.2", "@types/node": "^20.14.9", "@types/randomcolor": "^0.5.9", "@types/react": "^18.2.43", diff --git a/frontend/src/components/editor/Preview.tsx b/frontend/src/components/editor/Preview.tsx index 40b5eee8..f5de285a 100644 --- a/frontend/src/components/editor/Preview.tsx +++ b/frontend/src/components/editor/Preview.tsx @@ -1,23 +1,51 @@ import { CircularProgress, Stack } from "@mui/material"; -import MarkdownPreview from "@uiw/react-markdown-preview"; -import katex from "katex"; import "katex/dist/katex.min.css"; -import { useEffect, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useSelector } from "react-redux"; -import rehypeExternalLinks from "rehype-external-links"; -import rehypeKatex from "rehype-katex"; -import { getCodeString } from "rehype-rewrite"; -import rehypeSanitize, { defaultSchema } from "rehype-sanitize"; -import remarkMath from "remark-math"; import { useCurrentTheme } from "../../hooks/useCurrentTheme"; import { selectEditor } from "../../store/editorSlice"; import { addSoftLineBreak } from "../../utils/document"; +import MarkdownIt from "markdown-it"; +import { toHtml } from "hast-util-to-html"; +import markdownItKatex from "@vscode/markdown-it-katex"; +import { refractor } from "refractor"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import markdownItIncrementalDOM from "markdown-it-incremental-dom"; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore +import markdownItSanitizer from "markdown-it-sanitizer"; +import * as IncrementalDOM from "incremental-dom"; import "./editor.css"; +import "./preview.css"; -function Preview() { +const md = new MarkdownIt({ + html: true, + linkify: true, + breaks: true, + highlight: (code: string, lang: string): string => { + try { + return `
${toHtml(
+				// eslint-disable-next-line @typescript-eslint/no-explicit-any
+				refractor.highlight(code, lang) as any
+			)}
`; + } catch (error) { + console.error(`Error highlighting code with language '${lang}':`, error); + return `
${md.utils.escapeHtml(code)}
`; + } + }, +}) + .use(markdownItIncrementalDOM, IncrementalDOM, { + incrementalizeDefaultRules: false, + }) + .use(markdownItKatex) + .use(markdownItSanitizer); + +const Preview = () => { const currentTheme = useCurrentTheme(); const editorStore = useSelector(selectEditor); const [content, setContent] = useState(""); + const containerRef = useRef(null); useEffect(() => { if (!editorStore.doc) return; @@ -30,89 +58,42 @@ function Preview() { updatePreviewContent(); - const unsubsribe = editorStore.doc.subscribe("$.content", () => { + const unsubscribe = editorStore.doc.subscribe("$.content", () => { updatePreviewContent(); }); return () => { - unsubsribe(); + unsubscribe(); setContent(""); }; }, [editorStore.doc]); - if (!editorStore?.doc) + useEffect(() => { + if (containerRef.current == null) { + return; + } + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + IncrementalDOM.patch(containerRef.current, md.renderToIncrementalDOM(content)); + }, [content]); + + if (!editorStore?.doc) { return ( ); + } return ( - { - // https://www.npmjs.com/package/@uiw/react-markdown-preview#support-custom-katex-preview - if (typeof children === "string" && /^\$\$(.*)\$\$/.test(children)) { - const html = katex.renderToString(children.replace(/^\$\$(.*)\$\$/, "$1"), { - throwOnError: false, - }); - return ( - - ); - } - const code = - props.node && props.node.children - ? getCodeString(props.node.children) - : children; - if ( - typeof code === "string" && - typeof className === "string" && - /^language-katex/.test(className.toLocaleLowerCase()) - ) { - const html = katex.renderToString(code, { - throwOnError: false, - }); - return ( - - ); - } - return {children}; - }, - }} +
); -} +}; export default Preview; diff --git a/frontend/src/components/editor/preview.css b/frontend/src/components/editor/preview.css new file mode 100644 index 00000000..66210565 --- /dev/null +++ b/frontend/src/components/editor/preview.css @@ -0,0 +1,1251 @@ +@media (prefers-color-scheme: dark) { + .markdown-preview { + color-scheme: dark; + --color-prettylights-syntax-comment: #8b949e; + --color-prettylights-syntax-constant: #79c0ff; + --color-prettylights-syntax-entity: #d2a8ff; + --color-prettylights-syntax-storage-modifier-import: #c9d1d9; + --color-prettylights-syntax-entity-tag: #7ee787; + --color-prettylights-syntax-keyword: #ff7b72; + --color-prettylights-syntax-string: #a5d6ff; + --color-prettylights-syntax-variable: #ffa657; + --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; + --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; + --color-prettylights-syntax-invalid-illegal-bg: #8e1519; + --color-prettylights-syntax-carriage-return-text: #f0f6fc; + --color-prettylights-syntax-carriage-return-bg: #b62324; + --color-prettylights-syntax-string-regexp: #7ee787; + --color-prettylights-syntax-markup-list: #f2cc60; + --color-prettylights-syntax-markup-heading: #1f6feb; + --color-prettylights-syntax-markup-italic: #c9d1d9; + --color-prettylights-syntax-markup-bold: #c9d1d9; + --color-prettylights-syntax-markup-deleted-text: #ffdcd7; + --color-prettylights-syntax-markup-deleted-bg: #67060c; + --color-prettylights-syntax-markup-inserted-text: #aff5b4; + --color-prettylights-syntax-markup-inserted-bg: #033a16; + --color-prettylights-syntax-markup-changed-text: #ffdfb6; + --color-prettylights-syntax-markup-changed-bg: #5a1e02; + --color-prettylights-syntax-markup-ignored-text: #c9d1d9; + --color-prettylights-syntax-markup-ignored-bg: #1158c7; + --color-prettylights-syntax-meta-diff-range: #d2a8ff; + --color-prettylights-syntax-brackethighlighter-angle: #8b949e; + --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; + --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; + --color-fg-default: #c9d1d9; + --color-fg-muted: #8b949e; + --color-fg-subtle: #484f58; + --color-canvas-default: #0d1117; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgba(110, 118, 129, 0.4); + --color-accent-fg: #58a6ff; + --color-accent-emphasis: #1f6feb; + --color-attention-subtle: rgba(187, 128, 9, 0.15); + --color-danger-fg: #f85149; + --color-danger-emphasis: #da3633; + --color-attention-fg: #d29922; + --color-attention-emphasis: #9e6a03; + --color-done-fg: #a371f7; + --color-done-emphasis: #8957e5; + --color-success-fg: #3fb950; + --color-success-emphasis: #238636; + --color-copied-active-bg: #2e9b33; + } +} + +@media (prefers-color-scheme: light) { + .markdown-preview { + color-scheme: light; + --color-prettylights-syntax-comment: #6e7781; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #8250df; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-fg-default: #24292f; + --color-fg-muted: #57606a; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsla(210, 18%, 87%, 1); + --color-neutral-muted: rgba(175, 184, 193, 0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #d1242f; + --color-danger-emphasis: #cf222e; + --color-attention-fg: #9a6700; + --color-attention-emphasis: #9a6700; + --color-done-fg: #8250df; + --color-done-emphasis: #8250df; + --color-success-fg: #1a7f37; + --color-success-emphasis: #1f883d; + --color-copied-active-bg: #2e9b33; + } +} + +[data-color-mode*="dark"] .markdown-preview, +.markdown-preview[data-color-mode*="dark"], +body[data-color-mode*="dark"] { + color-scheme: dark; + --color-prettylights-syntax-comment: #8b949e; + --color-prettylights-syntax-constant: #79c0ff; + --color-prettylights-syntax-entity: #d2a8ff; + --color-prettylights-syntax-storage-modifier-import: #c9d1d9; + --color-prettylights-syntax-entity-tag: #7ee787; + --color-prettylights-syntax-keyword: #ff7b72; + --color-prettylights-syntax-string: #a5d6ff; + --color-prettylights-syntax-variable: #ffa657; + --color-prettylights-syntax-brackethighlighter-unmatched: #f85149; + --color-prettylights-syntax-invalid-illegal-text: #f0f6fc; + --color-prettylights-syntax-invalid-illegal-bg: #8e1519; + --color-prettylights-syntax-carriage-return-text: #f0f6fc; + --color-prettylights-syntax-carriage-return-bg: #b62324; + --color-prettylights-syntax-string-regexp: #7ee787; + --color-prettylights-syntax-markup-list: #f2cc60; + --color-prettylights-syntax-markup-heading: #1f6feb; + --color-prettylights-syntax-markup-italic: #c9d1d9; + --color-prettylights-syntax-markup-bold: #c9d1d9; + --color-prettylights-syntax-markup-deleted-text: #ffdcd7; + --color-prettylights-syntax-markup-deleted-bg: #67060c; + --color-prettylights-syntax-markup-inserted-text: #aff5b4; + --color-prettylights-syntax-markup-inserted-bg: #033a16; + --color-prettylights-syntax-markup-changed-text: #ffdfb6; + --color-prettylights-syntax-markup-changed-bg: #5a1e02; + --color-prettylights-syntax-markup-ignored-text: #c9d1d9; + --color-prettylights-syntax-markup-ignored-bg: #1158c7; + --color-prettylights-syntax-meta-diff-range: #d2a8ff; + --color-prettylights-syntax-brackethighlighter-angle: #8b949e; + --color-prettylights-syntax-sublimelinter-gutter-mark: #484f58; + --color-prettylights-syntax-constant-other-reference-link: #a5d6ff; + --color-fg-default: #c9d1d9; + --color-fg-muted: #8b949e; + --color-fg-subtle: #484f58; + --color-canvas-default: #0d1117; + --color-canvas-subtle: #161b22; + --color-border-default: #30363d; + --color-border-muted: #21262d; + --color-neutral-muted: rgba(110, 118, 129, 0.4); + --color-accent-fg: #58a6ff; + --color-accent-emphasis: #1f6feb; + --color-attention-subtle: rgba(187, 128, 9, 0.15); + --color-danger-fg: #f85149; +} + +[data-color-mode*="light"] .markdown-preview, +.markdown-preview[data-color-mode*="light"], +body[data-color-mode*="light"] { + color-scheme: light; + --color-prettylights-syntax-comment: #6e7781; + --color-prettylights-syntax-constant: #0550ae; + --color-prettylights-syntax-entity: #8250df; + --color-prettylights-syntax-storage-modifier-import: #24292f; + --color-prettylights-syntax-entity-tag: #116329; + --color-prettylights-syntax-keyword: #cf222e; + --color-prettylights-syntax-string: #0a3069; + --color-prettylights-syntax-variable: #953800; + --color-prettylights-syntax-brackethighlighter-unmatched: #82071e; + --color-prettylights-syntax-invalid-illegal-text: #f6f8fa; + --color-prettylights-syntax-invalid-illegal-bg: #82071e; + --color-prettylights-syntax-carriage-return-text: #f6f8fa; + --color-prettylights-syntax-carriage-return-bg: #cf222e; + --color-prettylights-syntax-string-regexp: #116329; + --color-prettylights-syntax-markup-list: #3b2300; + --color-prettylights-syntax-markup-heading: #0550ae; + --color-prettylights-syntax-markup-italic: #24292f; + --color-prettylights-syntax-markup-bold: #24292f; + --color-prettylights-syntax-markup-deleted-text: #82071e; + --color-prettylights-syntax-markup-deleted-bg: #ffebe9; + --color-prettylights-syntax-markup-inserted-text: #116329; + --color-prettylights-syntax-markup-inserted-bg: #dafbe1; + --color-prettylights-syntax-markup-changed-text: #953800; + --color-prettylights-syntax-markup-changed-bg: #ffd8b5; + --color-prettylights-syntax-markup-ignored-text: #eaeef2; + --color-prettylights-syntax-markup-ignored-bg: #0550ae; + --color-prettylights-syntax-meta-diff-range: #8250df; + --color-prettylights-syntax-brackethighlighter-angle: #57606a; + --color-prettylights-syntax-sublimelinter-gutter-mark: #8c959f; + --color-prettylights-syntax-constant-other-reference-link: #0a3069; + --color-fg-default: #24292f; + --color-fg-muted: #57606a; + --color-fg-subtle: #6e7781; + --color-canvas-default: #ffffff; + --color-canvas-subtle: #f6f8fa; + --color-border-default: #d0d7de; + --color-border-muted: hsla(210, 18%, 87%, 1); + --color-neutral-muted: rgba(175, 184, 193, 0.2); + --color-accent-fg: #0969da; + --color-accent-emphasis: #0969da; + --color-attention-subtle: #fff8c5; + --color-danger-fg: #cf222e; +} + +.markdown-preview { + -webkit-text-size-adjust: 100%; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, + sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + line-height: 1.5; + word-wrap: break-word; + color: var(--color-fg-default); + background-color: transparent; +} + +.markdown-preview { + details, + figcaption, + figure { + display: block; + } + summary { + display: list-item; + } + + [hidden] { + display: none !important; + } + + a { + background-color: transparent; + color: var(--color-accent-fg); + text-decoration: none; + &:active, + &:hover { + outline-width: 0; + } + } + + abbr[title] { + border-bottom: none; + text-decoration: underline dotted; + } + b, + strong { + font-weight: 600; + } + + dfn { + font-style: italic; + } + + h1 { + margin: 0.67em 0; + font-weight: 600; + padding-bottom: 0.3em; + font-size: 2em; + border-bottom: 1px solid var(--color-border-muted); + } + + mark { + background-color: var(--color-attention-subtle); + color: var(--color-text-primary); + } + + small { + font-size: 90%; + } + + sub, + sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + + sub { + bottom: -0.25em; + } + + sup { + top: -0.5em; + } + + img { + display: inline-block; + border-style: none; + max-width: 100%; + box-sizing: content-box; + background-color: var(--color-canvas-default); + } + + code, + kbd, + pre, + samp { + font-family: monospace, monospace; + font-size: 1em; + } + + figure { + margin: 1em 40px; + } + + hr { + box-sizing: content-box; + overflow: hidden; + background: transparent; + border: 0; + border-bottom: 1px solid var(--color-border-muted); + height: 0.25em; + padding: 0; + margin: 24px 0; + background-color: var(--color-border-default); + } + input { + font: inherit; + margin: 0; + overflow: visible; + font-family: inherit; + font-size: inherit; + line-height: inherit; + } + + [type="button"], + [type="reset"], + [type="submit"] { + -webkit-appearance: button; + } + + [type="button"]::-moz-focus-inner, + [type="reset"]::-moz-focus-inner, + [type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; + } + + [type="button"]:-moz-focusring, + [type="reset"]:-moz-focusring, + [type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; + } + + [type="checkbox"], + [type="radio"] { + box-sizing: border-box; + padding: 0; + } + [type="number"]::-webkit-inner-spin-button, + [type="number"]::-webkit-outer-spin-button { + height: auto; + } + + [type="search"] { + -webkit-appearance: textfield; + outline-offset: -2px; + } + + [type="search"]::-webkit-search-cancel-button, + [type="search"]::-webkit-search-decoration { + -webkit-appearance: none; + } + + ::-webkit-input-placeholder { + color: inherit; + opacity: 0.54; + } + + ::-webkit-file-upload-button { + -webkit-appearance: button; + font: inherit; + } + + a:hover { + text-decoration: underline; + } + + hr { + &::before { + display: table; + content: ""; + } + + &::after { + display: table; + clear: both; + content: ""; + } + } + table { + border-spacing: 0; + border-collapse: collapse; + display: block; + width: max-content; + max-width: 100%; + } + + td, + th { + padding: 0; + } + + details summary { + cursor: pointer; + } + + details:not([open]) > *:not(summary) { + display: none !important; + } + + kbd { + display: inline-block; + padding: 3px 5px; + font: + 11px ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); + } + + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; + } + + td, + th { + padding: 0; + } + + details summary { + cursor: pointer; + } + + details:not([open]) > *:not(summary) { + display: none !important; + } + + kbd { + display: inline-block; + padding: 3px 5px; + font: + 11px ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + line-height: 10px; + color: var(--color-fg-default); + vertical-align: middle; + background-color: var(--color-canvas-subtle); + border: solid 1px var(--color-neutral-muted); + border-bottom-color: var(--color-neutral-muted); + border-radius: 6px; + box-shadow: inset 0 -1px 0 var(--color-neutral-muted); + } + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 24px; + margin-bottom: 16px; + font-weight: 600; + line-height: 1.25; + } + + h2 { + font-weight: 600; + padding-bottom: 0.3em; + font-size: 1.5em; + border-bottom: 1px solid var(--color-border-muted); + } + + h3 { + font-weight: 600; + font-size: 1.25em; + } + + h4 { + font-weight: 600; + font-size: 1em; + } + + h5 { + font-weight: 600; + font-size: 0.875em; + } + + h6 { + font-weight: 600; + font-size: 0.85em; + color: var(--color-fg-muted); + } + p { + margin-top: 0; + margin-bottom: 10px; + } + + blockquote { + margin: 0; + padding: 0 1em; + color: var(--color-fg-muted); + border-left: 0.25em solid var(--color-border-default); + } + + ul, + ol { + margin-top: 0; + margin-bottom: 0; + padding-left: 2em; + } + + ol ol, + ul ol { + list-style-type: lower-roman; + } + + ul ul ol, + ul ol ol, + ol ul ol, + ol ol ol { + list-style-type: lower-alpha; + } + + dd { + margin-left: 0; + } + + tt, + code { + font-family: + ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + font-size: 12px; + } + pre { + margin-top: 0; + margin-bottom: 0; + font-family: + ui-monospace, + SFMono-Regular, + SF Mono, + Menlo, + Consolas, + Liberation Mono, + monospace; + font-size: 12px; + word-wrap: normal; + } + + .octicon { + display: inline-block; + overflow: visible !important; + vertical-align: text-bottom; + fill: currentColor; + } + + ::placeholder { + color: var(--color-fg-subtle); + opacity: 1; + } + + input::-webkit-outer-spin-button, + input::-webkit-inner-spin-button { + margin: 0; + -webkit-appearance: none; + appearance: none; + } + [data-catalyst] { + display: block; + } + + &::before { + display: table; + content: ""; + } + + &::after { + display: table; + clear: both; + content: ""; + } + + & > *:first-child { + margin-top: 0 !important; + } + + & > *:last-child { + margin-bottom: 0 !important; + } + + a:not([href]) { + color: inherit; + text-decoration: none; + } + + .absent { + color: var(--color-danger-fg); + } + + a.anchor { + float: left; + padding-right: 4px; + margin-left: -20px; + line-height: 1; + } + + .anchor:focus { + outline: none; + } + + p, + blockquote, + ul, + ol, + dl, + table, + pre, + details { + margin-top: 0; + margin-bottom: 16px; + } + + blockquote > :first-child { + margin-top: 0; + } + + blockquote > :last-child { + margin-bottom: 0; + } + + sup > a::before { + content: "["; + } + + sup > a::after { + content: "]"; + } + h1 .octicon-link, + h2 .octicon-link, + h3 .octicon-link, + h4 .octicon-link, + h5 .octicon-link, + h6 .octicon-link { + color: var(--color-fg-default); + vertical-align: middle; + visibility: hidden; + } + + h1:hover .anchor, + h2:hover .anchor, + h3:hover .anchor, + h4:hover .anchor, + h5:hover .anchor, + h6:hover .anchor { + text-decoration: none; + } + + h1:hover .anchor .octicon-link, + h2:hover .anchor .octicon-link, + h3:hover .anchor .octicon-link, + h4:hover .anchor .octicon-link, + h5:hover .anchor .octicon-link, + h6:hover .anchor .octicon-link { + visibility: visible; + } + + h1 tt, + h1 code, + h2 tt, + h2 code, + h3 tt, + h3 code, + h4 tt, + h4 code, + h5 tt, + h5 code, + h6 tt, + h6 code { + padding: 0 0.2em; + font-size: inherit; + } + ul.no-list, + ol.no-list { + padding: 0; + list-style-type: none; + } + + ol[type="1"] { + list-style-type: decimal; + } + + ol[type="a"] { + list-style-type: lower-alpha; + } + + ol[type="i"] { + list-style-type: lower-roman; + } + + div > ol:not([type]) { + list-style-type: decimal; + } + + ul ul, + ul ol, + ol ol, + ol ul { + margin-top: 0; + margin-bottom: 0; + } + + li > p { + margin-top: 16px; + } + + li + li { + margin-top: 0.25em; + } + + dl { + padding: 0; + } + + dl dt { + padding: 0; + margin-top: 16px; + font-size: 1em; + font-style: italic; + font-weight: 600; + } + + dl dd { + padding: 0 16px; + margin-bottom: 16px; + } + + table th { + font-weight: 600; + } + table th, + table td { + padding: 6px 13px; + border: 1px solid var(--color-border-default); + } + + table tr { + background-color: var(--color-canvas-default); + border-top: 1px solid var(--color-border-muted); + } + + table tr:nth-child(2n) { + background-color: var(--color-canvas-subtle); + } + + table img { + background-color: transparent; + } + + img[align="right"] { + padding-left: 20px; + } + + img[align="left"] { + padding-right: 20px; + } + .emoji { + max-width: none; + vertical-align: text-top; + background-color: transparent; + } + + span.frame { + display: block; + overflow: hidden; + } + + span.frame > span { + display: block; + float: left; + width: auto; + padding: 7px; + margin: 13px 0 0; + overflow: hidden; + border: 1px solid var(--color-border-default); + } + + span.frame span img { + display: block; + float: left; + } + + span.frame span span { + display: block; + padding: 5px 0 0; + clear: both; + color: var(--color-fg-default); + } + + span.align-center { + display: block; + overflow: hidden; + clear: both; + } + + span.align-center > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: center; + } + + span.align-center span img { + margin: 0 auto; + text-align: center; + } + + span.align-right { + display: block; + overflow: hidden; + clear: both; + > span { + display: block; + margin: 13px 0 0; + overflow: hidden; + text-align: right; + } + span img { + margin: 0; + text-align: right; + } + } + + span.float-left { + display: block; + float: left; + margin-right: 13px; + overflow: hidden; + span { + margin: 13px 0 0; + } + } + + span.float-right { + display: block; + float: right; + margin-left: 13px; + overflow: hidden; + } + + span.float-right > span { + display: block; + margin: 13px auto 0; + overflow: hidden; + text-align: right; + } + + code, + tt { + padding: 0.2em 0.4em; + margin: 0; + font-size: 85%; + background-color: var(--color-neutral-muted); + border-radius: 6px; + } + + code br, + tt br { + display: none; + } + + del code { + text-decoration: inherit; + } + + pre code { + font-size: 100%; + } + + pre > code { + padding: 0; + margin: 0; + word-break: normal; + white-space: pre; + background: transparent; + border: 0; + } + + pre { + font-size: 85%; + line-height: 1.45; + background-color: var(--color-canvas-subtle); + border-radius: 6px; + } + + pre code, + pre tt { + display: inline; + max-width: auto; + padding: 0; + margin: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + background-color: transparent; + border: 0; + } + pre > code { + padding: 16px; + overflow: auto; + display: block; + &::-webkit-scrollbar { + background: transparent; + width: 8px; + height: 8px; + } + &::-webkit-scrollbar-thumb { + background: var(--color-fg-muted); + border-radius: 10px; + } + } +} + +.markdown-preview { + .csv-data { + td, + th { + padding: 5px; + overflow: hidden; + font-size: 12px; + line-height: 1; + text-align: left; + white-space: nowrap; + } + + .blob-num { + padding: 10px 8px 9px; + text-align: right; + background: var(--color-canvas-default); + border: 0; + } + + tr { + border-top: 0; + } + + th { + font-weight: 600; + background: var(--color-canvas-subtle); + border-top: 0; + } + } +} + +.markdown-preview { + .footnotes { + font-size: 12px; + color: var(--color-fg-muted); + border-top: 1px solid var(--color-border-default); + + ol { + padding-left: 16px; + } + + li { + position: relative; + &:target::before { + position: absolute; + top: -8px; + right: -8px; + bottom: -8px; + left: -24px; + pointer-events: none; + content: ""; + border: 2px solid var(--color-accent-emphasis); + border-radius: 6px; + } + &:target { + color: var(--color-fg-default); + } + } + .data-footnote-backref g-emoji { + font-family: monospace; + } + } +} + +.markdown-preview { + .task-list-item { + list-style-type: none; + label { + font-weight: 400; + } + &.enabled label { + cursor: pointer; + } + & + & { + margin-top: 3px; + } + .handle { + display: none; + } + } + .task-list-item-checkbox, + .contains-task-list input[type="checkbox"] { + margin: 0 0.2em 0.25em -1.6em; + vertical-align: middle; + } + .contains-task-list:dir(rtl) .task-list-item-checkbox, + .contains-task-list:dir(rtl) input[type="checkbox"] { + margin: 0 -1.6em 0.25em 0.2em; + } +} + +.markdown-preview ::-webkit-calendar-picker-indicator { + filter: invert(50%); +} + +.markdown-preview { + pre { + position: relative; + .copied { + visibility: hidden; + display: flex; + position: absolute; + cursor: pointer; + color: var(--color-fg-default); + top: 6px; + right: 6px; + border-radius: 5px; + background: var(--color-border-default); + padding: 6px; + font-size: 12px; + transition: all 0.3s; + + .octicon-copy { + display: block; + } + + .octicon-check { + display: none; + } + } + &:hover { + .copied { + visibility: visible; + } + .copied:hover { + background: var(--color-prettylights-syntax-entity-tag); + color: var(--color-canvas-default); + } + } + &:hover .copied:active, + .copied.active { + background: var(--color-copied-active-bg); + color: var(--color-canvas-default); + } + .active { + .octicon-copy { + display: none; + } + + .octicon-check { + display: block; + } + } + } +} + +.markdown-preview { + .markdown-alert { + padding: 0.5rem 1em; + color: inherit; + margin-bottom: 16px; + border-left: 0.25em solid var(--borderColor-default, var(--color-border-default)); + > :last-child { + margin-bottom: 0 !important; + } + .markdown-alert-title { + display: flex; + align-items: center; + line-height: 1; + font-weight: 500; + font-size: 14px; + svg.octicon { + margin-right: var(--base-size-8, 8px) !important; + } + } + &.markdown-alert-note { + border-left-color: var(--borderColor-accent-emphasis, var(--color-accent-emphasis)); + .markdown-alert-title { + color: var(--fgColor-accent, var(--color-accent-fg)); + } + } + &.markdown-alert-tip { + border-left-color: var(--borderColor-success-emphasis, var(--color-success-emphasis)); + .markdown-alert-title { + color: var(--fgColor-success, var(--color-success-fg)); + } + } + &.markdown-alert-important { + border-left-color: var(--borderColor-done-emphasis, var(--color-done-emphasis)); + .markdown-alert-title { + color: var(--fgColor-done, var(--color-done-fg)); + } + } + &.markdown-alert-warning { + border-left-color: var( + --borderColor-attention-emphasis, + var(--color-attention-emphasis) + ); + .markdown-alert-title { + color: var(--fgColor-attention, var(--color-attention-fg)); + } + } + &.markdown-alert-caution { + border-left-color: var(--borderColor-danger-emphasis, var(--color-danger-emphasis)); + .markdown-alert-title { + color: var(--fgColor-danger, var(--color-danger-fg)); + } + } + } +} + +.markdown-preview { + .highlight-line { + background-color: var(--color-neutral-muted); + } + .code-line.line-number::before { + display: inline-block; + width: 1rem; + text-align: right; + margin-right: 16px; + color: var(--color-fg-subtle); + content: attr(line); + white-space: nowrap; + } + + .token.comment, + .token.prolog, + .token.doctype, + .token.cdata { + color: var(--color-prettylights-syntax-comment); + } + .token.namespace { + opacity: 0.7; + } + .token.property, + .token.tag, + .token.selector, + .token.constant, + .token.symbol, + .token.deleted { + color: var(--color-prettylights-syntax-entity-tag); + } + .token.maybe-class-name { + color: var(--color-prettylights-syntax-variable); + } + .token.property-access, + .token.operator, + .token.boolean, + .token.number, + .token.selector .token.class, + .token.attr-name, + .token.string, + .token.char, + .token.builtin { + color: var(--color-prettylights-syntax-constant); + } + + .token.deleted { + color: var(--color-prettylights-syntax-markup-deleted-text); + } + .code-line .token.deleted { + background-color: var(--color-prettylights-syntax-markup-deleted-bg); + } + .token.inserted { + color: var(--color-prettylights-syntax-markup-inserted-text); + } + .code-line .token.inserted { + background-color: var(--color-prettylights-syntax-markup-inserted-bg); + } + + .token.variable { + color: var(--color-prettylights-syntax-constant); + } + .token.entity, + .token.url, + .language-css .token.string, + .style .token.string { + color: var(--color-prettylights-syntax-string); + } + .token.color, + .token.atrule, + .token.attr-value, + .token.function, + .token.class-name { + color: var(--color-prettylights-syntax-string); + } + .token.rule, + .token.regex, + .token.important, + .token.keyword { + color: var(--color-prettylights-syntax-keyword); + } + .token.coord { + color: var(--color-prettylights-syntax-meta-diff-range); + } + .token.important, + .token.bold { + font-weight: bold; + } + .token.italic { + font-style: italic; + } + .token.entity { + cursor: help; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 32c4d30a..b860a13d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -216,12 +216,12 @@ importers: '@uiw/codemirror-theme-xcode': specifier: ^4.21.21 version: 4.23.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.23.1) - '@uiw/codemirror-themes': - specifier: ^4.21.21 - version: 4.23.3(@codemirror/language@6.10.3)(@codemirror/state@6.4.1)(@codemirror/view@6.23.1) '@uiw/react-markdown-preview': specifier: ^5.0.7 version: 5.1.3(@types/react@18.3.8)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vscode/markdown-it-katex': + specifier: ^1.1.0 + version: 1.1.0 axios: specifier: ^1.6.5 version: 1.7.7 @@ -249,6 +249,12 @@ importers: form-data: specifier: ^4.0.0 version: 4.0.0 + hast-util-to-html: + specifier: ^9.0.3 + version: 9.0.3 + incremental-dom: + specifier: ^0.6.0 + version: 0.6.0 katex: specifier: ^0.16.9 version: 0.16.11 @@ -258,6 +264,18 @@ importers: lodash: specifier: ^4.17.21 version: 4.17.21 + markdown-it: + specifier: ^14.1.0 + version: 14.1.0 + markdown-it-incremental-dom: + specifier: ^2.1.0 + version: 2.1.0(incremental-dom@0.6.0)(markdown-it@14.1.0) + markdown-it-prism: + specifier: ^2.3.0 + version: 2.3.0 + markdown-it-sanitizer: + specifier: ^0.4.3 + version: 0.4.3 match-sorter: specifier: ^6.3.3 version: 6.3.4 @@ -312,21 +330,9 @@ importers: redux-persist: specifier: ^6.0.0 version: 6.0.0(react@18.3.1)(redux@5.0.1) - rehype-external-links: - specifier: ^3.0.0 - version: 3.0.0 - rehype-katex: - specifier: ^7.0.1 - version: 7.0.1 - rehype-rewrite: - specifier: ^4.0.2 - version: 4.0.2 - rehype-sanitize: - specifier: ^6.0.0 - version: 6.0.0 - remark-math: - specifier: ^6.0.0 - version: 6.0.0 + refractor: + specifier: ^4.8.1 + version: 4.8.1 validator: specifier: ^13.12.0 version: 13.12.0 @@ -343,12 +349,18 @@ importers: '@types/color': specifier: ^3.0.6 version: 3.0.6 + '@types/incremental-dom': + specifier: ^0.5.0 + version: 0.5.0 '@types/katex': specifier: ^0.16.7 version: 0.16.7 '@types/lodash': specifier: ^4.14.202 version: 4.17.9 + '@types/markdown-it': + specifier: ^14.1.2 + version: 14.1.2 '@types/node': specifier: ^20.14.9 version: 20.16.6 @@ -2594,6 +2606,9 @@ packages: '@types/http-errors@2.0.4': resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + '@types/incremental-dom@0.5.0': + resolution: {integrity: sha512-xvDtvAmjskI7nck3RNFJZveDRbvVBPp+MgynUjkm/OlNMjE6dHQ6P+LvQoC2Ftpup268cctxWfDNPkV/JsW0OA==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -2618,12 +2633,24 @@ packages: '@types/katex@0.16.7': resolution: {integrity: sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==} + '@types/keyv@3.1.4': + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + + '@types/linkify-it@5.0.0': + resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==} + '@types/lodash@4.17.9': resolution: {integrity: sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w==} + '@types/markdown-it@14.1.2': + resolution: {integrity: sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==} + '@types/mdast@4.0.4': resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==} + '@types/mdurl@2.0.0': + resolution: {integrity: sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==} + '@types/methods@1.1.4': resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} @@ -2675,6 +2702,9 @@ packages: '@types/react@18.3.8': resolution: {integrity: sha512-syBUrW3/XpnW4WJ41Pft+I+aPoDVbrBVQGEnbD7NijDGlVC+8gV/XKRY+7vMDlfPpbwYt0l1vd/Sj8bJGMbs9Q==} + '@types/responselike@1.0.3': + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + '@types/retry@0.12.0': resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} @@ -2711,6 +2741,9 @@ packages: '@types/validator@13.12.2': resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} + '@types/webcomponents.js@0.6.39': + resolution: {integrity: sha512-KvyCy5QvadvGeOhiJN0qPxqA8fUPjJq0IKUDbAdT87ElktR8vS1iovIcxRUUwOZKomOgmM47S8Hjuo8jeDbRlA==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -2816,6 +2849,9 @@ packages: peerDependencies: vite: ^4.2.0 || ^5.0.0 + '@vscode/markdown-it-katex@1.1.0': + resolution: {integrity: sha512-9cF2eJpsJOEs2V1cCAoJW/boKz9GQQLvZhNvI030K90z6ZE9lRGc9hDVvKut8zdFO2ObjwylPXXXVYvTdP2O2Q==} + '@webassemblyjs/ast@1.12.1': resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} @@ -2924,14 +2960,33 @@ packages: ajv@8.12.0: resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + ansi-align@2.0.0: + resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} + ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} + ansi-escapes@1.4.0: + resolution: {integrity: sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==} + engines: {node: '>=0.10.0'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + + ansi-regex@3.0.1: + resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} + engines: {node: '>=4'} + + ansi-regex@4.1.1: + resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==} + engines: {node: '>=6'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2940,6 +2995,10 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} + ansi-styles@2.2.1: + resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} + engines: {node: '>=0.10.0'} + ansi-styles@3.2.1: resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} engines: {node: '>=4'} @@ -2972,12 +3031,28 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + array-find-index@1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + array-flatten@1.1.1: resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} array-timsort@1.0.3: resolution: {integrity: sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==} + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -3019,6 +3094,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + babel-runtime@6.26.0: + resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -3064,6 +3142,10 @@ packages: bowser@2.11.0: resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + boxen@1.3.0: + resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} + engines: {node: '>=4'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -3101,6 +3183,10 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + busboy@1.6.0: resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} engines: {node: '>=10.16.0'} @@ -3113,10 +3199,28 @@ packages: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + callsite-record@3.2.2: + resolution: {integrity: sha512-FHsqEtE4Wn8W1ybLiWk0LD1ON4ZmXiL2698ajF0Ul+CpkACqF2lY2N7/3zkk+4NYILLgK4UEnk1pHCnvVDynuA==} + + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase-keys@2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} + + camelcase@2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + + camelcase@4.1.0: + resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} + engines: {node: '>=4'} + camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -3128,9 +3232,17 @@ packages: caniuse-lite@1.0.30001663: resolution: {integrity: sha512-o9C3X27GLKbLeTYZ6HBOLU1tsAcBZsLis28wrVzddShCS16RujjHp9GDHKZqrB3meE0YjhawvMFsGb/igqiPzA==} + capture-stack-trace@1.0.2: + resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} + engines: {node: '>=0.10.0'} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chalk@1.1.3: + resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} + engines: {node: '>=0.10.0'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3180,6 +3292,9 @@ packages: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -3193,10 +3308,22 @@ packages: class-validator@0.14.1: resolution: {integrity: sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==} + cli-boxes@1.0.0: + resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} + engines: {node: '>=0.10.0'} + + cli-cursor@1.0.2: + resolution: {integrity: sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==} + engines: {node: '>=0.10.0'} + cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-spinners@0.1.2: + resolution: {integrity: sha512-t22oC6e068eEBQ86SO3arUtd1ojcA3/lz3Fp2g/oL/lmDlFz/2yD8JHiebeCGYmoAovYpwKq4T64Uq5j+28Q9w==} + engines: {node: '>=0.10.0'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -3205,6 +3332,9 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} + cli-width@2.2.1: + resolution: {integrity: sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -3217,6 +3347,9 @@ packages: resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} engines: {node: '>=18'} + cliui@5.0.0: + resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -3237,6 +3370,10 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + codemirror-markdown-commands@0.0.3: resolution: {integrity: sha512-qrl5UP5sK90N8s5OG3+uG9+nSKWfnUb/2wvvsISyKbzq39E3KaoXGDTX3CGy20vnSmFoULy5EqYu/iXoII+iSQ==} @@ -3308,6 +3445,10 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} + configstore@3.1.5: + resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} + engines: {node: '>=4'} + consola@2.15.3: resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} @@ -3342,6 +3483,10 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + core-js@2.6.12: + resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} + deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. + core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} @@ -3362,6 +3507,10 @@ packages: typescript: optional: true + create-error-class@3.0.2: + resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} + engines: {node: '>=0.10.0'} + create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3373,6 +3522,13 @@ packages: crelt@1.0.6: resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + cross-spawn-async@2.2.5: + resolution: {integrity: sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ==} + deprecated: cross-spawn no longer requires a build toolchain, use it instead + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -3380,6 +3536,10 @@ packages: crypt@0.0.2: resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + crypto-random-string@1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + css-in-js-utils@3.1.0: resolution: {integrity: sha512-fJAcud6B3rRu+KHYk+Bwf+WFL2MDCJJ1XG9x137tJQ0xYxor7XziQtuGFbWNdqrvF4Tk26O3H73nfVqXt/fW1A==} @@ -3405,6 +3565,13 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + currently-unhandled@0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -3446,6 +3613,10 @@ packages: babel-plugin-macros: optional: true + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3464,10 +3635,21 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + depcheck@0.8.3: + resolution: {integrity: sha512-xcLTnaovCFFTts5Ge7mUUhMGHSu6eRfftvVvOjN7gXO5EFUhJfX6UQa1b08a0SIwKfzG9eKNn5mzZlXp0mZARA==} + engines: {node: '>=6'} + hasBin: true + depd@2.0.0: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecate@1.1.1: + resolution: {integrity: sha512-ZGDXefq1xknT292LnorMY5s8UVU08/WKdzDZCUT6t9JzsiMSP4uzUhgpqugffNVcT5WC6wMBiSQ+LFjlv3v7iQ==} + + deps-regex@0.1.4: + resolution: {integrity: sha512-3tzwGYogSJi8HoG93R5x9NrdefZQOXgHgGih/7eivloOq6yC6O+yoFxZnkgP661twvfILONfoKRdF9GQOGx2RA==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -3522,6 +3704,10 @@ packages: domutils@1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dot-prop@4.2.1: + resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} + engines: {node: '>=4'} + dotenv-expand@10.0.0: resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} engines: {node: '>=12'} @@ -3530,6 +3716,9 @@ packages: resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} engines: {node: '>=12'} + duplexer3@0.1.5: + resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -3551,6 +3740,9 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + emoji-regex@7.0.3: + resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -3582,6 +3774,9 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser@1.3.6: + resolution: {integrity: sha512-xhuSYd8wLgOXwNgjcPeXMPL/IiiA1Huck+OPvClpJViVNNlJVtM41o+1emp7bPvlCJwCatFX2DWc05/DgfbWzA==} + error-stack-parser@2.1.4: resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} @@ -3728,6 +3923,14 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + execa@0.2.2: + resolution: {integrity: sha512-zmBGzLd3nhA/NB9P7VLoceAO6vyYPftvl809Vjwe5U2fYI9tYWbeKqP3wZlAw9WS+znnkogf/bhSU+Gcn2NbkQ==} + engines: {node: '>=0.12'} + + execa@0.7.0: + resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} + engines: {node: '>=4'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -3736,10 +3939,18 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + exit-hook@1.1.1: + resolution: {integrity: sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==} + engines: {node: '>=0.10.0'} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3808,6 +4019,10 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + figures@1.7.0: + resolution: {integrity: sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==} + engines: {node: '>=0.10.0'} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3827,9 +4042,20 @@ packages: resolution: {integrity: sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==} engines: {node: '>= 0.8'} + find-parent-dir@0.3.1: + resolution: {integrity: sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==} + find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -3931,6 +4157,14 @@ packages: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} + get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + + get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + get-stream@5.2.0: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} @@ -3946,6 +4180,10 @@ packages: github-slugger@2.0.0: resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + giturl@1.0.3: + resolution: {integrity: sha512-qVDEXufVtYUzYqI5hoDUONh9GCEPi0n+e35KNDafdsNt9fPxB0nvFW/kFiw7W42wkg8TUyhBqb+t24yyaoc87A==} + engines: {node: '>= 0.10.0'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3962,6 +4200,10 @@ packages: engines: {node: '>=16 || 14 >=14.18'} hasBin: true + glob@6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3970,6 +4212,18 @@ packages: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + global-dirs@0.1.1: + resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} + engines: {node: '>=4'} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -3978,6 +4232,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globby@4.1.0: + resolution: {integrity: sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==} + engines: {node: '>=0.10.0'} + goober@2.1.14: resolution: {integrity: sha512-4UpC0NdGyAFqLNPnhCT2iHpza2q+RAY3GV85a/mRPdzyPQMsj0KmMMuetdIkzWRbJ+Hgau1EZztq8ImmiMGhsg==} peerDependencies: @@ -3986,6 +4244,10 @@ packages: gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + got@6.7.1: + resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} + engines: {node: '>=4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3997,6 +4259,10 @@ packages: engines: {node: '>=0.4.7'} hasBin: true + has-ansi@2.0.0: + resolution: {integrity: sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==} + engines: {node: '>=0.10.0'} + has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -4024,12 +4290,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hast-util-from-dom@5.0.0: - resolution: {integrity: sha512-d6235voAp/XR3Hh5uy7aGLbM3S4KamdW0WEgOaU1YoewnuYw4HXb5eRtv9g65m/RFGEfUY1Mw4UqCc5Y8L4Stg==} - - hast-util-from-html-isomorphic@2.0.0: - resolution: {integrity: sha512-zJfpXq44yff2hmE0XmwEOzdWin5xwH+QIhMLOScpX91e/NSGPsAzNCvLQDIEPyO2TXi+lBmU6hjLIhV8MwP2kw==} - hast-util-from-html@2.0.3: resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==} @@ -4054,12 +4314,12 @@ packages: hast-util-raw@9.0.4: resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} - hast-util-sanitize@5.0.1: - resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} - hast-util-select@6.0.2: resolution: {integrity: sha512-hT/SD/d/Meu+iobvgkffo1QecV8WeKWxwsNMzcTJsKw1cKTQKSR/7ArJeURLNJF9HDjp9nVoORyNNJxrvBye8Q==} + hast-util-to-html@9.0.3: + resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} + hast-util-to-jsx-runtime@2.3.0: resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} @@ -4069,9 +4329,6 @@ packages: hast-util-to-string@3.0.0: resolution: {integrity: sha512-OGkAxX1Ua3cbcW6EJ5pT/tslVb90uViVkcJ4ZZIMW/R33DX/AkcJcRrPebPwJkHYwlDHXz4aIwvAAaAdtrACFA==} - hast-util-to-text@4.0.2: - resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==} - hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} @@ -4081,13 +4338,27 @@ packages: hastscript@8.0.0: resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} + highlight-es@1.0.3: + resolution: {integrity: sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + href-content@2.0.3: resolution: {integrity: sha512-ikrAoI1l5ihN5Be2cR9nozFfivVJxPQDpa4+sb6PLt/uaNE/a7A05rHbnJEUduoHddbB3GyT5tdqzXMUmPgJYA==} @@ -4158,6 +4429,10 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-lazy@2.1.0: + resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} + engines: {node: '>=4'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} @@ -4167,6 +4442,13 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + incremental-dom@0.6.0: + resolution: {integrity: sha512-5crhxSjHRK2pWhfHTBf0uZ8QkV5MrCYfn4mwSsrfQdlfpY26KTOBKAO/HgIMgDqQ2MQFms8OnC8hhoP8WR4gqg==} + + indent-string@2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4174,6 +4456,9 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + inline-css@3.0.0: resolution: {integrity: sha512-a+IE7oLaQqeVr3hMviekDDk94LA0+oZX8JEfJuXOm20diZAkOFrq/f/QZCEXpMK6qIbYr0nQNpsuioXQN1ZgXA==} engines: {node: '>=8'} @@ -4184,6 +4469,9 @@ packages: inline-style-prefixer@7.0.1: resolution: {integrity: sha512-lhYo5qNTQp3EvSSp3sRvXMbVQTLrvGV6DycRMJ5dm2BLMiJ30wpXKdDdgX+GmJZ5uQMucwRKHamXSst3Sj/Giw==} + inquirer@0.12.0: + resolution: {integrity: sha512-bOetEz5+/WpgaW4D1NYOk1aD+JCqRjqu/FwRFgnIfiP7FC/zinsrfyO1vlS3nyH/R7S0IH3BIHBu4DBIDSqiGQ==} + inquirer@8.2.6: resolution: {integrity: sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==} engines: {node: '>=12.0.0'} @@ -4196,10 +4484,6 @@ packages: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} engines: {node: '>= 0.10'} - is-absolute-url@4.0.1: - resolution: {integrity: sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - is-alphabetical@2.0.1: resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} @@ -4222,6 +4506,10 @@ packages: is-buffer@1.1.6: resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + is-core-module@2.15.1: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} @@ -4234,10 +4522,25 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true + is-es2016-keyword@1.0.0: + resolution: {integrity: sha512-JtZWPUwjdbQ1LIo9OSZ8MdkWEve198ors27vH+RzUUvZXXZkzXCxFnlUhzWYxy5IexQSRiXVw9j2q/tHMmkVYQ==} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} + is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@2.0.0: + resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} + engines: {node: '>=4'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -4258,14 +4561,30 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-installed-globally@0.1.0: + resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} + engines: {node: '>=4'} + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-npm@1.0.0: + resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} + engines: {node: '>=0.10.0'} + is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@1.0.1: + resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} + engines: {node: '>=0.10.0'} + + is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -4274,6 +4593,18 @@ packages: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-redirect@1.0.0: + resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} + engines: {node: '>=0.10.0'} + + is-retry-allowed@1.2.0: + resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} + engines: {node: '>=0.10.0'} + + is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -4286,6 +4617,13 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + is-wsl@3.1.0: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} @@ -4478,6 +4816,9 @@ packages: js-tiktoken@1.0.14: resolution: {integrity: sha512-Pk3l3WOgM9joguZY2k52+jH82RtABRgB5RdGFZNUGbOKGMVlNmafcPA3b0ITcCZPu1L9UclP1tne6aw7ZI4Myg==} + js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -4728,6 +5069,10 @@ packages: openai: optional: true + latest-version@3.1.0: + resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} + engines: {node: '>=4'} + leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -4756,6 +5101,14 @@ packages: list-stylesheets@1.2.10: resolution: {integrity: sha512-F85Yx9GKLJwDr1T9U34FST5m6iIXhPzqD+MRDsljZsdmoEZwllZBDbkAVaa+EpLKrr6de+P4SRGNHwrWv6zMZA==} + load-json-file@1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + + load-yaml-file@0.1.1: + resolution: {integrity: sha512-G910TofXH7u0NfslAzqv6c9pHpvBzObNOo2hMG0/KUDpdHeFY0wE/fTBMExt0Gb12gg5bXS7Hj6pb0e+xbBXLA==} + engines: {node: '>=4'} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -4763,6 +5116,10 @@ packages: localforage@1.10.0: resolution: {integrity: sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==} + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4854,9 +5211,20 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loud-rejection@1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4864,6 +5232,10 @@ packages: resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} engines: {node: '>=12'} + make-dir@1.3.0: + resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} + engines: {node: '>=4'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -4874,6 +5246,24 @@ packages: makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + markdown-it-incremental-dom@2.1.0: + resolution: {integrity: sha512-dmTobpLZHkRbO57TPCrp0ci8ZJD4Bw6o6RToqgNsAPCSUgN/t/c+HTn/q62+Ox9zBwfU2+837NVjkt37bYnYDQ==} + engines: {node: '>=6.14.4'} + peerDependencies: + incremental-dom: '>=0.5.0' + markdown-it: '>=4.0.0' + + markdown-it-prism@2.3.0: + resolution: {integrity: sha512-ePtHY80gZyeje4bn3R3SL0jpd1C9HFaYffJW2Ma0YD+tspqa2v9TuVwUyFwboFu4jnFNcO8oPQROgbcYJbmBvw==} + engines: {node: '>=6.0.0'} + + markdown-it-sanitizer@0.4.3: + resolution: {integrity: sha512-0Q2ua8+oDN7/3r5UXMnbVq8C+LRfT2pzVKA+h4nXTLEMBFQDwp7qJZOe7DkBa79C7V2cSBXJyScxJ7vYs9kE2w==} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -4919,9 +5309,6 @@ packages: mdast-util-gfm@3.0.0: resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - mdast-util-math@3.0.0: - resolution: {integrity: sha512-Tl9GBNeG/AhJnQM221bJR2HPvLOSnLE/T9cJI9tlc6zwQk2nPk/4f0cHkOdEixQPC/j8UtKDdITswvLAy1OZ1w==} - mdast-util-mdx-expression@2.0.1: resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} @@ -4960,6 +5347,10 @@ packages: resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} engines: {node: '>= 4.0.0'} + meow@3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} + merge-descriptors@1.0.3: resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} @@ -4998,9 +5389,6 @@ packages: micromark-extension-gfm@3.0.0: resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - micromark-extension-math@3.1.0: - resolution: {integrity: sha512-lvEqd+fHjATVs+2v/8kg9i5Q0AP2k85H0WUOwpIVvUML8BapsMvh1XAogmQjOCsLpoKRCVQqEkQBB3NhVBcsOg==} - micromark-factory-destination@2.0.0: resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} @@ -5156,6 +5544,9 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true + mute-stream@0.0.5: + resolution: {integrity: sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==} + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -5213,6 +5604,12 @@ packages: node-releases@2.0.18: resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + node-sass-tilde-importer@1.0.2: + resolution: {integrity: sha512-Swcmr38Y7uB78itQeBm3mThjxBy9/Ah/ykPIaURY/L6Nec9AyRoL/jJ7ECfMR+oZeCTVQNxVMu/aHU+TLRVbdg==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -5227,6 +5624,19 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 + npm-check@5.9.2: + resolution: {integrity: sha512-YlTZGP1A8+Rad5wldGil9STYxgZpZl18X6GZI03f4Ch6qTI1TLHIYM0ISco19qgg8M3UHfooEqMfYOpOkF3AeA==} + engines: {node: '>=0.11.0'} + hasBin: true + + npm-run-path@1.0.0: + resolution: {integrity: sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA==} + engines: {node: '>=0.10.0'} + + npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -5245,6 +5655,10 @@ packages: resolution: {integrity: sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg==} engines: {node: '>=8'} + number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + oauth@0.10.0: resolution: {integrity: sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==} @@ -5266,6 +5680,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@1.1.0: + resolution: {integrity: sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==} + engines: {node: '>=0.10.0'} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} @@ -5290,6 +5708,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@0.2.3: + resolution: {integrity: sha512-MYGyg17e2GcoDlFrAP39zu4nrAQ+STzl4fosWjR8vAlT0a2wKuuAGZTecffdVLPsnEfxXVlrUcDZ1DU5skr+QQ==} + engines: {node: '>=0.10.0'} + ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -5310,6 +5732,10 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -5337,6 +5763,10 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + package-json@4.0.1: + resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} + engines: {node: '>=4'} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5344,6 +5774,10 @@ packages: parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-json@2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -5351,6 +5785,10 @@ packages: parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + parse5@7.1.2: resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} @@ -5377,6 +5815,14 @@ packages: resolution: {integrity: sha512-cPLl+qZpSc+ireUvt+IzqbED1cHHkDoVYMo30jbJIdOOjQ1MQYZBPiNvmi8UM6lJuOpTPXJGZQk0DtC4y61MYQ==} engines: {node: '>= 0.4.0'} + path-exists@2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -5385,6 +5831,17 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + path-is-inside@1.0.2: + resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} + + path-key@1.0.0: + resolution: {integrity: sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==} + engines: {node: '>=0.10.0'} + + path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -5406,6 +5863,10 @@ packages: path-to-regexp@3.3.0: resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} + path-type@1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -5430,14 +5891,37 @@ packages: resolution: {integrity: sha512-xUXwsxNjwTQ8K3GnT4pCJm+xq3RUPQbmkYJTP5aFIfNIvbcc/4MUxgBaaRSZJ6yGJZiGSyYlM6MzwTsRk8SYCg==} engines: {node: '>=12'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + pirates@4.0.6: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-dir@1.0.0: + resolution: {integrity: sha512-c6pv3OE78mcZ92ckebVDqg0aWSoKhOTbwCV6qbCWMk546mAL9pZln0+QsN/yQ7fkucd4+yJPLrCBXNt8Ruk+Eg==} + engines: {node: '>=0.10.0'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} + please-upgrade-node@3.2.0: + resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} + pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -5446,10 +5930,18 @@ packages: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} engines: {node: ^10 || ^12 || >=14} + preferred-pm@1.0.1: + resolution: {integrity: sha512-9Uxgin5Xnsl67DBvlNFsmDIlBuG9/XKK2cVBTj//7/7wW6ZY+IC9/GlLqxyHABpoasAsJ1MARFOdYPxMUtndxA==} + engines: {node: '>=4'} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prepend-http@1.0.4: + resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} + engines: {node: '>=0.10.0'} + prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} @@ -5468,6 +5960,10 @@ packages: engines: {node: '>=16.13'} hasBin: true + prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -5496,6 +5992,9 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} @@ -5536,6 +6035,10 @@ packages: resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} engines: {node: '>= 0.8'} + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + react-dom@18.3.1: resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} peerDependencies: @@ -5650,6 +6153,14 @@ packages: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} + read-pkg-up@1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + + read-pkg@1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -5661,6 +6172,13 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} + readline2@1.0.1: + resolution: {integrity: sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==} + + redent@1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} + redux-persist@6.0.0: resolution: {integrity: sha512-71LLMbUq2r02ng2We9S215LtPu3fY0KgaGE0k8WRgl6RkqxtGfl7HUozz1Dftwsb0D/5mZ8dwAaPbtnzfvbEwQ==} peerDependencies: @@ -5684,9 +6202,19 @@ packages: refractor@4.8.1: resolution: {integrity: sha512-/fk5sI0iTgFYlmVGYVew90AoYnNMP6pooClx/XKqyeeCQXrL0Kvgn8V0VEht5ccdljbzzF1i3Q213gcntkRExg==} + regenerator-runtime@0.11.1: + resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + registry-auth-token@3.4.0: + resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} + + registry-url@3.1.0: + resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + engines: {node: '>=0.10.0'} + rehype-attr@3.0.3: resolution: {integrity: sha512-Up50Xfra8tyxnkJdCzLBIBtxOcB2M1xdeKe1324U06RAvSjYm7ULSeoM+b/nYPQPVd7jsXJ9+39IG1WAJPXONw==} engines: {node: '>=16'} @@ -5694,16 +6222,10 @@ packages: rehype-autolink-headings@7.1.0: resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} - rehype-external-links@3.0.0: - resolution: {integrity: sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==} - rehype-ignore@2.0.2: resolution: {integrity: sha512-BpAT/3lU9DMJ2siYVD/dSR0A/zQgD6Fb+fxkJd4j+wDVy6TYbYpK+FZqu8eM9EuNKGvi4BJR7XTZ/+zF02Dq8w==} engines: {node: '>=16'} - rehype-katex@7.0.1: - resolution: {integrity: sha512-OiM2wrZ/wuhKkigASodFoo8wimG3H12LWQaH8qSPVJn9apWKFSH3YOCtbKpBorTVw/eI7cuT21XBbvwEswbIOA==} - rehype-parse@9.0.0: resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} @@ -5717,9 +6239,6 @@ packages: resolution: {integrity: sha512-rjLJ3z6fIV11phwCqHp/KRo8xuUCO8o9bFJCNw5o6O2wlLk6g8r323aRswdGBQwfXPFYeSuZdAjp4tzo6RGqEg==} engines: {node: '>=16.0.0'} - rehype-sanitize@6.0.0: - resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} - rehype-slug@6.0.0: resolution: {integrity: sha512-lWyvf/jwu+oS5+hL5eClVd3hNdmwM1kAC0BUvEGD19pajQMIzcNUd/k9GsfQ+FfECvX+JE+e9/btsKH0EjJT6A==} @@ -5730,9 +6249,6 @@ packages: resolution: {integrity: sha512-qNf2mSAoZgh3Cl23/9Y1L7S4Kbf9NsdHvYK398ab/52yEsDPDU5I4cuTcgDRrdIX7Ltc6RK+KCLRtWkbFnL6Dg==} engines: {node: '>=16'} - remark-math@6.0.0: - resolution: {integrity: sha512-MMqgnP74Igy+S3WwnhQ7kqGlEerTETXMvJhrUzDikVZ2/uogJCb+WHUg97hK9/jcfc0dkD73s3LN8zU49cTEtA==} - remark-parse@11.0.0: resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} @@ -5752,6 +6268,10 @@ packages: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} + repeating@2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5760,6 +6280,12 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + require-package-name@2.0.1: + resolution: {integrity: sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==} + reselect@5.1.1: resolution: {integrity: sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==} @@ -5770,6 +6296,10 @@ packages: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5786,6 +6316,10 @@ packages: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true + restore-cursor@1.0.1: + resolution: {integrity: sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==} + engines: {node: '>=0.10.0'} + restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -5811,6 +6345,9 @@ packages: rtl-css-js@1.16.1: resolution: {integrity: sha512-lRQgou1mu19e+Ya0LsTvKrVJ5TYUbqCVPAiImX3UfLTenarvPUl1QFdvu5Z3PYmHT9RCcwIfbjRQBntExyj3Zg==} + run-async@0.1.0: + resolution: {integrity: sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -5822,6 +6359,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + rx-lite@3.1.2: + resolution: {integrity: sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==} + rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} @@ -5845,6 +6385,17 @@ packages: resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==} engines: {node: '>=0.10.0'} + semver-compare@1.0.0: + resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + + semver-diff@2.1.0: + resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} + engines: {node: '>=0.10.0'} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -5865,6 +6416,9 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -5876,10 +6430,18 @@ packages: setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -5937,6 +6499,18 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + specificity@0.4.1: resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} hasBin: true @@ -5951,6 +6525,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackframe@0.3.1: + resolution: {integrity: sha512-XmoiF4T5nuWEp2x2w92WdGjdHGY/cZa6LIbRsDRQR/Xlk4uW0PAUlH1zJYVffocwKpCdwyuypIp25xsSXEtZHw==} + stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} @@ -5972,6 +6549,18 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} + string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + + string-width@2.1.1: + resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} + engines: {node: '>=4'} + + string-width@3.1.0: + resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==} + engines: {node: '>=6'} + string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5989,6 +6578,18 @@ packages: stringify-entities@4.0.4: resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + + strip-ansi@4.0.0: + resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} + engines: {node: '>=4'} + + strip-ansi@5.2.0: + resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==} + engines: {node: '>=6'} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -5997,6 +6598,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -6005,6 +6610,10 @@ packages: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -6013,6 +6622,15 @@ packages: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} + strip-indent@1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -6044,6 +6662,10 @@ packages: resolution: {integrity: sha512-erY3HFDG0dPnhw4U+udPfrzXa4xhSG+n4rxfRuZWCUvjFWwKl+OxWf/7zk50s84/fAAs7vf5QAb9uRa0cCykxw==} engines: {node: '>=6.4.0'} + supports-color@2.0.0: + resolution: {integrity: sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==} + engines: {node: '>=0.8.0'} + supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -6086,6 +6708,10 @@ packages: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} + term-size@1.2.0: + resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} + engines: {node: '>=4'} + terser-webpack-plugin@5.3.10: resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -6114,6 +6740,9 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + throat@2.0.2: + resolution: {integrity: sha512-N3kcBj8Pn5SnHmxGwrFl2D7TkCimQZJ6jBaCJldUsKcY0mmZ+dj4uF2FZ7r1gyHLkRnISvmL7MbMPV1UADqKjQ==} + throttle-debounce@3.0.1: resolution: {integrity: sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==} engines: {node: '>=10'} @@ -6121,6 +6750,10 @@ packages: through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + timed-out@4.0.1: + resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} + engines: {node: '>=0.10.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -6153,6 +6786,10 @@ packages: trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + trim-newlines@1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} @@ -6277,21 +6914,19 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unique-string@1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + unist-util-filter@5.0.1: resolution: {integrity: sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==} - unist-util-find-after@5.0.0: - resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} - unist-util-is@6.0.0: resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} unist-util-position@5.0.0: resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - unist-util-stringify-position@4.0.0: resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} @@ -6312,15 +6947,27 @@ packages: unplugin@1.0.1: resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + unzip-response@2.0.1: + resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} + engines: {node: '>=4'} + update-browserslist-db@1.1.0: resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' + update-notifier@2.5.0: + resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} + engines: {node: '>=4'} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse-lax@1.0.0: + resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} + engines: {node: '>=0.10.0'} + use-sync-external-store@1.2.2: resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} peerDependencies: @@ -6348,6 +6995,9 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validator@13.12.0: resolution: {integrity: sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==} engines: {node: '>= 0.10'} @@ -6401,9 +7051,16 @@ packages: terser: optional: true + vue-template-compiler@2.7.16: + resolution: {integrity: sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==} + w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + walkdir@0.3.2: + resolution: {integrity: sha512-0Twghia4Z5wDGDYWURlhZmI47GvERMCsXIu0QZWVVZyW9ZjpbbZvD9Zy9M6cWiQQRRbAcYajIyKNavaZZDt1Uw==} + engines: {node: '>=6.0.0'} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -6455,11 +7112,26 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-pm@1.1.0: + resolution: {integrity: sha512-7GHHJQpALk7BWMD8I+xSILSbHyngvBlfSXlwGpdRFY2voFwVCx+eJAybXTzTnUYmt7zio6B9SEdI81T0fBjxNA==} + engines: {node: '>=4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + widest-line@2.0.1: + resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} + engines: {node: '>=4'} + word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -6467,6 +7139,10 @@ packages: wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + wrap-ansi@5.1.0: + resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==} + engines: {node: '>=6'} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -6482,6 +7158,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@2.4.3: + resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -6498,14 +7177,24 @@ packages: utf-8-validate: optional: true + xdg-basedir@3.0.0: + resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} + engines: {node: '>=4'} + xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} @@ -6518,10 +7207,16 @@ packages: engines: {node: '>= 14'} hasBin: true + yargs-parser@13.1.2: + resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs@13.3.2: + resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -8953,6 +9648,8 @@ snapshots: '@types/http-errors@2.0.4': {} + '@types/incremental-dom@0.5.0': {} + '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -8978,12 +9675,25 @@ snapshots: '@types/katex@0.16.7': {} + '@types/keyv@3.1.4': + dependencies: + '@types/node': 20.16.6 + + '@types/linkify-it@5.0.0': {} + '@types/lodash@4.17.9': {} + '@types/markdown-it@14.1.2': + dependencies: + '@types/linkify-it': 5.0.0 + '@types/mdurl': 2.0.0 + '@types/mdast@4.0.4': dependencies: '@types/unist': 3.0.3 + '@types/mdurl@2.0.0': {} + '@types/methods@1.1.4': {} '@types/mime@1.3.5': {} @@ -9036,6 +9746,10 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.1.3 + '@types/responselike@1.0.3': + dependencies: + '@types/node': 20.16.6 + '@types/retry@0.12.0': {} '@types/send@0.17.4': @@ -9075,6 +9789,8 @@ snapshots: '@types/validator@13.12.2': {} + '@types/webcomponents.js@0.6.39': {} + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -9227,6 +9943,10 @@ snapshots: transitivePeerDependencies: - supports-color + '@vscode/markdown-it-katex@1.1.0': + dependencies: + katex: 0.16.11 + '@webassemblyjs/ast@1.12.1': dependencies: '@webassemblyjs/helper-numbers': 1.11.6 @@ -9364,16 +10084,30 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ansi-align@2.0.0: + dependencies: + string-width: 2.1.1 + ansi-colors@4.1.3: {} + ansi-escapes@1.4.0: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 + ansi-regex@2.1.1: {} + + ansi-regex@3.0.1: {} + + ansi-regex@4.1.1: {} + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} + ansi-styles@2.2.1: {} + ansi-styles@3.2.1: dependencies: color-convert: 1.9.3 @@ -9401,10 +10135,20 @@ snapshots: argparse@2.0.1: {} + array-find-index@1.0.2: {} + array-flatten@1.1.1: {} array-timsort@1.0.3: {} + array-union@1.0.2: + dependencies: + array-uniq: 1.0.3 + + array-uniq@1.0.3: {} + + arrify@1.0.1: {} + asap@2.0.6: {} async@3.2.6: {} @@ -9480,6 +10224,11 @@ snapshots: babel-plugin-jest-hoist: 29.6.3 babel-preset-current-node-syntax: 1.1.0(@babel/core@7.25.2) + babel-runtime@6.26.0: + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.11.1 + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -9527,6 +10276,16 @@ snapshots: bowser@2.11.0: {} + boxen@1.3.0: + dependencies: + ansi-align: 2.0.0 + camelcase: 4.1.0 + chalk: 2.4.2 + cli-boxes: 1.0.0 + string-width: 2.1.1 + term-size: 1.2.0 + widest-line: 2.0.1 + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -9568,6 +10327,8 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + builtin-modules@3.3.0: {} + busboy@1.6.0: dependencies: streamsearch: 1.1.0 @@ -9582,16 +10343,46 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + callsite-record@3.2.2: + dependencies: + callsite: 1.0.0 + chalk: 1.1.3 + error-stack-parser: 1.3.6 + highlight-es: 1.0.3 + lodash: 4.17.21 + pinkie-promise: 2.0.1 + + callsite@1.0.0: {} + callsites@3.1.0: {} + camelcase-keys@2.1.0: + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + + camelcase@2.1.1: {} + + camelcase@4.1.0: {} + camelcase@5.3.1: {} camelcase@6.3.0: {} caniuse-lite@1.0.30001663: {} + capture-stack-trace@1.0.2: {} + ccount@2.0.1: {} + chalk@1.1.3: + dependencies: + ansi-styles: 2.2.1 + escape-string-regexp: 1.0.5 + has-ansi: 2.0.0 + strip-ansi: 3.0.1 + supports-color: 2.0.0 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -9654,6 +10445,8 @@ snapshots: chrome-trace-event@1.0.4: {} + ci-info@1.6.0: {} + ci-info@3.9.0: {} cjs-module-lexer@1.4.1: {} @@ -9666,10 +10459,18 @@ snapshots: libphonenumber-js: 1.11.9 validator: 13.12.0 + cli-boxes@1.0.0: {} + + cli-cursor@1.0.2: + dependencies: + restore-cursor: 1.0.1 + cli-cursor@3.1.0: dependencies: restore-cursor: 3.1.0 + cli-spinners@0.1.2: {} + cli-spinners@2.9.2: {} cli-table3@0.6.5: @@ -9678,6 +10479,8 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 + cli-width@2.2.1: {} + cli-width@3.0.0: {} cli-width@4.1.0: {} @@ -9688,6 +10491,12 @@ snapshots: is-wsl: 3.1.0 is64bit: 2.0.0 + cliui@5.0.0: + dependencies: + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi: 5.1.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -9702,6 +10511,8 @@ snapshots: co@4.6.0: {} + code-point-at@1.1.0: {} + codemirror-markdown-commands@0.0.3: dependencies: '@codemirror/state': 6.4.1 @@ -9787,6 +10598,15 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 + configstore@3.1.5: + dependencies: + dot-prop: 4.2.1 + graceful-fs: 4.2.11 + make-dir: 1.3.0 + unique-string: 1.0.0 + write-file-atomic: 2.4.3 + xdg-basedir: 3.0.0 + consola@2.15.3: {} content-disposition@0.5.4: @@ -9811,6 +10631,8 @@ snapshots: dependencies: toggle-selection: 1.0.6 + core-js@2.6.12: {} + core-util-is@1.0.3: {} cors@2.8.5: @@ -9835,6 +10657,10 @@ snapshots: optionalDependencies: typescript: 5.3.3 + create-error-class@3.0.2: + dependencies: + capture-stack-trace: 1.0.2 + create-jest@29.7.0(@types/node@20.16.6)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@20.16.6)(typescript@5.3.3)): dependencies: '@jest/types': 29.6.3 @@ -9854,6 +10680,17 @@ snapshots: crelt@1.0.6: {} + cross-spawn-async@2.2.5: + dependencies: + lru-cache: 4.1.5 + which: 1.3.1 + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + cross-spawn@7.0.3: dependencies: path-key: 3.1.1 @@ -9862,6 +10699,8 @@ snapshots: crypt@0.0.2: {} + crypto-random-string@1.0.0: {} + css-in-js-utils@3.1.0: dependencies: hyphenate-style-name: 1.1.0 @@ -9890,6 +10729,12 @@ snapshots: csstype@3.1.3: {} + currently-unhandled@0.4.1: + dependencies: + array-find-index: 1.0.2 + + de-indent@1.0.2: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -9912,6 +10757,8 @@ snapshots: optionalDependencies: babel-plugin-macros: 3.1.0 + deep-extend@0.6.0: {} + deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -9928,8 +10775,32 @@ snapshots: delayed-stream@1.0.0: {} + depcheck@0.8.3: + dependencies: + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 + builtin-modules: 3.3.0 + deprecate: 1.1.1 + deps-regex: 0.1.4 + js-yaml: 3.14.1 + lodash: 4.17.21 + minimatch: 3.1.2 + node-sass-tilde-importer: 1.0.2 + please-upgrade-node: 3.2.0 + require-package-name: 2.0.1 + resolve: 1.22.8 + vue-template-compiler: 2.7.16 + walkdir: 0.3.2 + yargs: 13.3.2 + transitivePeerDependencies: + - supports-color + depd@2.0.0: {} + deprecate@1.1.1: {} + + deps-regex@0.1.4: {} + dequal@2.0.3: {} destroy@1.2.0: {} @@ -9984,10 +10855,16 @@ snapshots: dom-serializer: 0.1.1 domelementtype: 1.3.1 + dot-prop@4.2.1: + dependencies: + is-obj: 1.0.1 + dotenv-expand@10.0.0: {} dotenv@16.4.5: {} + duplexer3@0.1.5: {} + eastasianwidth@0.2.0: {} ecdsa-sig-formatter@1.0.11: @@ -10004,6 +10881,8 @@ snapshots: emittery@0.13.1: {} + emoji-regex@7.0.3: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} @@ -10029,6 +10908,10 @@ snapshots: dependencies: is-arrayish: 0.2.1 + error-stack-parser@1.3.6: + dependencies: + stackframe: 0.3.1 + error-stack-parser@2.1.4: dependencies: stackframe: 1.3.4 @@ -10188,6 +11071,24 @@ snapshots: events@3.3.0: {} + execa@0.2.2: + dependencies: + cross-spawn-async: 2.2.5 + npm-run-path: 1.0.0 + object-assign: 4.1.1 + path-key: 1.0.0 + strip-eof: 1.0.0 + + execa@0.7.0: + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.3 @@ -10212,8 +11113,14 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + exit-hook@1.1.1: {} + exit@0.1.2: {} + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -10361,6 +11268,11 @@ snapshots: dependencies: pend: 1.2.0 + figures@1.7.0: + dependencies: + escape-string-regexp: 1.0.5 + object-assign: 4.1.1 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -10389,8 +11301,19 @@ snapshots: transitivePeerDependencies: - supports-color + find-parent-dir@0.3.1: {} + find-root@1.1.0: {} + find-up@1.1.2: + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -10491,6 +11414,10 @@ snapshots: get-package-type@0.1.0: {} + get-stdin@4.0.1: {} + + get-stream@3.0.0: {} + get-stream@5.2.0: dependencies: pump: 3.0.2 @@ -10501,6 +11428,8 @@ snapshots: github-slugger@2.0.0: {} + giturl@1.0.3: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -10520,6 +11449,14 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 + glob@6.0.4: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -10536,10 +11473,37 @@ snapshots: minipass: 4.2.8 path-scurry: 1.11.1 + global-dirs@0.1.1: + dependencies: + ini: 1.3.8 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + globals@11.12.0: {} globals@14.0.0: {} + globby@4.1.0: + dependencies: + array-union: 1.0.2 + arrify: 1.0.1 + glob: 6.0.4 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + goober@2.1.14(csstype@3.1.3): dependencies: csstype: 3.1.3 @@ -10548,6 +11512,22 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + got@6.7.1: + dependencies: + '@types/keyv': 3.1.4 + '@types/responselike': 1.0.3 + create-error-class: 3.0.2 + duplexer3: 0.1.5 + get-stream: 3.0.0 + is-redirect: 1.0.0 + is-retry-allowed: 1.2.0 + is-stream: 1.1.0 + lowercase-keys: 1.0.1 + safe-buffer: 5.2.1 + timed-out: 4.0.1 + unzip-response: 2.0.1 + url-parse-lax: 1.0.0 + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -10561,6 +11541,10 @@ snapshots: optionalDependencies: uglify-js: 3.19.3 + has-ansi@2.0.0: + dependencies: + ansi-regex: 2.1.1 + has-flag@3.0.0: {} has-flag@4.0.0: {} @@ -10579,19 +11563,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hast-util-from-dom@5.0.0: - dependencies: - '@types/hast': 3.0.4 - hastscript: 8.0.0 - web-namespaces: 2.0.1 - - hast-util-from-html-isomorphic@2.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-from-dom: 5.0.0 - hast-util-from-html: 2.0.3 - unist-util-remove-position: 5.0.0 - hast-util-from-html@2.0.3: dependencies: '@types/hast': 3.0.4 @@ -10648,12 +11619,6 @@ snapshots: web-namespaces: 2.0.1 zwitch: 2.0.4 - hast-util-sanitize@5.0.1: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 - unist-util-position: 5.0.0 - hast-util-select@6.0.2: dependencies: '@types/hast': 3.0.4 @@ -10673,6 +11638,20 @@ snapshots: unist-util-visit: 5.0.0 zwitch: 2.0.4 + hast-util-to-html@9.0.3: + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.3 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.2.0 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.4 + zwitch: 2.0.4 + hast-util-to-jsx-runtime@2.3.0: dependencies: '@types/estree': 1.0.6 @@ -10707,14 +11686,7 @@ snapshots: dependencies: '@types/hast': 3.0.4 - hast-util-to-text@4.0.2: - dependencies: - '@types/hast': 3.0.4 - '@types/unist': 3.0.3 - hast-util-is-element: 3.0.0 - unist-util-find-after: 5.0.0 - - hast-util-whitespace@3.0.0: + hast-util-whitespace@3.0.0: dependencies: '@types/hast': 3.0.4 @@ -10734,12 +11706,26 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + hexoid@1.0.0: {} + highlight-es@1.0.3: + dependencies: + chalk: 2.4.2 + is-es2016-keyword: 1.0.0 + js-tokens: 3.0.2 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + hosted-git-info@2.8.9: {} + href-content@2.0.3: dependencies: remote-content: 4.0.0 @@ -10824,6 +11810,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-lazy@2.1.0: {} + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 @@ -10831,6 +11819,17 @@ snapshots: imurmurhash@0.1.4: {} + incremental-dom@0.6.0: + dependencies: + '@types/webcomponents.js': 0.6.39 + npm-check: 5.9.2 + transitivePeerDependencies: + - supports-color + + indent-string@2.1.0: + dependencies: + repeating: 2.0.1 + inflight@1.0.6: dependencies: once: 1.4.0 @@ -10838,6 +11837,8 @@ snapshots: inherits@2.0.4: {} + ini@1.3.8: {} + inline-css@3.0.0: dependencies: cheerio: 0.22.0 @@ -10856,6 +11857,22 @@ snapshots: dependencies: css-in-js-utils: 3.1.0 + inquirer@0.12.0: + dependencies: + ansi-escapes: 1.4.0 + ansi-regex: 2.1.1 + chalk: 1.1.3 + cli-cursor: 1.0.2 + cli-width: 2.2.1 + figures: 1.7.0 + lodash: 4.17.21 + readline2: 1.0.1 + run-async: 0.1.0 + rx-lite: 3.1.2 + string-width: 1.0.2 + strip-ansi: 3.0.1 + through: 2.3.8 + inquirer@8.2.6: dependencies: ansi-escapes: 4.3.2 @@ -10894,8 +11911,6 @@ snapshots: ipaddr.js@1.9.1: {} - is-absolute-url@4.0.1: {} - is-alphabetical@2.0.1: {} is-alphanumerical@2.0.1: @@ -10915,6 +11930,10 @@ snapshots: is-buffer@1.1.6: {} + is-ci@1.2.1: + dependencies: + ci-info: 1.6.0 + is-core-module@2.15.1: dependencies: hasown: 2.0.2 @@ -10923,8 +11942,18 @@ snapshots: is-docker@3.0.0: {} + is-es2016-keyword@1.0.0: {} + is-extglob@2.1.1: {} + is-finite@1.1.0: {} + + is-fullwidth-code-point@1.0.0: + dependencies: + number-is-nan: 1.0.1 + + is-fullwidth-code-point@2.0.0: {} + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} @@ -10939,20 +11968,43 @@ snapshots: dependencies: is-docker: 3.0.0 + is-installed-globally@0.1.0: + dependencies: + global-dirs: 0.1.1 + is-path-inside: 1.0.1 + is-interactive@1.0.0: {} + is-npm@1.0.0: {} + is-number@7.0.0: {} + is-obj@1.0.1: {} + + is-path-inside@1.0.1: + dependencies: + path-is-inside: 1.0.2 + is-path-inside@3.0.3: {} is-plain-obj@4.1.0: {} + is-redirect@1.0.0: {} + + is-retry-allowed@1.2.0: {} + + is-stream@1.1.0: {} + is-stream@2.0.1: {} is-stream@3.0.0: {} is-unicode-supported@0.1.0: {} + is-utf8@0.2.1: {} + + is-windows@1.0.2: {} + is-wsl@3.1.0: dependencies: is-inside-container: 1.0.0 @@ -11344,6 +12396,8 @@ snapshots: dependencies: base64-js: 1.5.1 + js-tokens@3.0.2: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -11535,6 +12589,10 @@ snapshots: optionalDependencies: openai: 4.63.0(zod@3.23.8) + latest-version@3.1.0: + dependencies: + package-json: 4.0.1 + leven@3.1.0: {} levn@0.4.1: @@ -11563,12 +12621,32 @@ snapshots: cheerio: 0.22.0 pick-util: 1.1.5 + load-json-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + + load-yaml-file@0.1.1: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 2.3.0 + strip-bom: 3.0.0 + loader-runner@4.3.0: {} localforage@1.10.0: dependencies: lie: 3.1.1 + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -11636,8 +12714,20 @@ snapshots: dependencies: js-tokens: 4.0.0 + loud-rejection@1.6.0: + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.7 + + lowercase-keys@1.0.1: {} + lru-cache@10.4.3: {} + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -11646,6 +12736,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@1.3.0: + dependencies: + pify: 3.0.0 + make-dir@4.0.0: dependencies: semver: 7.6.3 @@ -11656,6 +12750,20 @@ snapshots: dependencies: tmpl: 1.0.5 + map-obj@1.0.1: {} + + markdown-it-incremental-dom@2.1.0(incremental-dom@0.6.0)(markdown-it@14.1.0): + dependencies: + htmlparser2: 3.10.1 + incremental-dom: 0.6.0 + markdown-it: 14.1.0 + + markdown-it-prism@2.3.0: + dependencies: + prismjs: 1.29.0 + + markdown-it-sanitizer@0.4.3: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 @@ -11767,18 +12875,6 @@ snapshots: transitivePeerDependencies: - supports-color - mdast-util-math@3.0.0: - dependencies: - '@types/hast': 3.0.4 - '@types/mdast': 4.0.4 - devlop: 1.1.0 - longest-streak: 3.1.0 - mdast-util-from-markdown: 2.0.1 - mdast-util-to-markdown: 2.1.0 - unist-util-remove-position: 5.0.0 - transitivePeerDependencies: - - supports-color - mdast-util-mdx-expression@2.0.1: dependencies: '@types/estree-jsx': 1.0.5 @@ -11864,6 +12960,19 @@ snapshots: dependencies: fs-monkey: 1.0.6 + meow@3.7.0: + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.8 + normalize-package-data: 2.5.0 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -11949,16 +13058,6 @@ snapshots: micromark-util-combine-extensions: 2.0.0 micromark-util-types: 2.0.0 - micromark-extension-math@3.1.0: - dependencies: - '@types/katex': 0.16.7 - devlop: 1.1.0 - katex: 0.16.11 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.1.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - micromark-factory-destination@2.0.0: dependencies: micromark-util-character: 2.1.0 @@ -12159,6 +13258,8 @@ snapshots: mustache@4.2.0: {} + mute-stream@0.0.5: {} + mute-stream@0.0.8: {} mute-stream@1.0.0: {} @@ -12202,6 +13303,17 @@ snapshots: node-releases@2.0.18: {} + node-sass-tilde-importer@1.0.2: + dependencies: + find-parent-dir: 0.3.1 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} not@0.1.0: {} @@ -12215,6 +13327,45 @@ snapshots: transitivePeerDependencies: - csstype + npm-check@5.9.2: + dependencies: + babel-runtime: 6.26.0 + callsite-record: 3.2.2 + chalk: 1.1.3 + co: 4.6.0 + depcheck: 0.8.3 + execa: 0.2.2 + giturl: 1.0.3 + global-modules: 1.0.0 + globby: 4.1.0 + inquirer: 0.12.0 + is-ci: 1.2.1 + lodash: 4.17.21 + meow: 3.7.0 + minimatch: 3.1.2 + node-emoji: 1.11.0 + ora: 0.2.3 + package-json: 4.0.1 + path-exists: 2.1.0 + pkg-dir: 1.0.0 + preferred-pm: 1.0.1 + semver: 5.7.2 + semver-diff: 2.1.0 + text-table: 0.2.0 + throat: 2.0.2 + update-notifier: 2.5.0 + xtend: 4.0.2 + transitivePeerDependencies: + - supports-color + + npm-run-path@1.0.0: + dependencies: + path-key: 1.0.0 + + npm-run-path@2.0.2: + dependencies: + path-key: 2.0.1 + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -12233,6 +13384,8 @@ snapshots: num-sort@2.1.0: {} + number-is-nan@1.0.1: {} + oauth@0.10.0: {} object-assign@4.1.1: {} @@ -12251,6 +13404,8 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@1.1.0: {} + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 @@ -12284,6 +13439,13 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@0.2.3: + dependencies: + chalk: 1.1.3 + cli-cursor: 1.0.2 + cli-spinners: 0.1.2 + object-assign: 4.1.1 + ora@5.4.1: dependencies: bl: 4.1.0 @@ -12308,6 +13470,10 @@ snapshots: dependencies: yocto-queue: 0.1.0 + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -12334,6 +13500,13 @@ snapshots: package-json-from-dist@1.0.0: {} + package-json@4.0.1: + dependencies: + got: 6.7.1 + registry-auth-token: 3.4.0 + registry-url: 3.1.0 + semver: 5.7.2 + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -12349,6 +13522,10 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@2.2.0: + dependencies: + error-ex: 1.3.2 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.24.7 @@ -12358,6 +13535,8 @@ snapshots: parse-numeric-range@1.3.0: {} + parse-passwd@1.0.0: {} + parse5@7.1.2: dependencies: entities: 4.5.0 @@ -12389,10 +13568,22 @@ snapshots: pause: 0.0.1 utils-merge: 1.0.1 + path-exists@2.1.0: + dependencies: + pinkie-promise: 2.0.1 + + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} + path-is-inside@1.0.2: {} + + path-key@1.0.0: {} + + path-key@2.0.1: {} + path-key@3.1.1: {} path-key@4.0.0: {} @@ -12408,6 +13599,12 @@ snapshots: path-to-regexp@3.3.0: {} + path-type@1.1.0: + dependencies: + graceful-fs: 4.2.11 + pify: 2.3.0 + pinkie-promise: 2.0.1 + path-type@4.0.0: {} pause@0.0.1: {} @@ -12424,12 +13621,30 @@ snapshots: picomatch@4.0.1: {} + pify@2.3.0: {} + + pify@3.0.0: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + pirates@4.0.6: {} + pkg-dir@1.0.0: + dependencies: + find-up: 1.1.2 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 + please-upgrade-node@3.2.0: + dependencies: + semver-compare: 1.0.0 + pluralize@8.0.0: {} postcss@8.4.47: @@ -12438,8 +13653,15 @@ snapshots: picocolors: 1.1.0 source-map-js: 1.2.1 + preferred-pm@1.0.1: + dependencies: + path-exists: 3.0.0 + which-pm: 1.1.0 + prelude-ls@1.2.1: {} + prepend-http@1.0.4: {} + prettier-linter-helpers@1.0.0: dependencies: fast-diff: 1.3.0 @@ -12458,6 +13680,8 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + prismjs@1.29.0: {} + process-nextick-args@2.0.1: {} progress@2.0.1: {} @@ -12484,6 +13708,8 @@ snapshots: proxy-from-env@1.1.0: {} + pseudomap@1.0.2: {} + pump@3.0.2: dependencies: end-of-stream: 1.4.4 @@ -12535,6 +13761,13 @@ snapshots: iconv-lite: 0.4.24 unpipe: 1.0.0 + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + react-dom@18.3.1(react@18.3.1): dependencies: loose-envify: 1.4.0 @@ -12657,6 +13890,17 @@ snapshots: dependencies: loose-envify: 1.4.0 + read-pkg-up@1.0.1: + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + + read-pkg@1.1.0: + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -12677,6 +13921,17 @@ snapshots: dependencies: picomatch: 2.3.1 + readline2@1.0.1: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + mute-stream: 0.0.5 + + redent@1.0.0: + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 + redux-persist@6.0.0(react@18.3.1)(redux@5.0.1): dependencies: redux: 5.0.1 @@ -12698,8 +13953,19 @@ snapshots: hastscript: 7.2.0 parse-entities: 4.0.1 + regenerator-runtime@0.11.1: {} + regenerator-runtime@0.14.1: {} + registry-auth-token@3.4.0: + dependencies: + rc: 1.2.8 + safe-buffer: 5.2.1 + + registry-url@3.1.0: + dependencies: + rc: 1.2.8 + rehype-attr@3.0.3: dependencies: unified: 11.0.5 @@ -12714,31 +13980,12 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 - rehype-external-links@3.0.0: - dependencies: - '@types/hast': 3.0.4 - '@ungap/structured-clone': 1.2.0 - hast-util-is-element: 3.0.0 - is-absolute-url: 4.0.1 - space-separated-tokens: 2.0.2 - unist-util-visit: 5.0.0 - rehype-ignore@2.0.2: dependencies: hast-util-select: 6.0.2 unified: 11.0.5 unist-util-visit: 5.0.0 - rehype-katex@7.0.1: - dependencies: - '@types/hast': 3.0.4 - '@types/katex': 0.16.7 - hast-util-from-html-isomorphic: 2.0.0 - hast-util-to-text: 4.0.2 - katex: 0.16.11 - unist-util-visit-parents: 6.0.1 - vfile: 6.0.3 - rehype-parse@9.0.0: dependencies: '@types/hast': 3.0.4 @@ -12766,11 +14013,6 @@ snapshots: unified: 11.0.5 unist-util-visit: 5.0.0 - rehype-sanitize@6.0.0: - dependencies: - '@types/hast': 3.0.4 - hast-util-sanitize: 5.0.1 - rehype-slug@6.0.0: dependencies: '@types/hast': 3.0.4 @@ -12794,15 +14036,6 @@ snapshots: dependencies: unist-util-visit: 5.0.0 - remark-math@6.0.0: - dependencies: - '@types/mdast': 4.0.4 - mdast-util-math: 3.0.0 - micromark-extension-math: 3.1.0 - unified: 11.0.5 - transitivePeerDependencies: - - supports-color - remark-parse@11.0.0: dependencies: '@types/mdast': 4.0.4 @@ -12837,10 +14070,18 @@ snapshots: repeat-string@1.6.1: {} + repeating@2.0.1: + dependencies: + is-finite: 1.1.0 + require-directory@2.1.1: {} require-from-string@2.0.2: {} + require-main-filename@2.0.0: {} + + require-package-name@2.0.1: {} + reselect@5.1.1: {} resize-observer-polyfill@1.5.1: {} @@ -12849,6 +14090,11 @@ snapshots: dependencies: resolve-from: 5.0.0 + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -12861,6 +14107,11 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@1.0.1: + dependencies: + exit-hook: 1.1.1 + onetime: 1.1.0 + restore-cursor@3.1.0: dependencies: onetime: 5.1.2 @@ -12900,6 +14151,10 @@ snapshots: dependencies: '@babel/runtime': 7.25.6 + run-async@0.1.0: + dependencies: + once: 1.4.0 + run-async@2.4.1: {} run-async@3.0.0: {} @@ -12908,6 +14163,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + rx-lite@3.1.2: {} + rxjs@7.8.1: dependencies: tslib: 2.7.0 @@ -12930,6 +14187,14 @@ snapshots: screenfull@5.2.0: {} + semver-compare@1.0.0: {} + + semver-diff@2.1.0: + dependencies: + semver: 5.7.2 + + semver@5.7.2: {} + semver@6.3.1: {} semver@7.6.3: {} @@ -12965,6 +14230,8 @@ snapshots: transitivePeerDependencies: - supports-color + set-blocking@2.0.0: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -12978,10 +14245,16 @@ snapshots: setprototypeof@1.2.0: {} + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 + shebang-regex@1.0.0: {} + shebang-regex@3.0.0: {} side-channel@1.0.6: @@ -13027,6 +14300,20 @@ snapshots: space-separated-tokens@2.0.2: {} + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + specificity@0.4.1: {} sprintf-js@1.0.3: {} @@ -13039,6 +14326,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackframe@0.3.1: {} + stackframe@1.3.4: {} stacktrace-gps@3.1.2: @@ -13061,6 +14350,23 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 + string-width@1.0.2: + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + + string-width@2.1.1: + dependencies: + is-fullwidth-code-point: 2.0.0 + strip-ansi: 4.0.0 + + string-width@3.1.0: + dependencies: + emoji-regex: 7.0.3 + is-fullwidth-code-point: 2.0.0 + strip-ansi: 5.2.0 + string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -13086,6 +14392,18 @@ snapshots: character-entities-html4: 2.1.0 character-entities-legacy: 3.0.0 + strip-ansi@3.0.1: + dependencies: + ansi-regex: 2.1.1 + + strip-ansi@4.0.0: + dependencies: + ansi-regex: 3.0.1 + + strip-ansi@5.2.0: + dependencies: + ansi-regex: 4.1.1 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -13094,14 +14412,26 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + strip-bom@3.0.0: {} strip-bom@4.0.0: {} + strip-eof@1.0.0: {} + strip-final-newline@2.0.0: {} strip-final-newline@3.0.0: {} + strip-indent@1.0.1: + dependencies: + get-stdin: 4.0.1 + + strip-json-comments@2.0.1: {} + strip-json-comments@3.1.1: {} strnum@1.0.5: {} @@ -13144,6 +14474,8 @@ snapshots: transitivePeerDependencies: - supports-color + supports-color@2.0.0: {} + supports-color@5.5.0: dependencies: has-flag: 3.0.0 @@ -13186,6 +14518,10 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + term-size@1.2.0: + dependencies: + execa: 0.7.0 + terser-webpack-plugin@5.3.10(webpack@5.94.0): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -13210,10 +14546,14 @@ snapshots: text-table@0.2.0: {} + throat@2.0.2: {} + throttle-debounce@3.0.1: {} through@2.3.8: {} + timed-out@4.0.1: {} + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -13236,6 +14576,8 @@ snapshots: trim-lines@3.0.1: {} + trim-newlines@1.0.0: {} + trough@2.2.0: {} ts-api-utils@1.3.0(typescript@5.6.2): @@ -13354,16 +14696,15 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 - unist-util-filter@5.0.1: + unique-string@1.0.0: dependencies: - '@types/unist': 3.0.3 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 + crypto-random-string: 1.0.0 - unist-util-find-after@5.0.0: + unist-util-filter@5.0.1: dependencies: '@types/unist': 3.0.3 unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 unist-util-is@6.0.0: dependencies: @@ -13373,11 +14714,6 @@ snapshots: dependencies: '@types/unist': 3.0.3 - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.3 - unist-util-visit: 5.0.0 - unist-util-stringify-position@4.0.0: dependencies: '@types/unist': 3.0.3 @@ -13404,16 +14740,35 @@ snapshots: webpack-sources: 3.2.3 webpack-virtual-modules: 0.5.0 + unzip-response@2.0.1: {} + update-browserslist-db@1.1.0(browserslist@4.23.3): dependencies: browserslist: 4.23.3 escalade: 3.2.0 picocolors: 1.1.0 + update-notifier@2.5.0: + dependencies: + boxen: 1.3.0 + chalk: 2.4.2 + configstore: 3.1.5 + import-lazy: 2.1.0 + is-ci: 1.2.1 + is-installed-globally: 0.1.0 + is-npm: 1.0.0 + latest-version: 3.1.0 + semver-diff: 2.1.0 + xdg-basedir: 3.0.0 + uri-js@4.4.1: dependencies: punycode: 2.3.1 + url-parse-lax@1.0.0: + dependencies: + prepend-http: 1.0.4 + use-sync-external-store@1.2.2(react@18.3.1): dependencies: react: 18.3.1 @@ -13434,6 +14789,11 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + validator@13.12.0: {} vary@1.1.2: {} @@ -13467,8 +14827,15 @@ snapshots: fsevents: 2.3.3 terser: 5.33.0 + vue-template-compiler@2.7.16: + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + w3c-keyname@2.2.8: {} + walkdir@0.3.2: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -13533,14 +14900,35 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which-module@2.0.1: {} + + which-pm@1.1.0: + dependencies: + load-yaml-file: 0.1.1 + path-exists: 3.0.0 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + which@2.0.2: dependencies: isexe: 2.0.0 + widest-line@2.0.1: + dependencies: + string-width: 2.1.1 + word-wrap@1.2.5: {} wordwrap@1.0.0: {} + wrap-ansi@5.1.0: + dependencies: + ansi-styles: 3.2.1 + string-width: 3.1.0 + strip-ansi: 5.2.0 + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -13561,6 +14949,12 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@2.4.3: + dependencies: + graceful-fs: 4.2.11 + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 @@ -13568,18 +14962,42 @@ snapshots: ws@7.4.6: {} + xdg-basedir@3.0.0: {} + xtend@4.0.2: {} + y18n@4.0.3: {} + y18n@5.0.8: {} + yallist@2.1.2: {} + yallist@3.1.1: {} yaml@1.10.2: {} yaml@2.5.1: {} + yargs-parser@13.1.2: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + yargs-parser@21.1.1: {} + yargs@13.3.2: + dependencies: + cliui: 5.0.0 + find-up: 3.0.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 3.1.0 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 13.1.2 + yargs@17.7.2: dependencies: cliui: 8.0.1 From 3cd1456fcd7095b6456d6f7c3743b57a92a6970f Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Mon, 4 Nov 2024 00:50:30 +0900 Subject: [PATCH 18/27] Update `CHANGELOG.md` for `v0.1.20` (#399) --- CHANGELOG.md | 16 ++++++++++++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ac03c0ad..c9ccbc64 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,22 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.20] - 2024-11-04 + +### Added + +- Add option to toggle Scroll Sync On/Off by @devleejb in https://github.com/yorkie-team/codepair/pull/394 + +### Changed + +- Apply incremental dom update by @blurfx in https://github.com/yorkie-team/codepair/pull/397 +- Update `yorkie-js-sdk` to `v0.5.4` by @devleejb in https://github.com/yorkie-team/codepair/pull/390 + +### Fixed + +- Fix ESLint Rules to Ensure Proper Code Compliance by @devleejb in https://github.com/yorkie-team/codepair/pull/392 +- Fix cursor movement logic during Snapshot Event by @devleejb in https://github.com/yorkie-team/codepair/pull/398 + ## [0.1.19] - 2024-10-28 ### Fixed diff --git a/backend/package.json b/backend/package.json index fff3ec91..51fdc477 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.19", + "version": "0.1.20", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index cc5e2611..c599e1ae 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.19", + "version": "0.1.20", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index e0fada22..9315c60f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.19", + "version": "0.1.20", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From 516394e542cdea0b12888ec0feaf7939c5c392cd Mon Sep 17 00:00:00 2001 From: changhui lee Date: Mon, 4 Nov 2024 11:02:45 +0900 Subject: [PATCH 19/27] Add markdown task list plugin (#400) --- frontend/package.json | 1 + frontend/src/components/editor/Preview.tsx | 6 ++---- frontend/src/components/editor/preview.css | 6 ++---- frontend/src/global.d.ts | 3 +++ pnpm-lock.yaml | 8 ++++++++ 5 files changed, 16 insertions(+), 8 deletions(-) create mode 100644 frontend/src/global.d.ts diff --git a/frontend/package.json b/frontend/package.json index c599e1ae..52a8d1ba 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -58,6 +58,7 @@ "markdown-it-incremental-dom": "^2.1.0", "markdown-it-prism": "^2.3.0", "markdown-it-sanitizer": "^0.4.3", + "markdown-it-task-checkbox": "^1.0.6", "match-sorter": "^6.3.3", "moment": "^2.30.1", "notistack": "^3.0.1", diff --git a/frontend/src/components/editor/Preview.tsx b/frontend/src/components/editor/Preview.tsx index f5de285a..5b59f634 100644 --- a/frontend/src/components/editor/Preview.tsx +++ b/frontend/src/components/editor/Preview.tsx @@ -9,12 +9,9 @@ import MarkdownIt from "markdown-it"; import { toHtml } from "hast-util-to-html"; import markdownItKatex from "@vscode/markdown-it-katex"; import { refractor } from "refractor"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import markdownItIncrementalDOM from "markdown-it-incremental-dom"; -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore import markdownItSanitizer from "markdown-it-sanitizer"; +import markdownItTaskCheckbox from "markdown-it-task-checkbox"; import * as IncrementalDOM from "incremental-dom"; import "./editor.css"; import "./preview.css"; @@ -35,6 +32,7 @@ const md = new MarkdownIt({ } }, }) + .use(markdownItTaskCheckbox) .use(markdownItIncrementalDOM, IncrementalDOM, { incrementalizeDefaultRules: false, }) diff --git a/frontend/src/components/editor/preview.css b/frontend/src/components/editor/preview.css index 66210565..d80442dd 100644 --- a/frontend/src/components/editor/preview.css +++ b/frontend/src/components/editor/preview.css @@ -1033,13 +1033,11 @@ body[data-color-mode*="light"] { display: none; } } - .task-list-item-checkbox, - .contains-task-list input[type="checkbox"] { + .task-list input[type="checkbox"] { margin: 0 0.2em 0.25em -1.6em; vertical-align: middle; } - .contains-task-list:dir(rtl) .task-list-item-checkbox, - .contains-task-list:dir(rtl) input[type="checkbox"] { + .task-list:dir(rtl) input[type="checkbox"] { margin: 0 -1.6em 0.25em 0.2em; } } diff --git a/frontend/src/global.d.ts b/frontend/src/global.d.ts new file mode 100644 index 00000000..53f7cf53 --- /dev/null +++ b/frontend/src/global.d.ts @@ -0,0 +1,3 @@ +declare module "markdown-it-incremental-dom"; +declare module "markdown-it-sanitizer"; +declare module "markdown-it-task-checkbox"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b860a13d..36e83891 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -276,6 +276,9 @@ importers: markdown-it-sanitizer: specifier: ^0.4.3 version: 0.4.3 + markdown-it-task-checkbox: + specifier: ^1.0.6 + version: 1.0.6 match-sorter: specifier: ^6.3.3 version: 6.3.4 @@ -5264,6 +5267,9 @@ packages: markdown-it-sanitizer@0.4.3: resolution: {integrity: sha512-0Q2ua8+oDN7/3r5UXMnbVq8C+LRfT2pzVKA+h4nXTLEMBFQDwp7qJZOe7DkBa79C7V2cSBXJyScxJ7vYs9kE2w==} + markdown-it-task-checkbox@1.0.6: + resolution: {integrity: sha512-7pxkHuvqTOu3iwVGmDPeYjQg+AIS9VQxzyLP9JCg9lBjgPAJXGEkChK6A2iFuj3tS0GV3HG2u5AMNhcQqwxpJw==} + markdown-it@14.1.0: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true @@ -12764,6 +12770,8 @@ snapshots: markdown-it-sanitizer@0.4.3: {} + markdown-it-task-checkbox@1.0.6: {} + markdown-it@14.1.0: dependencies: argparse: 2.0.1 From 72b0b1e8147e4be98cb36184addee271ebb64cae Mon Sep 17 00:00:00 2001 From: plam Date: Tue, 5 Nov 2024 18:40:00 +0900 Subject: [PATCH 20/27] Add environments for Github Enterprise OAuth App (#404) --- backend/.env.development | 12 ++++++++++++ backend/src/auth/github.strategy.ts | 3 +++ 2 files changed, 15 insertions(+) diff --git a/backend/.env.development b/backend/.env.development index a05e2938..7eca2952 100644 --- a/backend/.env.development +++ b/backend/.env.development @@ -13,6 +13,18 @@ GITHUB_CLIENT_SECRET=your_github_client_secret_here # Format: https:///auth/login/github # Example: http://localhost:3000/auth/login/github (For development mode) GITHUB_CALLBACK_URL=http://localhost:3000/auth/login/github +# GITHUB_AUTHORIZATION_URL: Authorization URL for Github OAuth app. +# Default OAuth app is Github. Change this url for using Github Enterprise OAuth App. +# Format: https://ENTERPRISE_INSTANCE_URL/login/oauth/authorize +GITHUB_AUTHORIZATION_URL=https://github.com/login/oauth/authorize +# GITHUB_TOKEN_URL: Token URL for Github OAuth app. +# Default OAuth app is Github. Change this url for using Github Enterprise OAuth App. +# https://ENTERPRISE_INSTANCE_URL/login/oauth/access_token +GITHUB_TOKEN_URL=https://github.com/login/oauth/access_token +# GITHUB_USER_PROFILE_URL: User profile URL for Github OAuth app. +# Default OAuth app is Github. Change this url for using Github Enterprise OAuth App. +# https://ENTERPRISE_INSTANCE_URL/api/v3/user +GITHUB_USER_PROFILE_URL=https://api.github.com/user # JWT_ACCESS_TOKEN_SECRET: Secret key for signing and verifying access tokens. # JWT_ACCESS_TOKEN_EXPIRATION_TIME: Expiration time for access tokens in seconds. diff --git a/backend/src/auth/github.strategy.ts b/backend/src/auth/github.strategy.ts index e052c56e..0ef9bd0d 100644 --- a/backend/src/auth/github.strategy.ts +++ b/backend/src/auth/github.strategy.ts @@ -11,6 +11,9 @@ export class GithubStrategy extends PassportStrategy(Strategy, "github") { clientID: configService.get("GITHUB_CLIENT_ID"), clientSecret: configService.get("GITHUB_CLIENT_SECRET"), callbackURL: configService.get("GITHUB_CALLBACK_URL"), + authorizationURL: configService.get("GITHUB_AUTHORIZATION_URL"), + tokenURL: configService.get("GITHUB_TOKEN_URL"), + userProfileURL: configService.get("GITHUB_USER_PROFILE_URL"), scope: ["public_profile"], }); } From 3ecb3c7b05cc4682de84c18f71631133d22288b2 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Tue, 5 Nov 2024 18:47:32 +0900 Subject: [PATCH 21/27] Update `CHANGELOG.md` for `v0.1.21` (#405) --- CHANGELOG.md | 7 +++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9ccbc64..cf409b2a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,13 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.21] - 2024-11-05 + +### Added + +- Add markdown render checkbox plugin by @blurfx in https://github.com/yorkie-team/codepair/pull/400 +- Add Envs for Github Enterprise Oauth App by @emplam27 in https://github.com/yorkie-team/codepair/pull/404 + ## [0.1.20] - 2024-11-04 ### Added diff --git a/backend/package.json b/backend/package.json index 51fdc477..44cb3f23 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.20", + "version": "0.1.21", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 52a8d1ba..60a8c63a 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.20", + "version": "0.1.21", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 9315c60f..4b968f80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.20", + "version": "0.1.21", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From ecc00dcaa7c237f6152d4549a71fa9c1e67f762a Mon Sep 17 00:00:00 2001 From: JOOHOJANG <46807540+JOOHOJANG@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:20:29 +0900 Subject: [PATCH 22/27] Add `throttle` to prevent preview's indiscriminate updates (#391) * Add throttle to prevent preview's indiscriminate updates * Update preview text from cmview * Add cmview into useMemo dependencies * Fix typo --- frontend/src/components/editor/Preview.tsx | 37 +++++++++++++++------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/frontend/src/components/editor/Preview.tsx b/frontend/src/components/editor/Preview.tsx index 5b59f634..fc92c807 100644 --- a/frontend/src/components/editor/Preview.tsx +++ b/frontend/src/components/editor/Preview.tsx @@ -1,10 +1,9 @@ import { CircularProgress, Stack } from "@mui/material"; import "katex/dist/katex.min.css"; -import { useEffect, useRef, useState } from "react"; +import { useEffect, useRef, useState, useMemo } from "react"; import { useSelector } from "react-redux"; import { useCurrentTheme } from "../../hooks/useCurrentTheme"; import { selectEditor } from "../../store/editorSlice"; -import { addSoftLineBreak } from "../../utils/document"; import MarkdownIt from "markdown-it"; import { toHtml } from "hast-util-to-html"; import markdownItKatex from "@vscode/markdown-it-katex"; @@ -15,6 +14,10 @@ import markdownItTaskCheckbox from "markdown-it-task-checkbox"; import * as IncrementalDOM from "incremental-dom"; import "./editor.css"; import "./preview.css"; +import _ from "lodash"; +import { addSoftLineBreak } from "../../utils/document"; + +const DELAY = 500; const md = new MarkdownIt({ html: true, @@ -44,27 +47,39 @@ const Preview = () => { const editorStore = useSelector(selectEditor); const [content, setContent] = useState(""); const containerRef = useRef(null); + const throttledUpdatePreviewContent = useMemo( + () => + _.throttle( + () => { + const editorText = + editorStore.cmView?.state.doc.toString() || + editorStore.doc?.getRoot().content?.toString() || + ""; + + // Add soft line break + setContent(addSoftLineBreak(editorText)); + }, + DELAY, + // Set trailing true to prevent ignoring last call + { trailing: true } + ), + [editorStore.doc, editorStore.cmView] + ); useEffect(() => { if (!editorStore.doc) return; - const updatePreviewContent = () => { - const editorText = editorStore.doc?.getRoot().content?.toString() || ""; - // Add soft line break - setContent(addSoftLineBreak(editorText)); - }; - - updatePreviewContent(); + throttledUpdatePreviewContent(); const unsubscribe = editorStore.doc.subscribe("$.content", () => { - updatePreviewContent(); + throttledUpdatePreviewContent(); }); return () => { unsubscribe(); setContent(""); }; - }, [editorStore.doc]); + }, [editorStore.doc, throttledUpdatePreviewContent]); useEffect(() => { if (containerRef.current == null) { From b5331f1fa051d9baaf9e6dbdcc97f466fa659c08 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Tue, 5 Nov 2024 21:27:56 +0900 Subject: [PATCH 23/27] Update `CHANGELOG.md` for `v0.1.22` (#406) --- CHANGELOG.md | 6 ++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cf409b2a..b2f1521a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.22] - 2024-11-05 + +### Added + +- Add `throttle` to prevent preview's indiscriminate updates by @JOOHOJANG in https://github.com/yorkie-team/codepair/pull/391 + ## [0.1.21] - 2024-11-05 ### Added diff --git a/backend/package.json b/backend/package.json index 44cb3f23..865d33ee 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.21", + "version": "0.1.22", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index 60a8c63a..5d340e9c 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.21", + "version": "0.1.22", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 4b968f80..88db2d14 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.21", + "version": "0.1.22", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From d9a8a07ce75ac0f36112c1630fe44b1772986924 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sun, 10 Nov 2024 21:51:31 +0900 Subject: [PATCH 24/27] Update `yorkie-js-sdk` to `v0.5.5` (#407) * Update `yorkie-js-sdk` to `v0.5.5` * Add missing `APITags` --- backend/docker/docker-compose-full.yml | 2 +- backend/docker/docker-compose.yml | 2 +- backend/src/check/check.service.ts | 115 +++++++++++++++--------- backend/src/files/files.controller.ts | 3 +- frontend/package.json | 2 +- frontend/src/hooks/api/types/user.d.ts | 8 ++ frontend/src/hooks/api/user.ts | 35 ++++++-- frontend/src/hooks/useYorkieDocument.ts | 52 +++++++---- pnpm-lock.yaml | 10 +-- 9 files changed, 151 insertions(+), 78 deletions(-) diff --git a/backend/docker/docker-compose-full.yml b/backend/docker/docker-compose-full.yml index 8dcd2d06..9648ebc5 100644 --- a/backend/docker/docker-compose-full.yml +++ b/backend/docker/docker-compose-full.yml @@ -38,7 +38,7 @@ services: - "yorkie:yorkie" yorkie: - image: "yorkieteam/yorkie:0.5.4" + image: "yorkieteam/yorkie:0.5.5" command: ["server", "--enable-pprof"] restart: always ports: diff --git a/backend/docker/docker-compose.yml b/backend/docker/docker-compose.yml index 29afd18a..25ffa673 100644 --- a/backend/docker/docker-compose.yml +++ b/backend/docker/docker-compose.yml @@ -2,7 +2,7 @@ version: "3.8" services: yorkie: - image: "yorkieteam/yorkie:0.5.4" + image: "yorkieteam/yorkie:0.5.5" command: ["server", "--enable-pprof"] restart: always ports: diff --git a/backend/src/check/check.service.ts b/backend/src/check/check.service.ts index 8fe80751..bc43ad93 100644 --- a/backend/src/check/check.service.ts +++ b/backend/src/check/check.service.ts @@ -1,4 +1,4 @@ -import { Injectable } from "@nestjs/common"; +import { ForbiddenException, Injectable, UnauthorizedException } from "@nestjs/common"; import { JwtService } from "@nestjs/jwt"; import * as moment from "moment"; import { PrismaService } from "src/db/prisma.service"; @@ -33,64 +33,91 @@ export class CheckService { } async checkYorkie(checkYorkieDto: CheckYorkieDto): Promise { - let reason = ""; - let allowed = false; const [type, token] = checkYorkieDto.token.split(":"); + // In `ActivateClient`, `DeactivateClient` methods, the `checkYorkieDto.attributes` is empty. if ( [YorkieMethod.ActivateClient, YorkieMethod.DeactivateClient].includes( checkYorkieDto.method ) ) { - allowed = true; - reason = `Pass ${checkYorkieDto.method}`; + return { + allowed: true, + reason: `Pass ${checkYorkieDto.method} method`, + }; + } + + const { key: yorkieDocumentId } = checkYorkieDto.attributes?.[0]; + if (type == "default") { + await this.checkDefaultAccessToken(yorkieDocumentId, token); + } else if (type == "share") { + await this.checkSharingAccessToken(yorkieDocumentId, token); } else { - const { key: yorkieDocumentId } = checkYorkieDto.attributes?.[0]; - if (type === "default") { - const { sub } = this.jwtService.verify(token); + throw new ForbiddenException({ allowed: false, reason: "Invalid token type" }); + } - const res = await this.prismaService.document.findFirst({ - select: { - id: true, - }, - where: { - yorkieDocumentId, - workspace: { - userWorkspaceList: { - every: { - userId: sub, - }, - }, + return { + allowed: true, + reason: "Valid token", + }; + } + + private async checkDefaultAccessToken( + yorkieDocumentId: string, + accessToken: string + ): Promise { + let sub = ""; + try { + sub = this.jwtService.verify(accessToken).sub; + } catch { + throw new UnauthorizedException({ + allowed: false, + reason: "Token is expired or invalid", + }); + } + + const document = await this.prismaService.document.findFirst({ + select: { + id: true, + }, + where: { + yorkieDocumentId, + workspace: { + userWorkspaceList: { + every: { + userId: sub, }, }, - }); + }, + }, + }); - allowed = Boolean(res); - } else if (type === "share") { - const documentSharingToken = - await this.prismaService.documentSharingToken.findFirst({ - where: { - token, - document: { - yorkieDocumentId, - }, - }, - }); + if (!document) { + throw new ForbiddenException({ + allowed: false, + reason: "User does not have access to the document", + }); + } + + return sub; + } - allowed = Boolean(documentSharingToken); + private async checkSharingAccessToken(yorkieDocumentId: string, accessToken: string) { + const documentSharingToken = await this.prismaService.documentSharingToken.findFirst({ + where: { + token: accessToken, + document: { + yorkieDocumentId, + }, + }, + }); - if ( - documentSharingToken?.expiredAt && - moment().isAfter(documentSharingToken?.expiredAt) - ) { - allowed = false; - } - } + if (!documentSharingToken) { + throw new ForbiddenException({ allowed: false, reason: "Sharing token is invalid" }); } - return { - allowed, - reason, - }; + if (documentSharingToken?.expiredAt && moment().isAfter(documentSharingToken?.expiredAt)) { + throw new ForbiddenException({ allowed: false, reason: "Sharing token is expired" }); + } } } diff --git a/backend/src/files/files.controller.ts b/backend/src/files/files.controller.ts index 2d1c0f2c..23842849 100644 --- a/backend/src/files/files.controller.ts +++ b/backend/src/files/files.controller.ts @@ -8,13 +8,14 @@ import { Redirect, StreamableFile, } from "@nestjs/common"; -import { ApiBody, ApiOkResponse, ApiOperation, ApiResponse } from "@nestjs/swagger"; +import { ApiBody, ApiOkResponse, ApiOperation, ApiResponse, ApiTags } from "@nestjs/swagger"; import { Public } from "src/utils/decorators/auth.decorator"; import { CreateUploadPresignedUrlDto } from "./dto/create-upload-url.dto"; import { FilesService } from "./files.service"; import { CreateUploadPresignedUrlResponse } from "./types/create-upload-url-response.type"; import { ExportFileRequestBody, ExportFileResponse } from "./types/export-file.type"; +@ApiTags("Files") @Controller("files") export class FilesController { constructor(private filesService: FilesService) {} diff --git a/frontend/package.json b/frontend/package.json index 5d340e9c..c5e1041d 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -80,7 +80,7 @@ "refractor": "^4.8.1", "validator": "^13.12.0", "vite-plugin-package-version": "^1.1.0", - "yorkie-js-sdk": "0.5.4" + "yorkie-js-sdk": "0.5.5" }, "devDependencies": { "@sentry/vite-plugin": "^2.20.1", diff --git a/frontend/src/hooks/api/types/user.d.ts b/frontend/src/hooks/api/types/user.d.ts index cc647353..d543865a 100644 --- a/frontend/src/hooks/api/types/user.d.ts +++ b/frontend/src/hooks/api/types/user.d.ts @@ -11,3 +11,11 @@ export class GetUserResponse extends User {} export class UpdateUserRequest { nickname: string; } + +export class RefreshTokenRequest { + refreshToken: string; +} + +export class RefreshTokenResponse { + newAccessToken: string; +} diff --git a/frontend/src/hooks/api/user.ts b/frontend/src/hooks/api/user.ts index 79938db5..d2007937 100644 --- a/frontend/src/hooks/api/user.ts +++ b/frontend/src/hooks/api/user.ts @@ -4,15 +4,40 @@ import { useEffect, useState } from "react"; import { useDispatch, useSelector } from "react-redux"; import { logout, selectAuth, setAccessToken } from "../../store/authSlice"; import { User, setUserData } from "../../store/userSlice"; -import { GetUserResponse, UpdateUserRequest } from "./types/user"; +import { + GetUserResponse, + RefreshTokenRequest, + RefreshTokenResponse, + UpdateUserRequest, +} from "./types/user"; export const generateGetUserQueryKey = (accessToken: string) => { return ["users", accessToken]; }; +export const useRefreshTokenMutation = () => { + const dispatch = useDispatch(); + const authStore = useSelector(selectAuth); + + return useMutation({ + mutationFn: async () => { + const response = await axios.post("/auth/refresh", { + refreshToken: authStore.refreshToken, + } as RefreshTokenRequest); + + return response.data.newAccessToken; + }, + onSuccess: (accessToken) => { + dispatch(setAccessToken(accessToken)); + axios.defaults.headers.common["Authorization"] = `Bearer ${accessToken}`; + }, + }); +}; + export const useGetUserQuery = () => { const dispatch = useDispatch(); const authStore = useSelector(selectAuth); + const { mutateAsync: mutateRefreshToken } = useRefreshTokenMutation(); const [axiosInterceptorAdded, setAxiosInterceptorAdded] = useState(false); useEffect(() => { @@ -26,11 +51,7 @@ export const useGetUserQuery = () => { return Promise.reject(error); } else { error.config._retry = true; - const { refreshToken } = authStore; - const response = await axios.post("/auth/refresh", { refreshToken }); - const newAccessToken = response.data.newAccessToken; - dispatch(setAccessToken(newAccessToken)); - axios.defaults.headers.common["Authorization"] = `Bearer ${newAccessToken}`; + const newAccessToken = await mutateRefreshToken(); error.config.headers["Authorization"] = `Bearer ${newAccessToken}`; return axios(error.config); } @@ -45,7 +66,7 @@ export const useGetUserQuery = () => { setAxiosInterceptorAdded(false); axios.interceptors.response.eject(interceptor); }; - }, [authStore, dispatch]); + }, [authStore, dispatch, mutateRefreshToken]); const query = useQuery({ queryKey: generateGetUserQueryKey(authStore.accessToken || ""), diff --git a/frontend/src/hooks/useYorkieDocument.ts b/frontend/src/hooks/useYorkieDocument.ts index 300f78dd..8f67a6a6 100644 --- a/frontend/src/hooks/useYorkieDocument.ts +++ b/frontend/src/hooks/useYorkieDocument.ts @@ -7,6 +7,7 @@ import * as yorkie from "yorkie-js-sdk"; import { selectAuth } from "../store/authSlice"; import { CodePairDocType } from "../store/editorSlice"; import { YorkieCodeMirrorDocType, YorkieCodeMirrorPresenceType } from "../utils/yorkie/yorkieSync"; +import { useRefreshTokenMutation } from "./api/user"; const YORKIE_API_ADDR = import.meta.env.VITE_YORKIE_API_ADDR; const YORKIE_API_KEY = import.meta.env.VITE_YORKIE_API_KEY; @@ -21,26 +22,42 @@ export const useYorkieDocument = ( const authStore = useSelector(selectAuth); const [client, setClient] = useState(null); const [doc, setDoc] = useState(null); + const { mutateAsync: mutateRefreshToken } = useRefreshTokenMutation(); + + const getYorkieToken = useCallback( + async (reason?: string) => { + const shareToken = searchParams.get("token"); + let accessToken = authStore.accessToken; + const isShare = Boolean(shareToken); + + if (reason) { + if (isShare) { + throw new Error("Cannot refresh token for shared documents"); + } else { + try { + accessToken = await mutateRefreshToken(); + } catch { + throw new Error("Failed to refresh token"); + } + } + } - const getYorkieToken = useCallback(() => { - const shareToken = searchParams.get("token"); - return shareToken ? `share:${shareToken}` : `default:${authStore.accessToken}`; - }, [authStore.accessToken, searchParams]); - - const createYorkieClient = useCallback( - async (yorkieToken: string) => { - const syncLoopDuration = Number(searchParams.get("syncLoopDuration")) || 200; - const newClient = new yorkie.Client(YORKIE_API_ADDR, { - apiKey: YORKIE_API_KEY, - token: yorkieToken, - syncLoopDuration, - }); - await newClient.activate(); - return newClient; + return isShare ? `share:${shareToken}` : `default:${accessToken}`; }, - [searchParams] + [authStore.accessToken, mutateRefreshToken, searchParams] ); + const createYorkieClient = useCallback(async () => { + const syncLoopDuration = Number(searchParams.get("syncLoopDuration")) || 200; + const newClient = new yorkie.Client(YORKIE_API_ADDR, { + apiKey: YORKIE_API_KEY, + authTokenInjector: getYorkieToken, + syncLoopDuration, + }); + await newClient.activate(); + return newClient; + }, [getYorkieToken, searchParams]); + const createYorkieDocument = useCallback( (client: yorkie.Client, yorkieDocumentId: string, presenceName: string) => { const newDocument = new yorkie.Document< @@ -76,8 +93,7 @@ export const useYorkieDocument = ( const initializeYorkie = async () => { try { - const yorkieToken = getYorkieToken(); - const newClient = await createYorkieClient(yorkieToken); + const newClient = await createYorkieClient(); const newDoc = await createYorkieDocument( newClient, yorkieDocumentId, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 36e83891..9eb44ce5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -343,8 +343,8 @@ importers: specifier: ^1.1.0 version: 1.1.0(vite@5.4.7(@types/node@20.16.6)(terser@5.33.0)) yorkie-js-sdk: - specifier: 0.5.4 - version: 0.5.4 + specifier: 0.5.5 + version: 0.5.5 devDependencies: '@sentry/vite-plugin': specifier: ^2.20.1 @@ -7238,8 +7238,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yorkie-js-sdk@0.5.4: - resolution: {integrity: sha512-D7DwdeyE2/CrVIAva/yHAb8hgp/YdmIdvNpq1J8YlyEjsb9XmCMcsu+dG0vX8+0+JtugOuKxoF5Kq7B7WaI71w==} + yorkie-js-sdk@0.5.5: + resolution: {integrity: sha512-Y+3B4JGPMPSoGndZvQwf2N8w959kMcH6b2ej5H7HtzgJIUPx+qO/fMuXCeylvlh+OotIBqhawzQeueQ82+r8fw==} engines: {node: '>=18.0.0', npm: '>=7.1.0'} zod-to-json-schema@3.23.3: @@ -15025,7 +15025,7 @@ snapshots: yocto-queue@0.1.0: {} - yorkie-js-sdk@0.5.4: + yorkie-js-sdk@0.5.5: dependencies: '@bufbuild/protobuf': 1.10.0 '@connectrpc/connect': 1.5.0(@bufbuild/protobuf@1.10.0) From 462e21e8425f66fd36c06633dfa05ff717be097c Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sun, 10 Nov 2024 22:15:46 +0900 Subject: [PATCH 25/27] Update `CHANGELOG.md` for `v0.1.23` (#408) --- CHANGELOG.md | 6 ++++++ backend/package.json | 2 +- frontend/package.json | 2 +- package.json | 2 +- 4 files changed, 9 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2f1521a..5ba8155c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and CodePair adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ## [Unreleased] +## [0.1.23] - 2024-11-10 + +### Changed + +- Update `yorkie-js-sdk` to `v0.5.5` by @devleejb in https://github.com/yorkie-team/codepair/pull/407 + ## [0.1.22] - 2024-11-05 ### Added diff --git a/backend/package.json b/backend/package.json index 865d33ee..c329c749 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/backend", - "version": "0.1.22", + "version": "0.1.23", "description": "CodePair Backend", "author": "yorkie-team", "license": "Apache-2.0", diff --git a/frontend/package.json b/frontend/package.json index c5e1041d..0a061f57 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "@codepair/frontend", - "version": "0.1.22", + "version": "0.1.23", "description": "CodePair Frontend", "type": "module", "author": "yorkie-team", diff --git a/package.json b/package.json index 88db2d14..3ebd8cee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "codepair", - "version": "0.1.22", + "version": "0.1.23", "description": "Build your own AI-powered collaborative markdown editor in just 5 minutes", "keywords": [], "author": "yorkie-team", From c0c602b00630ff1cd3d550d07b90d4f83e97dc43 Mon Sep 17 00:00:00 2001 From: devleejb Date: Fri, 15 Nov 2024 23:48:58 +0900 Subject: [PATCH 26/27] Update CONTRIBUTING.md --- CONTRIBUTING.md | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 216b5717..2149cf83 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -17,12 +17,14 @@ If you have any questions along the way, please don’t hesitate to ask us This is a rough outline of what a contributor's workflow looks like: -- Create a topic branch from where to base the contribution. This is usually main -- Make commits of logical units -- Make sure commit messages are in the proper format -- Push changes in a topic branch to a personal fork of the repository -- Submit a pull request to yorkie-team/codepair -- The PR must receive a LGTM from maintainers +1. Create a topic branch from where to base the contribution (usually main). +2. Make commits of logical units. + - Make sure all tests pass, and add any new tests as appropriate. + - Make sure commit messages are in the proper format (see below). +3. Push changes in a topic branch to the forked repository. +4. Submit a pull request to the original repository. +5. Address any review comments from CodeRabbit and maintainers. +6. After receiving LGTM from maintainers, the PR will be merged. Thanks for contributing! @@ -79,6 +81,11 @@ The first line is the subject and should be no longer than 70 characters, the se 6. **Pull Request** Submit a pull request for review. +## Code Review + +We use GitHub's pull request review feature to review code. We also use CodeRabbit to automate code review for reducing the effort of maintainers. CodeRabbit will automatically review your pull request and provide feedback on code quality, test coverage, and more. +We require that all code is reviewed by at least one maintainer before being merged. We may ask for changes to be made to the code before it is merged. + ## Contributor License Agreement We require that all contributors sign our Contributor License Agreement ("CLA") before we can accept the contribution. From 7eb889b584f4319168c92a6c3ab9bf7af1adb7a8 Mon Sep 17 00:00:00 2001 From: LeeJongBeom <52884648+devleejb@users.noreply.github.com> Date: Sat, 16 Nov 2024 00:06:31 +0900 Subject: [PATCH 27/27] Change to open url in new tab (#409) --- frontend/package.json | 1 + frontend/src/components/editor/Preview.tsx | 7 +++++++ frontend/src/global.d.ts | 1 + pnpm-lock.yaml | 8 ++++++++ 4 files changed, 17 insertions(+) diff --git a/frontend/package.json b/frontend/package.json index 0a061f57..12d491d0 100755 --- a/frontend/package.json +++ b/frontend/package.json @@ -56,6 +56,7 @@ "lodash": "^4.17.21", "markdown-it": "^14.1.0", "markdown-it-incremental-dom": "^2.1.0", + "markdown-it-link-attributes": "^4.0.1", "markdown-it-prism": "^2.3.0", "markdown-it-sanitizer": "^0.4.3", "markdown-it-task-checkbox": "^1.0.6", diff --git a/frontend/src/components/editor/Preview.tsx b/frontend/src/components/editor/Preview.tsx index fc92c807..51ccd315 100644 --- a/frontend/src/components/editor/Preview.tsx +++ b/frontend/src/components/editor/Preview.tsx @@ -11,6 +11,7 @@ import { refractor } from "refractor"; import markdownItIncrementalDOM from "markdown-it-incremental-dom"; import markdownItSanitizer from "markdown-it-sanitizer"; import markdownItTaskCheckbox from "markdown-it-task-checkbox"; +import mila from "markdown-it-link-attributes"; import * as IncrementalDOM from "incremental-dom"; import "./editor.css"; import "./preview.css"; @@ -36,6 +37,12 @@ const md = new MarkdownIt({ }, }) .use(markdownItTaskCheckbox) + .use(mila, { + attrs: { + target: "_blank", + rel: "noopener noreferrer", + }, + }) .use(markdownItIncrementalDOM, IncrementalDOM, { incrementalizeDefaultRules: false, }) diff --git a/frontend/src/global.d.ts b/frontend/src/global.d.ts index 53f7cf53..66e4d068 100644 --- a/frontend/src/global.d.ts +++ b/frontend/src/global.d.ts @@ -1,3 +1,4 @@ declare module "markdown-it-incremental-dom"; declare module "markdown-it-sanitizer"; declare module "markdown-it-task-checkbox"; +declare module "markdown-it-link-attributes"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9eb44ce5..b37fde4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -270,6 +270,9 @@ importers: markdown-it-incremental-dom: specifier: ^2.1.0 version: 2.1.0(incremental-dom@0.6.0)(markdown-it@14.1.0) + markdown-it-link-attributes: + specifier: ^4.0.1 + version: 4.0.1 markdown-it-prism: specifier: ^2.3.0 version: 2.3.0 @@ -5260,6 +5263,9 @@ packages: incremental-dom: '>=0.5.0' markdown-it: '>=4.0.0' + markdown-it-link-attributes@4.0.1: + resolution: {integrity: sha512-pg5OK0jPLg62H4k7M9mRJLT61gUp9nvG0XveKYHMOOluASo9OEF13WlXrpAp2aj35LbedAy3QOCgQCw0tkLKAQ==} + markdown-it-prism@2.3.0: resolution: {integrity: sha512-ePtHY80gZyeje4bn3R3SL0jpd1C9HFaYffJW2Ma0YD+tspqa2v9TuVwUyFwboFu4jnFNcO8oPQROgbcYJbmBvw==} engines: {node: '>=6.0.0'} @@ -12764,6 +12770,8 @@ snapshots: incremental-dom: 0.6.0 markdown-it: 14.1.0 + markdown-it-link-attributes@4.0.1: {} + markdown-it-prism@2.3.0: dependencies: prismjs: 1.29.0