diff --git a/.gitignore b/.gitignore index ef4e11d35d..04b858d744 100644 --- a/.gitignore +++ b/.gitignore @@ -29,4 +29,7 @@ yarn-error.log* .vercel test-results/ playwright-report/ -release \ No newline at end of file +release +/test-results/ +/playwright-report/ +/playwright/.cache/ diff --git a/examples/editor/package.json b/examples/editor/package.json index 608b774447..14cf747abb 100644 --- a/examples/editor/package.json +++ b/examples/editor/package.json @@ -20,7 +20,7 @@ "@vitejs/plugin-react": "^3.1.0", "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1" }, diff --git a/examples/vanilla/package.json b/examples/vanilla/package.json index 624703c9f4..c438f8c5d8 100644 --- a/examples/vanilla/package.json +++ b/examples/vanilla/package.json @@ -14,7 +14,7 @@ "devDependencies": { "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1" }, diff --git a/examples/vanilla/src/ui/blockSideMenuFactory.ts b/examples/vanilla/src/ui/blockSideMenuFactory.ts index 1f6cad7fa4..039e6939d7 100644 --- a/examples/vanilla/src/ui/blockSideMenuFactory.ts +++ b/examples/vanilla/src/ui/blockSideMenuFactory.ts @@ -1,11 +1,13 @@ -import { BlockSideMenuFactory } from "@blocknote/core"; +import { BlockSideMenuFactory, DefaultBlockSchema } from "@blocknote/core"; import { createButton } from "./util"; /** * This menu is drawn next to a block, when it's hovered over * It renders a drag handle and + button to create a new block */ -export const blockSideMenuFactory: BlockSideMenuFactory = (staticParams) => { +export const blockSideMenuFactory: BlockSideMenuFactory = ( + staticParams +) => { const container = document.createElement("div"); container.style.background = "gray"; container.style.position = "absolute"; diff --git a/examples/vanilla/src/ui/formattingToolbarFactory.ts b/examples/vanilla/src/ui/formattingToolbarFactory.ts index e35a58820f..2a9387ea0a 100644 --- a/examples/vanilla/src/ui/formattingToolbarFactory.ts +++ b/examples/vanilla/src/ui/formattingToolbarFactory.ts @@ -1,13 +1,13 @@ -import { FormattingToolbarFactory } from "@blocknote/core"; +import { DefaultBlockSchema, FormattingToolbarFactory } from "@blocknote/core"; import { createButton } from "./util"; /** * This menu is drawn when a piece of text is selected. We can use it to change formatting options * such as bold, italic, indentation, etc. */ -export const formattingToolbarFactory: FormattingToolbarFactory = ( - staticParams -) => { +export const formattingToolbarFactory: FormattingToolbarFactory< + DefaultBlockSchema +> = (staticParams) => { const container = document.createElement("div"); container.style.background = "gray"; container.style.position = "absolute"; @@ -35,7 +35,9 @@ export const formattingToolbarFactory: FormattingToolbarFactory = ( } boldBtn.text = - "bold" in staticParams.editor.getActiveStyles() ? "unset bold" : "set bold"; + "bold" in staticParams.editor.getActiveStyles() + ? "unset bold" + : "set bold"; container.style.top = params.referenceRect.y + "px"; container.style.left = params.referenceRect.x + "px"; }, diff --git a/examples/vanilla/src/ui/slashMenuFactory.ts b/examples/vanilla/src/ui/slashMenuFactory.ts index 8cfaf00484..4730827626 100644 --- a/examples/vanilla/src/ui/slashMenuFactory.ts +++ b/examples/vanilla/src/ui/slashMenuFactory.ts @@ -1,13 +1,17 @@ -import { BaseSlashMenuItem, SuggestionsMenuFactory } from "@blocknote/core"; +import { + BaseSlashMenuItem, + DefaultBlockSchema, + SuggestionsMenuFactory, +} from "@blocknote/core"; import { createButton } from "./util"; /** * This menu is drawn when the cursor is moved to a hyperlink (using the keyboard), * or when the mouse is hovering over a hyperlink */ -export const slashMenuFactory: SuggestionsMenuFactory = ( - staticParams -) => { +export const slashMenuFactory: SuggestionsMenuFactory< + BaseSlashMenuItem +> = (staticParams) => { const container = document.createElement("div"); container.style.background = "gray"; container.style.position = "absolute"; @@ -17,8 +21,8 @@ export const slashMenuFactory: SuggestionsMenuFactory = ( document.body.appendChild(container); function updateItems( - items: BaseSlashMenuItem[], - onClick: (item: BaseSlashMenuItem) => void, + items: BaseSlashMenuItem[], + onClick: (item: BaseSlashMenuItem) => void, selected: number ) { container.innerHTML = ""; diff --git a/package-lock.json b/package-lock.json index d96036b49e..4bb72ce94c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,10 +10,12 @@ "examples/*" ], "devDependencies": { - "@playwright/test": "^1.25.0", + "@playwright/experimental-ct-react": "^1.33.0", + "@playwright/test": "^1.33.0", "eslint": "^8.22.0", "lerna": "^5.4.0", - "patch-package": "^6.4.7" + "patch-package": "^6.4.7", + "typescript": "^5.0.4" } }, "examples/editor": { @@ -31,11 +33,30 @@ "@vitejs/plugin-react": "^3.1.0", "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1" } }, + "examples/editor/node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, "examples/vanilla": { "name": "@blocknote/example-vanilla", "version": "0.7.1-alpha.0", @@ -45,7 +66,7 @@ "devDependencies": { "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1" } @@ -79,132 +100,132 @@ "dev": true }, "node_modules/@algolia/cache-browser-local-storage": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz", - "integrity": "sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.1.tgz", + "integrity": "sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.17.0" + "@algolia/cache-common": "4.17.1" } }, "node_modules/@algolia/cache-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz", - "integrity": "sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz", + "integrity": "sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA==", "dev": true }, "node_modules/@algolia/cache-in-memory": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz", - "integrity": "sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.1.tgz", + "integrity": "sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.17.0" + "@algolia/cache-common": "4.17.1" } }, "node_modules/@algolia/client-account": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz", - "integrity": "sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.1.tgz", + "integrity": "sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA==", "dev": true, "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/transporter": "4.17.0" + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/@algolia/client-analytics": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz", - "integrity": "sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.1.tgz", + "integrity": "sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA==", "dev": true, "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/@algolia/client-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz", - "integrity": "sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz", + "integrity": "sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/@algolia/client-personalization": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz", - "integrity": "sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.1.tgz", + "integrity": "sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA==", "dev": true, "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/@algolia/client-search": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz", - "integrity": "sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz", + "integrity": "sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w==", "dev": true, "dependencies": { - "@algolia/client-common": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/transporter": "4.17.0" + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/@algolia/logger-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz", - "integrity": "sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz", + "integrity": "sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg==", "dev": true }, "node_modules/@algolia/logger-console": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz", - "integrity": "sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.1.tgz", + "integrity": "sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g==", "dev": true, "dependencies": { - "@algolia/logger-common": "4.17.0" + "@algolia/logger-common": "4.17.1" } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz", - "integrity": "sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.1.tgz", + "integrity": "sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.17.0" + "@algolia/requester-common": "4.17.1" } }, "node_modules/@algolia/requester-common": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz", - "integrity": "sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz", + "integrity": "sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ==", "dev": true }, "node_modules/@algolia/requester-node-http": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz", - "integrity": "sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.1.tgz", + "integrity": "sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w==", "dev": true, "dependencies": { - "@algolia/requester-common": "4.17.0" + "@algolia/requester-common": "4.17.1" } }, "node_modules/@algolia/transporter": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz", - "integrity": "sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz", + "integrity": "sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg==", "dev": true, "dependencies": { - "@algolia/cache-common": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/requester-common": "4.17.0" + "@algolia/cache-common": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/requester-common": "4.17.1" } }, "node_modules/@ampproject/remapping": { @@ -231,28 +252,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.9.tgz", - "integrity": "sha512-FUGed8kfhyWvbYug/Un/VPJD41rDIgoVVcR+FuzhzOYyRz5uED+Gd3SLZml0Uw2l2aHFb7ZgdW5mGA3G2cCCnQ==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", + "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", + "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/generator": "^7.22.0", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helpers": "^7.22.0", + "@babel/parser": "^7.22.0", + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -267,14 +288,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/eslint-parser": { "version": "7.21.8", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.8.tgz", @@ -302,21 +315,12 @@ "node": ">=10" } }, - "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", - "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", + "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.22.3", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -338,23 +342,23 @@ } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", + "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", + "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", "dependencies": { - "@babel/compat-data": "^7.21.5", + "@babel/compat-data": "^7.22.0", "@babel/helper-validator-option": "^7.21.0", "browserslist": "^4.21.3", "lru-cache": "^5.1.1", @@ -367,39 +371,18 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", + "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-member-expression-to-functions": "^7.22.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", + "@babel/helper-replace-supers": "^7.22.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", "@babel/helper-split-export-declaration": "^7.18.6", "semver": "^6.3.0" @@ -411,19 +394,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", + "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -437,19 +411,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", + "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.17.7", @@ -463,19 +428,10 @@ "@babel/core": "^7.4.0-0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", + "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", "engines": { "node": ">=6.9.0" } @@ -504,12 +460,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", + "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -527,18 +483,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", + "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-module-imports": "^7.21.4", "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" }, "engines": { "node": ">=6.9.0" @@ -583,17 +539,17 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", + "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-member-expression-to-functions": "^7.22.0", "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.0" }, "engines": { "node": ">=6.9.0" @@ -673,13 +629,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", + "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -698,74 +654,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", + "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -789,14 +681,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", + "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/plugin-transform-optional-chaining": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -805,24 +697,6 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", @@ -839,50 +713,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", - "integrity": "sha512-MfgX49uRrFUTL/HvWtmx3zmpyzMMr4MTj3d527MLlr/4RTT9G/ytFFP7qet2uM2Ve03b+BkpWUpK+lRXnQ+v9w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz", + "integrity": "sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-replace-supers": "^7.22.1", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/plugin-syntax-decorators": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -906,38 +747,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", @@ -970,17 +779,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -989,14 +796,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1005,43 +812,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { + "node_modules/@babel/plugin-proposal-private-property-in-object": { "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", + "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", @@ -1112,12 +886,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz", + "integrity": "sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1178,6 +952,21 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", + "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", @@ -1334,6 +1123,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", @@ -1349,6 +1154,24 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", + "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-async-to-generator": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", @@ -1396,6 +1219,39 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", + "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", + "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", @@ -1419,15 +1275,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/plugin-transform-computed-properties": { "version": "7.21.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", @@ -1490,6 +1337,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", + "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-exponentiation-operator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", @@ -1506,6 +1369,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", + "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-flow-strip-types": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", @@ -1554,6 +1433,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", + "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-literals": { "version": "7.18.9", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", @@ -1569,6 +1464,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", + "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-member-expression-literals": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", @@ -1617,14 +1528,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", + "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-module-transforms": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1" }, "engines": { @@ -1651,13 +1562,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", + "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1667,12 +1578,63 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", + "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", + "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", + "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", + "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -1697,13 +1659,80 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", + "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", + "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", + "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", + "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", + "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1743,16 +1772,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.3.tgz", + "integrity": "sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.21.4", "@babel/helper-plugin-utils": "^7.21.5", "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" @@ -1854,16 +1883,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz", + "integrity": "sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA==", "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", + "@babel/helper-plugin-utils": "^7.21.5", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", "semver": "^6.3.0" }, "engines": { @@ -1873,15 +1902,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", @@ -1959,15 +1979,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.3.tgz", + "integrity": "sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-create-class-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/plugin-syntax-typescript": "^7.21.4" }, "engines": { "node": ">=6.9.0" @@ -1991,6 +2011,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", + "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-unicode-regex": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", @@ -2007,39 +2043,42 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", + "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.1", + "@babel/helper-plugin-utils": "^7.21.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", + "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", + "@babel/compat-data": "^7.22.3", + "@babel/helper-compilation-targets": "^7.22.1", "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-attributes": "^7.22.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -2050,28 +2089,43 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.21.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.3", "@babel/plugin-transform-async-to-generator": "^7.20.7", "@babel/plugin-transform-block-scoped-functions": "^7.18.6", "@babel/plugin-transform-block-scoping": "^7.21.0", + "@babel/plugin-transform-class-properties": "^7.22.3", + "@babel/plugin-transform-class-static-block": "^7.22.3", "@babel/plugin-transform-classes": "^7.21.0", "@babel/plugin-transform-computed-properties": "^7.21.5", "@babel/plugin-transform-destructuring": "^7.21.3", "@babel/plugin-transform-dotall-regex": "^7.18.6", "@babel/plugin-transform-duplicate-keys": "^7.18.9", + "@babel/plugin-transform-dynamic-import": "^7.22.1", "@babel/plugin-transform-exponentiation-operator": "^7.18.6", + "@babel/plugin-transform-export-namespace-from": "^7.22.3", "@babel/plugin-transform-for-of": "^7.21.5", "@babel/plugin-transform-function-name": "^7.18.9", + "@babel/plugin-transform-json-strings": "^7.22.3", "@babel/plugin-transform-literals": "^7.18.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", "@babel/plugin-transform-member-expression-literals": "^7.18.6", "@babel/plugin-transform-modules-amd": "^7.20.11", "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", + "@babel/plugin-transform-modules-systemjs": "^7.22.3", "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", + "@babel/plugin-transform-new-target": "^7.22.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", + "@babel/plugin-transform-numeric-separator": "^7.22.3", + "@babel/plugin-transform-object-rest-spread": "^7.22.3", "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", + "@babel/plugin-transform-optional-catch-binding": "^7.22.3", + "@babel/plugin-transform-optional-chaining": "^7.22.3", + "@babel/plugin-transform-parameters": "^7.22.3", + "@babel/plugin-transform-private-methods": "^7.22.3", + "@babel/plugin-transform-private-property-in-object": "^7.22.3", "@babel/plugin-transform-property-literals": "^7.18.6", "@babel/plugin-transform-regenerator": "^7.21.5", "@babel/plugin-transform-reserved-words": "^7.18.6", @@ -2081,13 +2135,15 @@ "@babel/plugin-transform-template-literals": "^7.18.9", "@babel/plugin-transform-typeof-symbol": "^7.18.9", "@babel/plugin-transform-unicode-escapes": "^7.21.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.3", "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", + "@babel/types": "^7.22.4", + "babel-plugin-polyfill-corejs2": "^0.4.3", + "babel-plugin-polyfill-corejs3": "^0.8.1", + "babel-plugin-polyfill-regenerator": "^0.5.0", + "core-js-compat": "^3.30.2", "semver": "^6.3.0" }, "engines": { @@ -2097,15 +2153,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/preset-modules": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", @@ -2123,15 +2170,15 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.3.tgz", + "integrity": "sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", + "@babel/plugin-transform-react-jsx": "^7.22.3", "@babel/plugin-transform-react-jsx-development": "^7.18.6", "@babel/plugin-transform-react-pure-annotations": "^7.18.6" }, @@ -2168,9 +2215,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", "dependencies": { "regenerator-runtime": "^0.13.11" }, @@ -2192,18 +2239,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", + "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -2211,18 +2258,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dependencies": { "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", @@ -2349,9 +2388,9 @@ } }, "node_modules/@codemirror/state": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.0.tgz", - "integrity": "sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.2.1.tgz", + "integrity": "sha512-RupHSZ8+OjNT38zU9fKH2sv+Dnlr8Eb8sl4NOnnqz95mCFTZUaiRP8Xv5MeeaG0px2b8Bnfe7YGwCV3nsBhbuw==", "dev": true }, "node_modules/@codemirror/view": { @@ -2382,30 +2421,30 @@ "dev": true }, "node_modules/@docsearch/css": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.3.5.tgz", - "integrity": "sha512-NaXVp3I8LdmJ54fn038KHgG7HmbIzZlKS2FkVf6mKcW5bYMJovkx4947joQyZk5yubxOZ+ddHSh79y39Aevufg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.4.0.tgz", + "integrity": "sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg==", "dev": true }, "node_modules/@docsearch/js": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.3.5.tgz", - "integrity": "sha512-nZi074OCryZnzva2LNcbQkwBJIND6cvuFI4s1FIe6Ygf6n9g6B/IYUULXNx05rpoCZ+KEoEt3taROpsHBliuSw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.4.0.tgz", + "integrity": "sha512-uOtOHZJv+5PQmL68+srVzlGhLejnEBJgZl1bR87Zh/uK5RUI7p6el1R8hGTl2F8K2tCloNRxTMtXyYUNbMV+qw==", "dev": true, "dependencies": { - "@docsearch/react": "3.3.5", + "@docsearch/react": "3.4.0", "preact": "^10.0.0" } }, "node_modules/@docsearch/react": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.3.5.tgz", - "integrity": "sha512-Zuxf4z5PZ9eIQkVCNu76v1H+KAztKItNn3rLzZa7kpBS+++TgNARITnZeUS7C1DKoAhJZFr6T/H+Lvc6h/iiYg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.4.0.tgz", + "integrity": "sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ==", "dev": true, "dependencies": { "@algolia/autocomplete-core": "1.8.2", "@algolia/autocomplete-preset-algolia": "1.8.2", - "@docsearch/css": "3.3.5", + "@docsearch/css": "3.4.0", "algoliasearch": "^4.0.0" }, "peerDependencies": { @@ -2443,14 +2482,6 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@emotion/cache": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", @@ -2935,6 +2966,33 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { "version": "8.41.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", @@ -2950,9 +3008,9 @@ "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" }, "node_modules/@floating-ui/dom": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.8.tgz", - "integrity": "sha512-XLwhYV90MxiHDq6S0rzFZj00fnDM+A1R9jhSioZoMsa7G0Q0i+Q4x40ajR8FHSdYDE1bgjG45mIWe6jtv9UPmg==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", + "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", "dependencies": { "@floating-ui/core": "^1.2.6" } @@ -3106,6 +3164,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/add/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/add/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/add/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/bootstrap": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-5.6.2.tgz", @@ -3139,6 +3230,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/bootstrap/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/bootstrap/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/bootstrap/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/changed": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-5.6.2.tgz", @@ -3182,6 +3306,76 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/child-process/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lerna/child-process/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@lerna/child-process/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@lerna/child-process/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@lerna/child-process/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/child-process/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@lerna/clean": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-5.6.2.tgz", @@ -3230,6 +3424,76 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/collect-uncommitted/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lerna/collect-uncommitted/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@lerna/collect-uncommitted/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@lerna/collect-uncommitted/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@lerna/collect-uncommitted/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/collect-uncommitted/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@lerna/collect-updates": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-5.6.2.tgz", @@ -3288,6 +3552,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/conventional-commits/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/conventional-commits/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/conventional-commits/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/create": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/create/-/create-5.6.2.tgz", @@ -3329,6 +3626,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/create/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/create/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/describe-ref": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-5.6.2.tgz", @@ -3481,6 +3811,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/has-npm-version/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/has-npm-version/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/has-npm-version/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/import": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/import/-/import-5.6.2.tgz", @@ -3577,6 +3940,76 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/listable/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lerna/listable/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@lerna/listable/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@lerna/listable/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@lerna/listable/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/listable/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@lerna/log-packed": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-5.6.2.tgz", @@ -3740,21 +4173,87 @@ "semver": "^7.3.4" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": "^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/package-graph/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/package-graph/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/package-graph/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@lerna/prerelease-id-from-version": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.6.2.tgz", + "integrity": "sha512-7gIm9fecWFVNy2kpj/KbH11bRcpyANAwpsft3X5m6J7y7A6FTUscCbEvl3ZNdpQKHNuvnHgCtkm3A5PMSCEgkA==", + "dev": true, + "dependencies": { + "semver": "^7.3.4" + }, + "engines": { + "node": "^14.15.0 || >=16.0.0" + } + }, + "node_modules/@lerna/prerelease-id-from-version/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@lerna/prerelease-id-from-version": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/@lerna/prerelease-id-from-version/-/prerelease-id-from-version-5.6.2.tgz", - "integrity": "sha512-7gIm9fecWFVNy2kpj/KbH11bRcpyANAwpsft3X5m6J7y7A6FTUscCbEvl3ZNdpQKHNuvnHgCtkm3A5PMSCEgkA==", + "node_modules/@lerna/prerelease-id-from-version/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", "dev": true, "dependencies": { - "semver": "^7.3.4" + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^14.15.0 || >=16.0.0" + "node": ">=10" } }, + "node_modules/@lerna/prerelease-id-from-version/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/profiler": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/profiler/-/profiler-5.6.2.tgz", @@ -3866,6 +4365,39 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/publish/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/publish/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/publish/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/pulse-till-done": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/pulse-till-done/-/pulse-till-done-5.6.2.tgz", @@ -4072,6 +4604,109 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/@lerna/version/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@lerna/version/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@lerna/version/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@lerna/version/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@lerna/version/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/version/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/version/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@lerna/version/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/version/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@lerna/write-log-file": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-5.6.2.tgz", @@ -4102,9 +4737,9 @@ } }, "node_modules/@lezer/highlight": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.4.tgz", - "integrity": "sha512-IECkFmw2l7sFcYXrV8iT9GeY4W0fU4CxX0WMwhmhMIVjoDdD1Hr6q3G2NqVtLg/yVe5n7i4menG3tJ2r4eCrPQ==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.1.6.tgz", + "integrity": "sha512-cmSJYa2us+r3SePpRCjN5ymCqCPv+zyXmDl0ciWtVaNiORT/MxM7ZgOMQZADD0o51qOaOg24qc/zBViOIwAjJg==", "dev": true, "dependencies": { "@lezer/common": "^1.0.0" @@ -4132,9 +4767,9 @@ } }, "node_modules/@lezer/lr": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.4.tgz", - "integrity": "sha512-7o+e4og/QoC/6btozDPJqnzBhUaD1fMfmvnEKQO1wRRiTse1WxaJ3OMEXZJnkgT6HCcTVOctSoXK9jGJw2oe9g==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.3.5.tgz", + "integrity": "sha512-Kye0rxYBi+OdToLUN2tQfeH5VIrpESC6XznuvxmIxbO1lz6M1C90vkjMNYoX1SfbUcuvoPXvLYsBquZ//77zVQ==", "dev": true, "dependencies": { "@lezer/common": "^1.0.0" @@ -4249,9 +4884,9 @@ "integrity": "sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==" }, "node_modules/@mantine/utils": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.11.tgz", - "integrity": "sha512-ijkEAaKEhZCw7HSWsGMQZsvfmQKmJXmPoQ1LeEwcH3vjZalPk9pQjSPPfUdTeX9ZAv095XWmfVMiNV8+xvM0OQ==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/@mantine/utils/-/utils-6.0.13.tgz", + "integrity": "sha512-iqIU9wurqAeccVbWjM0yr1JGne5VP+ob55M03QAXOEN4+ck93VDTjCkZJR2RFhDcs5q0twQFoOmU/gULR8aKIA==", "peerDependencies": { "react": ">=16.8.0" } @@ -4382,6 +5017,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/arborist/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@npmcli/arborist/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -4397,39 +5041,147 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/arborist/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/arborist/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/arborist/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@npmcli/fs": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", "dev": true, "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/fs/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/fs/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/@npmcli/git": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", + "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^3.0.0", + "lru-cache": "^7.4.4", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^7.0.0", + "proc-log": "^2.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@npmcli/git/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, - "node_modules/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", - "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" + "yallist": "^4.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, + "node_modules/@npmcli/git/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@npmcli/installed-package-contents": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", @@ -4497,6 +5249,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/@npmcli/metavuln-calculator/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@npmcli/move-file": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", @@ -4618,6 +5403,12 @@ "node": ">=10" } }, + "node_modules/@nrwl/devkit/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@nrwl/nx-darwin-arm64": { "version": "15.9.4", "resolved": "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.4.tgz", @@ -4964,14 +5755,46 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@playwright/experimental-ct-core": { + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.34.3.tgz", + "integrity": "sha512-+/JzHK1gkCyKBzyEEQ7POO0ZOUT+GCBYcUqm8dEUiwK/QLnm74mQGVJRoeuFoljUII75XUvVn0rwAZ1xsjqPGQ==", + "dev": true, + "dependencies": { + "@playwright/test": "1.34.3", + "vite": "^4.3.3" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/@playwright/experimental-ct-react": { + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.34.3.tgz", + "integrity": "sha512-AcqDZUaeLRPab5H4SXHHv97wGnPFfpWcp5gWSHVxk2rXsafmoJ50k0K3gpQg5Vb5lNPMgmvLpUMult0j890DYA==", + "dev": true, + "dependencies": { + "@playwright/experimental-ct-core": "1.34.3", + "@vitejs/plugin-react": "^4.0.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/@playwright/test": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.34.0.tgz", - "integrity": "sha512-GIALJVODOIrMflLV54H3Cow635OfrTwOu24ZTDyKC66uchtFX2NcCRq83cLdakMjZKYK78lODNLQSYBj2OgaTw==", + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.34.3.tgz", + "integrity": "sha512-zPLef6w9P6T/iT6XDYG3mvGOqOyb6eHaV9XtkunYs0+OzxBtrPAAaHotc0X+PJ00WPPnLfFBTl7mf45Mn8DBmw==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.34.0" + "playwright-core": "1.34.3" }, "bin": { "playwright": "cli.js" @@ -4984,9 +5807,9 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.7", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", - "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -5543,17 +6366,17 @@ } }, "node_modules/@types/debug": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", - "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.8.tgz", + "integrity": "sha512-/vPO1EPOs306Cvhwv7KfVfYvOJqA/S/AXjaHQiJboCZzcNDb+TIJFN9/2C9DZ//ijSKWioNyUxD792QmDJ+HKQ==", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==", "dev": true, "dependencies": { "@types/estree": "*", @@ -5580,9 +6403,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/json5": { @@ -5592,9 +6415,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.14.194", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.194.tgz", - "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==", + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==", "dev": true }, "node_modules/@types/mdast": { @@ -5623,9 +6446,9 @@ "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, "node_modules/@types/node": { - "version": "20.2.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.3.tgz", - "integrity": "sha512-pg9d0yC4rVNWQzX8U7xb4olIOFuuVL9za3bzMT2pu2SU0SNEi66i2qrvhE2qt0HvkhuCaWJu7pLNOt/Pj8BIrw==", + "version": "20.2.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", + "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -5661,9 +6484,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.6", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", - "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.7.tgz", + "integrity": "sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -5715,15 +6538,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.6.tgz", - "integrity": "sha512-sXtOgJNEuRU5RLwPUb1jxtToZbgvq3M6FPpY4QENxoOggK+UpTxUBpj6tD8+Qh2g46Pi9We87E+eHnUw8YcGsw==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.8.tgz", + "integrity": "sha512-JDMOmhXteJ4WVKOiHXGCoB96ADWg9q7efPWHRViT/f09bA8XOMLAVHHju3l0MkZnG1izaWXYmgvQcUjTRcpShQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/type-utils": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/type-utils": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -5748,13 +6571,46 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.6.tgz", - "integrity": "sha512-UIVfEaaHggOuhgqdpFlFQ7IN9UFMCiBR/N7uPBUyUlwNdJzYfAu9m4wbOj0b59oI/HSPW1N63Q7lsvfwTQY13w==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.59.8.tgz", + "integrity": "sha512-jAf+hihtd0G2RLB9x796+3i8D0L5T5xjftuPpJ82RLsPNHdzGXmbZNNftQ558h90ogc45DD8/W3OrxmdSO5Nng==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.59.6" + "@typescript-eslint/utils": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5768,14 +6624,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.6.tgz", - "integrity": "sha512-7pCa6al03Pv1yf/dUg/s1pXz/yGMUBAw5EeWqNTFiSueKvRNonze3hma3lhdsOrQcaOXhbk5gKu2Fludiho9VA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.8.tgz", + "integrity": "sha512-AnR19RjJcpjoeGojmwZtCwBX/RidqDZtzcbG3xHrmz0aHHoOcbWnpDllenRDmDvsV0RQ6+tbb09/kyc+UT9Orw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "debug": "^4.3.4" }, "engines": { @@ -5795,13 +6651,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.6.tgz", - "integrity": "sha512-gLbY3Le9Dxcb8KdpF0+SJr6EQ+hFGYFl6tVY8VxLPFDfUZC7BHFw+Vq7bM5lE9DwWPfx4vMWWTLGXgpc0mAYyQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.8.tgz", + "integrity": "sha512-/w08ndCYI8gxGf+9zKf1vtx/16y8MHrZs5/tnjHhMLNSixuNcJavSX4wAiPf4aS5x41Es9YPCn44MIe4cxIlig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6" + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5812,13 +6668,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.6.tgz", - "integrity": "sha512-A4tms2Mp5yNvLDlySF+kAThV9VTBPCvGf0Rp8nl/eoDX9Okun8byTKoj3fJ52IJitjWOk0fKPNQhXEB++eNozQ==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.8.tgz", + "integrity": "sha512-+5M518uEIHFBy3FnyqZUF3BMP+AXnYn4oyH8RF012+e7/msMY98FhGL5SrN29NQ9xDgvqCgYnsOiKp1VjZ/fpA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.6", - "@typescript-eslint/utils": "5.59.6", + "@typescript-eslint/typescript-estree": "5.59.8", + "@typescript-eslint/utils": "5.59.8", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5839,9 +6695,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.6.tgz", - "integrity": "sha512-tH5lBXZI7T2MOUgOWFdVNUILsI02shyQvfzG9EJkoONWugCG77NDDa1EeDGw7oJ5IvsTAAGVV8I3Tk2PNu9QfA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.8.tgz", + "integrity": "sha512-+uWuOhBTj/L6awoWIg0BlWy0u9TyFpCHrAuQ5bNfxDaZ1Ppb3mx6tUigc74LHcbHpOHuOTOJrBoAnhdHdaea1w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5852,13 +6708,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.6.tgz", - "integrity": "sha512-vW6JP3lMAs/Tq4KjdI/RiHaaJSO7IUsbkz17it/Rl9Q+WkQ77EOuOnlbaU8kKfVIOJxMhnRiBG+olE7f3M16DA==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.8.tgz", + "integrity": "sha512-Jy/lPSDJGNow14vYu6IrW790p7HIf/SOV1Bb6lZ7NUkLc2iB2Z9elESmsaUtLw8kVqogSbtLH9tut5GCX1RLDg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/visitor-keys": "5.59.6", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/visitor-keys": "5.59.8", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5878,18 +6734,51 @@ } } }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.6.tgz", - "integrity": "sha512-vzaaD6EXbTS29cVH0JjXBdzMt6VBlv+hE31XktDRMX1j3462wZCJa7VzO2AxXEXcIl8GQqZPcOPuW/Z1tZVogg==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.8.tgz", + "integrity": "sha512-Tr65630KysnNn9f9G7ROF3w1b5/7f6QVCJ+WK9nhIocWmx9F+TmCAcglF26Vm7z8KCTwoKcNEBZrhlklla3CKg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.6", - "@typescript-eslint/types": "5.59.6", - "@typescript-eslint/typescript-estree": "5.59.6", + "@typescript-eslint/scope-manager": "5.59.8", + "@typescript-eslint/types": "5.59.8", + "@typescript-eslint/typescript-estree": "5.59.8", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -5926,13 +6815,46 @@ "node": ">=4.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.6", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.6.tgz", - "integrity": "sha512-zEfbFLzB9ETcEJ4HZEEsCR9HHeNku5/Qw1jSS5McYJv5BR+ftYXwFFAH5Al+xkGaZEqowMwl7uoJjQb1YSPF8Q==", + "version": "5.59.8", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.8.tgz", + "integrity": "sha512-pJhi2ms0x0xgloT7xYabil3SGGlojNNKjK/q6dB3Ey0uJLMjK2UDGJvHieiyJVW/7C3KI+Z4Q3pEHkm4ejA+xQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.6", + "@typescript-eslint/types": "5.59.8", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5957,22 +6879,21 @@ } }, "node_modules/@vitejs/plugin-react": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", - "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.0.tgz", + "integrity": "sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==", "dev": true, "dependencies": { - "@babel/core": "^7.20.12", - "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/core": "^7.21.4", + "@babel/plugin-transform-react-jsx-self": "^7.21.0", "@babel/plugin-transform-react-jsx-source": "^7.19.6", - "magic-string": "^0.27.0", "react-refresh": "^0.14.0" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "peerDependencies": { - "vite": "^4.1.0-beta.0" + "vite": "^4.2.0" } }, "node_modules/@vitejs/plugin-vue": { @@ -6562,25 +7483,25 @@ } }, "node_modules/algoliasearch": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz", - "integrity": "sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA==", - "dev": true, - "dependencies": { - "@algolia/cache-browser-local-storage": "4.17.0", - "@algolia/cache-common": "4.17.0", - "@algolia/cache-in-memory": "4.17.0", - "@algolia/client-account": "4.17.0", - "@algolia/client-analytics": "4.17.0", - "@algolia/client-common": "4.17.0", - "@algolia/client-personalization": "4.17.0", - "@algolia/client-search": "4.17.0", - "@algolia/logger-common": "4.17.0", - "@algolia/logger-console": "4.17.0", - "@algolia/requester-browser-xhr": "4.17.0", - "@algolia/requester-common": "4.17.0", - "@algolia/requester-node-http": "4.17.0", - "@algolia/transporter": "4.17.0" + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.1.tgz", + "integrity": "sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.17.1", + "@algolia/cache-common": "4.17.1", + "@algolia/cache-in-memory": "4.17.1", + "@algolia/client-account": "4.17.1", + "@algolia/client-analytics": "4.17.1", + "@algolia/client-common": "4.17.1", + "@algolia/client-personalization": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/logger-console": "4.17.1", + "@algolia/requester-browser-xhr": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/requester-node-http": "4.17.1", + "@algolia/transporter": "4.17.1" } }, "node_modules/ansi-colors": { @@ -6607,18 +7528,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -6635,18 +7544,14 @@ "dev": true }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/anymatch": { @@ -6875,9 +7780,9 @@ } }, "node_modules/axe-core": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.1.tgz", - "integrity": "sha512-sCXXUhA+cljomZ3ZAwb8i1p3oOlkABzPy08ZDAoGcYuvtBPlQ1Ytde129ArXyHWDhfeewq7rlx9F+cUx2SSlkg==", + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "dev": true, "engines": { "node": ">=4" @@ -6938,48 +7843,39 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", + "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", + "@babel/helper-define-polyfill-provider": "^0.4.0", "semver": "^6.1.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", + "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.0", + "core-js-compat": "^3.30.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", + "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -7147,9 +8043,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "funding": [ { "type": "opencollective", @@ -7158,13 +8054,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -7212,6 +8112,39 @@ "semver": "^7.0.0" } }, + "node_modules/builtins/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/builtins/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/byte-size": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-7.0.1.tgz", @@ -7259,6 +8192,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -7315,9 +8257,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001489", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001489.tgz", - "integrity": "sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==", + "version": "1.0.30001492", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001492.tgz", + "integrity": "sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==", "funding": [ { "type": "opencollective", @@ -7334,9 +8276,9 @@ ] }, "node_modules/case-anything": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.11.tgz", - "integrity": "sha512-uzKDXzdM/x914cepWPzElU3y50NRKYhjkO4ittOHLq+rF6M0AgRLF/+yPR1tvwLNAh8WHEPTfhuciZGPfX+oyg==", + "version": "2.1.13", + "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.13.tgz", + "integrity": "sha512-zlOQ80VrQ2Ue+ymH5OuM/DlDq64mEm+B9UTdHULv5osUMD6HalNTblf2b1u/m6QecjsnOkBpqVZ+XPwIVsy7Ng==", "engines": { "node": ">=12.13" }, @@ -7372,19 +8314,24 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" } }, "node_modules/character-entities": { @@ -7550,12 +8497,6 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-truncate/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -7574,9 +8515,9 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -7696,17 +8637,18 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, + "node_modules/color-convert/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", @@ -7896,15 +8838,6 @@ "node": ">=10" } }, - "node_modules/conventional-changelog-writer/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", @@ -8264,12 +9197,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -8492,14 +9419,14 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.402", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.402.tgz", - "integrity": "sha512-gWYvJSkohOiBE6ecVYXkrDgNaUjo47QEKK0kQzmWyhkH+yoYiG44bwuicTGNSIQRG3WDMsWVZJLRnJnLNkbWvA==" + "version": "1.4.414", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.414.tgz", + "integrity": "sha512-RRuCvP6ekngVh2SAJaOKT/hxqc9JAsK+Pe0hP5tGQIfonU2Zy9gMGdJ+mBdyl/vNucMG6gkXYtuM4H/1giws5w==" }, "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, "node_modules/encoding": { @@ -8547,10 +9474,9 @@ } }, "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", "engines": { "node": ">=0.12" }, @@ -8661,12 +9587,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-set-tostringtag": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", @@ -8824,6 +9744,16 @@ "node": ">= 0.8.0" } }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/escodegen/node_modules/type-check": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", @@ -9034,48 +9964,6 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-plugin-import/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, "node_modules/eslint-plugin-jest": { "version": "25.7.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", @@ -9130,21 +10018,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-react": { "version": "7.32.2", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", @@ -9215,15 +10088,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/eslint-plugin-testing-library": { "version": "5.11.0", "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", @@ -9233,39 +10097,136 @@ "@typescript-eslint/utils": "^5.58.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0", - "npm": ">=6" - }, - "peerDependencies": { - "eslint": "^7.5.0 || ^8.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" } }, - "node_modules/eslint-scope": { + "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "has-flag": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10" }, "funding": { - "url": "https://opencollective.com/eslint" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/espree": { @@ -9816,6 +10777,12 @@ "node": ">=6.9.0" } }, + "node_modules/get-pkg-repo/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, "node_modules/get-pkg-repo/node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -9953,15 +10920,6 @@ "node": ">=10" } }, - "node_modules/git-semver-tags/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/git-up": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", @@ -10048,18 +11006,11 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -10148,6 +11099,15 @@ "uglify-js": "^3.1.4" } }, + "node_modules/handlebars/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/hard-rejection": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", @@ -10178,12 +11138,11 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -10525,6 +11484,12 @@ "node": ">=10" } }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", @@ -10787,6 +11752,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/init-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/init-package-json/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -10802,6 +11776,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/init-package-json/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/init-package-json/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/inquirer": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", @@ -10828,6 +11835,76 @@ "node": ">=12.0.0" } }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -11348,9 +12425,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/isexe": { @@ -11381,31 +12458,101 @@ "resolved": "https://registry.npmjs.org/istextorbinary/-/istextorbinary-2.2.1.tgz", "integrity": "sha512-TS+hoFl8Z5FAFMK38nhBkdLt44CclNRgDHWeMgsV8ko3nDlr/9UI2Sf839sW7enijf8oKsZYXRvM8g0it9Zmcw==", "dev": true, - "dependencies": { - "binaryextensions": "2", - "editions": "^1.3.3", - "textextensions": "2" - }, + "dependencies": { + "binaryextensions": "2", + "editions": "^1.3.3", + "textextensions": "2" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, "engines": { - "node": ">=0.12" + "node": ">=8" } }, - "node_modules/jake": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.6.tgz", - "integrity": "sha512-G43Ub9IYEFfu72sua6rzooi8V8Gz2lkfk48rW20vEWCGizeaEPlKB1Kh8JIA84yQbiAEfqlPmSpGgCKKxH3rDA==", + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/js-tokens": { @@ -11710,6 +12857,19 @@ "node": "^14.15.0 || >=16.0.0" } }, + "node_modules/lerna/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -11724,9 +12884,9 @@ } }, "node_modules/lib0": { - "version": "0.2.74", - "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.74.tgz", - "integrity": "sha512-roj9i46/JwG5ik5KNTkxP2IytlnrssAkD/OhlAVtE+GqectrdkfR+pttszVLrOzMDeXNs1MPt6yo66MUolWSiA==", + "version": "0.2.78", + "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.78.tgz", + "integrity": "sha512-SV2nU43/6eaYnGH3l0lg2wg1ziB/TH3sAd2E8quXPGwrqo+aX98SNT2ZKucpUr5B8A52jD7ZMjAl+r87Fa/bLQ==", "dependencies": { "isomorphic.js": "^0.2.4" }, @@ -11735,7 +12895,7 @@ "0serve": "bin/0serve.js" }, "engines": { - "node": ">=14" + "node": ">=16" }, "funding": { "type": "GitHub Sponsors ❤", @@ -11769,6 +12929,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/libnpmaccess/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/libnpmaccess/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -11784,6 +12953,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/libnpmaccess/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/libnpmaccess/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/libnpmaccess/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/libnpmpublish": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-6.0.5.tgz", @@ -11812,6 +13014,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/libnpmpublish/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/libnpmpublish/node_modules/normalize-package-data": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", @@ -11842,6 +13053,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/libnpmpublish/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/libnpmpublish/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/libnpmpublish/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/linebreak": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/linebreak/-/linebreak-1.1.0.tgz", @@ -11976,6 +13220,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -12006,12 +13320,11 @@ } }, "node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/lz-string": { @@ -12050,15 +13363,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", @@ -12091,6 +13395,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/make-fetch-happen/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/map-obj": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", @@ -12130,17 +13443,6 @@ "integrity": "sha512-y6oKTq4BB9OQuY/KLfk/O3ysFhB3IMYoIWhGJEidXt1NQFocFK2sA2t0NYZAMyMShAGL6x5OPIbrmXPIqaN9rw==", "dev": true }, - "node_modules/markdown-it/node_modules/entities": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/markdown-table": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", @@ -12191,9 +13493,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", + "integrity": "sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==", "dependencies": { "@types/mdast": "^3.0.0", "@types/unist": "^2.0.0", @@ -12551,9 +13853,9 @@ } }, "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.2.0.tgz", + "integrity": "sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==", "funding": [ { "type": "GitHub Sponsors", @@ -12585,9 +13887,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.1.0.tgz", + "integrity": "sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==", "funding": [ { "type": "GitHub Sponsors", @@ -12637,9 +13939,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.4.tgz", - "integrity": "sha512-WCssN+M9rUyfHN5zPBn3/f0mIA7tqArHL/EKbv3CZK+LT2rG77FEikIQEqBkv46fOqXQK4NEW/Pc7Z27gshpeg==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", "dependencies": { "micromark-util-character": "^1.0.0", "micromark-util-sanitize-uri": "^1.0.0", @@ -12652,9 +13954,9 @@ } }, "node_modules/micromark-extension-gfm-footnote": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.0.tgz", - "integrity": "sha512-RWYce7j8+c0n7Djzv5NzGEGitNNYO3uj+h/XYMdS/JinH1Go+/Qkomg/rfxExFzYTiydaV6GLeffGO5qcJbMPA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", "dependencies": { "micromark-core-commonmark": "^1.0.0", "micromark-factory-space": "^1.0.0", @@ -12671,9 +13973,9 @@ } }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.5.tgz", - "integrity": "sha512-X0oI5eYYQVARhiNfbETy7BfLSmSilzN1eOuoRnrf9oUNsPRrWOAe9UqSizgw1vNxQBfOwL+n2610S3bYjVNi7w==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", "dependencies": { "micromark-util-chunked": "^1.0.0", "micromark-util-classify-character": "^1.0.0", @@ -12688,9 +13990,9 @@ } }, "node_modules/micromark-extension-gfm-table": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.6.tgz", - "integrity": "sha512-92pq7Q+T+4kXH4M6kL+pc8WU23Z9iuhcqmtYFWdFWjm73ZscFpH2xE28+XFpGWlvgq3LUwcN0XC0PGCicYFpgA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -12716,9 +14018,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.4.tgz", - "integrity": "sha512-9XlIUUVnYXHsFF2HZ9jby4h3npfX10S1coXTnV035QGPgrtNYQq3J6IfIvcCIUAJrrqBVi5BqA/LmaOMJqPwMQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", "dependencies": { "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", @@ -12732,9 +14034,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.1.0.tgz", + "integrity": "sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==", "funding": [ { "type": "GitHub Sponsors", @@ -12752,9 +14054,9 @@ } }, "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.1.0.tgz", + "integrity": "sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==", "funding": [ { "type": "GitHub Sponsors", @@ -12773,9 +14075,9 @@ } }, "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12792,9 +14094,9 @@ } }, "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.1.0.tgz", + "integrity": "sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12809,14 +14111,13 @@ "micromark-factory-space": "^1.0.0", "micromark-util-character": "^1.0.0", "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "micromark-util-types": "^1.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.1.0.tgz", + "integrity": "sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12835,9 +14136,9 @@ } }, "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", "funding": [ { "type": "GitHub Sponsors", @@ -12854,9 +14155,9 @@ } }, "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.1.0.tgz", + "integrity": "sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12872,9 +14173,9 @@ } }, "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.1.0.tgz", + "integrity": "sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==", "funding": [ { "type": "GitHub Sponsors", @@ -12892,9 +14193,9 @@ } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.1.0.tgz", + "integrity": "sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==", "funding": [ { "type": "GitHub Sponsors", @@ -12911,9 +14212,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.1.0.tgz", + "integrity": "sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==", "funding": [ { "type": "GitHub Sponsors", @@ -12929,9 +14230,9 @@ } }, "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.1.0.tgz", + "integrity": "sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==", "funding": [ { "type": "GitHub Sponsors", @@ -12950,9 +14251,9 @@ } }, "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.1.0.tgz", + "integrity": "sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==", "funding": [ { "type": "GitHub Sponsors", @@ -12965,9 +14266,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.2.0.tgz", + "integrity": "sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==", "funding": [ { "type": "GitHub Sponsors", @@ -12980,9 +14281,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.1.0.tgz", + "integrity": "sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==", "funding": [ { "type": "GitHub Sponsors", @@ -12998,9 +14299,9 @@ } }, "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.1.0.tgz", + "integrity": "sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==", "funding": [ { "type": "GitHub Sponsors", @@ -13016,9 +14317,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.2.0.tgz", + "integrity": "sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==", "funding": [ { "type": "GitHub Sponsors", @@ -13036,9 +14337,9 @@ } }, "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.1.0.tgz", + "integrity": "sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==", "funding": [ { "type": "GitHub Sponsors", @@ -13057,9 +14358,9 @@ } }, "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", "funding": [ { "type": "GitHub Sponsors", @@ -13072,9 +14373,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", "funding": [ { "type": "GitHub Sponsors", @@ -13260,6 +14561,12 @@ "node": ">=8" } }, + "node_modules/minipass/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/minisearch": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", @@ -13279,6 +14586,12 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -13306,9 +14619,9 @@ } }, "node_modules/mlly": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.2.1.tgz", - "integrity": "sha512-1aMEByaWgBPEbWV2BOPEMySRrzl7rIHXmQxam4DM8jVjalTQDjpN2ZKOLUrwyhfZQO7IXHml2StcHMhooDeEEQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.3.0.tgz", + "integrity": "sha512-HT5mcgIQKkOrZecOjOX3DJorTikWXwsBfpcr/MGBkhfWcjiqvnaL/9ppxvIUXfjT6xt4DVIAsN9fMUz1ev4bIw==", "dev": true, "dependencies": { "acorn": "^8.8.2", @@ -13505,6 +14818,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/node-gyp/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/node-gyp/node_modules/nopt": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", @@ -13520,10 +14845,31 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/node-gyp/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-gyp/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/node-releases": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.11.tgz", - "integrity": "sha512-+M0PwXeU80kRohZ3aT4J/OnR+l9/KD2nVLNNoRgFtnf+umQVFdGBAO2N8+nCnEi0xlh/Wk3zOGC+vNNx+uM79Q==" + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "node_modules/nopt": { "version": "5.0.0", @@ -13555,6 +14901,39 @@ "node": ">=10" } }, + "node_modules/normalize-package-data/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-package-data/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -13585,6 +14964,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-install-checks/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-install-checks/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-install-checks/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-normalize-package-bin": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", @@ -13635,6 +15047,21 @@ "node": ">=10" } }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", @@ -13644,6 +15071,12 @@ "builtins": "^1.0.3" } }, + "node_modules/npm-package-arg/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-packlist": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", @@ -13710,6 +15143,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-pick-manifest/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", @@ -13734,6 +15176,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-pick-manifest/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-registry-fetch": { "version": "13.3.1", "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", @@ -13764,6 +15239,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/npm-registry-fetch/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -13779,6 +15263,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -13807,9 +15324,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.5.tgz", + "integrity": "sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ==", "dev": true }, "node_modules/nx": { @@ -13858,30 +15375,79 @@ "bin": { "nx": "bin/nx.js" }, - "optionalDependencies": { - "@nrwl/nx-darwin-arm64": "15.9.4", - "@nrwl/nx-darwin-x64": "15.9.4", - "@nrwl/nx-linux-arm-gnueabihf": "15.9.4", - "@nrwl/nx-linux-arm64-gnu": "15.9.4", - "@nrwl/nx-linux-arm64-musl": "15.9.4", - "@nrwl/nx-linux-x64-gnu": "15.9.4", - "@nrwl/nx-linux-x64-musl": "15.9.4", - "@nrwl/nx-win32-arm64-msvc": "15.9.4", - "@nrwl/nx-win32-x64-msvc": "15.9.4" + "optionalDependencies": { + "@nrwl/nx-darwin-arm64": "15.9.4", + "@nrwl/nx-darwin-x64": "15.9.4", + "@nrwl/nx-linux-arm-gnueabihf": "15.9.4", + "@nrwl/nx-linux-arm64-gnu": "15.9.4", + "@nrwl/nx-linux-arm64-musl": "15.9.4", + "@nrwl/nx-linux-x64-gnu": "15.9.4", + "@nrwl/nx-linux-x64-musl": "15.9.4", + "@nrwl/nx-win32-arm64-msvc": "15.9.4", + "@nrwl/nx-win32-x64-msvc": "15.9.4" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" }, - "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } + "engines": { + "node": ">=7.0.0" } }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/nx/node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -13941,6 +15507,15 @@ "node": ">= 6" } }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/nx/node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -13980,6 +15555,47 @@ "node": ">=10" } }, + "node_modules/nx/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/nx/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/nx/node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", @@ -14246,6 +15862,76 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/orderedmap": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", @@ -14443,6 +16129,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/pacote/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/pacote/node_modules/npm-package-arg": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz", @@ -14458,6 +16153,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/pacote/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/pacote/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -14546,38 +16274,99 @@ "entities": "^4.4.0" }, "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/patch-package": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", + "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "dev": true, + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "cross-spawn": "^6.0.5", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "is-ci": "^2.0.0", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^5.6.0", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^1.10.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=10", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/patch-package/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/patch-package": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.5.1.tgz", - "integrity": "sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==", + "node_modules/patch-package/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^4.1.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^9.0.0", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.6", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33", - "yaml": "^1.10.2" - }, - "bin": { - "patch-package": "index.js" + "color-name": "~1.1.4" }, "engines": { - "node": ">=10", - "npm": ">5" + "node": ">=7.0.0" } }, + "node_modules/patch-package/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/patch-package/node_modules/cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -14614,6 +16403,15 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/patch-package/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/patch-package/node_modules/open": { "version": "7.4.2", "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", @@ -14690,6 +16488,18 @@ "node": ">=6" } }, + "node_modules/patch-package/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/patch-package/node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -14908,18 +16718,21 @@ } }, "node_modules/playwright-core": { - "version": "1.34.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.0.tgz", - "integrity": "sha512-fMUY1+iR6kYbJF/EsOOqzBA99ZHXbw9sYPNjwA4X/oV0hVF/1aGlWYBGPVUEqxBkGANDKMziYoOdKGU5DIP5Gg==", + "version": "1.34.3", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.34.3.tgz", + "integrity": "sha512-2pWd6G7OHKemc5x1r1rp8aQcpvDh7goMBZlJv6Co5vCNLVcQJdhxRL09SGaY6HcyHH9aT4tiynZabMofVasBYw==", "dev": true, + "bin": { + "playwright-core": "cli.js" + }, "engines": { "node": ">=14" } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "dev": true, "funding": [ { @@ -14950,9 +16763,9 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" }, "node_modules/preact": { - "version": "10.15.0", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.0.tgz", - "integrity": "sha512-nZSa8M2R2m1n7nJSBlzDpxRJaIsejrTO1vlFbdpFvyC8qM1iU+On2y0otfoUm6SRB5o0lF0CKDFxg6grEFU0iQ==", + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.15.1.tgz", + "integrity": "sha512-qs2ansoQEwzNiV5eAcRT1p1EC/dmEzaATVDJNiB3g2sRDWdA7b7MurXdJjB2+/WQktGWZwxvDrnuRFbWuIr64g==", "dev": true, "funding": { "type": "opencollective", @@ -15265,9 +17078,9 @@ } }, "node_modules/prosemirror-view": { - "version": "1.31.3", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.3.tgz", - "integrity": "sha512-UYDa8WxRFZm0xQLXiPJUVTl6H08Fn0IUVDootA7ZlQwzooqVWnBOXLovJyyTKgws1nprfsPhhlvWgt2jo4ZA6g==", + "version": "1.31.4", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.4.tgz", + "integrity": "sha512-nJzH2LpYbonSTYFqQ1BUdEhbd1WPN/rp/K9T9qxBEYpgg3jK3BvEUCR45Ymc9IHpO0m3nBJwPm19RBxZdoBVuw==", "dependencies": { "prosemirror-model": "^1.16.0", "prosemirror-state": "^1.0.0", @@ -15376,9 +17189,9 @@ } }, "node_modules/react-icons": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.8.0.tgz", - "integrity": "sha512-N6+kOLcihDiAnj5Czu637waJqSnwlMNROzVZMhfX68V/9bu9qHaMIJC4UdozWoOk57gahFCNHwVvWzm0MTzRjg==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.9.0.tgz", + "integrity": "sha512-ijUnFr//ycebOqujtqtV9PFS7JjhWg0QU6ykURVHuL4cbofvRCf3f6GMn9+fBktEFQOIVZnuAYLZdiyadRQRFg==", "peerDependencies": { "react": "*" } @@ -15474,6 +17287,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/read-package-json/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/read-package-json/node_modules/normalize-package-data": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", @@ -15498,6 +17320,39 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/read-package-json/node_modules/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-package-json/node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/read-package-json/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", @@ -16354,30 +18209,11 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" } }, "node_modules/set-blocking": { @@ -16569,10 +18405,9 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } @@ -16596,6 +18431,15 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", @@ -16729,6 +18573,12 @@ "node": ">=8" } }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/string.prototype.codepointat": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string.prototype.codepointat/-/string.prototype.codepointat-0.2.1.tgz", @@ -16906,15 +18756,14 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -16981,6 +18830,12 @@ "node": ">=8" } }, + "node_modules/tar/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", @@ -17185,17 +19040,27 @@ } }, "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { - "json5": "^2.2.2", + "@types/json5": "^0.0.29", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" }, - "engines": { - "node": ">=6" + "bin": { + "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { @@ -17255,9 +19120,9 @@ } }, "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "engines": { "node": ">=10" @@ -17296,16 +19161,16 @@ } }, "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", + "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=12.20" } }, "node_modules/uc.micro": { @@ -17754,9 +19619,9 @@ } }, "node_modules/vite": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.8.tgz", - "integrity": "sha512-uYB8PwN7hbMrf4j1xzGDk/lqjsZvCDbt/JC5dyfxc19Pg8kRm14LinK/uq+HSLNswZEoKmweGdtpbnxRtrAXiQ==", + "version": "4.3.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz", + "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==", "dev": true, "dependencies": { "esbuild": "^0.17.5", @@ -17826,6 +19691,15 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/vite-node/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vite-plugin-eslint": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/vite-plugin-eslint/-/vite-plugin-eslint-1.8.1.tgz", @@ -17976,6 +19850,15 @@ } } }, + "node_modules/vitest/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vscode-oniguruma": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", @@ -18222,6 +20105,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -18471,10 +20387,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { "version": "1.10.2", @@ -18601,7 +20516,7 @@ "eslint-config-react-app": "^7.0.0", "jsdom": "^21.1.0", "prettier": "^2.7.1", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1", "vitest": "^0.28.5" @@ -18628,7 +20543,7 @@ "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", "prettier": "^2.7.1", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.4", "vite-plugin-eslint": "^1.8.1" }, @@ -18637,6 +20552,25 @@ "react-dom": "^18" } }, + "packages/react/node_modules/@vitejs/plugin-react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz", + "integrity": "sha512-AfgcRL8ZBhAlc3BFdigClmTUMISmmzHn7sB2h9U1odvc5U/MjWXsAaz18b/WoppUTDBzxOJwo2VdClfUcItu9g==", + "dev": true, + "dependencies": { + "@babel/core": "^7.20.12", + "@babel/plugin-transform-react-jsx-self": "^7.18.6", + "@babel/plugin-transform-react-jsx-source": "^7.19.6", + "magic-string": "^0.27.0", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.1.0-beta.0" + } + }, "packages/website": { "name": "blocknote-website", "version": "0.7.1", diff --git a/package.json b/package.json index 65cde20ddc..675a52165c 100644 --- a/package.json +++ b/package.json @@ -6,15 +6,17 @@ "examples/*" ], "devDependencies": { - "@playwright/test": "^1.25.0", + "@playwright/experimental-ct-react": "^1.33.0", + "@playwright/test": "^1.33.0", + "eslint": "^8.22.0", "lerna": "^5.4.0", "patch-package": "^6.4.7", - "eslint": "^8.22.0" + "typescript": "^5.0.4" }, "scripts": { "start": "lerna run --stream --scope @blocknote/example-editor dev", "start:built": "npx serve examples/editor/dist", - "test:updateSnaps": "docker run --rm -e RUN_IN_DOCKER=true --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.25.0-focal npx playwright test --update-snapshots", + "test:updateSnaps": "docker run --rm -e RUN_IN_DOCKER=true --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.33.0-focal npx playwright test -u", "build": "lerna run --stream build --concurrency 1", "build:site": "lerna run --stream docs:build --concurrency 1", "lint": "lerna run --stream lint", @@ -25,7 +27,9 @@ "install-playwright": "npx playwright install --with-deps", "deploy": "lerna publish -- --access public", "prepublishOnly": "npm run build && cp README.md packages/core/README.md && cp README.md packages/react/README.md", - "postpublish": "rm -rf packages/core/README.md && rm -rf packages/react/README.md" + "postpublish": "rm -rf packages/core/README.md && rm -rf packages/react/README.md", + "test-ct": "playwright test -c playwright-ct.config.ts --headed", + "test-ct:updateSnaps": "docker run --rm -e RUN_IN_DOCKER=true --network host -v $(pwd):/work/ -w /work/ -it mcr.microsoft.com/playwright:v1.33.0-focal npm install && playwright test -c playwright-ct.config.ts -u" }, "overrides": { "react": "18.2.0", diff --git a/packages/core/package.json b/packages/core/package.json index 3c7472cc7d..2474fa222e 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -92,7 +92,7 @@ "eslint-config-react-app": "^7.0.0", "jsdom": "^21.1.0", "prettier": "^2.7.1", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.2", "vite-plugin-eslint": "^1.8.1", "vitest": "^0.28.5" diff --git a/packages/core/src/BlockNoteEditor.ts b/packages/core/src/BlockNoteEditor.ts index a02b99b892..aa872fc467 100644 --- a/packages/core/src/BlockNoteEditor.ts +++ b/packages/core/src/BlockNoteEditor.ts @@ -22,9 +22,14 @@ import styles from "./editor.module.css"; import { Block, BlockIdentifier, + BlockSchema, PartialBlock, } from "./extensions/Blocks/api/blockTypes"; import { TextCursorPosition } from "./extensions/Blocks/api/cursorPositionTypes"; +import { + DefaultBlockSchema, + defaultBlockSchema, +} from "./extensions/Blocks/api/defaultBlocks"; import { ColorStyle, Styles, @@ -37,21 +42,23 @@ import { defaultSlashMenuItems, } from "./extensions/SlashMenu"; -export type BlockNoteEditorOptions = { - // TODO: Figure out if enableBlockNoteExtensions is needed and document them. +export type BlockNoteEditorOptions = { + // TODO: Figure out if enableBlockNoteExtensions/disableHistoryExtension are needed and document them. enableBlockNoteExtensions: boolean; /** * UI element factories for creating a custom UI, including custom positioning * & rendering. */ - uiFactories: UiFactories; + uiFactories: UiFactories; /** * TODO: why is this called slashCommands and not slashMenuItems? * + * (couldn't fix any type, see https://github.com/TypeCellOS/BlockNote/pull/191#discussion_r1210708771) + * * @default defaultSlashMenuItems from `./extensions/SlashMenu` */ - slashCommands: BaseSlashMenuItem[]; + slashCommands: BaseSlashMenuItem[]; /** * The HTML element that should be used as the parent element for the editor. @@ -68,15 +75,15 @@ export type BlockNoteEditorOptions = { /** * A callback function that runs when the editor is ready to be used. */ - onEditorReady: (editor: BlockNoteEditor) => void; + onEditorReady: (editor: BlockNoteEditor) => void; /** * A callback function that runs whenever the editor's contents change. */ - onEditorContentChange: (editor: BlockNoteEditor) => void; + onEditorContentChange: (editor: BlockNoteEditor) => void; /** * A callback function that runs whenever the text cursor position changes. */ - onTextCursorPositionChange: (editor: BlockNoteEditor) => void; + onTextCursorPositionChange: (editor: BlockNoteEditor) => void; /** * Locks the editor from being editable by the user if set to `false`. */ @@ -84,7 +91,7 @@ export type BlockNoteEditorOptions = { /** * The content that should be in the editor when it's created, represented as an array of partial block objects. */ - initialContent: PartialBlock[]; + initialContent: PartialBlock[]; /** * Use default BlockNote font and reset the styles of

  • elements etc., that are used in BlockNote. * @@ -98,6 +105,11 @@ export type BlockNoteEditorOptions = { */ theme: "light" | "dark"; + /** + * A list of block types that should be available in the editor. + */ + blockSchema: BSchema; + /** * When enabled, allows for collaboration between multiple users. */ @@ -133,9 +145,10 @@ const blockNoteTipTapOptions = { enableCoreExtensions: false, }; -export class BlockNoteEditor { +export class BlockNoteEditor { public readonly _tiptapEditor: TiptapEditor & { contentComponent: any }; - private blockCache = new WeakMap(); + public blockCache = new WeakMap>(); + public readonly schema: BSchema; public get domElement() { return this._tiptapEditor.view.dom as HTMLDivElement; @@ -145,20 +158,34 @@ export class BlockNoteEditor { this._tiptapEditor.view.focus(); } - constructor(private readonly options: Partial = {}) { + constructor( + private readonly options: Partial> = {} + ) { // apply defaults - options = { + const newOptions: Omit & { + defaultStyles: boolean; + blockSchema: BSchema; + } = { defaultStyles: true, + // TODO: There's a lot of annoying typing stuff to deal with here. If + // BSchema is specified, then options.blockSchema should also be required. + // If BSchema is not specified, then options.blockSchema should also not + // be defined. Unfortunately, trying to implement these constraints seems + // to be a huge pain, hence the `as any` casts. + blockSchema: options.blockSchema || (defaultBlockSchema as any), ...options, }; - const extensions = getBlockNoteExtensions({ + const extensions = getBlockNoteExtensions({ editor: this, - uiFactories: options.uiFactories || {}, - slashCommands: options.slashCommands || defaultSlashMenuItems, - collaboration: options.collaboration, + uiFactories: newOptions.uiFactories || {}, + slashCommands: newOptions.slashCommands || defaultSlashMenuItems, + blockSchema: newOptions.blockSchema, + collaboration: newOptions.collaboration, }); + this.schema = newOptions.blockSchema; + const tiptapOptions: EditorOptions = { // TODO: This approach to setting initial content is "cleaner" but requires the PM editor schema, which is only // created after initializing the TipTap editor. Not sure it's feasible. @@ -168,39 +195,39 @@ export class BlockNoteEditor { // blockToNode(block, this._tiptapEditor.schema).toJSON() // ), ...blockNoteTipTapOptions, - ...options._tiptapOptions, + ...newOptions._tiptapOptions, onCreate: () => { - options.onEditorReady?.(this); - options.initialContent && - this.replaceBlocks(this.topLevelBlocks, options.initialContent); + newOptions.onEditorReady?.(this); + newOptions.initialContent && + this.replaceBlocks(this.topLevelBlocks, newOptions.initialContent); }, onUpdate: () => { - options.onEditorContentChange?.(this); + newOptions.onEditorContentChange?.(this); }, onSelectionUpdate: () => { - options.onTextCursorPositionChange?.(this); + newOptions.onTextCursorPositionChange?.(this); }, editable: options.editable === undefined ? true : options.editable, extensions: - options.enableBlockNoteExtensions === false - ? options._tiptapOptions?.extensions - : [...(options._tiptapOptions?.extensions || []), ...extensions], + newOptions.enableBlockNoteExtensions === false + ? newOptions._tiptapOptions?.extensions + : [...(newOptions._tiptapOptions?.extensions || []), ...extensions], editorProps: { attributes: { "data-theme": options.theme || "light", - ...(options.editorDOMAttributes || {}), + ...(newOptions.editorDOMAttributes || {}), class: [ styles.bnEditor, styles.bnRoot, - options.defaultStyles ? styles.defaultStyles : "", - options.editorDOMAttributes?.class || "", + newOptions.defaultStyles ? styles.defaultStyles : "", + newOptions.editorDOMAttributes?.class || "", ].join(" "), }, }, }; - if (options.parentElement) { - tiptapOptions.element = options.parentElement; + if (newOptions.parentElement) { + tiptapOptions.element = newOptions.parentElement; } this._tiptapEditor = new Editor(tiptapOptions) as Editor & { @@ -212,11 +239,11 @@ export class BlockNoteEditor { * Gets a snapshot of all top-level (non-nested) blocks in the editor. * @returns A snapshot of all top-level (non-nested) blocks in the editor. */ - public get topLevelBlocks(): Block[] { - const blocks: Block[] = []; + public get topLevelBlocks(): Block[] { + const blocks: Block[] = []; this._tiptapEditor.state.doc.firstChild!.descendants((node) => { - blocks.push(nodeToBlock(node, this.blockCache)); + blocks.push(nodeToBlock(node, this.schema, this.blockCache)); return false; }); @@ -229,12 +256,14 @@ export class BlockNoteEditor { * @param blockIdentifier The identifier of an existing block that should be retrieved. * @returns The block that matches the identifier, or `undefined` if no matching block was found. */ - public getBlock(blockIdentifier: BlockIdentifier): Block | undefined { + public getBlock( + blockIdentifier: BlockIdentifier + ): Block | undefined { const id = typeof blockIdentifier === "string" ? blockIdentifier : blockIdentifier.id; - let newBlock: Block | undefined = undefined; + let newBlock: Block | undefined = undefined; this._tiptapEditor.state.doc.firstChild!.descendants((node) => { if (typeof newBlock !== "undefined") { @@ -245,7 +274,7 @@ export class BlockNoteEditor { return true; } - newBlock = nodeToBlock(node, this.blockCache); + newBlock = nodeToBlock(node, this.schema, this.blockCache); return false; }); @@ -259,7 +288,7 @@ export class BlockNoteEditor { * @param reverse Whether the blocks should be traversed in reverse order. */ public forEachBlock( - callback: (block: Block) => boolean, + callback: (block: Block) => boolean, reverse: boolean = false ): void { const blocks = this.topLevelBlocks.slice(); @@ -268,7 +297,7 @@ export class BlockNoteEditor { blocks.reverse(); } - function traverseBlockArray(blockArray: Block[]): boolean { + function traverseBlockArray(blockArray: Block[]): boolean { for (const block of blockArray) { if (!callback(block)) { return false; @@ -289,11 +318,19 @@ export class BlockNoteEditor { traverseBlockArray(blocks); } + /** + * Executes a callback whenever the editor's contents change. + * @param callback The callback to execute. + */ + public onEditorContentChange(callback: () => void) { + this._tiptapEditor.on("update", callback); + } + /** * Gets a snapshot of the current text cursor position. * @returns A snapshot of the current text cursor position. */ - public getTextCursorPosition(): TextCursorPosition { + public getTextCursorPosition(): TextCursorPosition { const { node, depth, startPos, endPos } = getBlockInfoFromPos( this._tiptapEditor.state.doc, this._tiptapEditor.state.selection.from @@ -321,15 +358,15 @@ export class BlockNoteEditor { } return { - block: nodeToBlock(node, this.blockCache), + block: nodeToBlock(node, this.schema, this.blockCache), prevBlock: prevNode === undefined ? undefined - : nodeToBlock(prevNode, this.blockCache), + : nodeToBlock(prevNode, this.schema, this.blockCache), nextBlock: nextNode === undefined ? undefined - : nodeToBlock(nextNode, this.blockCache), + : nodeToBlock(nextNode, this.schema, this.blockCache), }; } @@ -363,7 +400,7 @@ export class BlockNoteEditor { /** * Gets a snapshot of the current selection. */ - public getSelection(): Selection | undefined { + public getSelection(): Selection | undefined { if ( this._tiptapEditor.state.selection.from === this._tiptapEditor.state.selection.to @@ -371,7 +408,7 @@ export class BlockNoteEditor { return undefined; } - const blocks: Block[] = []; + const blocks: Block[] = []; this._tiptapEditor.state.doc.descendants((node, pos) => { if (node.type.spec.group !== "blockContent") { @@ -388,6 +425,7 @@ export class BlockNoteEditor { blocks.push( nodeToBlock( this._tiptapEditor.state.doc.resolve(pos).node(), + this.schema, this.blockCache ) ); @@ -423,7 +461,7 @@ export class BlockNoteEditor { * `referenceBlock`. Inserts the blocks at the start of the existing block's children if "nested" is used. */ public insertBlocks( - blocksToInsert: PartialBlock[], + blocksToInsert: PartialBlock[], referenceBlock: BlockIdentifier, placement: "before" | "after" | "nested" = "before" ): void { @@ -437,7 +475,10 @@ export class BlockNoteEditor { * @param blockToUpdate The block that should be updated. * @param update A partial block which defines how the existing block should be changed. */ - public updateBlock(blockToUpdate: BlockIdentifier, update: PartialBlock) { + public updateBlock( + blockToUpdate: BlockIdentifier, + update: PartialBlock + ) { updateBlock(blockToUpdate, update, this._tiptapEditor); } @@ -458,7 +499,7 @@ export class BlockNoteEditor { */ public replaceBlocks( blocksToRemove: BlockIdentifier[], - blocksToInsert: PartialBlock[] + blocksToInsert: PartialBlock[] ) { replaceBlocks(blocksToRemove, blocksToInsert, this._tiptapEditor); } @@ -504,6 +545,8 @@ export class BlockNoteEditor { ]); const colorStyles = new Set(["textColor", "backgroundColor"]); + this._tiptapEditor.view.focus(); + for (const [style, value] of Object.entries(styles)) { if (toggleStyles.has(style as ToggledStyle)) { this._tiptapEditor.commands.setMark(style); @@ -518,6 +561,8 @@ export class BlockNoteEditor { * @param styles The styles to remove. */ public removeStyles(styles: Styles) { + this._tiptapEditor.view.focus(); + for (const style of Object.keys(styles)) { this._tiptapEditor.commands.unsetMark(style); } @@ -537,6 +582,8 @@ export class BlockNoteEditor { ]); const colorStyles = new Set(["textColor", "backgroundColor"]); + this._tiptapEditor.view.focus(); + for (const [style, value] of Object.entries(styles)) { if (toggleStyles.has(style as ToggledStyle)) { this._tiptapEditor.commands.toggleMark(style); @@ -632,7 +679,7 @@ export class BlockNoteEditor { * @param blocks An array of blocks that should be serialized into HTML. * @returns The blocks, serialized as an HTML string. */ - public async blocksToHTML(blocks: Block[]): Promise { + public async blocksToHTML(blocks: Block[]): Promise { return blocksToHTML(blocks, this._tiptapEditor.schema); } @@ -643,8 +690,8 @@ export class BlockNoteEditor { * @param html The HTML string to parse blocks from. * @returns The blocks parsed from the HTML string. */ - public async HTMLToBlocks(html: string): Promise { - return HTMLToBlocks(html, this._tiptapEditor.schema); + public async HTMLToBlocks(html: string): Promise[]> { + return HTMLToBlocks(html, this.schema, this._tiptapEditor.schema); } /** @@ -653,7 +700,7 @@ export class BlockNoteEditor { * @param blocks An array of blocks that should be serialized into Markdown. * @returns The blocks, serialized as a Markdown string. */ - public async blocksToMarkdown(blocks: Block[]): Promise { + public async blocksToMarkdown(blocks: Block[]): Promise { return blocksToMarkdown(blocks, this._tiptapEditor.schema); } @@ -664,8 +711,8 @@ export class BlockNoteEditor { * @param markdown The Markdown string to parse blocks from. * @returns The blocks parsed from the Markdown string. */ - public async markdownToBlocks(markdown: string): Promise { - return markdownToBlocks(markdown, this._tiptapEditor.schema); + public async markdownToBlocks(markdown: string): Promise[]> { + return markdownToBlocks(markdown, this.schema, this._tiptapEditor.schema); } /** diff --git a/packages/core/src/BlockNoteExtensions.ts b/packages/core/src/BlockNoteExtensions.ts index 89fdebc17b..f26deb9774 100644 --- a/packages/core/src/BlockNoteExtensions.ts +++ b/packages/core/src/BlockNoteExtensions.ts @@ -20,15 +20,20 @@ import styles from "./editor.module.css"; import { BackgroundColorExtension } from "./extensions/BackgroundColor/BackgroundColorExtension"; import { BackgroundColorMark } from "./extensions/BackgroundColor/BackgroundColorMark"; import { blocks } from "./extensions/Blocks"; +import { BlockSchema } from "./extensions/Blocks/api/blockTypes"; +import { CustomBlockSerializerExtension } from "./extensions/Blocks/api/serialization"; import blockStyles from "./extensions/Blocks/nodes/Block.module.css"; import { BlockSideMenuFactory } from "./extensions/DraggableBlocks/BlockSideMenuFactoryTypes"; -import { DraggableBlocksExtension } from "./extensions/DraggableBlocks/DraggableBlocksExtension"; -import { FormattingToolbarExtension } from "./extensions/FormattingToolbar/FormattingToolbarExtension"; +import { createDraggableBlocksExtension } from "./extensions/DraggableBlocks/DraggableBlocksExtension"; +import { createFormattingToolbarExtension } from "./extensions/FormattingToolbar/FormattingToolbarExtension"; import { FormattingToolbarFactory } from "./extensions/FormattingToolbar/FormattingToolbarFactoryTypes"; import HyperlinkMark from "./extensions/HyperlinkToolbar/HyperlinkMark"; import { HyperlinkToolbarFactory } from "./extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes"; import { Placeholder } from "./extensions/Placeholder/PlaceholderExtension"; -import { BaseSlashMenuItem, SlashMenuExtension } from "./extensions/SlashMenu"; +import { + BaseSlashMenuItem, + createSlashMenuExtension, +} from "./extensions/SlashMenu"; import { TextAlignmentExtension } from "./extensions/TextAlignment/TextAlignmentExtension"; import { TextColorExtension } from "./extensions/TextColor/TextColorExtension"; import { TextColorMark } from "./extensions/TextColor/TextColorMark"; @@ -36,20 +41,21 @@ import { TrailingNode } from "./extensions/TrailingNode/TrailingNodeExtension"; import UniqueID from "./extensions/UniqueID/UniqueID"; import { SuggestionsMenuFactory } from "./shared/plugins/suggestion/SuggestionsMenuFactoryTypes"; -export type UiFactories = Partial<{ - formattingToolbarFactory: FormattingToolbarFactory; +export type UiFactories = Partial<{ + formattingToolbarFactory: FormattingToolbarFactory; hyperlinkToolbarFactory: HyperlinkToolbarFactory; - slashMenuFactory: SuggestionsMenuFactory; - blockSideMenuFactory: BlockSideMenuFactory; + slashMenuFactory: SuggestionsMenuFactory>; + blockSideMenuFactory: BlockSideMenuFactory; }>; /** * Get all the Tiptap extensions BlockNote is configured with by default */ -export const getBlockNoteExtensions = (opts: { - editor: BlockNoteEditor; - uiFactories: UiFactories; - slashCommands: BaseSlashMenuItem[]; +export const getBlockNoteExtensions = (opts: { + editor: BlockNoteEditor; + uiFactories: UiFactories; + slashCommands: BaseSlashMenuItem[]; // couldn't fix type, see https://github.com/TypeCellOS/BlockNote/pull/191#discussion_r1210708771 + blockSchema: BSchema; collaboration?: { fragment: Y.XmlFragment; user: { @@ -101,6 +107,10 @@ export const getBlockNoteExtensions = (opts: { // custom blocks: ...blocks, + ...Object.values(opts.blockSchema).map((blockSpec) => + blockSpec.node.configure({ editor: opts.editor }) + ), + CustomBlockSerializerExtension, Dropcursor.configure({ width: 5, color: "#ddeeff" }), // This needs to be at the bottom of this list, because Key events (such as enter, when selecting a /command), @@ -147,7 +157,7 @@ export const getBlockNoteExtensions = (opts: { if (opts.uiFactories.blockSideMenuFactory) { ret.push( - DraggableBlocksExtension.configure({ + createDraggableBlocksExtension().configure({ editor: opts.editor, blockSideMenuFactory: opts.uiFactories.blockSideMenuFactory, }) @@ -156,7 +166,7 @@ export const getBlockNoteExtensions = (opts: { if (opts.uiFactories.formattingToolbarFactory) { ret.push( - FormattingToolbarExtension.configure({ + createFormattingToolbarExtension().configure({ editor: opts.editor, formattingToolbarFactory: opts.uiFactories.formattingToolbarFactory, }) @@ -175,7 +185,7 @@ export const getBlockNoteExtensions = (opts: { if (opts.uiFactories.slashMenuFactory) { ret.push( - SlashMenuExtension.configure({ + createSlashMenuExtension().configure({ editor: opts.editor, commands: opts.slashCommands, slashMenuFactory: opts.uiFactories.slashMenuFactory, diff --git a/packages/core/src/api/blockManipulation/blockManipulation.test.ts b/packages/core/src/api/blockManipulation/blockManipulation.test.ts index e52c46256c..d869304649 100644 --- a/packages/core/src/api/blockManipulation/blockManipulation.test.ts +++ b/packages/core/src/api/blockManipulation/blockManipulation.test.ts @@ -1,5 +1,6 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { Block, BlockNoteEditor, PartialBlock } from "../.."; +import { DefaultBlockSchema } from "../../extensions/Blocks/api/defaultBlocks"; let editor: BlockNoteEditor; @@ -14,11 +15,13 @@ function waitForEditor() { }); } -let singleBlock: PartialBlock; +let singleBlock: PartialBlock; -let multipleBlocks: PartialBlock[]; +let multipleBlocks: PartialBlock[]; -let insert: (placement: "before" | "nested" | "after") => Block[]; +let insert: ( + placement: "before" | "nested" | "after" +) => Block[]; beforeEach(() => { (window as Window & { __TEST_OPTIONS?: {} }).__TEST_OPTIONS = {}; diff --git a/packages/core/src/api/blockManipulation/blockManipulation.ts b/packages/core/src/api/blockManipulation/blockManipulation.ts index 13d7f9c441..f49729475a 100644 --- a/packages/core/src/api/blockManipulation/blockManipulation.ts +++ b/packages/core/src/api/blockManipulation/blockManipulation.ts @@ -2,13 +2,14 @@ import { Editor } from "@tiptap/core"; import { Node } from "prosemirror-model"; import { BlockIdentifier, + BlockSchema, PartialBlock, } from "../../extensions/Blocks/api/blockTypes"; import { blockToNode } from "../nodeConversions/nodeConversions"; import { getNodeById } from "../util/nodeUtil"; -export function insertBlocks( - blocksToInsert: PartialBlock[], +export function insertBlocks( + blocksToInsert: PartialBlock[], referenceBlock: BlockIdentifier, placement: "before" | "after" | "nested" = "before", editor: Editor @@ -56,9 +57,9 @@ export function insertBlocks( editor.view.dispatch(editor.state.tr.insert(insertionPos, nodesToInsert)); } -export function updateBlock( +export function updateBlock( blockToUpdate: BlockIdentifier, - update: PartialBlock, + update: PartialBlock, editor: Editor ) { const id = @@ -115,9 +116,9 @@ export function removeBlocks( } } -export function replaceBlocks( +export function replaceBlocks( blocksToRemove: BlockIdentifier[], - blocksToInsert: PartialBlock[], + blocksToInsert: PartialBlock[], editor: Editor ) { insertBlocks(blocksToInsert, blocksToRemove[0], "before", editor); diff --git a/packages/core/src/api/formatConversions/formatConversions.test.ts b/packages/core/src/api/formatConversions/formatConversions.test.ts index ef390dad25..0d8e4054c1 100644 --- a/packages/core/src/api/formatConversions/formatConversions.test.ts +++ b/packages/core/src/api/formatConversions/formatConversions.test.ts @@ -1,25 +1,30 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { Block, BlockNoteEditor } from "../.."; import UniqueID from "../../extensions/UniqueID/UniqueID"; +import { DefaultBlockSchema } from "../../extensions/Blocks/api/defaultBlocks"; let editor: BlockNoteEditor; -let nonNestedBlocks: Block[]; +let nonNestedBlocks: Block[]; let nonNestedHTML: string; let nonNestedMarkdown: string; -let nestedBlocks: Block[]; +let nestedBlocks: Block[]; // let nestedHTML: string; // let nestedMarkdown: string; -let styledBlocks: Block[]; +let styledBlocks: Block[]; let styledHTML: string; let styledMarkdown: string; -let complexBlocks: Block[]; +let complexBlocks: Block[]; // let complexHTML: string; // let complexMarkdown: string; +function removeInlineContentClass(html: string) { + return html.replace(/ class="_inlineContent_1c48ad"/g, ""); +} + beforeEach(() => { (window as Window & { __TEST_OPTIONS?: {} }).__TEST_OPTIONS = {}; @@ -665,7 +670,7 @@ describe("Non-Nested Block/HTML/Markdown Conversions", () => { it("Convert non-nested blocks to HTML", async () => { const output = await editor.blocksToHTML(nonNestedBlocks); - expect(output).toMatchSnapshot(); + expect(removeInlineContentClass(output)).toMatchSnapshot(); }); it("Convert non-nested blocks to Markdown", async () => { @@ -691,7 +696,7 @@ describe("Nested Block/HTML/Markdown Conversions", () => { it("Convert nested blocks to HTML", async () => { const output = await editor.blocksToHTML(nestedBlocks); - expect(output).toMatchSnapshot(); + expect(removeInlineContentClass(output)).toMatchSnapshot(); }); it("Convert nested blocks to Markdown", async () => { @@ -717,7 +722,7 @@ describe("Styled Block/HTML/Markdown Conversions", () => { it("Convert styled blocks to HTML", async () => { const output = await editor.blocksToHTML(styledBlocks); - expect(output).toMatchSnapshot(); + expect(removeInlineContentClass(output)).toMatchSnapshot(); }); it("Convert styled blocks to Markdown", async () => { @@ -743,7 +748,7 @@ describe("Complex Block/HTML/Markdown Conversions", () => { it("Convert complex blocks to HTML", async () => { const output = await editor.blocksToHTML(complexBlocks); - expect(output).toMatchSnapshot(); + expect(removeInlineContentClass(output)).toMatchSnapshot(); }); it("Convert complex blocks to Markdown", async () => { diff --git a/packages/core/src/api/formatConversions/formatConversions.ts b/packages/core/src/api/formatConversions/formatConversions.ts index 4e7db0d061..0f956446c8 100644 --- a/packages/core/src/api/formatConversions/formatConversions.ts +++ b/packages/core/src/api/formatConversions/formatConversions.ts @@ -7,13 +7,14 @@ import remarkParse from "remark-parse"; import remarkRehype from "remark-rehype"; import remarkStringify from "remark-stringify"; import { unified } from "unified"; -import { Block } from "../../extensions/Blocks/api/blockTypes"; +import { Block, BlockSchema } from "../../extensions/Blocks/api/blockTypes"; + import { blockToNode, nodeToBlock } from "../nodeConversions/nodeConversions"; import { removeUnderlines } from "./removeUnderlinesRehypePlugin"; import { simplifyBlocks } from "./simplifyBlocksRehypePlugin"; -export async function blocksToHTML( - blocks: Block[], +export async function blocksToHTML( + blocks: Block[], schema: Schema ): Promise { const htmlParentElement = document.createElement("div"); @@ -37,27 +38,28 @@ export async function blocksToHTML( return htmlString.value as string; } -export async function HTMLToBlocks( +export async function HTMLToBlocks( html: string, + blockSchema: BSchema, schema: Schema -): Promise { +): Promise[]> { const htmlNode = document.createElement("div"); htmlNode.innerHTML = html.trim(); const parser = DOMParser.fromSchema(schema); const parentNode = parser.parse(htmlNode); - const blocks: Block[] = []; + const blocks: Block[] = []; for (let i = 0; i < parentNode.firstChild!.childCount; i++) { - blocks.push(nodeToBlock(parentNode.firstChild!.child(i))); + blocks.push(nodeToBlock(parentNode.firstChild!.child(i), blockSchema)); } return blocks; } -export async function blocksToMarkdown( - blocks: Block[], +export async function blocksToMarkdown( + blocks: Block[], schema: Schema ): Promise { const markdownString = await unified() @@ -71,10 +73,11 @@ export async function blocksToMarkdown( return markdownString.value as string; } -export async function markdownToBlocks( +export async function markdownToBlocks( markdown: string, + blockSchema: BSchema, schema: Schema -): Promise { +): Promise[]> { const htmlString = await unified() .use(remarkParse) .use(remarkGfm) @@ -82,5 +85,5 @@ export async function markdownToBlocks( .use(rehypeStringify) .process(markdown); - return HTMLToBlocks(htmlString.value as string, schema); + return HTMLToBlocks(htmlString.value as string, blockSchema, schema); } diff --git a/packages/core/src/api/nodeConversions/nodeConversions.test.ts b/packages/core/src/api/nodeConversions/nodeConversions.test.ts index 9b14d95648..6739936d14 100644 --- a/packages/core/src/api/nodeConversions/nodeConversions.test.ts +++ b/packages/core/src/api/nodeConversions/nodeConversions.test.ts @@ -5,14 +5,18 @@ import { BlockNoteEditor, PartialBlock } from "../.."; import UniqueID from "../../extensions/UniqueID/UniqueID"; import { blockToNode, nodeToBlock } from "./nodeConversions"; import { partialBlockToBlockForTesting } from "./testUtil"; +import { + defaultBlockSchema, + DefaultBlockSchema, +} from "../../extensions/Blocks/api/defaultBlocks"; let editor: BlockNoteEditor; let tt: Editor; -let simpleBlock: PartialBlock; +let simpleBlock: PartialBlock; let simpleNode: Node; -let complexBlock: PartialBlock; +let complexBlock: PartialBlock; let complexNode: Node; beforeEach(() => { @@ -119,7 +123,10 @@ describe("Simple ProseMirror Node Conversions", () => { }); it("Convert simple node to block", async () => { - const firstBlockConversion = nodeToBlock(simpleNode); + const firstBlockConversion = nodeToBlock( + simpleNode, + defaultBlockSchema + ); expect(firstBlockConversion).toMatchSnapshot(); @@ -137,7 +144,10 @@ describe("Complex ProseMirror Node Conversions", () => { }); it("Convert complex node to block", async () => { - const firstBlockConversion = nodeToBlock(complexNode); + const firstBlockConversion = nodeToBlock( + complexNode, + defaultBlockSchema + ); expect(firstBlockConversion).toMatchSnapshot(); @@ -149,7 +159,7 @@ describe("Complex ProseMirror Node Conversions", () => { describe("links", () => { it("Convert a block with link", async () => { - const block: PartialBlock = { + const block: PartialBlock = { id: UniqueID.options.generateID(), type: "paragraph", content: [ @@ -162,7 +172,10 @@ describe("links", () => { }; const node = blockToNode(block, tt.schema); expect(node).toMatchSnapshot(); - const outputBlock = nodeToBlock(node); + const outputBlock = nodeToBlock( + node, + defaultBlockSchema + ); // Temporary fix to set props to {}, because at this point // we don't have an easy way to access default props at runtime, @@ -174,7 +187,7 @@ describe("links", () => { }); it("Convert link block with marks", async () => { - const block: PartialBlock = { + const block: PartialBlock = { id: UniqueID.options.generateID(), type: "paragraph", content: [ @@ -200,7 +213,10 @@ describe("links", () => { }; const node = blockToNode(block, tt.schema); // expect(node).toMatchSnapshot(); - const outputBlock = nodeToBlock(node); + const outputBlock = nodeToBlock( + node, + defaultBlockSchema + ); // Temporary fix to set props to {}, because at this point // we don't have an easy way to access default props at runtime, @@ -212,7 +228,7 @@ describe("links", () => { }); it("Convert two adjacent links in a block", async () => { - const block: PartialBlock = { + const block: PartialBlock = { id: UniqueID.options.generateID(), type: "paragraph", content: [ @@ -231,7 +247,10 @@ describe("links", () => { const node = blockToNode(block, tt.schema); expect(node).toMatchSnapshot(); - const outputBlock = nodeToBlock(node); + const outputBlock = nodeToBlock( + node, + defaultBlockSchema + ); // Temporary fix to set props to {}, because at this point // we don't have an easy way to access default props at runtime, diff --git a/packages/core/src/api/nodeConversions/nodeConversions.ts b/packages/core/src/api/nodeConversions/nodeConversions.ts index 9a71910367..5c4dfeef73 100644 --- a/packages/core/src/api/nodeConversions/nodeConversions.ts +++ b/packages/core/src/api/nodeConversions/nodeConversions.ts @@ -2,9 +2,11 @@ import { Mark } from "@tiptap/pm/model"; import { Node, Schema } from "prosemirror-model"; import { Block, - blockProps, + BlockSchema, PartialBlock, } from "../../extensions/Blocks/api/blockTypes"; + +import { defaultProps } from "../../extensions/Blocks/api/defaultBlocks"; import { ColorStyle, InlineContent, @@ -105,7 +107,10 @@ export function inlineContentToNodes( /** * Converts a BlockNote block to a TipTap node. */ -export function blockToNode(block: PartialBlock, schema: Schema) { +export function blockToNode( + block: PartialBlock, + schema: Schema +) { let id = block.id; if (id === undefined) { @@ -214,10 +219,11 @@ function contentNodeToInlineContent(contentNode: Node) { /** * Convert a TipTap node to a BlockNote block. */ -export function nodeToBlock( +export function nodeToBlock( node: Node, - blockCache?: WeakMap -): Block { + blockSchema: BSchema, + blockCache?: WeakMap> +): Block { if (node.type.name !== "blockContainer") { throw Error( "Node must be of type blockContainer, but is of type" + @@ -246,29 +252,44 @@ export function nodeToBlock( ...blockInfo.node.attrs, ...blockInfo.contentNode.attrs, })) { - if (!(blockInfo.contentType.name in blockProps)) { + const blockSpec = blockSchema[blockInfo.contentType.name]; + if (!blockSpec) { throw Error( "Block is of an unrecognized type: " + blockInfo.contentType.name ); } - const validAttrs = blockProps[blockInfo.contentType.name as Block["type"]]; + const propSchema = blockSpec.propSchema; - if (validAttrs.has(attr)) { + if (attr in propSchema) { props[attr] = value; } + // Block ids are stored as node attributes the same way props are, so we + // need to ensure we don't attempt to read block ids as props. + + // the second check is for the backgroundColor & textColor props. + // Since we want them to be inherited by child blocks, we can't put them on the blockContent node, + // and instead have to put them on the blockContainer node. + // The blockContainer node is the same for all block types, but some custom blocks might not use backgroundColor & textColor, + // so these 2 props are technically unexpected but we shouldn't log a warning. + // (this is a bit hacky) + else if (attr !== "id" && !(attr in defaultProps)) { + console.warn("Block has an unrecognized attribute: " + attr); + } } const content = contentNodeToInlineContent(blockInfo.contentNode); - const children: Block[] = []; + const children: Block[] = []; for (let i = 0; i < blockInfo.numChildBlocks; i++) { - children.push(nodeToBlock(blockInfo.node.lastChild!.child(i))); + children.push( + nodeToBlock(blockInfo.node.lastChild!.child(i), blockSchema, blockCache) + ); } - const block: Block = { + const block: Block = { id, - type: blockInfo.contentType.name as Block["type"], + type: blockInfo.contentType.name, props, content, children, diff --git a/packages/core/src/api/nodeConversions/testUtil.ts b/packages/core/src/api/nodeConversions/testUtil.ts index 69531e2fc9..272121ba01 100644 --- a/packages/core/src/api/nodeConversions/testUtil.ts +++ b/packages/core/src/api/nodeConversions/testUtil.ts @@ -1,4 +1,8 @@ -import { Block, PartialBlock } from "../../extensions/Blocks/api/blockTypes"; +import { + Block, + BlockSchema, + PartialBlock, +} from "../../extensions/Blocks/api/blockTypes"; import { InlineContent, PartialInlineContent, @@ -39,9 +43,9 @@ function partialContentToInlineContent( }); } -export function partialBlockToBlockForTesting( - partialBlock: PartialBlock -): Block { +export function partialBlockToBlockForTesting( + partialBlock: PartialBlock +): Block { const withDefaults = { id: "", type: "paragraph" as any, diff --git a/packages/core/src/editor.module.css b/packages/core/src/editor.module.css index f73cd09944..923ba5fad2 100644 --- a/packages/core/src/editor.module.css +++ b/packages/core/src/editor.module.css @@ -38,7 +38,6 @@ Tippy popups that are appended to document.body directly .defaultStyles h3, .defaultStyles li { all: unset !important; - flex-grow: 1 !important; margin: 0; padding: 0; font-size: inherit; diff --git a/packages/core/src/extensions/Blocks/api/block.ts b/packages/core/src/extensions/Blocks/api/block.ts new file mode 100644 index 0000000000..77604299a9 --- /dev/null +++ b/packages/core/src/extensions/Blocks/api/block.ts @@ -0,0 +1,229 @@ +import { Attribute, Node } from "@tiptap/core"; +import { BlockNoteEditor } from "../../.."; +import styles from "../nodes/Block.module.css"; +import { + BlockConfig, + BlockSchema, + BlockSpec, + PropSchema, + TipTapNode, + TipTapNodeConfig, +} from "./blockTypes"; + +export function camelToDataKebab(str: string): string { + return "data-" + str.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); +} + +// Function that uses the 'propSchema' of a blockConfig to create a TipTap +// node's `addAttributes` property. +export function propsToAttributes< + BType extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +>( + blockConfig: Omit< + BlockConfig, + "render" + > +) { + const tiptapAttributes: Record = {}; + + Object.entries(blockConfig.propSchema).forEach(([name, spec]) => { + tiptapAttributes[name] = { + default: spec.default, + keepOnSplit: true, + // Props are displayed in kebab-case as HTML attributes. If a prop's + // value is the same as its default, we don't display an HTML + // attribute for it. + parseHTML: (element) => element.getAttribute(camelToDataKebab(name)), + renderHTML: (attributes) => + attributes[name] !== spec.default + ? { + [camelToDataKebab(name)]: attributes[name], + } + : {}, + }; + }); + + return tiptapAttributes; +} + +// Function that uses the 'parse' function of a blockConfig to create a +// TipTap node's `parseHTML` property. This is only used for parsing content +// from the clipboard. +export function parse< + BType extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +>( + blockConfig: Omit< + BlockConfig, + "render" + > +) { + return [ + { + tag: "div[data-content-type=" + blockConfig.type + "]", + }, + ]; +} + +// Function that uses the 'render' function of a blockConfig to create a +// TipTap node's `renderHTML` property. Since custom blocks use node views, +// this is only used for serializing content to the clipboard. +export function render< + BType extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +>( + blockConfig: Omit< + BlockConfig, + "render" + >, + HTMLAttributes: Record +) { + // Create blockContent element + const blockContent = document.createElement("div"); + // Add blockContent HTML attribute + blockContent.setAttribute("data-content-type", blockConfig.type); + // Add props as HTML attributes in kebab-case with "data-" prefix + for (const [attribute, value] of Object.entries(HTMLAttributes)) { + blockContent.setAttribute(attribute, value); + } + + // TODO: This only works for content copied within BlockNote. + // Creates contentDOM element to serialize inline content into. + let contentDOM: HTMLDivElement | undefined; + if (blockConfig.containsInlineContent) { + contentDOM = document.createElement("div"); + blockContent.appendChild(contentDOM); + } else { + contentDOM = undefined; + } + + return contentDOM !== undefined + ? { + dom: blockContent, + contentDOM: contentDOM, + } + : { + dom: blockContent, + }; +} + +// A function to create custom block for API consumers +// we want to hide the tiptap node from API consumers and provide a simpler API surface instead +export function createBlockSpec< + BType extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +>( + blockConfig: BlockConfig +): BlockSpec { + const node = createTipTapBlock({ + name: blockConfig.type, + content: blockConfig.containsInlineContent ? "inline*" : "", + selectable: blockConfig.containsInlineContent, + + addOptions() { + return { + editor: undefined, + }; + }, + + addAttributes() { + return propsToAttributes(blockConfig); + }, + + parseHTML() { + return parse(blockConfig); + }, + + renderHTML({ HTMLAttributes }) { + return render(blockConfig, HTMLAttributes); + }, + + addNodeView() { + return ({ HTMLAttributes, getPos }) => { + // Create blockContent element + const blockContent = document.createElement("div"); + // Sets blockContent class + blockContent.className = styles.blockContent; + // Add blockContent HTML attribute + blockContent.setAttribute("data-content-type", blockConfig.type); + // Add props as HTML attributes in kebab-case with "data-" prefix + for (const [attribute, value] of Object.entries(HTMLAttributes)) { + blockContent.setAttribute(attribute, value); + } + + // Gets BlockNote editor instance + const editor = this.options.editor! as BlockNoteEditor< + BSchema & { [k in BType]: BlockSpec } + >; + // Gets position of the node + if (typeof getPos === "boolean") { + throw new Error( + "Cannot find node position as getPos is a boolean, not a function." + ); + } + const pos = getPos(); + // Gets TipTap editor instance + const tipTapEditor = editor._tiptapEditor; + // Gets parent blockContainer node + const blockContainer = tipTapEditor.state.doc.resolve(pos!).node(); + // Gets block identifier + const blockIdentifier = blockContainer.attrs.id; + + // Get the block + const block = editor.getBlock(blockIdentifier)!; + if (block.type !== blockConfig.type) { + throw new Error("Block type does not match"); + } + + // Render elements + const rendered = blockConfig.render(block as any, editor); + // Add inlineContent class to inline content + if ("contentDOM" in rendered) { + rendered.contentDOM.className = `${ + rendered.contentDOM.className + ? rendered.contentDOM.className + " " + : "" + }${styles.inlineContent}`; + } + // Add elements to blockContent + blockContent.appendChild(rendered.dom); + + return "contentDOM" in rendered + ? { + dom: blockContent, + contentDOM: rendered.contentDOM, + } + : { + dom: blockContent, + }; + }; + }, + }); + + return { + node: node, + propSchema: blockConfig.propSchema, + }; +} + +export function createTipTapBlock( + config: TipTapNodeConfig +): TipTapNode { + // Type cast is needed as Node.name is mutable, though there is basically no + // reason to change it after creation. Alternative is to wrap Node in a new + // class, which I don't think is worth it since we'd only be changing 1 + // attribute to be read only. + return Node.create({ + ...config, + group: "blockContent", + }) as TipTapNode; +} diff --git a/packages/core/src/extensions/Blocks/api/blockTypes.ts b/packages/core/src/extensions/Blocks/api/blockTypes.ts index e3452bf116..ee49d9921d 100644 --- a/packages/core/src/extensions/Blocks/api/blockTypes.ts +++ b/packages/core/src/extensions/Blocks/api/blockTypes.ts @@ -1,90 +1,177 @@ /** Define the main block types **/ - +import { Node, NodeConfig } from "@tiptap/core"; +import { BlockNoteEditor } from "../../../BlockNoteEditor"; import { InlineContent, PartialInlineContent } from "./inlineContentTypes"; -export type BlockTemplate< - // Type of the block. - // Examples might include: "paragraph", "heading", or "bulletListItem". - Type extends string, - // Changeable props which affect the block's behaviour or appearance. - // An example might be: { textAlignment: "left" | "right" | "center" } for a paragraph block. - Props extends Record +// A configuration for a TipTap node, but with stricter type constraints on the +// "name" and "group" properties. The "name" property is now always a string +// literal type, and the "blockGroup" property cannot be configured as it should +// always be "blockContent". Used as the parameter in `createTipTapNode`. +export type TipTapNodeConfig< + Name extends string, + Options = any, + Storage = any > = { - id: string; - type: Type; - props: Props; - content: InlineContent[]; - children: Block[]; + [K in keyof NodeConfig]: K extends "name" + ? Name + : K extends "group" + ? never + : NodeConfig[K]; }; -export type DefaultBlockProps = { - backgroundColor: string; - textColor: string; - textAlignment: "left" | "center" | "right" | "justify"; +// A TipTap node with stricter type constraints on the "name" and "group" +// properties. The "name" property is now a string literal type, and the +// "blockGroup" property is now "blockContent". Returned by `createTipTapNode`. +export type TipTapNode< + Name extends string, + Options = any, + Storage = any +> = Node & { + name: Name; + group: "blockContent"; }; -export type NumberedListItemBlock = BlockTemplate< - "numberedListItem", - DefaultBlockProps ->; +// Defines a single prop spec, which includes the default value the prop should +// take and possible values it can take. +export type PropSpec = { + values?: readonly string[]; + default: string; +}; -export type BulletListItemBlock = BlockTemplate< - "bulletListItem", - DefaultBlockProps ->; +// Defines multiple block prop specs. The key of each prop is the name of the +// prop, while the value is a corresponding prop spec. This should be included +// in a block config or schema. From a prop schema, we can derive both the props' +// internal implementation (as TipTap node attributes) and the type information +// for the external API. +export type PropSchema = Record; -export type HeadingBlock = BlockTemplate< - "heading", - DefaultBlockProps & { - level: "1" | "2" | "3"; - } ->; +// Defines Props objects for use in Block objects in the external API. Converts +// each prop spec into a union type of its possible values, or a string if no +// values are specified. +export type Props = { + [PType in keyof PSchema]: PSchema[PType]["values"] extends readonly string[] + ? PSchema[PType]["values"][number] + : string; +}; -export type ParagraphBlock = BlockTemplate<"paragraph", DefaultBlockProps>; +// Defines the config for a single block. Meant to be used as an argument to +// `createBlockSpec`, which will create a new block spec from it. This is the +// main way we expect people to create custom blocks as consumers don't need to +// know anything about the TipTap API since the associated nodes are created +// automatically. +export type BlockConfig< + Type extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +> = { + // Attributes to define block in the API as well as a TipTap node. + type: Type; + readonly propSchema: PSchema; -export type Block = - | ParagraphBlock - | HeadingBlock - | BulletListItemBlock - | NumberedListItemBlock; + // Additional attributes to help define block as a TipTap node. + containsInlineContent: ContainsInlineContent; + render: ( + /** + * The custom block to render + */ + block: SpecificBlock< + BSchema & { [k in Type]: BlockSpec }, + Type + >, + /** + * The BlockNote editor instance + * This is typed generically. If you want an editor with your custom schema, you need to + * cast it manually, e.g.: `const e = editor as BlockNoteEditor;` + */ + editor: BlockNoteEditor }> + // (note) if we want to fix the manual cast, we need to prevent circular references and separate block definition and render implementations + // or allow manually passing , but that's not possible without passing the other generics because Typescript doesn't support partial inferred generics + ) => ContainsInlineContent extends true + ? { + dom: HTMLElement; + contentDOM: HTMLElement; + } + : { + dom: HTMLElement; + }; +}; -export type BlockIdentifier = string | Block; +// Defines a single block spec, which includes the props that the block has and +// the TipTap node used to implement it. Usually created using `createBlockSpec` +// though it can also be defined from scratch by providing your own TipTap node, +// allowing for more advanced custom blocks. +export type BlockSpec = { + readonly propSchema: PSchema; + node: TipTapNode; +}; -/** Define "Partial Blocks", these are for updating or creating blocks */ -export type PartialBlockTemplate = B extends Block - ? Partial> & { - type?: B["type"]; - props?: Partial; - content?: string | PartialInlineContent[]; - children?: PartialBlock[]; - } +// Utility type. For a given object block schema, ensures that the key of each +// block spec matches the name of the TipTap node in it. +export type TypesMatch< + Blocks extends Record> +> = Blocks extends { + [Type in keyof Blocks]: Type extends string + ? Blocks[Type] extends BlockSpec + ? Blocks[Type] + : never + : never; +} + ? Blocks : never; -export type PartialBlock = PartialBlockTemplate; +// Defines multiple block specs. Also ensures that the key of each block schema +// is the same as name of the TipTap node in it. This should be passed in the +// `blocks` option of the BlockNoteEditor. From a block schema, we can derive +// both the blocks' internal implementation (as TipTap nodes) and the type +// information for the external API. +export type BlockSchema = TypesMatch< + Record> +>; -export type BlockPropsTemplate = Props extends Block["props"] - ? keyof Props - : never; +// Converts each block spec into a Block object without children. We later merge +// them into a union type and add a children property to create the Block and +// PartialBlock objects we use in the external API. +type BlocksWithoutChildren = { + [BType in keyof BSchema]: { + id: string; + type: BType; + props: Props; + content: InlineContent[]; + }; +}; -/** - * Expose blockProps. This is currently not very nice, but it's expected this - * will change anyway once we allow for custom blocks - */ - -export const globalProps: Array = [ - "backgroundColor", - "textColor", - "textAlignment", -]; - -export const blockProps: Record> = { - paragraph: new Set([...globalProps]), - heading: new Set([ - ...globalProps, - "level" as const, - ]), - numberedListItem: new Set([ - ...globalProps, - ]), - bulletListItem: new Set([...globalProps]), +// Converts each block spec into a Block object without children, merges them +// into a union type, and adds a children property +export type Block = + BlocksWithoutChildren[keyof BlocksWithoutChildren] & { + children: Block[]; + }; + +export type SpecificBlock< + BSchema extends BlockSchema, + BlockType extends keyof BSchema +> = BlocksWithoutChildren[BlockType] & { + children: Block[]; +}; + +// Same as BlockWithoutChildren, but as a partial type with some changes to make +// it easier to create/update blocks in the editor. +type PartialBlocksWithoutChildren = { + [BType in keyof BSchema]: Partial<{ + id: string; + type: BType; + props: Partial>; + content: PartialInlineContent[] | string; + }>; }; + +// Same as Block, but as a partial type with some changes to make it easier to +// create/update blocks in the editor. +export type PartialBlock = + PartialBlocksWithoutChildren[keyof PartialBlocksWithoutChildren] & + Partial<{ + children: PartialBlock[]; + }>; + +export type BlockIdentifier = { id: string } | string; diff --git a/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts b/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts index 8ff637ceba..eb17e098f3 100644 --- a/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts +++ b/packages/core/src/extensions/Blocks/api/cursorPositionTypes.ts @@ -1,7 +1,7 @@ -import { Block } from "./blockTypes"; +import { Block, BlockSchema } from "./blockTypes"; -export type TextCursorPosition = { - block: Block; - prevBlock: Block | undefined; - nextBlock: Block | undefined; +export type TextCursorPosition = { + block: Block; + prevBlock: Block | undefined; + nextBlock: Block | undefined; }; diff --git a/packages/core/src/extensions/Blocks/api/defaultBlocks.ts b/packages/core/src/extensions/Blocks/api/defaultBlocks.ts new file mode 100644 index 0000000000..d60d716cce --- /dev/null +++ b/packages/core/src/extensions/Blocks/api/defaultBlocks.ts @@ -0,0 +1,44 @@ +import { HeadingBlockContent } from "../nodes/BlockContent/HeadingBlockContent/HeadingBlockContent"; +import { BulletListItemBlockContent } from "../nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent"; +import { NumberedListItemBlockContent } from "../nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent"; +import { ParagraphBlockContent } from "../nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent"; +import { PropSchema, TypesMatch } from "./blockTypes"; + +export const defaultProps = { + backgroundColor: { + default: "transparent" as const, + }, + textColor: { + default: "black" as const, // TODO + }, + textAlignment: { + default: "left" as const, + values: ["left", "center", "right", "justify"] as const, + }, +} satisfies PropSchema; + +export type DefaultProps = typeof defaultProps; + +export const defaultBlockSchema = { + paragraph: { + propSchema: defaultProps, + node: ParagraphBlockContent, + }, + heading: { + propSchema: { + ...defaultProps, + level: { default: "1", values: ["1", "2", "3"] as const }, + }, + node: HeadingBlockContent, + }, + bulletListItem: { + propSchema: defaultProps, + node: BulletListItemBlockContent, + }, + numberedListItem: { + propSchema: defaultProps, + node: NumberedListItemBlockContent, + }, +} as const; + +export type DefaultBlockSchema = TypesMatch; diff --git a/packages/core/src/extensions/Blocks/api/selectionTypes.ts b/packages/core/src/extensions/Blocks/api/selectionTypes.ts index 9fbd40d6b6..8a23f48094 100644 --- a/packages/core/src/extensions/Blocks/api/selectionTypes.ts +++ b/packages/core/src/extensions/Blocks/api/selectionTypes.ts @@ -1,5 +1,5 @@ -import { Block } from "./blockTypes"; +import { Block, BlockSchema } from "./blockTypes"; -export type Selection = { - blocks: Block[]; +export type Selection = { + blocks: Block[]; }; diff --git a/packages/core/src/extensions/Blocks/api/serialization.ts b/packages/core/src/extensions/Blocks/api/serialization.ts new file mode 100644 index 0000000000..58557853c3 --- /dev/null +++ b/packages/core/src/extensions/Blocks/api/serialization.ts @@ -0,0 +1,29 @@ +import { Extension } from "@tiptap/core"; +import { Plugin } from "prosemirror-state"; +import { DOMSerializer, Schema } from "prosemirror-model"; + +const customBlockSerializer = (schema: Schema) => { + const defaultSerializer = DOMSerializer.fromSchema(schema); + + return new DOMSerializer( + { + ...defaultSerializer.nodes, + // TODO: If a serializer is defined in the config for a custom block, it + // should be added here. We still need to figure out how the serializer + // should be defined in the custom blocks API though, and implement that, + // before we can do this. + }, + defaultSerializer.marks + ); +}; +export const CustomBlockSerializerExtension = Extension.create({ + addProseMirrorPlugins() { + return [ + new Plugin({ + props: { + clipboardSerializer: customBlockSerializer(this.editor.schema), + }, + }), + ]; + }, +}); \ No newline at end of file diff --git a/packages/core/src/extensions/Blocks/index.ts b/packages/core/src/extensions/Blocks/index.ts index 55f28397bd..991ad16678 100644 --- a/packages/core/src/extensions/Blocks/index.ts +++ b/packages/core/src/extensions/Blocks/index.ts @@ -1,16 +1,8 @@ import { Node } from "@tiptap/core"; import { BlockContainer } from "./nodes/BlockContainer"; import { BlockGroup } from "./nodes/BlockGroup"; -import { ParagraphBlockContent } from "./nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent"; -import { HeadingBlockContent } from "./nodes/BlockContent/HeadingBlockContent/HeadingBlockContent"; -import { BulletListItemBlockContent } from "./nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent"; -import { NumberedListItemBlockContent } from "./nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent"; export const blocks: any[] = [ - ParagraphBlockContent, - HeadingBlockContent, - BulletListItemBlockContent, - NumberedListItemBlockContent, BlockContainer, BlockGroup, Node.create({ diff --git a/packages/core/src/extensions/Blocks/nodes/Block.module.css b/packages/core/src/extensions/Blocks/nodes/Block.module.css index acb851a4ac..a85152345a 100644 --- a/packages/core/src/extensions/Blocks/nodes/Block.module.css +++ b/packages/core/src/extensions/Blocks/nodes/Block.module.css @@ -7,14 +7,26 @@ BASIC STYLES transition: margin 0.2s; } +/*Ensures blocks & block content spans editor width*/ +.block { + display: flex; + flex-direction: column; +} + +/*Ensures block content inside React node views spans editor width*/ +.reactNodeViewRenderer { + display: flex; + flex-grow: 1; +} + .blockContent { padding: 3px 0; + flex-grow: 1; transition: font-size 0.2s; /* because the content elements are display: block we use flex to position them next to list markers */ - display: flex; } .blockContent::before { @@ -225,8 +237,8 @@ NESTED BLOCKS /* PLACEHOLDERS*/ -.blockContent.isEmpty > :first-child:before, -.blockContent.isFilter > :first-child:before { +.isEmpty .inlineContent:before, +.isFilter .inlineContent:before { /*float: left; */ content: ""; pointer-events: none; @@ -236,33 +248,33 @@ NESTED BLOCKS font-style: italic; } -[data-theme="light"] .blockContent.isEmpty > :first-child:before, -.blockContent.isFilter > :first-child:before { +[data-theme="light"] .isEmpty .inlineContent:before, +.isFilter .inlineContent:before { color: #cccccc; } -[data-theme="dark"] .blockContent.isEmpty > :first-child:before, -.blockContent.isFilter > :first-child:before { +[data-theme="dark"] .isEmpty .inlineContent:before, +.isFilter .inlineContent:before { color: #999999; } /* TODO: would be nicer if defined from code */ -.blockContent.isEmpty.hasAnchor > :first-child:before { +.isEmpty.hasAnchor .inlineContent:before { content: "Enter text or type '/' for commands"; } -.blockContent.isFilter.hasAnchor > :first-child:before { +.blockContent.isFilter.hasAnchor .inlineContent:before { content: "Type to filter"; } -.blockContent[data-content-type="heading"].isEmpty > :first-child::before { +.blockContent[data-content-type="heading"].isEmpty .inlineContent:before { content: "Heading"; } -.blockContent[data-content-type="bulletListItem"].isEmpty > :first-child:before, +.blockContent[data-content-type="bulletListItem"].isEmpty .inlineContent:before, .blockContent[data-content-type="numberedListItem"].isEmpty - > :first-child:before { +.inlineContent:before { content: "List"; } diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts b/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts index d84f73ec4f..3e4b0ffb29 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts +++ b/packages/core/src/extensions/Blocks/nodes/BlockContainer.ts @@ -5,11 +5,12 @@ import { blockToNode, inlineContentToNodes, } from "../../../api/nodeConversions/nodeConversions"; -import { PartialBlock } from "../api/blockTypes"; + import { getBlockInfoFromPos } from "../helpers/getBlockInfoFromPos"; import { PreviousBlockTypePlugin } from "../PreviousBlockTypePlugin"; import styles from "./Block.module.css"; import BlockAttributes from "./BlockAttributes"; +import { BlockSchema, PartialBlock } from "../api/blockTypes"; // TODO export interface IBlock { @@ -23,10 +24,13 @@ declare module "@tiptap/core" { BNDeleteBlock: (posInBlock: number) => ReturnType; BNMergeBlocks: (posBetweenBlocks: number) => ReturnType; BNSplitBlock: (posInBlock: number, keepType: boolean) => ReturnType; - BNUpdateBlock: (posInBlock: number, block: PartialBlock) => ReturnType; - BNCreateOrUpdateBlock: ( + BNUpdateBlock: ( + posInBlock: number, + block: PartialBlock + ) => ReturnType; + BNCreateOrUpdateBlock: ( posInBlock: number, - block: PartialBlock + block: PartialBlock ) => ReturnType; }; } diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts b/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts index 5a92f696b8..3dcb402257 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts +++ b/packages/core/src/extensions/Blocks/nodes/BlockContent/HeadingBlockContent/HeadingBlockContent.ts @@ -1,9 +1,9 @@ -import { InputRule, mergeAttributes, Node } from "@tiptap/core"; +import { InputRule, mergeAttributes } from "@tiptap/core"; +import { createTipTapBlock } from "../../../api/block"; import styles from "../../Block.module.css"; -export const HeadingBlockContent = Node.create({ +export const HeadingBlockContent = createTipTapBlock<"heading">({ name: "heading", - group: "blockContent", content: "inline*", addAttributes() { @@ -70,7 +70,7 @@ export const HeadingBlockContent = Node.create({ class: styles.blockContent, "data-content-type": this.name, }), - ["h" + node.attrs.level, 0], + ["h" + node.attrs.level, { class: styles.inlineContent }, 0], ]; }, }); diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts b/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts index a3735ecd9b..58ef2002ff 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts +++ b/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/BulletListItemBlockContent/BulletListItemBlockContent.ts @@ -1,10 +1,10 @@ -import { InputRule, mergeAttributes, Node } from "@tiptap/core"; -import styles from "../../../Block.module.css"; +import { InputRule, mergeAttributes } from "@tiptap/core"; +import { createTipTapBlock } from "../../../../api/block"; import { handleEnter } from "../ListItemKeyboardShortcuts"; +import styles from "../../../Block.module.css"; -export const BulletListItemBlockContent = Node.create({ +export const BulletListItemBlockContent = createTipTapBlock<"bulletListItem">({ name: "bulletListItem", - group: "blockContent", content: "inline*", addInputRules() { @@ -88,7 +88,7 @@ export const BulletListItemBlockContent = Node.create({ class: styles.blockContent, "data-content-type": this.name, }), - ["p", 0], + ["p", { class: styles.inlineContent }, 0], ]; }, }); diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts b/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts index bb4627d7b2..f8055bf31f 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts +++ b/packages/core/src/extensions/Blocks/nodes/BlockContent/ListItemBlockContent/NumberedListItemBlockContent/NumberedListItemBlockContent.ts @@ -1,117 +1,120 @@ -import { InputRule, mergeAttributes, Node } from "@tiptap/core"; -import styles from "../../../Block.module.css"; +import { InputRule, mergeAttributes } from "@tiptap/core"; +import { createTipTapBlock } from "../../../../api/block"; import { handleEnter } from "../ListItemKeyboardShortcuts"; import { NumberedListIndexingPlugin } from "./NumberedListIndexingPlugin"; +import styles from "../../../Block.module.css"; -export const NumberedListItemBlockContent = Node.create({ - name: "numberedListItem", - group: "blockContent", - content: "inline*", +export const NumberedListItemBlockContent = + createTipTapBlock<"numberedListItem">({ + name: "numberedListItem", + content: "inline*", - addAttributes() { - return { - index: { - default: null, - parseHTML: (element) => element.getAttribute("data-index"), - renderHTML: (attributes) => { - return { - "data-index": attributes.index, - }; + addAttributes() { + return { + index: { + default: null, + parseHTML: (element) => element.getAttribute("data-index"), + renderHTML: (attributes) => { + return { + "data-index": attributes.index, + }; + }, }, - }, - }; - }, + }; + }, - addInputRules() { - return [ - // Creates an ordered list when starting with "1.". - new InputRule({ - find: new RegExp(`^1\\.\\s$`), - handler: ({ state, chain, range }) => { - chain() - .BNUpdateBlock(state.selection.from, { - type: "numberedListItem", - props: {}, - }) - // Removes the "1." characters used to set the list. - .deleteRange({ from: range.from, to: range.to }); - }, - }), - ]; - }, + addInputRules() { + return [ + // Creates an ordered list when starting with "1.". + new InputRule({ + find: new RegExp(`^1\\.\\s$`), + handler: ({ state, chain, range }) => { + chain() + .BNUpdateBlock(state.selection.from, { + type: "numberedListItem", + props: {}, + }) + // Removes the "1." characters used to set the list. + .deleteRange({ from: range.from, to: range.to }); + }, + }), + ]; + }, - addKeyboardShortcuts() { - return { - Enter: () => handleEnter(this.editor), - }; - }, + addKeyboardShortcuts() { + return { + Enter: () => handleEnter(this.editor), + }; + }, - addProseMirrorPlugins() { - return [NumberedListIndexingPlugin()]; - }, + addProseMirrorPlugins() { + return [NumberedListIndexingPlugin()]; + }, - parseHTML() { - return [ - // Case for regular HTML list structure. - // (e.g.: when pasting from other apps) - { - tag: "li", - getAttrs: (element) => { - if (typeof element === "string") { - return false; - } + parseHTML() { + return [ + // Case for regular HTML list structure. + // (e.g.: when pasting from other apps) + { + tag: "li", + getAttrs: (element) => { + if (typeof element === "string") { + return false; + } - const parent = element.parentElement; + const parent = element.parentElement; - if (parent === null) { - return false; - } + if (parent === null) { + return false; + } - if (parent.tagName === "OL") { - return {}; - } + if (parent.tagName === "OL") { + return {}; + } - return false; - }, - node: "numberedListItem", - }, - // Case for BlockNote list structure. - // (e.g.: when pasting from blocknote) - { - tag: "p", - getAttrs: (element) => { - if (typeof element === "string") { return false; - } + }, + node: "numberedListItem", + }, + // Case for BlockNote list structure. + // (e.g.: when pasting from blocknote) + { + tag: "p", + getAttrs: (element) => { + if (typeof element === "string") { + return false; + } - const parent = element.parentElement; + const parent = element.parentElement; - if (parent === null) { - return false; - } + if (parent === null) { + return false; + } - if (parent.getAttribute("data-content-type") === "numberedListItem") { - return {}; - } + if ( + parent.getAttribute("data-content-type") === "numberedListItem" + ) { + return {}; + } - return false; + return false; + }, + priority: 300, + node: "numberedListItem", }, - priority: 300, - node: "numberedListItem", - }, - ]; - }, + ]; + }, - renderHTML({ HTMLAttributes }) { - return [ - "div", - mergeAttributes(HTMLAttributes, { - class: styles.blockContent, - "data-content-type": this.name, - }), - // we use a

    tag, because for

  • tags we'd need to add a
      parent for around siblings to be semantically correct, - // which would be quite cumbersome - ["p", 0], - ]; - }, -}); + renderHTML({ HTMLAttributes }) { + return [ + "div", + mergeAttributes(HTMLAttributes, { + class: styles.blockContent, + "data-content-type": this.name, + }), + // we use a

      tag, because for

    • tags we'd need to add a
        parent for around siblings to be semantically correct, + // which would be quite cumbersome + ["p", { class: styles.inlineContent }, 0], + ]; + }, + }); diff --git a/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts b/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts index cee021986a..9d44f9bb7a 100644 --- a/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts +++ b/packages/core/src/extensions/Blocks/nodes/BlockContent/ParagraphBlockContent/ParagraphBlockContent.ts @@ -1,9 +1,9 @@ -import { mergeAttributes, Node } from "@tiptap/core"; +import { mergeAttributes } from "@tiptap/core"; +import { createTipTapBlock } from "../../../api/block"; import styles from "../../Block.module.css"; -export const ParagraphBlockContent = Node.create({ +export const ParagraphBlockContent = createTipTapBlock<"paragraph">({ name: "paragraph", - group: "blockContent", content: "inline*", parseHTML() { @@ -23,7 +23,7 @@ export const ParagraphBlockContent = Node.create({ class: styles.blockContent, "data-content-type": this.name, }), - ["p", 0], + ["p", { class: styles.inlineContent }, 0], ]; }, }); diff --git a/packages/core/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts b/packages/core/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts index b376feacc5..fbb0980895 100644 --- a/packages/core/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts +++ b/packages/core/src/extensions/DraggableBlocks/BlockSideMenuFactoryTypes.ts @@ -1,9 +1,9 @@ import { EditorElement, ElementFactory } from "../../shared/EditorElement"; import { BlockNoteEditor } from "../../BlockNoteEditor"; -import { Block } from "../Blocks/api/blockTypes"; +import { Block, BlockSchema } from "../Blocks/api/blockTypes"; -export type BlockSideMenuStaticParams = { - editor: BlockNoteEditor; +export type BlockSideMenuStaticParams = { + editor: BlockNoteEditor; addBlock: () => void; @@ -14,14 +14,16 @@ export type BlockSideMenuStaticParams = { unfreezeMenu: () => void; }; -export type BlockSideMenuDynamicParams = { - block: Block; +export type BlockSideMenuDynamicParams = { + block: Block; referenceRect: DOMRect; }; -export type BlockSideMenu = EditorElement; -export type BlockSideMenuFactory = ElementFactory< - BlockSideMenuStaticParams, - BlockSideMenuDynamicParams +export type BlockSideMenu = EditorElement< + BlockSideMenuDynamicParams +>; +export type BlockSideMenuFactory = ElementFactory< + BlockSideMenuStaticParams, + BlockSideMenuDynamicParams >; diff --git a/packages/core/src/extensions/DraggableBlocks/DraggableBlocksExtension.ts b/packages/core/src/extensions/DraggableBlocks/DraggableBlocksExtension.ts index 9156368eed..6db0fde3da 100644 --- a/packages/core/src/extensions/DraggableBlocks/DraggableBlocksExtension.ts +++ b/packages/core/src/extensions/DraggableBlocks/DraggableBlocksExtension.ts @@ -2,11 +2,12 @@ import { Editor, Extension } from "@tiptap/core"; import { BlockSideMenuFactory } from "./BlockSideMenuFactoryTypes"; import { createDraggableBlocksPlugin } from "./DraggableBlocksPlugin"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { BlockSchema } from "../Blocks/api/blockTypes"; -export type DraggableBlocksOptions = { +export type DraggableBlocksOptions = { tiptapEditor: Editor; - editor: BlockNoteEditor; - blockSideMenuFactory: BlockSideMenuFactory; + editor: BlockNoteEditor; + blockSideMenuFactory: BlockSideMenuFactory; }; /** @@ -15,8 +16,8 @@ export type DraggableBlocksOptions = { * * code based on https://github.com/ueberdosis/tiptap/issues/323#issuecomment-506637799 */ -export const DraggableBlocksExtension = - Extension.create({ +export const createDraggableBlocksExtension = () => + Extension.create>({ name: "DraggableBlocksExtension", priority: 1000, // Need to be high, in order to hide menu when typing slash addProseMirrorPlugins() { diff --git a/packages/core/src/extensions/DraggableBlocks/DraggableBlocksPlugin.ts b/packages/core/src/extensions/DraggableBlocks/DraggableBlocksPlugin.ts index ec8481b7dd..51d7b823d8 100644 --- a/packages/core/src/extensions/DraggableBlocks/DraggableBlocksPlugin.ts +++ b/packages/core/src/extensions/DraggableBlocks/DraggableBlocksPlugin.ts @@ -15,6 +15,7 @@ import { import { DraggableBlocksOptions } from "./DraggableBlocksExtension"; import { MultipleNodeSelection } from "./MultipleNodeSelection"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { BlockSchema } from "../Blocks/api/blockTypes"; const serializeForClipboard = (pv as any).__serializeForClipboard; // code based on https://github.com/ueberdosis/tiptap/issues/323#issuecomment-506637799 @@ -223,15 +224,15 @@ function dragStart(e: DragEvent, view: EditorView) { } } -export type BlockMenuViewProps = { +export type BlockMenuViewProps = { tiptapEditor: Editor; - editor: BlockNoteEditor; - blockMenuFactory: BlockSideMenuFactory; + editor: BlockNoteEditor; + blockMenuFactory: BlockSideMenuFactory; horizontalPosAnchoredAtRoot: boolean; }; -export class BlockMenuView { - editor: BlockNoteEditor; +export class BlockMenuView { + editor: BlockNoteEditor; private ttEditor: Editor; // When true, the drag handle with be anchored at the same level as root elements @@ -240,7 +241,7 @@ export class BlockMenuView { horizontalPosAnchor: number; - blockMenu: BlockSideMenu; + blockMenu: BlockSideMenu; hoveredBlock: HTMLElement | undefined; @@ -254,7 +255,7 @@ export class BlockMenuView { editor, blockMenuFactory, horizontalPosAnchoredAtRoot, - }: BlockMenuViewProps) { + }: BlockMenuViewProps) { this.editor = editor; this.ttEditor = tiptapEditor; this.horizontalPosAnchoredAtRoot = horizontalPosAnchoredAtRoot; @@ -497,7 +498,7 @@ export class BlockMenuView { ); } - getStaticParams(): BlockSideMenuStaticParams { + getStaticParams(): BlockSideMenuStaticParams { return { editor: this.editor, addBlock: () => this.addBlock(), @@ -516,7 +517,7 @@ export class BlockMenuView { }; } - getDynamicParams(): BlockSideMenuDynamicParams { + getDynamicParams(): BlockSideMenuDynamicParams { const blockContent = this.hoveredBlock!.firstChild! as HTMLElement; const blockContentBoundingBox = blockContent.getBoundingClientRect(); @@ -534,8 +535,8 @@ export class BlockMenuView { } } -export const createDraggableBlocksPlugin = ( - options: DraggableBlocksOptions +export const createDraggableBlocksPlugin = ( + options: DraggableBlocksOptions ) => { return new Plugin({ key: new PluginKey("DraggableBlocksPlugin"), diff --git a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarExtension.ts b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarExtension.ts index 283f92160e..a7389c4c8b 100644 --- a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarExtension.ts +++ b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarExtension.ts @@ -1,17 +1,22 @@ import { Extension } from "@tiptap/core"; import { PluginKey } from "prosemirror-state"; -import { BlockNoteEditor } from "../.."; +import { BlockNoteEditor, BlockSchema } from "../.."; import { FormattingToolbarFactory } from "./FormattingToolbarFactoryTypes"; import { createFormattingToolbarPlugin } from "./FormattingToolbarPlugin"; +export type FormattingToolbarOptions = { + formattingToolbarFactory: FormattingToolbarFactory; + editor: BlockNoteEditor; +}; + /** * The menu that is displayed when selecting a piece of text. */ -export const FormattingToolbarExtension = Extension.create<{ - formattingToolbarFactory: FormattingToolbarFactory; - editor: BlockNoteEditor; -}>({ - name: "FormattingToolbarExtension", +export const createFormattingToolbarExtension = < + BSchema extends BlockSchema +>() => + Extension.create>({ + name: "FormattingToolbarExtension", addProseMirrorPlugins() { if (!this.options.formattingToolbarFactory || !this.options.editor) { @@ -20,13 +25,13 @@ export const FormattingToolbarExtension = Extension.create<{ ); } - return [ - createFormattingToolbarPlugin({ - tiptapEditor: this.editor, - editor: this.options.editor, - formattingToolbarFactory: this.options.formattingToolbarFactory, - pluginKey: new PluginKey("FormattingToolbarPlugin"), - }), - ]; - }, -}); + return [ + createFormattingToolbarPlugin({ + tiptapEditor: this.editor, + editor: this.options.editor, + formattingToolbarFactory: this.options.formattingToolbarFactory, + pluginKey: new PluginKey("FormattingToolbarPlugin"), + }), + ]; + }, + }); diff --git a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.ts b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.ts index 6b1c506cbb..f424508038 100644 --- a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.ts +++ b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarFactoryTypes.ts @@ -1,16 +1,20 @@ import { EditorElement, ElementFactory } from "../../shared/EditorElement"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { BlockSchema } from "../Blocks/api/blockTypes"; -export type FormattingToolbarStaticParams = { - editor: BlockNoteEditor; +export type FormattingToolbarStaticParams = { + editor: BlockNoteEditor; }; export type FormattingToolbarDynamicParams = { referenceRect: DOMRect; }; -export type FormattingToolbar = EditorElement; -export type FormattingToolbarFactory = ElementFactory< - FormattingToolbarStaticParams, +export type FormattingToolbar = EditorElement< FormattingToolbarDynamicParams >; +export type FormattingToolbarFactory = + ElementFactory< + FormattingToolbarStaticParams, + FormattingToolbarDynamicParams + >; diff --git a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts index b220913957..46103f55ba 100644 --- a/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts +++ b/packages/core/src/extensions/FormattingToolbar/FormattingToolbarPlugin.ts @@ -6,7 +6,7 @@ import { } from "@tiptap/core"; import { EditorState, Plugin, PluginKey } from "prosemirror-state"; import { EditorView } from "prosemirror-view"; -import { BlockNoteEditor } from "../.."; +import { BlockNoteEditor, BlockSchema } from "../.."; import { FormattingToolbar, FormattingToolbarDynamicParams, @@ -16,29 +16,20 @@ import { // Same as TipTap bubblemenu plugin, but with these changes: // https://github.com/ueberdosis/tiptap/pull/2596/files -export interface FormattingToolbarPluginProps { +export interface FormattingToolbarPluginProps { pluginKey: PluginKey; tiptapEditor: Editor; - editor: BlockNoteEditor; - formattingToolbarFactory: FormattingToolbarFactory; - shouldShow?: - | ((props: { - editor: BlockNoteEditor; - view: EditorView; - state: EditorState; - oldState?: EditorState; - from: number; - to: number; - }) => boolean) - | null; + editor: BlockNoteEditor; + formattingToolbarFactory: FormattingToolbarFactory; } -export type FormattingToolbarViewProps = FormattingToolbarPluginProps & { - view: EditorView; -}; +export type FormattingToolbarViewProps = + FormattingToolbarPluginProps & { + view: EditorView; + }; -export class FormattingToolbarView { - public editor: BlockNoteEditor; +export class FormattingToolbarView { + public editor: BlockNoteEditor; private ttEditor: Editor; public view: EditorView; @@ -53,44 +44,43 @@ export class FormattingToolbarView { public prevWasEditable: boolean | null = null; - public shouldShow: Exclude = - ({ view, state, from, to }) => { - const { doc, selection } = state; - const { empty } = selection; + public shouldShow: (props: { + view: EditorView; + state: EditorState; + from: number; + to: number; + }) => boolean = ({ view, state, from, to }) => { + const { doc, selection } = state; + const { empty } = selection; - // Sometime check for `empty` is not enough. - // Doubleclick an empty paragraph returns a node size of 2. - // So we check also for an empty text size. - const isEmptyTextBlock = - !doc.textBetween(from, to).length && isTextSelection(state.selection); + // Sometime check for `empty` is not enough. + // Doubleclick an empty paragraph returns a node size of 2. + // So we check also for an empty text size. + const isEmptyTextBlock = + !doc.textBetween(from, to).length && isTextSelection(state.selection); - return !(!view.hasFocus() || empty || isEmptyTextBlock); - }; + return !(!view.hasFocus() || empty || isEmptyTextBlock); + }; constructor({ editor, tiptapEditor, formattingToolbarFactory, view, - shouldShow, - }: FormattingToolbarViewProps) { + }: FormattingToolbarViewProps) { this.editor = editor; this.ttEditor = tiptapEditor; this.view = view; this.formattingToolbar = formattingToolbarFactory(this.getStaticParams()); - if (shouldShow) { - this.shouldShow = shouldShow; - } - this.view.dom.addEventListener("mousedown", this.viewMousedownHandler); this.view.dom.addEventListener("mouseup", this.viewMouseupHandler); this.view.dom.addEventListener("dragstart", this.dragstartHandler); this.ttEditor.on("focus", this.focusHandler); this.ttEditor.on("blur", this.blurHandler); - + document.addEventListener("scroll", this.scrollHandler); } @@ -163,10 +153,8 @@ export class FormattingToolbarView { const to = Math.max(...ranges.map((range) => range.$to.pos)); const shouldShow = this.shouldShow?.({ - editor: this.editor, view, state, - oldState, from, to, }); @@ -250,7 +238,7 @@ export class FormattingToolbarView { return posToDOMRect(this.ttEditor.view, from, to); } - getStaticParams(): FormattingToolbarStaticParams { + getStaticParams(): FormattingToolbarStaticParams { return { editor: this.editor, }; @@ -263,8 +251,8 @@ export class FormattingToolbarView { } } -export const createFormattingToolbarPlugin = ( - options: FormattingToolbarPluginProps +export const createFormattingToolbarPlugin = ( + options: FormattingToolbarPluginProps ) => { return new Plugin({ key: new PluginKey("FormattingToolbarPlugin"), diff --git a/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts b/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts index ba6de34a1d..9def2e85d9 100644 --- a/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts +++ b/packages/core/src/extensions/Placeholder/PlaceholderExtension.ts @@ -72,6 +72,7 @@ export const Placeholder = Extension.create({ if ((hasAnchor || !this.options.showOnlyCurrent) && isEmpty) { const classes = [this.options.emptyNodeClass]; + // TODO: Doesn't work? if (this.editor.isEmpty) { classes.push(this.options.emptyEditorClass); } diff --git a/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts b/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts index 59132d35aa..355cc0b1f6 100644 --- a/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts +++ b/packages/core/src/extensions/SlashMenu/BaseSlashMenuItem.ts @@ -1,12 +1,15 @@ import { SuggestionItem } from "../../shared/plugins/suggestion/SuggestionItem"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { BlockSchema } from "../Blocks/api/blockTypes"; /** * A class that defines a slash command (/). * * (Not to be confused with ProseMirror commands nor TipTap commands.) */ -export class BaseSlashMenuItem extends SuggestionItem { +export class BaseSlashMenuItem< + BSchema extends BlockSchema +> extends SuggestionItem { /** * Constructs a new slash-command. * @@ -16,7 +19,7 @@ export class BaseSlashMenuItem extends SuggestionItem { */ constructor( public readonly name: string, - public readonly execute: (editor: BlockNoteEditor) => void, + public readonly execute: (editor: BlockNoteEditor) => void, public readonly aliases: string[] = [] ) { super(name, (query: string): boolean => { diff --git a/packages/core/src/extensions/SlashMenu/SlashMenuExtension.ts b/packages/core/src/extensions/SlashMenu/SlashMenuExtension.ts index 5cf22278ca..d51aeb3458 100644 --- a/packages/core/src/extensions/SlashMenu/SlashMenuExtension.ts +++ b/packages/core/src/extensions/SlashMenu/SlashMenuExtension.ts @@ -4,46 +4,50 @@ import { createSuggestionPlugin } from "../../shared/plugins/suggestion/Suggesti import { SuggestionsMenuFactory } from "../../shared/plugins/suggestion/SuggestionsMenuFactoryTypes"; import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { BlockSchema } from "../Blocks/api/blockTypes"; -export type SlashMenuOptions = { - editor: BlockNoteEditor | undefined; - commands: BaseSlashMenuItem[] | undefined; +export type SlashMenuOptions = { + editor: BlockNoteEditor | undefined; + commands: BaseSlashMenuItem[] | undefined; slashMenuFactory: SuggestionsMenuFactory | undefined; }; export const SlashMenuPluginKey = new PluginKey("suggestions-slash-commands"); -export const SlashMenuExtension = Extension.create({ - name: "slash-command", +export const createSlashMenuExtension = () => + Extension.create>({ + name: "slash-command", - addOptions() { - return { - editor: undefined, - commands: undefined, - slashMenuFactory: undefined, - }; - }, + addOptions() { + return { + editor: undefined, + commands: undefined, + slashMenuFactory: undefined, + }; + }, - addProseMirrorPlugins() { - if (!this.options.slashMenuFactory || !this.options.commands) { - throw new Error("required args not defined for SlashMenuExtension"); - } + addProseMirrorPlugins() { + if (!this.options.slashMenuFactory || !this.options.commands) { + throw new Error("required args not defined for SlashMenuExtension"); + } - const commands = this.options.commands; + const commands = this.options.commands; - return [ - createSuggestionPlugin({ - pluginKey: SlashMenuPluginKey, - editor: this.options.editor!, - defaultTriggerCharacter: "/", - suggestionsMenuFactory: this.options.slashMenuFactory!, - items: (query) => { - return commands.filter((cmd: BaseSlashMenuItem) => cmd.match(query)); - }, - onSelectItem: ({ item, editor }) => { - item.execute(editor); - }, - }), - ]; - }, -}); + return [ + createSuggestionPlugin, BSchema>({ + pluginKey: SlashMenuPluginKey, + editor: this.options.editor!, + defaultTriggerCharacter: "/", + suggestionsMenuFactory: this.options.slashMenuFactory!, + items: (query) => { + return commands.filter((cmd: BaseSlashMenuItem) => + cmd.match(query) + ); + }, + onSelectItem: ({ item, editor }) => { + item.execute(editor); + }, + }), + ]; + }, + }); diff --git a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.tsx b/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.tsx index a65d2d2f1e..2375996560 100644 --- a/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.tsx +++ b/packages/core/src/extensions/SlashMenu/defaultSlashMenuItems.tsx @@ -1,8 +1,12 @@ -import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; -import { PartialBlock } from "../Blocks/api/blockTypes"; import { BlockNoteEditor } from "../../BlockNoteEditor"; +import { PartialBlock } from "../Blocks/api/blockTypes"; +import { DefaultBlockSchema } from "../Blocks/api/defaultBlocks"; +import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; -function insertOrUpdateBlock(editor: BlockNoteEditor, block: PartialBlock) { +function insertOrUpdateBlock( + editor: BlockNoteEditor, + block: PartialBlock +) { const currentBlock = editor.getTextCursorPosition().block; if ( @@ -21,9 +25,9 @@ function insertOrUpdateBlock(editor: BlockNoteEditor, block: PartialBlock) { /** * An array containing commands for creating all default blocks. */ -export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ +export const defaultSlashMenuItems = [ // Command for creating a level 1 heading - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Heading", (editor) => insertOrUpdateBlock(editor, { @@ -34,7 +38,7 @@ export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ ), // Command for creating a level 2 heading - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Heading 2", (editor) => insertOrUpdateBlock(editor, { @@ -45,7 +49,7 @@ export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ ), // Command for creating a level 3 heading - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Heading 3", (editor) => insertOrUpdateBlock(editor, { @@ -56,7 +60,7 @@ export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ ), // Command for creating an ordered list - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Numbered List", (editor) => insertOrUpdateBlock(editor, { @@ -66,7 +70,7 @@ export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ ), // Command for creating a bullet list - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Bullet List", (editor) => insertOrUpdateBlock(editor, { @@ -76,7 +80,7 @@ export const defaultSlashMenuItems: BaseSlashMenuItem[] = [ ), // Command for creating a paragraph (pretty useless) - new BaseSlashMenuItem( + new BaseSlashMenuItem( "Paragraph", (editor) => insertOrUpdateBlock(editor, { diff --git a/packages/core/src/extensions/SlashMenu/index.ts b/packages/core/src/extensions/SlashMenu/index.ts index d8551aa591..3fae65095c 100644 --- a/packages/core/src/extensions/SlashMenu/index.ts +++ b/packages/core/src/extensions/SlashMenu/index.ts @@ -1,5 +1,5 @@ import { defaultSlashMenuItems } from "./defaultSlashMenuItems"; -import { SlashMenuExtension } from "./SlashMenuExtension"; +import { createSlashMenuExtension } from "./SlashMenuExtension"; import { BaseSlashMenuItem } from "./BaseSlashMenuItem"; -export { defaultSlashMenuItems, BaseSlashMenuItem, SlashMenuExtension }; +export { defaultSlashMenuItems, BaseSlashMenuItem, createSlashMenuExtension }; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index feaa83bcbd..8b4b935cb2 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,6 +1,8 @@ export * from "./BlockNoteEditor"; export * from "./BlockNoteExtensions"; +export * from "./extensions/Blocks/api/block"; export * from "./extensions/Blocks/api/blockTypes"; +export * from "./extensions/Blocks/api/defaultBlocks"; export * from "./extensions/DraggableBlocks/BlockSideMenuFactoryTypes"; export * from "./extensions/FormattingToolbar/FormattingToolbarFactoryTypes"; export * from "./extensions/HyperlinkToolbar/HyperlinkToolbarFactoryTypes"; @@ -10,3 +12,5 @@ export * from "./shared/EditorElement"; export type { SuggestionItem } from "./shared/plugins/suggestion/SuggestionItem"; export * from "./shared/plugins/suggestion/SuggestionsMenuFactoryTypes"; export * from "./extensions/Blocks/api/inlineContentTypes"; +export * from "./extensions/Blocks/api/serialization"; +export * as blockStyles from "./extensions/Blocks/nodes/Block.module.css"; diff --git a/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts b/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts index 9e102ca186..0eaf7d7c20 100644 --- a/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts +++ b/packages/core/src/shared/plugins/suggestion/SuggestionPlugin.ts @@ -10,8 +10,12 @@ import { } from "./SuggestionsMenuFactoryTypes"; import { SuggestionItem } from "./SuggestionItem"; import { BlockNoteEditor } from "../../../BlockNoteEditor"; +import { BlockSchema } from "../../../extensions/Blocks/api/blockTypes"; -export type SuggestionPluginOptions = { +export type SuggestionPluginOptions< + T extends SuggestionItem, + BSchema extends BlockSchema +> = { /** * The name of the plugin. * @@ -22,7 +26,7 @@ export type SuggestionPluginOptions = { /** * The BlockNote editor. */ - editor: BlockNoteEditor; + editor: BlockNoteEditor; /** * The character that should trigger the suggestion menu to pop up (e.g. a '/' for commands), when typed by the user. @@ -38,7 +42,7 @@ export type SuggestionPluginOptions = { * this should be done manually. The `editor` and `range` properties passed * to the callback function might come in handy when doing this. */ - onSelectItem?: (props: { item: T; editor: BlockNoteEditor }) => void; + onSelectItem?: (props: { item: T; editor: BlockNoteEditor }) => void; /** * A function that should supply the plugin with items to suggest, based on a certain query string. @@ -81,15 +85,21 @@ function getDefaultPluginState< }; } -type SuggestionPluginViewOptions = { - editor: BlockNoteEditor; +type SuggestionPluginViewOptions< + T extends SuggestionItem, + BSchema extends BlockSchema +> = { + editor: BlockNoteEditor; pluginKey: PluginKey; - onSelectItem: (props: { item: T; editor: BlockNoteEditor }) => void; + onSelectItem: (props: { item: T; editor: BlockNoteEditor }) => void; suggestionsMenuFactory: SuggestionsMenuFactory; }; -class SuggestionPluginView { - editor: BlockNoteEditor; +class SuggestionPluginView< + T extends SuggestionItem, + BSchema extends BlockSchema +> { + editor: BlockNoteEditor; pluginKey: PluginKey; suggestionsMenu: SuggestionsMenu; @@ -102,7 +112,7 @@ class SuggestionPluginView { pluginKey, onSelectItem: selectItemCallback = () => {}, suggestionsMenuFactory, - }: SuggestionPluginViewOptions) { + }: SuggestionPluginViewOptions) { this.editor = editor; this.pluginKey = pluginKey; @@ -214,14 +224,17 @@ class SuggestionPluginView { * @param options options for configuring the plugin * @returns the prosemirror plugin */ -export function createSuggestionPlugin({ +export function createSuggestionPlugin< + T extends SuggestionItem, + BSchema extends BlockSchema +>({ pluginKey, editor, defaultTriggerCharacter, suggestionsMenuFactory, onSelectItem: selectItemCallback = () => {}, items = () => [], -}: SuggestionPluginOptions) { +}: SuggestionPluginOptions) { // Assertions if (defaultTriggerCharacter.length !== 1) { throw new Error("'char' should be a single character"); @@ -236,10 +249,13 @@ export function createSuggestionPlugin({ key: pluginKey, view: (view: EditorView) => - new SuggestionPluginView({ + new SuggestionPluginView({ editor: editor, pluginKey: pluginKey, - onSelectItem: (props: { item: T; editor: BlockNoteEditor }) => { + onSelectItem: (props: { + item: T; + editor: BlockNoteEditor; + }) => { deactivate(view); selectItemCallback(props); }, diff --git a/packages/react/package.json b/packages/react/package.json index 3622d3f2aa..221a66ab84 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -63,7 +63,7 @@ "eslint": "^8.10.0", "eslint-config-react-app": "^7.0.0", "prettier": "^2.7.1", - "typescript": "^4.5.4", + "typescript": "^5.0.4", "vite": "^4.1.4", "vite-plugin-eslint": "^1.8.1" }, diff --git a/packages/react/src/BlockNoteView.tsx b/packages/react/src/BlockNoteView.tsx index 75b9385c13..ffc0ae860c 100644 --- a/packages/react/src/BlockNoteView.tsx +++ b/packages/react/src/BlockNoteView.tsx @@ -1,9 +1,11 @@ -import { BlockNoteEditor } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { EditorContent } from "@tiptap/react"; // import { BlockNoteTheme } from "./BlockNoteTheme"; // import { MantineProvider } from "@mantine/core"; -export function BlockNoteView(props: { editor: BlockNoteEditor | null }) { +export function BlockNoteView(props: { + editor: BlockNoteEditor | null; +}) { return ( // TODO: Should we wrap editor in MantineProvider? Otherwise we have to duplicate color hex values. // diff --git a/packages/react/src/BlockSideMenu/BlockSideMenuFactory.tsx b/packages/react/src/BlockSideMenu/BlockSideMenuFactory.tsx index a4c654c957..fbfa2632ab 100644 --- a/packages/react/src/BlockSideMenu/BlockSideMenuFactory.tsx +++ b/packages/react/src/BlockSideMenu/BlockSideMenuFactory.tsx @@ -1,32 +1,32 @@ import { FC } from "react"; import { + BlockSchema, BlockSideMenuDynamicParams, BlockSideMenuStaticParams, } from "@blocknote/core"; -import { BlockSideMenu as ReactBlockSideMenu } from "./components/BlockSideMenu"; -import { ReactElementFactory } from "../ElementFactory/components/ReactElementFactory"; import { MantineThemeOverride } from "@mantine/core"; +import { ReactElementFactory } from "../ElementFactory/components/ReactElementFactory"; +import { BlockSideMenu as ReactBlockSideMenu } from "./components/BlockSideMenu"; import { DragHandleMenuProps } from "./components/DragHandleMenu"; import { DefaultDragHandleMenu } from "./components/DefaultDragHandleMenu"; -export const createReactBlockSideMenuFactory = ( +export const createReactBlockSideMenuFactory = ( theme: MantineThemeOverride, - dragHandleMenu: FC = DefaultDragHandleMenu + dragHandleMenu: FC> = DefaultDragHandleMenu ) => { const CustomDragHandleMenu = dragHandleMenu; const CustomBlockSideMenu = ( - props: BlockSideMenuStaticParams & BlockSideMenuDynamicParams + props: BlockSideMenuStaticParams & + BlockSideMenuDynamicParams ) => ; - return (staticParams: BlockSideMenuStaticParams) => - ReactElementFactory( - staticParams, - CustomBlockSideMenu, - theme, - { - animation: "fade", - offset: [0, 0], - placement: "left", - } - ); + return (staticParams: BlockSideMenuStaticParams) => + ReactElementFactory< + BlockSideMenuStaticParams, + BlockSideMenuDynamicParams + >(staticParams, CustomBlockSideMenu, theme, { + animation: "fade", + offset: [0, 0], + placement: "left", + }); }; diff --git a/packages/react/src/BlockSideMenu/components/BlockSideMenu.tsx b/packages/react/src/BlockSideMenu/components/BlockSideMenu.tsx index c79c795051..1f5555bab6 100644 --- a/packages/react/src/BlockSideMenu/components/BlockSideMenu.tsx +++ b/packages/react/src/BlockSideMenu/components/BlockSideMenu.tsx @@ -1,14 +1,15 @@ -import { FC, useEffect, useRef, useState } from "react"; +import { Block, BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { ActionIcon, Group, Menu } from "@mantine/core"; -import { Block, BlockNoteEditor } from "@blocknote/core"; -import { AiOutlinePlus, MdDragIndicator } from "react-icons/all"; -import { DragHandleMenuProps } from "./DragHandleMenu"; +import { FC, useEffect, useRef, useState } from "react"; +import { AiOutlinePlus } from "react-icons/ai"; +import { MdDragIndicator } from "react-icons/md"; import { DefaultDragHandleMenu } from "./DefaultDragHandleMenu"; +import { DragHandleMenuProps } from "./DragHandleMenu"; -export type BlockSideMenuProps = { - editor: BlockNoteEditor; - block: Block; - dragHandleMenu?: FC; +export type BlockSideMenuProps = { + editor: BlockNoteEditor; + block: Block; + dragHandleMenu?: FC>; addBlock: () => void; blockDragStart: (event: DragEvent) => void; blockDragEnd: () => void; @@ -16,7 +17,9 @@ export type BlockSideMenuProps = { unfreezeMenu: () => void; }; -export const BlockSideMenu = (props: BlockSideMenuProps) => { +export const BlockSideMenu = ( + props: BlockSideMenuProps +) => { const [dragHandleMenuOpened, setDragHandleMenuOpened] = useState(false); const dragHandleRef = useRef(null); diff --git a/packages/react/src/BlockSideMenu/components/DefaultButtons/BlockColorsButton.tsx b/packages/react/src/BlockSideMenu/components/DefaultButtons/BlockColorsButton.tsx index ed748ab58c..3fc435b275 100644 --- a/packages/react/src/BlockSideMenu/components/DefaultButtons/BlockColorsButton.tsx +++ b/packages/react/src/BlockSideMenu/components/DefaultButtons/BlockColorsButton.tsx @@ -1,12 +1,13 @@ import { ReactNode, useCallback, useRef, useState } from "react"; import { Box, Menu } from "@mantine/core"; +import { BlockSchema, PartialBlock } from "@blocknote/core"; import { HiChevronRight } from "react-icons/hi"; import { DragHandleMenuProps } from "../DragHandleMenu"; import { DragHandleMenuItem } from "../DragHandleMenuItem"; import { ColorPicker } from "../../../SharedComponents/ColorPicker/components/ColorPicker"; -export const BlockColorsButton = ( - props: DragHandleMenuProps & { children: ReactNode } +export const BlockColorsButton = ( + props: DragHandleMenuProps & { children: ReactNode } ) => { const [opened, setOpened] = useState(false); @@ -28,6 +29,13 @@ export const BlockColorsButton = ( setOpened(true); }, []); + if ( + !("textColor" in props.block.props) || + !("backgroundColor" in props.block.props) + ) { + return null; + } + return ( props.editor.updateBlock(props.block, { props: { textColor: color }, - }) + } as PartialBlock) } setBackgroundColor={(color) => props.editor.updateBlock(props.block, { props: { backgroundColor: color }, - }) + } as PartialBlock) } /> diff --git a/packages/react/src/BlockSideMenu/components/DefaultButtons/RemoveBlockButton.tsx b/packages/react/src/BlockSideMenu/components/DefaultButtons/RemoveBlockButton.tsx index 7111a8b71f..70d9cd60ab 100644 --- a/packages/react/src/BlockSideMenu/components/DefaultButtons/RemoveBlockButton.tsx +++ b/packages/react/src/BlockSideMenu/components/DefaultButtons/RemoveBlockButton.tsx @@ -1,10 +1,11 @@ import { ReactNode } from "react"; +import { BlockSchema } from "@blocknote/core"; import { DragHandleMenuProps } from "../DragHandleMenu"; import { DragHandleMenuItem } from "../DragHandleMenuItem"; -export const RemoveBlockButton = ( - props: DragHandleMenuProps & { children: ReactNode } +export const RemoveBlockButton = ( + props: DragHandleMenuProps & { children: ReactNode } ) => { return ( ( +export const DefaultDragHandleMenu = ( + props: DragHandleMenuProps +) => ( Delete Colors diff --git a/packages/react/src/BlockSideMenu/components/DragHandleMenu.tsx b/packages/react/src/BlockSideMenu/components/DragHandleMenu.tsx index 6d7e227dfc..816f3ed344 100644 --- a/packages/react/src/BlockSideMenu/components/DragHandleMenu.tsx +++ b/packages/react/src/BlockSideMenu/components/DragHandleMenu.tsx @@ -1,10 +1,10 @@ import { ReactNode } from "react"; import { createStyles, Menu } from "@mantine/core"; -import { Block, BlockNoteEditor } from "@blocknote/core"; +import { Block, BlockSchema, BlockNoteEditor } from "@blocknote/core"; -export type DragHandleMenuProps = { - editor: BlockNoteEditor; - block: Block; +export type DragHandleMenuProps = { + editor: BlockNoteEditor; + block: Block; closeMenu: () => void; }; diff --git a/packages/react/src/FormattingToolbar/FormattingToolbarFactory.tsx b/packages/react/src/FormattingToolbar/FormattingToolbarFactory.tsx index 4235c97856..bb9c521fb3 100644 --- a/packages/react/src/FormattingToolbar/FormattingToolbarFactory.tsx +++ b/packages/react/src/FormattingToolbar/FormattingToolbarFactory.tsx @@ -2,19 +2,24 @@ import { FormattingToolbarStaticParams, FormattingToolbarDynamicParams, BlockNoteEditor, + BlockSchema, } from "@blocknote/core"; import { FormattingToolbar as ReactFormattingToolbar } from "./components/FormattingToolbar"; import { ReactElementFactory } from "../ElementFactory/components/ReactElementFactory"; import { FC } from "react"; import { MantineThemeOverride } from "@mantine/core"; -export const createReactFormattingToolbarFactory = ( +export const createReactFormattingToolbarFactory = < + BSchema extends BlockSchema +>( theme: MantineThemeOverride, - toolbar: FC<{ editor: BlockNoteEditor }> = ReactFormattingToolbar + toolbar: FC<{ + editor: BlockNoteEditor; + }> = ReactFormattingToolbar ) => { - return (staticParams: FormattingToolbarStaticParams) => + return (staticParams: FormattingToolbarStaticParams) => ReactElementFactory< - FormattingToolbarStaticParams, + FormattingToolbarStaticParams, FormattingToolbarDynamicParams >(staticParams, toolbar, theme, { animation: "fade", diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx b/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx index f6d6d490a7..dcd6439d78 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultButtons/ColorStyleButton.tsx @@ -1,11 +1,13 @@ import { useCallback } from "react"; import { Menu } from "@mantine/core"; -import { BlockNoteEditor } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; import { ColorIcon } from "../../../SharedComponents/ColorPicker/components/ColorIcon"; import { ColorPicker } from "../../../SharedComponents/ColorPicker/components/ColorPicker"; -export const ColorStyleButton = (props: { editor: BlockNoteEditor }) => { +export const ColorStyleButton = (props: { + editor: BlockNoteEditor; +}) => { const setTextColor = useCallback( (color: string) => { props.editor.focus(); diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx b/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx index c6caccc3fe..016b6f4d3e 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultButtons/CreateLinkButton.tsx @@ -1,10 +1,12 @@ import { useCallback } from "react"; -import { BlockNoteEditor } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { RiLink } from "react-icons/ri"; import LinkToolbarButton from "../LinkToolbarButton"; import { formatKeyboardShortcut } from "../../../utils"; -export const CreateLinkButton = (props: { editor: BlockNoteEditor }) => { +export const CreateLinkButton = (props: { + editor: BlockNoteEditor; +}) => { const setLink = useCallback( (url: string, text?: string) => { props.editor.focus(); diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx b/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx index bac8f93e6c..fd05fae03e 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultButtons/NestBlockButtons.tsx @@ -1,10 +1,12 @@ import { formatKeyboardShortcut } from "../../../utils"; import { RiIndentDecrease, RiIndentIncrease } from "react-icons/ri"; import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; -import { BlockNoteEditor } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { useCallback } from "react"; -export const NestBlockButton = (props: { editor: BlockNoteEditor }) => { +export const NestBlockButton = (props: { + editor: BlockNoteEditor; +}) => { const nestBlock = useCallback(() => { props.editor.focus(); props.editor.nestBlock(); @@ -21,7 +23,9 @@ export const NestBlockButton = (props: { editor: BlockNoteEditor }) => { ); }; -export const UnnestBlockButton = (props: { editor: BlockNoteEditor }) => { +export const UnnestBlockButton = (props: { + editor: BlockNoteEditor; +}) => { const unnestBlock = useCallback(() => { props.editor.focus(); props.editor.unnestBlock(); diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx b/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx index f05e5af8a6..dde4fe6342 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultButtons/TextAlignButton.tsx @@ -1,3 +1,11 @@ +import { + BlockNoteEditor, + BlockSchema, + DefaultProps, + PartialBlock, +} from "@blocknote/core"; +import { useCallback, useMemo } from "react"; +import { IconType } from "react-icons"; import { RiAlignCenter, RiAlignJustify, @@ -5,23 +13,42 @@ import { RiAlignRight, } from "react-icons/ri"; import { ToolbarButton } from "../../../SharedComponents/Toolbar/components/ToolbarButton"; -import { BlockNoteEditor, DefaultBlockProps } from "@blocknote/core"; -import { useCallback } from "react"; -import { IconType } from "react-icons"; -const icons: Record = { +type TextAlignment = DefaultProps["textAlignment"]["values"][number]; + +const icons: Record = { left: RiAlignLeft, center: RiAlignCenter, right: RiAlignRight, justify: RiAlignJustify, }; -export const TextAlignButton = (props: { - editor: BlockNoteEditor; - textAlignment: DefaultBlockProps["textAlignment"]; +export const TextAlignButton = (props: { + editor: BlockNoteEditor; + textAlignment: TextAlignment; }) => { + const show = useMemo(() => { + const selection = props.editor.getSelection(); + + if (selection) { + for (const block of selection.blocks) { + if (!("textAlignment" in block.props)) { + return false; + } + } + } else { + const block = props.editor.getTextCursorPosition().block; + + if (!("textAlignment" in block.props)) { + return false; + } + } + + return true; + }, [props.editor]); + const setTextAlignment = useCallback( - (textAlignment: DefaultBlockProps["textAlignment"]) => { + (textAlignment: TextAlignment) => { props.editor.focus(); const selection = props.editor.getSelection(); @@ -30,17 +57,23 @@ export const TextAlignButton = (props: { for (const block of selection.blocks) { props.editor.updateBlock(block, { props: { textAlignment: textAlignment }, - }); + } as PartialBlock); } } else { - props.editor.updateBlock(props.editor.getTextCursorPosition().block, { + const block = props.editor.getTextCursorPosition().block; + + props.editor.updateBlock(block, { props: { textAlignment: textAlignment }, - }); + } as PartialBlock); } }, [props.editor] ); + if (!show) { + return null; + } + return ( setTextAlignment(props.textAlignment)} diff --git a/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx b/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx index 57adf480b0..375d9475ab 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultButtons/ToggledStyleButton.tsx @@ -7,7 +7,7 @@ import { RiStrikethrough, RiUnderline, } from "react-icons/ri"; -import { BlockNoteEditor, ToggledStyle } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema, ToggledStyle } from "@blocknote/core"; import { IconType } from "react-icons"; const shortcuts: Record = { @@ -26,10 +26,11 @@ const icons: Record = { code: RiCodeFill, }; -export const ToggledStyleButton = (props: { - editor: BlockNoteEditor; +export const ToggledStyleButton = (props: { + editor: BlockNoteEditor; toggledStyle: ToggledStyle; }) => { + const toggleStyle = (style: ToggledStyle) => { props.editor.focus(); props.editor.toggleStyles({ [style]: true }); diff --git a/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx b/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx index d69c85b812..b6ce8fe6f5 100644 --- a/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx +++ b/packages/react/src/FormattingToolbar/components/DefaultDropdowns/BlockTypeDropdown.tsx @@ -1,5 +1,10 @@ +import { + BlockNoteEditor, + BlockSchema, + DefaultBlockSchema, +} from "@blocknote/core"; import { useEffect, useState } from "react"; -import { BlockNoteEditor } from "@blocknote/core"; +import { IconType } from "react-icons"; import { RiH1, RiH2, @@ -10,7 +15,26 @@ import { } from "react-icons/ri"; import { ToolbarDropdown } from "../../../SharedComponents/Toolbar/components/ToolbarDropdown"; -export const BlockTypeDropdown = (props: { editor: BlockNoteEditor }) => { +type HeadingLevels = "1" | "2" | "3"; + +const headingIcons: Record = { + "1": RiH1, + "2": RiH2, + "3": RiH3, +}; + +const shouldShow = (schema: BlockSchema) => { + const paragraph = "paragraph" in schema; + const heading = "heading" in schema && "level" in schema.heading.propSchema; + const bulletListItem = "bulletListItem" in schema; + const numberedListItem = "numberedListItem" in schema; + + return paragraph && heading && bulletListItem && numberedListItem; +}; + +export const BlockTypeDropdown = (props: { + editor: BlockNoteEditor; +}) => { const [block, setBlock] = useState( props.editor.getTextCursorPosition().block ); @@ -20,6 +44,29 @@ export const BlockTypeDropdown = (props: { editor: BlockNoteEditor }) => { [props] ); + if (!shouldShow(props.editor.schema)) { + return null; + } + + // let's cast the editor because "shouldShow" has given us the confidence + // the default block schema is being used + let editor = props.editor as any as BlockNoteEditor; + + const headingItems = editor.schema.heading.propSchema.level.values.map( + (level) => ({ + onClick: () => { + editor.focus(); + editor.updateBlock(block, { + type: "heading", + props: { level: level }, + }); + }, + text: "Heading " + level, + icon: headingIcons[level], + isSelected: block.type === "heading" && block.props.level === level, + }) + ); + return ( { icon: RiText, isSelected: block.type === "paragraph", }, - { - onClick: () => { - props.editor.focus(); - props.editor.updateBlock(block, { - type: "heading", - props: { level: "1" }, - }); - }, - text: "Heading 1", - icon: RiH1, - isSelected: block.type === "heading" && block.props.level === "1", - }, - { - onClick: () => { - props.editor.focus(); - props.editor.updateBlock(block, { - type: "heading", - props: { level: "2" }, - }); - }, - text: "Heading 2", - icon: RiH2, - isSelected: block.type === "heading" && block.props.level === "2", - }, - { - onClick: () => { - props.editor.focus(); - props.editor.updateBlock(block, { - type: "heading", - props: { level: "3" }, - }); - }, - text: "Heading 3", - icon: RiH3, - isSelected: block.type === "heading" && block.props.level === "3", - }, + ...headingItems, { onClick: () => { props.editor.focus(); diff --git a/packages/react/src/FormattingToolbar/components/FormattingToolbar.tsx b/packages/react/src/FormattingToolbar/components/FormattingToolbar.tsx index dfacb7f90a..85b3650d0b 100644 --- a/packages/react/src/FormattingToolbar/components/FormattingToolbar.tsx +++ b/packages/react/src/FormattingToolbar/components/FormattingToolbar.tsx @@ -1,18 +1,17 @@ -import { FC } from "react"; -import { BlockNoteEditor } from "@blocknote/core"; +import { BlockNoteEditor, BlockSchema } from "@blocknote/core"; import { Toolbar } from "../../SharedComponents/Toolbar/components/Toolbar"; -import { BlockTypeDropdown } from "./DefaultDropdowns/BlockTypeDropdown"; -import { ToggledStyleButton } from "./DefaultButtons/ToggledStyleButton"; -import { TextAlignButton } from "./DefaultButtons/TextAlignButton"; import { ColorStyleButton } from "./DefaultButtons/ColorStyleButton"; +import { CreateLinkButton } from "./DefaultButtons/CreateLinkButton"; import { NestBlockButton, UnnestBlockButton, } from "./DefaultButtons/NestBlockButtons"; -import { CreateLinkButton } from "./DefaultButtons/CreateLinkButton"; +import { TextAlignButton } from "./DefaultButtons/TextAlignButton"; +import { ToggledStyleButton } from "./DefaultButtons/ToggledStyleButton"; +import { BlockTypeDropdown } from "./DefaultDropdowns/BlockTypeDropdown"; -export const FormattingToolbar: FC<{ editor: BlockNoteEditor }> = (props: { - editor: BlockNoteEditor; +export const FormattingToolbar = (props: { + editor: BlockNoteEditor; }) => { return ( @@ -23,9 +22,9 @@ export const FormattingToolbar: FC<{ editor: BlockNoteEditor }> = (props: { - - - + + + diff --git a/packages/react/src/ReactBlockSpec.tsx b/packages/react/src/ReactBlockSpec.tsx new file mode 100644 index 0000000000..66a48cf7c5 --- /dev/null +++ b/packages/react/src/ReactBlockSpec.tsx @@ -0,0 +1,132 @@ +import { + BlockConfig, + BlockSchema, + BlockSpec, + blockStyles, + camelToDataKebab, + createTipTapBlock, + parse, + PropSchema, + propsToAttributes, + render, +} from "@blocknote/core"; +import { + NodeViewContent, + NodeViewProps, + NodeViewWrapper, + ReactNodeViewRenderer, +} from "@tiptap/react"; +import { FC, HTMLAttributes } from "react"; + +// extend BlockConfig but use a react render function +export type ReactBlockConfig< + Type extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +> = Omit< + BlockConfig, + "render" +> & { + render: FC<{ + block: Parameters< + BlockConfig["render"] + >[0]; + editor: Parameters< + BlockConfig["render"] + >[1]; + }>; +}; + +export const InlineContent = (props: HTMLAttributes) => ( + +); + +// A function to create custom block for API consumers +// we want to hide the tiptap node from API consumers and provide a simpler API surface instead +export function createReactBlockSpec< + BType extends string, + PSchema extends PropSchema, + ContainsInlineContent extends boolean, + BSchema extends BlockSchema +>( + blockConfig: ReactBlockConfig +): BlockSpec { + const node = createTipTapBlock({ + name: blockConfig.type, + content: blockConfig.containsInlineContent ? "inline*" : "", + selectable: blockConfig.containsInlineContent, + + addOptions() { + return { + editor: undefined, + }; + }, + + addAttributes() { + return propsToAttributes(blockConfig); + }, + + parseHTML() { + return parse(blockConfig); + }, + + renderHTML({ HTMLAttributes }) { + return render(blockConfig, HTMLAttributes); + }, + + addNodeView() { + const BlockContent: FC = (props: NodeViewProps) => { + const Content = blockConfig.render; + + // Add props as HTML attributes in kebab-case with "data-" prefix + const htmlAttributes: Record = {}; + for (const [attribute, value] of Object.entries(props.node.attrs)) { + if (attribute in blockConfig.propSchema) { + htmlAttributes[camelToDataKebab(attribute)] = value; + } + } + + // Gets BlockNote editor instance + const editor = this.options.editor!; + // Gets position of the node + const pos = + typeof props.getPos === "function" ? props.getPos() : undefined; + // Gets TipTap editor instance + const tipTapEditor = editor._tiptapEditor; + // Gets parent blockContainer node + const blockContainer = tipTapEditor.state.doc.resolve(pos!).node(); + // Gets block identifier + const blockIdentifier = blockContainer.attrs.id; + // Get the block + const block = editor.getBlock(blockIdentifier)!; + if (block.type !== blockConfig.type) { + throw new Error("Block type does not match"); + } + + return ( + + + + ); + }; + + return ReactNodeViewRenderer(BlockContent, { + className: blockStyles.reactNodeViewRenderer, + }); + }, + }); + + return { + node: node, + propSchema: blockConfig.propSchema, + }; +} diff --git a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx b/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx index 40e4009509..9e8e5ff474 100644 --- a/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx +++ b/packages/react/src/SharedComponents/Toolbar/components/ToolbarDropdown.tsx @@ -18,6 +18,10 @@ export type ToolbarDropdownProps = { export function ToolbarDropdown(props: ToolbarDropdownProps) { const activeItem = props.items.filter((p) => p.isSelected)[0]; + if (!activeItem) { + return null; + } + return ( diff --git a/packages/react/src/SlashMenu/ReactSlashMenuItem.ts b/packages/react/src/SlashMenu/ReactSlashMenuItem.ts index 31dc72f079..44ff73c2a1 100644 --- a/packages/react/src/SlashMenu/ReactSlashMenuItem.ts +++ b/packages/react/src/SlashMenu/ReactSlashMenuItem.ts @@ -1,9 +1,15 @@ -import { BaseSlashMenuItem, BlockNoteEditor } from "@blocknote/core"; +import { + BaseSlashMenuItem, + BlockNoteEditor, + BlockSchema, +} from "@blocknote/core"; -export class ReactSlashMenuItem extends BaseSlashMenuItem { +export class ReactSlashMenuItem< + BSchema extends BlockSchema +> extends BaseSlashMenuItem { constructor( public readonly name: string, - public readonly execute: (editor: BlockNoteEditor) => void, + public readonly execute: (editor: BlockNoteEditor) => void, public readonly aliases: string[] = [], public readonly group: string, public readonly icon: JSX.Element, diff --git a/packages/react/src/SlashMenu/SlashMenuFactory.tsx b/packages/react/src/SlashMenu/SlashMenuFactory.tsx index fa79dccc57..3eda458e7d 100644 --- a/packages/react/src/SlashMenu/SlashMenuFactory.tsx +++ b/packages/react/src/SlashMenu/SlashMenuFactory.tsx @@ -1,4 +1,5 @@ import { + BlockSchema, SuggestionsMenu, SuggestionsMenuDynamicParams, SuggestionsMenuFactory, @@ -10,11 +11,11 @@ import { ReactElementFactory } from "../ElementFactory/components/ReactElementFa import { MantineThemeOverride } from "@mantine/core"; export const createReactSlashMenuFactory = - (theme: MantineThemeOverride): SuggestionsMenuFactory => - (staticParams): SuggestionsMenu => + (theme: MantineThemeOverride): SuggestionsMenuFactory> => + (staticParams): SuggestionsMenu> => ReactElementFactory< - SuggestionsMenuStaticParams, - SuggestionsMenuDynamicParams + SuggestionsMenuStaticParams>, + SuggestionsMenuDynamicParams> >(staticParams, SlashMenu, theme, { animation: "fade", placement: "bottom-start", diff --git a/packages/react/src/SlashMenu/components/SlashMenu.tsx b/packages/react/src/SlashMenu/components/SlashMenu.tsx index b06d9973e3..f775ec7728 100644 --- a/packages/react/src/SlashMenu/components/SlashMenu.tsx +++ b/packages/react/src/SlashMenu/components/SlashMenu.tsx @@ -1,17 +1,18 @@ +import { createStyles, Menu } from "@mantine/core"; import * as _ from "lodash"; - -import { Menu, createStyles } from "@mantine/core"; - -import { ReactSlashMenuItem } from "../ReactSlashMenuItem"; import { SlashMenuItem } from "./SlashMenuItem"; +import { ReactSlashMenuItem } from "../ReactSlashMenuItem"; +import { BlockSchema } from "@blocknote/core"; -export type SlashMenuProps = { - items: ReactSlashMenuItem[]; +export type SlashMenuProps = { + items: ReactSlashMenuItem[]; keyboardHoveredItemIndex: number; - itemCallback: (item: ReactSlashMenuItem) => void; + itemCallback: (item: ReactSlashMenuItem) => void; }; -export function SlashMenu(props: SlashMenuProps) { +export function SlashMenu( + props: SlashMenuProps +) { const { classes } = createStyles({ root: {} })(undefined, { name: "SlashMenu", }); @@ -51,8 +52,7 @@ export function SlashMenu(props: SlashMenuProps) { */ defaultOpened={true} trigger={"hover"} - closeDelay={10000000} - styles={{ dropdown: { position: "static" } }}> + closeDelay={10000000}> {renderedItems.length > 0 ? ( renderedItems diff --git a/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx b/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx index 5aaf10c950..740265e12d 100644 --- a/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx +++ b/packages/react/src/SlashMenu/defaultReactSlashMenuItems.tsx @@ -1,6 +1,8 @@ -import { formatKeyboardShortcut } from "../utils"; -import { defaultSlashMenuItems, BaseSlashMenuItem } from "@blocknote/core"; -import { ReactSlashMenuItem } from "./ReactSlashMenuItem"; +import { + BaseSlashMenuItem, + DefaultBlockSchema, + defaultSlashMenuItems, +} from "@blocknote/core"; import { RiH1, RiH2, @@ -9,10 +11,14 @@ import { RiListUnordered, RiText, } from "react-icons/ri"; - +import { formatKeyboardShortcut } from "../utils"; +import { ReactSlashMenuItem } from "./ReactSlashMenuItem"; const extraFields: Record< string, - Omit + Omit< + ReactSlashMenuItem, + keyof BaseSlashMenuItem + > > = { Heading: { group: "Headings", @@ -52,16 +58,15 @@ const extraFields: Record< }, }; -export const defaultReactSlashMenuItems: ReactSlashMenuItem[] = - defaultSlashMenuItems.map( - (item) => - new ReactSlashMenuItem( - item.name, - item.execute, - item.aliases, - extraFields[item.name].group, - extraFields[item.name].icon, - extraFields[item.name].hint, - extraFields[item.name].shortcut - ) - ); +export const defaultReactSlashMenuItems = defaultSlashMenuItems.map( + (item) => + new ReactSlashMenuItem( + item.name, + item.execute, + item.aliases, + extraFields[item.name].group, + extraFields[item.name].icon, + extraFields[item.name].hint, + extraFields[item.name].shortcut + ) +); diff --git a/packages/react/src/hooks/useBlockNote.ts b/packages/react/src/hooks/useBlockNote.ts index 4cd9f6fbad..323c050306 100644 --- a/packages/react/src/hooks/useBlockNote.ts +++ b/packages/react/src/hooks/useBlockNote.ts @@ -1,4 +1,9 @@ -import { BlockNoteEditor, BlockNoteEditorOptions } from "@blocknote/core"; +import { + BlockNoteEditor, + BlockNoteEditorOptions, + BlockSchema, + DefaultBlockSchema, +} from "@blocknote/core"; import { DependencyList, FC, useEffect, useState } from "react"; import { getBlockNoteTheme } from "../BlockNoteTheme"; import { createReactBlockSideMenuFactory } from "../BlockSideMenu/BlockSideMenuFactory"; @@ -10,9 +15,9 @@ import { createReactSlashMenuFactory } from "../SlashMenu/SlashMenuFactory"; //based on https://github.com/ueberdosis/tiptap/blob/main/packages/react/src/useEditor.ts -type CustomElements = Partial<{ - formattingToolbar: FC<{ editor: BlockNoteEditor }>; - dragHandleMenu: FC; +type CustomElements = Partial<{ + formattingToolbar: FC<{ editor: BlockNoteEditor }>; + dragHandleMenu: FC>; }>; function useForceUpdate() { @@ -24,15 +29,15 @@ function useForceUpdate() { /** * Main hook for importing a BlockNote editor into a React project */ -export const useBlockNote = ( +export const useBlockNote = ( options: Partial< - BlockNoteEditorOptions & { - customElements: CustomElements; + BlockNoteEditorOptions & { + customElements: CustomElements; } > = {}, deps: DependencyList = [] ) => { - const [editor, setEditor] = useState(null); + const [editor, setEditor] = useState | null>(null); const forceUpdate = useForceUpdate(); useEffect(() => { @@ -75,8 +80,8 @@ export const useBlockNote = ( }; console.log("create new blocknote instance"); - const instance = new BlockNoteEditor( - newOptions as Partial + const instance = new BlockNoteEditor( + newOptions as Partial> ); setEditor(instance); diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index c29a62000a..55edb7a45a 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -1,6 +1,8 @@ // TODO: review directories export * from "./BlockNoteView"; +export * from "./ReactBlockSpec"; + export * from "./BlockSideMenu/BlockSideMenuFactory"; export * from "./BlockSideMenu/components/DragHandleMenu"; export * from "./BlockSideMenu/components/DragHandleMenuItem"; diff --git a/packages/website/docs/docs/block-types.md b/packages/website/docs/docs/block-types.md index 4bcf48dfe9..ecb59f73de 100644 --- a/packages/website/docs/docs/block-types.md +++ b/packages/website/docs/docs/block-types.md @@ -7,7 +7,7 @@ path: /docs/block-types # Block Types & Properties -A block's type affects how it looks and behaves in the editor. Each type also comes with its own set of properties, which further affect the block's appearance and behaviour. +A block's type affects how it looks and behaves in the editor. Each type also comes with its own set of properties, each having a string value, which further affect the block's appearance and behaviour. ## Built-In Block Types @@ -91,7 +91,7 @@ type NumberedListItemBlock = { ## Default Block Properties -While each type of block can have its own set of properties, there are some properties that all block types have by default, which you can find in the definition for `DefaultBlockProps`: +While each type of block can have its own set of properties, there are some properties that all built-in block types have by default, which you can find in the definition for `DefaultBlockProps`: ```typescript type DefaultBlockProps = { @@ -109,4 +109,210 @@ type DefaultBlockProps = { ## Custom Block Types -### Coming Soon! +In addition to the default block types that BlockNote offers, you can also make your own custom blocks. Take a look at the demo below, in which we add a custom block containing an image and caption to a BlockNote editor, as well as a custom [Slash Menu Item](/docs/slash-menu#custom-items) to insert it. + +::: sandbox {template=react-ts} + +```typescript /App.tsx +import { + BlockNoteEditor, + defaultBlockSchema, + defaultProps, +} from "@blocknote/core"; +import { + BlockNoteView, + useBlockNote, + createReactBlockSpec, + InlineContent, + ReactSlashMenuItem, + defaultReactSlashMenuItems, +} from "@blocknote/react"; +import "@blocknote/core/style.css"; +import { RiImage2Fill } from "react-icons/ri"; + +export default function App() { + // Creates a custom image block. + const ImageBlock = createReactBlockSpec({ + type: "image", + propSchema: { + ...defaultProps, + src: { + default: "https://via.placeholder.com/1000", + }, + }, + containsInlineContent: true, + render: ({ block }) => ( +
        + {"Image"} + +
        + ), + }); + + // Creates a slash menu item for inserting an image block. + const insertImage = new ReactSlashMenuItem< + DefaultBlockSchema & { image: typeof ImageBlock } + >( + "Insert Image", + (editor) => { + const src: string | null = prompt("Enter image URL"); + editor.insertBlocks( + [ + { + type: "image", + props: { + src: src || "https://via.placeholder.com/1000", + }, + }, + ], + editor.getTextCursorPosition().block, + "after" + ); + }, + ["image", "img", "picture", "media"], + "Media", + , + "Insert an image" + ); + + // Creates a new editor instance. + const editor = useBlockNote({ + // Tells BlockNote which blocks to use. + blockSchema: { + // Adds all default blocks. + ...defaultBlockSchema, + // Adds the custom image block. + image: ImageBlock, + }, + slashCommands: [...defaultReactSlashMenuItems, insertImage], + }); + + // Renders the editor instance using a React component. + return ; +} +``` + +::: + +::: info +While custom blocks open a lot of doors for what you can do with BlockNote, we're still working on the API and there are a few limitations for the kinds of blocks you can create. + +We'd love to hear your feedback on Github or in our Discord community! +::: + +### Creating a Custom Block Type + +To define a custom block type, we use the `createReactBlockSpec` function, for which you can see the definition below: + +```typescript +type PropSchema = Record< + string, + { + default: string; + values?: string[]; + }; +> + +function createReactBlockSpec(config: { + type: string; + propSchema: PropSchema; + containsInlineContent: boolean; + render: (props: { + block: Block, + editor: BlockNoteEditor + }) => JSX.Element; +}): BlockType; +``` + +Let's look at our custom image block from the demo, and go over each field in-depth to explain how it works: + +```typescript jsx +const ImageBlock = createReactBlockSpec({ + type: "image", + propSchema: { + src: { + default: "https://via.placeholder.com/1000", + }, + }, + containsInlineContent: true, + render: ({ block }) => ( +
        + {"Image"} + +
        + ), +}); +``` + +#### `type` + +Defines the name of the block, in this case, `image`. + +#### `propSchema` + +This is an object which defines the props that the block should have. In this case, we want the block to have a `src` prop for the URL of the image, so we add a `src` key. We also want basic styling options for the image block, so we also add the [Default Block Properties](/docs/block-types#default-block-properties) using `defaultProps`. The value of each key is an object with a mandatory `default` field and an optional `values` field: + +`default:` Stores the prop's default value, so we use a placeholder image URL for `src` if no URL is provided. + +`values:` Stores an array of strings that the prop can take. If `values` is not defined, BlockNote assumes the prop can be any string, which makes sense for `src`, since it can be any image URL. + +#### `containsInlineContent` + +As we saw in [Block Objects](/docs/blocks#block-objects), blocks can contain editable rich text which is represented as [Inline Content](/docs/inline-content). The `containsInlineContent` field allows your custom block to contain an editable rich-text field. For the custom image block, we use an inline content field to create our caption, so it's set to `true`. + +#### `render` + +This is a React component which defines how your custom block should be rendered in the editor, and takes two props: + +`block:` The block that should be rendered. + +`editor:` The BlockNote editor instance that the block is in. + +For our custom image block, we use a parent `div` which contains the image and caption. Since `block` will always be an `image` block, we also know it contains a `src` prop, and can pass it to the child `img` element. + +But what's this `InlineContent` component? Since we set `containsInlineContent` to `true`, it means we want to include an editable rich-text field somewhere in the image block. You should use the `InlineContent` component to represent this field in your `render` component. Since we're using it to create our caption, we add it below the `img` element. + +While the `InlineContent` component can be put anywhere inside the component you pass to `render`, you should make sure to only have one. If `containsInlineContent` is set to false, `render` shouldn't contain any. + +### Adding Custom Blocks to the Editor + +Now, we need to tell BlockNote to use our custom image block by passing it to the editor in the `blockSchema` option. Let's again look at the image block from the demo as an example: + +```typescript jsx +// Creates a new editor instance. +const editor = useBlockNote({ + // Tells BlockNote which blocks to use. + blockSchema: { + // Adds all default blocks. + ...defaultBlockSchema, + // Adds the custom image block. + image: ImageBlock, + }, +}); +``` + +Since we still want the editor to use the [Built-In Block Types](/docs/block-types#built-in-block-types), we add `defaultBlockSchema` to our custom block schema. The key which we use for the custom image block is the same string we use for its type. Make sure that this is always the case for your own custom blocks. + +And we're done! You now know how to create custom blocks and add them to the editor. Head to [Manipulating Blocks](/docs/manipulating-blocks) to see what you can do with them in the editor. diff --git a/packages/website/docs/docs/blocks.md b/packages/website/docs/docs/blocks.md index b2e4c30273..8ee79f1c87 100644 --- a/packages/website/docs/docs/blocks.md +++ b/packages/website/docs/docs/blocks.md @@ -58,7 +58,7 @@ type Block = { `props:` The block's properties, which are stored in a set of key/value pairs and specify how the block looks and behaves. Different block types have different props - see [Block Types & Properties](/docs/block-types) for more. -`content:` The block's content, represented as an array of `InlineContent` objects. This does not include content from any nested blocks. For more information on `InlineContent` objects, visit [Inline Content](/docs/inline-content). +`content:` The block's rich text content, represented as an array of `InlineContent` objects. This does not include content from any nested blocks. For more information on `InlineContent` objects, visit [Inline Content](/docs/inline-content). `children:` Any blocks nested inside the block. The nested blocks are also represented using `Block` objects. diff --git a/packages/website/docs/docs/slash-menu.md b/packages/website/docs/docs/slash-menu.md index 68bcedea6c..1014662768 100644 --- a/packages/website/docs/docs/slash-menu.md +++ b/packages/website/docs/docs/slash-menu.md @@ -51,7 +51,7 @@ BlockNote comes with a variety of built-in Slash Menu items, which are used to c If you want to change, remove & reorder the default items , you first import and copy them to a new array. From there, you can edit the array how you like, then pass it to `useBlockNote`: ```typescript -import { +import { BlockNoteView, defaultReactSlashMenuItems, useBlockNote @@ -77,16 +77,12 @@ You can also create your own, custom menu items too, as you can see in the examp ::: sandbox {template=react-ts} ```typescript /App.tsx -import { - Block, - BlockNoteEditor, - PartialBlock -} from "@blocknote/core"; +import { Block, BlockNoteEditor, PartialBlock } from "@blocknote/core"; import { BlockNoteView, defaultReactSlashMenuItems, ReactSlashMenuItem, - useBlockNote + useBlockNote, } from "@blocknote/react"; import "@blocknote/core/style.css"; import { HiOutlineGlobeAlt } from "react-icons/all"; @@ -96,11 +92,11 @@ export default function App() { const insertHelloWorld = (editor: BlockNoteEditor) => { // Block that the text cursor is currently in. const currentBlock: Block = editor.getTextCursorPosition().block; - + // New block we want to insert. const helloWorldBlock: PartialBlock = { type: "paragraph", - content: [{type: "text", text: "Hello World", styles: {bold: true}}], + content: [{ type: "text", text: "Hello World", styles: { bold: true } }], }; // Inserting the new block after the current one. @@ -108,30 +104,26 @@ export default function App() { }; // Slash Menu item which executes the command. - const insertHelloWorldItem: ReactSlashMenuItem = - new ReactSlashMenuItem( - "Insert Hello World", - insertHelloWorld, - ["helloworld", "hw"], - "Other", - , - "Used to insert a block with 'Hello World' below." - ) + const insertHelloWorldItem = new ReactSlashMenuItem( + "Insert Hello World", + insertHelloWorld, + ["helloworld", "hw"], + "Other", + , + "Used to insert a block with 'Hello World' below." + ); // Creates a new editor instance. const editor: BlockNoteEditor = useBlockNote({ // Adds all default Slash Menu items as well as our custom one. - slashCommands: [ - ...defaultReactSlashMenuItems, - insertHelloWorldItem - ] + slashCommands: [...defaultReactSlashMenuItems, insertHelloWorldItem], }); // Renders the editor instance. - return ; + return ; } ``` ::: -If you're confused about what's happening inside `execute`, head to [Introduction to Blocks](/docs/blocks), which will guide you through manipulating blocks in the editor using code. When creating your own `ReactSlashMenuItem`s, also make sure you use the class constructor like in the demo. +If you're confused about what's happening inside `execute`, head to [Introduction to Blocks](/docs/blocks), which will guide you through manipulating blocks in the editor using code. When creating your own `ReactSlashMenuItem`s, also make sure you use the class constructor like in the demo. diff --git a/playwright-ct.config.ts b/playwright-ct.config.ts new file mode 100644 index 0000000000..9eb80ef591 --- /dev/null +++ b/playwright-ct.config.ts @@ -0,0 +1,46 @@ +import { defineConfig, devices } from "@playwright/experimental-ct-react"; + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests/component/", + /* The base directory, relative to the config file, for snapshot files created with toMatchSnapshot and toHaveScreenshot. */ + snapshotDir: "./tests/component/snapshots", + /* Maximum time one test can run for. */ + timeout: 10 * 1000, + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + + /* Port to use for Playwright component endpoint. */ + ctPort: 3100, + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + { + name: "webkit", + use: { ...devices["Desktop Safari"] }, + }, + ], +}); diff --git a/playwright.config.ts b/playwright.config.ts index 3cc99faada..f3dddcdeb9 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -45,7 +45,6 @@ const config: PlaywrightTestConfig = { { name: "chromium", use: { - // headless: false, ...devices["Desktop Chrome"], }, }, @@ -53,7 +52,6 @@ const config: PlaywrightTestConfig = { { name: "firefox", use: { - // headless: false, ...devices["Desktop Firefox"], }, }, @@ -61,7 +59,6 @@ const config: PlaywrightTestConfig = { { name: "webkit", use: { - // headless: false, ...devices["Desktop Safari"], }, }, diff --git a/playwright/index.html b/playwright/index.html new file mode 100644 index 0000000000..610ddf8a43 --- /dev/null +++ b/playwright/index.html @@ -0,0 +1,12 @@ + + + + + + Testing Page + + +
        + + + diff --git a/playwright/index.tsx b/playwright/index.tsx new file mode 100644 index 0000000000..ac6de14bf2 --- /dev/null +++ b/playwright/index.tsx @@ -0,0 +1,2 @@ +// Import styles, initialize component theme here. +// import '../src/common.css'; diff --git a/tests/component/copypaste-external.spec.tsx b/tests/component/copypaste-external.spec.tsx new file mode 100644 index 0000000000..8eee66d176 --- /dev/null +++ b/tests/component/copypaste-external.spec.tsx @@ -0,0 +1,153 @@ +import { expect, test } from "../setup/setupScriptComponent"; +import { focusOnEditor } from "../utils/editor"; +import { executeSlashCommand } from "../utils/slashmenu"; +import { + copyPasteAllExternal, + removeClassesFromHTML, + removeMetaFromHTML, +} from "../utils/copypaste"; +import EditorWithTextArea from "../utils/components/EditorWithTextArea"; + +test.describe.configure({ mode: "serial" }); + +test.beforeEach(async ({}, testInfo) => { + testInfo.snapshotSuffix = ""; +}); + +// TODO: These tests should not be used for now. While they do pass, the +// snapshots don't contain the output we actually want as the custom +// serializer hasn't been implemented yet. +test("Alert Copy/Paste External", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "alert"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Alert"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const button = await page.locator( + `[data-content-type="alert"] > div > div:first-child` + ); + await button.first().click(); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("alert-external.html"); +}); + +test("Button Copy/Paste External", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "button"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("button-external.html"); +}); + +test("Embed Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "embed"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("embed-external.html"); +}); + +test("Image Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "image"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Caption"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("image-external.html"); +}); + +test("Separator Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "separator"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("separator-external.html"); +}); + +test("Table of Contents Copy/Paste Internal", async ({ + browserName, + mount, + page, +}) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await executeSlashCommand(page, "h1"); + await page.keyboard.type("Heading 1"); + await executeSlashCommand(page, "toc"); + await page.keyboard.press("ArrowDown"); + await executeSlashCommand(page, "h2"); + await page.keyboard.type("Heading 2"); + + const value = await copyPasteAllExternal(page, "mac"); + await expect( + removeClassesFromHTML(removeMetaFromHTML(value)) + ).toMatchSnapshot("toc-external.html"); +}); diff --git a/tests/component/copypaste-internal.spec.tsx b/tests/component/copypaste-internal.spec.tsx new file mode 100644 index 0000000000..1f03addb52 --- /dev/null +++ b/tests/component/copypaste-internal.spec.tsx @@ -0,0 +1,159 @@ +import { expect, test } from "../setup/setupScriptComponent"; +import Editor from "../utils/components/Editor"; +import { compareDocToSnapshot, focusOnEditor } from "../utils/editor"; +import { executeSlashCommand } from "../utils/slashmenu"; +import { copyPasteAll } from "../utils/copypaste"; + +test.describe.configure({ mode: "serial" }); + +test.beforeEach(async ({}, testInfo) => { + testInfo.snapshotSuffix = ""; +}); + +test("Alert Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "alert"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Alert"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + const button = await page.locator( + `[data-content-type="alert"] > div > div:first-child` + ); + await button.first().click(); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + await compareDocToSnapshot(page, "alert-internal"); +}); + +test("Button Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "button"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + const button = await page.locator("button"); + await button.first().click(); + await button.last().click(); + + await compareDocToSnapshot(page, "button-internal"); +}); + +test("Embed Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "embed"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + await compareDocToSnapshot(page, "embed-internal"); +}); + +test("Image Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "image"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Caption"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + await compareDocToSnapshot(page, "image-internal"); +}); + +test("Separator Copy/Paste Internal", async ({ browserName, mount, page }) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await page.keyboard.type("Paragraph 1"); + await executeSlashCommand(page, "separator"); + await page.keyboard.press("ArrowDown"); + await page.keyboard.type("Paragraph 2"); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + await compareDocToSnapshot(page, "separator-internal"); +}); + +test("Table of Contents Copy/Paste Internal", async ({ + browserName, + mount, + page, +}) => { + test.skip( + browserName === "firefox", + "Firefox doesn't yet support the async clipboard API." + ); + + await mount(); + + await focusOnEditor(page); + await executeSlashCommand(page, "h1"); + await page.keyboard.type("Heading 1"); + await executeSlashCommand(page, "toc"); + await page.keyboard.press("ArrowDown"); + await executeSlashCommand(page, "h2"); + await page.keyboard.type("Heading 2"); + + await copyPasteAll(page, "mac"); + await page.waitForTimeout(50); + + const expectedToC = + "
      • Heading 1

      • Heading 2

      • Heading 1

      • Heading 2

      • "; + await expect(await page.locator("ol").first().innerHTML()).toEqual( + expectedToC + ); + await expect(await page.locator("ol").first().innerHTML()).toEqual( + await page.locator("ol").last().innerHTML() + ); + + await compareDocToSnapshot(page, "toc-internal"); +}); diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-chromium.html new file mode 100644 index 0000000000..1051dff8fe --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-chromium.html @@ -0,0 +1 @@ +

        Paragraph 1

        Alert

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-firefox.html new file mode 100644 index 0000000000..1051dff8fe --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-firefox.html @@ -0,0 +1 @@ +

        Paragraph 1

        Alert

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-webkit.html new file mode 100644 index 0000000000..1051dff8fe --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/alert-external-webkit.html @@ -0,0 +1 @@ +

        Paragraph 1

        Alert

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-chromium.html new file mode 100644 index 0000000000..365732b783 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-chromium.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-firefox.html new file mode 100644 index 0000000000..365732b783 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-firefox.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-webkit.html new file mode 100644 index 0000000000..365732b783 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/button-external-webkit.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-chromium.html new file mode 100644 index 0000000000..e10175903b --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-chromium.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-firefox.html new file mode 100644 index 0000000000..e10175903b --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-firefox.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-webkit.html new file mode 100644 index 0000000000..e10175903b --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/embed-external-webkit.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-chromium.html new file mode 100644 index 0000000000..add115848a --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-chromium.html @@ -0,0 +1 @@ +

        Paragraph 1

        Caption

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-firefox.html new file mode 100644 index 0000000000..add115848a --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-firefox.html @@ -0,0 +1 @@ +

        Paragraph 1

        Caption

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-webkit.html new file mode 100644 index 0000000000..add115848a --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/image-external-webkit.html @@ -0,0 +1 @@ +

        Paragraph 1

        Caption

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-chromium.html new file mode 100644 index 0000000000..644b8f5f92 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-chromium.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-firefox.html new file mode 100644 index 0000000000..644b8f5f92 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-firefox.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-webkit.html new file mode 100644 index 0000000000..644b8f5f92 --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/separator-external-webkit.html @@ -0,0 +1 @@ +

        Paragraph 1

        Paragraph 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-chromium.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-chromium.html new file mode 100644 index 0000000000..52e158dd0f --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-chromium.html @@ -0,0 +1 @@ +

        Heading 1

        Heading 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-firefox.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-firefox.html new file mode 100644 index 0000000000..52e158dd0f --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-firefox.html @@ -0,0 +1 @@ +

        Heading 1

        Heading 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-webkit.html b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-webkit.html new file mode 100644 index 0000000000..52e158dd0f --- /dev/null +++ b/tests/component/snapshots/copypaste-external.spec.tsx-snapshots/toc-external-webkit.html @@ -0,0 +1 @@ +

        Heading 1

        Heading 2

        \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-chromium.json new file mode 100644 index 0000000000..ec4caf0535 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-chromium.json @@ -0,0 +1,178 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-firefox.json new file mode 100644 index 0000000000..ec4caf0535 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-firefox.json @@ -0,0 +1,178 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-webkit.json new file mode 100644 index 0000000000..ec4caf0535 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/alert-internal-webkit.json @@ -0,0 +1,178 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "alert", + "attrs": { + "textAlignment": "left", + "textColor": "black", + "type": "error" + }, + "content": [ + { + "type": "text", + "text": "Alert" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-chromium.json new file mode 100644 index 0000000000..4df38a66b0 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-chromium.json @@ -0,0 +1,206 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "9", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "10", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-firefox.json new file mode 100644 index 0000000000..4df38a66b0 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-firefox.json @@ -0,0 +1,206 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "9", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "10", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-webkit.json new file mode 100644 index 0000000000..4df38a66b0 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/button-internal-webkit.json @@ -0,0 +1,206 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "9", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "button", + "attrs": { + "backgroundColor": "transparent" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "10", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Hello World" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-chromium.json new file mode 100644 index 0000000000..1254937ad4 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-chromium.json @@ -0,0 +1,162 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-firefox.json new file mode 100644 index 0000000000..1254937ad4 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-firefox.json @@ -0,0 +1,162 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-webkit.json new file mode 100644 index 0000000000..1254937ad4 --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/embed-internal-webkit.json @@ -0,0 +1,162 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "embed", + "attrs": { + "src": "https://www.youtube.com/embed/wjfuB8Xjhc4" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-chromium.json new file mode 100644 index 0000000000..e40c6b535b --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-chromium.json @@ -0,0 +1,174 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-firefox.json new file mode 100644 index 0000000000..e40c6b535b --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-firefox.json @@ -0,0 +1,174 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-webkit.json new file mode 100644 index 0000000000..e40c6b535b --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/image-internal-webkit.json @@ -0,0 +1,174 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "image", + "attrs": { + "src": "https://via.placeholder.com/150" + }, + "content": [ + { + "type": "text", + "text": "Caption" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-chromium.json new file mode 100644 index 0000000000..4dae2e010a --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-chromium.json @@ -0,0 +1,156 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-firefox.json new file mode 100644 index 0000000000..4dae2e010a --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-firefox.json @@ -0,0 +1,156 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-webkit.json new file mode 100644 index 0000000000..4dae2e010a --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/separator-internal-webkit.json @@ -0,0 +1,156 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "separator" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + }, + "content": [ + { + "type": "text", + "text": "Paragraph 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-chromium.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-chromium.json new file mode 100644 index 0000000000..b9baad31bb --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-chromium.json @@ -0,0 +1,160 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-firefox.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-firefox.json new file mode 100644 index 0000000000..b9baad31bb --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-firefox.json @@ -0,0 +1,160 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-webkit.json b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-webkit.json new file mode 100644 index 0000000000..b9baad31bb --- /dev/null +++ b/tests/component/snapshots/copypaste-internal.spec.tsx-snapshots/toc-internal-webkit.json @@ -0,0 +1,160 @@ +{ + "type": "doc", + "content": [ + { + "type": "blockGroup", + "content": [ + { + "type": "blockContainer", + "attrs": { + "id": "0", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "2", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "1", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "3", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "5", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "1" + }, + "content": [ + { + "type": "text", + "text": "Heading 1" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "6", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "toc" + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "7", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "heading", + "attrs": { + "textAlignment": "left", + "level": "2" + }, + "content": [ + { + "type": "text", + "text": "Heading 2" + } + ] + } + ] + }, + { + "type": "blockContainer", + "attrs": { + "id": "8", + "textColor": "default", + "backgroundColor": "default" + }, + "content": [ + { + "type": "paragraph", + "attrs": { + "textAlignment": "left" + } + } + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/tests/end-to-end/copypaste/copypaste.test.ts b/tests/end-to-end/copypaste/copypaste.test.ts index 01e5ca3e89..be053aa553 100644 --- a/tests/end-to-end/copypaste/copypaste.test.ts +++ b/tests/end-to-end/copypaste/copypaste.test.ts @@ -10,11 +10,12 @@ import { insertParagraph, } from "../../utils/copypaste"; +test.describe.configure({ mode: "serial" }); + test.beforeEach(async ({ page }) => { await page.goto(BASE_URL); }); -test.describe.configure({ mode: "serial" }); test.describe("Check Copy/Paste Functionality", () => { test("Paragraphs should stay separate", async ({ page, browserName }) => { test.skip( diff --git a/tests/end-to-end/dragdrop/dragdrop.test.ts b/tests/end-to-end/dragdrop/dragdrop.test.ts index 238ced6878..eb7350add2 100644 --- a/tests/end-to-end/dragdrop/dragdrop.test.ts +++ b/tests/end-to-end/dragdrop/dragdrop.test.ts @@ -10,6 +10,8 @@ import { compareDocToSnapshot, focusOnEditor } from "../../utils/editor"; import { insertHeading, insertParagraph } from "../../utils/copypaste"; import { dragAndDropBlock } from "../../utils/mouse"; +test.describe.configure({ mode: "serial" }); + test.beforeEach(async ({ page }) => { await page.goto(BASE_URL, { waitUntil: "networkidle" }); }); diff --git a/tests/end-to-end/keyboardhandlers/keyboardhandlers.test.ts b/tests/end-to-end/keyboardhandlers/keyboardhandlers.test.ts index 2ed64c3640..13a9c086db 100644 --- a/tests/end-to-end/keyboardhandlers/keyboardhandlers.test.ts +++ b/tests/end-to-end/keyboardhandlers/keyboardhandlers.test.ts @@ -8,11 +8,12 @@ import { import { compareDocToSnapshot, focusOnEditor } from "../../utils/editor"; import { insertHeading } from "../../utils/copypaste"; +test.describe.configure({ mode: "serial" }); + test.beforeEach(async ({ page }) => { await page.goto(BASE_URL); }); -test.describe.configure({ mode: "serial" }); test.describe("Check Keyboard Handlers' Behaviour", () => { test("Check Enter when selection is not empty", async ({ page }) => { await focusOnEditor(page); diff --git a/tests/setup/setupScriptComponent.ts b/tests/setup/setupScriptComponent.ts new file mode 100644 index 0000000000..6d92b67ee1 --- /dev/null +++ b/tests/setup/setupScriptComponent.ts @@ -0,0 +1,29 @@ +import { test as base, expect } from "@playwright/experimental-ct-react"; + +export type TestOptions = { + mockID: number | undefined; +}; + +export const test = base.extend({ + browser: async ({ browser }, use) => { + const oldFunc = browser.newContext; + browser.newContext = async (options?) => { + const ret = await oldFunc.call(browser, options); + + await ret.addInitScript({ + content: `window.__TEST_OPTIONS = window.__TEST_OPTIONS || {};`, + }); + + return ret; + }; + await use(browser); + }, + context: async ({ context }, use) => { + await context.addInitScript({ + content: `window.__TEST_OPTIONS = window.__TEST_OPTIONS || {};`, + }); + await use(context); + }, +}); + +export { expect } from "@playwright/experimental-ct-react"; diff --git a/tests/utils/components/Editor.module.css b/tests/utils/components/Editor.module.css new file mode 100644 index 0000000000..fa3b3dc346 --- /dev/null +++ b/tests/utils/components/Editor.module.css @@ -0,0 +1,4 @@ +.editor { + padding: 0 calc((100% - 731px) / 2); + height: 100%; +} diff --git a/tests/utils/components/Editor.tsx b/tests/utils/components/Editor.tsx new file mode 100644 index 0000000000..fd42103672 --- /dev/null +++ b/tests/utils/components/Editor.tsx @@ -0,0 +1,56 @@ +import { defaultBlockSchema } from "@blocknote/core"; +import "@blocknote/core/style.css"; +import { + BlockNoteView, + defaultReactSlashMenuItems, + useBlockNote, +} from "@blocknote/react"; +import { Alert, insertAlert } from "../customblocks/Alert"; +import { Button, insertButton } from "../customblocks/Button"; +import { Embed, insertEmbed } from "../customblocks/Embed"; +import { Image, insertImage } from "../customblocks/Image"; +import { insertSeparator, Separator } from "../customblocks/Separator"; +import { + insertTableOfContents, + TableOfContents, +} from "../customblocks/TableOfContents"; +import styles from "./Editor.module.css"; + +type WindowWithProseMirror = Window & typeof globalThis & { ProseMirror: any }; + +export default function Editor() { + const blockSchema = { + ...defaultBlockSchema, + alert: Alert, + button: Button, + embed: Embed, + image: Image, + separator: Separator, + toc: TableOfContents, + } as const; + + const slashCommands = [ + insertAlert, + insertButton, + insertEmbed, + insertImage, + insertSeparator, + insertTableOfContents, + ]; + + const editor = useBlockNote({ + editorDOMAttributes: { + class: styles.editor, + "data-test": "editor", + }, + blockSchema: blockSchema, + slashCommands: [...defaultReactSlashMenuItems, ...slashCommands], + }); + + console.log(editor); + + // Give tests a way to get prosemirror instance + (window as WindowWithProseMirror).ProseMirror = editor?._tiptapEditor; + + return ; +} diff --git a/tests/utils/components/EditorWithTextArea.tsx b/tests/utils/components/EditorWithTextArea.tsx new file mode 100644 index 0000000000..24c7ced9f3 --- /dev/null +++ b/tests/utils/components/EditorWithTextArea.tsx @@ -0,0 +1,22 @@ +import "@blocknote/core/style.css"; +import Editor from "./Editor"; +import styles from "./TextArea.module.css"; + +export default function EditorWithTextArea() { + return ( + <> + +