diff --git a/package-lock.json b/package-lock.json index 5470d77..7cc33e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "devchat", - "version": "0.0.34", + "version": "0.0.45", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "devchat", - "version": "0.0.34", + "version": "0.0.45", "dependencies": { "@emotion/react": "^11.10.8", "@mantine/core": "^6.0.10", @@ -16,6 +16,7 @@ "@mantine/tiptap": "^6.0.10", "@tabler/icons-react": "^2.17.0", "@tiptap/extension-link": "^2.0.3", + "@tiptap/pm": "^2.0.0", "@tiptap/react": "^2.0.3", "@tiptap/starter-kit": "^2.0.3", "axios": "^1.3.6", @@ -28,6 +29,7 @@ "react-markdown": "^8.0.7", "react-syntax-highlighter": "^15.5.0", "shell-escape": "^0.2.0", + "string-argv": "^0.3.2", "uuid": "^9.0.0" }, "devDependencies": { @@ -2727,7 +2729,6 @@ "version": "4.2.9", "resolved": "https://registry.npmjs.org/@linaria/core/-/core-4.2.9.tgz", "integrity": "sha512-ELcu37VNVOT/PU0L6WDIN+aLzNFyJrqoBYT0CucGOCAmODbojUMCv8oJYRbWzA3N34w1t199dN4UFdfRWFG2rg==", - "peer": true, "dependencies": { "@linaria/logger": "^4.0.0", "@linaria/tags": "^4.3.4", @@ -2741,7 +2742,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@linaria/logger/-/logger-4.0.0.tgz", "integrity": "sha512-YnBq0JlDWMEkTOK+tMo5yEVR0f5V//6qMLToGcLhTyM9g9i+IDFn51Z+5q2hLk7RdG4NBPgbcCXYi2w4RKsPeg==", - "peer": true, "dependencies": { "debug": "^4.1.1", "picocolors": "^1.0.0" @@ -2754,7 +2754,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/@linaria/tags/-/tags-4.3.4.tgz", "integrity": "sha512-W8zaLKtC4YFCwkZ9DMu2enCiD/zGyYmFSTzEvJP7ZycdftMizoOrWNOyF9kITyjGdq+jZvAXJz0BZDT6axgIRg==", - "peer": true, "dependencies": { "@babel/generator": "^7.20.4", "@linaria/logger": "^4.0.0", @@ -2768,7 +2767,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@linaria/utils/-/utils-4.3.3.tgz", "integrity": "sha512-xSe/tod9A44aIMbtds9fWLNe2TT080lLdRSaoqX+UHsBWqClkrw5cXEt3lm8Vr4hZiXT2r/1AldjuHb9YbUlMg==", - "peer": true, "dependencies": { "@babel/core": "^7.20.2", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", @@ -3061,7 +3059,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.1.tgz", "integrity": "sha512-ZR4aihtnnT9lMbhh5DEbsriJRlukRXmLZe7HmM+6ufJNNUDoazc75UX26xbgQlNUqgAqMcUdGFAnPc1JwgAdLQ==", - "peer": true, "dependencies": { "@babel/runtime": "^7.21.0" } @@ -3070,7 +3067,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@remirror/core-helpers/-/core-helpers-2.0.3.tgz", "integrity": "sha512-LqIPF4stGG69l9qu/FFicv9d9B+YaItzgDMC5A0CEvDQfKkGD3BfabLmfpnuWbsc06oKGdTduilgWcALLZoYLg==", - "peer": true, "dependencies": { "@babel/runtime": "^7.21.0", "@linaria/core": "4.2.9", @@ -3093,7 +3089,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@remirror/types/-/types-1.0.1.tgz", "integrity": "sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==", - "peer": true, "dependencies": { "type-fest": "^2.19.0" } @@ -3102,7 +3097,6 @@ "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "peer": true, "engines": { "node": ">=12.20" }, @@ -3444,7 +3438,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.0.3.tgz", "integrity": "sha512-I9dsInD89Agdm1QjFRO9dmJtU1ldVSILNPW0pEhv9wYqYVvl4HUj/JMtYNqu2jWrCHNXQcaX/WkdSdvGJtmg5g==", - "peer": true, "dependencies": { "prosemirror-changeset": "^2.2.0", "prosemirror-collab": "^1.3.0", @@ -3803,14 +3796,12 @@ "node_modules/@types/object.omit": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==", - "peer": true + "integrity": "sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==" }, "node_modules/@types/object.pick": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/object.pick/-/object.pick-1.3.2.tgz", - "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==", - "peer": true + "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3938,8 +3929,7 @@ "node_modules/@types/throttle-debounce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", - "peer": true + "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==" }, "node_modules/@types/unist": { "version": "2.0.6", @@ -4736,7 +4726,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-3.0.0.tgz", "integrity": "sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==", - "peer": true, "dependencies": { "deepmerge": "^2.2.1", "object.omit": "^3.0.0" @@ -4749,7 +4738,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5139,7 +5127,6 @@ "version": "2.1.10", "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz", "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==", - "peer": true, "engines": { "node": ">=12.13" }, @@ -5641,8 +5628,7 @@ "node_modules/crelt": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", - "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==", - "peer": true + "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" }, "node_modules/cross-spawn": { "version": "7.0.3", @@ -5732,8 +5718,7 @@ "node_modules/dash-get": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz", - "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==", - "peer": true + "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==" }, "node_modules/data-uri-to-buffer": { "version": "4.0.1", @@ -7575,7 +7560,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "peer": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -8627,7 +8611,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "peer": true, "dependencies": { "uc.micro": "^1.0.1" } @@ -8792,7 +8775,6 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "peer": true, "dependencies": { "argparse": "^2.0.1", "entities": "~3.0.1", @@ -8808,7 +8790,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "peer": true, "engines": { "node": ">=0.12" }, @@ -8819,8 +8800,7 @@ "node_modules/mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "peer": true + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "node_modules/media-typer": { "version": "0.3.0", @@ -9526,7 +9506,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "peer": true, "dependencies": { "is-extendable": "^1.0.0" }, @@ -9538,7 +9517,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "peer": true, "dependencies": { "isobject": "^3.0.1" }, @@ -9651,8 +9629,7 @@ "node_modules/orderedmap": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", - "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==", - "peer": true + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" }, "node_modules/p-limit": { "version": "3.1.0", @@ -10169,7 +10146,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz", "integrity": "sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==", - "peer": true, "dependencies": { "prosemirror-transform": "^1.0.0" } @@ -10178,7 +10154,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.0.tgz", "integrity": "sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA==", - "peer": true, "dependencies": { "prosemirror-state": "^1.0.0" } @@ -10187,7 +10162,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz", "integrity": "sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ==", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -10198,7 +10172,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.0.tgz", "integrity": "sha512-TZMitR8nlp9Xh42pDYGcWopCoFPmJduoyGJ7FjYM2/7gZKnfD41TIaZN5Q1cQjm6Fm/P5vk/DpVYFhS8kDdigw==", - "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", @@ -10209,7 +10182,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", - "peer": true, "dependencies": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", @@ -10221,7 +10193,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.1.tgz", "integrity": "sha512-YMV/IWBZ+LZSfaNcBbPcaQUiAiJRYFyJW2aapuNzL8nhIRsI7fIO0ykJFSe802+mWeoTsVJ1jxvRWPYqaUqljQ==", - "peer": true, "dependencies": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -10233,7 +10204,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", - "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" @@ -10243,7 +10213,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz", "integrity": "sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==", - "peer": true, "dependencies": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" @@ -10253,7 +10222,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.10.1.tgz", "integrity": "sha512-s7iaTLiX+qO5z8kF2NcMmy2T7mIlxzkS4Sp3vTKSYChPtbMpg6YxFkU0Y06rUg2WtKlvBu7v1bXzlGBkfjUWAA==", - "peer": true, "dependencies": { "markdown-it": "^13.0.1", "prosemirror-model": "^1.0.0" @@ -10263,7 +10231,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", - "peer": true, "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -10275,7 +10242,6 @@ "version": "1.19.0", "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.0.tgz", "integrity": "sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==", - "peer": true, "dependencies": { "orderedmap": "^2.0.0" } @@ -10284,7 +10250,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz", "integrity": "sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==", - "peer": true, "dependencies": { "prosemirror-model": "^1.19.0" } @@ -10293,7 +10258,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -10304,7 +10268,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -10315,7 +10278,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.2.tgz", "integrity": "sha512-/9JTeN6s58Zq66HXaxP6uf8PAmc7XXKZFPlOGVtLvxEd6xBP6WtzaJB9wBjiGUzwbdhdMEy7V62yuHqk/3VrnQ==", - "peer": true, "dependencies": { "prosemirror-keymap": "^1.1.2", "prosemirror-model": "^1.8.1", @@ -10328,7 +10290,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.4.tgz", "integrity": "sha512-0Yl9w7IdHkaCdqR+NE3FOucePME4OmiGcybnF1iasarEILP5U8+4xTnl53yafULjmwcg1SrSG65Hg7Zk2H2v3g==", - "peer": true, "dependencies": { "@babel/runtime": "^7.21.0", "@remirror/core-constants": "^2.0.1", @@ -10345,7 +10306,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz", "integrity": "sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==", - "peer": true, "dependencies": { "prosemirror-model": "^1.0.0" } @@ -10354,7 +10314,6 @@ "version": "1.31.1", "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.1.tgz", "integrity": "sha512-9NKJdXnGV4+1qFRi16XFZxpnx6zNok9MEj/HElkqUJ1HtOyKOICffKxqoXUUCAdHrrP+yMDvdXc6wT7GGWBL3A==", - "peer": true, "dependencies": { "prosemirror-model": "^1.16.0", "prosemirror-state": "^1.0.0", @@ -11331,8 +11290,7 @@ "node_modules/rope-sequence": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", - "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==", - "peer": true + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" }, "node_modules/run-parallel": { "version": "1.2.0", @@ -11826,6 +11784,14 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -12058,7 +12024,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", - "peer": true, "engines": { "node": ">=10" } @@ -12275,8 +12240,7 @@ "node_modules/uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "peer": true + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -12575,8 +12539,7 @@ "node_modules/w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "peer": true + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, "node_modules/walker": { "version": "1.0.8", @@ -15014,7 +14977,6 @@ "version": "4.2.9", "resolved": "https://registry.npmjs.org/@linaria/core/-/core-4.2.9.tgz", "integrity": "sha512-ELcu37VNVOT/PU0L6WDIN+aLzNFyJrqoBYT0CucGOCAmODbojUMCv8oJYRbWzA3N34w1t199dN4UFdfRWFG2rg==", - "peer": true, "requires": { "@linaria/logger": "^4.0.0", "@linaria/tags": "^4.3.4", @@ -15025,7 +14987,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/@linaria/logger/-/logger-4.0.0.tgz", "integrity": "sha512-YnBq0JlDWMEkTOK+tMo5yEVR0f5V//6qMLToGcLhTyM9g9i+IDFn51Z+5q2hLk7RdG4NBPgbcCXYi2w4RKsPeg==", - "peer": true, "requires": { "debug": "^4.1.1", "picocolors": "^1.0.0" @@ -15035,7 +14996,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/@linaria/tags/-/tags-4.3.4.tgz", "integrity": "sha512-W8zaLKtC4YFCwkZ9DMu2enCiD/zGyYmFSTzEvJP7ZycdftMizoOrWNOyF9kITyjGdq+jZvAXJz0BZDT6axgIRg==", - "peer": true, "requires": { "@babel/generator": "^7.20.4", "@linaria/logger": "^4.0.0", @@ -15046,7 +15006,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/@linaria/utils/-/utils-4.3.3.tgz", "integrity": "sha512-xSe/tod9A44aIMbtds9fWLNe2TT080lLdRSaoqX+UHsBWqClkrw5cXEt3lm8Vr4hZiXT2r/1AldjuHb9YbUlMg==", - "peer": true, "requires": { "@babel/core": "^7.20.2", "@babel/plugin-proposal-export-namespace-from": "^7.18.9", @@ -15261,7 +15220,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-2.0.1.tgz", "integrity": "sha512-ZR4aihtnnT9lMbhh5DEbsriJRlukRXmLZe7HmM+6ufJNNUDoazc75UX26xbgQlNUqgAqMcUdGFAnPc1JwgAdLQ==", - "peer": true, "requires": { "@babel/runtime": "^7.21.0" } @@ -15270,7 +15228,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@remirror/core-helpers/-/core-helpers-2.0.3.tgz", "integrity": "sha512-LqIPF4stGG69l9qu/FFicv9d9B+YaItzgDMC5A0CEvDQfKkGD3BfabLmfpnuWbsc06oKGdTduilgWcALLZoYLg==", - "peer": true, "requires": { "@babel/runtime": "^7.21.0", "@linaria/core": "4.2.9", @@ -15293,7 +15250,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@remirror/types/-/types-1.0.1.tgz", "integrity": "sha512-VlZQxwGnt1jtQ18D6JqdIF+uFZo525WEqrfp9BOc3COPpK4+AWCgdnAWL+ho6imWcoINlGjR/+3b6y5C1vBVEA==", - "peer": true, "requires": { "type-fest": "^2.19.0" }, @@ -15301,8 +15257,7 @@ "type-fest": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "peer": true + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==" } } }, @@ -15486,7 +15441,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-2.0.3.tgz", "integrity": "sha512-I9dsInD89Agdm1QjFRO9dmJtU1ldVSILNPW0pEhv9wYqYVvl4HUj/JMtYNqu2jWrCHNXQcaX/WkdSdvGJtmg5g==", - "peer": true, "requires": { "prosemirror-changeset": "^2.2.0", "prosemirror-collab": "^1.3.0", @@ -15821,14 +15775,12 @@ "@types/object.omit": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/object.omit/-/object.omit-3.0.0.tgz", - "integrity": "sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==", - "peer": true + "integrity": "sha512-I27IoPpH250TUzc9FzXd0P1BV/BMJuzqD3jOz98ehf9dQqGkxlq+hO1bIqZGWqCg5bVOy0g4AUVJtnxe0klDmw==" }, "@types/object.pick": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/object.pick/-/object.pick-1.3.2.tgz", - "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==", - "peer": true + "integrity": "sha512-sn7L+qQ6RLPdXRoiaE7bZ/Ek+o4uICma/lBFPyJEKDTPTBP1W8u0c4baj3EiS4DiqLs+Hk+KUGvMVJtAw3ePJg==" }, "@types/parse-json": { "version": "4.0.0", @@ -15956,8 +15908,7 @@ "@types/throttle-debounce": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/throttle-debounce/-/throttle-debounce-2.1.0.tgz", - "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==", - "peer": true + "integrity": "sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==" }, "@types/unist": { "version": "2.0.6", @@ -16547,7 +16498,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/babel-merge/-/babel-merge-3.0.0.tgz", "integrity": "sha512-eBOBtHnzt9xvnjpYNI5HmaPp/b2vMveE5XggzqHnQeHJ8mFIBrBv6WZEVIj5jJ2uwTItkqKo9gWzEEcBxEq0yw==", - "peer": true, "requires": { "deepmerge": "^2.2.1", "object.omit": "^3.0.0" @@ -16556,8 +16506,7 @@ "deepmerge": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", - "peer": true + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" } } }, @@ -16856,8 +16805,7 @@ "case-anything": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/case-anything/-/case-anything-2.1.10.tgz", - "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==", - "peer": true + "integrity": "sha512-JczJwVrCP0jPKh05McyVsuOg6AYosrB9XWZKbQzXeDAm2ClE/PJE/BcrrQrVyGYH7Jg8V/LDupmyL4kFlVsVFQ==" }, "chalk": { "version": "4.1.2", @@ -17216,8 +17164,7 @@ "crelt": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz", - "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==", - "peer": true + "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA==" }, "cross-spawn": { "version": "7.0.3", @@ -17279,8 +17226,7 @@ "dash-get": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/dash-get/-/dash-get-1.0.2.tgz", - "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==", - "peer": true + "integrity": "sha512-4FbVrHDwfOASx7uQVxeiCTo7ggSdYZbqs8lH+WU6ViypPlDbe9y6IP5VVUDQBv9DcnyaiPT5XT0UWHgJ64zLeQ==" }, "data-uri-to-buffer": { "version": "4.0.1", @@ -18628,7 +18574,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "peer": true, "requires": { "is-plain-object": "^2.0.4" } @@ -19439,7 +19384,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", - "peer": true, "requires": { "uc.micro": "^1.0.1" } @@ -19577,7 +19521,6 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz", "integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==", - "peer": true, "requires": { "argparse": "^2.0.1", "entities": "~3.0.1", @@ -19589,16 +19532,14 @@ "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "peer": true + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" } } }, "mdurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", - "peer": true + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" }, "media-typer": { "version": "0.3.0", @@ -20020,7 +19961,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-3.0.0.tgz", "integrity": "sha512-EO+BCv6LJfu+gBIF3ggLicFebFLN5zqzz/WWJlMFfkMyGth+oBkhxzDl0wx2W4GkLzuQs/FsSkXZb2IMWQqmBQ==", - "peer": true, "requires": { "is-extendable": "^1.0.0" } @@ -20029,7 +19969,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "peer": true, "requires": { "isobject": "^3.0.1" } @@ -20120,8 +20059,7 @@ "orderedmap": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.0.tgz", - "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==", - "peer": true + "integrity": "sha512-/pIFexOm6S70EPdznemIz3BQZoJ4VTFrhqzu0ACBqBgeLsLxq8e6Jim63ImIfwW/zAD1AlXpRMlOv3aghmo4dA==" }, "p-limit": { "version": "3.1.0", @@ -20498,7 +20436,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.2.0.tgz", "integrity": "sha512-QM7ohGtkpVpwVGmFb8wqVhaz9+6IUXcIQBGZ81YNAKYuHiFJ1ShvSzab4pKqTinJhwciZbrtBEk/2WsqSt2PYg==", - "peer": true, "requires": { "prosemirror-transform": "^1.0.0" } @@ -20507,7 +20444,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/prosemirror-collab/-/prosemirror-collab-1.3.0.tgz", "integrity": "sha512-+S/IJ69G2cUu2IM5b3PBekuxs94HO1CxJIWOFrLQXUaUDKL/JfBx+QcH31ldBlBXyDEUl+k3Vltfi1E1MKp2mA==", - "peer": true, "requires": { "prosemirror-state": "^1.0.0" } @@ -20516,7 +20452,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.5.1.tgz", "integrity": "sha512-ga1ga/RkbzxfAvb6iEXYmrEpekn5NCwTb8w1dr/gmhSoaGcQ0VPuCzOn5qDEpC45ql2oDkKoKQbRxLJwKLpMTQ==", - "peer": true, "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -20527,7 +20462,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.0.tgz", "integrity": "sha512-TZMitR8nlp9Xh42pDYGcWopCoFPmJduoyGJ7FjYM2/7gZKnfD41TIaZN5Q1cQjm6Fm/P5vk/DpVYFhS8kDdigw==", - "peer": true, "requires": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0", @@ -20538,7 +20472,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.3.1.tgz", "integrity": "sha512-GKTeE7ZoMsx5uVfc51/ouwMFPq0o8YrZ7Hx4jTF4EeGbXxBveUV8CGv46mSHuBBeXGmvu50guoV2kSnOeZZnUA==", - "peer": true, "requires": { "prosemirror-keymap": "^1.0.0", "prosemirror-model": "^1.0.0", @@ -20550,7 +20483,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.3.1.tgz", "integrity": "sha512-YMV/IWBZ+LZSfaNcBbPcaQUiAiJRYFyJW2aapuNzL8nhIRsI7fIO0ykJFSe802+mWeoTsVJ1jxvRWPYqaUqljQ==", - "peer": true, "requires": { "prosemirror-state": "^1.2.2", "prosemirror-transform": "^1.0.0", @@ -20562,7 +20494,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.2.0.tgz", "integrity": "sha512-eAW/M/NTSSzpCOxfR8Abw6OagdG0MiDAiWHQMQveIsZtoKVYzm0AflSPq/ymqJd56/Su1YPbwy9lM13wgHOFmQ==", - "peer": true, "requires": { "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.0.0" @@ -20572,7 +20503,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.1.tgz", "integrity": "sha512-kVK6WGC+83LZwuSJnuCb9PsADQnFZllt94qPP3Rx/vLcOUV65+IbBeH2nS5cFggPyEVJhGkGrgYFRrG250WhHQ==", - "peer": true, "requires": { "prosemirror-state": "^1.0.0", "w3c-keyname": "^2.2.0" @@ -20582,7 +20512,6 @@ "version": "1.10.1", "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.10.1.tgz", "integrity": "sha512-s7iaTLiX+qO5z8kF2NcMmy2T7mIlxzkS4Sp3vTKSYChPtbMpg6YxFkU0Y06rUg2WtKlvBu7v1bXzlGBkfjUWAA==", - "peer": true, "requires": { "markdown-it": "^13.0.1", "prosemirror-model": "^1.0.0" @@ -20592,7 +20521,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-menu/-/prosemirror-menu-1.2.1.tgz", "integrity": "sha512-sBirXxVfHalZO4f1ZS63WzewINK4182+7dOmoMeBkqYO8wqMBvBS7wQuwVOHnkMWPEh0+N0LJ856KYUN+vFkmQ==", - "peer": true, "requires": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", @@ -20604,7 +20532,6 @@ "version": "1.19.0", "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.19.0.tgz", "integrity": "sha512-/CvFGJnwc41EJSfDkQLly1cAJJJmBpZwwUJtwZPTjY2RqZJfM8HVbCreOY/jti8wTRbVyjagcylyGoeJH/g/3w==", - "peer": true, "requires": { "orderedmap": "^2.0.0" } @@ -20613,7 +20540,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prosemirror-schema-basic/-/prosemirror-schema-basic-1.2.1.tgz", "integrity": "sha512-vYBdIHsYKSDIqYmPBC7lnwk9DsKn8PnVqK97pMYP5MLEDFqWIX75JiaJTzndBii4bRuNqhC2UfDOfM3FKhlBHg==", - "peer": true, "requires": { "prosemirror-model": "^1.19.0" } @@ -20622,7 +20548,6 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.2.2.tgz", "integrity": "sha512-rd0pqSDp86p0MUMKG903g3I9VmElFkQpkZ2iOd3EOVg1vo5Cst51rAsoE+5IPy0LPXq64eGcCYlW1+JPNxOj2w==", - "peer": true, "requires": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", @@ -20633,7 +20558,6 @@ "version": "1.4.2", "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.2.tgz", "integrity": "sha512-puuzLD2mz/oTdfgd8msFbe0A42j5eNudKAAPDB0+QJRw8cO1ygjLmhLrg9RvDpf87Dkd6D4t93qdef00KKNacQ==", - "peer": true, "requires": { "prosemirror-model": "^1.0.0", "prosemirror-transform": "^1.0.0", @@ -20644,7 +20568,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.3.2.tgz", "integrity": "sha512-/9JTeN6s58Zq66HXaxP6uf8PAmc7XXKZFPlOGVtLvxEd6xBP6WtzaJB9wBjiGUzwbdhdMEy7V62yuHqk/3VrnQ==", - "peer": true, "requires": { "prosemirror-keymap": "^1.1.2", "prosemirror-model": "^1.8.1", @@ -20657,7 +20580,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/prosemirror-trailing-node/-/prosemirror-trailing-node-2.0.4.tgz", "integrity": "sha512-0Yl9w7IdHkaCdqR+NE3FOucePME4OmiGcybnF1iasarEILP5U8+4xTnl53yafULjmwcg1SrSG65Hg7Zk2H2v3g==", - "peer": true, "requires": { "@babel/runtime": "^7.21.0", "@remirror/core-constants": "^2.0.1", @@ -20669,7 +20591,6 @@ "version": "1.7.1", "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.7.1.tgz", "integrity": "sha512-VteoifAfpt46z0yEt6Fc73A5OID9t/y2QIeR5MgxEwTuitadEunD/V0c9jQW8ziT8pbFM54uTzRLJ/nLuQjMxg==", - "peer": true, "requires": { "prosemirror-model": "^1.0.0" } @@ -20678,7 +20599,6 @@ "version": "1.31.1", "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.31.1.tgz", "integrity": "sha512-9NKJdXnGV4+1qFRi16XFZxpnx6zNok9MEj/HElkqUJ1HtOyKOICffKxqoXUUCAdHrrP+yMDvdXc6wT7GGWBL3A==", - "peer": true, "requires": { "prosemirror-model": "^1.16.0", "prosemirror-state": "^1.0.0", @@ -21370,8 +21290,7 @@ "rope-sequence": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.3.tgz", - "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==", - "peer": true + "integrity": "sha512-85aZYCxweiD5J8yTEbw+E6A27zSnLPNDL0WfPdw3YYodq7WjnTKo0q4dtyQ2gz23iPT8Q9CUyJtAaUNcTxRf5Q==" }, "run-parallel": { "version": "1.2.0", @@ -21780,6 +21699,11 @@ "safe-buffer": "~5.1.0" } }, + "string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==" + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -21937,8 +21861,7 @@ "throttle-debounce": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-3.0.1.tgz", - "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==", - "peer": true + "integrity": "sha512-dTEWWNu6JmeVXY0ZYoPuH5cRIwc0MeGbJwah9KUNYSJwommQpCzTySTpEe8Gs1J23aeWEuAobe4Ag7EHVt/LOg==" }, "thunky": { "version": "1.1.0", @@ -22076,8 +21999,7 @@ "uc.micro": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", - "peer": true + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -22269,8 +22191,7 @@ "w3c-keyname": { "version": "2.2.6", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "peer": true + "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==" }, "walker": { "version": "1.0.8", diff --git a/package.json b/package.json index aebdc25..6e7b6bc 100644 --- a/package.json +++ b/package.json @@ -293,9 +293,9 @@ "@mantine/tiptap": "^6.0.10", "@tabler/icons-react": "^2.17.0", "@tiptap/extension-link": "^2.0.3", + "@tiptap/pm": "^2.0.0", "@tiptap/react": "^2.0.3", "@tiptap/starter-kit": "^2.0.3", - "@tiptap/pm": "^2.0.0", "axios": "^1.3.6", "dotenv": "^16.0.3", "ncp": "^2.0.0", @@ -306,6 +306,7 @@ "react-markdown": "^8.0.7", "react-syntax-highlighter": "^15.5.0", "shell-escape": "^0.2.0", + "string-argv": "^0.3.2", "uuid": "^9.0.0" } } diff --git a/src/toolwrapper/devchat.ts b/src/toolwrapper/devchat.ts index 656c424..f8da72b 100644 --- a/src/toolwrapper/devchat.ts +++ b/src/toolwrapper/devchat.ts @@ -1,13 +1,11 @@ // devchat.ts - -import { spawn } from "child_process"; -import { promisify } from "util"; import * as vscode from 'vscode'; import * as dotenv from 'dotenv'; import * as path from 'path'; import * as fs from 'fs'; import { logger } from '../util/logger'; +import { CommandRun } from "../util/commonUtil"; import ExtensionContextHolder from '../util/extensionContext'; @@ -47,59 +45,16 @@ export interface ChatResponse { isError: boolean; } - + class DevChat { - private childProcess: any; + private commandRun: CommandRun; - async spawnAsync(command: string, args: string[], options: any, onData: (data: string) => void): Promise<{ code: number, stdout: string; stderr: string }> { - return new Promise((resolve, reject) => { - this.childProcess = spawn(command, args, options); - - let stdout = ''; - let stderr = ''; - - this.childProcess.stdout.on('data', (data: { toString: () => any; }) => { - const dataStr = data.toString(); - onData(dataStr); - stdout += dataStr; - }); - - this.childProcess.stderr.on('data', (data: string) => { - stderr += data; - }); - - this.childProcess.on('close', (code: number) => { - if (stderr) { - logger.channel()?.error(stderr); - logger.channel()?.show(); - } - - if (code === 0) { - resolve({ code, stdout, stderr }); - } else { - reject({ code, stdout, stderr }); - } - }); - - // Add error event listener to handle command not found exception - this.childProcess.on('error', (error: any) => { - if (error.code === 'ENOENT') { - logger.channel()?.error(`Command not found: ${command}`); - logger.channel()?.show(); - } else { - logger.channel()?.error(`Error occurred: ${error.message}`); - logger.channel()?.show(); - } - reject({ code: error.code, stdout: "", stderr: error.message }); - }); - }); - }; + constructor() { + this.commandRun = new CommandRun(); + } public stop() { - if (this.childProcess) { - this.childProcess.kill(); - this.childProcess = null; - } + this.commandRun.stop(); } async chat(content: string, options: ChatOptions = {}, onData: (data: ChatResponse) => void): Promise { @@ -124,7 +79,6 @@ class DevChat { args.push(content) const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath; - // const openaiApiKey = process.env.OPENAI_API_KEY; const secretStorage: vscode.SecretStorage = ExtensionContextHolder.context!.secrets; let openaiApiKey = await secretStorage.get("devchat_OPENAI_API_KEY"); @@ -147,9 +101,8 @@ class DevChat { const openaiStream = vscode.workspace.getConfiguration('DevChat').get('OpenAI.stream'); const llmModel = vscode.workspace.getConfiguration('DevChat').get('llmModel'); const tokensPerPrompt = vscode.workspace.getConfiguration('DevChat').get('OpenAI.tokensPerPrompt'); - // const userHistoryPrompts = vscode.workspace.getConfiguration('DevChat').get('OpenAI.useHistoryPrompt'); - let devChat : string|undefined = vscode.workspace.getConfiguration('DevChat').get('DevChatPath'); + let devChat: string | undefined = vscode.workspace.getConfiguration('DevChat').get('DevChatPath'); if (!devChat) { devChat = 'devchat'; } @@ -157,7 +110,7 @@ class DevChat { if (options.parent) { args.push("-p", options.parent); } - + const devchatConfig = { model: openaiModel, provider: llmModel, @@ -176,7 +129,7 @@ class DevChat { try { const parseOutData = (stdout: string, isPartial: boolean) => { const responseLines = stdout.trim().split("\n"); - + if (responseLines.length < 2) { return { "prompt-hash": "", @@ -233,7 +186,7 @@ class DevChat { }; logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`); - const { code, stdout, stderr } = await this.spawnAsync(devChat, args, { + const { exitCode: code, stdout, stderr } = await this.commandRun.spawnAsync(devChat, args, { maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB cwd: workspaceDir, env: { @@ -241,7 +194,7 @@ class DevChat { OPENAI_API_KEY: openaiApiKey, ...openAiApiBaseObject }, - }, onStdoutPartial); + }, onStdoutPartial, undefined, undefined, undefined); if (stderr) { const errorMessage = stderr.trim().match(/Error:(.+)/)?.[1]; @@ -268,39 +221,21 @@ class DevChat { } async log(options: LogOptions = {}): Promise { - let args = ["log"]; - - if (options.skip) { - args.push('--skip', `${options.skip}`); - } else { - // const skipLogCount = vscode.workspace.getConfiguration('DevChat').get('logSkip'); - // args.push('--skip', `${skipLogCount}`); - } - if (options.maxCount) { - args.push('--max-count', `${options.maxCount}`); - } else { - const maxLogCount = vscode.workspace.getConfiguration('DevChat').get('maxLogCount'); - args.push('--max-count', `${maxLogCount}`); - } - - let devChat : string|undefined = vscode.workspace.getConfiguration('DevChat').get('DevChatPath'); - if (!devChat) { - devChat = 'devchat'; - } - + const args = this.buildLogArgs(options); + const devChat = this.getDevChatPath(); const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath; const openaiApiKey = process.env.OPENAI_API_KEY; try { logger.channel()?.info(`Running devchat with args: ${args.join(" ")}`); - const { code, stdout, stderr } = await this.spawnAsync(devChat, args, { + const { exitCode: code, stdout, stderr } = await this.commandRun.spawnAsync(devChat, args, { maxBuffer: 10 * 1024 * 1024, // Set maxBuffer to 10 MB cwd: workspaceDir, env: { ...process.env, OPENAI_API_KEY: openaiApiKey, }, - }, (partialResponse: string) => { }); + }, undefined, undefined, undefined, undefined); logger.channel()?.info(`Finish devchat with args: ${args.join(" ")}`); if (stderr) { @@ -309,13 +244,37 @@ class DevChat { return []; } - return JSON.parse(stdout.trim()).reverse(); + return JSON.parse(stdout.trim()).reverse(); } catch (error) { logger.channel()?.error(`Error getting log: ${error}`); logger.channel()?.show(); return []; } } + + private buildLogArgs(options: LogOptions): string[] { + let args = ["log"]; + + if (options.skip) { + args.push('--skip', `${options.skip}`); + } + if (options.maxCount) { + args.push('--max-count', `${options.maxCount}`); + } else { + const maxLogCount = vscode.workspace.getConfiguration('DevChat').get('maxLogCount'); + args.push('--max-count', `${maxLogCount}`); + } + + return args; + } + + private getDevChatPath(): string { + let devChat: string | undefined = vscode.workspace.getConfiguration('DevChat').get('DevChatPath'); + if (!devChat) { + devChat = 'devchat'; + } + return devChat; + } } export default DevChat; diff --git a/src/toolwrapper/dtm.ts b/src/toolwrapper/dtm.ts index 20052f2..b266acc 100644 --- a/src/toolwrapper/dtm.ts +++ b/src/toolwrapper/dtm.ts @@ -4,6 +4,7 @@ import * as path from 'path'; import * as fs from 'fs'; import { logger } from "../util/logger"; +import { CommandRun } from "../util/commonUtil"; interface DtmResponse { status: number; @@ -13,102 +14,18 @@ interface DtmResponse { class DtmWrapper { private workspaceDir: string; - private binaryPath: string; + private commandRun: CommandRun; constructor() { this.workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath || '.'; - this.binaryPath = 'dtm'; - - let binaryName: string; - switch (process.platform) { - case 'win32': - binaryName = 'dtm.exe'; - break; - case 'darwin': - binaryName = 'dtm'; - break; - case 'linux': - binaryName = 'dtm'; - break; - default: - vscode.window.showErrorMessage(`Unsupported platform: ${process.platform}`); - return; - } - - this.binaryPath = path.join(__dirname, '..', 'bin', process.platform, process.arch, binaryName); - if (!fs.existsSync(this.binaryPath)) { - logger.channel()?.error(`Binary not found: ${this.binaryPath}`); - logger.channel()?.show(); - } - } - - private async runCommand(command: string, args: string[]): Promise { - return new Promise((resolve, reject) => { - logger.channel()?.info(`Running command: ${command} ${args.join(' ')}`); - const child = spawn(command, args, { cwd: this.workspaceDir }); - let stdout = ''; - let stderr = ''; - - child.stdout.on('data', (data) => { - stdout += data; - }); - - child.stderr.on('data', (data) => { - stderr += data; - }); - - child.on('close', (code) => { - try { - const parsedOutput = JSON.parse(stdout.trim()); - if (code === 0) { - resolve(parsedOutput); - } else { - reject(parsedOutput); - } - } catch (error) { - // 处理 JSON 解析异常 - const errorObj = error as Error; - reject({ status: -1, message: 'JSON parse error', log: errorObj.message }); - } - }); - }); - } - - private async runCommand2(command: string, args: string[]): Promise { - return new Promise((resolve, reject) => { - logger.channel()?.info(`Running command: ${command} ${args.join(' ')}`); - const child = spawn(command, args, { cwd: this.workspaceDir }); - let stdout = ''; - let stderr = ''; - - child.stdout.on('data', (data) => { - stdout += data; - }); - - child.stderr.on('data', (data) => { - stderr += data; - }); - - child.on('close', (code) => { - if (code === null) { - code = 0; - } - resolve({ status: code, message: stdout, log: stderr }); - }); - }); - } - - async scaffold(directoryTree: string): Promise { - return await this.runCommand(this.binaryPath, ['scaffold', directoryTree, '-o', 'json']); - } - - async patch(patchFilePath: string): Promise { - return await this.runCommand(this.binaryPath, ['patch', patchFilePath, '-o', 'json']); + this.commandRun = new CommandRun(); } async commit(commitMsg: string): Promise { try { - return await this.runCommand(this.binaryPath, ['commit', '-m', commitMsg, '-o', 'json']); + logger.channel()?.info(`Running command: git commit -m ${commitMsg}`); + const result = await this.commandRun.spawnAsync("git", ['commit', '-m', commitMsg], { cwd: this.workspaceDir }, undefined, undefined, undefined, undefined); + return { status: result.exitCode || 0, message: result.stdout, log: result.stderr }; } catch (error) { // 处理 runCommand 中的 reject 错误 logger.channel()?.error(`Error in commit: ${error}`); @@ -120,7 +37,8 @@ class DtmWrapper { async commitall(commitMsg: string): Promise { try { logger.channel()?.info(`Running command: git commit -am ${commitMsg}`); - return await this.runCommand2("git", ['commit', '-am', commitMsg]); + const result = await this.commandRun.spawnAsync("git", ['commit', '-am', commitMsg], { cwd: this.workspaceDir }, undefined, undefined, undefined, undefined); + return { status: result.exitCode || 0, message: result.stdout, log: result.stderr }; } catch (error) { // 处理 runCommand 中的 reject 错误 logger.channel()?.error(`Error in commit: ${error}`); diff --git a/src/util/commonUtil.ts b/src/util/commonUtil.ts index 3b7486c..7655d8a 100644 --- a/src/util/commonUtil.ts +++ b/src/util/commonUtil.ts @@ -2,109 +2,154 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import * as vscode from 'vscode'; +import { parseArgsStringToArgv } from 'string-argv'; +import { logger } from './logger'; import { spawn, exec } from 'child_process'; export function createTempSubdirectory(subdir: string): string { - // 获取系统临时目录 - const tempDir = os.tmpdir(); - // 构建完整的目录路径 - let targetDir = path.join(tempDir, subdir, Date.now().toString()); - // 检查目录是否存在,如果存在则重新生成目录名称 - while (fs.existsSync(targetDir)) { - targetDir = path.join(tempDir, subdir, Date.now().toString()); - } - // 递归创建目录 - fs.mkdirSync(targetDir, { recursive: true }); - // 返回创建的目录的绝对路径 - return targetDir; + // 获取系统临时目录 + const tempDir = os.tmpdir(); + // 构建完整的目录路径 + let targetDir = path.join(tempDir, subdir, Date.now().toString()); + // 检查目录是否存在,如果存在则重新生成目录名称 + while (fs.existsSync(targetDir)) { + targetDir = path.join(tempDir, subdir, Date.now().toString()); + } + // 递归创建目录 + fs.mkdirSync(targetDir, { recursive: true }); + // 返回创建的目录的绝对路径 + return targetDir; } interface CommandResult { - exitCode: number | null; - stdout: string; - stderr: string; - } - - export async function runCommandAndWriteOutput( - command: string, - args: string[], - outputFile: string - ): Promise { - return new Promise((resolve) => { - // 获取当前工作区目录 - const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath || '.'; - - // 使用spawn执行命令 - const childProcess = spawn(command, args, { cwd: workspaceDir }); - - let stdout = ''; - let stderr = ''; - - // 监听stdout数据 - childProcess.stdout.on('data', (data) => { - stdout += data.toString(); - }); - - // 监听stderr数据 - childProcess.stderr.on('data', (data) => { - stderr += data.toString(); - }); - - // 监听进程退出事件 - childProcess.on('exit', (exitCode) => { - // 将命令输出结果写入到文件 - if (outputFile !== '') { - fs.writeFileSync(outputFile, stdout); - } - - // 返回结果 - resolve({ - exitCode, - stdout, - stderr, - }); - }); - }); - } + exitCode: number | null; + stdout: string; + stderr: string; +} - export async function runCommandStringAndWriteOutput( +export class CommandRun { + private childProcess: any; + + // init childProcess in construction function + constructor() { + this.childProcess = null; + } + + public async spawnAsync(command: string, args: string[], options: object, onData: ((data: string) => void) | undefined, onError: ((data: string) => void) | undefined, onOutputFile: ((command: string, stdout: string, stderr: string) => string) | undefined, outputFile: string | undefined): Promise { + return new Promise((resolve, reject) => { + this.childProcess = spawn(command, args, options); + + let stdout = ''; + let stderr = ''; + + this.childProcess.stdout.on('data', (data: { toString: () => any; }) => { + const dataStr = data.toString(); + if (onData) { + onData(dataStr); + } + stdout += dataStr; + }); + + this.childProcess.stderr.on('data', (data: string) => { + const dataStr = data.toString(); + if (onError) { + onError(dataStr); + } + stderr += dataStr; + }); + + this.childProcess.on('close', (code: number) => { + let outputData = stdout; + if (onOutputFile) { + outputData = onOutputFile(command + " " + args.join(" "), stdout, stderr); + } + + if (outputFile) { + fs.writeFileSync(outputFile, outputData); + } + + if (stderr) { + logger.channel()?.error(stderr); + logger.channel()?.show(); + } + + if (code === 0) { + resolve({ exitCode: code, stdout, stderr }); + } else { + reject({ exitCode: code, stdout, stderr }); + } + }); + + // Add error event listener to handle command not found exception + this.childProcess.on('error', (error: any) => { + if (error.code === 'ENOENT') { + logger.channel()?.error(`Command not found: ${command}`); + logger.channel()?.show(); + } else { + logger.channel()?.error(`Error occurred: ${error.message}`); + logger.channel()?.show(); + } + reject({ exitCode: error.code, stdout: "", stderr: error.message }); + }); + }); + }; + + public stop() { + if (this.childProcess) { + this.childProcess.kill(); + this.childProcess = null; + } + } +} + +export async function runCommandAndWriteOutput( + command: string, + args: string[], + outputFile: string +): Promise { + const run = new CommandRun(); + const options = { + cwd: vscode.workspace.workspaceFolders?.[0].uri.fsPath || '.', + }; + + return run.spawnAsync(command, args, options, undefined, undefined, undefined, outputFile); +} + +export async function runCommandStringAndWriteOutput( commandString: string, outputFile: string - ): Promise { - return new Promise((resolve) => { - const workspaceDir = vscode.workspace.workspaceFolders?.[0].uri.fsPath || '.'; - - // 使用exec执行命令行字符串 - const childProcess = exec(commandString, { cwd: workspaceDir }, (error, stdout, stderr) => { - // 将命令输出结果写入到文件 - const data = { - command: commandString, - content: stdout - }; - const jsonData = JSON.stringify(data); +): Promise { + const run = new CommandRun(); + const options = { + cwd: vscode.workspace.workspaceFolders?.[0].uri.fsPath || '.' + }; - fs.writeFileSync(outputFile, jsonData); - - // 返回结果 - resolve({ - exitCode: error && error.code? error.code : 0, - stdout, - stderr, - }); - }); - }); - } + // Split the commandString into command and args array using string-argv + const commandParts = parseArgsStringToArgv(commandString); + const command = commandParts[0]; + const args = commandParts.slice(1); - export async function getLanguageIdByFileName(fileName: string): Promise { - try { - // 打开指定的文件 - const document = await vscode.workspace.openTextDocument(fileName); - // 获取文件的语言标识符 - const languageId = document.languageId; - return languageId; - } catch (error) { - // 如果无法打开文件或发生其他错误,返回undefined - return undefined; - } - } \ No newline at end of file + const onOutputFile = (command: string, stdout: string, stderr: string): string => { + const data = { + command: commandString, + content: stdout, + }; + return JSON.stringify(data); + }; + + return run.spawnAsync(command, args, options, undefined, undefined, onOutputFile, outputFile); +} + +export async function getLanguageIdByFileName(fileName: string): Promise { + try { + // 打开指定的文件 + const document = await vscode.workspace.openTextDocument(fileName); + // 获取文件的语言标识符 + const languageId = document.languageId; + return languageId; + } catch (error) { + // 如果无法打开文件或发生其他错误,返回undefined + return undefined; + } +} \ No newline at end of file