From d52c0f097ae3a91853b22d357fdaf3babec42964 Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Fri, 29 May 2026 17:38:15 +0200 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20react-prosemirror=20?= =?UTF-8?q?comparison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- features/article/components/Markdown.tsx | 34 +- features/twBlog/TwBlog.tsx | 2 + package-lock.json | 497 ++++++++++++++++++ package.json | 1 + pages/blog/react-prosemirror.tsx | 262 +++++++++ ...v4-snv-v5-snv-cold-load-JSHeapUsedSize.png | Bin 0 -> 63793 bytes ...-v4-snv-v5-snv-cold-load-timeToVisible.png | Bin 0 -> 61974 bytes .../combined-v3-v4-v5-JSHeapUsedSize.png | Bin 0 -> 85008 bytes .../combined-v3-v4-v5-ScriptDuration.png | Bin 0 -> 43339 bytes .../blog/react-prosemirror/keystroke-ramp.png | Bin 0 -> 100729 bytes .../node-count-vs-time-v3-v4-v5.png | Bin 0 -> 49179 bytes .../node-count-vs-time-v4-v5.png | Bin 0 -> 49579 bytes 12 files changed, 792 insertions(+), 4 deletions(-) create mode 100644 pages/blog/react-prosemirror.tsx create mode 100644 public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-JSHeapUsedSize.png create mode 100644 public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-timeToVisible.png create mode 100644 public/blog/react-prosemirror/combined-v3-v4-v5-JSHeapUsedSize.png create mode 100644 public/blog/react-prosemirror/combined-v3-v4-v5-ScriptDuration.png create mode 100644 public/blog/react-prosemirror/keystroke-ramp.png create mode 100644 public/blog/react-prosemirror/node-count-vs-time-v3-v4-v5.png create mode 100644 public/blog/react-prosemirror/node-count-vs-time-v4-v5.png diff --git a/features/article/components/Markdown.tsx b/features/article/components/Markdown.tsx index 9797ebd..e07067a 100644 --- a/features/article/components/Markdown.tsx +++ b/features/article/components/Markdown.tsx @@ -1,5 +1,6 @@ import React, { FunctionComponent } from "react"; import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; import CodeHighlight from "./CodeHighlight"; @@ -15,6 +16,7 @@ const Markdown: FunctionComponent = (props: MarkDownProps) => { return ( @@ -75,9 +77,9 @@ const Markdown: FunctionComponent = (props: MarkDownProps) => { {props.children} ), - hr: ( ) => ( -
- ), + hr: () => ( +
+ ), strong: ({ ...props }) => ( {props.children} @@ -88,6 +90,29 @@ const Markdown: FunctionComponent = (props: MarkDownProps) => { {props.children} ), + table: ({ ...props }) => ( + + {props.children} +
+ ), + thead: ({ ...props }) => ( + + {props.children} + + ), + th: ({ ...props }) => ( + + {props.children} + + ), + td: ({ ...props }) => ( + + {props.children} + + ), }} > {source} @@ -95,4 +120,5 @@ const Markdown: FunctionComponent = (props: MarkDownProps) => { ); }; -export default Markdown; \ No newline at end of file +export default Markdown; + diff --git a/features/twBlog/TwBlog.tsx b/features/twBlog/TwBlog.tsx index 8fd7028..9f6bcb7 100644 --- a/features/twBlog/TwBlog.tsx +++ b/features/twBlog/TwBlog.tsx @@ -23,6 +23,7 @@ import { articlePMMetadata } from "../../pages/blog/prosemirror"; import PostCard from "./PostCard"; import TabComponent from "./TabComponent"; +import { articleReactProsemirrorMetadata } from "../../pages/blog/react-prosemirror"; const TwBlog: FunctionComponent = () => { const [tab, setTab] = useState<"article" | "tech">("tech"); @@ -49,6 +50,7 @@ const TwBlog: FunctionComponent = () => { )} {tab === "tech" && ( <> + diff --git a/package-lock.json b/package-lock.json index 76bdaea..9c3a9ed 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,6 +61,7 @@ "react-responsive": "^9.0.2", "react-syntax-highlighter": "^15.5.0", "react-youtube": "^10.1.0", + "remark-gfm": "^4.0.1", "styled-components": "^5.3.6", "y-prosemirror": "^1.2.1", "y-protocols": "^1.0.5", @@ -10488,6 +10489,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -10496,6 +10507,34 @@ "css-mediaquery": "^0.1.2" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mdast-util-from-markdown": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", @@ -10519,6 +10558,107 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", @@ -10887,6 +11027,127 @@ "micromark-util-types": "^2.0.0" } }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-factory-destination": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", @@ -17900,6 +18161,24 @@ "jsesc": "bin/jsesc" } }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -17939,6 +18218,21 @@ "@types/unist": "*" } }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -27868,6 +28162,11 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, + "markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" + }, "matchmediaquery": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/matchmediaquery/-/matchmediaquery-0.3.1.tgz", @@ -27876,6 +28175,24 @@ "css-mediaquery": "^0.1.2" } }, + "mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "requires": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==" + } + } + }, "mdast-util-from-markdown": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", @@ -27895,6 +28212,77 @@ "unist-util-stringify-position": "^4.0.0" } }, + "mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "requires": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, + "mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "requires": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + } + }, + "mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + } + }, + "mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, + "mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, + "mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "requires": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + } + }, "mdast-util-mdx-expression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", @@ -28180,6 +28568,92 @@ "micromark-util-types": "^2.0.0" } }, + "micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "requires": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "requires": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "requires": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "requires": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "requires": { + "micromark-util-types": "^2.0.0" + } + }, + "micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "requires": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "micromark-factory-destination": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", @@ -33208,6 +33682,19 @@ } } }, + "remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + } + }, "remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", @@ -33241,6 +33728,16 @@ } } }, + "remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "requires": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", diff --git a/package.json b/package.json index 66c8e36..7989b55 100644 --- a/package.json +++ b/package.json @@ -114,6 +114,7 @@ "react-responsive": "^9.0.2", "react-syntax-highlighter": "^15.5.0", "react-youtube": "^10.1.0", + "remark-gfm": "^4.0.1", "styled-components": "^5.3.6", "y-prosemirror": "^1.2.1", "y-protocols": "^1.0.5", diff --git a/pages/blog/react-prosemirror.tsx b/pages/blog/react-prosemirror.tsx new file mode 100644 index 0000000..ff91eac --- /dev/null +++ b/pages/blog/react-prosemirror.tsx @@ -0,0 +1,262 @@ +import React, { useState } from "react"; + +import ArticleWrapper from "../../features/article/components/ArticleWrapper"; +import { ArticleIntro } from "../../features/article/types"; +import Markdown from "../../features/article/components/Markdown"; +import ArticleShareOgTags from "../../features/article/components/ArticleShareOgTags"; +import ArticleHeader from "../../features/article/components/ArticleHeader"; +import { LightBox } from "../../features/twBlog/LightBox"; + +export const articleReactProsemirrorMetadata: ArticleIntro = { + title: + "React-Prosemirror vs Vanilla ProseMirror vs TipTap3 performance comparison", + author: "Viktor and matejcsok", + authorLink: null, + introText: /* language=md */ `Can TipTap3 or React-Prosemirror beat vanilla ProseMirror?`, + postId: "react-prosemirror", + timestamp: 1780066915415, + imgSrc: + "https://discuss.prosemirror.net/uploads/secondsite/original/1X/5005ab45edc1c7b72d1331d43feb55a5cad7b74c.png", + url: "https://emergence-engineering.com/blog/react-prosemirror", + tags: [ + "ProseMirror", + "Plugin Development", + "Comparison", + "React-Prosemirror", + "TipTap3", + ], +}; + +const MD0 = /* language=md */ ` +# React-Prosemirror vs Vanilla Prosemirror vs TipTap3 performance comparison + +## TL;DR +React-Prosemirror makes development much easier if working with ProseMirror and React. Can use all the same plugins and features. And if using nodeviews it is much easier, we can access react context, hooks and state. But it comes with a cost. As we add more and more nodes to the document it has to pay the react reconciler tax. Vanilla ProseMirror is the fastest, but it needs the most amount of work for a full featured editor. TipTap3 is kind of a full featured editor from day 1 and performance wise almost identical to vanilla ProseMirror until we start adding nodeviews, we can use react context hooks state with \`ReactNodeViewRenderer\` to make it easier to develop, but it uses react Portals which adds tax. React-Proseirror performance becomes noticable at 5k nodes. TipTap3 performance becomes noticable around 2.5k-5k nodes with nodeviews. + +## Introduction + +Vanilla Prosemirror is the standard technology for rich text editing in the browser. It is a powerful and flexible library that provides a wide range of features and customization options. It comes with some basic plugins, but requires some work to make it a full featured online editor. On the other hand it has a huge community and there are a lot of free plugins made by other developers you can use to customize your editor. + +TipTap3 is an abstraction layer built on top of Prosemirror, which provides a lot of pre-built plugins to start with. Much easier to plug and play with the official plugins. It is also fully customizable, but the abstraction layer makes it harder to customize. It has a solution for easier custom node views using [ReactNodeviewRenderer](https://tiptap.dev/docs/editor/extensions/custom-extensions/node-views/react) which makes it possible to use React components as node views, and accessing state and context. But we will see that it comes with a cost. + +React-Prosemirror moved the rendering out of the editor view and into React. This makes it much easier to use ProseMirror with React: you can use plain React components for custom node views, share normal React context and hooks, and let the editor UI live in the same component tree as the rest of your app. You still get ProseMirror’s document model, transactions, plugins, and selection handling, but without fighting a separate DOM-rendering lifecycle. +[_This library provides an alternate implementation of ProseMirror's EditorView. It uses React as the rendering engine, rather than ProseMirror's home-brewed DOM update system. This allows us to provide a more comfortable integration with ProseMirror's powerful data model, transformations, and event management systems._](https://github.com/handlewithcarecollective/react-prosemirror#the-solution) + +## Test Cases + +### Test Case 1: Engine throughput and the cost of holding state as the document grows + +#### What the test does: +From an empty editor, in a single browser session, append paragraphs to the end of the document as fast as the engine allows. After every 200 appends, record a checkpoint (nodes, elapsedMs) and yield one animation frame so the browser can paint and the test harness can read CDP metrics. Every 2 seconds, an outer monitor polls Chrome's \`Performance.getMetrics\` and records the cumulative cost across six counters: ScriptDuration, TaskDuration, JSHeapUsedSize, Nodes (DOM), LayoutCount, RecalcStyleCount. + +How each "keystroke" is fired. Inside \`page.evaluate\`, for each cycle we dispatch synthetic \`InputEvent("beforeinput", {inputType: "insertText", data})\` events for the characters in "typing ", followed by a synthetic \`KeyboardEvent("keydown", {key: "Enter"})\`. Each editor's input plugin handles them as it would a real keystroke. No real OS-level input pipeline, no IME, no focus management — just the editor's reaction to the event. + +- We keep going until a single 200-node batch exceeds 5s here, ≈40 nodes/sec — well past usable, or heap > 3.5 GB, or the renderer crashes, or a 50,000-node safety cap. +- We don't measure per keystroke latency. +- We always append at the end of the document. +- Synthetic events, we don't try to replicate a human typing experience, only pure engine throughput. +`; + +const MD1 = ` +#### Conclusions: +- React-Prosemirror pays a per transaction reconciler tax that scales with the document size. for every new paragraph react need to walk a growing tree, even when nothing has changed in the existing paragraphs +- Vanilla ProseMirror and TipTap3 let the \`EditorView\` to handle DOM updates directly, the cost is proportional to "what has changed" , not to document size. +- Memory usage scales with document size for Vanilla ProseMirror and TipTap3, but not for React-Prosemirror. For React-Prosemirror every paragraph in the document also exists as a React fibre - a JS object holding props, hooks, refs, parent/sibling pointers, and an alternate fibre for the next render. + +#### Disclosure: +We needed to patch a memory leak in the official React-Prosemirror implementation, without it the memory usage skyrocketed, and the stress test ended pretty quick. +`; + +const MD2 = ` +### Test Case 2: Cold load + +#### What the test does: +- We render the 3 editors with 500, 1000, 2500, 5000, 10k, 20k 50k nodes in the document and we measure time to React tree mount, ProseMirror view init, and rendering N paragraphs into the DOM. + +`; + +const MD3 = /* language=md */ ` +#### Conclusions: +- Mount cost scales with how many React fibres your engine creates, not how many DOM nodes the browser holds. Vanilla ProseMirror has zero React fibres for nodes so it has a flat curve. The two React-rendered engines each pay a per-paragraph reconciler cost at mount; Tiptap's ReactNodeViewRenderer adds another layer on top, which is why it ends up worst. +`; + +const MD4 = ` +### Test Case 3: Keystroke latency (lag breakpoint) + +#### What the test does: +- Find the document size where typing feels laggy +- Increment doc size by 1k paragraphs with nodeview in each line +- Fire 150 real Chromium keystrokes via \`page.keyboard.press("a")\` +- Stop when p95 INP > 100 ms for two consecutive iterations. +`; + +const MD5 = ` +#### Conclusions: + - Vanilla ProseMirror's typing stays smooth ~5× longer than Tiptap with the same nodeview. Same per-paragraph React component, same paragraph schema, same keystrokes - the only thing different is what owns the editor surface. Vanilla ProseMirror applies the mutation directly to the DOM and updates the affected fibre; Tiptap's ReactNodeViewRenderer adds portal-bridge synchronization on top, which dominates per-keystroke cost at scale. + - A memoized React nodeview is not free at scale. Even with React.memo, the reconciler still has to visit each fibre on every keystroke to ask "should I render?" - it can skip the render phase, not the walk. At 30k+ fibres, that walk alone exceeds the 100 ms budget. +`; + +const MD6 = /* language=md */ ` +### Some reference: +| Document | Paragraphs (≈) | +|---|---| +| Typical blog post | 30–80 | +| Long-read article (Wired feature, NYT Magazine) | 100–250 | +| Wikipedia article ("World War II") | ~500 | +| Master's thesis | 1,000–2,000 | +| The Great Gatsby | ~700 | +| Harry Potter and the Sorcerer's Stone | ~2,500 | +| Moby Dick | ~3,000 | +| The Lord of the Rings (entire trilogy) | ~6,500 | +| War and Peace | ~8,000–10,000 | +| All 7 Harry Potter books combined | ~14,500 | +| The complete works of Shakespeare | ~25,000 | +`; + +const stress1 = [ + { + src: "/blog/react-prosemirror/combined-v3-v4-v5-JSHeapUsedSize.png", + title: "JSHeapUsedSize", + }, + { + src: "/blog/react-prosemirror/combined-v3-v4-v5-ScriptDuration.png", + title: "script duration", + }, +]; + +const stress2 = [ + { + src: "/blog/react-prosemirror/node-count-vs-time-v3-v4-v5.png", + title: "React-Prosemirror's layout count", + }, + { + src: "/blog/react-prosemirror/node-count-vs-time-v4-v5.png", + title: "React-Prosemirror's js heap used size", + }, +]; + +const coldLoad = [ + { + src: "/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-JSHeapUsedSize.png", + title: "Cold load JSHeapUsedSize", + }, + { + src: "/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-timeToVisible.png", + title: "Cold load time to visible", + }, +]; + +const inputLatency = [ + { + src: "/blog/react-prosemirror/keystroke-ramp.png", + title: "Keystroke latency", + }, +]; + +const Article = () => { + const [isOpen, setIsOpen] = useState(false); + const [activeGraph, setActiveGraph] = useState(null); + + const handleToggleImage = (src: string) => { + if (isOpen && activeGraph === src) { + setIsOpen(false); + setActiveGraph(null); + } else { + setActiveGraph(src); + setIsOpen(true); + } + }; + + return ( + + + + + +
+ {stress1.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ +
+ {stress2.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ + + + +
+ {coldLoad.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ + + + +
+ {inputLatency.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ + + +
+ ); +}; + +export default Article; diff --git a/public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-JSHeapUsedSize.png b/public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-JSHeapUsedSize.png new file mode 100644 index 0000000000000000000000000000000000000000..dbc019d4bafadc3801404d68e7a8931e8cd7c193 GIT binary patch literal 63793 zcmd43byQc~x;Bj6VoPHoN=hniq9T$CNJ}@;4I+v~C?O&sC<4;bEh+*6(j_2LBHi8Z zHTOB^J!5?Teq(&&8++{i><97pTWhX4@B6BIJ(ZEVx@$Ylb_xoLUDvN&mZPB9_=$pI zz0%gr_=)8|MjHHMv(}BPmnqiBe$kb{Ufh1v zU#j&4kDpylbI*3qK7fFu(b{Z|{dmB8J6K<7MZj_eWw5ZL;QflaNn1G|NHAfyxTOl{m_ED)}yQa2@0&0 zm6a498;w-e)J9g#xPwozvqxoS9y)vW?E3ZVw{G2fF2*KwWbE*zC2oOp=Q_K)>kNaV zqfd5r2ecUQYVp#nyJux}DN63N8&9xgKwzM(ipul&c;leH?^-D}b#?3SKYzYs_wL<= zYF%#3CVg|(eT4c@UT~859d@`x{%G4P)7f<%f`m66iG=*9~<2goVqq`+GLQS{O#Mf{+6`9 zVh*1@7ni%Pk!9jY#rOQH4yQc7wz{&g)UlSdY+C9=Z}K}^cA&p)da&_%n|WcFsLLXS zsr!BAxAyDryKmSs`PW~%mA#|2HO?ebI$TtEX*jL0b=6wY)RetiY)zP==rLtq*JH-f z^q>CHqECypj-EL2@X?OLtI@q}nWnTu&BL;*vFMs&(;geSJ_K1;1?S$R^F^D&9_{JYTGDRk-+S>%$4hpV%ukLpMsMD{xp(j0kt0XWmtACGVbLn{ zW5U;J{FPfxF=@;64rEoV`}OPBK zk)eS>XJ5G6=FY+R*wd^HSv>t2Oe5}lZcFrK-0EN3#@?J-?~*UCALHS z=6`nHPfq5n7M|Mq`SWM|B-5bu1+%<#67$i(4liA0r1kd*i^2qps^m z^#aGPo}LZql?SayGMfFc)r+;h8fB=DXG)&jzce?-EF=_yU5j(~`pn(+FJHd2t;k4E ze-Rogsjki-7`9tqUmrXD$@AyOPn_6zA9uc+UT|Z&Zs2f7VfgRgstrbbva+(0q38B8 zGso;;Np3Xi?XQje5ECP>q2U`DdHn9(yI!udW z*45KHdHwozUVi?43=CBPr{#0i-Ub95pupjJpq!|O(@nm0WTf(MnSWsKvuDo&bYmog z9|Q#*E-o&{m&@L{L!M=GbC7JLIF~_91dmz0R?5BUepzmA?f_$EVc}4Vo)VikMTuBm z5vN%hW#wneiP5MrOkt!$+x0nI<+-@7}rB)YOjq`iS+<$~u$NlXC6awIgC;j2X(6onJk2x}UL1IkhtgT0g-<_^HQJ;54T<`M0e6-Vl#~ zMfb)nlnfu@;J|vx8H{kC(6sqx9;3|;^axsk+v*(Ik^XDQ@DW>92~m?C5oF8RZgEe zC6k$=U(HZgS2tfDzWN>8t)G)4p`lgh9^XdOYHVx_`!gh=rba(jxF)Krt7|(p)}9wsxZKN0 zHUUMVLIqmVP4t?YL)UmhDnCR;rI@zyGq^2VY~D$A{>qh2Dp_WmjxaMn{`T#nZrH%U z038+xt*iUNNu9N7x7A4N{dH@Yx3>-_Rm^;2J8#i}x%YGLgxXH(NeOSZ+C zp{v)fZAER4M(3?qv9z#|U9W_jUG5WG6EJSc^9v3A`RpL;nUG4`(o;-Kk5EBUHNUR6 zw6Y3JZSir(GpVQ;N?(`o;K6#*xbhZ$;j4b7Xm6>HzS*-ll)R<&B-dJ}2j#G!Tc&od zRi6|(TZ+_$$XR}~-#JbGUHPDx-Fa&hftWMnkU9XPq0LHGx5>XULJ;1PflPR{r5mvLyT!dItb z>doxXWatDeKh%F7`IX|aFxAJpWQ$`Zx-`s_=VGX_X5vnXXSy_2*kO3e3SA+q!&N9q z!&RV$|IUgZ(+$ClEoznFIvL6fXmP)?%){H4P$hAZQ(rbvp7NivOJD_HInKni>3Okb ztG1@Rf`V;HCJX8pzN)9Y`vK}ZV90>=aKy;6s?$iuZ|nM-68tCAH>Hs_q^%vfFI`$f zqWd}LXPI(+6=_t@Jlm1(g}(68va)UdW#4fP=PbG(%0+v5?Ua*~3z#ESMpN_1RUf*e z?CjnbJT|`!4Ncg%m02qE+RdB0%nMgC>;73MR7;C4oN!s1jY>~XS1JA0($X?Ym86p8 z^Yf=;7ak>0`#aN*+S-@FJo=NBXFD`Al*y?@Z^b=7bzNE9 zOHW_f8>I0^_sGXjpI#hRw|}S7b|*z^6OQBj(h`qx6PvTM^Di70l)MDh96x}g5$)=?A_lxPWW!ktSKYR; z$=H{l+vQ1{jsJd3Oe9b1LS*eH+Y#lrj)SL-jEw^+YJR*t9?WaF@1+0J#&|_}S=q1p z;VvaRIP>pIM0Hni7NQ7jVrFL6s|vk-`SQbkuZ^p}esxzd%X!3ExV$gEu^iWT?p`N_ zl$6x;K>g#pMV>an7i#|C&P@&nNJvUvj;y6Pb-}&0RT;Z7%`C9sIQ~xD?RXs2>5;ae zs|*es(Ts7y-*LnRQ0YXrseRvjBu_U}W^I ztt|v4r3ZZ&K(_4156vRaT{{^?L!Ug^s*tRH^TLI7Mj3BH%yOT8{CH~n_U-dyZfiFz zEVzJVcTtMYYX-GptKUU$r+E125tnw!PC7ce`GJ`5VZo`sV@ym}wyAs5@I5;%AB~Ro zX2vIIWEZ?m|^@|(w|v6Rkz|0s#cPY`nsR5xjc-M zLBU=f0-6=!rP;M@+cr`+!e&9@xO9H((Vd^e{`jQCwv+12{l|>1REmm|uN&A++eSO;8!TpW#hk*m_ot&oXrNv|w6(6Ui z@sNkKckkW<2M?y$PiPUWJ3EqAp)+XD2I$z5XU7Q^XVRVGKTjV& z-U31ulaSyAXiNI_u3aOkp~1ny65}lB+vF}57ac#Z%&J%m(ucdP3gAR=16epvmNE05 zJ=-%jRy~r{K|n0}1T!CBAXb-vL2(~C2dTc+==Age93IP|#4I^Q#ZpSK<@>b;1i(nX z;eCqxevNYGI^VU0;@{8UOJF>JL?3UlpqqmfV7EySj_G=dQ2i%28V)L|y8HT4imgoh z*DV0H(TTZ+_LTajIZWv>;6r$J7YPue(rdOtZ}*!ZSNBY>7YPY$K%qcrza57Xy%`xmWaIKQyaH8?0CFTa1Y$GiH)n42Lbuer4EXEL8Vc=)iqjLaA8m@1+BjiSfV zEy$s-jaTGkaO^*7Eg0q({POkdCto$cfEz81=1EhpPNGK#&vm$IoPHh>5;7SOOZF}* z={i$s4>nfTv94{!kH$O1vKw~R6CnLm3ll`?Y6WO@7}#Dmw7wu>tt?d z__eh3YMC6x`1JHJuTFXaiaX04x-|W2z4`I3^KJe;Cekac*jt1$-l7t76~?aKRb#uF zq0A1%bGxb0b&3BmC1Z(E#(TL~`|+<^04mqF4*pH67JXi(BWOx3t&hTczD?C~?vE3v zkxko_@n}vT!z;Es57d+U#=D9nG;Je2R-#R)N z4R(AGp8IX3UrAvUK67^m|1PRC6aWH)gM;TBr%!2@cy$3Z^jix?uz%Tfsx%@l?iqFn z_`x>@+iY1s(L}&6~qOhUj4|MR|a@_&+|Wg?eeh$%U(} zNuilfN7|ahAzjEQDP5D3+vhYp-1WvdNw&%zJ;QwqgUp}=xLP&(l0akNKz$5rvmQYA zl`B`!o4^>qqr7d~x%2Pp(%6drkXlYkFeoA+{acw%rBb$2nM>8Mubc{rtk07_FK&--#F`8FiY|WiTWJVOHRgT8u|dhl z$LD)V2~P1135o5HctQnjB(~LsajFF0VhP;W|1eXkf2vw6Ilrp9TG3O%MtBY4fyAr~ zfKSjmHkHS<)z#A5uKmi~zi;0~3yTSXp!P#2yq-Nvjqlm8W%uPo1??22fSKJiyicGC z)z#MrE;#Vg+>BXt9BepE0S+73dGJ0;;@7WV^<4x%CTj0KbteG57|qdk_}5q53hJoD zY+!P7vfpVQ!@3g+NvhW`UD~j=I#(zg-$;l#klKgq{(`%vQo-wwv#>k^fCQnqlW)%j z5;8s35snXIGPo<$jPsH|U3a6ruWd`O$sG@V4cCPzHSq}cicgRc{L4PwB+Gyb|ehKV{d(02D z5t#UHd#=qb1qC2w%hs+h6aYMFw8sYi{{5~Sq$VyUwVSZg)Kouga*l9iqqeNiE=#TS z%{=W1_pGgTfOT!ha0E}!v>XaO&B8Khn`bI?2tOd0p*i#BQqEYb#+H~J{a@D_lhFuT zD&zU|eo{rPc&_D{(bLn9m~H*_PhL_&LNIyuOY~J=23sq|mU8nHB?D7aks*(>zkmO( zG0L#L6o=iuy!anwxbPj*jaM)H{Ym%Y{5*f`e2~==$~w!Xm)$)*6H`;#%kvXnjAC!m zMOSB%-QLw2;1fXeTW@|D9v%I2nyUWx<0u!;2l4Uo?SBU|7wk;dy+tFK0vNoDXKxZ# z=FgmFH>S>X=|iNC|7xpX69^JWWS)<$VlV|eJG(?oOH;5+>@7k^KSW1cLJjd@6!TF} zX2!Nf_XD*?b9tL;Zj_N*|DitfdW{-1XhEG!N&otSs)`Eve>TsaKQC%-Ruo_s43jF8 zicL-y(=Lts`0p2TG7j9Nvd#J7!-uEb zcc|!9EPUE@0swRP!Fl?OWO;h#A@j9G>lUuesoKVewe;0j?OHM$Ey7p=w_m+_6|gOE zWb{u#2!u+l4CRT*$z$LnvGOsg+NHbme2kW?8f5KG#+oO)(9`i59T2h|{-Sw?Xf(aT zB_$;+?q2AuwSXCZettiys-oY&zZhI(GWMrHcx`z~ZS$7fEC+qXR?nfGDI|q?dT!?C z;VJw1^ThGv9$OgfJH48H*j0WO7e~qONm_BuG8Z$kvbM3w7i5T^ogqZaY>9z^K|)BM zJJ_|>>RxUp?p5;))yLS_E(pa}V(Pp8{=JM+51Be9I=Y18N0WN#^$B!jMz`gZeFrFa z?PB8P4FDq7eQ!bAmQlxb&oTO^D6|ZzX4Q)q*LS!sCCY`P2NmNHSE9~BgFTn5UEA1k zpC@z2NXzVi3FVYQ$02Jv4pY{imegUv&A(fRetFtvE%RquStQxq+k8f0r0(qLi(A>hG@9MBJ1_6|W{-7g zEnXfT9^A=(#aefNyf`YnJYH1pJL|KbJxftp+34`=6kVF^?Cj2gfv1f|w@+SaHsFO~ z*J`6=Wo0E4cssdSUPa{w2rPjCHM1Mz@CYrTFJhn73|K>xLM;RYqD5y6Ron98(35)> z7AX~VH3q!4mo5wHiK9LCh5{V4ik!yodk%Eis+(aG1&sjc@C6|AEtZ2o2+}cZ0TB^L zCMPGWlxLIZglr|ZIsUe7GgWoy4Lq-+*ATp3Nk8OBflFs+L#%xHCuXpSQbsqgVy&)c ztV#XW%TU{f)!VF{m32zzAV?Y*7|5)*1^)xa<#{z>joL{NwY4Z9QQ#NV^XDnhhoBfS zKo6Ca+zIv+!F}DabX%v#g9ks#%ijZtz>n$8H8nLIQ4nYoyPoPYo(W+QbXHzoz9`eQ zEkH79wrI2ME9F=+;aWgF4sob{)Vbk0Re3f>O~3SuI4*Qw{u>_s-GJ9yI_D>P!qzK+ zO*J$&o|d*vR~y5@5*?Wp+&uYHFHJ7|@h;kuOOzrX*tDJex(0l%EP3&_rHqe{_czsV zsy=z-2sCs*DQZictn!CLfXIb){~&6}$jfU7b?LJDCl(km?lfjJFcZ5q7o=Cgy~O16 z6q?_tP*&S6;`BW+Ri`gduZFHu@$&dpr2@x{NjsG<%qLHZ=N!)m%Llnbh2I3MFx-~q zi`u!tlzK0H_^W0$w9xMr6*~-^-UN+2cDsIk8)w1vzNx-yf>vKwqJ(}<)P5Bb5-*&X z7*Fv7Bs6gMWn0_Kx&?HXi&1hAbORS|?A*LzEPrY@q!fjdGHa6+oPjnig5wSj4s7cA zuZy1__74yDm56$;n5-_b=NkT!Tx>w^(9lrJXO}#`O@1$4d|6(Yasb)`pFbuntV%7O zYFK}gNmG;dL9@D~q*vWK)hsi5A-mCARb{IyON6J@9186p95BL0a0U#QC}~B5?r+aK zi#seYY-&=_z1W$XE9knq&{zMefOW*<=!nqYOo1nYsf{Uhb#g4MtkQXZ(6n`1$bOEj zebQ*83jt6^SNCOD*i9LkJuqy_WwIb1vV=7}d$wIy&RON(b;b9Qk?xu2E6W2}1BXA( z3^j+($%NHLUfp17^&8FyBhJN*8_&6qW-2HCOReB2!v3PB$DSx()zj0nE#H&AE0UMS zJ3%>PJHD|@ryGY+xM!R#WVS_MM5twCD2e_4(AZe=Pa*vjCHtk3EC7rY?!B2nCX>`{ ztJX}QSXj&{sFa{ykY&&h>PEYEWZw0vIYiZ(V-+K}Mp!&qOwbMkL&Li@5f>zC44`gE zJpP=W{d&`mLucGpopm{w+a?5|eE}$Z2bXCc8hLwUtLX(Qm5@*79imJ!wG9p5>!NN1 zi@AwvI8Quk7tD)e)u;K^6u66)|CALqB&yTBKF^-5UmeQ@4w7$u9vvNBucu)X7CSa*{q#qflMo5O_45h~t6z zLT!t8CQAypZhiPoVQ6BaGt!!&qpwd4BY=3dkTj!47Hl&}B@p~hx0GetWK^G%gg*lp zEjKq;%DvC3aaFmTAV}Fak|)7uH9M-dAALAKbA2t)ZR+(DMvk+#QZ`bUqtKYX~c z*L-wzl<3_COR~a{+g4%CYMr6NiPw#>iET6*&7Z28Vo>e{t^)s9m@8bnX=}?*BuCg& z=aZYYGn5CKlNl!_sKw!O>G4|Q9e3cq~i z%3V;!vJcwY+7r{$I%rD7LL)G!h*Ip6MUOaeMS!Jb2>(s$-FSDYF?3h}yK-yTUg zhzJW0&$6C5^MdGgx8oH~OY05|hW>mjl2>t;3BHkS@KJKQPO@h%v~{eO5DN@0+LqmP zozRT+fiG=!3nxlw^PJ1+(kp|todlZz{GU8~HW;u_=NfJ@CDHru-z4N+%L?|aGrHvg zQbW78Zq(%+k`k z|G+y_hE!OZ{%_w(K_dpzy#RF2OEWP(eonh|$vWxtq7iAK2E4@9C|^k1wGPYY=~uRw zn)*6O3+~}VLc-2KiAG%!UmqX6{+f5>Lq=ioyT69kK!Vutf#B?5trNq*8tXtWdZ6B7@QKm3sg3?h!F*0rLa zvwSV0HOqF#HPk^@ob0VwfGrP-s-~Arl<2>I|3)+#p^Ym-s`!wTb4MT(#Fau5PrXn{ zEjB*BC#UaiQDx=L*my7y$bj?)A<3uVgo2jBr6#Hyv-I2a9i6n^CG}0l1|fyzwY7WE z|8c4bY0SvTC|8vpce`YhoZY=0n^nMh{uB4pTm&9~#r1zWnpU^81cNsa)B>V?3C#oH z38+cSUL&(DKE;pTaO-Y|?Gh^N;0L+OFT=RGuA$*!i-|a7@H=)OTiA)-KzlFK(|L(; z1O^^>UK3hDKxUlX*dK|1-FVP}AxtA_nN@Ifo>(Rj^Ysm%u|0G!f<#(+epO;3{@8t2cMU`u5}a+3 zJ^?wN;dj^$f&1cM9c5#abdU)3hSJK)x&yKbgrfkdBvZL*^b1HVsG47^t9@CMvL8TJ zX0;04$sqh1IsDAGgkj3dy^c1 zuux|r5P%7jdfaFfh2}|ihD5}k)|1C}Z`;-dOovbeZXS0f`Bpd>{x=*0s;S{Qez)vr%?V=DWHIts-ge>XHW zy>B!MWVUGsytD250rUzn+Y7!u);8d%Ey=Aw@68w*M-xHoq;#AcP1LdX!WE>oNb2fF zO@9CWAGJxUsHiAVGSO$+v4H!+@{_&C$7g1Wzka>oa8bj>rC>6>9GjEqiFX{HDK9yy z18&0@g8888wlY($DuvQ6ao+Izlf6{l;?S=HhW@=$F_V4Ead_|EyJx#xoFD+eoW`RA zB~A~?Z*6O%^%nO4Bo`GGRkdrkvGu=6NzJ_xx;Q!sE)|gvSPU1SuHg?AgQhgxS2BR{ z<5h*Q)m2?)8i{mWp24H_eJfC7fZ#^cuLXC~^jheXU%c4EbWIuZGn7!Wv6A!sghsP3 zQMaOIisK>k@$q2?K#E>joasTkRH#z4w&umBX6NSaJAC-+jT<{4;^0Y>Lc?!Dg%**e zHv0!Fawb@^TmZ|G5zm@gHj*c&tQ@DK-0rrvf_p~ZMJB$HNE10$eJuU~bEECF$SvsV zGU5C1=Rh(!gK_cT*~p}vF{n9$PY<-sbX!}sEn-2tc=F_lOw!E)b!lKB=%djnt2ir; zv%}ZP5thtG3EOwzz;{^W!2(t%5fFicz5a|v_hn}nm(y%)-%a@UA2{$~<4)7fyJ$Y7 zw`DFmx7#%DrJ{O*Yyuo!Jb8HC?{$=IgbyK#@k!_q?h&%kc6XzR!&6o3k7VskMZ%BV(QTwp~Y%-e}DQjnCI$(t6c1@ z>7iy{U_G2XuyY;k(%&}CYN%IrNs+mk;jsaS4$q0Q zK%M*xw06nYXWS8WfJ=PO*7hIF?X;gB|FQT2XH52MAO$zyNJRd@LB|rIIezg-*=>hb zluf2A!;&HDimpt{M~v*9%shYHuGyHE1|$QI)z(<9eKct_8m#^T;R z&8koVi6i&m(k7@EKu0ak8~bd0HmLQ{H3Vrdc+&WLVKa8Qqlz;eBSe#kiYt@&!+EF3s_IyTlD;5=rDA-s)H+yJlZ=hmB zAzs(&>9i{MHJ)dI-KRK8^>FU{`T+R?;lxf8&q;e@RmQe-_~EDdxC8@3A;}(4bCjSkAgyjng9piATiV zC_57a4(tvH(iqmVuHZrbi2uZ2t;3hLTDbFnz6GVE;8$_~E5qcC9)nszpsnAF5lXYL z;B8uSU9WVgqL{-SA91mxRpRCi{EK*2`kTtbd0P=}IiFUwv(R_`pu!1PJPkJ;?uRn} zyZ(ruZn*J8GAH`WDT+9m6hs+G=LolH~VO49RIW> zCnTJJ|A-(}*qq>MGqO@B4^(_c4Od!R5wAdvf;_RJH6(05euNNgR6P9S48-N_J9ZeF zndyyper;E;hOh<5S8mM7$>~YS=!5FE*~7g(&u%|8by>s(k6}?o2qLgmJT~tF)tfxr zmb@dwY0iuo#Ynbhy~5vP2IixHZ&Fw&h9Znc{fj-Oe&81vGIaLroE$DRq`V%Og^~b7 zh}P-Gm?Fv5IXnzlqFv=yTJ^<%mk@9`O4UPCNSA3N-2@I3YDbOG$+gRuzi-M=Tib!; z6Hbop7&tGbzJ6avIvt1@{sm?4nM9+2+fPKm5KKgvtQ;EjY{;w1XlSFUsoW19Jm_!B z8oP43XyCsUYpK$I=o&;ONrswC7!-{1)q@iAL-j*5a5A{=etT%OYJ!*&49ULslP$xo z8P9RHAr)I)7~0!?k?^^~2qfqJAdHIjY{@cbe14cSIwND|EGM`Yw_e(UBBiNC+Ylt3rZ|y1tIiFB{M5=no&hn+d_!!nI76(3)%V z(o`qbwAZw+IfVN zsPeA0od-!_2ERdTNQ0IUF|yRD+7?t9a#mhVZCCoHi})?2?0ZKY3mC93fqIoPjBdwN zBLe0N?)D-)+^tKf{t+(qts-r}+qbTNOkb4gz#{So|4-Aaq|prqdVwN!4H+(y7Gq=c zg8T9eG9ya`p6@tBSOh}!vQ}|H#Fz$zuOHzKi*IUb+7Z_QV)fP1UH&kE2aIrqA2dxA zM!?=ivN#mEqFxOvt0{AJAMC`Q(b1%h$$&t}6=bN8$dyX7IbsGdyhb^dKjVJV5Yq*W znn&hg9_Yojb|z~MnJ1f}x$jpQT`m(taYegc9jAiETiihn`8WLdJ4~di#4qg)?JI&B zV8poZ@Mis+C-; z=B=I_1H0Ik`U>_PjtY#E0Pd{xbR>j9CJFCHJ{C#7TBD4H=H~r}4te_f?}txE0M2P& z<-`)?Z(tuHP6_~UK2d>4&Tya6ZULm?fc6|_N(R*+$sXR zc&gw}N{I^a>QhHSagbhsCvETGP+M1b5gW^~;4L@>s$UNH`f$0{k_tXvI%F@Fq!{EQ zuo-N)7Y2tAjkhOcxwgbo1@RClz`&mO?Ckz?Z$lZ4IWJzk;2Bk1>MbZJ!0Nnh*x3TqH>T=fxLrf1XMX9IyN|1jzH}2Y_;YY z8ChBP@Nh=pGxT^+i{U{vNN<*QsVOOY0e_HuY{@V_Ow8WN*K3@yNl7KdyitS~1n?^? z(#G)cB}4{!`T9FV$2rZ;UaXa}hlb`E!pTUYCMrBf3L6otb3#J<>F9nZjf|V6N4Lv$?SmiJGhM^T0KE`S@Ug1@^=tVlc*YAA2&tpa4r@JM-5q@T+D7 zo_Ym;K2k17BwIisvUXAfqsq?9V>N{pu;ZlvHmm{iLKAayrS%#O^bqZq5^gqG$hYiy#l~2V4T|$Z%mUaS zCM~I({L3Dq(jr4elnPk>sRp&j)Lj>JnVw`oHA8+$d(I;t&NPlbj`yikr!=AR;*7~F zDg78qE+q2jRYSwmuoi(2xS&*%2xO}6b8g`%sMpZzN%|0Bq#HpTQL(Yxa2TY*1dAhm zMaz-XKu|gY&o{ExpgH&xVsaZGY$7YaXU`rI6SDi`z|6(PMXnM&7Ua>`J%%;0i~WymLMlA1w4auQ2v4k#M8)#1-fk?aK^22IH-uY z{R}xv3ARK?-L8=|v0F&vs}B zQZqDUbcTc=k*`6bA5q_*0DVa8MImI{W|rrTjM@aqN)%c?OwpWI$-He~a0($t@#N+-SQ^;PMSwEatu`>~#sPi0 zM@N0o@o}((XBy;zy`h+!@1dp!?}@^mN0h>%l-}->^Md8cn{Pg-I*BchZy-8pF!z-^ zWI_fcnuu4Bem~g^DZF(W6^KYon}k?KK8O5>n0U$R1p#+i0RgqZ^)a}FrcYWGj-2r1 zkK@y$?I8#xkQgh|uSQu=2P_3q4gq8UYD&QM^K2y5R8`Mpg`9EwoozvP?%w%rk_b%p zjEuN6?JmwqzktJs_?49Di&}%>)LjUr^8>?>+M99VKe_A8E>P}u^z<;E;)>q_@qmbZ z5~)?}BO@at!CjA#RM7hNa2sa0POVFTK$>aN^6lo?_J@EhMj4g>&e2j~1SZFf;IdMz z2jqw~Yhy!>I7ysB8U=Pk3MzKrDRxdy{n6h!ka9?X9brg}9PKd5XiZ8pL;@HyWr1V% z0MI?YVp2F%7|B^4F?ZY0`TgmB5}AhGH4Zb996`v>B-{?`z~0djqC^q-D=0Nc8g@Q9 ztWMGDx&;o4MVo2X-7{47GmVN4FnYiPfr?|}w{e~#7dFLgr z(w;Rt!OJ_Herd6l@kX1sJM5ltl4!vw0QzqB%50kjL@%t>$unp6K%hmRL22v6gNQ&G z#4~z|LIea#ELpduwvKZMZm%si7miO(elyC@;tz2cPASdhyZzv+rc9OF&70nq1?|3dAVve^`t|U?;cjpROCp#dgCK3b!_adZs|GhD;a?F1;pMinTCsu!fQz6g76woE3LSd1!V*3gg{?TIFQHwZ| z{IOaRGe%Poud~ANAMWH%fg_)C;-UN4Tk0+|x3Rx|{QUVB#aRny)Qe8Quc6@G>uX{3hFEW8UJ&snb?1pI0DGr6IP?bU zqLBCY2jRkruiP&!{LWeiu4t)gRy!b74_xaZZcS~(r|sdeAwdB_bw6p5F!HGkLc;r> zGQT~7QB%@_aI%x~Mg=L*Jj%devqv)9&Oz@WK>)yV;@v_G05@B}91kS@-Dr8G2E3E# zi9D8nuSJYp{e^iDa-J)KI1v)^B)#Z9_^lNdO{%X%;VozadYSgzB7qwK&tfYB(iCvd zpMfHeBer_*ety32ABR5rJjSFxSaJ^#?IBTH6ydV6GPEJfqFrZe;7S3LkRUIz0U!%t z%}-#R!vn^mGWBraL2O}kt}$ze5lw0@8UuJFj0Lj=lCRO_W%5y3Vv;k}$IBG3Ew&1nV%u%?VOR8VzUu_=CEa&hXZ#1g%ej z86Yj>wQc{&7ePUfL0@8|!btKMAGLu}_&#J$zp%QAs-d+vXt_wHTr@FZL-~MW%ye%K z`BO}%B&1cv*a9Gtl$xy(>;)j&dU$X6KJ-W;Z~-4rz%&mdV`X0SLa$)`@F04FK8<=M zv8AJgpSK#(aM*xTB+?p8LGV%NH9Us$9FEhcNogQh=Ddn+1<6+fX`)*F#R+YHBafla zuu=vmFKm(CMc^kj+kIA+mdI9t-C-rmkP`}&l)aBKN2ZL=zz(OQrzi9Z1BZxF^dJH)wBka zCV2BtSiR%NN*a z)JB2GW8S)T0JH(5CI!Zi8GT0wkA{ZE;_S!`fI(;wzy5eOXK-~z^D z0y+fffs!$xR*exK5-9_Ij|TZR$m0k7e2A?~Fe2iHfVRG%y-2N*(SaY;)yzkZM94S& zdAgrD_vdC&T5!Lp&-4P850MOgKv*p)TEtQ&DQg2`6$XdDdl7^N1ig#F798M+#LBex zX%hnjO%&zt-@pILxPwki!qlJ@qVt^_kW9*6TV0Y4X>6cJh8W|IT*OjU$^=eBEt;yi zL^<)3r}|VRnMILub{3|1eu(`&^h$6hUr>-B;>?re>n=AH6lUbR6jPf&uPz$*(pg*2 zkKYB^yPvst9Wa-KO0H$EM6_h^H{2Swp)>k5=I}Oxf#NCIqi(uqYN{zK(~z#VmSWd8 zVS3wcb*;m%SLDxJ`&0jO77C?4`!C(ue9GNZM#BB#WMul85y=Wkp%LqaKx&5b+uohl z^>p8SO0v!Uyy1-CmS18`kbqKR|73hOsVx2xLr-o)jA=SjY$V@7JdDS9coWTNzth zO-{=BM^i9a&Pqc^ck9w64;07Sva;_mP@@2WfQ5}MpiD;&IXg0_xt>k(^m?{VI$X>k zrQ5s*2Aj%dHIA6&Pl&4_4YCMwmINYUh`fus%>_(;B_eZdfD*n~y|ye3p;8(b8q4K( z3WS6z=O8Vuaf1nDzebeJIBC~Oe_U$wN6uf6q}7@AA*JUIr&gS}-rL(dI6T~dMs=!; zPa**s+LQj**QTY{K7c-c%*|DXDaR{yA3MUjlCPPHnMeDe`|k|nAi{Qf=8_TG_xk{) zrKeI{UHvWQCvK~#uwKWF-Gbe)H^6z~xdv}$;e7Y=3~0oUJU!z+e7KBb-Hdt2fbj5S zOx>x5g@u8_*8mWDN!Q;z=?|?H(@Rn4e8(l9`S{E_O8%}d^i;{Uj#aE}Lj#P8iK!T{ z9>gjjgQ_W{mtkV5TW~AOa1uyt1;9 z%spIreke8~LbD+@1_HctmRT4%Q|O(BIL!LO0;1OaFUa&{x;Z>Y@wJ_J=sLm*yB}XV z^t{-9m0s9hX2XUJi^ZI-cb8W{X=tdZYJl~?fVjc+Z$Nr}S=9BSe&E)XE00i*%<^TS zi_PZPXE~jCRHnndN(o$>fq`A^H|lWaN$3*sJ2XH;AeWMDI@k@!aWIwHTalO{?b29( zzYOL}_vR)jrD!#r^#d#NuODcDD(Te2{kZ5I>V52|Pcn=y(=YM*h=z`iWIT@B7|sw7 zxC39Czm*&FG&_!cVd3Ct8grc!YBAvl*O5e}Mir?;dybi&wuVzrbD^LOUC20JmJLr2 z!HJ8PE@il`II_c6MWK~(b^Yw<=%|yT2o7N&u z=K*~#1A!=ZC_)Ik0L7@9Nl^EYL4LQ7FE{funK&vQPYyaO0bRD=S%n^AO_@6G7@ z=Nxs=EKcO8TOk}g{cQ*5HOog`NNbXdyCowNfe^{Z^z>U84Q#Y4TvAKU1bi3*m@gU1 zsMM3cb0-++g=~YKJ|My&H2pz5X#5yEkEP7!=LDOUNLY?<7g~^dpE#6^c&Pl|Rxi*G zm0@Dl132Xym9-<2K^`pT$0MOi_V)D+wHhb$i5DRG)<$*b>~iR^x!Y0*0Ia~E@#DXP zQ#{_EX(};j?bWAp_wGAT@EloVZr83I8sw`nXB!WyTi$h#sx$$q3YxVZ=*u-YtG8rj zxs3W5FrAz1+{=pi;|o_L_J*7~mfk8ResOnSr|td-vkg$&%Lc4jPM!K;UzL-?SOKN3 zCxuQlOvR7XL3$C#TV%)#Bnf(KflpRZPIWQSVtTme3?geEdV13MxO_xFDTfv(|LGa-|ywiyZN(D42q;! zL5QI0Yd);uoZ<@BW~8b4g=(Nr0Ra*OsU-Zk%74448Y19kY#dK$2Ud9ij{sUgCce)G zbv!OPx%!v1gF}wwN&gg6Ma7^5g?O`^-a~kMMO^Cuu zUDEOV*|UcF`pCx&j@MWflNunR;q-q1vQqUM@?IQoy@ZM{?y@xt?u+c>f4;LPD_w#) zS%ZNy+7Ty*piu{!HUoS=gj3Ymv9{7tVZ!f}D9i_S66dQQ%I9%Wk?G$0@2_9Ku3vTK zZ_7n#jYDK_Wn~4$@64a^+@V|9IWaGq8XL(fE<&M*N3huEqY4oiO@Zse7aL-3sj4P; zd3o_1dY0KXq8`3okZyNlLjzTpPfQozC+yJJF_$r?k^_bC=aNgEzdqPxd5&(ei_+~Q zkUqP5z7pwfpI1iAX|qNI%5^j~&*QL(x*QW}J+@K1U?7Nh(BM$DtMAjN)DzCZ$V}oK z#Q_pF4-O2}VljlZo;~`zeV3sA zb}qsr4dB=5NDI>oTK}-WGzUif!-Rk6i~9!B%&~F!O@2j?YtF?-d7l>$6;&r)6@|+h zca3MzPb$Xs>rX`&%A{#*raXa@WiDKBC#MWOPS#`l^WyHAf22qh&KGlHp6&$R@`5no z% z-^kFAOT5Z~g_Dz!E6x_0&0=G+YZOHBo=PnThlST!R=KP6Lwvo~Yt29i;4tdP)7z8B zqN1W4QGNrls>s0Xb&t>c?Ar$!@Bs7;Nz5MeC}>){ZAJZf2l%Y+H}u*{G}2%_vaIij zY(6tR-H!z&gZqE)ozqEc$*+pRfLkNp3WWxd+?)dnjuSVC7eO^)5EuSpG(34)#%Zsa zd?g?P*O_>Y*t|RyGIRqb#nUZVR9#l}XvxNWekdGW5@~)uAY*ciL8_Kdx!4`qirSDz zjew=xzdwBbAxJeA{sYv4A+&P!b+6jZ&ic@g(nMo3M2hm`fJKVFDpEY_4Bpc4`*#9C zjE^2Y5@mnGy&RgJmL_kT=h8s=*t7Wyc55rr{<76pkn>7XtkC8VdXz^6!8?xMU%caG|bl3}< zwrp|Qq~sS696WGPD|hWGIM{8h0|uJf?-lKeOGsz{Kffg}A4w|qNS+L-LG^1UG_NV} zoba7Bc!LJ>6>)L&2`T)9j4+_eSQLPlk@g9{2L8s`&&bQoz~)yc%>^6Z8i<;JHNcIj z0b32c@Cvu>;Nm!Xh>_9US#Io43A>n>21<)^rb#f61m?7(5iN+z%v8`zy94%I3n})t zhK70mlYhOv1EdS3_~PvX^{=J6I1Jcw1_SK>T%8-iTGfBNWDOl0@i_0ToERnfR}~fy zoJ$>q{~;9)wpTr+>o_qx2K;Vt)Do-(#)7F$3Bb2!US8N-FL4FawO1L#GM`Kad(CVv z*5Nk9N2}L!!I>C6xY1|kfx42?M`V`=5CE0Ac=3TkqH+}e)m!Ng>>9Zcep7@C-y|U_ z+>Y_0k}15`hI&O7NmmpfHN2pKKu7Soe5q?!ci8JyzKKG6r&>XvJqaZ4PfRJ^W+R1g zD0=vrMQt2Vv>-VNiDv{QQsGkjnD}o_ zjmj_~MPQ+lI9EVo!F!$e@p7d=)Fz}9Xqk=iF(oXQ!Kq2l!bvCFR>10?0ZhK_yLRzK z%YZJhmY0=L%ihq2axdsG`2n?!{1%eMMtDJ4suCNvj=YqV4_>(yhxM(IxJtHEUqOX0DG32|r`B zU$mPwlil6e+-!^tAlQNe>MgEmcqZBe3L#lUuGU|bS}Aw~i42SrFQ{jhB?Ix=W!2Tq z5XCgBNasVqzUb8C}rg##=`TQZr5}>N+DX%chzw1AOiX0s1O^PLFE= z2LLkm9BPNxZMVY!@TevqQ&a1*B3T6BLD&q2Q2{P*v_y|!%vFn}sad*NY7 zi%Aohppn;u5rAMdwe}~0%0=J4d1;qo^dkcn1+cnNgX{u^qx_n+2a@ivIE0@aZOf8| zejA2Wdk>L^kC!)eR!NIHm=|(WvQ-^8CuxVGBGJ&h$kwkK2$hPlShdG-=Hurd#GjGs zz>(X3Ojln&J}yo|Dn=gQ{@K%~T+uw}{~~x}TwGETLt24;w`fwfX~$C-xq1zJrAXf;}^hTiQt)K3CK;mg^X)$cr4CTAQ+;xf;d&*n+yP9R#wD5GzrDu2% z6y9P3JUlCVbq5)8Bz@ba^Nai5E5GaO>ZZw?idb21;0-}Fcx#9bcknb60d*o72jbO1 z5XP{D4N&w%rH2G)31J{JDR?Cc^~h4W;%9ENrRu6Gw6|vD+R0zQAb+BIfwG_R`~tZc z!j^l>107NJ@xp+U+I*68w7~!)gzgdyQhU|UIG`OsDgh3P2DGZU#6&*vrG;;5I}Gq{ zrp5UlUz-k>IZSA%;l2nB17E?YVKjLo3^%tNIuD+FYpxBF2!kwS>Ar4Z1SAXvu9nUI zHRZaHD{)ItFFL7UR{1|;Qvw1YgLN=T6QS>;EE*Ex2hq!0y0tx$7a+j~Z(5|Tjs(YW z8I%v_7Nv$p(+Ej54lb0_cT@4JSBH4Q7rgLNkh|Ik-@pzE5f1zI||SxiQEUK4e`>RX85gD_IXgp zTJs&!P>RJ9FYTkJPlRW#z3D=kjj#)z`m_h*@_9e6#!%PkNJbd<*TAIk(yVaBY}d^0 z?ruchL6e>bUp!BOpULs9#v}d1whl1g*Jw!6$vF?HjDH0=~^fe@sKH~;zc`f5?V3A zOl>{~!HwEV5HFXUn#NqjLg;8cYV}9d+s3A*LBR8X783<6t@jvpAi{;qkV=Ofx*c9? z_7Sff`vGE#CQS$^Iz3+6=Y6pgs|OZ_HvhKS6t8y~f|A}qJ`y|bwxVKucJ_S!TOn{m zM@()`W4}@rx3pJR;!nxy*!{M6Ov*DXQw6|bBXe^_R07gl$?M5@c;w0KGh{j_fkats zl$RFKO)#K6c#!Y^u=gJRRKMZ>_>oW&4YEgBp+q*JNyi@N*sF++Ei*DAv{1*)O4-MZ z$jGj&L}oUXosqr$uGi7~`}=%9|HALr50<9R)=>$XN+iUpGch*RUJ zBT;QbzopD7=nU{>V{y7G3t8pY+rN3OZEZ1zhH+4f^B%G+VB}_?*s877XH}#E4uZ9v zT^FSCuo@a1jjqohOuh+T4!rQ-)~B0=?~p7zf`fuup@CY3uV;S>q7g=+&-O2N=Hw_@ z#e5S;^AYt6B&!iv4ur&XtFMQvRDlyHaE2h|5(=^R7ccRYwl)rYm@?^Vmz9k4mnt(LN35)^WqtV26N49*l+4J@70i?HOCHQkw@SRP00iDtC?<4)4B2t* z6=`W{pvl~MPVGFb1{{gMd_V?>gK{QXU?rV9d8zMWRq}bo`Bg|a^8wlg(JvB~LAvs} zL=<2H7hkEEyw)p=CUbk8avyvRk)d<Hhy|MNeHNIU0S#YW?f1^e8y*L8 zOUuS4nAK(7xv^l>*Ds5$T?#LRXF@6_Y?FN0vM}?*2lr1)sfC3dHuu*-Sr-)-gXlHh zP4+6C0A_xkr|eu?T24+&iD_c1Ve8fybe&WMmh~4`&;;;k`}gGlNW>_JUOFZVo}ILe zOe6pYuy)|sGqo-O+-V+|IqKaH%ML!*ufH&1EvPwj`gymo7vi!MWG_xyuf?&hJ-)fd z+dFr92Z&%%n_FAnlmfeee^q!{)4r%OG&LYJf64If?Cs42Qln;_H2{pjf9vQbbp{G0 zU@epeu$h3egYc~|-JhNlSv%CwF_``^dahI3ey7l?Qw2i+Cwr-IsmdF z!48N?YFe77tOGd(MMYv3;^=2=!`AlBxy`UO+)$G=i7|V zV?C>@Zb($eS~pPN2G$EK8e>+k(jxz}QMr1jy;kt|&Vr2UiIqb90@0009&_D%^u(`` zjR#H?o{7mZ5HERln8nYznL-1jg42x~QLtoE3uXE*D51jLL1AR6-Sl%a5Z-E2MK z+b;tPBVWBj-wboQ^PykS_&0fs?epr|&dI5WZ_d~#^hw5KzpWCQ%a^C8=c8vun;&n5 zPrf)7xIljRkcW3d=#ojcS;3=v$FC%QM;J*?K^J!TvE4V>MNYE+XZb6BWcz=r5}zW` z!D1udSxh;?R1kNy=MK0%o6v_2ae^C!vn|^p15yM@REP*v^t|>TAymX8R*j^2!1OzV zS+(t~LUJ;Qv-fkhs1*=RPM{!DL*0iP7fZ=v}rAY+-u z#crR5S*e4;mwf&ja$AUcm;xG#Hki(tf{2KSj-gd(Tm|t|_R>d+7)k)pPcG6tY`pS+ zp8V{84*FxVsv0mA`O{koi>MjMs%Sz63CSHI7PY7d3pAjN%8eEWegJjA=L7zA1Xt0A z4+4TTCx}t4W zi19V*+bMSG-@6dlDmia>i}LjT=f1U!hCN?sYQFrsv-eEJMs3Le)qe{ATT8BlVvw%= z>XpoUuSF#tha^O%v=2dtoovu+kn(1Z2ESkm5EV#1bk+tQLGt_CIk~ytepmwB2#`q> zmsElpg!>5A2;m5v;BOYgbi{G}j?_20H5zaibt<2CP4~%_*%7xa?CjvX!5iPBs&4HE zrXmH>7HXh{gbx4_lxJsBQC3o-{{CgA$z#%a31kRjmBX=}JNGgcsMKYVv zcmPQB&WHwqd96T`4Dje~!n0m|Ehi<8FSH}cqGcE$5N|C)AJ9UZ&4N4Y3)(E8iK|+G;clUi$&9Sh&LZ!L`g~#1tta3-`nFP5l zZ}LfLT`ijtki+(ECw2Do9i=`};eRbPYn~xGP2KZo_9!I5aN7?cc?9_!FC<`x6t%^N ze!Anr5$)jT6F`5<%F0sGtg-o=Vq?pNs2?#?SuE7`IESjrN*|UvGM>0D>x5~ZkxOm9 z5C1RI@y}j~Z_Zzm`cvQ{E>JSauWT6L-#<+^(9Kbp(?4PS!|D@`Ll8^)E|clGde3EB z!k?GIoOwTnxR(gN8l8#`XSaXINvT@CN}%TB>!35?wh9>-XHmKD$6cymXxCeC0~!rg zLQ5Gn1ayF4Wj$^p<6L+nS9qi7nV5TfE!s*-O*n@h(AnqD+p)|a<~iw2j~KKY!(`%{ z7aYI4BUaRC+1M<34-D)CXR9Xmyz4djt+K_}z2`osCNgP8jx!lY$|+wN)uhDJj@!uG ztK^qTu$K1JXe=${ZeEY_h+RZATNX}1UB^3!0$qTf$i$fiJO(-@CP++(LolX{@9XQM zWoOTWoGVyHui121Q~;*JhkW*r%3%qETPsnXnaPc7-j5!ko%nL|`MIqoZ9dk5!?D`% z!-*!3Oa4$kasvpGm~wu-72h+q?~4$}}&esWqQm-mFs zFryRev(H`GKqU3v+Zxt|@EY-wC_g~cq|XR+qNo@Qe%i;?!^F24(GAK&P3G#3+2rt} zpFVdA#5|e0)`9w^%^iOKXWuL@k8CyMDpocJog-_$LjoEQ%jcUPAYkF<;R!YD-(Qh$ z%_DvSG56GWYzQx738_QjmGhijDoS4^fl<{dTAe}#isNfPRJO?l?ptpTjs#nF{t+|}CD5{r2{RCr;^NSlbm zkpt)UM@HvfCX}jK%Zcr@%91VErtQ7@nw!)lJ9|O6qln3jiu=Vkiht_5Bp)=IZgX3c z?;M|B&I-O`YRjkgOppSGJ3jV6O#FGWU=^eO3mOOYhz~Z~WOCgcK8#Bm{wGt{PGhge zMu=-aeVkb0R(IszLk~UJsn9Y^cGv5|aIUy)RMHgcKUH!h!z2cF@e$<4{`n=BM;P*^ zd|wJ*Bf?sp@JjHZqz{KD5L&y2_9PU;iiQfODL*sCYQI@39%pnztxGOX>;yfhYc-n}T= z2VWi^>G;pqNxFN>UL%Pt*TI?>iJC2WvtNmNBaJ^miMA%hFqi<2K#_uagkYfDl3ooqd)z>O%(bx^`ei-xMOF) zR8FW6C^)=!OI%s=aIRmIGo{&sSc{9Q zM*Sqm_oYq9n~FN#V5L=dC9iwMS+^f1%s)h@!ELF8X4JYGBv3+mMxnZMAz12saPZs)TgM*!<-rsG{pI9L6m0ys zL1yWAXRE7~ZaRO%+lLtk$*p{ntbtOZ=iVS_h)5xJEVSDei}nUFS6s~CKB*z?eT7>aOU)tl zZ#rMPdqnO{zb=~oleQPAKoy8l*&}tN{&&Xl!~;f2h@D9Z`lY3wKEEYI0fsN#pYZ<8 zcP!`wm6KifQ1qz%nU%D~+pZ;UTIJwj%O>vU?ncL)Ci^RXvU>ej1My6CM8Xl8_+QF4 ziC;>Y^0lzjEV9*LA+-A zp4d&b;Q6gX&lcD;$98*9TtXhR^zT^gHgx}DLc7X!?D?P5vMo^5h~!Cai8%9?H+K*v zM6y4Y8GmW|-hH(lo6KnGSndry%%DZoTXi_j=d#&e^Sp}LrQlfDU#V&fsoptc5@pto z)ob3*#dj`98B$Weg4M33Q%zrWqX0!3n;6xa|kEr;m&Ee5+ykV{%dky|a~DBm0V z0zA<)`l8I>WBP7UXKCe@^p5(yK&?c9z0}_~|7PZ9K1BUn%>}e+YeS}QH=!_Ym!3(O zR;x6C@cSH}qzecWsspvZ1|9`8O0yx9^2NH+1%qN`gwc{tFgS8wuV@)HwROs`O%h_R zqiL}eeuevkkJP#r40^$KD_Q46$E$tbEDLL3fTKP49Si2dRtjaLvA-@VzUd0sMuRa; zOohR;EIe}GGQwtQQ-&cDhT_^^mKb|!L!(iQb4Vu!ainKe@g4PVr$GzJVJlubQMM)u za9fsCzCFoPJc#lW-v7=amE=$Y;iYH!gW=%vj53gj2$seZ*{hqLf$6ELMq4B(x%~wl z*+UFRW`Pbm=P15ow0{+m1R;#Z;8{YV=(|~R)boE9dbiFQgH=wjA*>QDcCAVQG27ELk% zg{nMF+*Tojm%2fqg) z4gk=L5D{@~0^Yz)LO995N9hD#j2Idqlpr9s0^kAgU?$K!)mM!XheXhbx?CW`nh?d5 z6+{Jln zn2O`A$@$1wYvbh1OEcJ`)a#Wr3Rn`dn5MN*=T)RNGbv=H=#g1LhYp zytKHu3~5ckwljcdgs_`;#lh)?T%7=fX~2=7JnTeg`y6Oj&{Gwvk|M&xMGmhaIN%}2 zU&3TU(lywdgR(mp_+~mO{ZOdqd3+as4)ynEK?3I28vKH!Cm;g>{8zEO0bd({1sxpn zdd3p_?*qbrPg1Swpo6#fj^w}*74fVt=`Pjk`$>BT=>Oj^#&=S_!%wwlR!3i&>CV($ zjH6A0zu}CR%%`MccPLWl6PKm!+y!gDdMwiGdG& z2_$zatmDF>0ZIgr?T=ge-*N!$8!hla-S(lOq{MSUW&k*3(DUVZO#~3uik+0vXsKB{ z!<_EJ_ces2{x4_}i2}p>e394Z`-KT1yutaMQeNn+x*v03dmf3r0KZ%i9m~4{d}ky{ z=HmdgSXe$JYywUfu+%soLx2HNhX?)-3L zOmANEE;*9L>-h*vt3!cWe*>=oVzUeZnI>{Q7?fBcj3_!<+M9T|FES6xc1#go6tp*e z58chZXKhTiA&CNM1s7;w4v`HGNIY<&F!$~)(hf7jkY)##*U+kB6P1)n#GsHeLoH`F zT22|%)elftLTUhMLShDCxXo3pnE*BcF~%g^*zl4I;Yxc#*|;n4c(Q;q=)30bn+{A+ zbUQ*XM)IvdBGXb=532+&PLsvY@G~&p!IHzV2hJ)ld@5!}`5hL8=qS2!nLBS7uw0~- z_EBnTYrv7SB)uT-yt^~JM-0$`j%9rdojZ~RI0(S>NKPcB2!YNS=+%Nd`$h~lS`EgS zZgqM5{G&ti9PN^`Jz+v3B-LDWkpqS5_!<#beXmgOT!Ef~gBr9a%7~6r;i(mXudmCy zSMaYrMxwV8ru>a!S#1;vie9qnFoIb6;cDd07D+H&!Cqatm6D%i1ZAutFd0!nqxHa=KcIIO` zNusLLN<+*W|7q~#t#fBCg3eGNx*gSy5NllJUwi6z-nG)s=3=>mCU**&Pm1Wq``_k^ z@5@1<;suB*+33fmI+%8+qtW!#vYlb;&*`~5#LRV;D4BZ8jsi?I@q{=*dh+x-?CU02 z9@Q=*-Y#9G3SRGixrQ^JdAx$Lw7L{1GcBTv za}Xf^P~yWL+EtIgJ7E?%GZ7`N`*`fxXx_lh~S|H;xzx}=w)56sjl>fHJIvi1yd0%l6Y5zKBU z*sf7$O^4p}maVjtxsHJ#_x9fUhM0sC5fb#PrdO?29 zB4@Itc~;yuiqDgElc1{gIS`vx{pu)97E`FQET~y#rqkSMuL-(h{n$eOiBI;rC&KA}(JN{V5aBL@&qq&o2Ht!QwA`#7&9 zXBkX$OSOKqyIB$uF)B+ZbXpaUduwW#_)crYq>C zZc5V$T~ug_5uw!+rUSe|^~Od+IlbCD|%# zEqNur9y?@k9Yq%dc)-1s7lORDw=G z5rwlOzRt(`PIaAD%dO10$yd4*q7-Pp-t+@mQd$a$v}|HhvoKusA!N18JQ*k512J>e zgg5Q3y;BE+%cgZoNweO+%58?HjnE@gx@^Wg>E4x1kUf)d);UmTwWh=2jNqNI@~c^2rE-a?g@ou$u1D{h^kne6n}I4{ei+%v1wp>PbL!Uz zx@L58=8JuB#{3QwL*cZjy3^n|W5+7H@-MzhSr_fWRL5^h3tZ>oxg80}=Y6$#x`KX@eto6=iyKO<%&-r50Z8r< zKc{kmxUaUXs_9^%%F`%T*FwCFTcveMkE9%<%!5rbdw}R>$A>~vf2=C;b*H;n@ce5^ zimPP@vfqIK=p6oP%+X?W_A^hIsX5|P6OWaORl@o9{;C%Q8vZW1NrOR$-bk&#{5_)b zXr{?%wFu?NtrSl7Qk`Qg&%7eKvOjC7Jp^zd9wHIYa7@V7cSIH`ZLV-LMAF?T=CaAv&t0Tv9(AN z*J;FAvC}@;f1|$qK$iY9;||gQNn@B~b?49Lv?#x+j1S7zHl2?btj_@&GISf)eS(iu z9gjO>h+snTbjTW}#Z|IF&WUS+@o6!fvgo1Tl({iXpleX_2>4O$@?DE})<=xT1=%ufEW7J}l5_`ogQ;3+P(DH{D8hkdD5vG^!BgYW+jTBj(hoBg#cUAlT)@$GB zlZ{bn|9YdnAS)$)Be(f!E?#au*~KD{r6S>CeX3G(Uex#r6PON%BV-65kAcwVG9X0_ zsVVT!qIzwkxWptRW}v2}6IfIT!5C=d=H*bb4!pv%Kp2JeIpR2B24Q@jL~o70J^HD- zp44wT^HqU2O43LLcVzgaYqlItkG9{DP>vovXX9OgpelJ_*iqGz!s@Q1NLOy8=nSe` z`XGQY@topDYXJiXp@f194fTst(CtA3>NL4zFafRHS?bk7nC3dzw+;p*}RMqoT&5z(7&o=?F;xlH?iuR1j~A?Nl_R)iIuPEftYe z;XNX#@`Dk|gmvRrTF|ja| z4X|*X|EQPtOg<;$@!cCCb*jMa_`lL14 zyF8zPI(%qFq6Q0t)cirw=wA!u`mrZR!NpL^v<+S!a!8${4r^9zA2_4?aP>zDpA9Q4 z{m6wh7rI(##S9dkuZIYbe*}tXDwO9!Re%OkoeKP67V6+#C@gQycv1x2GIoFh9`)NG z#}O)*O;!rPc6qrfrqWB?%-j1a^AX(0-72pXvAxS4$RUou2vQ1ZOQaTTXCYWV;`43j zht^GBwSMEq_3KE51XLh?hi)`*jZO;80;%4`FZZ_k=pZC>SD=120C#U?x(lk;Vw=jr zEp!0?P2fn>?2F$lWtaHX%6=ENZ=XP?Wm*&8CK@CapMsQlBTOG4x7~S1C01{7aSAC^ zfTE9c!F8k9U!V=thBv!EDAIny?mV>oerG^=nAyu2S)K#q z5>u^uSD(+`fzSyFLa zJ$q_`A$PF(Wx!Oz{B$zyQ8L@#ehl1Ue=Ra}*;9PdD;Y_5_%x1wsbz>wO z<%dFyX|>1n+>4=&RF}KyYh(Hw?bw-=_4oeu|%SDQmmzUhZth?%qRNyA_Hp zg|_;M6yts^&=G}$gp|h*eV`H79z^vhg$vg@yOW+Zk=T`Mna~lL+fnG*KAQNut?fM* ziD%p!s#`%^mxZ($RH|cY3ePu2S+vx#&9lqfI2>*+wovZtYu_sBHYu*$N^dFLIN#r{ z*t)i{doYM%v6)V6;oWe6h@4(YI~N+Ca>mM!8{OVGEq5qv=a`!vYY~Hgp&S+amb!+H zem?ONrPU~9e9Fnl#%kp-$cvqh{F>JzR?}tbmzqwOD~`r<;i!eH@my2aUH$|I`=IP( zmTX3a;=QDd7Wp1W(q@YypU6c%fxCE-(PK)}W7Xtl`r^!yXfk76Re>Wqu`mr$T}Ctb zRTJ97jB@GIHd8R2!J3iswSd)=}kip`{a(U5&-^f@~_OR-RGn#vxy& zVSul?oKu`F+dOFG7-_5vpKhlTLIyO_|FI~#Jw43vs^LPvD>uxfMUwO!8b6emE;3ox zx1{59o+)5OqM9PFct!~se=s9108w&3YzJa(u5b0{)fqbKVzjbYBr2+Xl%pTT@<_Xsy_X>UQlTy3z2jT*wlN zzD~vGZ^(K4J>FosG-H($EU<^V&AtD2TA?ISTsR-;5_+~W&UM%8_vwswZs--}I=aG_ z(bBa}q}f1?>*(tG{K_g3EuAn9ec#f{%j2NU(F^$L$YUMBg`2hzS@@Z}@TcO1+E|Zn z!cpd`gLGnK0?6vMuZJ?4$u4~r+3v5}VTL;-enaD0bEuvLa#=pyD1(3!33}(gl)3Ik z7~nBnW&NY0zCji9zk7bBE_`pT?rWwbzDSC>w51<(byNQv?7JQu@4ec)4IMCk0%dQ! ze|T5?jmBf>l!~mKerfSQ5#T8#^*?t9Y$AnX>)F0}!B2e*b=@*=S{Vy6CGyXA;{(IuOc>-nze`ig10-o(2s4&7&D z+tFoUYREe;Pb#-dmyvzm$QT}tS8Ea`&4vav1*JLkichbffsIhPuL;vt;yVC=lTb!wK>mzeq zp-)PI{&UES$7D4_9QnEnJP?vf38 zov%6-Qj;oCv%yTM69uoAGUYU&eaQSB1HF+W3Gx$)6>Wz;z5=Q7h2EsGz#@!=?qx04 z6YyMQtF{3YRW!)fec`T&s`&zkf+!~MrR@F044~H%DHgk zAJ>>JZId!gx8|LfAjYN znfJD>dDxyhSJQycHvi6}zoexfQsUHtVTFbK0ynLCo`0}?>TJ&0eKDi_!U;;UFu;%; zkxte?P&1heo-zU23P7|#J{idQuLdN+qD19se_1qPcv2L z-TvwJW6uQSlr49Q>Ho+n9WrwJa^H@Q(7bgLZ`F9z6=XTX&A>Rt^5}bv9`_ixvS&mz zt&0{i32ldbdY`}EKUOS#atPG9d)Gct5f!*7@|;fV{=;kDG@jCnHqGDsX6yr>#`;Gh z@1N;GoW{4P^pVE$(+ScakNH0nujPL2uTheeiVVna0!lt5Jet8@asH9rh4G#y{?T8i z53yGC`}^zc56dz2+oibHdpIz3XQL>ME`Lfq19xtJ0mrG3;h*$xvRqo_MD$*_3AyeA z>NC41Ig#bFULS-QVzHgiW14qi@#IF4-eFMllD`7}$@}x>l+i)cwZGpw0;t@seEb-4 z!zwC&^<-Csj%v#}BjnM)LGA1e2XwQ7mb>vkj|zOX@X|&CwWpzW$_af`(ALF2_wPU6 zsbaoew>Nkb+tFCBj=b4nf!+^C6ZfR3j{c@^-9BdI>fH7aSs0v2@9rNCSv$V=;JU2i zuUw-39Q)|vE)l(lu0!v+BMV+1-BLYHk>NW>(!jPG%y%NNS?=hB!&zH9L=-HIcoI_Q z&0^hs2GuPvSAGWHk9m2V1E5 z+5pmG6V!epJsmf~jN1jy-|< z*8cWD+_pVty2}kr$3Pz$yy%BNUi571@@+klriQN6Mq70M=j5ef?g=T+KjcW6wp0E- z82k2v*p0n6qR)rT#7@7$MB$sl*?*g~p|Yx~UPCog;NI%+E;H1SAtrSIdT&8td7}5K zzF^770dd5Ljmg&w@DDNtahpPgO9Barv0uKuH>*dueXC3{DpusD2OsInfJjlJ3(Dr}q7yF*%sACL-zu%-L;s=VL zcfbgg+?`HP>*((O0!?G?wdO$2Q7Ay9|9Spq`#`u-E!Y@|M8r_m7JX>f)l!cfMP?#8 z!%cp1*FRF+)Z%+UG>oL~{U8947gV9_kEDH63=KbZ8 zJKTWAX;PJw6QVNygZZMNfkE2bQQVjJMMZRF2NMp?5C5T?olTjWDu3cOHm_Mw`RZD< zPpAtzXDzqk{@&B*wcL{b_qVt;ho4&4gxY+5bAFd7?K!N-VL~<*q9|AUUGxQc5DCM9 zAnC=|UYqG}R>Xen9iUpdjJxw_oF>BY+Y0tmv%1d~$5($wJrq>l3cxBt$AWNF=JIKe>LUbV9*L-T+#(3-6V~m7;Kyg8Hb;ca_B< zI*Iw=bIU_E3zPD73zvOnvsXUlmc0u6u4muqr91G^_jB|A^;^r9gwAb_@R_tGSM03% z#ZH-r=;`D~oTvHeuis0+h_wjwGo9%aRXnVy{@}yspPwCf>jM( zmq)eA9*cKAaxA2V?sb5(;CZ6rXul-#BY{mKLy20|9`7m1^tQmsmM9HfwP)XC;-1E8 z!hWmC@3?>x_)+F60JVQSP@0(vo-bVS03KZl9NLnfPX(X=X%s*jq>VNT(Ikp&_a9yG zo>E2(Khne$DiqRQINZQL?J#3UEKreHm5wn@TqX50om1Hm5I}^&d?91HPr@y<^ZKWz zs~B+w=PO+e^I5TPAC0%I_xY3SK})MVNIfE#CoQk6K>2D5!gz*@F7?aZ&X>E*{>>yZg!N~gAzYjH2Y|)l0r6FJTFh0BDaE0 zsd?Y?5Y@F15pq16z?_um^*;3`FAp;&u-*kTR=n4xIR5$cDB0_Wu6?-lztK?r@=NXm z6ktQetjj0p-a>~|N~M=xgfOZ25}EqY(W%bSz+*=5j|-N*lv*)oLf(+vqFv~Rn3_gc z?3sjkBMrI>G!q91PlFm_q_9i+HHdYgQsN$c!d^G;6K*PyMOBuoxN{KH916J?GL`YqUN>)Sq9=v4NF+;*QGl}_njhK z6eBApWR5T``{ImD>9xJHIn)!<84CV{zR$u+1S$eg9XJZ(0kei9H8N%%993@Jo+Z=c zBcBit0LP|8eP>E0=53YvpVg|NV$7W1+!Ln51O<0Ym*A7*=bf(CV<6H?DLohWu!W}D zndZe7z2u2N0U!2m6N4Xppk-1R@ho54dJ@@+#x5Mn+LY-q)4k3|{%y2^< zwyW;whnlz8eKQ=(^W-7b4l6G^Ca_k+B$_=b@d${)^`GR}K*Sw!*6hzU8^Wq9`q*{# z*5t3YKdtRTOsML^PnX9ZckGrK;;B|t>@Q;_58NsGbrAdP?e*K_*up2^IJAfvCi?Tv z2f0iyTs$VL5XxrqS?L-^u)$$1 z%a+O~$NFj6lv(ISSmWCtypLRRp#ayR=bHhIt`FPozr;6Bxz88(@Zq(oZPZHLwXX72 z9yB*kk0zbK5$#?EMv*u|nv}u~?}Jo?aU>|@H~8nwy^!4wyv#)z?alOUSmQ@KVh<+n zfPhBQ5ESIw8ym^6e;0-5j&3CJ8@D$%6`s=ie(Y7+G}acjE|cNtYE8g!aDv0{9>Vmk z4!gFG1frbczBQ)2nKwJ8vQqT=freOFoOMbv;l1Y{KSETLNu5B*E!e)#X?79=d&ZOY z`@Z`gQ-m%Z(YK>3!kkfdFr0pDPuTrN+uO*xsd(S`(RA9`u9oj3J$1LR**E%F z%T1lp-bq}_7fQ9^?sYTj6FoogIJQKOb}sGv^OiZk&4Madw=;c9-%KY=nX@iP2nO)e z#UjGvHaP1z>^@pOx83J|$FZ*GjoX#cY4E<Y%0lavDQz$z5>hW3oYam$deavKjGCB&URb%7{Mu})7O zem%aFxi7_X8T?rxzsWPg<_J$eQ4vICzubCfPNiO!%zu5%zXAGz5p7GqX6jFKWb_s@_Dk#DKQ}mJ>KKW{C-*&T5+Bd}N!^&Vs;Qg`eZ%M&GfM z^HLx97XZ|3HTOIq8h2k!ADh()!53 z|5dP1%enBiwZR)p`=l0v-~abysTPjDLC*5Fp9 zhm#tM4)9(WS-UmCyir7u{^7zbnkPsU5$Ef-Ij*VOJngn?+tr$n>Dc4pqzzguyJ_#| zDVS~j^u!Zp3|gcGbh@Qd{~TyacP}5iUPi|q-8Uc0h{u%f&C4X~<>YeiMvc}<60CQ< zcY@==ChPjcgi|-3fS9H9)*|1o{ok8J>GP2n=IwNpsP1-Hab>IAjB{}VTq}-TAZ9mx z#JfiG3D&ndFVv@;K~!}I-~UvZu@~wxCx~Y~MSpzf3Km`=*Bh->2l|pu;HYLPhf>O! z#@fipjU)n}QbQ1b=3PYEU8bh|z*r-w=8@={w7hGx{=`@kbGDa?ibW~xm2ww^95xPk z%x(M?tbR<>mxdoF_hQW>dK3=@Ccz~?Q09X3B*vXeeO~HyuE+bge*PqS2n1Oe3K}3nJ&#lIL_~^Jvh@Km{ z(Vo~@_f>z0nW-CV&Uw#n%=&Ov&D$xD#WwT8z)XXh*m5p~_n*9d@jR`tpK9IzJL;|# zc?Hn3Z3IIDqGEb?dtL>h4`Sa4MfBXruw^M<$#cU!zdMkm)ZPi`F#ym?wI|(c<`e(7 z{R@ULLXk>y-iBrzqpE;d-IoJK1S7pJT5gbK9ML&>GAVt`mhn=FL{+h))PN&%=Q$!i zf-_+PuWtx3yokCvo?&$Ck@oyNQQ2|PA(*Uc_v-nDHdZ0g7p5{cvPK*CAAcsQs@Ns+ z@(%N>gxye4u$)wDs^S@xAVL?%-&gHxs{}s|oDOp6pEOyTEs-t^kp51KQF!avn?AaI zG%yE1*%rQe8e-r&tBhw#1S!_Tf$9G~@Wi+Dp9G?Be1e7Jd0WNIwk`L^N1#e)5Cv)@ zR)-d`SeW+(j0}1w+5%Qw>bz`5LY)Zh&vbQf2$0mzL-h7r5a4;GEcQtKe8#lHtG5yyXlWcA`0>{PUL(7Eq``fQ zHmc2|oBc`qE(b1=`9F8na1Uao(32Rk8;7OdD&e2vNup9V##&ky*25s_l9y1#mb-oF z(@(^+PPuRKF^OQ~iywtKzH5g`zAf$8MV4p|&WWfz6%Bb|ZgEK8MFxR~S@uC9@)!ie zj;(`(_R9^!9b6FZnV_ftxarFz_!HJd4U2p^5tO6oTG5;zg?;ec>b61M&yk3lpwGk+ zrEVi5n&LYbIuBy$R*nm0z$`$d+F7CkqhCKV-IK9s-xw?Grby8Jt~aU_&Xsvc)mVd$ zO(eM~NeSQ<(G;6Nr+F4bM=TNM04?h zp~KlvPWhQ`pZw!{p-RW(D0>yzzsODWS|}5yDD5UMGR9}S?t^-nn5X4)WzT@x{RFTs zl-r*lHNgB<=8wD$#k29y=obZ;34%NU+M{s)zLc(!6B(q7&RJ~WDW`JiN8Yhtxh+&x z?0Md3>CV|KBJ8Oepu$96o^}D;2bSa%WZ^{1zs90wfX+Pzy-ls4pdU(K+uGY}k*={z zuUa1jAuwC%#4kb0YyWWp*a~{j0p)=Wxy1>(b)S(K^5BH($X~wOVS6x-WphEv&>(e9c=r2le2F9&zY93)f!#?oNao zgyfdr&^SR=GHF{+Pd#t|S|Bd3hjz$ykYN6bOHcTsZL)?4QoiVf%cEEi+3l(b{|7$%l^_80L@^K=q(TEg|_{ZzKSDK3AsQM`hO>S*+XM` zxIyXb-9bDhSLCB~U&;&eho5i0-Tf0*J@z`#16Kp`Ii*MRGCR!uk(jN5Ld!xV-0M6j z%Jv7^3#b`*)ls+xAw4_W_N(WammF+i6LO*TzW_YMH*x`)M(>>Xc zm^XF;InF;x-WQ-aF?8Bw&gNErIGO_cSLv(+%T|Wop_d-y4079kT#ormdU+`)M_*U` z9N!VJAFBG<)zNVcF4c^vvcE!_4T-f6kFK89$=0i>u7*@d6r{tT>p4JPDO#BWMIfp- zxvp}ZU|bTueDM_*lk8#+-0i@+R5je)Eq;DaTTJAm`)50?wF_|%>DdFV<^x@J=RxrO z7QS52)YX?+A)C(FF8qgsNo=tcB@@oyaQphL>X$o3SifeGsDh}yBKFOORUQKF#jU9) z(}`9?kB@Zl*^tWsP%P3ekD)2^7WBF>g6a5=VUqAakYOSn zfp*5wcl|BL{FQdm8T;ViJ;v3_aMNd>NAb*~+XASn{Ae!KJQaRr)2-|N1oI<-Z$1iM zU3q(UA9Ewef(NGo>j7Dx0!R-H)cgLW_pM>y`^&Bk*Z08E$gkJXtOIVXq_58i?Nk_` z3SSU~{6ZtQ&Ve9_z-+OCi2zESso`*~-R1uOOuW`t9dIRTd7K)6Db97BiosaYgsE^! z!o^hYbMnbAA;vupA_Te68Y{DqVvoN+2a2l;zezuX2`zr`-TDAv^f$RJTj*qrst%DD zYCvwod%d^u8oAg84$y;vS%3V~o2K-aJbC|k$X1-E@tnW)bxeROERC2DA+jAsiUoVn%AR7wz?Y`Cn9?lIv$By?v)rvD* zl=u~+kGE{^zW{`R0Pl^WpwCx&upNuZzKLAu`EZu6zl(PhRKRXt)}Q^0yoac_B^Hz- z8|*~A&!O@m7T`1#Mc3B*T!`@khg0$dDdVOLm=1JoGemSP@ucOqhRZRf8d20$6n5Bys&Eg`zSo#7^eF6M<3WD<-*uTUA5M$4 zXx3^XV_R~9uibIsm0$3jUxLGB@oQLVvi`(CM_PVDlDF?}pCiM!3Kqc)+D}T9x`kYs zW(pM8= zl7r$thfn3iH%@b*$-vEpbX*gdkY%Pnf$pXNFirM6N_PCqvp(|0%ruw_r^fitU_bRI zq@6wOz6-0Aj(8L%6l+(ws58wE>M3_u2j?b~0vn@)Xf?r3HzM*coxRA%ERo9EIz+|6ed8Ga9OAz)> zkv%hbnI{1-ruJ@IJW}ugCJO)WV<{GMfDj-Bs7T@EbY4TXx z7$Jf#%?%xE^(8^m^?>2t&#_zlOo)`Ue}(YF<@RQoznwqecXI)Xa;6=JY~(3zE(EkM zn%V8Fw3Q_!7N4^2jwgGj`^#M#FS-)sC4%^MIMsI90SdJan zTbOx!mK!^YBN%~K@BrKl9>K^*YbJriJLGN^j4q}X!|fd-+eaOnN{@LCOGtLDXc)I% z#vXyYcSW=dxms@R=WvAk_x5p`doi2ei+9B&la(N>poYhVo{tOMnXiEeI*0zWu*YvP z?lH&B!2CJ$e8=AB(Pz=l#@3I8i6~Dg#P7fErtg-nsKa;N;JaUX-pL=z8TvuBGpH!X zPFb@kGLpUG*cW&#q~$>fUbLPoxL}!8g_RKl{_^VKDm4VQ7rr`J5OW2xIX0 z9Cg?`1>6T|!}_W;pX2cxr`M}LYhdLISJ3S&FVR*2>3$2ua1J7h$jRM`T~+eL+k00m zRBl2lC`O+SB2F%}^J9`I(P7s=!FCsFis{4H3?P4$IYBX~quf0bHqVW_J;aU)anV^R zPUT_52wTpW3T7BE$le|RhoIdEB99gcPLZ4;sR3M9ht#es?E2Wpq<-tquN0{*qPfN_ z+CgoE941hwG^pK9^dyFjAj*RU4Bk@#=S&LBHi!J+LFWK3YN6nK(*@ec@ZeV2m#W+p z7M*x9n{IMe-FNs`Iof#3QpEphhhUK7z0ymx>c>=m1P^%!`2)@qG6l^=Rd@J@0}+rH zpRy2`2E_a7mmYw zv@^UcK{lkl5uEF%gJ$f1JXnYNPi)7suY@e>$7_UKq4oW;P>Ud9`ynS00NcdN5{hqOzqVVyv(Ra)qu+?V=5qNqMq2 z)^_U*_YAa<^K7I3GU2*57Bm!uXrWr=l2QHS40#Y$01Bc*uBY`z)g=*opDz2-rAOXl z6dXU4Cc_q|IBjZDF zdvxG0ITv|-l_1N*)O50IKYFqQV!t5Lsir|p&3iVDW4g{aQ(%jf&9DDLG&*|e6`U{Q zvi^Y6f95O5Wrh!>9Sh^tInb;Y+;M^GYSxJfeROOE5n`aW#1xIoWO>r4xT!&U0s^pn zBtkzyL4X82j)h#W9n)y}=8jj}os~J8w%&WoHa4fK`DXlc9xAH`#y?4r_*H5;2~B2P-IX?K9^{y(+7XCT+_`#wxYHia@mA`00nBdL%INk+2C z-a9fvlv!l&z4zXmBrALGy~$qx^VR43`F(%?`+jggx*w?C;x(@8yv}i4=XD&{UrF^x zWqdPng(A&P47q9pyj&0mXV=Pl=+ye;BlW?Px8mgFlqr?o}J?1)%_x9)X@qtCl*%ubCG@-_VX?=IHgU5(2!)HV9fZKhM`)tE6Z zDPVVdc`Q24NS(>fa%#KjXG0$=w)9!1Dn+8Hf%&nz%v*2ub5+6RC$_&>m-Hn+!+wi` z%4=S!O{A$RLK#yjLIl%cD*O6$$6}nx;^AP^OrC>@x#3iX)lCJ?#M{pzXeMg$^Ry)b zo9dbbGH2$er}}E&<&Oc5^h`er4aF!TQDygnWv>5XX}a!hBRwV;pp^XUJI@9_B#oIM z{ZLF4aF5YfZ5mi7l#zg%&k}0UEEfr!HN=fFsR``bJc}p{bbnLv7OHnAN4NcTY)=P< zYYM>%Uajczd+oE|6=Ya#n6e3Wr`h^0L9zVEYPUhM_A=N~dN*DkH(&9Z>maD1ed$M#bptXs$hV@^?`7IoZLtg4i6r%Y*ZrNR$6U2f!hO#x0;B%rzRt{# zE+eHI=n8tyWErb^HKvlyY`E2zwBLY__;FS zA?f`fziie#c$;_R{Ir@a?ioSjgq>Tfeh*oe+GWVINcB2Zq5~H^`piReoQ}ffqbmV( zrE)Qa6)lgOxEcADlp!JnxEdZrIMpTw*~2ey}e}X!Fjgp`Y5sW zx>TU>$8veU%-N=PX!u4}D-RkAsn@*uYkgdHXUe%BX0Yx$b8)pBk;LTIU04FJaJfFc|$Q4?i z+V%fXsQVIw!|%YXF}uPKH+{`_zZCfmCK5E34pY_3(C}RMa5F!bIdlKDs3dIV!qSs$ z_19s|d&U?rsmk;3FU~xfNkQE9Z(~i@iL;O-E?DFHiM%o;fpO9-9>`SIjrN`E_%ghZnXdc!{#5u7Q zZPGmsGrvO;#cRKJJ<92J2ih6cvWjAVyfCuvek284yhk=Nc^}GPAU5S4gc_n78beTa z;n-clRjV+GH#kla#g5h8D>>-+HeJ02XC=bT7Dv+RndP15i#exb8UE3dSI=5EbG$=5 z(p0Zn%kyM;_vCR(OD4Myzzig5>A^c`AH3c28Ex&X6qpw(TWEjzDnvaqN6)?oIOAfD zC~ixYe-m9T&vqRp4x%o4P(Ydo;Oy6qze5tG?V9}NCN7)MrLI#J*p_v>=T37(qGBzj z`8g%jmrN4eM@s8~(hNv1t0B2z$H!r8=goTz}1zguU*S=GyQzJR_PlL1;fDRKI-P z3`d!bzQZAXnnm?w$0`#B9Co!1NbdA)nZc`Pk}$xBPm`f*VuO z0l>(|40e~K6koJjZ23w%1GB^?M}XmmSZWke)!gCD5n6mRtAhuz49K6vmz zhGvxKTz7E0CI}-pyV&IW>KHGuu4S_*$p`v>zwz^TIrFzsoS}R=NiB_}O2e(R*z3%= zvb93ejTwzp3Yjxa%rE|~*XSEyy}onoLiU%dPM$fN)W15Mqj_xO1cUeFAMa1Q3XAPe zkyKpe%2wQ7PhsYbBE*3h2#^RN92HZbfRLP+=nj26mOw8L8r_%b;51S*fO3zSf@j98 zy5<{c&e>7IUwEpY?}S$E4ZH>Ji~`L@Okh)2{!tpQy}asnaVVibige!DvS$gaDU?+t zy=Ur)jn~!-^hee$dST|P##WjlH3j1Mg!>(VTp8)=SFE~`w(ul!XlXLCw-2j5imaW^ z$jq4mM#6=7FX|a!h@XQFJ0_51n+Lh8#ogEoAs|dVg`+U^HwdhH#IA2oxfAZRP?~Ka zP$tq9h+rfifJZ(7Fd=Bbo4ucR+4=kca>^O^!MbEV%ti}(sm!4D9115U4S;=sikF*D z@z;xOWIC*s0Qmue{Cp63`wOrjWT$|4nxP^ZorS%4ZOL2ZT~4eA7Dh(QKz5G;eQ_3m&n_S>Tz5g%f(D>Ce}4iv ze#f~`4q#z8vr6m1f-dyu(*_YdV7=!BKC@k#%~#L6QZ-Ygf7eQKQ;EhUPXM&ejbfeFKAV@6rTW zrV?R^Ju@1uxymK$H>6&ywc$EN6e&v=r61n`4jCQR$Ns1IVVByH5x%n&KGntUOz_L{ zJNB>H@TsTuah{^0{n3keadY9WwrlP|z~;!r&-Y!0a8@ zR@3;_NbZi2-}BF7hp`4(5ywH8fA4E&%-E|68=)bqS%xZ9sR^{4$;IzC0dCB-|G)kM z43b+J=E9h_9bwCafjit4x!6_V$LI!@Vg?HnBcnvXAeC6eZESdey%ylcOIRh;F_u5? za;eqAb530^ZFJ0?9}J1TVob@hog}(!FKufJNSkYC&ff_cB;l@e0C;%;Z>i8$9U5r)scQnQXVrEKCDPRP z=>zlbs0Pj0$wfnr-L4UYdS2%%w=m3hf^?&Y$5at-C0Qsd+WQIk=HU?7VNZbb_qWU- z*IY7cI$P8$Ju4S`OoCvV|7rV$vtKt{5$(~_(?yZR+>2u%Twz-T?wDi{DSv6E?Y#N` zOXP^an(9Zc>K}`;KXR_BH?KZ~?%KtT4|eh=`}A$1m4BU*K>`kihAM~$tH4)~b4^i^ z^{?emOkek%wt6=os&@-Z+`&`)aILetD$hm|L&py3LZz1yKCoMET64zTIGg-RhWEg~ zWvU_cfZ}9-)a+aOHM_8CgL4eceRLQYbQOG zAhGq@)8B(J0vn5BTC|3tE&592iJJ0Jp1~YH4cGooL(&({y5DnE$IqdOZrn*F2l+}=%9uueKu&GG>CLs@3<>4${ z>5iH6&{c#D$HJlEe^y;IUY_-bVLTzI2#;)>O?sHhwgcj`knSi(%{=C4@a*NxOGsi7 zq<}habA>{o#XyNPQS)8YNV06hmH&*Q0J+BU5HzW8oowx!?HVz6xEZHZeZBBe@h)H8eC_2!{A%5R*S8$` zvz~RAb4j-5pg$G{hfaMD8)DKBrcy2EVQ~_t5E?1c2_DD*M-C)bj6cPmvn?$PL3C|5 zbt5!o(SLLGp^JpWFNL~JRY}g}Svy7Ot+R}lw`tev%l&-+Z!Qq%?SUH7VmOX1a^gs~ zhX26-$u#tfkY6V)Vj-=adl^zny_vY4P3!3p?|ektSyd5O@h(5nxf96{$B*(d{;3-( zG7Uo^=1?d!>no9_CN=!yV-aNF=V&qM#tGOL&IAA8I%qchS%~{K)LRXDP}I*zY*G)Gi3{wSyUZ^W*=Pl^GbV5{VUT@=}M}zm~VlyOdXOQCLOh)7(Hm$ooaKO>Q`SF zqzFZymVak5z4EH(r>@09W z7%l6FDcA#=G&ifF)ZaQ|ewd*oVuPkfCJIP+sGrV1$^hi|26TEw^E)f;Ipa!yvD#K# z8N)%&sz_3Vq7HoE=0-U|YQ-;sA5D(Vci;pHv(P~|qFl|I(GbI4DD zTY?wk;HXebSs}If9LM|yZ>BY)0HRm zbb}9q=U3^#QM3{lLG68aI63KeLB0}+E0>t^+K?ZPP>={`!-%8=5#wey{L|YYkhv1l z^0{fe7y7}V_7aBI_KqR2pJ9D^yCo-pAop7CN0|?3KQr}8c%{A|ZMkt7rT3a;2@V7w zWwE@Fva)`mBwx(_>__7TGHjBCQK$nd+Y45891La>x8S@ZnHuRw<7;ppVrk@h6v|LB zn?1Djnin`=F|82BqLM38B8kVfD8`i$!A=;;jy!H+y#3W5G? zK?DsMJ?{O4>ym+FVMQY+;+$Xrf0`~61{xIOP8$w zp)H~%~E02jhxVWhiZ z&qrfjau&K4seY+h0^6ixVlfpS>`~)qq}9+?~;jjDJ9~jjF%d zXP|!@O6CwAeqFCf_l+bt4gL==z^8jMe#&_DBhRO`FYYdtRICujRnje$F=etSr8gVv zs38C3p??_m(PXM7Iz3IL1&dc|}U{w6NJzr!11q6tF-%XD;TYfh{!t;*5m z-JEvAJZ7l_(=^|tG-KbZ5lsYD(5br-(ueIO|DX9VSO8~XYgS9*@pqTO0CUDROXVd_bp{udK?jkAmO z@%Ps9{o{3Ko6$jIzle3*h_L7%reQH9V%@@dMy2c}FuJ(B;}mnST%eGd&6=H^`;0V| zpv3Ur9j2$nHW}Woc$y5io_s~2CHf)cHP_kr{^IEd2j9U2`X%xsrvXdy&b-YBc8hCK zyMncar9_XgXrHJDp$t6iA3OiI5tP=mqfU8A1T^H9x;9JA|ji7w$gM-zKty^>gkR9a5SMG@Wpr)bL2Itti- zp8)=F|AL-}c`5h$zNzcI3(U~jlleu>f#8IPR-b$-t}@!(W?k_Y$mfYwn`1If`q=bh z_J9kOA$AyL^FQxE>p>Pq@7h0UDBTd+9)H|)&|V}^cE}WFi@)S)OMF*N|BlToxwWL4 zCdqLQM%GaSY3!koopIAU>h#a*p8Ycna0xe0TWg)0yAE+0_l!@lgs3nnWq#_nS5WX4 zz)1LzuyF^UaArllrm?i9%=;b59X7jH)K}(KBc8^kPsVdk#ZB?wr)eUBkvM;8K{8N< zjUPP8)=N2+kf|}!Z$hs0*kk5X2t_GHR>u9cCIfuVtB#j7dz5E5@#uBQC4X^V75V*H zVUYLhNj*=t{aBnmX}9Y{8ZB-6k0hhSlcmr94mDQKAiQpqoJ{nv~SnKmEAyjE_g+ z#yV=|23OXt8EbkyO39zR--KG8J~>_1ixOj43D3I|c=+?$t5@`^|1-KvW@=*7iGf!q zL@Yg+GK2LKzmea)I~Ex#QPg8E{owH>rNvjnSNJOkBMgDd3`O-2t6QU~PkMfmnj@@{evsy#qv*6)H_|6n$Mo#^jDDhkr@Tr9DyD&3_`mCj z_R&dEQWKl~{Olil^Y_&(ckfKegsR#O#L}T=S!s^8ntu=}i=JeYtD4$=)T-1ql+J#k zfEBQ^%M^oc`*03N2=~!grOzrwXIR?3$(cx^rR{yXGgM-c zrPYh?Zu{%~KMtX(dvVJ?uWY=CKiawdn3=3sJ(h}ztasb-NMpI0K$*&eE(}6gkKWeEQVBKWvb0LmX-vm+|9car`PCbG7W_hC6iFiGP#G|_{K}mt>g+4lVbKc}N^Xrej z%*)V%w7Dtp?{9DGMLS_!trKt*tE?LpyA`i+nalCT$V0O2CgV^ks zscth$xj<2`$ z8(hd`XY2dZ9OTv}XkaVoe)YZP)BdTnm*dU&hU+Ze{_vwe814$sl~U{6q!VcqdO7{X zA1BeWbI|?Pc-XtVccV}(prp5ey_(v6;DVtysaJE21dBtz*rS*Y^qOdym~f&MC|}ZK zi@V={>XhKd!bORPx`#cu+GCd?6DEEArG&e5>VSlYt)n!-C=>Jji80^o$FXMmgx+Vm zD}7cw_pjEi+zmw=s79MK+0>$wdb{86+gvS&5&1~2+@~do)w@*5Tu^4yPvvo0%DqCv zqAy7>TAX-S^R8AKx;P2fj#ZJTwkE3OQ5hP~eW4Nzi~UyrcrooU@gwwCu2S#b8E2=( zRh5Th7ZsIxMZ)N<{_i@sbXid)W_S161ROFH5;>v`m>bhrwfc8Y&}){w}oEt zlG5_!_vPnPwv&894DGsoGc~xC@#$Fc=!|sHx9R+Lp2aP3;cShrkD{f#{#3%4yeb_t z_wyUwk?5;elZw)xX**{uEhbZ>qKr+NM`BFOZ27f9o@JHyRqjj%CDkZ3GYtjl&u7`Dd@&ktc%t_eN#=hQSV~*D z&>la})9_GB#J0z0RATV|({=yY*_BO)hiRSq?H(};(N#`IMkOb=cbn+g3Fz%1 z*dgS^ERLyM*sfSTcGeX5e7bs8+P1d2(T*_FKWqH*j?~w=)(q-aJ;R>pXY9t>n4emQ zxlk_Ql`%1yD-06z-Xc|fbxTh`IJP~dTV*;Sy+O*V+$RO+dMeX+YP2e;w*n#YH8D-; zuRnqhW7x7MXDp}xIOLa)uY7WTeuD3n+;}1E?N;nmoqe{PF}|)~_C#Rv1Ne)wYBj_4 z{jWB8<>RN5Eq+esMdxm+D$zL_*JYho-BteB^o?UErZK*IFrLhLxiSn-X|nm;A)9wj za0SHSn?~1Fo$cybbGnk8<6~5g!>k2-^|sGqWkNQF8}sE-PdOQ?yxqoUr#m)l=-6oE z72R9oFI`2sRw`)idi&{uSMDS>!%*f!A|Z3sc=fwDd&fje)mD%&X^^b-C--8JK~&gcM9q4MGtf{HFrr4fmXubJ{Glu|05ykM@OjJuX9=hR?qQQk*+)6wg!OOIM? zd3%ld-eMVRf|-q75Ybx8%!_?OhCY7$>bA@~ALQOre!V}dePDmMH;|nqCXShfYhyYD zo=)_q)q5e-VU|aDq@wP(XfN&67f3c(3sjl%r4Z!Gpi`=2x?L7@6aLd}$Q^c~f1yE0 z`Uu0^?cENZZD2i}2N9YVdY;>Mnfv8j0nXMsDZ+;zaQ0fGjnAK>nTB4%u~#*@e$ekl zmF1M<&rJQSVSOtj7ll``0xIVai`^r7=Blg0^ zwPU;0VnyiA!z?;qnsTc!=heIzXG*k|5n@KA3Oz#a1P!Z7j*!sAe#3IhCM@Uo)1QD{ z#i{MO(hi0Xgml}|%Js$ln{uI})@l>yR(Yvsk3JV_+f`ym6WcpWF^{iUTBPOY*Jjc> zhUVSAgNaT_)$N^I%=&peCK*9^Kk=L+R*0w->rbq-xm4j;K`l~c@`7b*wLjHdkhF?|ZBLi-T9CWaTXc?n_9$Mq*t4ADqSlPxE8I^~ zm%d2#5(oVbc|#hhTSqc{)_cC_zpiWdEO;{Q0$)=>VF~w3ZntGenry1#7u2-0{BL@= zIHxgNg4JqU4sYa?pM6jw6NzT0ojb3|N*dUIK_5BlH$H37u54LuURvup-ELY?HqI|h zZLEqBGiJKCSpPFLgr?`*df1q~sG2&pH$8n%c3mcj&QE;rOQsnEk-Botrg+?L$K#}W z*Gs2eit0UcSky!WgRAciTku#Z21-R00us`+FGb(2Z0((&DjLUE8y&aqif>8V#^z0w zlZaOf*m(;pT(vsmU9mEU=ci99E&}s*q1nCT+cpPhKc?!@Btk{M-Q*$>T~aizbXey@ zmao8D);?y*cr_!p?(o~H1AI-H1@V}j>lrm2Ha2*xeKMXnLw}0~Jh4R^l;^8^5Bn|h zxJxk-X97nR_^C|X^X!t(7JkmY;+J1ep|AP4H!QJbNJ@f1;uoqf!H-Mece_oCK-q&< z<@t+egKy+hjnqxpj&`(9erN8{XL7Qjoo(KG-*r?ndg3jERbMw8OE444DKGOM4UZi~Ooo)d?GqZ+jniXB& zYA|QB^`_P8UUdi+J(7iUkVVy^W}%Ie)h?^5;6N#3P^CZfsz<7vq(*I&_e2BBTil24 zmOEW+(aZeFmi!^ifw>zE$$Ny<{Sr!t8n0+Yj&wPfd%l?rzh1`FlEZIGS;h`9sT?XT z(K{+CTYDXCSU+Q#-u@x{(Ms3)ENyW~z`Hp|jO=<{T=J=pB{#dGjRvA3H%(D??5jy2 za~)muTHOm9ahF`_!gQb9`MiJgm4}+l6G!vA4H{eO6E)RrOMOSdUiB*tb2{f1&7@UD zc5ElBE9Uk>Nnssh(UI+LzkZ$P#PD}{Ebn>P~!^_Jl?;#fAJ!s zZ&BOopPapic<~)dd!ZffMD9d$oV7hg4hnv9o~>BviD1vxe2L19eFYR=nY-9nYU!gZ zLZ^$DCoQJK=(AX_XR}@p!MUEDye`ttFX7a1;O$i|d`D;FYximRIhjWS*dWQAe4r3S^e8Gf1)rv~_Bvb2PpxV5H{@~!1v+E& ze{*q;CA<;A6QHJea5P5@wDsg1TIho+R`}mUQ!Z`(Qk`@aUv}_Jms3WwOZpWjs;3o^ z?Vs-Na8-zafI|E5chsYx0W52d$J69s;$OJQ*eUUzP~bfw!wcIxEQfJ)>7dif#$ z66t$^MT_|W|Em`7W9y>-8A$FsXi93ip(5wo0WV@7M2q=c%Llbf;Hzl?QPy44gX}a@ z23a&(x%aLN(H}9Rv0bUAzpP=&2xT6pNQhe=9BzjRqNo4DM3Y^=5Vu(TAGr1Nb$a_uoy0-M)hxr^8?VQ}+o(8h% zr?p&+SG75}MJ+fo38-))&Pc!)OwP5vpnPyz)mzHirMHj6KUl$?Gz*vv2e8kV-j< ze{0jZ_25AaJdP=v5_zNc(O6VxaERrLXBu^F@jbFcj;MuNuZDV*zPzR6FN~$WchFVi z`uztM$_BMaOu>Lc$?Mls`d!Yyjf$6wl{bF0EeA~ncP)jH#YAx=c0I_=UFN1>V4(jx zWgW&3@mP_N&1Ktp@^X*u+p(((PEb^I_A zLgl*To*D7R*x8n#AP%?hSi*k1ToP*vV-#%O;-Z^934;dZf;Rm9&0gsnFBgg#h((@C zYSuPC^6Qm!P$Ii7E*`jKo@ci?p>}xf3Ftc>P<}yuK4P{NSVB3LbcV@hP+2ea-;aC- zwe@#}gsK#EqiMdQvbfi~_AZMMIp)O;r=kDB;qbjDaG`Yd^q>zKt zuaY&arT>07iV8P50WbHKjm^EiYl5?ZTH!$<;`X24th1uz2(Bg)rzRE@6evn#_3-__ zZ~ULH(*)MpoL`p}pnotm7>EzrYI?ZIc1nchsz`EEbf39MyJ&e-0?@eu9=T zoM974v=o;R=VX3+tKwg@4AQgkl3M0&Vu5J?*o)J}?;#;OgSF?R0j-S)2g`X*$p09U z#}bA+CmOEC;nwsiu-L9{8vf7ZLdnc~hb!-YJ;f0q6aT%3*2CUA-U)x~ZXf%!&o^kW z|FPqFLiltP-}JY$duY-46vH~7z2yJ(u}ty=U#+^|7K!oyy$#-n9h~_8J`hd3$-6cilX{Qa&ROcF|z(EGsL+H>W5 z%ye{#n}mi~%uGxTv)k;N4d^y+^C7LzbvE(TUexZ9k)LoP z?yMx7&rGd*^KjIxHaRT~t8n<&uW+s}U%sG@=u*O2Ib7&UNlH!SayqsyHp@;=*95^2 z{%C0isfZ`Gwzh0E)7^=8a6kb)si^3CQ_~aO&L~MGC9-ZC^&t>91ZkOjaBwWzHa7hZ zj=IYk572BiwX|>=4X}Vp;qg+Mmp=?0uq1!!(AA!4`Z6~+hcabb`KH#nda{H|_t#A( zCZ;&wm_Grj($QLQEhUy~AX?L!BpKvz^wf)5Ocvp80$wvZR#yLTE}PN8WO4#P*L?tx9{8}i%P*U=7W!YXWl+O!=+|4nC>49dQ;NRviYsN6Sm+iTO@OC)vI+u(5!z38jTelAm;5p zk-3-TvNklClAH`g+IZ!In;$z57HZCW?980khVuWpwxC*oKLyXvTo)E*=ES%-6fxN_ z&UZL;;=WtV2UW&x2=ng^L0ex~qA=Z^KZBW1DxWP@|8v~&y7jmOjZ+ht(5_59=K`% zaIK37Xc|#8dJ#(G4i@UPT?IFUY7gp1!^K9|K@aE#*lq3UJe!kM-QyR}pX0{5oZm;j z)N&P7)n2`7n5cHF92bGP=+9IP`u6SPxalI$u-2QFqHXwq=9dvz}vt2LkdamA(*UV~D9mBy)- z5=L^dcu-CI;{5F4DE>r-eCCfIKkBBa7hs{pixA>$F3l>Ab$21@J+ zadEC-Sp+l>ej!|ZaVN*;w#Oxopkjq`nxlzKbG1Y9aizsn9jcnsp1dbMrDu=64(J^N zr})A7M*>+GHBDd!TiHusi|dbu^$3S?ClNAOn0pculC6bEv;B#Bd|9NgO0|-AsRBf; z!itRs1H;25LD=5GY+@J*IKWRm{O%$wJbZajBqTU^8~XEzsi>rkjak^L|6Bzodgu8V zJ8~tU282$<9Ut}6OVQG;5T)M#>5(|v4sh{p(^=VEi7thnC^9ZxJUHT*JZYIb*q$O4 zX}=Wj^;A+)bEPj`2vk|YAkj-l{Sxks*^Zi^Bqb$n?Xi|vNf~8gUSD7xeK^}2OiE6+01|mrB5LYR#@G)HzT{k|C8LFUgz4$& zDlTVxC{La|*@C&}uv&NlEr)f4E{Bi7Wnvcz+YAG-p4DRKyTKe)WEDLT6XSTlqeJbm zL<be{~8?%@HG*%+@x2qCd> zakYPbzl)FygU5J=uZ6yfD_F7{|JVyw3^FK?hQ5-Mdk;st%NHVyhKdY`VQVB@J+>T3 z(M&7Xc|m3D$JxQ8jDv#!LLQ6Iz#|hr+ZwQW!lv~Vi2f<%QeMbjv=|gCBZuIN40`Xd zvFSB(AGMHURu{- z;{`Wd)+uOmO#lX7%|_27lTyb6Q)ugaq@$BGBBCHK4{f+JgCgSM;yWP3zz(8m$T-e4 z`-JltUE6YUaqQq3{Igz9hziyQv9>Q)6^bf|S1bEtFl1rT(Nd6KbUip>fylEx+q%2e zNNCk7#g{&;p5Qn>9w~A-WsX}r&rA#rnWzK2Qc_aX zght{GW?THgUA1g}1Y5toy}fPt5K`-}AWXPb+Vv7Wy>$Gpr}%Ggrs&8uAvTS|47eFWB|9Uh{`ywnb&~0>GAy=aEq|$BzBX7;t@nK4En-0zo zhAU2)1qFd1ddCXw*e$-~jX-DpOjZ_XJJAw*mP$<^`LwMRj=RT0fiIrOu_O@G=FvF4 zR5*K|2IHi2+_ZFZ=xWWnz=LoCT-?Ul?J2-A`EQ`ULpSR3Uu`Ofq5ssotOHNq)YOy* zam*Fh1m=5iRd}5j96{r>`II^Tr4f~pjb9$0KBddVQW0E+S=8Q{Yon*9M~~v8@MBmy zx{}rPXV0&G z`y-ytc&44_JiNL$V=Vwhm=`^4>Ou8@A|t#b*U=A2t;MOa}<=hgTTN}t*7 z!|Wid&0nAnp}`w@1nbQHbi4H~GqW5QFW7FMQ5UF0fD-y%oM;wIhUK`WDbmSrHu)f@ zYzC)xK05a{?cq^R`Q%!es^VGVm_!sMMETk9b3N1K!Q>I-Khc|d z*$O@infQ0;lpJkU7(4x1sU2UOy@$Lwir>Pm+VQ{=xVO{WohD0LXJxstKdi^~8$OQ7 ztRIo@Y>m0g#54n>>C+9kY;z+or`3Ey&hoG4Wt@oM`cTrcb-BV7g8CWd@J_=V&35VYzKW*B}Eg;&Q zoQ)2OK$_Jr{NUh&Nm7q~=aNH_RqgwUVjT#FfKIH`R;#h$s=LdD;F}||0qN0R~ips;c&^`}F22~!mlA@v_qsdsimbUg8W?5EdCY^wQKwR$^ zA0ONyR@f-6R->_2MPyTKTL-TsOLb9!W(~oe^;yBof}8-ybu7d!DyXPLOg(&@ zWMyTIQ#CR&g5O_FP9(1=F&+O2hb54aEggt}eDo~h)UIXg9hkki9)0_@{MJ6jFcL9MSZdC>f5JO-vlNUTk|Psz zaW5-3x7C>UvJS6LH^{#OBnB61 z9nJ3qW#2($oDRekV5-q59ff)%baJvBlIh+D2NkO{f~A=qx{Zd#n19-DaZj#3kr6rL zhE!T4Q!!T;Xmt?M=auro^2yZ?&P~nDJwP^ZjkreLLUQ+dB6HJrp2cuM$a*dl+?WEv zh($y+0wO=;gnrmB6Me??}_EfXL!Uw(B?xCU233q_v`oWUj1B;m_;2smzURsZJ^4&=sTy56M zPjh!+WMm|!q|EFjD0I1ShKSe~`Ov}^&iIe2X;6Sdr3>07@ z$2|e3BVvg?dGMk(x^++^+pdq07HkUjo?8I=ur^+)Slt64OSAy0JHN23tn3Fkfdf3o zDEheiR6u78l@L;}Sy>fUn8Ls}wYFyF-Z(~*MYxpBeioEju#Ec8Ex^YaUL5u-s;8Uu z<=2|%>ubOnj^ECDcUV|_d5i|q2qjBF*#S~6Y(hf9vi-4wch9>wOTqm^qTU)nqu5#m zPeC<2JdB!K{iSTa0Lv8WU?O$E<;?z{P_NHb%;Tv-XmDQVGah26 zc3k5C|Hp5?b(6;F&lUKo($NmUS{}zZ>Wzp10D%L)RpWHxTH@vM?b|nJ_a8nRU~OAa zeqjCyUKH-}f9^0V z<|Gvt2j}IngGZm^n+@nnmrGTu`EVaR5Tx3W1jKdzvfi2!1-35XHCsX5!f=QWLEq>k zE}8UpLm5J)PwBA>LlB62#P#y^>n0$0zZ7zTa97>E`z2b?ZfCod=JKCU(d!e{k%++b z_y&X#hWq!++aDCBq}gX!gWU}mbI|UseFqaY4_8ls zbPA54!C5EQdW|VK$%ZRHsV{TViciU#c0K+sH1=6_38T(_`<#PdjPjWZn)yoI%htal z`D9EI0TRmtu__oIFbafm+n0>vR-CWE+8hFB<31qw5R+ z^HpxvyfsbedL$}}3ffx;+xNrK$LsI{X+c_JA9g!LX>zPLXw1szuh}4JapUw9z!bVnHo7|Ns40v1ULX-Cih$ zYa}&29q@f`wG7z{S&~mMn+bP*z6q9l_39C189%y)%B>dP1S1`$pW~nZ2Nf5s+WE;m zw7$U?`0vp#21;u15SZZelatBA}54z>a>j&%(sEo%e zg0YDiG}y@=ZSdJ`sGP%jQR_EFU(KvBB~wHMJ4Fd^jxQMd&pBh-L8 z7M>ClusH>VYru|o;n${<0Ej4%dijiuC|9Ym0o=(*%r!AJph*u(uj zx45|5d|e&=yP~XYeWY29%s3Iz035#J8#8V1J3N$Kg>L2XUQiBTx>wjHXo zl#9LH+%AE+!Fo9bnK(9VY-}MAibqTru|+tC8w}e66HW)Ju)Aei8i}a&yx&~_--KZI zk$h$hLPAk@!6o_+B0xSSe*c4=>C{WFL#)3j1)TjV7 zG(eoc1N#Z{mK*@TI|D3{(Yg&Dq)@w+0HQu1Z1;g}FbN=3(A$XySwa{rfZ(S*DNV5s z2@s$LGFOZ`M2_gsa_?}N1sx;`;L$AM%;wjKh-aV`1gR%2S21GP7S4evf46!tlc93) z2A{SAfP{9jG7`uT6ajV>kTHbJ`YJ$W08X(Xy5pwRdkSif>pb8vn=r1cAXq9})z&2$ zp>1@K2!yD=I~OFQ#TkAGaHR$R4U`)XK7>IWx%~YgDE8C?Q5%4vvRFv!^V zNbYgcGTY~8z$AtKbU%jL8NpK#l`Q9rlS#y&0SrJ;6Tk~#vmzfHQBK7QlQAzPC9m-m zpi6WR0}$<_*z-TBNT3g5l-U6<@eS^i4~J_JU=*NMb_zch^_m-z9hk7=rvrM9$aF%Y zwFSB>-(q4qA*6T>uFiuM3PX5jynjC&wmks%YXd$+zhz@1d3}Kiz2ukPZz36Y>H|*$Uvl=3P;~cj&@?U|?V0>%B=Bc0_4uXx$cx;sDb~ zKym<*nh1*?6qpD5xnGf$fO+NLRYn1O@sP(NmIOt{Hp~p zSpWy40cAo;KoJodS4hpEXu8Y7G6zwDj)eu!6)-ZGPjwW)&SK)`J7Ps*VR>)>c2%4; zT&M>!Gt@;jfJHzIM{|V)fs>2tJ|q~35EiVfxU4K+P!k0>{>)88QQfJyVp2{B`)O`rDC?H2KBP;t&xdjZP4$K=BIo#?2`vE_`(IFdW3k$k7S#0k0 zb#55ADD06PzoG?0p-Rj^%>r+AiRk)ui6>9cAz(veZ=#^3W}L5_8((vB_GX`ftPUVhBw;>@rl*sRjOKJ(=}RQ=)+u9!1fBoaN2 z#hYP8+`Xs)fcapApo#j!o$$d^TU%bp?vZT zxr5p;++cN+P6yG-wy?VpG2T~R1vUbkhX6&k8Wz7&Rn6Y8+nTEXx+iSC^pzsaqH-J- zd=RW2*pLY0(8lB&w_GF^KE?cxXM@hJ^YepRWNVZ}EWWHP43@(; zuo=jgT8(n6#Q|OeuZ47Oz|0^BDtM%D*t>)Eie#<&J+~kStb=d9pY`MW?Bg>FUdoW+ zH<*l4g>}06dxVS;GHXN}3E=N9h^=L0Fu^XJDD1p;9|MpLJ5kTzd7;R>DJU2TC7l&O z=YShSxdw?ctUqacdw#Ha=abf!mJGBSNgRcwdfAzPz!b2=cZ+M~~X$NLc=g)sbx z4}jT2uzi4S020-K!oZL{8;|jw4iQxml#1OY(XO191Xa@@_ zY53o?+*=hYtZ*H$Ru~0LzK>8Ca{f z9`Ud%C@FzwArMalX&)x2RH2rEh(Sb2N!hKS{$U#fBGS?Bq8z}t5V-pWv7Exyr~@RZ zltf;mNF(F7$oQZ3gg>0>D64S3e>Hdqc9(y`1RugdezqcLBT&fFnEUZf#j1lRRka0N znf=TcMtj)%bV&AB$OPhw_n$6P+uzhNUjZUwzwlwkV;J0&*HF literal 0 HcmV?d00001 diff --git a/public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-timeToVisible.png b/public/blog/react-prosemirror/combined-v3-snv-v4-snv-v5-snv-cold-load-timeToVisible.png new file mode 100644 index 0000000000000000000000000000000000000000..33593cc7581bb8a3464e907d4ede60cc11fd3953 GIT binary patch literal 61974 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

%%&0 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 literal 0 HcmV?d00001 diff --git a/public/blog/react-prosemirror/combined-v3-v4-v5-JSHeapUsedSize.png b/public/blog/react-prosemirror/combined-v3-v4-v5-JSHeapUsedSize.png new file mode 100644 index 0000000000000000000000000000000000000000..6521717fd132c0ff5600a75ba3d5242276062f6b GIT binary patch literal 85008 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 z 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 literal 0 HcmV?d00001 diff --git a/public/blog/react-prosemirror/keystroke-ramp.png b/public/blog/react-prosemirror/keystroke-ramp.png new file mode 100644 index 0000000000000000000000000000000000000000..4ba75daed3ecdc02e04050a897975f8085d383cf GIT binary patch literal 100729 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 R(SW>K@wVEn99iS1{{z6Zhll_G literal 0 HcmV?d00001 From e10bccfc246550b6de923d04181eb399784bec36 Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Fri, 29 May 2026 20:54:50 +0200 Subject: [PATCH 2/5] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20react-prosemir?= =?UTF-8?q?ror=20test=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react-prosemirror/e2e/perf/constants.ts | 206 +++++++ .../e2e/perf/create-graphs.ts | 561 +++++++++++++++++ .../react-prosemirror/e2e/perf/inp-stats.ts | 94 +++ .../e2e/perf/keystroke-ramp.spec.ts | 279 +++++++++ .../e2e/perf/nodeview.spec.ts | 564 ++++++++++++++++++ .../react-prosemirror/e2e/perf/stress.spec.ts | 258 ++++++++ .../editors/lib/perf-gutter-style.ts | 93 +++ .../editors/perf-v3-snv/page.tsx | 221 +++++++ .../editors/perf-v3/page.tsx | 85 +++ .../editors/perf-v4-snv/page.tsx | 130 ++++ .../editors/perf-v4/page.tsx | 80 +++ .../editors/perf-v5-snv/page.tsx | 96 +++ .../editors/perf-v5/page.tsx | 59 ++ .../playwright.perf.config.ts | 51 ++ .../scripts/run-editor-perf.ts | 45 ++ .../scripts/run-keystroke-ramp.ts | 78 +++ .../scripts/run-nodeview-perf.ts | 122 ++++ 17 files changed, 3022 insertions(+) create mode 100644 articles/react-prosemirror/e2e/perf/constants.ts create mode 100644 articles/react-prosemirror/e2e/perf/create-graphs.ts create mode 100644 articles/react-prosemirror/e2e/perf/inp-stats.ts create mode 100644 articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts create mode 100644 articles/react-prosemirror/e2e/perf/nodeview.spec.ts create mode 100644 articles/react-prosemirror/e2e/perf/stress.spec.ts create mode 100644 articles/react-prosemirror/editors/lib/perf-gutter-style.ts create mode 100644 articles/react-prosemirror/editors/perf-v3-snv/page.tsx create mode 100644 articles/react-prosemirror/editors/perf-v3/page.tsx create mode 100644 articles/react-prosemirror/editors/perf-v4-snv/page.tsx create mode 100644 articles/react-prosemirror/editors/perf-v4/page.tsx create mode 100644 articles/react-prosemirror/editors/perf-v5-snv/page.tsx create mode 100644 articles/react-prosemirror/editors/perf-v5/page.tsx create mode 100644 articles/react-prosemirror/playwright.perf.config.ts create mode 100644 articles/react-prosemirror/scripts/run-editor-perf.ts create mode 100644 articles/react-prosemirror/scripts/run-keystroke-ramp.ts create mode 100644 articles/react-prosemirror/scripts/run-nodeview-perf.ts diff --git a/articles/react-prosemirror/e2e/perf/constants.ts b/articles/react-prosemirror/e2e/perf/constants.ts new file mode 100644 index 0000000..4ad90e0 --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/constants.ts @@ -0,0 +1,206 @@ +/// + +import { join } from "node:path"; + +const FULL = process.env.PERF_FULL === "1"; + +export type EditorImpl = + | "v1" + | "v2" + | "v3" + | "v4" + | "v5" + | "v3-nv" + | "v4-nv" + | "v5-nv" + | "v3-snv" + | "v4-snv" + | "v5-snv"; + +export const EDITOR_IMPL: EditorImpl = (process.env.EDITOR_IMPL as EditorImpl) ?? "v1"; + +export type PerfScenario = + | "typing" + | "cold-load" + | "cursor" + | "ctx-flip" + | "keystroke-latency" + | "keystroke-inp"; + +export const PERF_SCENARIO: PerfScenario = (process.env.PERF_SCENARIO as PerfScenario) ?? "typing"; + +export const PERF_COMPLEXITY = Number(process.env.PERF_COMPLEXITY ?? 3); + +export const PERF_SCENARIOS: readonly PerfScenario[] = [ + "typing", + "cold-load", + "cursor", + "ctx-flip", + "keystroke-latency", + "keystroke-inp", +] as const; + +export const MAX_NODES = Number(process.env.PERF_MAX_NODES ?? (FULL ? 20_000 : 2_000)); +export const MEASUREMENT_INTERVAL = Number(process.env.PERF_MEASUREMENT_MS ?? 2000); +export const NODECOUNT_CHECKPOINT = Number(process.env.PERF_NODECOUNT_STEP ?? 200); +export const TIMEOUT = Number(process.env.PERF_TIMEOUT_MS ?? (FULL ? 60 * 60_000 : 10 * 60_000)); +export const GLOBALTIMEOUT = Number( + process.env.PERF_GLOBAL_TIMEOUT_MS ?? (FULL ? 130 * 60_000 : 25 * 60_000), +); + +export const ACTIVE_METRICS = [ + "LayoutCount", + "ScriptDuration", + "JSHeapUsedSize", + "RecalcStyleCount", + "TaskDuration", + "Nodes", +] as const; + +export type MetricName = (typeof ACTIVE_METRICS)[number]; + +interface ImplConfig { + key: EditorImpl; + label: string; + selector: string; + color: string; + perfMetricsFile: string; + nodeCountFile: string; +} + +export const IMPL_CONFIG: Record = { + v1: { + key: "v1", + label: "editor-v1 (Tiptap 3)", + selector: ".ProseMirror", + color: "rgb(54, 162, 235)", + perfMetricsFile: "v1-perfMetrics.json", + nodeCountFile: "v1-nodecount.json", + }, + v2: { + key: "v2", + label: "editor-v2 (react-prosemirror, full proof stack)", + selector: ".ProseMirror", + color: "rgb(255, 99, 132)", + perfMetricsFile: "v2-perfMetrics.json", + nodeCountFile: "v2-nodecount.json", + }, + v3: { + key: "v3", + label: "editor-v3 (react-prosemirror, barebone)", + selector: ".ProseMirror", + color: "rgb(255, 159, 64)", + perfMetricsFile: "v3-perfMetrics.json", + nodeCountFile: "v3-nodecount.json", + }, + v4: { + key: "v4", + label: "editor-v4 (vanilla prosemirror, no React reconciler)", + selector: ".ProseMirror", + color: "rgb(75, 192, 192)", + perfMetricsFile: "v4-perfMetrics.json", + nodeCountFile: "v4-nodecount.json", + }, + v5: { + key: "v5", + label: "editor-v5 (bare Tiptap 3)", + selector: ".ProseMirror", + color: "rgb(153, 102, 255)", + perfMetricsFile: "v5-perfMetrics.json", + nodeCountFile: "v5-nodecount.json", + }, + "v3-nv": { + key: "v3-nv", + label: "v3-nv (react-prosemirror + React nodeview + ctx)", + selector: ".ProseMirror", + color: "rgb(255, 99, 64)", + perfMetricsFile: "v3-nv-perfMetrics.json", + nodeCountFile: "v3-nv-nodecount.json", + }, + "v4-nv": { + key: "v4-nv", + label: "v4-nv (vanilla PM + DOM nodeview)", + selector: ".ProseMirror", + color: "rgb(20, 130, 130)", + perfMetricsFile: "v4-nv-perfMetrics.json", + nodeCountFile: "v4-nv-nodecount.json", + }, + "v5-nv": { + key: "v5-nv", + label: "v5-nv (Tiptap 3 + ReactNodeViewRenderer + ctx)", + selector: ".ProseMirror", + color: "rgb(120, 60, 200)", + perfMetricsFile: "v5-nv-perfMetrics.json", + nodeCountFile: "v5-nv-nodecount.json", + }, + "v3-snv": { + key: "v3-snv", + label: "v3-snv (react-prosemirror + static React nodeview)", + selector: ".ProseMirror", + color: "rgb(255, 140, 100)", + perfMetricsFile: "v3-snv-perfMetrics.json", + nodeCountFile: "v3-snv-nodecount.json", + }, + "v4-snv": { + key: "v4-snv", + label: "v4-snv (vanilla PM + static DOM nodeview)", + selector: ".ProseMirror", + color: "rgb(60, 170, 170)", + perfMetricsFile: "v4-snv-perfMetrics.json", + nodeCountFile: "v4-snv-nodecount.json", + }, + "v5-snv": { + key: "v5-snv", + label: "v5-snv (Tiptap 3 + static React nodeview)", + selector: ".ProseMirror", + color: "rgb(170, 110, 230)", + perfMetricsFile: "v5-snv-perfMetrics.json", + nodeCountFile: "v5-snv-nodecount.json", + }, +}; + +/** + * Returns the filename for a given impl+scenario+kind. For the default scenario + * `"typing"` we keep the legacy filenames (no scenario suffix) so existing + * graphs/runs are not disturbed. + */ +export function perfFileFor( + impl: EditorImpl, + scenario: PerfScenario, + kind: "perfMetrics" | "nodecount" | "coldload" | "cursor" | "ctxflip" | "latency", +): string { + if (scenario === "typing" && kind === "perfMetrics") return IMPL_CONFIG[impl].perfMetricsFile; + if (scenario === "typing" && kind === "nodecount") return IMPL_CONFIG[impl].nodeCountFile; + return `${impl}-${scenario}-${kind}.json`; +} + +export const PERF_WEB_PORT = Number(process.env.PERF_WEB_PORT ?? 3100); +export const PERF_SERVER_PORT = Number(process.env.PERF_SERVER_PORT ?? 4100); + +// Keystroke-ramp scenario: grow the doc by KEYSTROKE_RAMP_STEP nodes between +// measurements, fire KEYSTROKE_RAMP_PRESSES paced keystrokes per iteration, +// bail once p95 INP > KEYSTROKE_LAG_P95_MS for two consecutive iterations or +// after KEYSTROKE_RAMP_MAX_ITER iterations. +export const KEYSTROKE_RAMP_STEP = Number(process.env.PERF_RAMP_STEP ?? 500); +export const KEYSTROKE_RAMP_MAX_ITER = Number(process.env.PERF_RAMP_MAX_ITER ?? 30); +export const KEYSTROKE_RAMP_PRESSES = Number(process.env.PERF_RAMP_PRESSES ?? 150); +// 50ms pacing keeps each press as its own interactionId (measures isolated +// keystroke latency). Lower values let Chromium coalesce consecutive presses +// into one interaction whose duration spans first-key → paint after last-key +// — closer to real fast typing. +export const KEYSTROKE_RAMP_PACING_MS = Number(process.env.PERF_RAMP_PACING_MS ?? 50); +export const KEYSTROKE_LAG_P95_MS = Number(process.env.PERF_LAG_P95_MS ?? 100); + +export const KEYSTROKE_RAMP_IMPLS: readonly EditorImpl[] = [ + "v3", + "v4", + "v5", + "v3-snv", + "v4-snv", + "v5-snv", +]; + +// Playwright + the orchestrator are always invoked from the repo root, +// so resolving relative to process.cwd() keeps this CJS/ESM-agnostic and +// avoids a `import.meta` TS module-target dance. +export const RESULTS_DIR = join(process.cwd(), "e2e", "perf", "results"); diff --git a/articles/react-prosemirror/e2e/perf/create-graphs.ts b/articles/react-prosemirror/e2e/perf/create-graphs.ts new file mode 100644 index 0000000..bf28edf --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/create-graphs.ts @@ -0,0 +1,561 @@ +/// +import { existsSync, readFileSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { ChartJSNodeCanvas } from "chartjs-node-canvas"; +import { + ACTIVE_METRICS, + type EditorImpl, + IMPL_CONFIG, + type MetricName, + type PerfScenario, + perfFileFor, + RESULTS_DIR, +} from "./constants"; + +interface PerfSample { + t: number; + nodes: number; + metrics: Record; +} +interface NodeSample { + nodes: number; + elapsedMs: number; +} +interface ColdLoadSample { + n: number; + timeToVisibleMs: number; + metrics: Record; +} + +const WIDTH = 1200; +const HEIGHT = 600; + +const canvas = new ChartJSNodeCanvas({ + width: WIDTH, + height: HEIGHT, + backgroundColour: "white", +}); + +const VALID_IMPLS: EditorImpl[] = [ + "v1", + "v2", + "v3", + "v4", + "v5", + "v3-nv", + "v4-nv", + "v5-nv", + "v3-snv", + "v4-snv", + "v5-snv", +]; +const DEFAULT_IMPLS: EditorImpl[] = ["v1", "v2"]; +type GraphScenario = PerfScenario | "keystroke-ramp"; +const VALID_SCENARIOS: GraphScenario[] = [ + "typing", + "cold-load", + "cursor", + "ctx-flip", + "keystroke-ramp", +]; +const GRAPH_SCENARIO: GraphScenario = (() => { + const raw = process.env.GRAPH_SCENARIO as GraphScenario | undefined; + return raw && VALID_SCENARIOS.includes(raw) ? raw : "typing"; +})(); + +const impls: EditorImpl[] = (() => { + const raw = process.env.GRAPH_IMPLS; + if (!raw) return DEFAULT_IMPLS; + const parsed = raw + .split(",") + .map((s) => s.trim()) + .filter((s): s is EditorImpl => (VALID_IMPLS as string[]).includes(s)); + return parsed.length > 0 ? parsed : DEFAULT_IMPLS; +})(); + +// Use legacy filenames (no suffix) only when graphing the default v1+v2 pair +// for the default "typing" scenario; any other selection gets a suffix. +const isDefaultSet = + impls.length === DEFAULT_IMPLS.length && impls.every((i, idx) => i === DEFAULT_IMPLS[idx]); +const filenameSuffix = + isDefaultSet && GRAPH_SCENARIO === "typing" + ? "" + : `-${impls.join("-")}${GRAPH_SCENARIO === "typing" ? "" : `-${GRAPH_SCENARIO}`}`; + +interface LatencySample { + idx: number; + latencyMs: number; +} + +interface ImplData { + impl: EditorImpl; + perf: PerfSample[]; + nodes: NodeSample[]; + coldload: ColdLoadSample[]; + latency: LatencySample[]; +} + +function perfKindFor(scenario: PerfScenario): "perfMetrics" | "cursor" | "ctxflip" { + if (scenario === "cursor") return "cursor"; + if (scenario === "ctx-flip") return "ctxflip"; + return "perfMetrics"; +} + +const datasets: ImplData[] = + GRAPH_SCENARIO === "keystroke-ramp" + ? [] + : impls.map((impl) => ({ + impl, + perf: + GRAPH_SCENARIO === "cold-load" || GRAPH_SCENARIO === "keystroke-latency" + ? [] + : loadJson( + perfFileFor(impl, GRAPH_SCENARIO, perfKindFor(GRAPH_SCENARIO)), + ), + nodes: + GRAPH_SCENARIO === "typing" + ? loadJson(IMPL_CONFIG[impl].nodeCountFile) + : [], + coldload: + GRAPH_SCENARIO === "cold-load" + ? loadJson(perfFileFor(impl, "cold-load", "coldload")) + : [], + latency: + GRAPH_SCENARIO === "keystroke-latency" + ? loadJson(perfFileFor(impl, "keystroke-latency", "latency")) + : [], + })); + +main().catch((err) => { + console.error(err); + process.exit(1); +}); + +async function main(): Promise { + if (GRAPH_SCENARIO === "keystroke-ramp") { + await renderKeystrokeRamp(); + } else if (GRAPH_SCENARIO === "cold-load") { + await renderColdLoad(); + } else if (GRAPH_SCENARIO === "keystroke-latency") { + await renderKeystrokeLatency(); + } else if (GRAPH_SCENARIO === "typing") { + await renderNodeCountVsTime(); + for (const metric of ACTIVE_METRICS) { + await renderCombined(metric); + for (const d of datasets) { + await renderSingle(d.impl, metric, d.perf); + } + } + } else { + // cursor / ctx-flip — perf samples over time + for (const metric of ACTIVE_METRICS) { + await renderCombinedOverTime(metric); + } + } + console.log( + `graphs written to ${RESULTS_DIR} (scenario=${GRAPH_SCENARIO}, impls=${impls.join(",")})`, + ); +} + +async function renderCombined(metric: MetricName): Promise { + const chartDatasets: ChartDataset[] = []; + for (const d of datasets) { + const points = perfPoints(d.perf, metric); + if (points.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + chartDatasets.push({ + label: cfg.label, + data: points, + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0.2, + }); + } + if (chartDatasets.length === 0) return; + + await writeChart(`combined${filenameSuffix}-${metric}.png`, { + title: `${metric} vs node count`, + xLabel: "node count", + yLabel: yLabelFor(metric), + datasets: chartDatasets, + }); +} + +async function renderSingle( + impl: EditorImpl, + metric: MetricName, + samples: PerfSample[], +): Promise { + const data = perfPoints(samples, metric); + if (data.length === 0) return; + const cfg = IMPL_CONFIG[impl]; + await writeChart(`${impl}-${metric}.png`, { + title: `${cfg.label} — ${metric} vs node count`, + xLabel: "node count", + yLabel: yLabelFor(metric), + datasets: [ + { + label: cfg.label, + data, + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0.2, + }, + ], + }); +} + +async function renderNodeCountVsTime(): Promise { + const chartDatasets: ChartDataset[] = []; + for (const d of datasets) { + if (d.nodes.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + chartDatasets.push({ + label: cfg.label, + data: d.nodes.map((s) => ({ x: s.nodes, y: s.elapsedMs / 1000 })), + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0.2, + }); + } + if (chartDatasets.length === 0) return; + await writeChart(`node-count-vs-time${filenameSuffix}.png`, { + title: "Time to reach N nodes", + xLabel: "node count", + yLabel: "elapsed (s)", + datasets: chartDatasets, + }); +} + +function perfPoints(samples: PerfSample[], metric: MetricName): Array<{ x: number; y: number }> { + return samples + .filter((s) => metric in s.metrics) + .map((s) => ({ + x: s.nodes, + y: metric === "JSHeapUsedSize" ? s.metrics[metric] / 1_000_000 : s.metrics[metric], + })); +} + +function perfPointsOverTime( + samples: PerfSample[], + metric: MetricName, +): Array<{ x: number; y: number }> { + return samples + .filter((s) => metric in s.metrics) + .map((s) => ({ + x: s.t, + y: metric === "JSHeapUsedSize" ? s.metrics[metric] / 1_000_000 : s.metrics[metric], + })); +} + +async function renderCombinedOverTime(metric: MetricName): Promise { + const chartDatasets: ChartDataset[] = []; + for (const d of datasets) { + const points = perfPointsOverTime(d.perf, metric); + if (points.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + chartDatasets.push({ + label: cfg.label, + data: points, + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0.2, + }); + } + if (chartDatasets.length === 0) return; + await writeChart(`combined${filenameSuffix}-${metric}.png`, { + title: `${metric} vs elapsed time (${GRAPH_SCENARIO})`, + xLabel: "elapsed (ms)", + yLabel: yLabelFor(metric), + datasets: chartDatasets, + }); +} + +async function renderColdLoad(): Promise { + // Time-to-visible chart + const ttv: ChartDataset[] = []; + for (const d of datasets) { + if (d.coldload.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + ttv.push({ + label: cfg.label, + data: d.coldload.map((s) => ({ x: s.n, y: s.timeToVisibleMs })), + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 4, + tension: 0.2, + }); + } + if (ttv.length > 0) { + await writeChart(`combined${filenameSuffix}-timeToVisible.png`, { + title: "Time to visible vs seeded paragraph count", + xLabel: "seeded paragraphs (n)", + yLabel: "ms", + datasets: ttv, + }); + } + + // Per-metric snapshot vs n + for (const metric of ACTIVE_METRICS) { + const ds: ChartDataset[] = []; + for (const d of datasets) { + if (d.coldload.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + ds.push({ + label: cfg.label, + data: d.coldload + .filter((s) => metric in s.metrics) + .map((s) => ({ + x: s.n, + y: metric === "JSHeapUsedSize" ? s.metrics[metric] / 1_000_000 : s.metrics[metric], + })), + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 4, + tension: 0.2, + }); + } + if (ds.length === 0) continue; + await writeChart(`combined${filenameSuffix}-${metric}.png`, { + title: `${metric} at cold load (vs seeded paragraph count)`, + xLabel: "seeded paragraphs (n)", + yLabel: yLabelFor(metric), + datasets: ds, + }); + } +} + +function yLabelFor(metric: MetricName): string { + if (metric === "JSHeapUsedSize") return "MB"; + if (metric === "ScriptDuration" || metric === "TaskDuration") return "seconds"; + return "count"; +} + +interface ChartDataset { + label: string; + data: Array<{ x: number; y: number }>; + borderColor: string; + backgroundColor: string; + pointRadius: number; + tension: number; + borderDash?: number[]; + showLine?: boolean; +} + +async function renderKeystrokeLatency(): Promise { + // 1. Raw latency vs keystroke index (one line per impl) + const raw: ChartDataset[] = []; + for (const d of datasets) { + if (d.latency.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + raw.push({ + label: cfg.label, + data: d.latency.map((s) => ({ x: s.idx, y: s.latencyMs })), + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0, + }); + } + if (raw.length > 0) { + await writeChart(`combined${filenameSuffix}-latency-over-time.png`, { + title: "Keystroke latency (raw, per keystroke)", + xLabel: "keystroke index", + yLabel: "ms (dispatch → next rAF)", + datasets: raw, + }); + } + + // 2. Sorted percentile chart — y = latency, x = percentile (0..100) + const sortedDs: ChartDataset[] = []; + for (const d of datasets) { + if (d.latency.length === 0) continue; + const cfg = IMPL_CONFIG[d.impl]; + const sorted = d.latency.map((s) => s.latencyMs).sort((a, b) => a - b); + sortedDs.push({ + label: cfg.label, + data: sorted.map((y, i) => ({ x: (i / (sorted.length - 1)) * 100, y })), + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0, + }); + } + if (sortedDs.length > 0) { + await writeChart(`combined${filenameSuffix}-latency-percentile.png`, { + title: "Keystroke latency distribution (sorted)", + xLabel: "percentile", + yLabel: "ms (dispatch → next rAF)", + datasets: sortedDs, + }); + } + + // 3. Print a summary table + for (const d of datasets) { + if (d.latency.length === 0) continue; + const sorted = d.latency.map((s) => s.latencyMs).sort((a, b) => a - b); + const q = (p: number) => sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * p))]; + const mean = sorted.reduce((s, v) => s + v, 0) / sorted.length; + console.log( + `[${d.impl}] n=${sorted.length} mean=${mean.toFixed(2)}ms p50=${q(0.5).toFixed(2)}ms p95=${q(0.95).toFixed(2)}ms p99=${q(0.99).toFixed(2)}ms max=${sorted[sorted.length - 1].toFixed(2)}ms`, + ); + } +} + +interface RampIteration { + iter: number; + n: number; + stats: { + count: number; + p50: number; + p95: number; + p99: number; + max: number; + mean: number; + meanInputDelay: number; + meanProcessing: number; + meanPresentation: number; + } | null; +} +interface RampSummaryFile { + impl: string; + stepSize: number; + pressesPerIter: number; + thresholdMs: number; + maxIter: number; + iterations: RampIteration[]; + breakpointN: number | null; + bailReason: string; +} + +async function renderKeystrokeRamp(): Promise { + const loaded = impls + .map((impl) => ({ impl, data: loadRampSummary(`${impl}-keystroke-ramp-summary.json`) })) + .filter((x): x is { impl: EditorImpl; data: RampSummaryFile } => x.data !== null); + + if (loaded.length === 0) { + console.log("no keystroke-ramp summaries found; nothing to graph"); + return; + } + + const chartDatasets: ChartDataset[] = []; + let maxN = 0; + let maxY = 0; + + for (const { impl, data } of loaded) { + const cfg = IMPL_CONFIG[impl]; + const points = data.iterations.flatMap((it) => + it.stats == null ? [] : [{ x: it.n, y: it.stats.p95 }], + ); + if (points.length === 0) continue; + chartDatasets.push({ + label: `${cfg.label} (p95 INP)`, + data: points, + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 3, + tension: 0.2, + }); + for (const p of points) { + if (p.x > maxN) maxN = p.x; + if (p.y > maxY) maxY = p.y; + } + } + + const threshold = loaded[0].data.thresholdMs; + if (threshold > maxY) maxY = threshold; + + // Horizontal dashed threshold line. + chartDatasets.push({ + label: `lag threshold (p95 = ${threshold} ms)`, + data: [ + { x: 0, y: threshold }, + { x: maxN, y: threshold }, + ], + borderColor: "rgba(220, 38, 38, 0.9)", + backgroundColor: "rgba(220, 38, 38, 0.9)", + pointRadius: 0, + tension: 0, + borderDash: [6, 6], + }); + + // Vertical breakpoint markers per impl. + for (const { impl, data } of loaded) { + if (data.breakpointN == null) continue; + const cfg = IMPL_CONFIG[impl]; + chartDatasets.push({ + label: `${cfg.label} breakpoint (n=${data.breakpointN})`, + data: [ + { x: data.breakpointN, y: 0 }, + { x: data.breakpointN, y: maxY * 1.05 }, + ], + borderColor: cfg.color, + backgroundColor: cfg.color, + pointRadius: 0, + tension: 0, + borderDash: [3, 3], + }); + } + + await writeChart("keystroke-ramp.png", { + title: "Typing INP p95 vs document size — lag breakpoint per impl", + xLabel: "node count", + yLabel: "INP p95 (ms)", + datasets: chartDatasets, + }); + + for (const { impl, data } of loaded) { + const bp = data.breakpointN ?? `none (${data.bailReason})`; + console.log( + `[${impl}] breakpoint=${bp} | iterations=${data.iterations.length} | step=${data.stepSize} | threshold=${data.thresholdMs}ms`, + ); + } +} + +function loadRampSummary(name: string): RampSummaryFile | null { + const path = join(RESULTS_DIR, name); + if (!existsSync(path)) return null; + return JSON.parse(readFileSync(path, "utf8")) as RampSummaryFile; +} + +async function writeChart( + filename: string, + spec: { + title: string; + xLabel: string; + yLabel: string; + datasets: ChartDataset[]; + }, +): Promise { + const png = await canvas.renderToBuffer({ + type: "line", + data: { datasets: spec.datasets }, + options: { + responsive: false, + plugins: { + title: { display: true, text: spec.title, font: { size: 18 } }, + legend: { display: true, position: "top" }, + }, + scales: { + x: { + type: "linear", + title: { display: true, text: spec.xLabel }, + }, + y: { + title: { display: true, text: spec.yLabel }, + }, + }, + }, + }); + writeFileSync(join(RESULTS_DIR, filename), png); +} + +function loadJson(name: string): T extends unknown[] ? T : never { + const path = join(RESULTS_DIR, name); + if (!existsSync(path)) return [] as unknown as T extends unknown[] ? T : never; + return JSON.parse(readFileSync(path, "utf8")) as T extends unknown[] ? T : never; +} diff --git a/articles/react-prosemirror/e2e/perf/inp-stats.ts b/articles/react-prosemirror/e2e/perf/inp-stats.ts new file mode 100644 index 0000000..db429f2 --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/inp-stats.ts @@ -0,0 +1,94 @@ +/** + * Per-interaction INP grouping + percentile math for keystroke perf scenarios. + * + * The PerformanceObserver collects every PerformanceEventTiming entry (one + * keystroke fires multiple: keydown, beforeinput, input, keyup — all sharing + * one interactionId). Web Vitals INP takes the MAX duration across each + * interaction's events, so we group by interactionId then reduce. + * + * Extracted from nodeview.spec.ts (runKeystrokeInp) so the keystroke-ramp + * scenario can reuse the same math. + */ + +export interface InpEntry { + name: string; + interactionId: number; + startTime: number; + processingStart: number; + processingEnd: number; + duration: number; +} + +export interface InpInteraction { + interactionId: number; + events: string[]; + inputDelay: number; + processingDuration: number; + presentationDelay: number; + duration: number; +} + +export interface InpStats { + count: number; + p50: number; + p95: number; + p99: number; + max: number; + mean: number; + meanInputDelay: number; + meanProcessing: number; + meanPresentation: number; +} + +export function groupInteractions(entries: readonly InpEntry[]): InpInteraction[] { + const byInteraction = new Map(); + for (const e of entries) { + const arr = byInteraction.get(e.interactionId); + if (arr) arr.push(e); + else byInteraction.set(e.interactionId, [e]); + } + return Array.from(byInteraction.entries()) + .map(([id, group]) => { + const dominant = group.reduce((a, b) => (a.duration >= b.duration ? a : b)); + return { + interactionId: id, + events: group.map((e) => e.name), + inputDelay: dominant.processingStart - dominant.startTime, + processingDuration: dominant.processingEnd - dominant.processingStart, + presentationDelay: dominant.startTime + dominant.duration - dominant.processingEnd, + duration: dominant.duration, + }; + }) + .sort((a, b) => a.interactionId - b.interactionId); +} + +export function computeStats(interactions: readonly InpInteraction[]): InpStats | null { + if (interactions.length === 0) return null; + const sorted = interactions.map((i) => i.duration).sort((a, b) => a - b); + const pick = (q: number): number => + sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * q))]; + const mean = (xs: readonly number[]): number => xs.reduce((s, v) => s + v, 0) / xs.length; + return { + count: interactions.length, + p50: pick(0.5), + p95: pick(0.95), + p99: pick(0.99), + max: sorted[sorted.length - 1], + mean: mean(sorted), + meanInputDelay: mean(interactions.map((i) => i.inputDelay)), + meanProcessing: mean(interactions.map((i) => i.processingDuration)), + meanPresentation: mean(interactions.map((i) => i.presentationDelay)), + }; +} + +export function formatStatsLine(stats: InpStats): string { + return ( + `INP p50=${stats.p50.toFixed(2)}ms ` + + `p95=${stats.p95.toFixed(2)}ms ` + + `p99=${stats.p99.toFixed(2)}ms ` + + `max=${stats.max.toFixed(2)}ms ` + + `| mean inputDelay=${stats.meanInputDelay.toFixed(2)}ms ` + + `processing=${stats.meanProcessing.toFixed(2)}ms ` + + `presentation=${stats.meanPresentation.toFixed(2)}ms` + ); +} diff --git a/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts b/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts new file mode 100644 index 0000000..048d1f8 --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts @@ -0,0 +1,279 @@ +/** + * Keystroke latency ramp — find the node count at which typing starts to + * feel laggy in each `-snv` editor implementation. + * + * One persistent editor session per impl. Start empty, then loop: + * 1. Grow doc by KEYSTROKE_RAMP_STEP nodes (skipped on iter 0). + * 2. Reset INP collector. Start CDP Tracing. + * 3. Fire KEYSTROKE_RAMP_PRESSES paced keystrokes via real Chromium input. + * 4. Stop trace, compute per-iteration INP stats (p50/p95/p99 + breakdown). + * 5. Bail when p95 > KEYSTROKE_LAG_P95_MS for two CONSECUTIVE iterations. + * The FIRST crossing is recorded as the lag breakpoint. + * + * Trace files persisted: baseline (iter 0) and the confirming bail iteration. + * The trace JSON format matches Chrome DevTools' "Load profile…" — drag the + * file into the Performance tab to inspect the Interactions lane and flame + * chart that produced the recorded latencies. + * + * Each invocation runs ONE impl (set via EDITOR_IMPL). The sweep across + * impls lives in `scripts/run-keystroke-ramp.ts`. + */ +import { mkdirSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { expect, test } from "@playwright/test"; +import { + EDITOR_IMPL, + IMPL_CONFIG, + KEYSTROKE_LAG_P95_MS, + KEYSTROKE_RAMP_IMPLS, + KEYSTROKE_RAMP_MAX_ITER, + KEYSTROKE_RAMP_PACING_MS, + KEYSTROKE_RAMP_PRESSES, + KEYSTROKE_RAMP_STEP, + RESULTS_DIR, + TIMEOUT, +} from "./constants"; +import { + computeStats, + formatStatsLine, + groupInteractions, + type InpEntry, + type InpStats, +} from "./inp-stats"; + +const IS_RAMP_IMPL = (KEYSTROKE_RAMP_IMPLS as readonly string[]).includes(EDITOR_IMPL); +const cfg = IMPL_CONFIG[EDITOR_IMPL]; + +interface IterationResult { + iter: number; + n: number; + stats: InpStats | null; +} + +interface RampSummary { + impl: string; + stepSize: number; + pressesPerIter: number; + thresholdMs: number; + maxIter: number; + iterations: IterationResult[]; + breakpointN: number | null; + bailReason: "p95-threshold" | "safety-cap" | "early-error"; +} + +test(`[PERF] keystroke-ramp ${cfg?.label ?? EDITOR_IMPL}`, async ({ browser }) => { + test.skip( + !IS_RAMP_IMPL, + `keystroke-ramp only runs for ${KEYSTROKE_RAMP_IMPLS.join(", ")}; got ${EDITOR_IMPL}`, + ); + test.setTimeout(TIMEOUT); + mkdirSync(RESULTS_DIR, { recursive: true }); + + const ctx = await browser.newContext(); + const page = await ctx.newPage(); + const session = await page.context().newCDPSession(page); + + // Single page load. Grow doc programmatically between iterations via the + // window.__perfGrow(k) hook exposed by each -snv page. + await page.goto(`/perf-${EDITOR_IMPL}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 30_000 }); + await page.waitForFunction( + () => typeof (window as unknown as { __perfGrow?: unknown }).__perfGrow === "function", + undefined, + { timeout: 15_000 }, + ); + + const iterations: IterationResult[] = []; + let breakpointN: number | null = null; + let bailReason: RampSummary["bailReason"] = "safety-cap"; + + for (let iter = 0; iter < KEYSTROKE_RAMP_MAX_ITER; iter++) { + if (iter > 0) { + await page.evaluate((k) => { + const fn = (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow; + if (!fn) throw new Error("__perfGrow missing"); + fn(k); + }, KEYSTROKE_RAMP_STEP); + } + + const n = await page.evaluate( + () => (window as unknown as { __perfNodes?: number }).__perfNodes ?? 0, + ); + + // Fresh Event Timing observer per iteration so we don't leak entries + // across the n-boundary. `durationThreshold: 16` is the spec minimum. + await page.evaluate(() => { + interface InpEntry { + name: string; + interactionId: number; + startTime: number; + processingStart: number; + processingEnd: number; + duration: number; + } + const w = window as unknown as { + __inpEntries: InpEntry[]; + __inpObserver?: PerformanceObserver; + }; + if (w.__inpObserver) w.__inpObserver.disconnect(); + w.__inpEntries = []; + type EventTimingEntry = PerformanceEventTiming & { interactionId: number }; + const observer = new PerformanceObserver((list) => { + for (const entry of list.getEntries()) { + const e = entry as EventTimingEntry; + if (!e.interactionId) continue; + w.__inpEntries.push({ + name: e.name, + interactionId: e.interactionId, + startTime: e.startTime, + processingStart: e.processingStart, + processingEnd: e.processingEnd, + duration: e.duration, + }); + } + }); + observer.observe({ + type: "event", + buffered: false, + durationThreshold: 16, + } as PerformanceObserverInit); + w.__inpObserver = observer; + }); + + // Position caret at end of last child so each keypress appends in place. + await page.locator(cfg.selector).click(); + await page.evaluate((selector) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) return; + el.focus(); + const sel = window.getSelection(); + const last = el.lastElementChild ?? el; + if (sel) { + sel.removeAllRanges(); + const range = document.createRange(); + range.selectNodeContents(last); + range.collapse(false); + sel.addRange(range); + } + }, cfg.selector); + + // Start CDP trace covering this iteration's keystroke loop. + // Categories mirror what DevTools' Performance panel records by default + // (Interactions lane + main-thread flame chart). + const traceEvents: unknown[] = []; + const onDataCollected = (params: { value: unknown[] }): void => { + traceEvents.push(...params.value); + }; + session.on("Tracing.dataCollected", onDataCollected); + await session.send("Tracing.start", { + transferMode: "ReportEvents", + traceConfig: { + recordMode: "recordContinuously", + includedCategories: [ + "devtools.timeline", + "v8.execute", + "latencyInfo", + "blink.user_timing", + "disabled-by-default-devtools.timeline", + "disabled-by-default-devtools.timeline.frame", + ], + }, + } as Record); + + // Warmup keystroke (first-frame plumbing). Not counted toward stats — + // the observer resets just above, so this entry simply records and is + // included; for clarity we accept that the warmup is in-band. + await page.keyboard.press("a"); + await page.evaluate( + () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(() => r()))), + ); + + // Measured loop. Pacing controls whether presses are isolated (50 ms each + // is its own interactionId) or coalesced (e.g. 10 ms — Chromium merges + // consecutive presses into one interaction whose duration spans first + // key → paint after last key, matching real fast typing). + for (let i = 0; i < KEYSTROKE_RAMP_PRESSES; i++) { + await page.keyboard.press("a"); + if (KEYSTROKE_RAMP_PACING_MS > 0) await page.waitForTimeout(KEYSTROKE_RAMP_PACING_MS); + } + + // Flush: one more paint cycle so the observer captures tail entries. + await page.waitForTimeout(250); + + // Stop trace and wait for the tail of dataCollected events. + const tracingComplete = new Promise((resolve) => { + session.once("Tracing.tracingComplete", () => resolve()); + }); + await session.send("Tracing.end"); + await tracingComplete; + session.off("Tracing.dataCollected", onDataCollected); + + const entries = await page.evaluate((): InpEntry[] => { + const w = window as unknown as { __inpEntries: InpEntry[] }; + return w.__inpEntries; + }); + + const interactions = groupInteractions(entries); + const stats = computeStats(interactions); + iterations.push({ iter, n, stats }); + + const tag = `[perf-ramp:${EDITOR_IMPL}] iter=${iter} n=${n}`; + if (!stats) { + // eslint-disable-next-line no-console + console.log(`${tag} WARNING: 0 interactions recorded (sub-16ms keystrokes?)`); + } else { + // eslint-disable-next-line no-console + console.log(`${tag} ${formatStatsLine(stats)}`); + } + + // Persist baseline trace. + if (iter === 0) { + writeFileSync( + join(RESULTS_DIR, `${EDITOR_IMPL}-keystroke-ramp-baseline.trace.json`), + JSON.stringify({ traceEvents }), + ); + } + + // Bail check: two consecutive iterations with p95 > threshold. + const prev = iterations[iterations.length - 2]; + const overNow = stats !== null && stats.p95 > KEYSTROKE_LAG_P95_MS; + const overPrev = prev?.stats != null && prev.stats.p95 > KEYSTROKE_LAG_P95_MS; + if (overNow && overPrev) { + breakpointN = prev.n; // First crossing. + bailReason = "p95-threshold"; + writeFileSync( + join(RESULTS_DIR, `${EDITOR_IMPL}-keystroke-ramp-bail-n${n}.trace.json`), + JSON.stringify({ traceEvents }), + ); + // eslint-disable-next-line no-console + console.log( + `${tag} BAIL: two consecutive iterations over ${KEYSTROKE_LAG_P95_MS}ms p95; lag breakpoint at n=${breakpointN}`, + ); + break; + } + } + + const summary: RampSummary = { + impl: EDITOR_IMPL, + stepSize: KEYSTROKE_RAMP_STEP, + pressesPerIter: KEYSTROKE_RAMP_PRESSES, + thresholdMs: KEYSTROKE_LAG_P95_MS, + maxIter: KEYSTROKE_RAMP_MAX_ITER, + iterations, + breakpointN, + bailReason, + }; + writeFileSync( + join(RESULTS_DIR, `${EDITOR_IMPL}-keystroke-ramp-summary.json`), + JSON.stringify(summary, null, 2), + ); + + if (breakpointN == null) { + // eslint-disable-next-line no-console + console.log( + `[perf-ramp:${EDITOR_IMPL}] safety cap reached at ${KEYSTROKE_RAMP_MAX_ITER} iterations; no lag breakpoint found within ${KEYSTROKE_RAMP_MAX_ITER * KEYSTROKE_RAMP_STEP} nodes`, + ); + } + + await ctx.close(); +}); diff --git a/articles/react-prosemirror/e2e/perf/nodeview.spec.ts b/articles/react-prosemirror/e2e/perf/nodeview.spec.ts new file mode 100644 index 0000000..e04adc5 --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/nodeview.spec.ts @@ -0,0 +1,564 @@ +/** + * Nodeview perf benchmark — runs one scenario, for one impl, per Playwright + * invocation. The orchestrator (`scripts/run-nodeview-perf.ts`) iterates + * `EDITOR_IMPL` × `PERF_SCENARIO` across runs. + * + * EDITOR_IMPL ∈ { v3-nv, v4-nv, v5-nv } + * PERF_SCENARIO ∈ { typing, cold-load, cursor, ctx-flip } + * + * Reuses the same CDP `Performance.getMetrics` polling pattern as + * `stress.spec.ts`, so output JSON drops straight into `create-graphs.ts`. + */ +import { mkdirSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { expect, test } from "@playwright/test"; +import { + ACTIVE_METRICS, + EDITOR_IMPL, + IMPL_CONFIG, + MAX_NODES, + MEASUREMENT_INTERVAL, + NODECOUNT_CHECKPOINT, + PERF_COMPLEXITY, + PERF_SCENARIO, + perfFileFor, + RESULTS_DIR, + TIMEOUT, +} from "./constants"; +import { computeStats, formatStatsLine, groupInteractions } from "./inp-stats"; + +const COMPLEXITY_PARAM = `complexity=${PERF_COMPLEXITY}`; + +const SPEC_IMPLS = new Set([ + "v3-nv", + "v4-nv", + "v5-nv", + "v3", + "v4", + "v5", + "v3-snv", + "v4-snv", + "v5-snv", +]); +const isNvImpl = SPEC_IMPLS.has(EDITOR_IMPL); +const cfg = IMPL_CONFIG[EDITOR_IMPL]; + +function parseSizes(raw: string | undefined): number[] | null { + if (!raw) return null; + const parsed = raw + .split(",") + .map((s) => Number(s.trim())) + .filter((n) => Number.isFinite(n) && n > 0); + return parsed.length > 0 ? parsed : null; +} + +interface PerfSample { + t: number; + nodes: number; + metrics: Record; +} + +interface ColdLoadSample { + n: number; + timeToVisibleMs: number; + metrics: Record; +} + +test(`[PERF] nodeview ${PERF_SCENARIO} ${cfg?.label ?? EDITOR_IMPL}`, async ({ browser }) => { + test.skip(!isNvImpl, `nodeview.spec.ts only runs for v{3,4,5}(-nv)?; got ${EDITOR_IMPL}`); + test.setTimeout(TIMEOUT); + mkdirSync(RESULTS_DIR, { recursive: true }); + + const ctx = await browser.newContext(); + const page = await ctx.newPage(); + const session = await page.context().newCDPSession(page); + await session.send("Performance.enable"); + + if (PERF_SCENARIO === "typing") { + await runTyping(page, session); + } else if (PERF_SCENARIO === "cold-load") { + await runColdLoad(page, session); + } else if (PERF_SCENARIO === "cursor") { + await runCursor(page, session); + } else if (PERF_SCENARIO === "ctx-flip") { + await runCtxFlip(page, session); + } else if (PERF_SCENARIO === "keystroke-latency") { + await runKeystrokeLatency(page); + } else if (PERF_SCENARIO === "keystroke-inp") { + await runKeystrokeInp(page); + } + + await ctx.close(); +}); + +interface CdpSession { + send(method: "Performance.getMetrics"): Promise<{ metrics: { name: string; value: number }[] }>; +} + +async function pollMetrics( + session: CdpSession, + page: import("@playwright/test").Page, + startedAt: number, + fallbackNodes: () => number, +): Promise<{ stop: () => void; samples: PerfSample[] }> { + const samples: PerfSample[] = []; + const interval = setInterval(async () => { + const { metrics } = await session.send("Performance.getMetrics"); + const picked: Record = {}; + for (const m of metrics) { + if ((ACTIVE_METRICS as readonly string[]).includes(m.name)) picked[m.name] = m.value; + } + const liveN = await page + .evaluate(() => (window as unknown as { __perfNodes?: number }).__perfNodes ?? 0) + .catch(() => fallbackNodes()); + samples.push({ t: Date.now() - startedAt, nodes: liveN || fallbackNodes(), metrics: picked }); + }, MEASUREMENT_INTERVAL); + return { stop: () => clearInterval(interval), samples }; +} + +async function runTyping( + page: import("@playwright/test").Page, + session: CdpSession, +): Promise { + await page.goto(`/perf-${EDITOR_IMPL}?${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 15_000 }); + await page.locator(cfg.selector).click(); + + const start = Date.now(); + let n = await page.locator(`${cfg.selector} > *`).count(); + const poll = await pollMetrics(session, page, start, () => n); + + const nodeSamples: { nodes: number; elapsedMs: number }[] = []; + try { + const browserSamples = await page.evaluate( + async ({ maxNodes, checkpoint, selector, initialN }) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) throw new Error(`selector ${selector} not found`); + el.focus(); + const samples: { nodes: number; elapsedMs: number }[] = []; + const tStart = Date.now(); + let count = initialN; + (window as unknown as { __perfNodes?: number }).__perfNodes = count; + const enterInit: KeyboardEventInit & { keyCode?: number; which?: number } = { + key: "Enter", + code: "Enter", + keyCode: 13, + which: 13, + bubbles: true, + cancelable: true, + }; + while (count < maxNodes) { + for (const ch of "typing ") { + el.dispatchEvent( + new InputEvent("beforeinput", { + inputType: "insertText", + data: ch, + bubbles: true, + cancelable: true, + }), + ); + } + el.dispatchEvent(new KeyboardEvent("keydown", enterInit)); + count++; + await new Promise((r) => requestAnimationFrame(r)); + (window as unknown as { __perfNodes?: number }).__perfNodes = count; + if (count % checkpoint === 0) { + samples.push({ nodes: count, elapsedMs: Date.now() - tStart }); + await new Promise((r) => setTimeout(r, 0)); + } + } + return samples; + }, + { + maxNodes: MAX_NODES, + checkpoint: NODECOUNT_CHECKPOINT, + selector: cfg.selector, + initialN: n, + }, + ); + nodeSamples.push(...browserSamples); + if (browserSamples.length) n = browserSamples[browserSamples.length - 1].nodes; + } finally { + poll.stop(); + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "typing", "perfMetrics")), + JSON.stringify(poll.samples, null, 2), + ); + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "typing", "nodecount")), + JSON.stringify(nodeSamples, null, 2), + ); + // eslint-disable-next-line no-console + console.log( + `[perf-nv:${EDITOR_IMPL}:typing] ${nodeSamples.length} node samples, ${poll.samples.length} perf samples, final nodes=${n}`, + ); + } +} + +async function runColdLoad( + page: import("@playwright/test").Page, + session: CdpSession, +): Promise { + const sizes = parseSizes(process.env.PERF_COLD_LOAD_SIZES) ?? [100, 500, 1000, 2500, 5000]; + // Per-size cap. At 50k paragraphs the slower React-rendered engines can + // take a minute or more to mount; 5 min covers that comfortably. + const perSizeTimeoutMs = Number(process.env.PERF_COLD_LOAD_TIMEOUT_MS ?? 300_000); + const out: ColdLoadSample[] = []; + + for (const n of sizes) { + const t0 = Date.now(); + await page.goto(`/perf-${EDITOR_IMPL}?n=${n}&${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: perSizeTimeoutMs }); + // Wait until the page has settled enough to expose all paragraphs. + await page.waitForFunction( + ([sel, target]) => { + const root = document.querySelector(sel as string); + return root ? root.childElementCount >= (target as number) : false; + }, + [cfg.selector, n] as const, + { timeout: perSizeTimeoutMs }, + ); + const timeToVisibleMs = Date.now() - t0; + const { metrics } = await session.send("Performance.getMetrics"); + const picked: Record = {}; + for (const m of metrics) { + if ((ACTIVE_METRICS as readonly string[]).includes(m.name)) picked[m.name] = m.value; + } + out.push({ n, timeToVisibleMs, metrics: picked }); + // eslint-disable-next-line no-console + console.log(`[perf-nv:${EDITOR_IMPL}:cold-load] n=${n} timeToVisible=${timeToVisibleMs}ms`); + } + + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "cold-load", "coldload")), + JSON.stringify(out, null, 2), + ); +} + +async function runCursor( + page: import("@playwright/test").Page, + session: CdpSession, +): Promise { + const seedN = Number(process.env.PERF_CURSOR_N ?? 10_000); + await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); + await page.waitForFunction( + ([sel, target]) => { + const root = document.querySelector(sel as string); + return root ? root.childElementCount >= (target as number) : false; + }, + [cfg.selector, seedN] as const, + { timeout: 60_000 }, + ); + await page.locator(cfg.selector).click(); + + const start = Date.now(); + const poll = await pollMetrics(session, page, start, () => seedN); + + try { + await page.evaluate( + async ({ selector, presses }) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) throw new Error(`selector ${selector} not found`); + el.focus(); + const init: KeyboardEventInit & { keyCode?: number; which?: number } = { + key: "ArrowDown", + code: "ArrowDown", + keyCode: 40, + which: 40, + bubbles: true, + cancelable: true, + }; + for (let i = 0; i < presses; i++) { + el.dispatchEvent(new KeyboardEvent("keydown", init)); + await new Promise((r) => requestAnimationFrame(r)); + } + }, + { selector: cfg.selector, presses: 400 }, + ); + } finally { + poll.stop(); + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "cursor", "cursor")), + JSON.stringify(poll.samples, null, 2), + ); + // eslint-disable-next-line no-console + console.log( + `[perf-nv:${EDITOR_IMPL}:cursor] ${poll.samples.length} perf samples over ${Date.now() - start}ms`, + ); + } +} + +async function runCtxFlip( + page: import("@playwright/test").Page, + session: CdpSession, +): Promise { + const seedN = Number(process.env.PERF_CTX_FLIP_N ?? 4_000); + await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); + await page.waitForFunction( + ([sel, target]) => { + const root = document.querySelector(sel as string); + return root ? root.childElementCount >= (target as number) : false; + }, + [cfg.selector, seedN] as const, + { timeout: 60_000 }, + ); + await page.waitForFunction( + () => Boolean((window as unknown as { __perfNodeview?: unknown }).__perfNodeview), + undefined, + { timeout: 15_000 }, + ); + + const start = Date.now(); + const poll = await pollMetrics(session, page, start, () => seedN); + + try { + await page.evaluate( + async ({ flips }) => { + const api = (window as unknown as { __perfNodeview?: { setCtx: (v: number) => void } }) + .__perfNodeview; + if (!api) throw new Error("__perfNodeview hook missing"); + for (let i = 0; i < flips; i++) { + api.setCtx(i + 1); + await new Promise((r) => requestAnimationFrame(r)); + } + }, + { flips: 500 }, + ); + } finally { + poll.stop(); + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "ctx-flip", "ctxflip")), + JSON.stringify(poll.samples, null, 2), + ); + // eslint-disable-next-line no-console + console.log( + `[perf-nv:${EDITOR_IMPL}:ctx-flip] ${poll.samples.length} perf samples over ${Date.now() - start}ms`, + ); + } +} + +async function runKeystrokeLatency(page: import("@playwright/test").Page): Promise { + const seedN = Number(process.env.PERF_KEYSTROKE_N ?? 2_000); + const count = Number(process.env.PERF_KEYSTROKE_COUNT ?? 1_000); + + await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); + await page.waitForFunction( + ([sel, target]) => { + const root = document.querySelector(sel as string); + return root ? root.childElementCount >= (target as number) : false; + }, + [cfg.selector, seedN] as const, + { timeout: 60_000 }, + ); + await page.locator(cfg.selector).click(); + + const samples = await page.evaluate( + async ({ selector, count }) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) throw new Error(`selector ${selector} not found`); + el.focus(); + + // Place caret at end of last paragraph so insertText appends in place + const sel = window.getSelection(); + const last = el.lastElementChild ?? el; + if (sel) { + sel.removeAllRanges(); + const range = document.createRange(); + range.selectNodeContents(last); + range.collapse(false); + sel.addRange(range); + } + + // Warmup — first frame's latency includes selection plumbing, drop it. + el.dispatchEvent( + new InputEvent("beforeinput", { + inputType: "insertText", + data: "a", + bubbles: true, + cancelable: true, + }), + ); + await new Promise((r) => requestAnimationFrame(() => r(undefined))); + + const out: { idx: number; latencyMs: number }[] = []; + for (let i = 0; i < count; i++) { + const t0 = performance.now(); + el.dispatchEvent( + new InputEvent("beforeinput", { + inputType: "insertText", + data: "a", + bubbles: true, + cancelable: true, + }), + ); + await new Promise((r) => requestAnimationFrame(() => r(undefined))); + out.push({ idx: i, latencyMs: performance.now() - t0 }); + } + return out; + }, + { selector: cfg.selector, count }, + ); + + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "keystroke-latency", "latency")), + JSON.stringify(samples, null, 2), + ); + + const sorted = samples.map((s) => s.latencyMs).sort((a, b) => a - b); + const p = (q: number) => sorted[Math.min(sorted.length - 1, Math.floor(sorted.length * q))]; + // eslint-disable-next-line no-console + console.log( + `[perf-nv:${EDITOR_IMPL}:keystroke-latency] n=${samples.length} p50=${p(0.5).toFixed(2)}ms p95=${p(0.95).toFixed(2)}ms p99=${p(0.99).toFixed(2)}ms max=${sorted[sorted.length - 1].toFixed(2)}ms mean=${(sorted.reduce((s, v) => s + v, 0) / sorted.length).toFixed(2)}ms`, + ); +} + +/** + * Real-world keystroke latency via the Event Timing API. + * + * Unlike `keystroke-latency` (which dispatches synthetic `beforeinput` events + * from JS and measures one rAF tick), this scenario uses Playwright's + * `page.keyboard.press()` to drive the real Chromium input pipeline + * (hardware → renderer → JS handler → DOM mutation → style/layout → paint), + * and collects `PerformanceEventTiming` entries to recover Chrome's own INP + * breakdown: + * + * inputDelay = processingStart - startTime + * processingDuration= processingEnd - processingStart + * presentationDelay = (startTime + duration) - processingEnd + * duration = startTime → next paint (Event Timing's INP) + * + * Events from one keypress (keydown / beforeinput / input / keyup) share an + * `interactionId`. Per the Web Vitals INP definition we take the MAX duration + * across each interaction's events. + * + * Note: `durationThreshold` minimum allowed by the spec is 16ms, so single + * keystrokes that complete and paint in <16ms are not reported. In practice + * presentation delay (vsync wait) alone exceeds 16ms, so virtually every real + * keystroke is captured. + */ +async function runKeystrokeInp(page: import("@playwright/test").Page): Promise { + const seedN = Number(process.env.PERF_KEYSTROKE_N ?? 2_000); + const count = Number(process.env.PERF_KEYSTROKE_COUNT ?? 200); + const pacingMs = Number(process.env.PERF_KEYSTROKE_PACING_MS ?? 50); + + await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); + await page.waitForFunction( + ([sel, target]) => { + const root = document.querySelector(sel as string); + return root ? root.childElementCount >= (target as number) : false; + }, + [cfg.selector, seedN] as const, + { timeout: 60_000 }, + ); + + // Set up the Event Timing collector before any input. `durationThreshold: 16` + // is the spec minimum; entries shorter than that are not reported by Chrome. + await page.evaluate(() => { + interface InpEntry { + name: string; + interactionId: number; + startTime: number; + processingStart: number; + processingEnd: number; + duration: number; + } + const w = window as unknown as { + __inpEntries: InpEntry[]; + __inpObserver: PerformanceObserver; + }; + w.__inpEntries = []; + // `interactionId` is on the Event Timing L1 spec but missing from lib.dom + // in older TS versions, so widen the type locally. + type EventTimingEntry = PerformanceEventTiming & { interactionId: number }; + const observer = new PerformanceObserver((list) => { + for (const entry of list.getEntries()) { + const e = entry as EventTimingEntry; + if (!e.interactionId) continue; + w.__inpEntries.push({ + name: e.name, + interactionId: e.interactionId, + startTime: e.startTime, + processingStart: e.processingStart, + processingEnd: e.processingEnd, + duration: e.duration, + }); + } + }); + observer.observe({ + type: "event", + buffered: true, + durationThreshold: 16, + } as PerformanceObserverInit); + w.__inpObserver = observer; + }); + + // Focus + caret at end so each 'a' appends to the last paragraph. + await page.locator(cfg.selector).click(); + await page.evaluate((selector) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) return; + el.focus(); + const sel = window.getSelection(); + const last = el.lastElementChild ?? el; + if (sel) { + sel.removeAllRanges(); + const range = document.createRange(); + range.selectNodeContents(last); + range.collapse(false); + sel.addRange(range); + } + }, cfg.selector); + + // Warmup keystroke (its latency includes first-frame plumbing). + await page.keyboard.press("a"); + await page.evaluate( + () => new Promise((r) => requestAnimationFrame(() => requestAnimationFrame(() => r()))), + ); + + // Measured loop. Pace between keys so each press is its own interaction + // (otherwise Chrome may merge rapid presses into one interactionId). + for (let i = 0; i < count; i++) { + await page.keyboard.press("a"); + await page.waitForTimeout(pacingMs); + } + + // Flush: give the observer one more paint cycle to deliver final entries. + await page.waitForTimeout(200); + + const entries = await page.evaluate(() => { + interface InpEntry { + name: string; + interactionId: number; + startTime: number; + processingStart: number; + processingEnd: number; + duration: number; + } + const w = window as unknown as { __inpEntries: InpEntry[]; __inpObserver: PerformanceObserver }; + w.__inpObserver.disconnect(); + return w.__inpEntries; + }); + + const interactions = groupInteractions(entries); + + writeFileSync( + join(RESULTS_DIR, perfFileFor(EDITOR_IMPL, "keystroke-inp", "latency")), + JSON.stringify({ entries, interactions }, null, 2), + ); + + const stats = computeStats(interactions); + if (!stats) { + // eslint-disable-next-line no-console + console.log( + `[perf-nv:${EDITOR_IMPL}:keystroke-inp] WARNING: 0 interactions recorded — every keystroke completed in <16ms (Event Timing's durationThreshold minimum). Try a more complex doc, slower CPU, or higher seed n.`, + ); + return; + } + + // eslint-disable-next-line no-console + console.log(`[perf-nv:${EDITOR_IMPL}:keystroke-inp] n=${stats.count} ${formatStatsLine(stats)}`); +} diff --git a/articles/react-prosemirror/e2e/perf/stress.spec.ts b/articles/react-prosemirror/e2e/perf/stress.spec.ts new file mode 100644 index 0000000..475261c --- /dev/null +++ b/articles/react-prosemirror/e2e/perf/stress.spec.ts @@ -0,0 +1,258 @@ +import { mkdirSync, writeFileSync } from "node:fs"; +import { join } from "node:path"; +import { expect, test } from "@playwright/test"; +import { + ACTIVE_METRICS, + EDITOR_IMPL, + IMPL_CONFIG, + MAX_NODES, + MEASUREMENT_INTERVAL, + NODECOUNT_CHECKPOINT, + PERF_SERVER_PORT, + RESULTS_DIR, + TIMEOUT, +} from "./constants"; + +const API = `http://localhost:${PERF_SERVER_PORT}`; +const cfg = IMPL_CONFIG[EDITOR_IMPL]; + +/** + * Wall mode: keep typing until the editor crashes / becomes unusable. + * Enabled with `PERF_STRESS_WALL=1`. Wall is declared on the first of: + * • JSHeapUsedSize > PERF_WALL_HEAP_BYTES (default 3.5 GB) + * • A single 200-node batch takes > PERF_WALL_BATCH_MS (default 30 s) + * • The renderer dies / page.evaluate rejects + * • PERF_WALL_MAX_NODES safety cap is hit (default 500 000) + * + * Wall mode writes sidecar files so existing baselines stay intact: + * ${impl}-stress-wall-perfMetrics.json + * ${impl}-stress-wall-nodecount.json + * ${impl}-stress-wall-meta.json (reason, nodes, elapsedMs, heapBytes) + */ +const WALL_MODE = process.env.PERF_STRESS_WALL === "1"; +const WALL_HEAP_LIMIT_BYTES = Number(process.env.PERF_WALL_HEAP_BYTES ?? 3.5e9); +const WALL_BATCH_TIMEOUT_MS = Number(process.env.PERF_WALL_BATCH_MS ?? 30_000); +const WALL_MAX_NODES_CAP = Number(process.env.PERF_WALL_MAX_NODES ?? 500_000); +const EFFECTIVE_MAX_NODES = WALL_MODE ? WALL_MAX_NODES_CAP : MAX_NODES; + +interface PerfSample { + t: number; + nodes: number; + metrics: Record; +} + +interface NodeSample { + nodes: number; + elapsedMs: number; +} + +type WallReason = "heap" | "slow-batch" | "crash" | "max-nodes" | "timeout" | "ok"; + +interface WallMeta { + reason: WallReason; + nodes: number; + elapsedMs: number; + lastHeapBytes: number; + slowestBatchMs: number; +} + +test(`[PERF] stress${WALL_MODE ? "-wall" : ""} ${cfg.label}`, async ({ browser }) => { + test.setTimeout(TIMEOUT); + mkdirSync(RESULTS_DIR, { recursive: true }); + + const ctx = await browser.newContext(); + const page = await ctx.newPage(); + + if (EDITOR_IMPL === "v3" || EDITOR_IMPL === "v4" || EDITOR_IMPL === "v5") { + await page.goto(`/perf-${EDITOR_IMPL}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 15_000 }); + } else { + const create = await ctx.request.post(`${API}/api/documents`, { + data: { title: `perf-${cfg.key}-${Date.now()}`, markdown: "" }, + }); + expect(create.status(), `anon-create returned ${create.status()}`).toBe(201); + const { slug } = (await create.json()) as { slug: string }; + + await page.goto(`/d/${slug}`); + await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 15_000 }); + await expect(page.getByLabel("Sync status: Synced")).toBeVisible({ + timeout: 30_000, + }); + } + await page.locator(cfg.selector).click(); + + const session = await page.context().newCDPSession(page); + await session.send("Performance.enable"); + + const perfSamples: PerfSample[] = []; + const nodeSamples: NodeSample[] = []; + const start = Date.now(); + let n = await page.locator(`${cfg.selector} > *`).count(); + + // Mutable wall state — populated by the outer monitor or the inner loop. + const wall: WallMeta = { + reason: "ok", + nodes: n, + elapsedMs: 0, + lastHeapBytes: 0, + slowestBatchMs: 0, + }; + + const setStopFlag = async (reason: WallReason) => { + if (wall.reason !== "ok") return; + wall.reason = reason; + await page + .evaluate(() => { + (window as unknown as { __perfStop?: boolean }).__perfStop = true; + }) + .catch(() => undefined); + }; + + const metricInterval = setInterval(async () => { + const { metrics } = await session.send("Performance.getMetrics"); + const picked: Record = {}; + for (const m of metrics) { + if ((ACTIVE_METRICS as readonly string[]).includes(m.name)) picked[m.name] = m.value; + } + const liveN = await page + .evaluate(() => (window as unknown as { __perfNodes?: number }).__perfNodes ?? 0) + .catch(() => n); + perfSamples.push({ t: Date.now() - start, nodes: liveN || n, metrics: picked }); + + if (WALL_MODE) { + const heap = picked.JSHeapUsedSize ?? 0; + wall.lastHeapBytes = heap; + if (heap > WALL_HEAP_LIMIT_BYTES && wall.reason === "ok") { + // eslint-disable-next-line no-console + console.log( + `[perf:${cfg.key}:wall] heap ${(heap / 1e9).toFixed(2)} GB > limit ${(WALL_HEAP_LIMIT_BYTES / 1e9).toFixed(2)} GB at ${liveN} nodes — stopping`, + ); + await setStopFlag("heap"); + } + } + }, MEASUREMENT_INTERVAL); + + try { + const browserSamples = await page.evaluate( + async ({ maxNodes, checkpoint, selector, initialN, wallMode, batchTimeoutMs }) => { + const el = document.querySelector(selector) as HTMLElement | null; + if (!el) throw new Error(`selector ${selector} not found`); + el.focus(); + + const samples: { nodes: number; elapsedMs: number }[] = []; + const tStart = Date.now(); + let count = initialN; + let lastCheckpointAt = tStart; + let slowestBatchMs = 0; + (window as unknown as { __perfNodes?: number; __perfStop?: boolean }).__perfNodes = count; + (window as unknown as { __perfStop?: boolean }).__perfStop = false; + + const enterInit: KeyboardEventInit & { keyCode?: number; which?: number } = { + key: "Enter", + code: "Enter", + keyCode: 13, + which: 13, + bubbles: true, + cancelable: true, + }; + + let bailReason: "ok" | "slow-batch" | "stopped" = "ok"; + + while (count < maxNodes) { + if ((window as unknown as { __perfStop?: boolean }).__perfStop) { + bailReason = "stopped"; + break; + } + + for (const ch of "typing ") { + el.dispatchEvent( + new InputEvent("beforeinput", { + inputType: "insertText", + data: ch, + bubbles: true, + cancelable: true, + }), + ); + } + el.dispatchEvent(new KeyboardEvent("keydown", enterInit)); + count++; + + if (count % checkpoint === 0) { + (window as unknown as { __perfNodes?: number }).__perfNodes = count; + const now = Date.now(); + const batchMs = now - lastCheckpointAt; + lastCheckpointAt = now; + if (batchMs > slowestBatchMs) slowestBatchMs = batchMs; + samples.push({ nodes: count, elapsedMs: now - tStart }); + if (wallMode && batchMs > batchTimeoutMs) { + bailReason = "slow-batch"; + break; + } + // Yield once per checkpoint, not per cycle: lets the browser paint, + // the outer CDP poller fire, and __perfStop become visible — but + // doesn't cap throughput at 1 node/frame (~60Hz) the way a per-cycle + // rAF would. Engine cost between checkpoints is now measured at + // full speed, which is the point of this test. + await new Promise((r) => requestAnimationFrame(r)); + } + } + return { samples, bailReason, finalCount: count, slowestBatchMs }; + }, + { + maxNodes: EFFECTIVE_MAX_NODES, + checkpoint: NODECOUNT_CHECKPOINT, + selector: cfg.selector, + initialN: n, + wallMode: WALL_MODE, + batchTimeoutMs: WALL_BATCH_TIMEOUT_MS, + }, + ); + + nodeSamples.push(...browserSamples.samples); + n = browserSamples.finalCount; + wall.nodes = n; + wall.slowestBatchMs = browserSamples.slowestBatchMs; + if (WALL_MODE && wall.reason === "ok") { + if (browserSamples.bailReason === "slow-batch") { + wall.reason = "slow-batch"; + } else if (browserSamples.bailReason === "stopped") { + // outer monitor already set wall.reason (heap, etc.); leave as-is + } else if (n >= EFFECTIVE_MAX_NODES) { + wall.reason = "max-nodes"; + } + } + } catch (err) { + if (WALL_MODE) { + wall.reason = "crash"; + // eslint-disable-next-line no-console + console.log(`[perf:${cfg.key}:wall] renderer crash / evaluate rejected: ${String(err)}`); + } else { + throw err; + } + } finally { + clearInterval(metricInterval); + wall.elapsedMs = Date.now() - start; + + const perfFile = WALL_MODE ? `${cfg.key}-stress-wall-perfMetrics.json` : cfg.perfMetricsFile; + const nodeFile = WALL_MODE ? `${cfg.key}-stress-wall-nodecount.json` : cfg.nodeCountFile; + writeFileSync(join(RESULTS_DIR, perfFile), JSON.stringify(perfSamples, null, 2)); + writeFileSync(join(RESULTS_DIR, nodeFile), JSON.stringify(nodeSamples, null, 2)); + if (WALL_MODE) { + writeFileSync( + join(RESULTS_DIR, `${cfg.key}-stress-wall-meta.json`), + JSON.stringify(wall, null, 2), + ); + // eslint-disable-next-line no-console + console.log( + `[perf:${cfg.key}:wall] reason=${wall.reason} nodes=${wall.nodes} elapsedMs=${wall.elapsedMs} slowestBatchMs=${wall.slowestBatchMs} heapBytes=${wall.lastHeapBytes}`, + ); + } else { + // eslint-disable-next-line no-console + console.log( + `[perf:${cfg.key}] ${nodeSamples.length} node samples, ${perfSamples.length} perf samples, final nodes=${n}`, + ); + } + } + + await ctx.close(); +}); diff --git a/articles/react-prosemirror/editors/lib/perf-gutter-style.ts b/articles/react-prosemirror/editors/lib/perf-gutter-style.ts new file mode 100644 index 0000000..d4616e8 --- /dev/null +++ b/articles/react-prosemirror/editors/lib/perf-gutter-style.ts @@ -0,0 +1,93 @@ +/** + * Shared visual styling for the perf-v{3,4,5}{,-nv,-snv} nodeviews. + * + * Goal: every paragraph carries a visible "authorship gutter" (avatar + chip) + * plus a debug pill (`ctx=N` for the -nv reactive variants, `static` for the + * -snv variants). Same shape across react-prosemirror, vanilla PM, and Tiptap + * pages so cross-impl manual testing actually shows what each nodeview is + * doing. + */ +import type { CSSProperties } from "react"; + +const LETTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; + +export const ctxLetter = (n: number): string => LETTERS[((n % 26) + 26) % 26]; + +export const CTX_AVATAR_BG = (n: number): string => `hsl(${(n * 53) % 360}, 65%, 55%)`; + +export const STATIC_AVATAR_BG = "#94a3b8"; // slate-400 + +export const paragraphRowStyle: CSSProperties = { + display: "flex", + alignItems: "baseline", + gap: 10, + margin: "6px 0", +}; + +export const gutterStyle: CSSProperties = { + display: "inline-flex", + alignItems: "center", + gap: 6, + flexShrink: 0, + userSelect: "none", +}; + +export const contentColStyle: CSSProperties = { + flex: 1, + minWidth: 0, +}; + +export const avatarStyle = (bg: string): CSSProperties => ({ + display: "inline-flex", + alignItems: "center", + justifyContent: "center", + width: 22, + height: 22, + borderRadius: "50%", + background: bg, + color: "white", + fontWeight: 600, + fontSize: 12, + fontFamily: "system-ui, -apple-system, sans-serif", + lineHeight: 1, +}); + +export const ctxPillStyle: CSSProperties = { + display: "inline-block", + fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", + fontSize: 11, + padding: "2px 6px", + borderRadius: 4, + background: "#eef2ff", + color: "#3730a3", + border: "1px solid #c7d2fe", + lineHeight: 1.2, +}; + +export const staticPillStyle: CSSProperties = { + display: "inline-block", + fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace", + fontSize: 11, + padding: "2px 6px", + borderRadius: 4, + background: "#f1f5f9", + color: "#475569", + border: "1px solid #cbd5e1", + lineHeight: 1.2, +}; + +export const ctxDotStyle = (n: number): CSSProperties => ({ + display: "inline-block", + width: 8, + height: 8, + borderRadius: "50%", + background: CTX_AVATAR_BG(n), +}); + +export const staticDotStyle: CSSProperties = { + display: "inline-block", + width: 8, + height: 8, + borderRadius: "50%", + background: STATIC_AVATAR_BG, +}; diff --git a/articles/react-prosemirror/editors/perf-v3-snv/page.tsx b/articles/react-prosemirror/editors/perf-v3-snv/page.tsx new file mode 100644 index 0000000..90f3818 --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v3-snv/page.tsx @@ -0,0 +1,221 @@ +"use client"; + +/** + * perf-v3-snv — react-prosemirror with a STATIC React nodeview. + * + * Sibling of perf-v3-nv (which subscribes to PerfContext via useContext). + * The nodeview here: + * - has no context subscription + * - has no state, no effects + * - renders a fixed inline decoration + content area + * - is memoized: prev.nodeProps.node === next.nodeProps.node && prev.children === next.children + * + * Goal: measure the "realistic custom nodeview" cost — what you'd pay for + * something like an image-with-caption block — without the pathological + * context-flip rerender behavior of perf-v3-nv. + */ +import { + type NodeViewComponentProps, + ProseMirror, + ProseMirrorDoc, + reactKeys, +} from "@handlewithcare/react-prosemirror"; +import { baseKeymap } from "prosemirror-commands"; +import { history, redo, undo } from "prosemirror-history"; +import { keymap } from "prosemirror-keymap"; +import { schema as basicSchema } from "prosemirror-schema-basic"; +import { EditorState, type Transaction } from "prosemirror-state"; +import { type CSSProperties, memo, useEffect, useState } from "react"; +import { + avatarStyle, + contentColStyle, + gutterStyle, + paragraphRowStyle, + STATIC_AVATAR_BG, + staticDotStyle, + staticPillStyle, +} from "@/lib/perf-gutter-style"; + +const StaticParagraphView = memo( + function StaticParagraphView(props: NodeViewComponentProps) { + const { ref, children, nodeProps, ...domAttrs } = props; + const rowStyle: CSSProperties = { ...paragraphRowStyle, ...(domAttrs.style ?? {}) }; + return ( +

+ + P + static + + + + {children} + +

+ ); + }, + (prev, next) => prev.nodeProps.node === next.nodeProps.node && prev.children === next.children, +); + +function readNumberParam(name: string): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get(name); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +function readContentParam(): "plain" | "tech" { + if (typeof window === "undefined") return "plain"; + const raw = new URLSearchParams(window.location.search).get("content"); + return raw === "tech" ? "tech" : "plain"; +} + +// Inline diagram (SVG, two boxes + edge — stands in for an architecture diagram). +const DIAGRAM_SVG = + "data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20viewBox%3D%220%200%20240%20120%22%3E%3Crect%20width%3D%22240%22%20height%3D%22120%22%20fill%3D%22%23f6f6f6%22%20stroke%3D%22%23ccc%22/%3E%3Crect%20x%3D%2220%22%20y%3D%2230%22%20width%3D%2260%22%20height%3D%2240%22%20fill%3D%22%23dbe9ff%22%20stroke%3D%22%234a90e2%22/%3E%3Crect%20x%3D%22160%22%20y%3D%2230%22%20width%3D%2260%22%20height%3D%2240%22%20fill%3D%22%23ffe1d6%22%20stroke%3D%22%23e2734a%22/%3E%3Cline%20x1%3D%2280%22%20y1%3D%2250%22%20x2%3D%22160%22%20y2%3D%2250%22%20stroke%3D%22%23555%22%20stroke-width%3D%222%22/%3E%3Ctext%20x%3D%2250%22%20y%3D%2255%22%20text-anchor%3D%22middle%22%20font-family%3D%22monospace%22%20font-size%3D%2210%22%3EReact%3C/text%3E%3Ctext%20x%3D%22190%22%20y%3D%2255%22%20text-anchor%3D%22middle%22%20font-family%3D%22monospace%22%20font-size%3D%2210%22%3EPM%3C/text%3E%3C/svg%3E"; + +const TOPICS = [ + "Schema design", + "Transaction pipeline", + "Selection mapping", + "Plugin composition", + "View synchronization", + "Decoration strategy", + "NodeView lifecycle", + "Cursor anchoring", + "Mark application", + "Step inversion", + "History coalescing", + "Input rules", +]; + +const INTROS = [ + "The ${t} subsystem coordinates every state transition that touches the document.", + "Understanding ${t} requires walking through how transactions flow from input handlers to the view.", + "${t} is one of the trickier parts of ProseMirror to get right, because the contract crosses several layers.", + "Most performance regressions in ProseMirror-based editors trace back to ${t} being invoked too eagerly.", +]; + +const BODIES = [ + "Each transaction produces a derived state by applying steps to the previous document. The view then reconciles its DOM against the new state, reusing nodes wherever the descriptor hierarchy matches. When custom NodeViews are involved, the diff has to consult each NodeView's update() callback to decide whether to replace the DOM or keep it.", + "Position arithmetic in ProseMirror is byte-offset based: a paragraph of N characters occupies positions 0..N+1 (the +1 for the closing token). Mapping a position across a transaction means walking the ReplaceStep map, which is generally O(log n) but degenerates to O(n) when the transaction touches many siblings.", + "Collaboration plugins layer on top of the transaction pipeline by tagging every step with a client ID. When remote steps arrive, they are rebased against any local steps that have been applied since the last sync point. This is where prosemirror-collab does most of its work, and where memory pressure tends to manifest in long-lived editing sessions.", + "Decorations are a side-channel that the view honors but the state never sees. Inline decorations are cheap; widget decorations that render arbitrary DOM get expensive fast when the document is large, because the view has to render them on every redraw of the affected range.", +]; + +const CODES = [ + "const tr = state.tr;\ntr.replaceWith(from, to, schema.nodes.paragraph.create());\ndispatch(tr);", + "view.someProp('handleKeyDown', (view, event) => {\n if (event.key !== 'Enter') return false;\n return splitListItem(schema.nodes.list_item)(view.state, view.dispatch);\n});", + "const plugin = new Plugin({\n state: {\n init: () => DecorationSet.empty,\n apply: (tr, set) => set.map(tr.mapping, tr.doc),\n },\n});", + "addNodeView() {\n return ReactNodeViewRenderer(CalloutView, {\n contentDOMElementTag: 'div',\n });\n}", +]; + +const EXPLAINS = [ + "Note that the dispatch above runs synchronously inside the current event tick — any React state updates triggered by it will batch with the rest of the keystroke handler.", + "If you skip the explicit mapping step, your decoration positions will drift the first time a remote collaborator inserts content above the anchor.", + "The plugin state is a DecorationSet, which is structurally shared across transactions; only the changed range allocates new objects.", + "Returning false from stopEvent lets ProseMirror handle the event through its normal keymap path, which is usually what you want unless the NodeView genuinely consumes the input itself.", +]; + +const QUOTES = [ + "Don't reach into view.dom directly during a transaction — the view's reconciliation hasn't run yet, so the DOM you'd be querying is stale.", + "Treat every NodeView's update() as a hot path: if it doesn't bail out cheaply on equal-content cases, large documents will pay for it on every keystroke.", + "Marks are not paragraphs; their position mapping rules differ in subtle ways, especially around the start/end of inline content.", + "A plugin that subscribes to every transaction without filtering is the single most common cause of cubic-time slowdowns at high node counts.", +]; + +const CLOSINGS = [ + "We will revisit this pattern in the next section when we discuss undo coalescing.", + "These constraints are easier to internalize once you've seen them violated in a production codebase.", + "The takeaway: pay the cost at construction time, never on every keystroke.", + "If your editor needs to scale past ~2 000 nodes with React NodeViews, this is the layer to instrument first.", +]; + +function buildTechNodes(n: number) { + const ns = basicSchema.nodes; + const out: ReturnType[] = []; + let section = 0; + const pick = (arr: readonly T[]): T => arr[section % arr.length]; + const fill = (tpl: string, t: string) => tpl.replace(/\$\{t\}/g, t); + while (out.length + 9 <= n) { + const topic = pick(TOPICS); + out.push( + ns.heading.create({ level: 2 }, basicSchema.text(`${section + 1}. ${topic}`)), + ns.paragraph.create(null, basicSchema.text(fill(pick(INTROS), topic))), + ns.paragraph.create(null, basicSchema.text(pick(BODIES))), + ns.code_block.create(null, basicSchema.text(pick(CODES))), + ns.paragraph.create(null, basicSchema.text(pick(EXPLAINS))), + ns.blockquote.create(null, ns.paragraph.create(null, basicSchema.text(pick(QUOTES)))), + ns.paragraph.create(null, ns.image.create({ src: DIAGRAM_SVG })), + ns.paragraph.create(null, basicSchema.text(pick(CLOSINGS))), + ns.horizontal_rule.create(), + ); + section++; + } + while (out.length < n) out.push(ns.paragraph.create()); + return out; +} + +function buildInitialState(n: number, content: "plain" | "tech"): EditorState { + const nodes = + content === "tech" && n > 0 + ? buildTechNodes(n) + : Array.from({ length: n }, () => basicSchema.nodes.paragraph.create()); + const doc = nodes.length > 0 ? basicSchema.nodes.doc.create(null, nodes) : undefined; + return EditorState.create({ + doc, + schema: basicSchema, + plugins: [ + reactKeys(), + history(), + keymap({ + "Mod-z": undo, + "Mod-y": redo, + "Mod-Shift-z": redo, + ...baseKeymap, + }), + ], + }); +} + +export default function PerfV3SnvPage() { + const [state, setState] = useState(() => + buildInitialState(readNumberParam("n"), readContentParam()), + ); + + useEffect(() => { + (window as unknown as { __perfNodes?: number }).__perfNodes = state.doc.childCount; + }, [state.doc.childCount]); + + useEffect(() => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + setState((s: EditorState) => { + const paragraphs = Array.from({ length: k }, () => basicSchema.nodes.paragraph.create()); + const tr = s.tr.insert(s.doc.content.size, paragraphs); + return s.apply(tr); + }); + }; + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + }; + }, []); + + return ( +
+

+ perf-v3-snv — react-prosemirror + static React nodeview +

+

+ Memoized React nodeview with no context, no state. Each paragraph renders a static {""}{" "} + + content area. +

+ setState((s) => s.apply(tr))} + nodeViewComponents={{ paragraph: StaticParagraphView }} + > + + +
+ ); +} diff --git a/articles/react-prosemirror/editors/perf-v3/page.tsx b/articles/react-prosemirror/editors/perf-v3/page.tsx new file mode 100644 index 0000000..b0169be --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v3/page.tsx @@ -0,0 +1,85 @@ +"use client"; + +/** + * Minimal react-prosemirror harness — perf-v3. + * + * No custom nodeviews. react-prosemirror renders paragraphs via its internal + * default — the true "out-of-the-box" baseline for the library. + * + * Plugins: ONLY `reactKeys()` (required by the library) + `history` + + * `baseKeymap`. Schema: vanilla `prosemirror-schema-basic`. No collab, no + * decorations, no extensions. + * + * Query params: + * ?n= — seed N empty paragraphs into the initial doc. + */ +import { ProseMirror, ProseMirrorDoc, reactKeys } from "@handlewithcare/react-prosemirror"; +import { baseKeymap } from "prosemirror-commands"; +import { history, redo, undo } from "prosemirror-history"; +import { keymap } from "prosemirror-keymap"; +import { schema as basicSchema } from "prosemirror-schema-basic"; +import { EditorState, type Transaction } from "prosemirror-state"; +import { useEffect, useState } from "react"; + +function readInitialN(): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get("n"); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +export default function PerfV3Page() { + const [state, setState] = useState(() => { + const n = readInitialN(); + const paragraphs = Array.from({ length: n }, () => basicSchema.nodes.paragraph.create()); + const doc = n > 0 ? basicSchema.nodes.doc.create(null, paragraphs) : undefined; + return EditorState.create({ + doc, + schema: basicSchema, + plugins: [ + reactKeys(), + history(), + keymap({ + "Mod-z": undo, + "Mod-y": redo, + "Mod-Shift-z": redo, + ...baseKeymap, + }), + ], + }); + }); + + useEffect(() => { + (window as unknown as { __perfNodes?: number }).__perfNodes = state.doc.childCount; + }, [state.doc.childCount]); + + useEffect(() => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + setState((s: EditorState) => { + const paragraphs = Array.from({ length: k }, () => basicSchema.nodes.paragraph.create()); + const tr = s.tr.insert(s.doc.content.size, paragraphs); + return s.apply(tr); + }); + }; + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + }; + }, []); + + return ( +
+

perf-v3 — barebone react-prosemirror

+

+ No Yjs · No Hocuspocus · No extensions · no custom nodeviews · plain + `prosemirror-schema-basic` + `history` + `baseKeymap`. +

+ setState((s: EditorState) => s.apply(tr))} + > + + +
+ ); +} diff --git a/articles/react-prosemirror/editors/perf-v4-snv/page.tsx b/articles/react-prosemirror/editors/perf-v4-snv/page.tsx new file mode 100644 index 0000000..e736177 --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v4-snv/page.tsx @@ -0,0 +1,130 @@ +"use client"; + +/** + * perf-v4-snv — vanilla ProseMirror with a STATIC pure-DOM nodeview. + * + * Sibling of perf-v4-nv (which writes window.__PERF_CTX into dataset.ctx on + * every transaction). The nodeview here mounts once and never updates — no + * context dependency, no update() handler reacting to outside state. + * + * Goal: floor comparison for "static custom node" — the absolute cheapest + * possible custom NodeView implementation. + */ +import { baseKeymap } from "prosemirror-commands"; +import { history, redo, undo } from "prosemirror-history"; +import { keymap } from "prosemirror-keymap"; +import { schema as basicSchema } from "prosemirror-schema-basic"; +import { EditorState } from "prosemirror-state"; +import { EditorView, type NodeView } from "prosemirror-view"; +import { useEffect, useRef } from "react"; +import { STATIC_AVATAR_BG } from "@/lib/perf-gutter-style"; + +function readNumberParam(name: string): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get(name); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +class StaticParagraphView implements NodeView { + dom: HTMLParagraphElement; + contentDOM: HTMLElement; + constructor() { + const p = document.createElement("p"); + p.dataset.static = "1"; + p.style.cssText = "display:flex;align-items:baseline;gap:10px;margin:6px 0;"; + + const gutter = document.createElement("span"); + gutter.setAttribute("contenteditable", "false"); + gutter.dataset.perfDecorations = ""; + gutter.style.cssText = + "display:inline-flex;align-items:center;gap:6px;flex-shrink:0;user-select:none;"; + + const avatar = document.createElement("span"); + avatar.textContent = "P"; + avatar.style.cssText = + "display:inline-flex;align-items:center;justify-content:center;" + + "width:22px;height:22px;border-radius:50%;color:white;font-weight:600;" + + "font-size:12px;font-family:system-ui,-apple-system,sans-serif;line-height:1;" + + `background:${STATIC_AVATAR_BG};`; + gutter.appendChild(avatar); + + const pill = document.createElement("span"); + pill.textContent = "static"; + pill.style.cssText = + "display:inline-block;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;" + + "font-size:11px;padding:2px 6px;border-radius:4px;background:#f1f5f9;" + + "color:#475569;border:1px solid #cbd5e1;line-height:1.2;"; + gutter.appendChild(pill); + + const dot = document.createElement("span"); + dot.style.cssText = `display:inline-block;width:8px;height:8px;border-radius:50%;background:${STATIC_AVATAR_BG};`; + gutter.appendChild(dot); + + p.appendChild(gutter); + + const content = document.createElement("span"); + content.style.cssText = "flex:1;min-width:0;"; + p.appendChild(content); + + this.dom = p; + this.contentDOM = content; + } + // No update() handler — node is static. +} + +export default function PerfV4SnvPage() { + const hostRef = useRef(null); + + useEffect(() => { + const host = hostRef.current; + if (!host) return; + + const n = readNumberParam("n"); + const paragraphs = Array.from({ length: n }, () => basicSchema.nodes.paragraph.create()); + const doc = n > 0 ? basicSchema.nodes.doc.create(null, paragraphs) : undefined; + + const state = EditorState.create({ + doc, + schema: basicSchema, + plugins: [ + history(), + keymap({ + "Mod-z": undo, + "Mod-y": redo, + "Mod-Shift-z": redo, + ...baseKeymap, + }), + ], + }); + + const view = new EditorView(host, { + state, + nodeViews: { paragraph: () => new StaticParagraphView() }, + }); + + (window as unknown as { __perfNodes?: number }).__perfNodes = view.state.doc.childCount; + + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + const paragraphs = Array.from({ length: k }, () => basicSchema.nodes.paragraph.create()); + view.dispatch(view.state.tr.insert(view.state.doc.content.size, paragraphs)); + (window as unknown as { __perfNodes?: number }).__perfNodes = view.state.doc.childCount; + }; + + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + view.destroy(); + }; + }, []); + + return ( +
+

perf-v4-snv — vanilla PM + static DOM nodeview

+

+ Pure-DOM NodeView with no update() handler. Renders a static {""} + content area. +

+
+
+ ); +} diff --git a/articles/react-prosemirror/editors/perf-v4/page.tsx b/articles/react-prosemirror/editors/perf-v4/page.tsx new file mode 100644 index 0000000..a622f81 --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v4/page.tsx @@ -0,0 +1,80 @@ +"use client"; + +/** + * Vanilla ProseMirror harness — perf-v4. + * + * Mounts a bare `EditorView` directly on a DOM ref. No React reconciliation + * of editor nodes: PM manages the DOM imperatively, React only mounts/unmounts + * the host div. This is the absolute floor for "react-prosemirror layer cost" + * since there is no react-prosemirror layer at all. + * + * Plugins: history + baseKeymap. Schema: `prosemirror-schema-basic`. + */ +import { useEffect, useRef } from "react"; + +import { baseKeymap } from "prosemirror-commands"; +import { history, redo, undo } from "prosemirror-history"; +import { keymap } from "prosemirror-keymap"; +import { schema as basicSchema } from "prosemirror-schema-basic"; +import { EditorState } from "prosemirror-state"; +import { EditorView } from "prosemirror-view"; + +function readInitialN(): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get("n"); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +export default function PerfV4Page() { + const hostRef = useRef(null); + + useEffect(() => { + const host = hostRef.current; + if (!host) return; + + const n = readInitialN(); + const paragraphs = Array.from({ length: n }, () => basicSchema.nodes.paragraph.create()); + const doc = n > 0 ? basicSchema.nodes.doc.create(null, paragraphs) : undefined; + + const state = EditorState.create({ + doc, + schema: basicSchema, + plugins: [ + history(), + keymap({ + "Mod-z": undo, + "Mod-y": redo, + "Mod-Shift-z": redo, + ...baseKeymap, + }), + ], + }); + + const view = new EditorView(host, { state }); + + (window as unknown as { __perfNodes?: number }).__perfNodes = view.state.doc.childCount; + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + const paragraphs = Array.from({ length: k }, () => basicSchema.nodes.paragraph.create()); + view.dispatch(view.state.tr.insert(view.state.doc.content.size, paragraphs)); + (window as unknown as { __perfNodes?: number }).__perfNodes = view.state.doc.childCount; + }; + + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + view.destroy(); + }; + }, []); + + return ( +
+

perf-v4 — vanilla ProseMirror

+

+ No React reconciliation · plain EditorView mounted on a div ref · + `prosemirror-schema-basic` + `history` + `baseKeymap`. +

+
+
+ ); +} diff --git a/articles/react-prosemirror/editors/perf-v5-snv/page.tsx b/articles/react-prosemirror/editors/perf-v5-snv/page.tsx new file mode 100644 index 0000000..958c287 --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v5-snv/page.tsx @@ -0,0 +1,96 @@ +"use client"; + +/** + * perf-v5-snv — Tiptap 3 with a STATIC React nodeview (via ReactNodeViewRenderer). + * + * Sibling of perf-v5-nv (which subscribes to PerfContext via useContext). + * The nodeview here has no context, no state — just a memoized component + * that renders a fixed inline + content area. + * + * Goal: measure realistic ReactNodeViewRenderer cost without context-flip + * pathology. + */ +import { Document } from "@tiptap/extension-document"; +import { History } from "@tiptap/extension-history"; +import { Paragraph } from "@tiptap/extension-paragraph"; +import { Text } from "@tiptap/extension-text"; +import { + EditorContent, + NodeViewContent, + NodeViewWrapper, + ReactNodeViewRenderer, + useEditor, +} from "@tiptap/react"; +import { memo, useEffect, useState } from "react"; +import { + avatarStyle, + contentColStyle, + gutterStyle, + paragraphRowStyle, + STATIC_AVATAR_BG, + staticDotStyle, + staticPillStyle, +} from "@/lib/perf-gutter-style"; + +const StaticParagraphView = memo(function StaticParagraphView() { + return ( + + + P + static + + + + + ); +}); + +const StaticParagraph = Paragraph.extend({ + addNodeView() { + return ReactNodeViewRenderer(StaticParagraphView); + }, +}); + +function readNumberParam(name: string): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get(name); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +export default function PerfV5SnvPage() { + const [initialContent] = useState(() => { + const n = readNumberParam("n"); + return n > 0 ? "

".repeat(n) : ""; + }); + + const editor = useEditor({ + immediatelyRender: false, + extensions: [Document, StaticParagraph, Text, History], + content: initialContent, + }); + + useEffect(() => { + if (!editor) return; + (window as unknown as { __perfNodes?: number }).__perfNodes = editor.state.doc.childCount; + + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + editor.chain().focus("end").insertContent("

".repeat(k)).run(); + (window as unknown as { __perfNodes?: number }).__perfNodes = editor.state.doc.childCount; + }; + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + }; + }, [editor]); + + return ( +
+

perf-v5-snv — Tiptap 3 + static React nodeview

+

+ Memoized React nodeview via `ReactNodeViewRenderer`, no context, no state. +

+ +
+ ); +} diff --git a/articles/react-prosemirror/editors/perf-v5/page.tsx b/articles/react-prosemirror/editors/perf-v5/page.tsx new file mode 100644 index 0000000..9513f6d --- /dev/null +++ b/articles/react-prosemirror/editors/perf-v5/page.tsx @@ -0,0 +1,59 @@ +"use client"; + +/** + * Bare-bone Tiptap 3 harness — perf-v5. + * + * `useEditor` with the absolute minimum extensions: Document + Paragraph + + * Text + History. No collab, no decorations, no custom marks/nodes. Compares + * Tiptap's overhead vs vanilla ProseMirror (v4) and vs react-prosemirror (v3) + * at the same scale. + */ +import { Document } from "@tiptap/extension-document"; +import { History } from "@tiptap/extension-history"; +import { Paragraph } from "@tiptap/extension-paragraph"; +import { Text } from "@tiptap/extension-text"; +import { EditorContent, useEditor } from "@tiptap/react"; +import { useEffect, useState } from "react"; + +function readInitialN(): number { + if (typeof window === "undefined") return 0; + const raw = new URLSearchParams(window.location.search).get("n"); + if (!raw) return 0; + const n = Number.parseInt(raw, 10); + return Number.isFinite(n) && n > 0 ? n : 0; +} + +export default function PerfV5Page() { + const [initialContent] = useState(() => { + const n = readInitialN(); + return n > 0 ? "

".repeat(n) : ""; + }); + + const editor = useEditor({ + immediatelyRender: false, + extensions: [Document, Paragraph, Text, History], + content: initialContent, + }); + + useEffect(() => { + if (!editor) return; + (window as unknown as { __perfNodes?: number }).__perfNodes = editor.state.doc.childCount; + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = (k: number) => { + editor.chain().focus("end").insertContent("

".repeat(k)).run(); + (window as unknown as { __perfNodes?: number }).__perfNodes = editor.state.doc.childCount; + }; + return () => { + (window as unknown as { __perfGrow?: (k: number) => void }).__perfGrow = undefined; + }; + }, [editor]); + + return ( +
+

perf-v5 — bare-bone Tiptap 3

+

+ Document + Paragraph + Text + History only · no collab, no decorations. +

+ +
+ ); +} diff --git a/articles/react-prosemirror/playwright.perf.config.ts b/articles/react-prosemirror/playwright.perf.config.ts new file mode 100644 index 0000000..a43a893 --- /dev/null +++ b/articles/react-prosemirror/playwright.perf.config.ts @@ -0,0 +1,51 @@ +/// +import { defineConfig, devices } from "@playwright/test"; +import { + EDITOR_IMPL, + GLOBALTIMEOUT, + PERF_SERVER_PORT, + PERF_WEB_PORT, + TIMEOUT, +} from "./e2e/perf/constants"; + +export default defineConfig({ + testDir: "./e2e/perf", + testMatch: /(stress|nodeview|keystroke-ramp)\.spec\.ts$/, + fullyParallel: false, + workers: 1, + retries: 0, + reporter: [["list"]], + timeout: TIMEOUT, + globalTimeout: GLOBALTIMEOUT, + use: { + baseURL: `http://localhost:${PERF_WEB_PORT}`, + trace: "off", + video: "off", + screenshot: "off", + }, + projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }], + webServer: [ + { + command: "pnpm --filter @proof/server dev", + url: `http://localhost:${PERF_SERVER_PORT}/health`, + timeout: 120_000, + reuseExistingServer: false, + env: { + PORT: String(PERF_SERVER_PORT), + EDITOR_IMPL, + WEB_ORIGIN: `http://localhost:${PERF_WEB_PORT}`, + PROOF_SHARE_RATELIMIT_DISABLED: "1", + }, + }, + { + command: `pnpm --filter @proof/web exec next start -p ${PERF_WEB_PORT}`, + url: `http://localhost:${PERF_WEB_PORT}`, + timeout: 120_000, + reuseExistingServer: false, + env: { + NEXT_PUBLIC_EDITOR_IMPL: EDITOR_IMPL, + NEXT_PUBLIC_API_URL: `http://localhost:${PERF_SERVER_PORT}`, + }, + }, + ], +}); diff --git a/articles/react-prosemirror/scripts/run-editor-perf.ts b/articles/react-prosemirror/scripts/run-editor-perf.ts new file mode 100644 index 0000000..89d3cf6 --- /dev/null +++ b/articles/react-prosemirror/scripts/run-editor-perf.ts @@ -0,0 +1,45 @@ +/// +import { spawnSync } from "node:child_process"; + +type EditorImpl = "v1" | "v2" | "v3" | "v4" | "v5"; + +const impls = (process.env.PERF_IMPLS ?? "v1,v2") + .split(",") + .map((s) => s.trim()) + .filter(Boolean) as EditorImpl[]; + +// The web bundle bakes NEXT_PUBLIC_API_URL at build time. Must match the port +// the perf playwright config will boot the server on (PERF_SERVER_PORT, default +// 4100), otherwise the client falls back to localhost:4000 and every API call +// hits an unbound port → "Document not found". +const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; +const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; +const API_URL = `http://localhost:${PERF_SERVER_PORT}`; + +for (const impl of impls) { + console.log(`\n=== building @proof/web for ${impl} ===\n`); + run("pnpm", ["--filter", "@proof/web", "build"], { + NEXT_PUBLIC_EDITOR_IMPL: impl, + NEXT_PUBLIC_API_URL: API_URL, + }); + + console.log(`\n=== running perf for ${impl} ===\n`); + run("pnpm", ["exec", "playwright", "test", "--config=playwright.perf.config.ts"], { + EDITOR_IMPL: impl, + NEXT_PUBLIC_EDITOR_IMPL: impl, + NEXT_PUBLIC_API_URL: API_URL, + PERF_SERVER_PORT, + PERF_WEB_PORT, + }); +} + +console.log("\n=== generating graphs ===\n"); +run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], {}); + +function run(cmd: string, args: string[], env: Record): void { + const result = spawnSync(cmd, args, { + stdio: "inherit", + env: { ...process.env, ...env }, + }); + if (result.status !== 0) process.exit(result.status ?? 1); +} diff --git a/articles/react-prosemirror/scripts/run-keystroke-ramp.ts b/articles/react-prosemirror/scripts/run-keystroke-ramp.ts new file mode 100644 index 0000000..79000b4 --- /dev/null +++ b/articles/react-prosemirror/scripts/run-keystroke-ramp.ts @@ -0,0 +1,78 @@ +/// +/** + * Keystroke-ramp orchestrator — runs `e2e/perf/keystroke-ramp.spec.ts` across + * the -snv impls (v3-snv / v4-snv / v5-snv), one Playwright invocation per + * impl. The spec sweeps n internally and bails when typing becomes laggy, so + * this script just iterates impls and then generates the comparison graph. + * + * Usage: + * pnpm perf:keystroke-ramp + * PERF_RAMP_IMPLS=v3-snv pnpm perf:keystroke-ramp + * PERF_RAMP_STEP=250 PERF_LAG_P95_MS=80 pnpm perf:keystroke-ramp + */ +import { spawnSync } from "node:child_process"; + +type RampImpl = "v3" | "v4" | "v5" | "v3-snv" | "v4-snv" | "v5-snv"; + +const DEFAULT_IMPLS: RampImpl[] = ["v3-snv", "v4-snv", "v5-snv"]; +const ALL_IMPLS: readonly RampImpl[] = ["v3", "v4", "v5", "v3-snv", "v4-snv", "v5-snv"]; +const IMPLS = parseList(process.env.PERF_RAMP_IMPLS, DEFAULT_IMPLS, ALL_IMPLS); + +const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; +const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; +const API_URL = `http://localhost:${PERF_SERVER_PORT}`; + +console.log("\n=== building @proof/web (shared bundle for -snv routes) ===\n"); +run("pnpm", ["--filter", "@proof/web", "build"], { + NEXT_PUBLIC_EDITOR_IMPL: "v3", + NEXT_PUBLIC_API_URL: API_URL, +}); + +for (const impl of IMPLS) { + console.log(`\n=== running keystroke-ramp for ${impl} ===\n`); + run( + "pnpm", + [ + "exec", + "playwright", + "test", + "--config=playwright.perf.config.ts", + "e2e/perf/keystroke-ramp.spec.ts", + ], + { + EDITOR_IMPL: impl, + NEXT_PUBLIC_EDITOR_IMPL: impl, + NEXT_PUBLIC_API_URL: API_URL, + PERF_SERVER_PORT, + PERF_WEB_PORT, + }, + ); +} + +console.log("\n=== generating keystroke-ramp graph ===\n"); +run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], { + GRAPH_IMPLS: IMPLS.join(","), + GRAPH_SCENARIO: "keystroke-ramp", +}); + +function run(cmd: string, args: string[], env: Record): void { + const result = spawnSync(cmd, args, { + stdio: "inherit", + env: { ...process.env, ...env }, + }); + if (result.status !== 0) process.exit(result.status ?? 1); +} + +function parseList( + raw: string | undefined, + fallback: T[], + allowed: readonly T[] = fallback, +): T[] { + if (!raw) return fallback; + const allowedSet = allowed as readonly string[]; + const parsed = raw + .split(",") + .map((s) => s.trim()) + .filter((s): s is T => allowedSet.includes(s)); + return parsed.length > 0 ? parsed : fallback; +} diff --git a/articles/react-prosemirror/scripts/run-nodeview-perf.ts b/articles/react-prosemirror/scripts/run-nodeview-perf.ts new file mode 100644 index 0000000..a568d53 --- /dev/null +++ b/articles/react-prosemirror/scripts/run-nodeview-perf.ts @@ -0,0 +1,122 @@ +/// +/** + * Nodeview perf orchestrator — runs the v3-nv / v4-nv / v5-nv pages across + * the four scenarios defined in `e2e/perf/nodeview.spec.ts`. + * + * Builds @proof/web once (the *-nv pages are static React routes hardcoded in + * the bundle, so NEXT_PUBLIC_EDITOR_IMPL doesn't affect them — same trick as + * `scripts/run-v3-v4-perf.ts`). + * + * Usage: + * pnpm exec tsx scripts/run-nodeview-perf.ts + * PERF_MAX_NODES=500 pnpm exec tsx scripts/run-nodeview-perf.ts + * PERF_NV_SCENARIOS=typing,ctx-flip pnpm exec tsx scripts/run-nodeview-perf.ts + * PERF_NV_IMPLS=v3-nv,v5-nv pnpm exec tsx scripts/run-nodeview-perf.ts + */ +import { spawnSync } from "node:child_process"; + +type NvImpl = + | "v3-nv" + | "v4-nv" + | "v5-nv" + | "v3" + | "v4" + | "v5" + | "v3-snv" + | "v4-snv" + | "v5-snv"; +type Scenario = + | "typing" + | "cold-load" + | "cursor" + | "ctx-flip" + | "keystroke-latency" + | "keystroke-inp"; + +const DEFAULT_IMPLS: NvImpl[] = ["v3-nv", "v4-nv", "v5-nv"]; +const ALL_IMPLS: NvImpl[] = [ + "v3-nv", + "v4-nv", + "v5-nv", + "v3", + "v4", + "v5", + "v3-snv", + "v4-snv", + "v5-snv", +]; +const ALL_SCENARIOS: Scenario[] = [ + "typing", + "cold-load", + "cursor", + "ctx-flip", + "keystroke-latency", + "keystroke-inp", +]; + +const IMPLS: NvImpl[] = parseList(process.env.PERF_NV_IMPLS, DEFAULT_IMPLS, ALL_IMPLS); +const SCENARIOS: Scenario[] = parseList(process.env.PERF_NV_SCENARIOS, ALL_SCENARIOS); + +const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; +const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; +const API_URL = `http://localhost:${PERF_SERVER_PORT}`; + +console.log("\n=== building @proof/web (single bundle for v{3,4,5}-nv routes) ===\n"); +run("pnpm", ["--filter", "@proof/web", "build"], { + NEXT_PUBLIC_EDITOR_IMPL: "v3", + NEXT_PUBLIC_API_URL: API_URL, +}); + +for (const impl of IMPLS) { + for (const scenario of SCENARIOS) { + console.log(`\n=== running perf for ${impl} / ${scenario} ===\n`); + run( + "pnpm", + [ + "exec", + "playwright", + "test", + "--config=playwright.perf.config.ts", + "e2e/perf/nodeview.spec.ts", + ], + { + EDITOR_IMPL: impl, + PERF_SCENARIO: scenario, + NEXT_PUBLIC_EDITOR_IMPL: impl, + NEXT_PUBLIC_API_URL: API_URL, + PERF_SERVER_PORT, + PERF_WEB_PORT, + }, + ); + } +} + +for (const scenario of SCENARIOS) { + console.log(`\n=== generating nodeview graphs (${scenario}) ===\n`); + run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], { + GRAPH_IMPLS: IMPLS.join(","), + GRAPH_SCENARIO: scenario, + }); +} + +function run(cmd: string, args: string[], env: Record): void { + const result = spawnSync(cmd, args, { + stdio: "inherit", + env: { ...process.env, ...env }, + }); + if (result.status !== 0) process.exit(result.status ?? 1); +} + +function parseList( + raw: string | undefined, + fallback: T[], + allowed?: T[], +): T[] { + if (!raw) return fallback; + const validValues = (allowed ?? fallback) as readonly string[]; + const parsed = raw + .split(",") + .map((s) => s.trim()) + .filter((s): s is T => validValues.includes(s)); + return parsed.length > 0 ? parsed : fallback; +} From 3d2b36ab84e695f7b0e75bf3b29bc325e4f42f9b Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Mon, 1 Jun 2026 10:52:01 +0200 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=F0=9F=90=9B=20react-prosemirror=20t?= =?UTF-8?q?est=20cases=20+=20readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 6 + articles/react-prosemirror/README.md | 194 ++ .../react-prosemirror/e2e/perf/constants.ts | 22 + .../e2e/perf/keystroke-ramp.spec.ts | 3 +- .../e2e/perf/nodeview.spec.ts | 13 +- .../react-prosemirror/e2e/perf/stress.spec.ts | 3 +- .../playwright.perf.config.ts | 51 +- .../scripts/run-editor-perf.ts | 67 +- .../scripts/run-keystroke-ramp.ts | 65 +- .../scripts/run-nodeview-perf.ts | 98 +- articles/react-prosemirror/tsconfig.json | 10 + package-lock.json | 2467 +++++++++++++++-- package.json | 21 +- pages/blog/react-prosemirror.tsx | 12 +- pages/perf-react-prosemirror-snv.tsx | 11 + pages/perf-react-prosemirror.tsx | 13 + pages/perf-tiptap-snv.tsx | 11 + pages/perf-tiptap.tsx | 11 + pages/perf-vanilla-prosemirror-snv.tsx | 11 + pages/perf-vanilla-prosemirror.tsx | 11 + ...ndlewithcare+react-prosemirror+3.0.6.patch | 138 + tsconfig.json | 11 +- 22 files changed, 2928 insertions(+), 321 deletions(-) create mode 100644 articles/react-prosemirror/README.md create mode 100644 articles/react-prosemirror/tsconfig.json create mode 100644 pages/perf-react-prosemirror-snv.tsx create mode 100644 pages/perf-react-prosemirror.tsx create mode 100644 pages/perf-tiptap-snv.tsx create mode 100644 pages/perf-tiptap.tsx create mode 100644 pages/perf-vanilla-prosemirror-snv.tsx create mode 100644 pages/perf-vanilla-prosemirror.tsx create mode 100644 patches/@handlewithcare+react-prosemirror+3.0.6.patch diff --git a/.gitignore b/.gitignore index 4983efd..1c41cd6 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,9 @@ public/workbox-* .yalc yalc.lock .vercel + +# react-prosemirror perf benchmark artifacts +articles/react-prosemirror/e2e/perf/results +test-results +playwright-report +*.tsbuildinfo diff --git a/articles/react-prosemirror/README.md b/articles/react-prosemirror/README.md new file mode 100644 index 0000000..3166a89 --- /dev/null +++ b/articles/react-prosemirror/README.md @@ -0,0 +1,194 @@ +# react-prosemirror vs vanilla ProseMirror vs Tiptap 3 — perf harness + +Supporting code for the blog post **[react-prosemirror.tsx](../../pages/blog/react-prosemirror.tsx)** +(`/blog/react-prosemirror`). It benchmarks the same minimal rich-text editor +built three ways and measures what each abstraction layer costs at scale +(memory, script time, layout/recalc, keystroke latency). + +The editors render into the **main blog Next app** as ordinary Pages-Router +routes, and a set of [Playwright](https://playwright.dev/) specs drive them via +the Chrome DevTools Protocol to collect metrics, then render comparison graphs. + +## The three implementations + +| impl | library | route | notes | +| ---- | ------- | ----- | ----- | +| `v3` | [`@handlewithcare/react-prosemirror`](https://github.com/handlewithcarecollective/react-prosemirror) | [`/perf-react-prosemirror`](../../pages/perf-react-prosemirror.tsx) | barebone, no custom nodeviews | +| `v4` | vanilla `prosemirror-view` | [`/perf-vanilla-prosemirror`](../../pages/perf-vanilla-prosemirror.tsx) | no React reconciliation — the floor | +| `v5` | [Tiptap 3](https://tiptap.dev/) | [`/perf-tiptap`](../../pages/perf-tiptap.tsx) | `Document + Paragraph + Text + History` only | + +Each has a **`-snv` ("static nodeview")** sibling that adds a realistic custom +per-paragraph nodeview (authorship gutter: avatar + chip), to measure custom +nodeview cost without context-driven re-render pathology: + +| impl | route | +| ---- | ----- | +| `v3-snv` | [`/perf-react-prosemirror-snv`](../../pages/perf-react-prosemirror-snv.tsx) | +| `v4-snv` | [`/perf-vanilla-prosemirror-snv`](../../pages/perf-vanilla-prosemirror-snv.tsx) | +| `v5-snv` | [`/perf-tiptap-snv`](../../pages/perf-tiptap-snv.tsx) | + +> The reactive `-nv` variants (`v3-nv` / `v4-nv` / `v5-nv`) and the `ctx-flip` +> scenario are referenced by the harness but their pages are **not yet wired**; +> add `editors/perf-v{3,4,5}-nv/page.tsx` + matching `pages/` routes to enable +> them. + +### Page query params + +- `?n=` — seed the doc with `N` paragraphs on load (cold-load / pre-sized runs). +- `?content=tech` — (snv pages) seed richer headings/code/quotes instead of empty paragraphs. + +### Browser hooks + +Every page exposes two `window` hooks the specs rely on: + +- `window.__perfNodes: number` — current top-level child count. +- `window.__perfGrow(k: number)` — append `k` empty paragraphs (used to ramp doc size). + +## Layout + +``` +articles/react-prosemirror/ +├── editors/ # editor React components (source of truth) +│ ├── lib/perf-gutter-style.ts # shared nodeview styling +│ ├── perf-v3/page.tsx # …and v3-snv, v4, v4-snv, v5, v5-snv +├── e2e/perf/ +│ ├── constants.ts # impl matrix, ports, thresholds, routeFor() +│ ├── stress.spec.ts # type-until-MAX_NODES; CDP metric sampling +│ ├── nodeview.spec.ts # scenarios: typing / cold-load / cursor / ctx-flip / keystroke-* +│ ├── keystroke-ramp.spec.ts # ramp doc size until p95 INP > threshold +│ ├── inp-stats.ts # per-interaction INP percentile math +│ └── create-graphs.ts # results JSON → PNG charts (chartjs-node-canvas) +├── scripts/ +│ ├── run-editor-perf.ts # orchestrate stress across v3/v4/v5 +│ ├── run-nodeview-perf.ts # orchestrate nodeview impls × scenarios +│ └── run-keystroke-ramp.ts # orchestrate keystroke-ramp across impls +├── playwright.perf.config.ts # boots the blog (next start / next dev) +└── tsconfig.json # typechecks this harness (excluded from main build) +``` + +The `editors/*/page.tsx` files are the source; the blog routes in +[`pages/perf-*.tsx`](../../pages) are thin `dynamic(..., { ssr: false })` +wrappers around them (client-only, to avoid hydration mismatch from `?n=`). +The `@/lib/*` import alias resolves to `editors/lib/*` (see root `tsconfig.json`). + +## Running + +All commands are run from the **repo root**. The npm scripts default to a +production build (`next build` once, then `next start` on port 3100) for +representative numbers. + +```bash +npm run perf # stress benchmark for v3/v4/v5 + graphs +npm run perf:nodeview # nodeview spec: typing + cold-load scenarios + graphs +npm run perf:keystroke-ramp # keystroke latency ramp for the -snv impls + graphs +npm run perf:test # raw `playwright test` (pass a spec path / EDITOR_IMPL yourself) +``` + +### Fast iteration (dev server, no build) + +```bash +PERF_DEV=1 npm run perf # orchestrator boots `next dev` instead of build+start +# or reuse a server you already have running: +npx next dev -p 3100 & +cd articles/react-prosemirror +EDITOR_IMPL=v3 PERF_MAX_NODES=300 \ + npx playwright test --config=playwright.perf.config.ts e2e/perf/stress.spec.ts +``` + +(`reuseExistingServer` is on, so any server already listening on the perf port +is reused.) + +## Environment variables + +Selection / orchestration: + +| var | default | meaning | +| --- | ------- | ------- | +| `EDITOR_IMPL` | `v1` | which impl a single spec run targets (`v3`/`v4`/`v5`/`-snv`/`-nv`) | +| `PERF_SCENARIO` | `typing` | nodeview scenario: `typing` `cold-load` `cursor` `ctx-flip` `keystroke-latency` `keystroke-inp` | +| `PERF_IMPLS` / `PERF_NV_IMPLS` / `PERF_RAMP_IMPLS` | per script | comma list the orchestrators iterate | +| `PERF_NV_SCENARIOS` | `typing,cold-load` | scenarios `run-nodeview-perf.ts` iterates | +| `PERF_DEV` | – | `1` → `next dev` instead of build+start | +| `PERF_SKIP_BUILD` | – | `1` → reuse an existing production build | + +Tuning (use low values for quick runs): + +| var | default | meaning | +| --- | ------- | ------- | +| `PERF_MAX_NODES` | `2000` (`20000` if `PERF_FULL=1`) | stress/nodeview ceiling | +| `PERF_NODECOUNT_STEP` | `200` | nodes per checkpoint sample | +| `PERF_MEASUREMENT_MS` | `2000` | CDP metric polling interval | +| `PERF_RAMP_STEP` | `500` | nodes added per keystroke-ramp iteration | +| `PERF_RAMP_PRESSES` | `150` | keystrokes measured per iteration | +| `PERF_RAMP_MAX_ITER` | `30` | safety cap on ramp iterations | +| `PERF_LAG_P95_MS` | `100` | p95 INP threshold that defines "laggy" | +| `PERF_TIMEOUT_MS` / `PERF_GLOBAL_TIMEOUT_MS` | 10min / 25min | per-test / whole-run timeouts | +| `PERF_STRESS_WALL` | – | `1` → keep typing until the editor breaks (heap/slow-batch/crash); writes `*-stress-wall-*` sidecars | +| `PERF_WEB_PORT` | `3100` | port the blog is served on | + +**Quick smoke (~1 min, low numbers):** + +```bash +npx next dev -p 3100 & +cd articles/react-prosemirror +for impl in v3 v4 v5; do + EDITOR_IMPL=$impl PERF_MAX_NODES=300 PERF_MEASUREMENT_MS=500 PERF_NODECOUNT_STEP=100 \ + npx playwright test --config=playwright.perf.config.ts e2e/perf/stress.spec.ts +done +``` + +## Output + +Specs write JSON to `e2e/perf/results/` (gitignored): + +- `-perfMetrics.json` — CDP metric time-series (`JSHeapUsedSize`, `ScriptDuration`, `LayoutCount`, `RecalcStyleCount`, `TaskDuration`, `Nodes`). +- `-nodecount.json` — nodes vs elapsed-ms. +- `--*.json`, `-keystroke-ramp-summary.json`, `*.trace.json` — scenario-specific outputs (the trace files load into Chrome DevTools' Performance tab). + +`create-graphs.ts` renders these to per-impl and `combined-*` PNGs in the same +folder. The curated charts that ship with the post live in +[`public/blog/react-prosemirror/`](../../public/blog/react-prosemirror). + +## Patched dependency: react-prosemirror `reactKeys` memory leak + +`@handlewithcare/react-prosemirror@3.0.6` ships a memory leak in its +`reactKeys()` plugin that the `v3`/`v3-snv` benchmarks would otherwise pin on +the library unfairly. We carry the same fix the upstream `proof` app uses, via +[`patch-package`](https://github.com/ds300/patch-package): + +- **Patch file:** [`patches/@handlewithcare+react-prosemirror+3.0.6.patch`](../../patches) +- **Auto-applied** on every install by the root `"postinstall": "patch-package"` script. + +**The bug.** The plugin's `apply(tr, value, …)` returns a freshly allocated +`{ posToKey, keyToPos }` (two new `Map`s) on every document-changing +transaction. React fiber `memoizedState` pins those objects for every memoized +node view, so each *unchanged* node keeps holding the plugin-state snapshot from +the time it last rendered. At `N` nodes this retains `Σ(1..N)` Map entries — +**O(N²)** heap growth — which shows up directly as runaway `JSHeapUsedSize` in +the stress / keystroke-ramp runs. + +**The fix.** Keep stable identity for the outer object *and* its two `Map`s by +mutating them in place: compute the next contents in temporary Maps (so +iteration over the old Map isn't disturbed), then `clear()` and re-fill the +originals, returning the same `value`. Mutating across an `EditorState` boundary +is normally a smell, but `prosemirror-history` doesn't snapshot plugin state and +the only consumer (`useReactKeys`) always reads from the latest `view.state`, so +observable behaviour is unchanged. Both the `dist/cjs` and `dist/esm` builds are +patched. + +> Regenerating / updating the patch: edit +> `node_modules/@handlewithcare/react-prosemirror/dist/{cjs,esm}/plugins/reactKeys.js`, +> then run `npx patch-package @handlewithcare/react-prosemirror`. If the pinned +> version ever changes, delete the old patch file and regenerate. + +## Requirements + +Runtime deps are in the blog's root `package.json` +(`@handlewithcare/react-prosemirror` + a pinned `react-reconciler@0.29.2` for +React 18, `@tiptap/*` v3) — plus the `patch-package` postinstall fix above. Test +deps: `@playwright/test`, `tsx`, `chartjs-node-canvas`, `chart.js`. Install the +browser once with: + +```bash +npx playwright install chromium +``` diff --git a/articles/react-prosemirror/e2e/perf/constants.ts b/articles/react-prosemirror/e2e/perf/constants.ts index 4ad90e0..a57d8bc 100644 --- a/articles/react-prosemirror/e2e/perf/constants.ts +++ b/articles/react-prosemirror/e2e/perf/constants.ts @@ -159,6 +159,28 @@ export const IMPL_CONFIG: Record = { }, }; +/** + * Maps an editor impl key to its human-readable Next.js page route in the blog. + * + * v3 → /perf-react-prosemirror (react-prosemirror, barebone) + * v4 → /perf-vanilla-prosemirror (vanilla ProseMirror) + * v5 → /perf-tiptap (Tiptap 3) + * *-snv → same name + "-snv" (static nodeview variant) + * *-nv → same name + "-nv" (reactive nodeview variant; pages TBD) + */ +const IMPL_ROUTE_BASE: Record<"v3" | "v4" | "v5", string> = { + v3: "react-prosemirror", + v4: "vanilla-prosemirror", + v5: "tiptap", +}; + +export function routeFor(impl: EditorImpl): string { + const match = impl.match(/^(v[345])(-snv|-nv)?$/); + if (!match) throw new Error(`no blog route mapped for impl "${impl}"`); + const [, base, suffix] = match as unknown as [string, "v3" | "v4" | "v5", string | undefined]; + return `/perf-${IMPL_ROUTE_BASE[base]}${suffix ?? ""}`; +} + /** * Returns the filename for a given impl+scenario+kind. For the default scenario * `"typing"` we keep the legacy filenames (no scenario suffix) so existing diff --git a/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts b/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts index 048d1f8..02e8959 100644 --- a/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts +++ b/articles/react-prosemirror/e2e/perf/keystroke-ramp.spec.ts @@ -31,6 +31,7 @@ import { KEYSTROKE_RAMP_PRESSES, KEYSTROKE_RAMP_STEP, RESULTS_DIR, + routeFor, TIMEOUT, } from "./constants"; import { @@ -75,7 +76,7 @@ test(`[PERF] keystroke-ramp ${cfg?.label ?? EDITOR_IMPL}`, async ({ browser }) = // Single page load. Grow doc programmatically between iterations via the // window.__perfGrow(k) hook exposed by each -snv page. - await page.goto(`/perf-${EDITOR_IMPL}`); + await page.goto(routeFor(EDITOR_IMPL)); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 30_000 }); await page.waitForFunction( () => typeof (window as unknown as { __perfGrow?: unknown }).__perfGrow === "function", diff --git a/articles/react-prosemirror/e2e/perf/nodeview.spec.ts b/articles/react-prosemirror/e2e/perf/nodeview.spec.ts index e04adc5..0406721 100644 --- a/articles/react-prosemirror/e2e/perf/nodeview.spec.ts +++ b/articles/react-prosemirror/e2e/perf/nodeview.spec.ts @@ -23,6 +23,7 @@ import { PERF_SCENARIO, perfFileFor, RESULTS_DIR, + routeFor, TIMEOUT, } from "./constants"; import { computeStats, formatStatsLine, groupInteractions } from "./inp-stats"; @@ -120,7 +121,7 @@ async function runTyping( page: import("@playwright/test").Page, session: CdpSession, ): Promise { - await page.goto(`/perf-${EDITOR_IMPL}?${COMPLEXITY_PARAM}`); + await page.goto(`${routeFor(EDITOR_IMPL)}?${COMPLEXITY_PARAM}`); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 15_000 }); await page.locator(cfg.selector).click(); @@ -207,7 +208,7 @@ async function runColdLoad( for (const n of sizes) { const t0 = Date.now(); - await page.goto(`/perf-${EDITOR_IMPL}?n=${n}&${COMPLEXITY_PARAM}`); + await page.goto(`${routeFor(EDITOR_IMPL)}?n=${n}&${COMPLEXITY_PARAM}`); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: perSizeTimeoutMs }); // Wait until the page has settled enough to expose all paragraphs. await page.waitForFunction( @@ -240,7 +241,7 @@ async function runCursor( session: CdpSession, ): Promise { const seedN = Number(process.env.PERF_CURSOR_N ?? 10_000); - await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await page.goto(`${routeFor(EDITOR_IMPL)}?n=${seedN}&${COMPLEXITY_PARAM}`); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); await page.waitForFunction( ([sel, target]) => { @@ -294,7 +295,7 @@ async function runCtxFlip( session: CdpSession, ): Promise { const seedN = Number(process.env.PERF_CTX_FLIP_N ?? 4_000); - await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await page.goto(`${routeFor(EDITOR_IMPL)}?n=${seedN}&${COMPLEXITY_PARAM}`); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); await page.waitForFunction( ([sel, target]) => { @@ -343,7 +344,7 @@ async function runKeystrokeLatency(page: import("@playwright/test").Page): Promi const seedN = Number(process.env.PERF_KEYSTROKE_N ?? 2_000); const count = Number(process.env.PERF_KEYSTROKE_COUNT ?? 1_000); - await page.goto(`/perf-${EDITOR_IMPL}?n=${seedN}&${COMPLEXITY_PARAM}`); + await page.goto(`${routeFor(EDITOR_IMPL)}?n=${seedN}&${COMPLEXITY_PARAM}`); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 60_000 }); await page.waitForFunction( ([sel, target]) => { @@ -444,7 +445,7 @@ async function runKeystrokeInp(page: import("@playwright/test").Page): Promise { diff --git a/articles/react-prosemirror/e2e/perf/stress.spec.ts b/articles/react-prosemirror/e2e/perf/stress.spec.ts index 475261c..9205bd8 100644 --- a/articles/react-prosemirror/e2e/perf/stress.spec.ts +++ b/articles/react-prosemirror/e2e/perf/stress.spec.ts @@ -10,6 +10,7 @@ import { NODECOUNT_CHECKPOINT, PERF_SERVER_PORT, RESULTS_DIR, + routeFor, TIMEOUT, } from "./constants"; @@ -64,7 +65,7 @@ test(`[PERF] stress${WALL_MODE ? "-wall" : ""} ${cfg.label}`, async ({ browser } const page = await ctx.newPage(); if (EDITOR_IMPL === "v3" || EDITOR_IMPL === "v4" || EDITOR_IMPL === "v5") { - await page.goto(`/perf-${EDITOR_IMPL}`); + await page.goto(routeFor(EDITOR_IMPL)); await expect(page.locator(cfg.selector)).toBeVisible({ timeout: 15_000 }); } else { const create = await ctx.request.post(`${API}/api/documents`, { diff --git a/articles/react-prosemirror/playwright.perf.config.ts b/articles/react-prosemirror/playwright.perf.config.ts index a43a893..0e0fe36 100644 --- a/articles/react-prosemirror/playwright.perf.config.ts +++ b/articles/react-prosemirror/playwright.perf.config.ts @@ -1,12 +1,16 @@ /// +import { join } from "node:path"; import { defineConfig, devices } from "@playwright/test"; -import { - EDITOR_IMPL, - GLOBALTIMEOUT, - PERF_SERVER_PORT, - PERF_WEB_PORT, - TIMEOUT, -} from "./e2e/perf/constants"; +import { GLOBALTIMEOUT, PERF_WEB_PORT, TIMEOUT } from "./e2e/perf/constants"; + +// Repo root (two levels up from articles/react-prosemirror). The perf editor +// routes live in the main blog Next app, so we boot it directly — no separate +// @proof/web / @proof/server processes like the original proof-stack config. +const REPO_ROOT = join(__dirname, "..", ".."); + +// Default to `next start` (production build — representative perf numbers). +// Set PERF_DEV=1 to boot `next dev` instead (faster iteration, noisier perf). +const DEV = process.env.PERF_DEV === "1"; export default defineConfig({ testDir: "./e2e/perf", @@ -24,28 +28,13 @@ export default defineConfig({ screenshot: "off", }, projects: [{ name: "chromium", use: { ...devices["Desktop Chrome"] } }], - webServer: [ - { - command: "pnpm --filter @proof/server dev", - url: `http://localhost:${PERF_SERVER_PORT}/health`, - timeout: 120_000, - reuseExistingServer: false, - env: { - PORT: String(PERF_SERVER_PORT), - EDITOR_IMPL, - WEB_ORIGIN: `http://localhost:${PERF_WEB_PORT}`, - PROOF_SHARE_RATELIMIT_DISABLED: "1", - }, - }, - { - command: `pnpm --filter @proof/web exec next start -p ${PERF_WEB_PORT}`, - url: `http://localhost:${PERF_WEB_PORT}`, - timeout: 120_000, - reuseExistingServer: false, - env: { - NEXT_PUBLIC_EDITOR_IMPL: EDITOR_IMPL, - NEXT_PUBLIC_API_URL: `http://localhost:${PERF_SERVER_PORT}`, - }, - }, - ], + webServer: { + command: DEV + ? `npx next dev -p ${PERF_WEB_PORT}` + : `npx next start -p ${PERF_WEB_PORT}`, + cwd: REPO_ROOT, + url: `http://localhost:${PERF_WEB_PORT}/perf-react-prosemirror`, + timeout: 120_000, + reuseExistingServer: true, + }, }); diff --git a/articles/react-prosemirror/scripts/run-editor-perf.ts b/articles/react-prosemirror/scripts/run-editor-perf.ts index 89d3cf6..54a0b01 100644 --- a/articles/react-prosemirror/scripts/run-editor-perf.ts +++ b/articles/react-prosemirror/scripts/run-editor-perf.ts @@ -1,45 +1,54 @@ /// +/** + * Stress-perf orchestrator — runs `e2e/perf/stress.spec.ts` across the + * standalone editor impls (v3 / v4 / v5), one Playwright invocation per impl, + * then generates the comparison graphs. + * + * Each impl has its own static blog route (see `routeFor` in constants.ts), + * so — unlike the original proof-stack setup — there's no per-impl rebuild: + * we build the blog once, then the Playwright webServer boots `next start`. + * + * Usage (from repo root): + * npx tsx articles/react-prosemirror/scripts/run-editor-perf.ts + * PERF_IMPLS=v3,v5 npx tsx articles/react-prosemirror/scripts/run-editor-perf.ts + * PERF_SKIP_BUILD=1 ... # reuse an existing production build + * PERF_DEV=1 ... # boot `next dev` instead of build + start + */ import { spawnSync } from "node:child_process"; +import { join } from "node:path"; -type EditorImpl = "v1" | "v2" | "v3" | "v4" | "v5"; +type EditorImpl = "v3" | "v4" | "v5"; -const impls = (process.env.PERF_IMPLS ?? "v1,v2") +const ARTICLE_ROOT = join(__dirname, ".."); +const REPO_ROOT = join(__dirname, "..", "..", ".."); + +const impls = (process.env.PERF_IMPLS ?? "v3,v4,v5") .split(",") .map((s) => s.trim()) .filter(Boolean) as EditorImpl[]; -// The web bundle bakes NEXT_PUBLIC_API_URL at build time. Must match the port -// the perf playwright config will boot the server on (PERF_SERVER_PORT, default -// 4100), otherwise the client falls back to localhost:4000 and every API call -// hits an unbound port → "Document not found". -const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; -const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; -const API_URL = `http://localhost:${PERF_SERVER_PORT}`; +buildOnce(); for (const impl of impls) { - console.log(`\n=== building @proof/web for ${impl} ===\n`); - run("pnpm", ["--filter", "@proof/web", "build"], { - NEXT_PUBLIC_EDITOR_IMPL: impl, - NEXT_PUBLIC_API_URL: API_URL, - }); - - console.log(`\n=== running perf for ${impl} ===\n`); - run("pnpm", ["exec", "playwright", "test", "--config=playwright.perf.config.ts"], { - EDITOR_IMPL: impl, - NEXT_PUBLIC_EDITOR_IMPL: impl, - NEXT_PUBLIC_API_URL: API_URL, - PERF_SERVER_PORT, - PERF_WEB_PORT, - }); + console.log(`\n=== running stress perf for ${impl} ===\n`); + run( + "npx", + ["playwright", "test", "--config=playwright.perf.config.ts", "e2e/perf/stress.spec.ts"], + ARTICLE_ROOT, + { EDITOR_IMPL: impl }, + ); } console.log("\n=== generating graphs ===\n"); -run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], {}); +run("npx", ["tsx", "e2e/perf/create-graphs.ts"], ARTICLE_ROOT, {}); + +function buildOnce(): void { + if (process.env.PERF_SKIP_BUILD === "1" || process.env.PERF_DEV === "1") return; + console.log("\n=== building blog (next build) ===\n"); + run("npm", ["run", "build"], REPO_ROOT, {}); +} -function run(cmd: string, args: string[], env: Record): void { - const result = spawnSync(cmd, args, { - stdio: "inherit", - env: { ...process.env, ...env }, - }); +function run(cmd: string, args: string[], cwd: string, env: Record): void { + const result = spawnSync(cmd, args, { stdio: "inherit", cwd, env: { ...process.env, ...env } }); if (result.status !== 0) process.exit(result.status ?? 1); } diff --git a/articles/react-prosemirror/scripts/run-keystroke-ramp.ts b/articles/react-prosemirror/scripts/run-keystroke-ramp.ts index 79000b4..9007088 100644 --- a/articles/react-prosemirror/scripts/run-keystroke-ramp.ts +++ b/articles/react-prosemirror/scripts/run-keystroke-ramp.ts @@ -1,65 +1,56 @@ /// /** * Keystroke-ramp orchestrator — runs `e2e/perf/keystroke-ramp.spec.ts` across - * the -snv impls (v3-snv / v4-snv / v5-snv), one Playwright invocation per - * impl. The spec sweeps n internally and bails when typing becomes laggy, so - * this script just iterates impls and then generates the comparison graph. + * the impls it supports (v3 / v4 / v5 / v3-snv / v4-snv / v5-snv), one + * Playwright invocation per impl, then generates the comparison graph. The + * spec sweeps node count internally and bails when typing becomes laggy, so + * this script just iterates impls. * - * Usage: - * pnpm perf:keystroke-ramp - * PERF_RAMP_IMPLS=v3-snv pnpm perf:keystroke-ramp - * PERF_RAMP_STEP=250 PERF_LAG_P95_MS=80 pnpm perf:keystroke-ramp + * Usage (from repo root): + * npx tsx articles/react-prosemirror/scripts/run-keystroke-ramp.ts + * PERF_RAMP_IMPLS=v3-snv npx tsx articles/react-prosemirror/scripts/run-keystroke-ramp.ts + * PERF_RAMP_STEP=250 PERF_LAG_P95_MS=80 npx tsx ...run-keystroke-ramp.ts + * PERF_SKIP_BUILD=1 ... # reuse an existing production build + * PERF_DEV=1 ... # boot `next dev` instead of build + start */ import { spawnSync } from "node:child_process"; +import { join } from "node:path"; type RampImpl = "v3" | "v4" | "v5" | "v3-snv" | "v4-snv" | "v5-snv"; +const ARTICLE_ROOT = join(__dirname, ".."); +const REPO_ROOT = join(__dirname, "..", "..", ".."); + const DEFAULT_IMPLS: RampImpl[] = ["v3-snv", "v4-snv", "v5-snv"]; const ALL_IMPLS: readonly RampImpl[] = ["v3", "v4", "v5", "v3-snv", "v4-snv", "v5-snv"]; const IMPLS = parseList(process.env.PERF_RAMP_IMPLS, DEFAULT_IMPLS, ALL_IMPLS); -const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; -const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; -const API_URL = `http://localhost:${PERF_SERVER_PORT}`; - -console.log("\n=== building @proof/web (shared bundle for -snv routes) ===\n"); -run("pnpm", ["--filter", "@proof/web", "build"], { - NEXT_PUBLIC_EDITOR_IMPL: "v3", - NEXT_PUBLIC_API_URL: API_URL, -}); +buildOnce(); for (const impl of IMPLS) { console.log(`\n=== running keystroke-ramp for ${impl} ===\n`); run( - "pnpm", - [ - "exec", - "playwright", - "test", - "--config=playwright.perf.config.ts", - "e2e/perf/keystroke-ramp.spec.ts", - ], - { - EDITOR_IMPL: impl, - NEXT_PUBLIC_EDITOR_IMPL: impl, - NEXT_PUBLIC_API_URL: API_URL, - PERF_SERVER_PORT, - PERF_WEB_PORT, - }, + "npx", + ["playwright", "test", "--config=playwright.perf.config.ts", "e2e/perf/keystroke-ramp.spec.ts"], + ARTICLE_ROOT, + { EDITOR_IMPL: impl }, ); } console.log("\n=== generating keystroke-ramp graph ===\n"); -run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], { +run("npx", ["tsx", "e2e/perf/create-graphs.ts"], ARTICLE_ROOT, { GRAPH_IMPLS: IMPLS.join(","), GRAPH_SCENARIO: "keystroke-ramp", }); -function run(cmd: string, args: string[], env: Record): void { - const result = spawnSync(cmd, args, { - stdio: "inherit", - env: { ...process.env, ...env }, - }); +function buildOnce(): void { + if (process.env.PERF_SKIP_BUILD === "1" || process.env.PERF_DEV === "1") return; + console.log("\n=== building blog (next build) ===\n"); + run("npm", ["run", "build"], REPO_ROOT, {}); +} + +function run(cmd: string, args: string[], cwd: string, env: Record): void { + const result = spawnSync(cmd, args, { stdio: "inherit", cwd, env: { ...process.env, ...env } }); if (result.status !== 0) process.exit(result.status ?? 1); } diff --git a/articles/react-prosemirror/scripts/run-nodeview-perf.ts b/articles/react-prosemirror/scripts/run-nodeview-perf.ts index a568d53..303a107 100644 --- a/articles/react-prosemirror/scripts/run-nodeview-perf.ts +++ b/articles/react-prosemirror/scripts/run-nodeview-perf.ts @@ -1,30 +1,37 @@ /// /** - * Nodeview perf orchestrator — runs the v3-nv / v4-nv / v5-nv pages across - * the four scenarios defined in `e2e/perf/nodeview.spec.ts`. + * Nodeview perf orchestrator — runs `e2e/perf/nodeview.spec.ts` across impls × + * scenarios, then generates per-scenario graphs. * - * Builds @proof/web once (the *-nv pages are static React routes hardcoded in - * the bundle, so NEXT_PUBLIC_EDITOR_IMPL doesn't affect them — same trick as - * `scripts/run-v3-v4-perf.ts`). + * Each impl has its own static blog route (see `routeFor` in constants.ts), so + * we build the blog once and the Playwright webServer boots `next start`. * - * Usage: - * pnpm exec tsx scripts/run-nodeview-perf.ts - * PERF_MAX_NODES=500 pnpm exec tsx scripts/run-nodeview-perf.ts - * PERF_NV_SCENARIOS=typing,ctx-flip pnpm exec tsx scripts/run-nodeview-perf.ts - * PERF_NV_IMPLS=v3-nv,v5-nv pnpm exec tsx scripts/run-nodeview-perf.ts + * NOTE: the reactive `-nv` impls (v3-nv / v4-nv / v5-nv) and the `ctx-flip` + * scenario require nodeview pages that expose a `window.__PERF_CTX` hook; those + * pages were not part of the initial copy, so the default impl set is the ones + * with live routes (v3 / v4 / v5). Add `-snv` or `-nv` via PERF_NV_IMPLS once + * their pages exist. + * + * Usage (from repo root): + * npx tsx articles/react-prosemirror/scripts/run-nodeview-perf.ts + * PERF_MAX_NODES=500 npx tsx ...run-nodeview-perf.ts + * PERF_NV_SCENARIOS=typing,cold-load npx tsx ...run-nodeview-perf.ts + * PERF_NV_IMPLS=v3,v5 npx tsx ...run-nodeview-perf.ts + * PERF_SKIP_BUILD=1 ... / PERF_DEV=1 ... */ import { spawnSync } from "node:child_process"; +import { join } from "node:path"; type NvImpl = - | "v3-nv" - | "v4-nv" - | "v5-nv" | "v3" | "v4" | "v5" | "v3-snv" | "v4-snv" - | "v5-snv"; + | "v5-snv" + | "v3-nv" + | "v4-nv" + | "v5-nv"; type Scenario = | "typing" | "cold-load" @@ -33,18 +40,22 @@ type Scenario = | "keystroke-latency" | "keystroke-inp"; -const DEFAULT_IMPLS: NvImpl[] = ["v3-nv", "v4-nv", "v5-nv"]; +const ARTICLE_ROOT = join(__dirname, ".."); +const REPO_ROOT = join(__dirname, "..", "..", ".."); + +const DEFAULT_IMPLS: NvImpl[] = ["v3", "v4", "v5"]; const ALL_IMPLS: NvImpl[] = [ - "v3-nv", - "v4-nv", - "v5-nv", "v3", "v4", "v5", "v3-snv", "v4-snv", "v5-snv", + "v3-nv", + "v4-nv", + "v5-nv", ]; +const DEFAULT_SCENARIOS: Scenario[] = ["typing", "cold-load"]; const ALL_SCENARIOS: Scenario[] = [ "typing", "cold-load", @@ -55,65 +66,48 @@ const ALL_SCENARIOS: Scenario[] = [ ]; const IMPLS: NvImpl[] = parseList(process.env.PERF_NV_IMPLS, DEFAULT_IMPLS, ALL_IMPLS); -const SCENARIOS: Scenario[] = parseList(process.env.PERF_NV_SCENARIOS, ALL_SCENARIOS); +const SCENARIOS: Scenario[] = parseList(process.env.PERF_NV_SCENARIOS, DEFAULT_SCENARIOS, ALL_SCENARIOS); -const PERF_SERVER_PORT = process.env.PERF_SERVER_PORT ?? "4100"; -const PERF_WEB_PORT = process.env.PERF_WEB_PORT ?? "3100"; -const API_URL = `http://localhost:${PERF_SERVER_PORT}`; - -console.log("\n=== building @proof/web (single bundle for v{3,4,5}-nv routes) ===\n"); -run("pnpm", ["--filter", "@proof/web", "build"], { - NEXT_PUBLIC_EDITOR_IMPL: "v3", - NEXT_PUBLIC_API_URL: API_URL, -}); +buildOnce(); for (const impl of IMPLS) { for (const scenario of SCENARIOS) { console.log(`\n=== running perf for ${impl} / ${scenario} ===\n`); run( - "pnpm", - [ - "exec", - "playwright", - "test", - "--config=playwright.perf.config.ts", - "e2e/perf/nodeview.spec.ts", - ], - { - EDITOR_IMPL: impl, - PERF_SCENARIO: scenario, - NEXT_PUBLIC_EDITOR_IMPL: impl, - NEXT_PUBLIC_API_URL: API_URL, - PERF_SERVER_PORT, - PERF_WEB_PORT, - }, + "npx", + ["playwright", "test", "--config=playwright.perf.config.ts", "e2e/perf/nodeview.spec.ts"], + ARTICLE_ROOT, + { EDITOR_IMPL: impl, PERF_SCENARIO: scenario }, ); } } for (const scenario of SCENARIOS) { console.log(`\n=== generating nodeview graphs (${scenario}) ===\n`); - run("pnpm", ["exec", "tsx", "e2e/perf/create-graphs.ts"], { + run("npx", ["tsx", "e2e/perf/create-graphs.ts"], ARTICLE_ROOT, { GRAPH_IMPLS: IMPLS.join(","), GRAPH_SCENARIO: scenario, }); } -function run(cmd: string, args: string[], env: Record): void { - const result = spawnSync(cmd, args, { - stdio: "inherit", - env: { ...process.env, ...env }, - }); +function buildOnce(): void { + if (process.env.PERF_SKIP_BUILD === "1" || process.env.PERF_DEV === "1") return; + console.log("\n=== building blog (next build) ===\n"); + run("npm", ["run", "build"], REPO_ROOT, {}); +} + +function run(cmd: string, args: string[], cwd: string, env: Record): void { + const result = spawnSync(cmd, args, { stdio: "inherit", cwd, env: { ...process.env, ...env } }); if (result.status !== 0) process.exit(result.status ?? 1); } function parseList( raw: string | undefined, fallback: T[], - allowed?: T[], + allowed: T[] = fallback, ): T[] { if (!raw) return fallback; - const validValues = (allowed ?? fallback) as readonly string[]; + const validValues = allowed as readonly string[]; const parsed = raw .split(",") .map((s) => s.trim()) diff --git a/articles/react-prosemirror/tsconfig.json b/articles/react-prosemirror/tsconfig.json new file mode 100644 index 0000000..718ccbe --- /dev/null +++ b/articles/react-prosemirror/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "types": ["node"], + "noEmit": true, + "noUnusedLocals": false + }, + "include": ["e2e", "scripts", "playwright.perf.config.ts"], + "exclude": ["../../node_modules"] +} diff --git a/package-lock.json b/package-lock.json index 9c3a9ed..3f1e9ae 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,12 +14,20 @@ "@codemirror/state": "^6.1.4", "@codemirror/view": "^6.7.1", "@emergence-engineering/lexical-slash-menu-plugin": "^0.0.3", + "@handlewithcare/react-prosemirror": "^3.0.6", "@inline-svg-unique-id/react": "^1.2.3", "@lexical/list": "^0.11.3", "@lexical/react": "^0.11.3", "@lexical/selection": "^0.11.3", "@popperjs/core": "^2.11.8", "@textea/json-viewer": "^2.12.0", + "@tiptap/core": "^3.24.0", + "@tiptap/extension-document": "^3.24.0", + "@tiptap/extension-history": "^3.24.0", + "@tiptap/extension-paragraph": "^3.24.0", + "@tiptap/extension-text": "^3.24.0", + "@tiptap/pm": "^3.24.0", + "@tiptap/react": "^3.24.0", "axios": "^1.2.1", "codemirror": "^6.0.1", "cors": "^2.8.5", @@ -58,6 +66,7 @@ "react-markdown": "^9.0.1", "react-popper": "^2.3.0", "react-recaptcha": "^2.3.10", + "react-reconciler": "^0.29.2", "react-responsive": "^9.0.2", "react-syntax-highlighter": "^15.5.0", "react-youtube": "^10.1.0", @@ -68,6 +77,7 @@ "yjs": "^13.6.4" }, "devDependencies": { + "@playwright/test": "^1.60.0", "@svgr/webpack": "^8.1.0", "@types/cors": "^2.8.13", "@types/node": "^18.11.15", @@ -93,17 +103,21 @@ "@types/styled-components": "^5.1.26", "autoprefixer": "^10.4.20", "babel-plugin-react-inline-svg-unique-id": "^1.4.0", + "chart.js": "^4.5.1", + "chartjs-node-canvas": "^5.0.0", "eslint": "^8.29.0", "eslint-config-next": "^13.0.7", "eslint-plugin-import": "^2.29.1", "git-commit-id": "^2.0.1", "husky": "^8.0.2", "npm-check": "^6.0.1", + "patch-package": "^8.0.1", "postcss": "^8.4.41", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.6", "tailwindcss": "^3.4.9", "ts-node": "^10.9.1", + "tsx": "^4.22.4", "typescript": "^4.9.4" }, "engines": { @@ -2626,6 +2640,448 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -2682,6 +3138,26 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, + "node_modules/@handlewithcare/react-prosemirror": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@handlewithcare/react-prosemirror/-/react-prosemirror-3.0.6.tgz", + "integrity": "sha512-7HNwItwpi1dZ0lq2KvqCvGhZaP3QXDFQOcyap3mNb9HyFPYXWdTQm1XQEGQ1sZ5656OOwAzzYU/q7ncRvIJ45w==", + "license": "Apache-2.0", + "dependencies": { + "classnames": "^2.5.1" + }, + "engines": { + "node": ">=16.9" + }, + "peerDependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-view": "1.41.7", + "react": ">=17 <20", + "react-dom": ">=17 <20", + "react-reconciler": ">=0.26.1 <=0.33.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -2870,6 +3346,13 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "dev": true, + "license": "MIT" + }, "node_modules/@lexical/clipboard": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.11.3.tgz", @@ -3732,6 +4215,22 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -4131,6 +4630,181 @@ "react-dom": "^17 || ^18" } }, + "node_modules/@tiptap/core": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.24.0.tgz", + "integrity": "sha512-GTAsXAI32p4hEZgPzvUv2RPrObxamy9AFhmhG10fXSvN/cDUs8naEYVIqDV3Sh99jMwQEbTFKW1E1mcspsY6ow==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/pm": "3.24.0" + } + }, + "node_modules/@tiptap/extension-bubble-menu": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.24.0.tgz", + "integrity": "sha512-jRXD+JPu9ayvq78g8hsCxx4q/qUFtrdfIYirRSf5YUseuuUbtfrq83AsGabcygpUTefjJkMQoXNITkh6294Ggw==", + "license": "MIT", + "optional": true, + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0", + "@tiptap/pm": "3.24.0" + } + }, + "node_modules/@tiptap/extension-document": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.24.0.tgz", + "integrity": "sha512-yxgM3+yXy2XZzEwH43y2Kp8D1BkblxEWLXqo0YCoAKtxyKCcEaT8kdlf70kS7D0+VSzYU4D0iN7VdQIYHcL2mA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0" + } + }, + "node_modules/@tiptap/extension-floating-menu": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.24.0.tgz", + "integrity": "sha512-7QEbf3mUzFAkejjQGX9f0L507oMtnOBRwHt2skUTR+9yXgudsN8zaDBSSRHLeMWGk9b7L293ZMA6zCRrZaHrfA==", + "license": "MIT", + "optional": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@floating-ui/dom": "^1.0.0", + "@tiptap/core": "3.24.0", + "@tiptap/pm": "3.24.0" + } + }, + "node_modules/@tiptap/extension-history": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-3.24.0.tgz", + "integrity": "sha512-pGRSXgJ+f3KIJq8kNq9mGJAN0ryJEZgBQq5Ag7Lk9Bo7OE+0SSYEs2gCEmY8+Thtw/YpICaVzx06pFy9DZt3eQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/extensions": "3.24.0" + } + }, + "node_modules/@tiptap/extension-paragraph": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.24.0.tgz", + "integrity": "sha512-wD06aB6hO7LgcrlhGiw7I64k2tus9kNoICX5R+UecBSB1DVJdzKvXoXL2kPNv4DqYvljHdkIeK/OpuOTQd6MJA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0" + } + }, + "node_modules/@tiptap/extension-text": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.24.0.tgz", + "integrity": "sha512-Im7keLPEihxm3+LyF+drYCoaOY5hlq35lvHAp/el6M8pJ/scts88HrYpdR1Yc4BtpZBIhfHSyWgPaupI4qwdeg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0" + } + }, + "node_modules/@tiptap/extensions": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.24.0.tgz", + "integrity": "sha512-z6gRYzy2ucJp07OQ0F2W07NxyhMTxPYH1ia2eGiQkWax1i56oExpjMsDHP8THWlg8Tb7NnbfKpkfh881EsmofA==", + "license": "MIT", + "peer": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0", + "@tiptap/pm": "3.24.0" + } + }, + "node_modules/@tiptap/pm": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.24.0.tgz", + "integrity": "sha512-QQP/78ryOZDN99gNBV7dgh69/8AYaOYQYFklq/iR+ZRFaaL3+qqHFvPVJapGkzPdymBgNJ34xjFM8n5pJ4QmMg==", + "license": "MIT", + "dependencies": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.38.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + } + }, + "node_modules/@tiptap/react": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.24.0.tgz", + "integrity": "sha512-KxnrlQbzOgA02EMsfuGGHtNhfkJQGqVlQttmQctI9DOl/F3gcaRqg+wNTBY1Fof8yDaZ8Z1LL1F0C05W0o3vUw==", + "license": "MIT", + "dependencies": { + "@types/use-sync-external-store": "^0.0.6", + "fast-equals": "^5.3.3", + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/ueberdosis" + }, + "optionalDependencies": { + "@tiptap/extension-bubble-menu": "^3.24.0", + "@tiptap/extension-floating-menu": "^3.24.0" + }, + "peerDependencies": { + "@tiptap/core": "3.24.0", + "@tiptap/pm": "3.24.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "@types/react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tiptap/react/node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -4611,7 +5285,6 @@ "version": "18.2.6", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -4706,6 +5379,12 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", @@ -5154,6 +5833,13 @@ "optional": true, "peer": true }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, "node_modules/abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -5907,15 +6593,45 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -6102,6 +6818,21 @@ } ] }, + "node_modules/canvas": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz", + "integrity": "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": "^18.12.0 || >= 20.9.0" + } + }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -6168,6 +6899,33 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/chartjs-node-canvas": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", + "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", + "dev": true, + "license": "MIT", + "dependencies": { + "canvas": "^3.1.0", + "tslib": "^2.8.1" + }, + "peerDependencies": { + "chart.js": "^4.4.8" + } + }, "node_modules/cheerio": { "version": "1.0.0-rc.11", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", @@ -6244,6 +7002,13 @@ "node": ">= 6" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true, + "license": "ISC" + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -6260,6 +7025,12 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, "node_modules/cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -7082,6 +7853,16 @@ "node": ">=6" } }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -7224,6 +8005,20 @@ "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -7390,12 +8185,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -7416,9 +8209,10 @@ "peer": true }, "node_modules/es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, @@ -7463,6 +8257,48 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, "node_modules/escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -8107,6 +8943,16 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -8136,6 +8982,15 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -8269,6 +9124,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, "node_modules/find-yarn-workspace-root2": { "version": "1.2.16", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", @@ -8473,6 +9338,38 @@ } } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -8542,15 +9439,21 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -8559,6 +9462,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -8602,6 +9518,13 @@ "integrity": "sha512-ltEuT5LdiSLK0dc0S8cOWF97mmsQO81KrajzPpNZmCnynXyn6AJklJNVOpNKwcG6Lq2Vp/d/y7DDTkrRFDW9YQ==", "dev": true }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true, + "license": "MIT" + }, "node_modules/giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", @@ -8770,11 +9693,12 @@ "dev": true }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8913,9 +9837,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10003,11 +10928,38 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, + "node_modules/json-stable-stringify/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, + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -10019,6 +10971,39 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -10049,6 +11034,16 @@ "node": ">=0.10.0" } }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -10507,6 +11502,15 @@ "css-mediaquery": "^0.1.2" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -11602,6 +12606,13 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true, + "license": "MIT" + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -11669,6 +12680,13 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true, + "license": "MIT" + }, "node_modules/napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -11777,6 +12795,26 @@ "tslib": "^2.0.3" } }, + "node_modules/node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -16561,6 +17599,105 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, + "node_modules/patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "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", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -16712,6 +17849,38 @@ "node": ">=10" } }, + "node_modules/playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.60.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -16994,6 +18163,34 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/preferred-pm": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", @@ -17166,6 +18363,15 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/prosemirror-changeset": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", + "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, "node_modules/prosemirror-codemirror-block": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/prosemirror-codemirror-block/-/prosemirror-codemirror-block-0.4.1.tgz", @@ -17210,13 +18416,14 @@ } }, "node_modules/prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.10.2" } }, "node_modules/prosemirror-dev-toolkit": { @@ -17230,9 +18437,10 @@ } }, "node_modules/prosemirror-dropcursor": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.1.tgz", - "integrity": "sha512-LtyqQpkIknaT7NnZl3vDr3TpkNcG4ABvGRXx37XJ8tJNUGtcrZBh40A0344rDwlRTfUEmynQS/grUsoSWz+HgA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", + "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", @@ -17256,9 +18464,10 @@ } }, "node_modules/prosemirror-gapcursor": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", - "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", + "license": "MIT", "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", @@ -17267,12 +18476,14 @@ } }, "node_modules/prosemirror-history": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", - "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "license": "MIT", "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", "rope-sequence": "^1.3.0" } }, @@ -17306,18 +18517,20 @@ } }, "node_modules/prosemirror-inputrules": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", - "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" } }, "node_modules/prosemirror-keymap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" @@ -17383,9 +18596,10 @@ } }, "node_modules/prosemirror-model": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.2.tgz", - "integrity": "sha512-RXl0Waiss4YtJAUY3NzKH0xkJmsZupCIccqcIFoLTIKFlKNbIvFDRl27/kQy1FP8iUAxrjRRfIVvOebnnXJgqQ==", + "version": "1.25.7", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.7.tgz", + "integrity": "sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==", + "license": "MIT", "dependencies": { "orderedmap": "^2.0.0" } @@ -17399,13 +18613,14 @@ } }, "node_modules/prosemirror-schema-list": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", - "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.7.3" } }, "node_modules/prosemirror-slash-menu": { @@ -17444,9 +18659,10 @@ } }, "node_modules/prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -17454,31 +18670,34 @@ } }, "node_modules/prosemirror-tables": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.0.tgz", - "integrity": "sha512-ujzOb37O2ahmqI626Y0N0V/SZxuA9OGNYnsIMWdfecwkc8S8OShOqeD4kKUxpD0JcP81Z8qy/ulrXQuKhS4WUg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", + "license": "MIT", "dependencies": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" } }, "node_modules/prosemirror-transform": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz", - "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", + "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", + "license": "MIT", "dependencies": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "node_modules/prosemirror-view": { - "version": "1.31.5", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.5.tgz", - "integrity": "sha512-tobRCDeCp61elR1d97XE/JTL9FDIfswZpWeNs7GKJjAJvWyMGHWYFCq29850p6bbG2bckP+i9n1vT56RifosbA==", + "version": "1.41.7", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.7.tgz", + "integrity": "sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w==", + "license": "MIT", "dependencies": { - "prosemirror-model": "^1.16.0", + "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } @@ -17760,6 +18979,22 @@ "resolved": "https://registry.npmjs.org/react-recaptcha/-/react-recaptcha-2.3.10.tgz", "integrity": "sha512-IyanbozsYCuHvTYDuskZTIEcRAMG/sdvAu5b29iQWoC8Kd3Zk9WGCv2oNxh6RfGHvSvgHAyaLjmC6ei/yMsJ7g==" }, + "node_modules/react-reconciler": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/react-responsive": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", @@ -18658,6 +19893,82 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, + "node_modules/simple-get/node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/simple-get/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/sister": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sister/-/sister-3.0.2.tgz", @@ -19340,6 +20651,36 @@ "node": ">=6" } }, + "node_modules/tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/terser": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", @@ -19614,9 +20955,10 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" }, "node_modules/tsutils": { "version": "3.21.0", @@ -19637,6 +20979,53 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, + "node_modules/tsx": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -22423,6 +23812,188 @@ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" }, + "@esbuild/aix-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", + "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", + "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", + "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", + "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", + "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", + "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", + "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", + "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", + "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", + "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", + "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", + "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", + "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", + "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", + "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", + "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", + "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", + "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", + "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", + "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", + "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", + "dev": true, + "optional": true + }, + "@esbuild/openharmony-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", + "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", + "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", + "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", + "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", + "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", + "dev": true, + "optional": true + }, "@eslint/eslintrc": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.3.tgz", @@ -22469,6 +24040,14 @@ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" }, + "@handlewithcare/react-prosemirror": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@handlewithcare/react-prosemirror/-/react-prosemirror-3.0.6.tgz", + "integrity": "sha512-7HNwItwpi1dZ0lq2KvqCvGhZaP3QXDFQOcyap3mNb9HyFPYXWdTQm1XQEGQ1sZ5656OOwAzzYU/q7ncRvIJ45w==", + "requires": { + "classnames": "^2.5.1" + } + }, "@humanwhocodes/config-array": { "version": "0.11.7", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.7.tgz", @@ -22605,6 +24184,12 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "dev": true + }, "@lexical/clipboard": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/@lexical/clipboard/-/clipboard-0.11.3.tgz", @@ -23159,6 +24744,15 @@ "tslib": "^2.4.0" } }, + "@playwright/test": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.60.0.tgz", + "integrity": "sha512-O71yZIbAh/PxDMNGns37GHBIfrVkEVyn+AXyIa5dOTfb4/xNvRWV+Vv/NMbNCtODB/pO7vLlF2OTmMVLhmr7Ag==", + "devOptional": true, + "requires": { + "playwright": "1.60.0" + } + }, "@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -23385,6 +24979,99 @@ "zustand": "^4.1.4" } }, + "@tiptap/core": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.24.0.tgz", + "integrity": "sha512-GTAsXAI32p4hEZgPzvUv2RPrObxamy9AFhmhG10fXSvN/cDUs8naEYVIqDV3Sh99jMwQEbTFKW1E1mcspsY6ow==", + "requires": {} + }, + "@tiptap/extension-bubble-menu": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-3.24.0.tgz", + "integrity": "sha512-jRXD+JPu9ayvq78g8hsCxx4q/qUFtrdfIYirRSf5YUseuuUbtfrq83AsGabcygpUTefjJkMQoXNITkh6294Ggw==", + "optional": true, + "requires": { + "@floating-ui/dom": "^1.0.0" + } + }, + "@tiptap/extension-document": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.24.0.tgz", + "integrity": "sha512-yxgM3+yXy2XZzEwH43y2Kp8D1BkblxEWLXqo0YCoAKtxyKCcEaT8kdlf70kS7D0+VSzYU4D0iN7VdQIYHcL2mA==", + "requires": {} + }, + "@tiptap/extension-floating-menu": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-3.24.0.tgz", + "integrity": "sha512-7QEbf3mUzFAkejjQGX9f0L507oMtnOBRwHt2skUTR+9yXgudsN8zaDBSSRHLeMWGk9b7L293ZMA6zCRrZaHrfA==", + "optional": true, + "requires": {} + }, + "@tiptap/extension-history": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-3.24.0.tgz", + "integrity": "sha512-pGRSXgJ+f3KIJq8kNq9mGJAN0ryJEZgBQq5Ag7Lk9Bo7OE+0SSYEs2gCEmY8+Thtw/YpICaVzx06pFy9DZt3eQ==", + "requires": {} + }, + "@tiptap/extension-paragraph": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.24.0.tgz", + "integrity": "sha512-wD06aB6hO7LgcrlhGiw7I64k2tus9kNoICX5R+UecBSB1DVJdzKvXoXL2kPNv4DqYvljHdkIeK/OpuOTQd6MJA==", + "requires": {} + }, + "@tiptap/extension-text": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.24.0.tgz", + "integrity": "sha512-Im7keLPEihxm3+LyF+drYCoaOY5hlq35lvHAp/el6M8pJ/scts88HrYpdR1Yc4BtpZBIhfHSyWgPaupI4qwdeg==", + "requires": {} + }, + "@tiptap/extensions": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.24.0.tgz", + "integrity": "sha512-z6gRYzy2ucJp07OQ0F2W07NxyhMTxPYH1ia2eGiQkWax1i56oExpjMsDHP8THWlg8Tb7NnbfKpkfh881EsmofA==", + "peer": true, + "requires": {} + }, + "@tiptap/pm": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.24.0.tgz", + "integrity": "sha512-QQP/78ryOZDN99gNBV7dgh69/8AYaOYQYFklq/iR+ZRFaaL3+qqHFvPVJapGkzPdymBgNJ34xjFM8n5pJ4QmMg==", + "requires": { + "prosemirror-changeset": "^2.3.0", + "prosemirror-commands": "^1.6.2", + "prosemirror-dropcursor": "^1.8.1", + "prosemirror-gapcursor": "^1.3.2", + "prosemirror-history": "^1.4.1", + "prosemirror-inputrules": "^1.4.0", + "prosemirror-keymap": "^1.2.2", + "prosemirror-model": "^1.24.1", + "prosemirror-schema-list": "^1.5.0", + "prosemirror-state": "^1.4.3", + "prosemirror-tables": "^1.6.4", + "prosemirror-transform": "^1.10.2", + "prosemirror-view": "^1.38.1" + } + }, + "@tiptap/react": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/@tiptap/react/-/react-3.24.0.tgz", + "integrity": "sha512-KxnrlQbzOgA02EMsfuGGHtNhfkJQGqVlQttmQctI9DOl/F3gcaRqg+wNTBY1Fof8yDaZ8Z1LL1F0C05W0o3vUw==", + "requires": { + "@tiptap/extension-bubble-menu": "^3.24.0", + "@tiptap/extension-floating-menu": "^3.24.0", + "@types/use-sync-external-store": "^0.0.6", + "fast-equals": "^5.3.3", + "use-sync-external-store": "^1.4.0" + }, + "dependencies": { + "use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "requires": {} + } + } + }, "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -23850,7 +25537,6 @@ "version": "18.2.6", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", - "dev": true, "requires": { "@types/react": "*" } @@ -23945,6 +25631,11 @@ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, + "@types/use-sync-external-store": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz", + "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==" + }, "@typescript-eslint/eslint-plugin": { "version": "5.46.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", @@ -24300,6 +25991,12 @@ "optional": true, "peer": true }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, "abort-controller": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", @@ -24825,15 +26522,33 @@ } }, "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", + "set-function-length": "^1.2.2" + } + }, + "call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "requires": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" + } + }, + "call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "requires": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" } }, "callsite": { @@ -24962,6 +26677,16 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001651.tgz", "integrity": "sha512-9Cf+Xv1jJNe1xPZLGuUXLNkE1BoDkqRqYyFJ9TDYSqhduqA4hu4oR9HluGoWYQC/aj8WHjsGVV+bwkh0+tegRg==" }, + "canvas": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-3.2.3.tgz", + "integrity": "sha512-PzE5nJZPz72YUAfo8oTp0u3fqqY7IzlTubneAihqDYAUcBk7ryeCmBbdJBEdaH0bptSOe2VT2Zwcb3UaFyaSWw==", + "dev": true, + "requires": { + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.3" + } + }, "ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", @@ -25002,6 +26727,25 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "dev": true, + "requires": { + "@kurkle/color": "^0.3.0" + } + }, + "chartjs-node-canvas": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chartjs-node-canvas/-/chartjs-node-canvas-5.0.0.tgz", + "integrity": "sha512-+Lc5phRWjb+UxAIiQpKgvOaG6Mw276YQx2jl2BrxoUtI3A4RYTZuGM5Dq+s4ReYmCY42WEPSR6viF3lDSTxpvw==", + "dev": true, + "requires": { + "canvas": "^3.1.0", + "tslib": "^2.8.1" + } + }, "cheerio": { "version": "1.0.0-rc.11", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz", @@ -25057,6 +26801,12 @@ } } }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -25070,6 +26820,11 @@ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "cli-boxes": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", @@ -25694,6 +27449,12 @@ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" }, + "detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true + }, "devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", @@ -25802,6 +27563,16 @@ "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", "integrity": "sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==" }, + "dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "requires": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + } + }, "duplexer3": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz", @@ -25947,12 +27718,9 @@ } }, "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==" }, "es-errors": { "version": "1.3.0", @@ -25967,9 +27735,9 @@ "peer": true }, "es-object-atoms": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", - "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "requires": { "es-errors": "^1.3.0" } @@ -26002,6 +27770,40 @@ "is-symbol": "^1.0.2" } }, + "esbuild": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", + "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.28.0", + "@esbuild/android-arm": "0.28.0", + "@esbuild/android-arm64": "0.28.0", + "@esbuild/android-x64": "0.28.0", + "@esbuild/darwin-arm64": "0.28.0", + "@esbuild/darwin-x64": "0.28.0", + "@esbuild/freebsd-arm64": "0.28.0", + "@esbuild/freebsd-x64": "0.28.0", + "@esbuild/linux-arm": "0.28.0", + "@esbuild/linux-arm64": "0.28.0", + "@esbuild/linux-ia32": "0.28.0", + "@esbuild/linux-loong64": "0.28.0", + "@esbuild/linux-mips64el": "0.28.0", + "@esbuild/linux-ppc64": "0.28.0", + "@esbuild/linux-riscv64": "0.28.0", + "@esbuild/linux-s390x": "0.28.0", + "@esbuild/linux-x64": "0.28.0", + "@esbuild/netbsd-arm64": "0.28.0", + "@esbuild/netbsd-x64": "0.28.0", + "@esbuild/openbsd-arm64": "0.28.0", + "@esbuild/openbsd-x64": "0.28.0", + "@esbuild/openharmony-arm64": "0.28.0", + "@esbuild/sunos-x64": "0.28.0", + "@esbuild/win32-arm64": "0.28.0", + "@esbuild/win32-ia32": "0.28.0", + "@esbuild/win32-x64": "0.28.0" + } + }, "escalade": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", @@ -26447,6 +28249,12 @@ "strip-final-newline": "^2.0.0" } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -26473,6 +28281,11 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" }, + "fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==" + }, "fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -26576,6 +28389,15 @@ "path-exists": "^4.0.0" } }, + "find-yarn-workspace-root": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", + "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", + "dev": true, + "requires": { + "micromatch": "^4.0.2" + } + }, "find-yarn-workspace-root2": { "version": "1.2.16", "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", @@ -26708,6 +28530,31 @@ "tslib": "^2.4.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -26752,15 +28599,29 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "requires": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + } + }, + "get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "requires": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" } }, "get-stream": { @@ -26791,6 +28652,12 @@ "integrity": "sha512-ltEuT5LdiSLK0dc0S8cOWF97mmsQO81KrajzPpNZmCnynXyn6AJklJNVOpNKwcG6Lq2Vp/d/y7DDTkrRFDW9YQ==", "dev": true }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "giturl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/giturl/-/giturl-1.0.1.tgz", @@ -26915,12 +28782,9 @@ "dev": true }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==" }, "got": { "version": "9.6.0", @@ -27023,9 +28887,9 @@ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==" }, "has-tostringtag": { "version": "1.0.2", @@ -27789,6 +29653,27 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.3.0.tgz", + "integrity": "sha512-qtYiSSFlwot9XHtF9bD9c7rwKjr+RecWT//ZnPvSmEjpV5mmPOCN4j8UjY5hbjNkOwZ/jQv3J6R1/pL7RwgMsg==", + "dev": true, + "requires": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "isarray": "^2.0.5", + "jsonify": "^0.0.1", + "object-keys": "^1.1.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -27799,6 +29684,30 @@ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, + "jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true + } + } + }, + "jsonify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", + "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", + "dev": true + }, "jsx-ast-utils": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", @@ -27823,6 +29732,15 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "klaw-sync": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", + "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11" + } + }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -28175,6 +30093,11 @@ "css-mediaquery": "^0.1.2" } }, + "math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==" + }, "mdast-util-find-and-replace": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", @@ -28888,6 +30811,12 @@ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -28936,6 +30865,12 @@ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==" }, + "napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "dev": true + }, "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -29003,6 +30938,21 @@ "tslib": "^2.0.3" } }, + "node-abi": { + "version": "3.92.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.92.0.tgz", + "integrity": "sha512-KdHvFWZjEKDf0cakgFjebl371GPsISX2oZHcuyKqM7DtogIsHrqKeLTo8wBHxaXRAQlY2PsPlZmfo+9ZCxEREQ==", + "dev": true, + "requires": { + "semver": "^7.3.5" + } + }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true + }, "node-emoji": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", @@ -32519,6 +34469,64 @@ "parse5": "^7.0.0" } }, + "patch-package": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.1.tgz", + "integrity": "sha512-VsKRIA8f5uqHQ7NGhwIna6Bx6D9s/1iXlA1hthBVBEbkq+t4kXD0HHt+rJhf/Z+Ci0F/HCB2hvn0qLdLG+Qxlw==", + "dev": true, + "requires": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^10.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.2.4", + "yaml": "^2.2.2" + }, + "dependencies": { + "ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true + }, + "yaml": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", + "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "dev": true + } + } + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -32635,6 +34643,22 @@ "find-up": "^5.0.0" } }, + "playwright": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.60.0.tgz", + "integrity": "sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==", + "devOptional": true, + "requires": { + "fsevents": "2.3.2", + "playwright-core": "1.60.0" + } + }, + "playwright-core": { + "version": "1.60.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.60.0.tgz", + "integrity": "sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==", + "devOptional": true + }, "please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -32806,6 +34830,26 @@ } } }, + "prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "preferred-pm": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", @@ -32881,6 +34925,14 @@ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==" }, + "prosemirror-changeset": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz", + "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==", + "requires": { + "prosemirror-transform": "^1.0.0" + } + }, "prosemirror-codemirror-block": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/prosemirror-codemirror-block/-/prosemirror-codemirror-block-0.4.1.tgz", @@ -32918,13 +34970,13 @@ } }, "prosemirror-commands": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.2.tgz", - "integrity": "sha512-hgLcPaakxH8tu6YvVAaILV2tXYsW3rAdDR8WNkeKGcgeMVQg3/TMhPdVoh7iAmfgVjZGtcOSjKiQaoeKjzd2mQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.10.2" } }, "prosemirror-dev-toolkit": { @@ -32938,9 +34990,9 @@ } }, "prosemirror-dropcursor": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.6.1.tgz", - "integrity": "sha512-LtyqQpkIknaT7NnZl3vDr3TpkNcG4ABvGRXx37XJ8tJNUGtcrZBh40A0344rDwlRTfUEmynQS/grUsoSWz+HgA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.2.tgz", + "integrity": "sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw==", "requires": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", @@ -32964,9 +35016,9 @@ } }, "prosemirror-gapcursor": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", - "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz", + "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==", "requires": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", @@ -32975,12 +35027,13 @@ } }, "prosemirror-history": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.0.tgz", - "integrity": "sha512-qo/9Wn4B/Bq89/YD+eNWFbAytu6dmIM85EhID+fz9Jcl9+DfGEo8TTSrRhP15+fFEoaPqpHSxlvSzSEbmlxlUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", "requires": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", "rope-sequence": "^1.3.0" } }, @@ -33008,18 +35061,18 @@ } }, "prosemirror-inputrules": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", - "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", "requires": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" } }, "prosemirror-keymap": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.0.tgz", - "integrity": "sha512-TdSfu+YyLDd54ufN/ZeD1VtBRYpgZnTPnnbY+4R08DDgs84KrIPEPbJL8t1Lm2dkljFx6xeBE26YWH3aIzkPKg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", "requires": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" @@ -33071,9 +35124,9 @@ } }, "prosemirror-model": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.2.tgz", - "integrity": "sha512-RXl0Waiss4YtJAUY3NzKH0xkJmsZupCIccqcIFoLTIKFlKNbIvFDRl27/kQy1FP8iUAxrjRRfIVvOebnnXJgqQ==", + "version": "1.25.7", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.7.tgz", + "integrity": "sha512-A79aN8QEFUwI6cax8Yq4Rpcx1TJZ3Kagn+ii7qLo4/V8H3mMiHrhFyhTyHHvpSnOgMPpWiDGSwM3etwrxE50ug==", "requires": { "orderedmap": "^2.0.0" } @@ -33087,13 +35140,13 @@ } }, "prosemirror-schema-list": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", - "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" + "prosemirror-transform": "^1.7.3" } }, "prosemirror-slash-menu": { @@ -33121,9 +35174,9 @@ } }, "prosemirror-state": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.3.tgz", - "integrity": "sha512-goFKORVbvPuAQaXhpbemJFRKJ2aixr+AZMGiquiqKxaucC6hlpHNZHWgz5R7dS4roHiwq9vDctE//CZ++o0W1Q==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", "requires": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -33131,31 +35184,31 @@ } }, "prosemirror-tables": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.0.tgz", - "integrity": "sha512-ujzOb37O2ahmqI626Y0N0V/SZxuA9OGNYnsIMWdfecwkc8S8OShOqeD4kKUxpD0JcP81Z8qy/ulrXQuKhS4WUg==", + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz", + "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==", "requires": { - "prosemirror-keymap": "^1.1.2", - "prosemirror-model": "^1.8.1", - "prosemirror-state": "^1.3.1", - "prosemirror-transform": "^1.2.1", - "prosemirror-view": "^1.13.3" + "prosemirror-keymap": "^1.2.3", + "prosemirror-model": "^1.25.4", + "prosemirror-state": "^1.4.4", + "prosemirror-transform": "^1.10.5", + "prosemirror-view": "^1.41.4" } }, "prosemirror-transform": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.0.tgz", - "integrity": "sha512-O4T697Cqilw06Zvc3Wm+e237R6eZtJL/xGMliCi+Uo8VL6qHk6afz1qq0zNjT3eZMuYwnP8ZS0+YxX/tfcE9TQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz", + "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==", "requires": { - "prosemirror-model": "^1.0.0" + "prosemirror-model": "^1.21.0" } }, "prosemirror-view": { - "version": "1.31.5", - "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.5.tgz", - "integrity": "sha512-tobRCDeCp61elR1d97XE/JTL9FDIfswZpWeNs7GKJjAJvWyMGHWYFCq29850p6bbG2bckP+i9n1vT56RifosbA==", + "version": "1.41.7", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.7.tgz", + "integrity": "sha512-jUwKNCEIGiqdvhlS91/2QAg21e4dfU5bH2iwmSDQeosXJgKF7smG0YSplOWK0cjSNgIqXe7VXqo7EIfUFJdt3w==", "requires": { - "prosemirror-model": "^1.16.0", + "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } @@ -33372,6 +35425,15 @@ "resolved": "https://registry.npmjs.org/react-recaptcha/-/react-recaptcha-2.3.10.tgz", "integrity": "sha512-IyanbozsYCuHvTYDuskZTIEcRAMG/sdvAu5b29iQWoC8Kd3Zk9WGCv2oNxh6RfGHvSvgHAyaLjmC6ei/yMsJ7g==" }, + "react-reconciler": { + "version": "0.29.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.2.tgz", + "integrity": "sha512-zZQqIiYgDCTP/f1N/mAR10nJGrPD2ZR+jDSEsKWJHYC7Cm2wodlwbR3upZRdC3cjIjSlTLNVyO7Iu0Yy7t2AYg==", + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + } + }, "react-responsive": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/react-responsive/-/react-responsive-9.0.2.tgz", @@ -34042,6 +36104,40 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + } + } + }, "sister": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/sister/-/sister-3.0.2.tgz", @@ -34563,6 +36659,31 @@ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "devOptional": true }, + "tar-fs": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz", + "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "terser": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.1.tgz", @@ -34758,9 +36879,9 @@ } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "tsutils": { "version": "3.21.0", @@ -34777,6 +36898,34 @@ } } }, + "tsx": { + "version": "4.22.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", + "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", + "dev": true, + "requires": { + "esbuild": "~0.28.0", + "fsevents": "~2.3.3" + }, + "dependencies": { + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 7989b55..88d0b3d 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,13 @@ "build": "next build", "start": "next start", "lint": "tsc --noEmit && next lint", + "postinstall": "patch-package", "upgrade-interactive": "npm-check --update", - "scripts:getconfig": "ts-node -r dotenv/config --project scripts/tsconfig.json scripts/config/getConfig.ts" + "scripts:getconfig": "ts-node -r dotenv/config --project scripts/tsconfig.json scripts/config/getConfig.ts", + "perf": "tsx articles/react-prosemirror/scripts/run-editor-perf.ts", + "perf:nodeview": "tsx articles/react-prosemirror/scripts/run-nodeview-perf.ts", + "perf:keystroke-ramp": "tsx articles/react-prosemirror/scripts/run-keystroke-ramp.ts", + "perf:test": "cd articles/react-prosemirror && playwright test --config=playwright.perf.config.ts" }, "husky": { "hooks": { @@ -23,6 +28,7 @@ "author": "", "license": "ISC", "devDependencies": { + "@playwright/test": "^1.60.0", "@svgr/webpack": "^8.1.0", "@types/cors": "^2.8.13", "@types/node": "^18.11.15", @@ -48,17 +54,21 @@ "@types/styled-components": "^5.1.26", "autoprefixer": "^10.4.20", "babel-plugin-react-inline-svg-unique-id": "^1.4.0", + "chart.js": "^4.5.1", + "chartjs-node-canvas": "^5.0.0", "eslint": "^8.29.0", "eslint-config-next": "^13.0.7", "eslint-plugin-import": "^2.29.1", "git-commit-id": "^2.0.1", "husky": "^8.0.2", "npm-check": "^6.0.1", + "patch-package": "^8.0.1", "postcss": "^8.4.41", "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.6", "tailwindcss": "^3.4.9", "ts-node": "^10.9.1", + "tsx": "^4.22.4", "typescript": "^4.9.4" }, "dependencies": { @@ -67,12 +77,20 @@ "@codemirror/state": "^6.1.4", "@codemirror/view": "^6.7.1", "@emergence-engineering/lexical-slash-menu-plugin": "^0.0.3", + "@handlewithcare/react-prosemirror": "^3.0.6", "@inline-svg-unique-id/react": "^1.2.3", "@lexical/list": "^0.11.3", "@lexical/react": "^0.11.3", "@lexical/selection": "^0.11.3", "@popperjs/core": "^2.11.8", "@textea/json-viewer": "^2.12.0", + "@tiptap/core": "^3.24.0", + "@tiptap/extension-document": "^3.24.0", + "@tiptap/extension-history": "^3.24.0", + "@tiptap/extension-paragraph": "^3.24.0", + "@tiptap/extension-text": "^3.24.0", + "@tiptap/pm": "^3.24.0", + "@tiptap/react": "^3.24.0", "axios": "^1.2.1", "codemirror": "^6.0.1", "cors": "^2.8.5", @@ -111,6 +129,7 @@ "react-markdown": "^9.0.1", "react-popper": "^2.3.0", "react-recaptcha": "^2.3.10", + "react-reconciler": "^0.29.2", "react-responsive": "^9.0.2", "react-syntax-highlighter": "^15.5.0", "react-youtube": "^10.1.0", diff --git a/pages/blog/react-prosemirror.tsx b/pages/blog/react-prosemirror.tsx index ff91eac..424e0ca 100644 --- a/pages/blog/react-prosemirror.tsx +++ b/pages/blog/react-prosemirror.tsx @@ -31,7 +31,15 @@ const MD0 = /* language=md */ ` # React-Prosemirror vs Vanilla Prosemirror vs TipTap3 performance comparison ## TL;DR -React-Prosemirror makes development much easier if working with ProseMirror and React. Can use all the same plugins and features. And if using nodeviews it is much easier, we can access react context, hooks and state. But it comes with a cost. As we add more and more nodes to the document it has to pay the react reconciler tax. Vanilla ProseMirror is the fastest, but it needs the most amount of work for a full featured editor. TipTap3 is kind of a full featured editor from day 1 and performance wise almost identical to vanilla ProseMirror until we start adding nodeviews, we can use react context hooks state with \`ReactNodeViewRenderer\` to make it easier to develop, but it uses react Portals which adds tax. React-Proseirror performance becomes noticable at 5k nodes. TipTap3 performance becomes noticable around 2.5k-5k nodes with nodeviews. +React-Prosemirror makes development much easier if working with ProseMirror and React. +Can use all the same plugins and features. And if using nodeviews it is much easier, we can access react context, hooks and state. But it comes with a cost. +As we add more and more nodes to the document it has to pay the react reconciler tax. + +Vanilla ProseMirror is the fastest, but it needs the most amount of work for a full featured editor. + +TipTap3 is kind of a full featured editor from day 1 and performance wise almost identical to vanilla ProseMirror until we start adding nodeviews, we can use react context, hooks, +state with \`ReactNodeViewRenderer\` to make it easier to develop, but it uses react Portals which adds tax. +React-Proseirror performance issue becomes noticable at 5k nodes. TipTap3 performance issue becomes noticable around 2.5k-5k nodes with nodeviews. ## Introduction @@ -51,7 +59,7 @@ From an empty editor, in a single browser session, append paragraphs to the end How each "keystroke" is fired. Inside \`page.evaluate\`, for each cycle we dispatch synthetic \`InputEvent("beforeinput", {inputType: "insertText", data})\` events for the characters in "typing ", followed by a synthetic \`KeyboardEvent("keydown", {key: "Enter"})\`. Each editor's input plugin handles them as it would a real keystroke. No real OS-level input pipeline, no IME, no focus management — just the editor's reaction to the event. -- We keep going until a single 200-node batch exceeds 5s here, ≈40 nodes/sec — well past usable, or heap > 3.5 GB, or the renderer crashes, or a 50,000-node safety cap. +- We keep going until a single 200-node batch exceeds 5s here, ≈40 nodes/sec - well past usable, or heap > 3.5 GB, or the renderer crashes, or a 50,000-node safety cap. - We don't measure per keystroke latency. - We always append at the end of the document. - Synthetic events, we don't try to replicate a human typing experience, only pure engine throughput. diff --git a/pages/perf-react-prosemirror-snv.tsx b/pages/perf-react-prosemirror-snv.tsx new file mode 100644 index 0000000..6760dc8 --- /dev/null +++ b/pages/perf-react-prosemirror-snv.tsx @@ -0,0 +1,11 @@ +import dynamic from "next/dynamic"; + +// react-prosemirror + static React nodeview — impl key "v3-snv". +const PerfV3SnvPage = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v3-snv/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/pages/perf-react-prosemirror.tsx b/pages/perf-react-prosemirror.tsx new file mode 100644 index 0000000..5568462 --- /dev/null +++ b/pages/perf-react-prosemirror.tsx @@ -0,0 +1,13 @@ +import dynamic from "next/dynamic"; + +// react-prosemirror (barebone) perf harness — impl key "v3". +// Client-only: the editor reads `?n=` from window and manages its own DOM, +// so SSR is disabled to avoid hydration mismatch. +const PerfV3Page = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v3/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/pages/perf-tiptap-snv.tsx b/pages/perf-tiptap-snv.tsx new file mode 100644 index 0000000..53430c4 --- /dev/null +++ b/pages/perf-tiptap-snv.tsx @@ -0,0 +1,11 @@ +import dynamic from "next/dynamic"; + +// Tiptap 3 + static React nodeview — impl key "v5-snv". +const PerfV5SnvPage = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v5-snv/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/pages/perf-tiptap.tsx b/pages/perf-tiptap.tsx new file mode 100644 index 0000000..1ecf1c0 --- /dev/null +++ b/pages/perf-tiptap.tsx @@ -0,0 +1,11 @@ +import dynamic from "next/dynamic"; + +// Bare-bone Tiptap 3 perf harness — impl key "v5". +const PerfV5Page = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v5/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/pages/perf-vanilla-prosemirror-snv.tsx b/pages/perf-vanilla-prosemirror-snv.tsx new file mode 100644 index 0000000..e63fe58 --- /dev/null +++ b/pages/perf-vanilla-prosemirror-snv.tsx @@ -0,0 +1,11 @@ +import dynamic from "next/dynamic"; + +// Vanilla ProseMirror + static DOM nodeview — impl key "v4-snv". +const PerfV4SnvPage = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v4-snv/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/pages/perf-vanilla-prosemirror.tsx b/pages/perf-vanilla-prosemirror.tsx new file mode 100644 index 0000000..1b3856d --- /dev/null +++ b/pages/perf-vanilla-prosemirror.tsx @@ -0,0 +1,11 @@ +import dynamic from "next/dynamic"; + +// Vanilla ProseMirror (no React reconciler) perf harness — impl key "v4". +const PerfV4Page = dynamic( + () => import("../articles/react-prosemirror/editors/perf-v4/page"), + { ssr: false }, +); + +export default function Page() { + return ; +} diff --git a/patches/@handlewithcare+react-prosemirror+3.0.6.patch b/patches/@handlewithcare+react-prosemirror+3.0.6.patch new file mode 100644 index 0000000..57e5e82 --- /dev/null +++ b/patches/@handlewithcare+react-prosemirror+3.0.6.patch @@ -0,0 +1,138 @@ +diff --git a/node_modules/@handlewithcare/react-prosemirror/dist/cjs/plugins/reactKeys.js b/node_modules/@handlewithcare/react-prosemirror/dist/cjs/plugins/reactKeys.js +index 2bfe841..0e50870 100644 +--- a/node_modules/@handlewithcare/react-prosemirror/dist/cjs/plugins/reactKeys.js ++++ b/node_modules/@handlewithcare/react-prosemirror/dist/cjs/plugins/reactKeys.js +@@ -44,21 +44,16 @@ function reactKeys() { + return next; + }, + /** +- * Keeps node keys stable across transactions. +- * +- * To accomplish this, we map each node position forwards +- * through the transaction to identify its current position, +- * and assign its key to that new position, dropping it if the +- * node was deleted. +- */ apply (tr, value, _, newState) { ++ * PATCH(memory): see dist/esm/plugins/reactKeys.js for the ++ * full rationale. Short version: mutate the existing plugin ++ * state in place so React fibers can't pin historical Maps. ++ */ apply (tr, value, _, newState) { + if (!tr.docChanged || composing) { + return value; + } + const overrides = tr.getMeta(reactKeysPluginKey)?.overrides; +- const next = { +- posToKey: new Map(), +- keyToPos: new Map() +- }; ++ const nextPosToKey = new Map(); ++ const nextKeyToPos = new Map(); + const posToKeyEntries = Array.from(value.posToKey.entries()).sort((param, param1)=>{ + let [a] = param, [b] = param1; + return a - b; +@@ -70,17 +65,21 @@ function reactKeys() { + deleted: false + }; + if (deleted) continue; +- next.posToKey.set(newPos, key); +- next.keyToPos.set(key, newPos); ++ nextPosToKey.set(newPos, key); ++ nextKeyToPos.set(key, newPos); + } + newState.doc.descendants((_, pos)=>{ +- if (next.posToKey.has(pos)) return true; ++ if (nextPosToKey.has(pos)) return true; + const key = createNodeKey(); +- next.posToKey.set(pos, key); +- next.keyToPos.set(key, pos); ++ nextPosToKey.set(pos, key); ++ nextKeyToPos.set(key, pos); + return true; + }); +- return next; ++ value.posToKey.clear(); ++ value.keyToPos.clear(); ++ for (const [k, v] of nextPosToKey) value.posToKey.set(k, v); ++ for (const [k, v] of nextKeyToPos) value.keyToPos.set(k, v); ++ return value; + } + }, + props: { +diff --git a/node_modules/@handlewithcare/react-prosemirror/dist/esm/plugins/reactKeys.js b/node_modules/@handlewithcare/react-prosemirror/dist/esm/plugins/reactKeys.js +index 34f86a4..627a415 100644 +--- a/node_modules/@handlewithcare/react-prosemirror/dist/esm/plugins/reactKeys.js ++++ b/node_modules/@handlewithcare/react-prosemirror/dist/esm/plugins/reactKeys.js +@@ -29,21 +29,34 @@ export const reactKeysPluginKey = new PluginKey("@handlewithcare/react-prosemirr + return next; + }, + /** +- * Keeps node keys stable across transactions. +- * +- * To accomplish this, we map each node position forwards +- * through the transaction to identify its current position, +- * and assign its key to that new position, dropping it if the +- * node was deleted. +- */ apply (tr, value, _, newState) { ++ * Keeps node keys stable across transactions. ++ * ++ * To accomplish this, we map each node position forwards ++ * through the transaction to identify its current position, ++ * and assign its key to that new position, dropping it if the ++ * node was deleted. ++ * ++ * PATCH(memory): the upstream implementation returns a freshly ++ * allocated `{ posToKey, keyToPos }` on every apply. React fiber ++ * memoizedState pins those objects for memoized node views, so ++ * each unchanged node ends up holding the plugin-state snapshot ++ * from the time it last rendered — at N nodes this retains ++ * Σ(1..N) Map entries (O(N²)). To break the chain we keep stable ++ * identity for the outer object *and* its two Maps by mutating ++ * them in place: compute the next contents in temporary Maps ++ * (so iteration over the old Map isn't disturbed), then clear ++ * and re-fill the originals. Mutation across an EditorState ++ * boundary is normally a smell, but prosemirror-history doesn't ++ * snapshot plugin state and the only consumer (`useReactKeys`) ++ * reads from `view.state` (always the latest), so observable ++ * behaviour is unchanged. ++ */ apply (tr, value, _, newState) { + if (!tr.docChanged || composing) { + return value; + } + const overrides = tr.getMeta(reactKeysPluginKey)?.overrides; +- const next = { +- posToKey: new Map(), +- keyToPos: new Map() +- }; ++ const nextPosToKey = new Map(); ++ const nextKeyToPos = new Map(); + const posToKeyEntries = Array.from(value.posToKey.entries()).sort((param, param1)=>{ + let [a] = param, [b] = param1; + return a - b; +@@ -55,17 +68,21 @@ export const reactKeysPluginKey = new PluginKey("@handlewithcare/react-prosemirr + deleted: false + }; + if (deleted) continue; +- next.posToKey.set(newPos, key); +- next.keyToPos.set(key, newPos); ++ nextPosToKey.set(newPos, key); ++ nextKeyToPos.set(key, newPos); + } + newState.doc.descendants((_, pos)=>{ +- if (next.posToKey.has(pos)) return true; ++ if (nextPosToKey.has(pos)) return true; + const key = createNodeKey(); +- next.posToKey.set(pos, key); +- next.keyToPos.set(key, pos); ++ nextPosToKey.set(pos, key); ++ nextKeyToPos.set(key, pos); + return true; + }); +- return next; ++ value.posToKey.clear(); ++ value.keyToPos.clear(); ++ for (const [k, v] of nextPosToKey) value.posToKey.set(k, v); ++ for (const [k, v] of nextKeyToPos) value.keyToPos.set(k, v); ++ return value; + } + }, + props: { diff --git a/tsconfig.json b/tsconfig.json index c8dda15..04e0a55 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,12 +20,19 @@ "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "isolatedModules": true, - "incremental": true + "incremental": true, + "baseUrl": ".", + "paths": { + "@/lib/*": ["articles/react-prosemirror/editors/lib/*"] + } }, "include": [ "." ], "exclude": [ - "node_modules" + "node_modules", + "articles/react-prosemirror/e2e", + "articles/react-prosemirror/scripts", + "articles/react-prosemirror/playwright.perf.config.ts" ] } From fd8f313eb120394df85b206c9eb7ec97cd76d7c0 Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Mon, 1 Jun 2026 13:58:02 +0200 Subject: [PATCH 4/5] =?UTF-8?q?fixup!=20feat:=20=F0=9F=8E=B8=20react-prose?= =?UTF-8?q?mirror=20comparison?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/blog/react-prosemirror.tsx | 87 +++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 29 deletions(-) diff --git a/pages/blog/react-prosemirror.tsx b/pages/blog/react-prosemirror.tsx index 424e0ca..ff61295 100644 --- a/pages/blog/react-prosemirror.tsx +++ b/pages/blog/react-prosemirror.tsx @@ -9,10 +9,10 @@ import { LightBox } from "../../features/twBlog/LightBox"; export const articleReactProsemirrorMetadata: ArticleIntro = { title: - "React-Prosemirror vs Vanilla ProseMirror vs TipTap3 performance comparison", + "React-ProseMirror vs Vanilla ProseMirror vs TipTap performance comparison", author: "Viktor and matejcsok", authorLink: null, - introText: /* language=md */ `Can TipTap3 or React-Prosemirror beat vanilla ProseMirror?`, + introText: /* language=md */ `Can TipTap or React-ProseMirror beat vanilla ProseMirror?`, postId: "react-prosemirror", timestamp: 1780066915415, imgSrc: @@ -22,57 +22,71 @@ export const articleReactProsemirrorMetadata: ArticleIntro = { "ProseMirror", "Plugin Development", "Comparison", - "React-Prosemirror", - "TipTap3", + "React-ProseMirror", + "TipTap", ], }; const MD0 = /* language=md */ ` -# React-Prosemirror vs Vanilla Prosemirror vs TipTap3 performance comparison +# React-ProseMirror vs Vanilla ProseMirror vs TipTap performance comparison ## TL;DR -React-Prosemirror makes development much easier if working with ProseMirror and React. -Can use all the same plugins and features. And if using nodeviews it is much easier, we can access react context, hooks and state. But it comes with a cost. -As we add more and more nodes to the document it has to pay the react reconciler tax. +React-ProseMirror makes development much easier if working with ProseMirror and React. +Can use all the same plugins and features. And if using NodeViews it is much easier, we can access React context, hooks and state. But it comes with a cost. +As we add more and more nodes to the document it has to pay the React reconciler tax. -Vanilla ProseMirror is the fastest, but it needs the most amount of work for a full featured editor. +Vanilla ProseMirror is the fastest, but it needs the most amount of work for a full-featured editor. -TipTap3 is kind of a full featured editor from day 1 and performance wise almost identical to vanilla ProseMirror until we start adding nodeviews, we can use react context, hooks, -state with \`ReactNodeViewRenderer\` to make it easier to develop, but it uses react Portals which adds tax. -React-Proseirror performance issue becomes noticable at 5k nodes. TipTap3 performance issue becomes noticable around 2.5k-5k nodes with nodeviews. +TipTap ships as a near-full-featured editor out of the box and performance wise almost identical to vanilla ProseMirror until we start adding NodeViews, we can use React context, hooks, +state with \`ReactNodeViewRenderer\` to make it easier to develop, but it uses React Portals which adds tax. +React-ProseMirror performance issue becomes noticeable at 5k nodes. TipTap performance issue becomes noticeable around 2.5k-5k nodes with NodeViews. ## Introduction -Vanilla Prosemirror is the standard technology for rich text editing in the browser. It is a powerful and flexible library that provides a wide range of features and customization options. It comes with some basic plugins, but requires some work to make it a full featured online editor. On the other hand it has a huge community and there are a lot of free plugins made by other developers you can use to customize your editor. +Vanilla ProseMirror is the standard technology for rich text editing in the browser. It is a powerful and flexible library that provides a wide range of features and customization options. +It comes with some basic plugins, but requires some work to make it a full-featured online editor. On the other hand it has a huge community and there are a lot of free plugins made by other developers you can use to customize your editor. -TipTap3 is an abstraction layer built on top of Prosemirror, which provides a lot of pre-built plugins to start with. Much easier to plug and play with the official plugins. It is also fully customizable, but the abstraction layer makes it harder to customize. It has a solution for easier custom node views using [ReactNodeviewRenderer](https://tiptap.dev/docs/editor/extensions/custom-extensions/node-views/react) which makes it possible to use React components as node views, and accessing state and context. But we will see that it comes with a cost. +TipTap is an abstraction layer built on top of ProseMirror, which provides a lot of pre-built plugins to start with. Much easier to plug and play with the official plugins. +It is also fully customizable, but the abstraction layer makes it harder to customize. +It has a solution for easier custom NodeViews using [ReactNodeViewRenderer](https://tiptap.dev/docs/editor/extensions/custom-extensions/node-views/react) which makes it possible to use React components as NodeViews, +and accessing state and context. But we will see that it comes with a cost. -React-Prosemirror moved the rendering out of the editor view and into React. This makes it much easier to use ProseMirror with React: you can use plain React components for custom node views, share normal React context and hooks, and let the editor UI live in the same component tree as the rest of your app. You still get ProseMirror’s document model, transactions, plugins, and selection handling, but without fighting a separate DOM-rendering lifecycle. -[_This library provides an alternate implementation of ProseMirror's EditorView. It uses React as the rendering engine, rather than ProseMirror's home-brewed DOM update system. This allows us to provide a more comfortable integration with ProseMirror's powerful data model, transformations, and event management systems._](https://github.com/handlewithcarecollective/react-prosemirror#the-solution) +React-ProseMirror moved the rendering out of the editor view and into React. +This makes it much easier to use ProseMirror with React: you can use plain React components for custom NodeViews, share normal React context and hooks, +and let the editor UI live in the same component tree as the rest of your app. You still get ProseMirror's document model, transactions, plugins, and selection handling, but without fighting a separate DOM-rendering lifecycle. +[_This library provides an alternate implementation of ProseMirror's EditorView. +It uses React as the rendering engine, rather than ProseMirror's home-brewed DOM update system. +This allows us to provide a more comfortable integration with ProseMirror's powerful data model, transformations, and event management systems._](https://github.com/handlewithcarecollective/react-prosemirror#the-solution) ## Test Cases ### Test Case 1: Engine throughput and the cost of holding state as the document grows #### What the test does: -From an empty editor, in a single browser session, append paragraphs to the end of the document as fast as the engine allows. After every 200 appends, record a checkpoint (nodes, elapsedMs) and yield one animation frame so the browser can paint and the test harness can read CDP metrics. Every 2 seconds, an outer monitor polls Chrome's \`Performance.getMetrics\` and records the cumulative cost across six counters: ScriptDuration, TaskDuration, JSHeapUsedSize, Nodes (DOM), LayoutCount, RecalcStyleCount. +From an empty editor, in a single browser session, append paragraphs to the end of the document as fast as the engine allows. After every 200 appends, +record a checkpoint (nodes, elapsedMs) and yield one animation frame so the browser can paint and the test harness can read CDP metrics. +Every 2 seconds, an outer monitor polls Chrome's \`Performance.getMetrics\` and records the cumulative cost across six counters: ScriptDuration, TaskDuration, JSHeapUsedSize, Nodes (DOM), LayoutCount, RecalcStyleCount. -How each "keystroke" is fired. Inside \`page.evaluate\`, for each cycle we dispatch synthetic \`InputEvent("beforeinput", {inputType: "insertText", data})\` events for the characters in "typing ", followed by a synthetic \`KeyboardEvent("keydown", {key: "Enter"})\`. Each editor's input plugin handles them as it would a real keystroke. No real OS-level input pipeline, no IME, no focus management — just the editor's reaction to the event. +How each "keystroke" is fired. Inside \`page.evaluate\`, for each cycle we dispatch synthetic \`InputEvent("beforeinput", {inputType: "insertText", data})\` events for the characters in "typing ", +followed by a synthetic \`KeyboardEvent("keydown", {key: "Enter"})\`. +Each editor's view-level DOM input handlers pick these up and apply them exactly as they would a real keystroke +No real OS-level input pipeline, no IME, no focus management — just the editor's reaction to the event. - We keep going until a single 200-node batch exceeds 5s here, ≈40 nodes/sec - well past usable, or heap > 3.5 GB, or the renderer crashes, or a 50,000-node safety cap. -- We don't measure per keystroke latency. +- We don't measure per-keystroke latency. - We always append at the end of the document. - Synthetic events, we don't try to replicate a human typing experience, only pure engine throughput. `; const MD1 = ` #### Conclusions: -- React-Prosemirror pays a per transaction reconciler tax that scales with the document size. for every new paragraph react need to walk a growing tree, even when nothing has changed in the existing paragraphs -- Vanilla ProseMirror and TipTap3 let the \`EditorView\` to handle DOM updates directly, the cost is proportional to "what has changed" , not to document size. -- Memory usage scales with document size for Vanilla ProseMirror and TipTap3, but not for React-Prosemirror. For React-Prosemirror every paragraph in the document also exists as a React fibre - a JS object holding props, hooks, refs, parent/sibling pointers, and an alternate fibre for the next render. +- React-ProseMirror pays a per-transaction reconciler tax that scales with the document size. for every new paragraph React needs to walk a growing tree, even when nothing has changed in the existing paragraphs +- Vanilla ProseMirror and TipTap let the \`EditorView\` handle DOM updates directly, the cost is proportional to "what has changed" , not to document size. +- Memory usage scales with document size for Vanilla ProseMirror and TipTap, but not for React-ProseMirror. +For React-ProseMirror every paragraph in the document also exists as a React fiber - a JS object holding props, hooks, refs, parent/sibling pointers, and an alternate fiber for the next render. #### Disclosure: -We needed to patch a memory leak in the official React-Prosemirror implementation, without it the memory usage skyrocketed, and the stress test ended pretty quick. +We needed to patch a memory leak in the official React-ProseMirror implementation, without it the memory usage skyrocketed, and the stress test ended pretty quickly. `; const MD2 = ` @@ -85,7 +99,9 @@ const MD2 = ` const MD3 = /* language=md */ ` #### Conclusions: -- Mount cost scales with how many React fibres your engine creates, not how many DOM nodes the browser holds. Vanilla ProseMirror has zero React fibres for nodes so it has a flat curve. The two React-rendered engines each pay a per-paragraph reconciler cost at mount; Tiptap's ReactNodeViewRenderer adds another layer on top, which is why it ends up worst. +- Mount cost scales with how many React fibers your engine creates, not how many DOM nodes the browser holds. +Vanilla ProseMirror has zero React fibers for nodes so it has a flat curve. +The two React-rendered engines each pay a per-paragraph reconciler cost at mount; TipTap's ReactNodeViewRenderer adds another layer on top, which is why it ends up worst. `; const MD4 = ` @@ -93,18 +109,30 @@ const MD4 = ` #### What the test does: - Find the document size where typing feels laggy -- Increment doc size by 1k paragraphs with nodeview in each line +- Increment doc size by 1k paragraphs with NodeView in each line - Fire 150 real Chromium keystrokes via \`page.keyboard.press("a")\` - Stop when p95 INP > 100 ms for two consecutive iterations. `; const MD5 = ` #### Conclusions: - - Vanilla ProseMirror's typing stays smooth ~5× longer than Tiptap with the same nodeview. Same per-paragraph React component, same paragraph schema, same keystrokes - the only thing different is what owns the editor surface. Vanilla ProseMirror applies the mutation directly to the DOM and updates the affected fibre; Tiptap's ReactNodeViewRenderer adds portal-bridge synchronization on top, which dominates per-keystroke cost at scale. - - A memoized React nodeview is not free at scale. Even with React.memo, the reconciler still has to visit each fibre on every keystroke to ask "should I render?" - it can skip the render phase, not the walk. At 30k+ fibres, that walk alone exceeds the 100 ms budget. + - Vanilla ProseMirror's typing stays smooth ~5× longer than TipTap with the same NodeView. + Same per-paragraph React component, same paragraph schema, same keystrokes - the only thing different is what owns the editor surface. + Vanilla ProseMirror applies the mutation directly to the DOM and updates the affected fiber; TipTap's ReactNodeViewRenderer adds portal-bridge synchronization on top, which dominates per-keystroke cost at scale. + - A memoized React NodeView is not free at scale. Even with React.memo, the reconciler still has to visit each fiber on every keystroke to ask "should I render?" - it can skip the render phase, not the walk. + At 30k+ fibers, that walk alone exceeds the 100 ms budget. `; const MD6 = /* language=md */ ` +### Verdict + + - For most use cases React-ProseMirror is fine (blog posts, articles, even thesis or Moby Dick), no visual lags, but makes development much easier (React components/hooks/context). + - For extremely large content Vanilla ProseMirror or TipTap perform much better, until you have many Node Views, in that case Vanilla ProseMirror is the absolute winner. + - But even Vanilla ProseMirror can't handle the whole Bible, but at that point it is not even ProseMirror, but the \`contentEditable\` is the bottleneck. + A solution could be virtualization - which has not been implemented with ProseMirror yet - or splitting by chapters, and mounting one chapter at a time. +`; + +const MD7 = /* language=md */ ` ### Some reference: | Document | Paragraphs (≈) | |---|---| @@ -135,11 +163,11 @@ const stress1 = [ const stress2 = [ { src: "/blog/react-prosemirror/node-count-vs-time-v3-v4-v5.png", - title: "React-Prosemirror's layout count", + title: "React-ProseMirror's layout count", }, { src: "/blog/react-prosemirror/node-count-vs-time-v4-v5.png", - title: "React-Prosemirror's js heap used size", + title: "React-ProseMirror's js heap used size", }, ]; @@ -263,6 +291,7 @@ const Article = () => { + ); }; From b9064a01201f66cb0d84d743e9ddfc6f664470d3 Mon Sep 17 00:00:00 2001 From: Istvan Matejcsok <119620946+matejcsok-ee@users.noreply.github.com> Date: Tue, 2 Jun 2026 17:19:51 +0200 Subject: [PATCH 5/5] =?UTF-8?q?fix:=20=F0=9F=90=9B=20add=20firefox=20diagr?= =?UTF-8?q?ams?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/blog/react-prosemirror.tsx | 69 ++++++++++++++++++ .../ff-vs-chrome-tc1-throughput.png | Bin 0 -> 61781 bytes .../ff-vs-chrome-tc2-coldload.png | Bin 0 -> 81010 bytes .../ff-vs-chrome-tc3-ramp.png | Bin 0 -> 64938 bytes 4 files changed, 69 insertions(+) create mode 100644 public/blog/react-prosemirror/ff-vs-chrome-tc1-throughput.png create mode 100644 public/blog/react-prosemirror/ff-vs-chrome-tc2-coldload.png create mode 100644 public/blog/react-prosemirror/ff-vs-chrome-tc3-ramp.png diff --git a/pages/blog/react-prosemirror.tsx b/pages/blog/react-prosemirror.tsx index ff61295..7a4b57e 100644 --- a/pages/blog/react-prosemirror.tsx +++ b/pages/blog/react-prosemirror.tsx @@ -123,6 +123,24 @@ const MD5 = ` At 30k+ fibers, that walk alone exceeds the 100 ms budget. `; +const MDff = /* language=md */ ` +### Does this hold on Firefox? + We re-ran the portable test cases on Firefox 148 — same specs, same machine, only the engine swapped. + Memory is gone on purpose: Firefox exposes no JS-heap API to a page (\`performance.memory\` and \`measureUserAgentSpecificMemory\` are both Chromium-only), so the heap and script-duration graphs above can't be reproduced. +That leaves throughput, cold-load time-to-visible, and keystroke latency. + + One thing to know before reading the latency chart: Firefox's INP floor is ~56ms on an empty document vs Chromium's ~16ms, almost entirely paint/vsync quantization reported in coarse 8ms steps. +Don't compare the absolute numbers across engines - compare the slope above each engine's own + baseline. + + #### What changed, what didn't: + - Vanilla ProseMirror and React-ProseMirror keep their ranking and their shape. + React-ProseMirror is ~1.5× slower at sustained typing on Firefox, but the per-keystroke cost grows at the same rate on both engines - the reconciler tax belongs to the engine, not the browser. + - Vanilla ProseMirror stays flat on both. No surprises. + - TipTap with NodeViews is the one real divergence. The \`ReactNodeViewRenderer\` portal bridge is meaningfully more expensive on Firefox: steeper cold-load, and a keystroke lag breakpoint that lands roughly twice as early. + If you ship React NodeViews through TipTap, Firefox is your worst case, not Chrome. +`; + const MD6 = /* language=md */ ` ### Verdict @@ -189,6 +207,24 @@ const inputLatency = [ }, ]; +const firefixDiagrams = [ + { + src: "/blog/react-prosemirror/ff-vs-chrome-tc1-throughput.png", + title: "Firefox vs Chrome Test Case 1", + }, + { + src: "/blog/react-prosemirror/ff-vs-chrome-tc2-coldload.png", + title: "Firefox vs Chrome Test Case 2", + }, +]; + +const firefixDiagrams2 = [ + { + src: "/blog/react-prosemirror/ff-vs-chrome-tc3-ramp.png", + title: "Firefox vs Chrome Test Case 3", + }, +]; + const Article = () => { const [isOpen, setIsOpen] = useState(false); const [activeGraph, setActiveGraph] = useState(null); @@ -290,6 +326,39 @@ const Article = () => { + +
+ {firefixDiagrams.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ +
+ {firefixDiagrams2.map((image) => ( +
handleToggleImage(image.src)} + > + +
+ ))} +
+ diff --git a/public/blog/react-prosemirror/ff-vs-chrome-tc1-throughput.png b/public/blog/react-prosemirror/ff-vs-chrome-tc1-throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..7ea0058ef4ee6403ac779f6bbf137fac7dd313c2 GIT binary patch literal 61781 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 Mrmb3{Y#IE&0Em5YH~;_u literal 0 HcmV?d00001 diff --git a/public/blog/react-prosemirror/ff-vs-chrome-tc2-coldload.png b/public/blog/react-prosemirror/ff-vs-chrome-tc2-coldload.png new file mode 100644 index 0000000000000000000000000000000000000000..d57062456d925e815cb415991e14291940e9baaa GIT binary patch literal 81010 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