diff --git a/package-lock.json b/package-lock.json index 946bf20cf..f00c093b6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,11 +16,11 @@ "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.1", "@nrwl/cypress": "15.9.2", - "@nrwl/eslint-plugin-nx": "^16.0.2", + "@nrwl/eslint-plugin-nx": "15.9.2", "@nrwl/jest": "15.9.2", "@nrwl/js": "15.9.2", "@nrwl/linter": "15.9.2", - "@nrwl/next": "^15.9.2", + "@nrwl/next": "15.9.2", "@nrwl/react": "15.9.2", "@nrwl/rollup": "15.9.2", "@nrwl/workspace": "15.9.2", @@ -30,13 +30,16 @@ "@swc/helpers": "~0.5.0", "@swc/jest": "0.2.20", "@testing-library/react": "14.0.0", + "@types/chai": "^4.3.5", "@types/jest": "^29.4.0", + "@types/mocha": "^10.0.1", "@types/node": "18.14.2", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "@typescript-eslint/eslint-plugin": "^5.36.1", "@typescript-eslint/parser": "^5.36.1", "babel-jest": "^29.4.1", + "chai": "^4.3.7", "cypress": "^12.2.0", "eslint": "~8.15.0", "eslint-config-next": "13.1.1", @@ -46,15 +49,162 @@ "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", + "htmlparser2": "^9.0.0", "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", + "micromark": "^3.2.0", + "mocha": "^10.2.0", "nx": "15.9.2", "prettier": "^2.6.2", "react-test-renderer": "18.2.0", + "rehype-stringify": "^9.0.3", + "remark": "^14.0.3", "swc-loader": "0.1.15", "ts-jest": "^29.0.5", "ts-node": "10.9.1", - "typescript": "~4.9.5" + "typescript": "~4.9.5", + "unist-util-select": "^4.0.3", + "unist-util-visit": "^4.1.2" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "dependencies": { + "@algolia/autocomplete-shared": "1.8.2" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.1.tgz", + "integrity": "sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw==", + "dependencies": { + "@algolia/cache-common": "4.17.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz", + "integrity": "sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.1.tgz", + "integrity": "sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA==", + "dependencies": { + "@algolia/cache-common": "4.17.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.1.tgz", + "integrity": "sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.1.tgz", + "integrity": "sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz", + "integrity": "sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ==", + "dependencies": { + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.1.tgz", + "integrity": "sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz", + "integrity": "sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w==", + "dependencies": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz", + "integrity": "sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.1.tgz", + "integrity": "sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g==", + "dependencies": { + "@algolia/logger-common": "4.17.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.1.tgz", + "integrity": "sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg==", + "dependencies": { + "@algolia/requester-common": "4.17.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz", + "integrity": "sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.1.tgz", + "integrity": "sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w==", + "dependencies": { + "@algolia/requester-common": "4.17.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz", + "integrity": "sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg==", + "dependencies": { + "@algolia/cache-common": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/requester-common": "4.17.1" } }, "node_modules/@alloc/quick-lru": { @@ -2136,6 +2286,11 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + }, "node_modules/@changesets/apply-release-plan": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", @@ -2764,6 +2919,38 @@ "node": ">=10.0.0" } }, + "node_modules/@docsearch/css": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.4.0.tgz", + "integrity": "sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg==" + }, + "node_modules/@docsearch/react": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.4.0.tgz", + "integrity": "sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "@docsearch/css": "3.4.0", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", @@ -2782,6 +2969,11 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, "node_modules/@emotion/babel-plugin/node_modules/babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -2827,15 +3019,30 @@ "stylis": "4.2.0" } }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, "node_modules/@emotion/hash": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, + "node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true }, "node_modules/@emotion/react": { "version": "11.11.0", @@ -2872,6 +3079,11 @@ "csstype": "^3.0.2" } }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, "node_modules/@emotion/sheet": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", @@ -3349,6 +3561,58 @@ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", "dev": true }, + "node_modules/@floating-ui/core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", + "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", + "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", + "dependencies": { + "@floating-ui/core": "^1.2.6" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "dependencies": { + "@floating-ui/dom": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom-interactions": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom-interactions/-/react-dom-interactions-0.13.3.tgz", + "integrity": "sha512-AnCW06eIZxzD/Hl1Qbi2JkQRU5KpY7Dn81k3xRfbvs+HylhB+t3x88/GNKLK39mMTlJ/ylxm5prUpiLrTWvifQ==", + "deprecated": "Package renamed to @floating-ui/react", + "dependencies": { + "@floating-ui/react-dom": "^1.0.1", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@giscus/react": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@giscus/react/-/react-2.2.8.tgz", + "integrity": "sha512-dPk3GMmsx5hHXXi8Xye7aen+lsZ/PR4I7AwTXKxKtAvxXsH5XAVB/bI6uWr4BrLEH3plZMzgOlVUIPOFJsHQCw==", + "dependencies": { + "giscus": "^1.2.8" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, "node_modules/@githubocto/flat-ui": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/@githubocto/flat-ui/-/flat-ui-0.14.1.tgz", @@ -3980,6 +4244,303 @@ "react-dom": "^16.8.0 || 17.x" } }, + "node_modules/@githubocto/flat-ui/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz", + "integrity": "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==", + "dependencies": { + "d3-array": "2", + "d3-axis": "2", + "d3-brush": "2", + "d3-chord": "2", + "d3-color": "2", + "d3-contour": "2", + "d3-delaunay": "5", + "d3-dispatch": "2", + "d3-drag": "2", + "d3-dsv": "2", + "d3-ease": "2", + "d3-fetch": "2", + "d3-force": "2", + "d3-format": "2", + "d3-geo": "2", + "d3-hierarchy": "2", + "d3-interpolate": "2", + "d3-path": "2", + "d3-polygon": "2", + "d3-quadtree": "2", + "d3-random": "2", + "d3-scale": "3", + "d3-scale-chromatic": "2", + "d3-selection": "2", + "d3-shape": "2", + "d3-time": "2", + "d3-time-format": "3", + "d3-timer": "2", + "d3-transition": "2", + "d3-zoom": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "dependencies": { + "internmap": "^1.0.0" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-axis": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", + "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-brush": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", + "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-chord": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", + "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "dependencies": { + "d3-path": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-contour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-delaunay": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", + "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "dependencies": { + "delaunator": "4" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", + "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "dependencies": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json", + "csv2tsv": "bin/dsv2dsv", + "dsv2dsv": "bin/dsv2dsv", + "dsv2json": "bin/dsv2json", + "json2csv": "bin/json2dsv", + "json2dsv": "bin/json2dsv", + "json2tsv": "bin/json2dsv", + "tsv2csv": "bin/dsv2dsv", + "tsv2json": "bin/dsv2json" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-ease": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", + "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "dependencies": { + "d3-dsv": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-geo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", + "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "dependencies": { + "d3-array": "^2.5.0" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "dependencies": { + "d3-color": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-random": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "dependencies": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "dependencies": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", + "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "dependencies": { + "d3-path": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "dependencies": { + "d3-array": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "dependencies": { + "d3-time": "1 - 2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "dependencies": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + }, + "peerDependencies": { + "d3-selection": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/d3-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", + "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "dependencies": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "node_modules/@githubocto/flat-ui/node_modules/delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "node_modules/@githubocto/flat-ui/node_modules/dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + }, + "node_modules/@githubocto/flat-ui/node_modules/internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "node_modules/@githubocto/flat-ui/node_modules/react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -4004,6 +4565,21 @@ "object-assign": "^4.1.1" } }, + "node_modules/@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", + "dependencies": { + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, "node_modules/@heroicons/react": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", @@ -6398,6 +6974,19 @@ "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", "dev": true }, + "node_modules/@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + }, + "node_modules/@lit/reactive-element": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.2.tgz", + "integrity": "sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, "node_modules/@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -6683,7 +7272,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.1.tgz", "integrity": "sha512-Hq+6QZ6kgmloCg8Kgrix+4F0HtvLqVK3FZAnlAoS0eonaDemHe1Km4kwjSWRE3JNpJNcKxFHF+jsZrYo0SxWoQ==", - "dev": true, "peer": true }, "node_modules/@next/eslint-plugin-next": { @@ -6722,7 +7310,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "android" @@ -6739,7 +7326,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "android" @@ -6756,7 +7342,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -6773,7 +7358,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "darwin" @@ -6790,7 +7374,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "freebsd" @@ -6807,7 +7390,6 @@ "cpu": [ "arm" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6824,7 +7406,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6841,7 +7422,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6858,7 +7438,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6875,7 +7454,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "linux" @@ -6892,7 +7470,6 @@ "cpu": [ "arm64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -6909,7 +7486,6 @@ "cpu": [ "ia32" ], - "dev": true, "optional": true, "os": [ "win32" @@ -6926,7 +7502,6 @@ "cpu": [ "x64" ], - "dev": true, "optional": true, "os": [ "win32" @@ -7084,14 +7659,130 @@ "dev": true }, "node_modules/@nrwl/eslint-plugin-nx": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.0.2.tgz", - "integrity": "sha512-4GMfdnoHMfn2PjK6VR1iHtUHzEEytxj3M5eAHdvPpfHf5iOLhhLxYsbyM4ngVOm7ztGDml1Zq1DRhzvjKgVtkg==", + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.9.2.tgz", + "integrity": "sha512-WeR+/mjzteBz9401mZroyML7sgnxF32FjMBcmVjuG5a5Eji36ChXn8Vtzm3IhfAY3k2sFbANxYLSNQYf5JJyqw==", "dev": true, "dependencies": { - "@nx/eslint-plugin": "16.0.2" + "@nrwl/devkit": "15.9.2", + "@typescript-eslint/utils": "^5.36.1", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "semver": "7.3.4" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.29.0", + "eslint-config-prettier": "^8.1.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nrwl/eslint-plugin-nx/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/@nrwl/jest": { "version": "15.9.2", "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.9.2.tgz", @@ -7894,719 +8585,10 @@ "node": ">=8" } }, - "node_modules/@nx/devkit": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.0.2.tgz", - "integrity": "sha512-BY1Bj0BbAl6XJL0O+QGTWPs/3WMJTEQ+Y4Lfoq4dZM7RllE6rAylr54NA2wa4lsgordZhq1+0g5PVhKKvSVRRw==", - "dev": true, - "dependencies": { - "@nrwl/devkit": "16.0.2", - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.3.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0" - }, - "peerDependencies": { - "nx": ">= 15 <= 17" - } - }, - "node_modules/@nx/devkit/node_modules/@nrwl/devkit": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.0.2.tgz", - "integrity": "sha512-SAEcImeQHdSTauO05FUn2vVl9/y5Kx1LNCZ4YE+SdY5/QRq18fuo/DCWmjOGG9M8r06vYGsAgMzkiB4soimcyA==", - "dev": true, - "dependencies": { - "@nx/devkit": "16.0.2" - } - }, - "node_modules/@nx/devkit/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/devkit/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/devkit/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@nx/eslint-plugin": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-16.0.2.tgz", - "integrity": "sha512-dxuYeueuwap03n87IZRugJ2s4+VCTy4Ab8rm5cK/qcG0q/WNwx0Kyjm0Mrul76J6BYMa4deXMD8g0foHzqObfw==", - "dev": true, - "dependencies": { - "@nrwl/eslint-plugin-nx": "16.0.2", - "@nx/devkit": "16.0.2", - "@nx/js": "16.0.2", - "@typescript-eslint/utils": "^5.58.0", - "chalk": "^4.1.0", - "confusing-browser-globals": "^1.0.9", - "semver": "7.3.4" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.58.0", - "eslint-config-prettier": "^8.1.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/@nx/eslint-plugin/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@nx/eslint-plugin/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/eslint-plugin/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/@nx/js": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-16.0.2.tgz", - "integrity": "sha512-pJmKQD2F/lop8+25sdrMblfPpMVFsmBZYbJSLBN45lXflp0vOC3m72P7kRk1680WE2l6YVGy899odg1dXCkpuA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.15.0", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-decorators": "^7.14.5", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/preset-env": "^7.15.0", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.14.8", - "@nrwl/js": "16.0.2", - "@nx/devkit": "16.0.2", - "@nx/workspace": "16.0.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "3.0.5", - "source-map-support": "0.5.19", - "tree-kill": "1.2.2", - "tslib": "^2.3.0" - } - }, - "node_modules/@nx/js/node_modules/@nrwl/js": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-16.0.2.tgz", - "integrity": "sha512-w1Di/S6CwwSgB9cie6a97hdJcIUQqT1i6gpZmzpHcerC9HlQU/GYeMj6toj2SYDdcygbGyjdPZw4+t0rbOUwtw==", - "dev": true, - "dependencies": { - "@nx/js": "16.0.2" - } - }, - "node_modules/@nx/js/node_modules/@phenomnomnominal/tsquery": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", - "dev": true, - "dependencies": { - "esquery": "^1.4.0" - }, - "peerDependencies": { - "typescript": "^3 || ^4 || ^5" - } - }, - "node_modules/@nx/js/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/js/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/js/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@nx/js/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@nx/js/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/js/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/nx-darwin-arm64": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.0.2.tgz", - "integrity": "sha512-nAT8WJ/qKGEvUcoFLHHye1dbwCd7b8CTZJlDF+ZkyCD/UZRHt4eJxy8gvKmxgkZTFb2+PPMQt4UORCUGpZzuoA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-darwin-x64": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.0.2.tgz", - "integrity": "sha512-r0rfOrZaOyrwFR5a0UT05xkYRumfkP65cRSZM1TjCA027AG9llYtkLT1hlz8uMKt+P12zrWVzXSqGLDi022ZZg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm-gnueabihf": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.0.2.tgz", - "integrity": "sha512-TfDQaGvCIDjn9sPg5U1Fr2rsSul/4PIQB59qrLBJRPiCWgpzwO71Il1qwSX68En+JH3lwXr+g5EjcDIEQ8fGYA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.0.2.tgz", - "integrity": "sha512-MICaUp7uz8WVQFXWPrmQaX1o4bdL7f3C7b3MDDf6+Zau6RcyQuw97UEKaYi9OqrV3w8yuPplqoLosFblAgb8uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-arm64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.0.2.tgz", - "integrity": "sha512-wcBURG+6A2srm+6ujj8SShjwmYWs0eHI5D8vgZr8Bni+lXbKP/IosE9JGXKtRoh27/owyR8PGHhDVzjv46tlFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.0.2.tgz", - "integrity": "sha512-Xyml2gFdVDHUj2g67DKz2aD78x1BciN1ZaaBTCxXL4MHfwR78SZa7mtRtE+1kj5OgVIwupZP50jq7C8GuSn3Hw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-linux-x64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.0.2.tgz", - "integrity": "sha512-j3xdN8I5DlTgW5N5eCquyBZswrrYf6EazUCvnEpeejygwh3N6XN7DlD68Bs0CB4Zmd0tWLfTjNVAtUJSP6g2mA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-arm64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.0.2.tgz", - "integrity": "sha512-R2pzoW3SUFBbe9C1vifJnXuysPl6kmutQHN2yQ9lwJptzPvMxfDU1FuXmKCGRUGmEwFxk/XPhwDL/ZcbABTrzw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/nx-win32-x64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.0.2.tgz", - "integrity": "sha512-r4H/SsqfpIJa8QLSpnscgkMnLsnkRYXj8TcILDrf+nJazfEdJZLUvVhN9O85OB7pskv86NuGfnJmJHHXy6QVQg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@nx/workspace": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-16.0.2.tgz", - "integrity": "sha512-cW5pJqBLZxqZThDCaqrlbYR4JqUOW9dhngyx0CQ09rbvyx06l08UWlOvCWx3+igPDBVYx4/ZBYdgzepwSpnX2w==", - "dev": true, - "dependencies": { - "@nrwl/workspace": "16.0.2", - "@nx/devkit": "16.0.2", - "@parcel/watcher": "2.0.4", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "dotenv": "~10.0.0", - "figures": "3.2.0", - "flat": "^5.0.2", - "ignore": "^5.0.4", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "nx": "16.0.2", - "open": "^8.4.0", - "rxjs": "^6.5.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - } - }, - "node_modules/@nx/workspace/node_modules/@nrwl/tao": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.0.2.tgz", - "integrity": "sha512-wimEe4OTpI7/nDK67RnpZpEXCU+fzA0sDgpIhMgbpPd0vPmKgaZv4nbs8zrm0goFlacmmnLaGRhhGYMOxE+1Lg==", - "dev": true, - "dependencies": { - "nx": "16.0.2" - }, - "bin": { - "tao": "index.js" - } - }, - "node_modules/@nx/workspace/node_modules/@nrwl/workspace": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-16.0.2.tgz", - "integrity": "sha512-RI8gltYGqgUWJJ7wb0wQYKXBdvPuYTZu7Jj7I8e3UZm0RB/xMNSailG/40uHRjxKO0Vo6Qwki/kXzm7ljRyREQ==", - "dev": true, - "dependencies": { - "@nx/workspace": "16.0.2" - } - }, - "node_modules/@nx/workspace/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@nx/workspace/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@nx/workspace/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@nx/workspace/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@nx/workspace/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@nx/workspace/node_modules/glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@nx/workspace/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/workspace/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@nx/workspace/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/workspace/node_modules/nx": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-16.0.2.tgz", - "integrity": "sha512-8Z9Bo1D2VbYjyC/F2ONensKjm10snz1UfkzURZiFA+oXikBPldiH1u67TOTpoCYZfyYQg4l6h6EpOaAvHF6Abg==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@nrwl/tao": "16.0.2", - "@parcel/watcher": "2.0.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "^3.0.0-rc.18", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.3.4", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "bin": { - "nx": "bin/nx.js" - }, - "optionalDependencies": { - "@nx/nx-darwin-arm64": "16.0.2", - "@nx/nx-darwin-x64": "16.0.2", - "@nx/nx-linux-arm-gnueabihf": "16.0.2", - "@nx/nx-linux-arm64-gnu": "16.0.2", - "@nx/nx-linux-arm64-musl": "16.0.2", - "@nx/nx-linux-x64-gnu": "16.0.2", - "@nx/nx-linux-x64-musl": "16.0.2", - "@nx/nx-win32-arm64-msvc": "16.0.2", - "@nx/nx-win32-x64-msvc": "16.0.2" - }, - "peerDependencies": { - "@swc-node/register": "^1.4.2", - "@swc/core": "^1.2.173" - }, - "peerDependenciesMeta": { - "@swc-node/register": { - "optional": true - }, - "@swc/core": { - "optional": true - } - } - }, - "node_modules/@nx/workspace/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@nx/workspace/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@nx/workspace/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@opentelemetry/api": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", - "dev": true, "optional": true, "peer": true, "engines": { @@ -8671,6 +8653,22 @@ "resolved": "packages/components", "link": true }, + "node_modules/@portaljs/core": { + "resolved": "packages/core", + "link": true + }, + "node_modules/@portaljs/remark-callouts": { + "resolved": "packages/remark-callouts", + "link": true + }, + "node_modules/@portaljs/remark-embed": { + "resolved": "packages/remark-embed", + "link": true + }, + "node_modules/@portaljs/remark-wiki-link": { + "resolved": "packages/remark-wiki-link", + "link": true + }, "node_modules/@primer/octicons-react": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@primer/octicons-react/-/octicons-react-12.1.0.tgz", @@ -8700,6 +8698,46 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-0.0.1.tgz", "integrity": "sha512-Z8R0kdAZui8eYTuGY5oQUA0SU4jYq43m4bZW6Dw0B35fUp+U3r+pCrkj0EADJAPv1UaKNskSv/lrfRdC7719Rg==" }, + "node_modules/@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "dependencies": { + "@babel/runtime": "^7.13.10" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, "node_modules/@radix-ui/react-presence": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-0.0.7.tgz", @@ -8719,11 +8757,57 @@ "react": "^16.8 || ^17.0" } }, + "node_modules/@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + }, + "peerDependencies": { + "@types/react": "*", + "@types/react-dom": "*", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + }, + "peerDependencies": { + "@types/react": "*", + "react": "^16.8 || ^17.0 || ^18.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@radix-ui/rect": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-0.0.1.tgz", "integrity": "sha512-8MswNYU/AVxLZxfy2eOqna5piTR+DJoS+miRPCKTJe4MHkp4ZT7nGW/zdyS9LCXwQB8HW2htdP5vKAJYMBVD9Q==" }, + "node_modules/@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -12654,6 +12738,12 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, "node_modules/@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -12714,6 +12804,12 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "node_modules/@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, "node_modules/@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -12757,7 +12853,7 @@ "version": "18.0.11", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", - "dev": true, + "devOptional": true, "dependencies": { "@types/react": "*" } @@ -13717,6 +13813,27 @@ "ajv": "^6.9.1" } }, + "node_modules/algoliasearch": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.1.tgz", + "integrity": "sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.17.1", + "@algolia/cache-common": "4.17.1", + "@algolia/cache-in-memory": "4.17.1", + "@algolia/client-account": "4.17.1", + "@algolia/client-analytics": "4.17.1", + "@algolia/client-common": "4.17.1", + "@algolia/client-personalization": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/logger-console": "4.17.1", + "@algolia/requester-browser-xhr": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/requester-node-http": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, "node_modules/ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -14924,6 +15041,12 @@ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "node_modules/browserify-zlib": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", @@ -15517,9 +15640,7 @@ "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "dev": true, - "peer": true + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "node_modules/cliui": { "version": "7.0.4", @@ -15532,10 +15653,9 @@ } }, "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "engines": { "node": ">=0.8" } @@ -15566,6 +15686,14 @@ "node": ">=0.10.0" } }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -15670,6 +15798,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/command-score": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz", + "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==" + }, "node_modules/commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -16013,6 +16146,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/core-js": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", + "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/core-js-compat": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz", @@ -16032,6 +16175,14 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, + "node_modules/cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "dependencies": { + "layout-base": "^1.0.0" + } + }, "node_modules/cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -16120,6 +16271,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", + "dev": true + }, "node_modules/css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -16506,171 +16663,280 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/d3": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz", - "integrity": "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==", + "node_modules/cytoscape": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", "dependencies": { - "d3-array": "2", - "d3-axis": "2", - "d3-brush": "2", - "d3-chord": "2", - "d3-color": "2", - "d3-contour": "2", - "d3-delaunay": "5", - "d3-dispatch": "2", - "d3-drag": "2", - "d3-dsv": "2", - "d3-ease": "2", - "d3-fetch": "2", - "d3-force": "2", - "d3-format": "2", - "d3-geo": "2", - "d3-hierarchy": "2", - "d3-interpolate": "2", - "d3-path": "2", - "d3-polygon": "2", - "d3-quadtree": "2", - "d3-random": "2", - "d3-scale": "3", - "d3-scale-chromatic": "2", - "d3-selection": "2", - "d3-shape": "2", - "d3-time": "2", - "d3-time-format": "3", - "d3-timer": "2", - "d3-transition": "2", - "d3-zoom": "2" + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "dependencies": { + "cose-base": "^1.0.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "dependencies": { + "cose-base": "^2.2.0" + }, + "peerDependencies": { + "cytoscape": "^3.2.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "dependencies": { + "layout-base": "^2.0.0" + } + }, + "node_modules/cytoscape-fcose/node_modules/layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + }, + "node_modules/d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "dependencies": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "dependencies": { - "internmap": "^1.0.0" + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-axis": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", - "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-brush": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", - "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "dependencies": { - "d3-dispatch": "1 - 2", - "d3-drag": "2", - "d3-interpolate": "1 - 2", - "d3-selection": "2", - "d3-transition": "2" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-chord": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", - "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "dependencies": { - "d3-path": "1 - 2" + "d3-path": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-contour": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", - "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "dependencies": { - "d3-array": "2" + "d3-array": "^3.2.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-delaunay": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", - "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "dependencies": { - "delaunator": "4" + "delaunator": "5" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-dispatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", - "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-drag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", - "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "dependencies": { - "d3-dispatch": "1 - 2", - "d3-selection": "2" + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-dsv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", - "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "dependencies": { - "commander": "2", - "iconv-lite": "0.4", + "commander": "7", + "iconv-lite": "0.6", "rw": "1" }, "bin": { - "csv2json": "bin/dsv2json", - "csv2tsv": "bin/dsv2dsv", - "dsv2dsv": "bin/dsv2dsv", - "dsv2json": "bin/dsv2json", - "json2csv": "bin/json2dsv", - "json2dsv": "bin/json2dsv", - "json2tsv": "bin/json2dsv", - "tsv2csv": "bin/dsv2dsv", - "tsv2json": "bin/dsv2json" + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-dsv/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-dsv/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/d3-ease": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", - "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-fetch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", - "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "dependencies": { - "d3-dsv": "1 - 2" + "d3-dsv": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-force": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", - "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "dependencies": { - "d3-dispatch": "1 - 2", - "d3-quadtree": "1 - 2", - "d3-timer": "1 - 2" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", - "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-geo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", - "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "dependencies": { - "d3-array": "^2.5.0" + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-geo-projection": { @@ -16702,118 +16968,172 @@ } }, "node_modules/d3-hierarchy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", - "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "dependencies": { - "d3-color": "1 - 2" + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", - "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-polygon": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", - "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-quadtree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", - "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-random": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", - "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-scale": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "dependencies": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-scale-chromatic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", - "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "dependencies": { - "d3-color": "1 - 2", - "d3-interpolate": "1 - 2" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-selection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", - "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-shape": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", - "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "dependencies": { - "d3-path": "1 - 2" + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "dependencies": { - "d3-array": "2" + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "dependencies": { - "d3-time": "1 - 2" + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" } }, "node_modules/d3-timer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", - "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-transition": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", - "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "dependencies": { - "d3-color": "1 - 2", - "d3-dispatch": "1 - 2", - "d3-ease": "1 - 2", - "d3-interpolate": "1 - 2", - "d3-timer": "1 - 2" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" }, "peerDependencies": { - "d3-selection": "2" + "d3-selection": "2 - 3" } }, "node_modules/d3-zoom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", - "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "dependencies": { - "d3-dispatch": "1 - 2", - "d3-drag": "2", - "d3-interpolate": "1 - 2", - "d3-selection": "2", - "d3-transition": "2" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "dependencies": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" } }, "node_modules/damerau-levenshtein": { @@ -16883,8 +17203,7 @@ "node_modules/dayjs": { "version": "1.11.7", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "dev": true + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -17042,6 +17361,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/defaults/node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -17104,9 +17432,12 @@ } }, "node_modules/delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "dependencies": { + "robust-predicates": "^3.0.0" + } }, "node_modules/delayed-stream": { "version": "1.0.0", @@ -17299,6 +17630,15 @@ "node": ">=8" } }, + "node_modules/disqus-react": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/disqus-react/-/disqus-react-1.1.5.tgz", + "integrity": "sha512-9fdG5m6c3wJzlCDLaMheuUagMVj3s5qgUSXdekpCsvzYOKG21AiuOoqyDzA0oXrpPnYzgpnsvPYqZ+i0hJPGZw==", + "peerDependencies": { + "react": "^15.6.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.6.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -17385,9 +17725,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" }, "node_modules/domutils": { "version": "2.8.0", @@ -17534,6 +17874,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==" }, + "node_modules/elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -17605,9 +17950,9 @@ } }, "node_modules/entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true, "engines": { "node": ">=0.12" @@ -19189,6 +19534,11 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, + "node_modules/fast-equals": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz", + "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==" + }, "node_modules/fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -19625,6 +19975,29 @@ "url": "https://www.patreon.com/infusion" } }, + "node_modules/framer-motion": { + "version": "10.12.16", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.16.tgz", + "integrity": "sha512-w/SfWEIWJkYSgRHYBmln7EhcNo31ao8Xexol8lGXf1pR/tlnBtf1HcxoUmEiEh6pacB4/geku5ami53AAQWHMQ==", + "dependencies": { + "tslib": "^2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -19931,6 +20304,14 @@ "giget": "dist/cli.mjs" } }, + "node_modules/giscus": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.2.8.tgz", + "integrity": "sha512-pufrgQYt1W+4ztiWp/PilLPN8NdyKvpbQ8jNqbAa1g84t6qqyevXHfkOYCi4x4d+y191vJAUc6seL1Dq74yUeA==", + "dependencies": { + "lit": "^2.6.1" + } + }, "node_modules/github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -20257,6 +20638,67 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/hast-util-to-estree": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", @@ -20288,6 +20730,47 @@ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, + "node_modules/hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hast-util-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", @@ -20297,6 +20780,37 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "node_modules/hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -20360,6 +20874,78 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + } + }, + "node_modules/htmlparser2/node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -20699,9 +21285,12 @@ } }, "node_modules/internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } }, "node_modules/interpret": { "version": "1.4.0", @@ -26795,6 +27384,41 @@ "node": ">=4.0" } }, + "node_modules/kbar": { + "version": "0.1.0-beta.40", + "resolved": "https://registry.npmjs.org/kbar/-/kbar-0.1.0-beta.40.tgz", + "integrity": "sha512-vEV02WuEBvKaSivO2DnNtyd3gUAbruYrZCax5fXcLcVTFV6q0/w6Ew3z6Qy+AqXxbZdWguwQ3POIwgdHevp+6A==", + "dependencies": { + "@radix-ui/react-portal": "^1.0.1", + "command-score": "^0.1.2", + "fast-equals": "^2.0.3", + "react-virtual": "^2.8.2", + "tiny-invariant": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/kbar/node_modules/react-virtual": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-virtual/-/react-virtual-2.10.4.tgz", + "integrity": "sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ==", + "funding": [ + "https://github.com/sponsors/tannerlinsley" + ], + "dependencies": { + "@reach/observe-rect": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.3 || ^17.0.0" + } + }, + "node_modules/khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -26834,6 +27458,11 @@ "language-subtag-registry": "~0.3.2" } }, + "node_modules/layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -26952,6 +27581,34 @@ "tslib": "^2.1.0" } }, + "node_modules/lit": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz", + "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==", + "dependencies": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.7.0" + } + }, + "node_modules/lit-element": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.2.tgz", + "integrity": "sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==", + "dependencies": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.7.0" + } + }, + "node_modules/lit-html": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.4.tgz", + "integrity": "sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==", + "dependencies": { + "@types/trusted-types": "^2.0.2" + } + }, "node_modules/load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -27383,6 +28040,16 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/markdown-to-jsx": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", @@ -27467,6 +28134,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.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==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mdast-util-from-markdown": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", @@ -27490,6 +28185,100 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdast-util-mdx": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", @@ -27638,11 +28427,158 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-wiki-link": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-wiki-link/-/mdast-util-wiki-link-0.0.2.tgz", + "integrity": "sha512-lSsR10/dPuYIxzjGZIGA4oYzsnEnqcsD6DTXL0pqdbBzNB9teKVZB2aIzZcUsdg31v/NoHOstkVwzbN6VrQLtw==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "mdast-util-to-markdown": "^0.6.5" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-wiki-link/node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, + "node_modules/mdx-mermaid": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdx-mermaid/-/mdx-mermaid-1.3.2.tgz", + "integrity": "sha512-8kw0tg3isKKBFzFwoe2DhIaEgKYtVeJXQtxZCCrdTPO0CTpXHnTHT0atDqsp7YkXi5iUCp/zAZPZu1cmr68T3w==", + "peerDependencies": { + "mermaid": ">=8.11.0", + "react": "^16.8.4 || ^17.0.0 || ^18.0.0", + "unist-util-visit": "^2.0.0" + } + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -27745,6 +28681,38 @@ "node": ">= 8" } }, + "node_modules/mermaid": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.2.2.tgz", + "integrity": "sha512-ifYKlCcZKYq48hxC1poJXnvk/PbCdgqqbg5B4qsybb8nIItPM1ATKqVEDkyde6BBJxVFhVJr9hoUjipzniQJZg==", + "dependencies": { + "@braintree/sanitize-url": "^6.0.2", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "3.0.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + } + }, + "node_modules/mermaid/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -27821,6 +28789,127 @@ "uvu": "^0.5.0" } }, + "node_modules/micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dev": true, + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dev": true, + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dev": true, + "dependencies": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dev": true, + "dependencies": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dev": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dev": true, + "dependencies": { + "micromark-util-types": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dev": true, + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/micromark-extension-mdx-expression": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", @@ -28544,6 +29633,271 @@ "ufo": "^1.1.2" } }, + "node_modules/mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "dependencies": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mocha/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/mocha/node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mocha/node_modules/nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/mocha/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/modern-normalize": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", @@ -28653,7 +30007,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/next/-/next-13.2.1.tgz", "integrity": "sha512-qhgJlDtG0xidNViJUPeQHLGJJoT4zDj/El7fP3D3OzpxJDUfxsm16cK4WTMyvSX1ciIfAq05u+0HqFAa+VJ+Hg==", - "dev": true, "peer": true, "dependencies": { "@next/env": "13.2.1", @@ -28725,11 +30078,21 @@ "react-dom": ">=16.x <=18.x" } }, + "node_modules/next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peer": true, + "peerDependencies": { + "next": "*", + "react": "*", + "react-dom": "*" + } + }, "node_modules/next/node_modules/@swc/helpers": { "version": "0.4.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dev": true, "peer": true, "dependencies": { "tslib": "^2.4.0" @@ -28739,7 +30102,6 @@ "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "funding": [ { "type": "opencollective", @@ -28852,6 +30214,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "node_modules/non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -31618,6 +32985,37 @@ "jsesc": "bin/jsesc" } }, + "node_modules/rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dev": true, + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", + "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "remark-parse": "^10.0.0", + "remark-stringify": "^10.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-external-links": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", @@ -31684,6 +33082,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remark-mdx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", @@ -31790,11 +33204,34 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/remark-stringify": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", + "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/remove-accents": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -33441,7 +34878,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dev": true, "peer": true, "dependencies": { "client-only": "0.0.1" @@ -33594,8 +35030,7 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { "version": "2.8.0", @@ -33679,6 +35114,11 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tabbable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.1.2.tgz", + "integrity": "sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==" + }, "node_modules/tailwindcss": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", @@ -34221,6 +35661,11 @@ "globrex": "^0.1.2" } }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, "node_modules/tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -34380,7 +35825,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true, "engines": { "node": ">=6.10" } @@ -35357,6 +36801,22 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-select": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-4.0.3.tgz", + "integrity": "sha512-1074+K9VyR3NyUz3lgNtHKm7ln+jSZXtLJM4E22uVuoFn88a/Go2pX8dusrt/W+KWH1ncn8jcd8uCQuvXb/fXA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "css-selector-parser": "^1.0.0", + "nth-check": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", @@ -35766,17 +37226,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-crossfilter/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-dataflow": { "version": "5.7.5", "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.5.tgz", @@ -35839,7 +37288,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "inBundle": true + "inBundle": true, + "license": "ISC" }, "node_modules/vega-encode": { "version": "4.9.2", @@ -35853,28 +37303,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-encode/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-encode/node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-event-selector": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", @@ -35904,19 +37332,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-force/node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-format": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.1.tgz", @@ -35929,36 +37344,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-format/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-format/node_modules/d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-format/node_modules/d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "dependencies": { - "d3-time": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-functions": { "version": "5.13.2", "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.13.2.tgz", @@ -35977,36 +37362,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-functions/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-functions/node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-functions/node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-geo": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.1.tgz", @@ -36022,36 +37377,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-geo/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-geo/node_modules/d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-geo/node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-hierarchy": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.1.tgz", @@ -36062,14 +37387,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-hierarchy/node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "engines": { - "node": ">=12" - } - }, "node_modules/vega-interpreter": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/vega-interpreter/-/vega-interpreter-1.0.5.tgz", @@ -36114,14 +37431,6 @@ "vega": "^5.20.0" } }, - "node_modules/vega-lite/node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, "node_modules/vega-lite/node_modules/tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -36182,49 +37491,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-loader/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/vega-loader/node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-loader/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/vega-parser": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.2.0.tgz", @@ -36247,17 +37513,6 @@ "vega-scale": "^7.3.0" } }, - "node_modules/vega-projection/node_modules/d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-regression": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.2.0.tgz", @@ -36269,17 +37524,6 @@ "vega-util": "^1.15.2" } }, - "node_modules/vega-regression/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-runtime": { "version": "6.1.4", "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.1.4.tgz", @@ -36301,43 +37545,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-scale/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-scale/node_modules/d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "dependencies": { - "d3-color": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-scale/node_modules/d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "dependencies": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-scenegraph": { "version": "4.10.2", "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.10.2.tgz", @@ -36351,25 +37558,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-scenegraph/node_modules/d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-scenegraph/node_modules/d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "dependencies": { - "d3-path": "^3.1.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-schema-url-parser": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vega-schema-url-parser/-/vega-schema-url-parser-2.2.0.tgz", @@ -36404,17 +37592,6 @@ "d3-array": "^3.2.2" } }, - "node_modules/vega-statistics/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-themes": { "version": "2.13.0", "resolved": "https://registry.npmjs.org/vega-themes/-/vega-themes-2.13.0.tgz", @@ -36434,28 +37611,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-time/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-time/node_modules/d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "dependencies": { - "d3-array": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-tooltip": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/vega-tooltip/-/vega-tooltip-0.32.0.tgz", @@ -36476,17 +37631,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-transforms/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/vega-typings": { "version": "0.24.1", "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-0.24.1.tgz", @@ -36528,25 +37672,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-view/node_modules/d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "dependencies": { - "internmap": "1 - 2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-view/node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "engines": { - "node": ">=12" - } - }, "node_modules/vega-voronoi": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.1.tgz", @@ -36557,25 +37682,6 @@ "vega-util": "^1.17.1" } }, - "node_modules/vega-voronoi/node_modules/d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "dependencies": { - "delaunator": "5" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/vega-voronoi/node_modules/delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "dependencies": { - "robust-predicates": "^3.0.0" - } - }, "node_modules/vega-wordcloud": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.4.tgz", @@ -36617,6 +37723,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vfile-matter": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", @@ -36982,6 +38102,21 @@ "defaults": "^1.0.3" } }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -37289,6 +38424,12 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, + "node_modules/workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -37446,6 +38587,42 @@ "node": ">=12" } }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/yargs/node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -37905,7 +39082,7 @@ }, "packages/components": { "name": "@portaljs/components", - "version": "0.1.6", + "version": "0.1.9", "dependencies": { "@githubocto/flat-ui": "^0.14.1", "@heroicons/react": "^2.0.17", @@ -38275,9 +39452,203 @@ "engines": { "node": ">=14.17" } + }, + "packages/core": { + "name": "@portaljs/core", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.3.3", + "@floating-ui/react-dom": "^1.3.0", + "@floating-ui/react-dom-interactions": "^0.13.3", + "@giscus/react": "^2.2.6", + "@headlessui/react": "^1.7.12", + "clsx": "^1.2.1", + "core-js": "^3.30.2", + "disqus-react": "^1.1.5", + "framer-motion": "^10.0.1", + "kbar": "0.1.0-beta.40", + "mdx-mermaid": "^1.3.2", + "mermaid": "^10.2.2", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "next": "^13.2.1", + "next-themes": "^0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "packages/remark-callouts": { + "name": "@portaljs/remark-callouts", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^1.2.0", + "svg-parser": "^2.0.4", + "unist-util-visit": "^4.1.0" + } + }, + "packages/remark-embed": { + "name": "@portaljs/remark-embed", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "unist-util-visit": "^4.1.1" + } + }, + "packages/remark-wiki-link": { + "name": "@portaljs/remark-wiki-link", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-to-markdown": "^1.5.0", + "mdast-util-wiki-link": "^0.0.2", + "micromark-util-symbol": "^1.0.1" + }, + "devDependencies": { + "micromark": "^3.1.0", + "remark-gfm": "^3.0.1" + } } }, "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz", + "integrity": "sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ==", + "requires": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz", + "integrity": "sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA==", + "requires": { + "@algolia/autocomplete-shared": "1.8.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz", + "integrity": "sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.1.tgz", + "integrity": "sha512-e91Jpu93X3t3mVdQwF3ZDjSFMFIfzSc+I76G4EX8nl9RYXgqcjframoL05VTjcD2YCsI18RIHAWVCBoCXVZnrw==", + "requires": { + "@algolia/cache-common": "4.17.1" + } + }, + "@algolia/cache-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.1.tgz", + "integrity": "sha512-fvi1WT8aSiGAKrcTw8Qg3RYgcwW8GZMHcqEm4AyDBEy72JZlFBSY80cTQ75MslINjCHXLDT+9EN8AGI9WVY7uA==" + }, + "@algolia/cache-in-memory": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.1.tgz", + "integrity": "sha512-NbBt6eBWlsXc5geSpfPRC5dkIB/0Ptthw8r0yM5Z7D3sPlYdnTZSO9y9XWXIptRMwmZe4cM8iBMN8y0tzbcBkA==", + "requires": { + "@algolia/cache-common": "4.17.1" + } + }, + "@algolia/client-account": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.1.tgz", + "integrity": "sha512-3rL/6ofJvyL+q8TiWM3qoM9tig+SY4gB1Vbsj+UeJPnJm8Khm+7OS+r+mFraqR6pTehYqN8yGYoE7x4diEn4aA==", + "requires": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "@algolia/client-analytics": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.1.tgz", + "integrity": "sha512-Bepr2w249vODqeBtM7i++tPmUsQ9B81aupUGbDWmjA/FX+jzQqOdhW8w1CFO5kWViNKTbz2WBIJ9U3x8hOa4bA==", + "requires": { + "@algolia/client-common": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "@algolia/client-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.1.tgz", + "integrity": "sha512-+r7kg4EgbFnGsDnoGSVNtXZO8xvZ0vzf1WAOV7sqV9PMf1bp6cpJP/3IuPrSk4t5w2KVl+pC8jfTM7HcFlfBEQ==", + "requires": { + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "@algolia/client-personalization": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.1.tgz", + "integrity": "sha512-gJku9DG/THJpfsSlG/az0a3QIn+VVff9kKh8PG8+7ZfxOHS+C+Y5YSeZVsC+c2cfoKLPo3CuHIiJ/p86erR3bA==", + "requires": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "@algolia/client-search": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.1.tgz", + "integrity": "sha512-Q5YfT5gVkx60PZDQBqp/zH9aUbBdC7HVvxupiHUgnCKqRQsRZjOhLest7AI6FahepuZLBZS62COrO7v+JvKY7w==", + "requires": { + "@algolia/client-common": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, + "@algolia/logger-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.1.tgz", + "integrity": "sha512-Us28Ot+fLEmX9M96sa65VZ8EyEEzhYPxfhV9aQyKDjfXbUdJlJxKt6wZpoEg9RAPSdO8IjK9nmuW2P8au3rRsg==" + }, + "@algolia/logger-console": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.1.tgz", + "integrity": "sha512-iKGQTpOjHiE64W3JIOu6dmDvn+AfYIElI9jf/Nt6umRPmP/JI9rK+OHUoW4pKrBtdG0DPd62ppeNXzSnLxY6/g==", + "requires": { + "@algolia/logger-common": "4.17.1" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.1.tgz", + "integrity": "sha512-W5mGfGDsyfVR+r4pUFrYLGBEM18gs38+GNt5PE5uPULy4uVTSnnVSkJkWeRkmLBk9zEZ/Nld8m4zavK6dtEuYg==", + "requires": { + "@algolia/requester-common": "4.17.1" + } + }, + "@algolia/requester-common": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.1.tgz", + "integrity": "sha512-HggXdjvVFQR0I5l7hM5WdHgQ1tqcRWeyXZz8apQ7zPWZhirmY2E9D6LVhDh/UnWQNEm7nBtM+eMFONJ3bZccIQ==" + }, + "@algolia/requester-node-http": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.1.tgz", + "integrity": "sha512-NzFWecXT6d0PPsQY9L+/qoK2deF74OLcpvqCH+Vh3mh+QzPsFafcBExdguAjZsAWDn1R6JEeFW7/fo/p0SE57w==", + "requires": { + "@algolia/requester-common": "4.17.1" + } + }, + "@algolia/transporter": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.1.tgz", + "integrity": "sha512-ZM+qhX47Vh46mWH8/U9ihvy98HdTYpYQDSlqBD7IbiUbbyoCMke+qmdSX2MGhR2FCcXBSxejsJKKVAfbpaLVgg==", + "requires": { + "@algolia/cache-common": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/requester-common": "4.17.1" + } + }, "@alloc/quick-lru": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", @@ -39710,6 +41081,11 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@braintree/sanitize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + }, "@changesets/apply-release-plan": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-6.1.3.tgz", @@ -40282,6 +41658,22 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@docsearch/css": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.4.0.tgz", + "integrity": "sha512-Hg8Xfma+rFwRi6Y/pfei4FJoQ1hdVURmmNs/XPoMTCPAImU+d5yxj+M+qdLtNjWRpfWziU4dQcqY94xgFBn2dg==" + }, + "@docsearch/react": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.4.0.tgz", + "integrity": "sha512-ufrp5879XYGojgS30ZAp8H4qIMbahRHB9M85VDBP36Xgz5QjYM54i1URKj5e219F7gqTtOivfztFTij6itc0MQ==", + "requires": { + "@algolia/autocomplete-core": "1.8.2", + "@algolia/autocomplete-preset-algolia": "1.8.2", + "@docsearch/css": "3.4.0", + "algoliasearch": "^4.0.0" + } + }, "@emotion/babel-plugin": { "version": "11.11.0", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", @@ -40300,6 +41692,11 @@ "stylis": "4.2.0" }, "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, "babel-plugin-macros": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", @@ -40332,6 +41729,13 @@ "@emotion/utils": "^1.2.1", "@emotion/weak-memoize": "^0.3.1", "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + } } }, "@emotion/hash": { @@ -40339,10 +41743,20 @@ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, + "@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "requires": { + "@emotion/memoize": "0.7.4" + } + }, "@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true }, "@emotion/react": { "version": "11.11.0", @@ -40369,6 +41783,13 @@ "@emotion/unitless": "^0.8.1", "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + } } }, "@emotion/sheet": { @@ -40614,6 +42035,45 @@ "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", "dev": true }, + "@floating-ui/core": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.2.6.tgz", + "integrity": "sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg==" + }, + "@floating-ui/dom": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.2.9.tgz", + "integrity": "sha512-sosQxsqgxMNkV3C+3UqTS6LxP7isRLwX8WMepp843Rb3/b0Wz8+MdUkxJksByip3C2WwLugLHN1b4ibn//zKwQ==", + "requires": { + "@floating-ui/core": "^1.2.6" + } + }, + "@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "requires": { + "@floating-ui/dom": "^1.2.1" + } + }, + "@floating-ui/react-dom-interactions": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom-interactions/-/react-dom-interactions-0.13.3.tgz", + "integrity": "sha512-AnCW06eIZxzD/Hl1Qbi2JkQRU5KpY7Dn81k3xRfbvs+HylhB+t3x88/GNKLK39mMTlJ/ylxm5prUpiLrTWvifQ==", + "requires": { + "@floating-ui/react-dom": "^1.0.1", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + } + }, + "@giscus/react": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/@giscus/react/-/react-2.2.8.tgz", + "integrity": "sha512-dPk3GMmsx5hHXXi8Xye7aen+lsZ/PR4I7AwTXKxKtAvxXsH5XAVB/bI6uWr4BrLEH3plZMzgOlVUIPOFJsHQCw==", + "requires": { + "giscus": "^1.2.8" + } + }, "@githubocto/flat-ui": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/@githubocto/flat-ui/-/flat-ui-0.14.1.tgz", @@ -41135,6 +42595,289 @@ } } }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "d3": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz", + "integrity": "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==", + "requires": { + "d3-array": "2", + "d3-axis": "2", + "d3-brush": "2", + "d3-chord": "2", + "d3-color": "2", + "d3-contour": "2", + "d3-delaunay": "5", + "d3-dispatch": "2", + "d3-drag": "2", + "d3-dsv": "2", + "d3-ease": "2", + "d3-fetch": "2", + "d3-force": "2", + "d3-format": "2", + "d3-geo": "2", + "d3-hierarchy": "2", + "d3-interpolate": "2", + "d3-path": "2", + "d3-polygon": "2", + "d3-quadtree": "2", + "d3-random": "2", + "d3-scale": "3", + "d3-scale-chromatic": "2", + "d3-selection": "2", + "d3-shape": "2", + "d3-time": "2", + "d3-time-format": "3", + "d3-timer": "2", + "d3-transition": "2", + "d3-zoom": "2" + } + }, + "d3-array": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", + "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "requires": { + "internmap": "^1.0.0" + } + }, + "d3-axis": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", + "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + }, + "d3-brush": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", + "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "d3-chord": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", + "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "requires": { + "d3-path": "1 - 2" + } + }, + "d3-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", + "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + }, + "d3-contour": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", + "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "requires": { + "d3-array": "2" + } + }, + "d3-delaunay": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", + "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "requires": { + "delaunator": "4" + } + }, + "d3-dispatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", + "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + }, + "d3-drag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", + "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-selection": "2" + } + }, + "d3-dsv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", + "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "requires": { + "commander": "2", + "iconv-lite": "0.4", + "rw": "1" + } + }, + "d3-ease": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", + "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + }, + "d3-fetch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", + "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "requires": { + "d3-dsv": "1 - 2" + } + }, + "d3-force": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", + "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-quadtree": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-format": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", + "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + }, + "d3-geo": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", + "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "requires": { + "d3-array": "^2.5.0" + } + }, + "d3-hierarchy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", + "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + }, + "d3-interpolate": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", + "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "requires": { + "d3-color": "1 - 2" + } + }, + "d3-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", + "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + }, + "d3-polygon": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", + "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + }, + "d3-quadtree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", + "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + }, + "d3-random": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", + "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + }, + "d3-scale": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", + "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "requires": { + "d3-array": "^2.3.0", + "d3-format": "1 - 2", + "d3-interpolate": "1.2.0 - 2", + "d3-time": "^2.1.1", + "d3-time-format": "2 - 3" + } + }, + "d3-scale-chromatic": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", + "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "requires": { + "d3-color": "1 - 2", + "d3-interpolate": "1 - 2" + } + }, + "d3-selection": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", + "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + }, + "d3-shape": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", + "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "requires": { + "d3-path": "1 - 2" + } + }, + "d3-time": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", + "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "requires": { + "d3-array": "2" + } + }, + "d3-time-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", + "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "requires": { + "d3-time": "1 - 2" + } + }, + "d3-timer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", + "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + }, + "d3-transition": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", + "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "requires": { + "d3-color": "1 - 2", + "d3-dispatch": "1 - 2", + "d3-ease": "1 - 2", + "d3-interpolate": "1 - 2", + "d3-timer": "1 - 2" + } + }, + "d3-zoom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", + "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "requires": { + "d3-dispatch": "1 - 2", + "d3-drag": "2", + "d3-interpolate": "1 - 2", + "d3-selection": "2", + "d3-transition": "2" + } + }, + "delaunator": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", + "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + }, + "dompurify": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", + "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + }, + "internmap": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", + "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + }, "react-dom": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", @@ -41158,6 +42901,14 @@ } } }, + "@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", + "requires": { + "client-only": "^0.0.1" + } + }, "@heroicons/react": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz", @@ -43021,6 +44772,19 @@ "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==", "dev": true }, + "@lit-labs/ssr-dom-shim": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.1.tgz", + "integrity": "sha512-kXOeFbfCm4fFf2A3WwVEeQj55tMZa8c8/f9AKHMobQMkzNUfUj+antR3fRPaZJawsa1aZiP/Da3ndpZrwEe4rQ==" + }, + "@lit/reactive-element": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.2.tgz", + "integrity": "sha512-rDfl+QnCYjuIGf5xI2sVJWdYIi56CTCwWa+nidKYX6oIuBYwUbT/vX4qbUDlHiZKJ/3FRNQ/tWJui44p6/stSA==", + "requires": { + "@lit-labs/ssr-dom-shim": "^1.0.0" + } + }, "@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -43271,7 +45035,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.2.1.tgz", "integrity": "sha512-Hq+6QZ6kgmloCg8Kgrix+4F0HtvLqVK3FZAnlAoS0eonaDemHe1Km4kwjSWRE3JNpJNcKxFHF+jsZrYo0SxWoQ==", - "dev": true, "peer": true }, "@next/eslint-plugin-next": { @@ -43303,7 +45066,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-android-arm-eabi/-/swc-android-arm-eabi-13.2.1.tgz", "integrity": "sha512-Yua7mUpEd1wzIT6Jjl3dpRizIfGp9NR4F2xeRuQv+ae+SDI1Em2WyM9m46UL+oeW5GpMiEHoaBagr47RScZFmQ==", - "dev": true, "optional": true, "peer": true }, @@ -43311,7 +45073,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-android-arm64/-/swc-android-arm64-13.2.1.tgz", "integrity": "sha512-Bifcr2f6VwInOdq1uH/9lp8fH7Nf7XGkIx4XceVd32LPJqG2c6FZU8ZRBvTdhxzXVpt5TPtuXhOP4Ij9UPqsVw==", - "dev": true, "optional": true, "peer": true }, @@ -43319,7 +45080,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.2.1.tgz", "integrity": "sha512-gvqm+fGMYxAkwBapH0Vvng5yrb6HTkIvZfY4oEdwwYrwuLdkjqnJygCMgpNqIFmAHSXgtlWxfYv1VC8sjN81Kw==", - "dev": true, "optional": true, "peer": true }, @@ -43327,7 +45087,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-13.2.1.tgz", "integrity": "sha512-HGqVqmaZWj6zomqOZUVbO5NhlABL0iIaxTmd0O5B0MoMa5zpDGoaHSG+fxgcWMXcGcxmUNchv1NfNOYiTKoHOg==", - "dev": true, "optional": true, "peer": true }, @@ -43335,7 +45094,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-freebsd-x64/-/swc-freebsd-x64-13.2.1.tgz", "integrity": "sha512-N/a4JarAq+E+g+9K2ywJUmDIgU2xs2nA+BBldH0oq4zYJMRiUhL0iaN9G4e72VmGOJ61L/3W6VN8RIUOwTLoqQ==", - "dev": true, "optional": true, "peer": true }, @@ -43343,7 +45101,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm-gnueabihf/-/swc-linux-arm-gnueabihf-13.2.1.tgz", "integrity": "sha512-WaFoerF/eRbhbE57TaIGJXbQAERADZ/RZ45u6qox9beb5xnWsyYgzX+WuN7Tkhyvga0/aMuVYFzS9CEay7D+bw==", - "dev": true, "optional": true, "peer": true }, @@ -43351,7 +45108,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-13.2.1.tgz", "integrity": "sha512-R+Jhc1/RJTnncE9fkePboHDNOCm1WJ8daanWbjKhfPySMyeniKYRwGn5SLYW3S8YlRS0QVdZaaszDSZWgUcsmA==", - "dev": true, "optional": true, "peer": true }, @@ -43359,7 +45115,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-13.2.1.tgz", "integrity": "sha512-oI1UfZPidGAVddlL2eOTmfsuKV9EaT1aktIzVIxIAgxzQSdwsV371gU3G55ggkurzfdlgF3GThFePDWF0d8dmw==", - "dev": true, "optional": true, "peer": true }, @@ -43367,7 +45122,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-13.2.1.tgz", "integrity": "sha512-PCygPwrQmS+7WUuAWWioWMZCzZm4PG91lfRxToLDg7yIm/3YfAw5N2EK2TaM9pzlWdvHQAqRMX/oLvv027xUiA==", - "dev": true, "optional": true, "peer": true }, @@ -43375,7 +45129,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-13.2.1.tgz", "integrity": "sha512-sUAKxo7CFZYGHNxheGh9nIBElLYBM6md/liEGfOTwh/xna4/GTTcmkGWkF7PdnvaYNgcPIQgHIMYiAa6yBKAVw==", - "dev": true, "optional": true, "peer": true }, @@ -43383,7 +45136,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-13.2.1.tgz", "integrity": "sha512-qDmyEjDBpl/vBXxuOOKKWmPQOcARcZIMach1s7kjzaien0SySut/PHRlj56sosa81Wt4hTGhfhZ1R7g1n7+B8w==", - "dev": true, "optional": true, "peer": true }, @@ -43391,7 +45143,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-13.2.1.tgz", "integrity": "sha512-2joqFQ81ZYPg6DcikIzQn3DgjKglNhPAozx6dL5sCNkr1CPMD0YIkJgT3CnYyMHQ04Qi3Npv0XX3MD6LJO8OCA==", - "dev": true, "optional": true, "peer": true }, @@ -43399,7 +45150,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-13.2.1.tgz", "integrity": "sha512-r3+0fSaIZT6N237iMzwUhfNwjhAFvXjqB+4iuW+wcpxW+LHm1g/IoxN8eSRcb8jPItC86JxjAxpke0QL97qd6g==", - "dev": true, "optional": true, "peer": true }, @@ -43477,19 +45227,98 @@ } } }, - "@nrwl/devkit": { + "@nrwl/devkit": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.2.tgz", + "integrity": "sha512-2DvTstVZb91m+d4wqUJMBHQ3elxyabdmFE6/3aXmtOGeDxTyXyDzf/1O6JvBBiL8K6XC3ZYchjtxUHgxl/NJ5A==", + "dev": true, + "requires": { + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.3.4", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "@nrwl/eslint-plugin-nx": { "version": "15.9.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.2.tgz", - "integrity": "sha512-2DvTstVZb91m+d4wqUJMBHQ3elxyabdmFE6/3aXmtOGeDxTyXyDzf/1O6JvBBiL8K6XC3ZYchjtxUHgxl/NJ5A==", + "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-15.9.2.tgz", + "integrity": "sha512-WeR+/mjzteBz9401mZroyML7sgnxF32FjMBcmVjuG5a5Eji36ChXn8Vtzm3IhfAY3k2sFbANxYLSNQYf5JJyqw==", "dev": true, "requires": { - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.3.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0" + "@nrwl/devkit": "15.9.2", + "@typescript-eslint/utils": "^5.36.1", + "chalk": "^4.1.0", + "confusing-browser-globals": "^1.0.9", + "semver": "7.3.4" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -43508,6 +45337,15 @@ "lru-cache": "^6.0.0" } }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -43516,15 +45354,6 @@ } } }, - "@nrwl/eslint-plugin-nx": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-16.0.2.tgz", - "integrity": "sha512-4GMfdnoHMfn2PjK6VR1iHtUHzEEytxj3M5eAHdvPpfHf5iOLhhLxYsbyM4ngVOm7ztGDml1Zq1DRhzvjKgVtkg==", - "dev": true, - "requires": { - "@nx/eslint-plugin": "16.0.2" - } - }, "@nrwl/jest": { "version": "15.9.2", "resolved": "https://registry.npmjs.org/@nrwl/jest/-/jest-15.9.2.tgz", @@ -44004,418 +45833,22 @@ } } }, - "@nrwl/tao": { - "version": "15.9.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.2.tgz", - "integrity": "sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA==", - "dev": true, - "requires": { - "nx": "15.9.2" - } - }, - "@nrwl/workspace": { - "version": "15.9.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.9.2.tgz", - "integrity": "sha512-4e3p1EtJKvvZfH5ghLT3PtPfdr21WfN1LjctMaFAaqwb7jMos0jQIZlLotDPvc9BD8zzyljniE6BijDSZOWncg==", - "dev": true, - "requires": { - "@nrwl/devkit": "15.9.2", - "@parcel/watcher": "2.0.4", - "chalk": "^4.1.0", - "chokidar": "^3.5.1", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "dotenv": "~10.0.0", - "figures": "3.2.0", - "flat": "^5.0.2", - "glob": "7.1.4", - "ignore": "^5.0.4", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "nx": "15.9.2", - "open": "^8.4.0", - "rxjs": "^6.5.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "glob": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", - "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "@nx/devkit": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.0.2.tgz", - "integrity": "sha512-BY1Bj0BbAl6XJL0O+QGTWPs/3WMJTEQ+Y4Lfoq4dZM7RllE6rAylr54NA2wa4lsgordZhq1+0g5PVhKKvSVRRw==", - "dev": true, - "requires": { - "@nrwl/devkit": "16.0.2", - "ejs": "^3.1.7", - "ignore": "^5.0.4", - "semver": "7.3.4", - "tmp": "~0.2.1", - "tslib": "^2.3.0" - }, - "dependencies": { - "@nrwl/devkit": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.0.2.tgz", - "integrity": "sha512-SAEcImeQHdSTauO05FUn2vVl9/y5Kx1LNCZ4YE+SdY5/QRq18fuo/DCWmjOGG9M8r06vYGsAgMzkiB4soimcyA==", - "dev": true, - "requires": { - "@nx/devkit": "16.0.2" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@nx/eslint-plugin": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/eslint-plugin/-/eslint-plugin-16.0.2.tgz", - "integrity": "sha512-dxuYeueuwap03n87IZRugJ2s4+VCTy4Ab8rm5cK/qcG0q/WNwx0Kyjm0Mrul76J6BYMa4deXMD8g0foHzqObfw==", - "dev": true, - "requires": { - "@nrwl/eslint-plugin-nx": "16.0.2", - "@nx/devkit": "16.0.2", - "@nx/js": "16.0.2", - "@typescript-eslint/utils": "^5.58.0", - "chalk": "^4.1.0", - "confusing-browser-globals": "^1.0.9", - "semver": "7.3.4" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@nx/js": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/js/-/js-16.0.2.tgz", - "integrity": "sha512-pJmKQD2F/lop8+25sdrMblfPpMVFsmBZYbJSLBN45lXflp0vOC3m72P7kRk1680WE2l6YVGy899odg1dXCkpuA==", + "@nrwl/tao": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.2.tgz", + "integrity": "sha512-+LqNC37w9c6q6Ukdpf0z0tt1PQFNi4gwhHpJvkYQiKRETHjyrrlyqTNEPEyA7PI62RuYC6VrpVw2gzI7ufqZEA==", "dev": true, "requires": { - "@babel/core": "^7.15.0", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-decorators": "^7.14.5", - "@babel/plugin-transform-runtime": "^7.15.0", - "@babel/preset-env": "^7.15.0", - "@babel/preset-typescript": "^7.15.0", - "@babel/runtime": "^7.14.8", - "@nrwl/js": "16.0.2", - "@nx/devkit": "16.0.2", - "@nx/workspace": "16.0.2", - "@phenomnomnominal/tsquery": "~5.0.1", - "babel-plugin-const-enum": "^1.0.1", - "babel-plugin-macros": "^2.8.0", - "babel-plugin-transform-typescript-metadata": "^0.3.1", - "chalk": "^4.1.0", - "fast-glob": "3.2.7", - "fs-extra": "^11.1.0", - "ignore": "^5.0.4", - "js-tokens": "^4.0.0", - "minimatch": "3.0.5", - "source-map-support": "0.5.19", - "tree-kill": "1.2.2", - "tslib": "^2.3.0" - }, - "dependencies": { - "@nrwl/js": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/js/-/js-16.0.2.tgz", - "integrity": "sha512-w1Di/S6CwwSgB9cie6a97hdJcIUQqT1i6gpZmzpHcerC9HlQU/GYeMj6toj2SYDdcygbGyjdPZw4+t0rbOUwtw==", - "dev": true, - "requires": { - "@nx/js": "16.0.2" - } - }, - "@phenomnomnominal/tsquery": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-5.0.1.tgz", - "integrity": "sha512-3nVv+e2FQwsW8Aw6qTU6f+1rfcJ3hrcnvH/mu9i8YhxO+9sqbOfpL8m6PbET5+xKOlz/VSbp0RoYWYCtIsnmuA==", - "dev": true, - "requires": { - "esquery": "^1.4.0" - } - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "nx": "15.9.2" } }, - "@nx/nx-darwin-arm64": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.0.2.tgz", - "integrity": "sha512-nAT8WJ/qKGEvUcoFLHHye1dbwCd7b8CTZJlDF+ZkyCD/UZRHt4eJxy8gvKmxgkZTFb2+PPMQt4UORCUGpZzuoA==", - "dev": true, - "optional": true - }, - "@nx/nx-darwin-x64": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.0.2.tgz", - "integrity": "sha512-r0rfOrZaOyrwFR5a0UT05xkYRumfkP65cRSZM1TjCA027AG9llYtkLT1hlz8uMKt+P12zrWVzXSqGLDi022ZZg==", - "dev": true, - "optional": true - }, - "@nx/nx-linux-arm-gnueabihf": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.0.2.tgz", - "integrity": "sha512-TfDQaGvCIDjn9sPg5U1Fr2rsSul/4PIQB59qrLBJRPiCWgpzwO71Il1qwSX68En+JH3lwXr+g5EjcDIEQ8fGYA==", - "dev": true, - "optional": true - }, - "@nx/nx-linux-arm64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.0.2.tgz", - "integrity": "sha512-MICaUp7uz8WVQFXWPrmQaX1o4bdL7f3C7b3MDDf6+Zau6RcyQuw97UEKaYi9OqrV3w8yuPplqoLosFblAgb8uw==", - "dev": true, - "optional": true - }, - "@nx/nx-linux-arm64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.0.2.tgz", - "integrity": "sha512-wcBURG+6A2srm+6ujj8SShjwmYWs0eHI5D8vgZr8Bni+lXbKP/IosE9JGXKtRoh27/owyR8PGHhDVzjv46tlFg==", - "dev": true, - "optional": true - }, - "@nx/nx-linux-x64-gnu": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.0.2.tgz", - "integrity": "sha512-Xyml2gFdVDHUj2g67DKz2aD78x1BciN1ZaaBTCxXL4MHfwR78SZa7mtRtE+1kj5OgVIwupZP50jq7C8GuSn3Hw==", - "dev": true, - "optional": true - }, - "@nx/nx-linux-x64-musl": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.0.2.tgz", - "integrity": "sha512-j3xdN8I5DlTgW5N5eCquyBZswrrYf6EazUCvnEpeejygwh3N6XN7DlD68Bs0CB4Zmd0tWLfTjNVAtUJSP6g2mA==", - "dev": true, - "optional": true - }, - "@nx/nx-win32-arm64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.0.2.tgz", - "integrity": "sha512-R2pzoW3SUFBbe9C1vifJnXuysPl6kmutQHN2yQ9lwJptzPvMxfDU1FuXmKCGRUGmEwFxk/XPhwDL/ZcbABTrzw==", - "dev": true, - "optional": true - }, - "@nx/nx-win32-x64-msvc": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.0.2.tgz", - "integrity": "sha512-r4H/SsqfpIJa8QLSpnscgkMnLsnkRYXj8TcILDrf+nJazfEdJZLUvVhN9O85OB7pskv86NuGfnJmJHHXy6QVQg==", - "dev": true, - "optional": true - }, - "@nx/workspace": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nx/workspace/-/workspace-16.0.2.tgz", - "integrity": "sha512-cW5pJqBLZxqZThDCaqrlbYR4JqUOW9dhngyx0CQ09rbvyx06l08UWlOvCWx3+igPDBVYx4/ZBYdgzepwSpnX2w==", + "@nrwl/workspace": { + "version": "15.9.2", + "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-15.9.2.tgz", + "integrity": "sha512-4e3p1EtJKvvZfH5ghLT3PtPfdr21WfN1LjctMaFAaqwb7jMos0jQIZlLotDPvc9BD8zzyljniE6BijDSZOWncg==", "dev": true, "requires": { - "@nrwl/workspace": "16.0.2", - "@nx/devkit": "16.0.2", + "@nrwl/devkit": "15.9.2", "@parcel/watcher": "2.0.4", "chalk": "^4.1.0", "chokidar": "^3.5.1", @@ -44424,10 +45857,11 @@ "dotenv": "~10.0.0", "figures": "3.2.0", "flat": "^5.0.2", + "glob": "7.1.4", "ignore": "^5.0.4", "minimatch": "3.0.5", "npm-run-path": "^4.0.1", - "nx": "16.0.2", + "nx": "15.9.2", "open": "^8.4.0", "rxjs": "^6.5.4", "tmp": "~0.2.1", @@ -44436,24 +45870,6 @@ "yargs-parser": "21.1.1" }, "dependencies": { - "@nrwl/tao": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.0.2.tgz", - "integrity": "sha512-wimEe4OTpI7/nDK67RnpZpEXCU+fzA0sDgpIhMgbpPd0vPmKgaZv4nbs8zrm0goFlacmmnLaGRhhGYMOxE+1Lg==", - "dev": true, - "requires": { - "nx": "16.0.2" - } - }, - "@nrwl/workspace": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@nrwl/workspace/-/workspace-16.0.2.tgz", - "integrity": "sha512-RI8gltYGqgUWJJ7wb0wQYKXBdvPuYTZu7Jj7I8e3UZm0RB/xMNSailG/40uHRjxKO0Vo6Qwki/kXzm7ljRyREQ==", - "dev": true, - "requires": { - "@nx/workspace": "16.0.2" - } - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -44463,12 +45879,6 @@ "color-convert": "^2.0.1" } }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -44514,84 +45924,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "nx": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/nx/-/nx-16.0.2.tgz", - "integrity": "sha512-8Z9Bo1D2VbYjyC/F2ONensKjm10snz1UfkzURZiFA+oXikBPldiH1u67TOTpoCYZfyYQg4l6h6EpOaAvHF6Abg==", - "dev": true, - "requires": { - "@nrwl/tao": "16.0.2", - "@nx/nx-darwin-arm64": "16.0.2", - "@nx/nx-darwin-x64": "16.0.2", - "@nx/nx-linux-arm-gnueabihf": "16.0.2", - "@nx/nx-linux-arm64-gnu": "16.0.2", - "@nx/nx-linux-arm64-musl": "16.0.2", - "@nx/nx-linux-x64-gnu": "16.0.2", - "@nx/nx-linux-x64-musl": "16.0.2", - "@nx/nx-win32-arm64-msvc": "16.0.2", - "@nx/nx-win32-x64-msvc": "16.0.2", - "@parcel/watcher": "2.0.4", - "@yarnpkg/lockfile": "^1.1.0", - "@yarnpkg/parsers": "^3.0.0-rc.18", - "@zkochan/js-yaml": "0.0.6", - "axios": "^1.0.0", - "chalk": "^4.1.0", - "cli-cursor": "3.1.0", - "cli-spinners": "2.6.1", - "cliui": "^7.0.2", - "dotenv": "~10.0.0", - "enquirer": "~2.3.6", - "fast-glob": "3.2.7", - "figures": "3.2.0", - "flat": "^5.0.2", - "fs-extra": "^11.1.0", - "glob": "7.1.4", - "ignore": "^5.0.4", - "js-yaml": "4.1.0", - "jsonc-parser": "3.2.0", - "lines-and-columns": "~2.0.3", - "minimatch": "3.0.5", - "npm-run-path": "^4.0.1", - "open": "^8.4.0", - "semver": "7.3.4", - "string-width": "^4.2.3", - "strong-log-transformer": "^2.1.0", - "tar-stream": "~2.2.0", - "tmp": "~0.2.1", - "tsconfig-paths": "^4.1.2", - "tslib": "^2.3.0", - "v8-compile-cache": "2.3.0", - "yargs": "^17.6.2", - "yargs-parser": "21.1.1" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -44600,12 +45932,6 @@ "requires": { "has-flag": "^4.0.0" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true } } }, @@ -44613,7 +45939,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz", "integrity": "sha512-O2yRJce1GOc6PAy3QxFM4NzFiWzvScDC1/5ihYBL6BUEVdq0XMWN01sppE+H6bBXbaFYipjwFLEWLg5PaSOThA==", - "dev": true, "optional": true, "peer": true }, @@ -45176,6 +46501,48 @@ } } }, + "@portaljs/core": { + "version": "file:packages/core", + "requires": { + "@docsearch/react": "^3.3.3", + "@floating-ui/react-dom": "^1.3.0", + "@floating-ui/react-dom-interactions": "^0.13.3", + "@giscus/react": "^2.2.6", + "@headlessui/react": "^1.7.12", + "clsx": "^1.2.1", + "core-js": "^3.30.2", + "disqus-react": "^1.1.5", + "framer-motion": "^10.0.1", + "kbar": "0.1.0-beta.40", + "mdx-mermaid": "^1.3.2", + "mermaid": "^10.2.2", + "prop-types": "^15.8.1" + } + }, + "@portaljs/remark-callouts": { + "version": "file:packages/remark-callouts", + "requires": { + "mdast-util-from-markdown": "^1.2.0", + "svg-parser": "^2.0.4", + "unist-util-visit": "^4.1.0" + } + }, + "@portaljs/remark-embed": { + "version": "file:packages/remark-embed", + "requires": { + "unist-util-visit": "^4.1.1" + } + }, + "@portaljs/remark-wiki-link": { + "version": "file:packages/remark-wiki-link", + "requires": { + "mdast-util-to-markdown": "^1.5.0", + "mdast-util-wiki-link": "^0.0.2", + "micromark": "^3.1.0", + "micromark-util-symbol": "^1.0.1", + "remark-gfm": "^3.0.1" + } + }, "@primer/octicons-react": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@primer/octicons-react/-/octicons-react-12.1.0.tgz", @@ -45200,6 +46567,23 @@ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-0.0.1.tgz", "integrity": "sha512-Z8R0kdAZui8eYTuGY5oQUA0SU4jYq43m4bZW6Dw0B35fUp+U3r+pCrkj0EADJAPv1UaKNskSv/lrfRdC7719Rg==" }, + "@radix-ui/react-compose-refs": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.1.tgz", + "integrity": "sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==", + "requires": { + "@babel/runtime": "^7.13.10" + } + }, + "@radix-ui/react-portal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.3.tgz", + "integrity": "sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-primitive": "1.0.3" + } + }, "@radix-ui/react-presence": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-0.0.7.tgz", @@ -45216,11 +46600,34 @@ } } }, + "@radix-ui/react-primitive": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.3.tgz", + "integrity": "sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-slot": "1.0.2" + } + }, + "@radix-ui/react-slot": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.2.tgz", + "integrity": "sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==", + "requires": { + "@babel/runtime": "^7.13.10", + "@radix-ui/react-compose-refs": "1.0.1" + } + }, "@radix-ui/rect": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/rect/-/rect-0.0.1.tgz", "integrity": "sha512-8MswNYU/AVxLZxfy2eOqna5piTR+DJoS+miRPCKTJe4MHkp4ZT7nGW/zdyS9LCXwQB8HW2htdP5vKAJYMBVD9Q==" }, + "@reach/observe-rect": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@reach/observe-rect/-/observe-rect-1.2.0.tgz", + "integrity": "sha512-Ba7HmkFgfQxZqqaeIWWkNK0rEhpxVQHIoVyW1YDSkGsGIXzcaW4deC8B0pZrNSSyLTdIk7y+5olKt5+g0GmFIQ==" + }, "@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -48069,6 +49476,12 @@ "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", "dev": true }, + "@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, "@types/ms": { "version": "0.7.31", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", @@ -48128,6 +49541,12 @@ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, + "@types/parse5": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-6.0.3.tgz", + "integrity": "sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==", + "dev": true + }, "@types/prettier": { "version": "2.7.2", "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", @@ -48171,7 +49590,7 @@ "version": "18.0.11", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", - "dev": true, + "devOptional": true, "requires": { "@types/react": "*" } @@ -48931,6 +50350,27 @@ "dev": true, "requires": {} }, + "algoliasearch": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.1.tgz", + "integrity": "sha512-4GDQ1RhP2qUR3x8PevFRbEdqZqIARNViZYjgTJmA1T7wRNtFA3W4Aqc/RsODqa1J8IO/QDla5x4tWuUS8NV8wA==", + "requires": { + "@algolia/cache-browser-local-storage": "4.17.1", + "@algolia/cache-common": "4.17.1", + "@algolia/cache-in-memory": "4.17.1", + "@algolia/client-account": "4.17.1", + "@algolia/client-analytics": "4.17.1", + "@algolia/client-common": "4.17.1", + "@algolia/client-personalization": "4.17.1", + "@algolia/client-search": "4.17.1", + "@algolia/logger-common": "4.17.1", + "@algolia/logger-console": "4.17.1", + "@algolia/requester-browser-xhr": "4.17.1", + "@algolia/requester-common": "4.17.1", + "@algolia/requester-node-http": "4.17.1", + "@algolia/transporter": "4.17.1" + } + }, "ansi-align": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", @@ -49862,6 +51302,12 @@ "integrity": "sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==", "dev": true }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, "browserify-zlib": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", @@ -50250,9 +51696,7 @@ "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", - "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", - "dev": true, - "peer": true + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" }, "cliui": { "version": "7.0.4", @@ -50265,10 +51709,9 @@ } }, "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" }, "clone-deep": { "version": "4.0.1", @@ -50292,6 +51735,11 @@ } } }, + "clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -50379,6 +51827,11 @@ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==" }, + "command-score": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/command-score/-/command-score-0.1.2.tgz", + "integrity": "sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w==" + }, "commander": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", @@ -50660,6 +52113,11 @@ } } }, + "core-js": { + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", + "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==" + }, "core-js-compat": { "version": "3.30.0", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz", @@ -50675,6 +52133,14 @@ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", "dev": true }, + "cose-base": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-1.0.3.tgz", + "integrity": "sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==", + "requires": { + "layout-base": "^1.0.0" + } + }, "cosmiconfig": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", @@ -50743,6 +52209,12 @@ "nth-check": "^2.0.1" } }, + "css-selector-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/css-selector-parser/-/css-selector-parser-1.4.1.tgz", + "integrity": "sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g==", + "dev": true + }, "css-tree": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", @@ -51044,162 +52516,210 @@ } } }, - "d3": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-6.7.0.tgz", - "integrity": "sha512-hNHRhe+yCDLUG6Q2LwvR/WdNFPOJQ5VWqsJcwIYVeI401+d2/rrCjxSXkiAdIlpx7/73eApFB4Olsmh3YN7a6g==", + "cytoscape": { + "version": "3.25.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.25.0.tgz", + "integrity": "sha512-7MW3Iz57mCUo6JQCho6CmPBCbTlJr7LzyEtIkutG255HLVd4XuBg2I9BkTZLI/e4HoaOB/BiAzXuQybQ95+r9Q==", "requires": { - "d3-array": "2", - "d3-axis": "2", - "d3-brush": "2", - "d3-chord": "2", - "d3-color": "2", - "d3-contour": "2", - "d3-delaunay": "5", - "d3-dispatch": "2", - "d3-drag": "2", - "d3-dsv": "2", - "d3-ease": "2", - "d3-fetch": "2", - "d3-force": "2", - "d3-format": "2", - "d3-geo": "2", - "d3-hierarchy": "2", - "d3-interpolate": "2", - "d3-path": "2", - "d3-polygon": "2", - "d3-quadtree": "2", - "d3-random": "2", - "d3-scale": "3", - "d3-scale-chromatic": "2", - "d3-selection": "2", - "d3-shape": "2", - "d3-time": "2", - "d3-time-format": "3", - "d3-timer": "2", - "d3-transition": "2", - "d3-zoom": "2" + "heap": "^0.2.6", + "lodash": "^4.17.21" + } + }, + "cytoscape-cose-bilkent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cytoscape-cose-bilkent/-/cytoscape-cose-bilkent-4.1.0.tgz", + "integrity": "sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==", + "requires": { + "cose-base": "^1.0.0" + } + }, + "cytoscape-fcose": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cytoscape-fcose/-/cytoscape-fcose-2.2.0.tgz", + "integrity": "sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==", + "requires": { + "cose-base": "^2.2.0" + }, + "dependencies": { + "cose-base": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cose-base/-/cose-base-2.2.0.tgz", + "integrity": "sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==", + "requires": { + "layout-base": "^2.0.0" + } + }, + "layout-base": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-2.0.1.tgz", + "integrity": "sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==" + } + } + }, + "d3": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.5.tgz", + "integrity": "sha512-JgoahDG51ncUfJu6wX/1vWQEqOflgXyl4MaHqlcSruTez7yhaRKR9i8VjjcQGeS2en/jnFivXuaIMnseMMt0XA==", + "requires": { + "d3-array": "3", + "d3-axis": "3", + "d3-brush": "3", + "d3-chord": "3", + "d3-color": "3", + "d3-contour": "4", + "d3-delaunay": "6", + "d3-dispatch": "3", + "d3-drag": "3", + "d3-dsv": "3", + "d3-ease": "3", + "d3-fetch": "3", + "d3-force": "3", + "d3-format": "3", + "d3-geo": "3", + "d3-hierarchy": "3", + "d3-interpolate": "3", + "d3-path": "3", + "d3-polygon": "3", + "d3-quadtree": "3", + "d3-random": "3", + "d3-scale": "4", + "d3-scale-chromatic": "3", + "d3-selection": "3", + "d3-shape": "3", + "d3-time": "3", + "d3-time-format": "4", + "d3-timer": "3", + "d3-transition": "3", + "d3-zoom": "3" } }, "d3-array": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-2.12.1.tgz", - "integrity": "sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", "requires": { - "internmap": "^1.0.0" + "internmap": "1 - 2" } }, "d3-axis": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-2.1.0.tgz", - "integrity": "sha512-z/G2TQMyuf0X3qP+Mh+2PimoJD41VOCjViJzT0BHeL/+JQAofkiWZbWxlwFGb1N8EN+Cl/CW+MUKbVzr1689Cw==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" }, "d3-brush": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-2.1.0.tgz", - "integrity": "sha512-cHLLAFatBATyIKqZOkk/mDHUbzne2B3ZwxkzMHvFTCZCmLaXDpZRihQSn8UNXTkGD/3lb/W2sQz0etAftmHMJQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", + "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", "requires": { - "d3-dispatch": "1 - 2", - "d3-drag": "2", - "d3-interpolate": "1 - 2", - "d3-selection": "2", - "d3-transition": "2" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "3", + "d3-transition": "3" } }, "d3-chord": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-2.0.0.tgz", - "integrity": "sha512-D5PZb7EDsRNdGU4SsjQyKhja8Zgu+SHZfUSO5Ls8Wsn+jsAKUUGkcshLxMg9HDFxG3KqavGWaWkJ8EpU8ojuig==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", + "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", "requires": { - "d3-path": "1 - 2" + "d3-path": "1 - 3" } }, "d3-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-2.0.0.tgz", - "integrity": "sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" }, "d3-contour": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-2.0.0.tgz", - "integrity": "sha512-9unAtvIaNk06UwqBmvsdHX7CZ+NPDZnn8TtNH1myW93pWJkhsV25JcgnYAu0Ck5Veb1DHiCv++Ic5uvJ+h50JA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", + "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", "requires": { - "d3-array": "2" + "d3-array": "^3.2.0" } }, "d3-delaunay": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-5.3.0.tgz", - "integrity": "sha512-amALSrOllWVLaHTnDLHwMIiz0d1bBu9gZXd1FiLfXf8sHcX9jrcj81TVZOqD4UX7MgBZZ07c8GxzEgBpJqc74w==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", "requires": { - "delaunator": "4" + "delaunator": "5" } }, "d3-dispatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-2.0.0.tgz", - "integrity": "sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" }, "d3-drag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-2.0.0.tgz", - "integrity": "sha512-g9y9WbMnF5uqB9qKqwIIa/921RYWzlUDv9Jl1/yONQwxbOfszAWTCm8u7HOTgJgRDXiRZN56cHT9pd24dmXs8w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", "requires": { - "d3-dispatch": "1 - 2", - "d3-selection": "2" + "d3-dispatch": "1 - 3", + "d3-selection": "3" } }, "d3-dsv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-2.0.0.tgz", - "integrity": "sha512-E+Pn8UJYx9mViuIUkoc93gJGGYut6mSDKy2+XaPwccwkRGlR+LO97L2VCCRjQivTwLHkSnAJG7yo00BWY6QM+w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", "requires": { - "commander": "2", - "iconv-lite": "0.4", + "commander": "7", + "iconv-lite": "0.6", "rw": "1" }, "dependencies": { "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } } } }, "d3-ease": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-2.0.0.tgz", - "integrity": "sha512-68/n9JWarxXkOWMshcT5IcjbB+agblQUaIsbnXmrzejn2O82n3p2A9R2zEB9HIEFWKFwPAEDDN8gR0VdSAyyAQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" }, "d3-fetch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-2.0.0.tgz", - "integrity": "sha512-TkYv/hjXgCryBeNKiclrwqZH7Nb+GaOwo3Neg24ZVWA3MKB+Rd+BY84Nh6tmNEMcjUik1CSUWjXYndmeO6F7sw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", + "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", "requires": { - "d3-dsv": "1 - 2" + "d3-dsv": "1 - 3" } }, "d3-force": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-2.1.1.tgz", - "integrity": "sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", "requires": { - "d3-dispatch": "1 - 2", - "d3-quadtree": "1 - 2", - "d3-timer": "1 - 2" + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-2.0.0.tgz", - "integrity": "sha512-Ab3S6XuE/Q+flY96HXT0jOXcM4EAClYFnRGY5zsjRGNy6qCYrQsMffs7cV5Q9xejb35zxW5hf/guKw34kvIKsA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" }, "d3-geo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-2.0.2.tgz", - "integrity": "sha512-8pM1WGMLGFuhq9S+FpPURxic+gKzjluCD/CHTuUF3mXMeiCo0i6R0tO1s4+GArRFde96SLcW/kOFRjoAosPsFA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", + "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", "requires": { - "d3-array": "^2.5.0" + "d3-array": "2.5.0 - 3" } }, "d3-geo-projection": { @@ -51220,115 +52740,124 @@ } }, "d3-hierarchy": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-2.0.0.tgz", - "integrity": "sha512-SwIdqM3HxQX2214EG9GTjgmCc/mbSx4mQBn+DuEETubhOw6/U3fmnji4uCVrmzOydMHSO1nZle5gh6HB/wdOzw==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" }, "d3-interpolate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-2.0.1.tgz", - "integrity": "sha512-c5UhwwTs/yybcmTpAVqwSFl6vrQ8JZJoT5F7xNFK9pymv5C0Ymcc9/LIJHtYIggg/yS9YHw8i8O8tgb9pupjeQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", "requires": { - "d3-color": "1 - 2" + "d3-color": "1 - 3" } }, "d3-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-2.0.0.tgz", - "integrity": "sha512-ZwZQxKhBnv9yHaiWd6ZU4x5BtCQ7pXszEV9CU6kRgwIQVQGLMv1oiL4M+MK/n79sYzsj+gcgpPQSctJUsLN7fA==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" }, "d3-polygon": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-2.0.0.tgz", - "integrity": "sha512-MsexrCK38cTGermELs0cO1d79DcTsQRN7IWMJKczD/2kBjzNXxLUWP33qRF6VDpiLV/4EI4r6Gs0DAWQkE8pSQ==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" }, "d3-quadtree": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-2.0.0.tgz", - "integrity": "sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" }, "d3-random": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-2.2.2.tgz", - "integrity": "sha512-0D9P8TRj6qDAtHhRQn6EfdOtHMfsUWanl3yb/84C4DqpZ+VsgfI5iTVRNRbELCfNvRfpMr8OrqqUTQ6ANGCijw==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" }, "d3-scale": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-3.3.0.tgz", - "integrity": "sha512-1JGp44NQCt5d1g+Yy+GeOnZP7xHo0ii8zsQp6PGzd+C1/dl0KGsp9A7Mxwp+1D1o4unbTTxVdU/ZOIEBoeZPbQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", "requires": { - "d3-array": "^2.3.0", - "d3-format": "1 - 2", - "d3-interpolate": "1.2.0 - 2", - "d3-time": "^2.1.1", - "d3-time-format": "2 - 3" + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" } }, "d3-scale-chromatic": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-2.0.0.tgz", - "integrity": "sha512-LLqy7dJSL8yDy7NRmf6xSlsFZ6zYvJ4BcWFE4zBrOPnQERv9zj24ohnXKRbyi9YHnYV+HN1oEO3iFK971/gkzA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", + "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", "requires": { - "d3-color": "1 - 2", - "d3-interpolate": "1 - 2" + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" } }, "d3-selection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-2.0.0.tgz", - "integrity": "sha512-XoGGqhLUN/W14NmaqcO/bb1nqjDAw5WtSYb2X8wiuQWvSZUsUVYsOSkOybUrNvcBjaywBdYPy03eXHMXjk9nZA==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-2.1.0.tgz", - "integrity": "sha512-PnjUqfM2PpskbSLTJvAzp2Wv4CZsnAgTfcVRTwW03QR3MkXF8Uo7B1y/lWkAsmbKwuecto++4NlsYcvYpXpTHA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", "requires": { - "d3-path": "1 - 2" + "d3-path": "^3.1.0" } }, "d3-time": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-2.1.1.tgz", - "integrity": "sha512-/eIQe/eR4kCQwq7yxi7z4c6qEXf2IYGcjoWB5OOQy4Tq9Uv39/947qlDcN2TLkiTzQWzvnsuYPB9TrWaNfipKQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", "requires": { - "d3-array": "2" + "d3-array": "2 - 3" } }, "d3-time-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-3.0.0.tgz", - "integrity": "sha512-UXJh6EKsHBTjopVqZBhFysQcoXSv/5yLONZvkQ5Kk3qbwiUYkdX17Xa1PT6U1ZWXGGfB1ey5L8dKMlFq2DO0Ag==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", "requires": { - "d3-time": "1 - 2" + "d3-time": "1 - 3" } }, "d3-timer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-2.0.0.tgz", - "integrity": "sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA==" + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" }, "d3-transition": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-2.0.0.tgz", - "integrity": "sha512-42ltAGgJesfQE3u9LuuBHNbGrI/AJjNL2OAUdclE70UE6Vy239GCBEYD38uBPoLeNsOhFStGpPI0BAOV+HMxog==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", "requires": { - "d3-color": "1 - 2", - "d3-dispatch": "1 - 2", - "d3-ease": "1 - 2", - "d3-interpolate": "1 - 2", - "d3-timer": "1 - 2" + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" } }, "d3-zoom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-2.0.0.tgz", - "integrity": "sha512-fFg7aoaEm9/jf+qfstak0IYpnesZLiMX6GZvXtUSdv8RH2o4E2qeelgdU09eKS6wGuiGMfcnMI0nTIqWzRHGpw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", "requires": { - "d3-dispatch": "1 - 2", - "d3-drag": "2", - "d3-interpolate": "1 - 2", - "d3-selection": "2", - "d3-transition": "2" + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + } + }, + "dagre-d3-es": { + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.10.tgz", + "integrity": "sha512-qTCQmEhcynucuaZgY5/+ti3X/rnszKZhEQH/ZdWdtP1tA/y3VoHJzcVrO9pjjJCNpigfscAtoUB5ONcd2wNn0A==", + "requires": { + "d3": "^7.8.2", + "lodash-es": "^4.17.21" } }, "damerau-levenshtein": { @@ -51382,8 +52911,7 @@ "dayjs": { "version": "1.11.7", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "dev": true + "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==" }, "debug": { "version": "4.3.4", @@ -51499,6 +53027,14 @@ "dev": true, "requires": { "clone": "^1.0.2" + }, + "dependencies": { + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true + } } }, "define-lazy-prop": { @@ -51545,9 +53081,12 @@ } }, "delaunator": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-4.0.1.tgz", - "integrity": "sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", + "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "requires": { + "robust-predicates": "^3.0.0" + } }, "delayed-stream": { "version": "1.0.0", @@ -51686,6 +53225,12 @@ "path-type": "^4.0.0" } }, + "disqus-react": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/disqus-react/-/disqus-react-1.1.5.tgz", + "integrity": "sha512-9fdG5m6c3wJzlCDLaMheuUagMVj3s5qgUSXdekpCsvzYOKG21AiuOoqyDzA0oXrpPnYzgpnsvPYqZ+i0hJPGZw==", + "requires": {} + }, "dlv": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", @@ -51750,9 +53295,9 @@ } }, "dompurify": { - "version": "2.4.5", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.5.tgz", - "integrity": "sha512-jggCCd+8Iqp4Tsz0nIvpcb22InKEBrGz5dw3EQJMs8HPJDsKbFIO3STYtAvCfDx26Muevn1MHVI0XxjgFfmiSA==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.3.tgz", + "integrity": "sha512-axQ9zieHLnAnHh0sfAamKYiqXMJAVwu+LM/alQ7WDagoWessyWvMSFyW65CqF3owufNu8HBcE4cM2Vflu7YWcQ==" }, "domutils": { "version": "2.8.0", @@ -51880,6 +53425,11 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==" }, + "elkjs": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/elkjs/-/elkjs-0.8.2.tgz", + "integrity": "sha512-L6uRgvZTH+4OF5NE/MBbzQx/WYpru1xCBE9respNj6qznEewGUIfhzmm7horWWxbNO2M0WckQypGctR8lH79xQ==" + }, "emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", @@ -51933,9 +53483,9 @@ } }, "entities": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz", - "integrity": "sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "devOptional": true }, "envinfo": { @@ -53157,6 +54707,11 @@ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" }, + "fast-equals": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-2.0.4.tgz", + "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==" + }, "fast-glob": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", @@ -53500,6 +55055,15 @@ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==" }, + "framer-motion": { + "version": "10.12.16", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-10.12.16.tgz", + "integrity": "sha512-w/SfWEIWJkYSgRHYBmln7EhcNo31ao8Xexol8lGXf1pR/tlnBtf1HcxoUmEiEh6pacB4/geku5ami53AAQWHMQ==", + "requires": { + "@emotion/is-prop-valid": "^0.8.2", + "tslib": "^2.4.0" + } + }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -53731,6 +55295,14 @@ "tar": "^6.1.13" } }, + "giscus": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/giscus/-/giscus-1.2.8.tgz", + "integrity": "sha512-pufrgQYt1W+4ztiWp/PilLPN8NdyKvpbQ8jNqbAa1g84t6qqyevXHfkOYCi4x4d+y191vJAUc6seL1Dq74yUeA==", + "requires": { + "lit": "^2.6.1" + } + }, "github-slugger": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", @@ -53968,6 +55540,57 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "hast-util-from-parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.2.tgz", + "integrity": "sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "hastscript": "^7.0.0", + "property-information": "^6.0.0", + "vfile": "^5.0.0", + "vfile-location": "^4.0.0", + "web-namespaces": "^2.0.0" + } + }, + "hast-util-parse-selector": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-3.1.1.tgz", + "integrity": "sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0" + } + }, + "hast-util-raw": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-7.2.3.tgz", + "integrity": "sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "@types/parse5": "^6.0.0", + "hast-util-from-parse5": "^7.0.0", + "hast-util-to-parse5": "^7.0.0", + "html-void-elements": "^2.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^4.0.0", + "unist-util-visit": "^4.0.0", + "vfile": "^5.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "dependencies": { + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + } + } + }, "hast-util-to-estree": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-2.3.3.tgz", @@ -53997,11 +55620,68 @@ } } }, + "hast-util-to-html": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/hast-util-to-html/-/hast-util-to-html-8.0.4.tgz", + "integrity": "sha512-4tpQTUOr9BMjtYyNlt0P50mH7xj0Ks2xpo8M943Vykljf99HW6EzulIoJP1N3eKOSScEHzyzi9dm7/cn0RfGwA==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "@types/unist": "^2.0.0", + "ccount": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-raw": "^7.0.0", + "hast-util-whitespace": "^2.0.0", + "html-void-elements": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "stringify-entities": "^4.0.0", + "zwitch": "^2.0.4" + } + }, + "hast-util-to-parse5": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-7.1.0.tgz", + "integrity": "sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + } + }, "hast-util-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-2.0.1.tgz", "integrity": "sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==" }, + "hastscript": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-7.2.0.tgz", + "integrity": "sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^3.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, "hex-color-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", @@ -54058,6 +55738,57 @@ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==" }, + "html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==", + "dev": true + }, + "htmlparser2": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-9.0.0.tgz", + "integrity": "sha512-uxbSI98wmFT/G4P2zXx4OVx04qWUmyFPrD2/CNepa2Zo3GPNaCaaxElDgwUrwYWkK1nr9fft0Ya8dws8coDLLQ==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.1.0", + "entities": "^4.5.0" + }, + "dependencies": { + "dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + } + }, + "domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "requires": { + "domelementtype": "^2.3.0" + } + }, + "domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "dev": true, + "requires": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + } + } + } + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -54299,9 +56030,9 @@ } }, "internmap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/internmap/-/internmap-1.0.1.tgz", - "integrity": "sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" }, "interpret": { "version": "1.4.0", @@ -58974,6 +60705,33 @@ "object.assign": "^4.1.3" } }, + "kbar": { + "version": "0.1.0-beta.40", + "resolved": "https://registry.npmjs.org/kbar/-/kbar-0.1.0-beta.40.tgz", + "integrity": "sha512-vEV02WuEBvKaSivO2DnNtyd3gUAbruYrZCax5fXcLcVTFV6q0/w6Ew3z6Qy+AqXxbZdWguwQ3POIwgdHevp+6A==", + "requires": { + "@radix-ui/react-portal": "^1.0.1", + "command-score": "^0.1.2", + "fast-equals": "^2.0.3", + "react-virtual": "^2.8.2", + "tiny-invariant": "^1.2.0" + }, + "dependencies": { + "react-virtual": { + "version": "2.10.4", + "resolved": "https://registry.npmjs.org/react-virtual/-/react-virtual-2.10.4.tgz", + "integrity": "sha512-Ir6+oPQZTVHfa6+JL9M7cvMILstFZH/H3jqeYeKI4MSUX+rIruVwFC6nGVXw9wqAw8L0Kg2KvfXxI85OvYQdpQ==", + "requires": { + "@reach/observe-rect": "^1.1.0" + } + } + } + }, + "khroma": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -59007,6 +60765,11 @@ "language-subtag-registry": "~0.3.2" } }, + "layout-base": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/layout-base/-/layout-base-1.0.2.tgz", + "integrity": "sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==" + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -59094,6 +60857,34 @@ } } }, + "lit": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.5.tgz", + "integrity": "sha512-i/cH7Ye6nBDUASMnfwcictBnsTN91+aBjXoTHF2xARghXScKxpD4F4WYI+VLXg9lqbMinDfvoI7VnZXjyHgdfQ==", + "requires": { + "@lit/reactive-element": "^1.6.0", + "lit-element": "^3.3.0", + "lit-html": "^2.7.0" + } + }, + "lit-element": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.2.tgz", + "integrity": "sha512-xXAeVWKGr4/njq0rGC9dethMnYCq5hpKYrgQZYTzawt9YQhMiXfD+T1RgrdY3NamOxwq2aXlb0vOI6e29CKgVQ==", + "requires": { + "@lit-labs/ssr-dom-shim": "^1.1.0", + "@lit/reactive-element": "^1.3.0", + "lit-html": "^2.7.0" + } + }, + "lit-html": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.4.tgz", + "integrity": "sha512-/Jw+FBpeEN+z8X6PJva5n7+0MzCVAH2yypN99qHYYkq8bI+j7I39GH+68Z/MZD6rGKDK9RpzBw7CocfmHfq6+g==", + "requires": { + "@types/trusted-types": "^2.0.2" + } + }, "load-yaml-file": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", @@ -59431,6 +61222,12 @@ "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-1.1.1.tgz", "integrity": "sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==" }, + "markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "dev": true + }, "markdown-to-jsx": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.2.1.tgz", @@ -59493,6 +61290,26 @@ } } }, + "mdast-util-find-and-replace": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-2.2.2.tgz", + "integrity": "sha512-MTtdFRz/eMDHXzeK6W3dO7mXUlF82Gom4y0oOgvHhh/HXZAGvIQDUvQ0SuUx+j2tv44b8xTHOm8K/9OoRFnXKw==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^5.0.0", + "unist-util-visit-parents": "^5.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==", + "dev": true + } + } + }, "mdast-util-from-markdown": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.1.tgz", @@ -59512,6 +61329,76 @@ "uvu": "^0.5.0" } }, + "mdast-util-gfm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-2.0.2.tgz", + "integrity": "sha512-qvZ608nBppZ4icQlhQQIAdc6S3Ffj9RGmzwUKUWuEICFnd1LVkN3EktF7ZHAgfcEdvZB5owU9tQgt99e2TlLjg==", + "dev": true, + "requires": { + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-gfm-autolink-literal": "^1.0.0", + "mdast-util-gfm-footnote": "^1.0.0", + "mdast-util-gfm-strikethrough": "^1.0.0", + "mdast-util-gfm-table": "^1.0.0", + "mdast-util-gfm-task-list-item": "^1.0.0", + "mdast-util-to-markdown": "^1.0.0" + } + }, + "mdast-util-gfm-autolink-literal": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-1.0.3.tgz", + "integrity": "sha512-My8KJ57FYEy2W2LyNom4n3E7hKTuQk/0SES0u16tjA9Z3oFkF4RrC/hPAPgjlSpezsOvI8ObcXcElo92wn5IGA==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "ccount": "^2.0.0", + "mdast-util-find-and-replace": "^2.0.0", + "micromark-util-character": "^1.0.0" + } + }, + "mdast-util-gfm-footnote": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-1.0.2.tgz", + "integrity": "sha512-56D19KOGbE00uKVj3sgIykpwKL179QsVFwx/DCW0u/0+URsryacI4MAdNJl0dh+u2PSsD9FtxPFbHCzJ78qJFQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0", + "micromark-util-normalize-identifier": "^1.0.0" + } + }, + "mdast-util-gfm-strikethrough": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-1.0.3.tgz", + "integrity": "sha512-DAPhYzTYrRcXdMjUtUjKvW9z/FNAMTdU0ORyMcbmkwYNbKocDpdk+PX1L1dQgOID/+vVs1uBQ7ElrBQfZ0cuiQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-1.0.7.tgz", + "integrity": "sha512-jjcpmNnQvrmN5Vx7y7lEc2iIOEytYv7rTvu+MeyAsSHTASGCCRA79Igg2uKssgOs1i1po8s3plW0sTu1wkkLGg==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^1.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, + "mdast-util-gfm-task-list-item": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-1.0.2.tgz", + "integrity": "sha512-PFTA1gzfp1B1UaiJVyhJZA1rm0+Tzn690frc/L8vNX1Jop4STZgOE6bxUhnzdVSB+vm2GU1tIsuQcA9bxTQpMQ==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.3.0" + } + }, "mdast-util-mdx": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-2.0.1.tgz", @@ -59626,11 +61513,108 @@ "@types/mdast": "^3.0.0" } }, + "mdast-util-wiki-link": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-wiki-link/-/mdast-util-wiki-link-0.0.2.tgz", + "integrity": "sha512-lSsR10/dPuYIxzjGZIGA4oYzsnEnqcsD6DTXL0pqdbBzNB9teKVZB2aIzZcUsdg31v/NoHOstkVwzbN6VrQLtw==", + "requires": { + "@babel/runtime": "^7.12.1", + "mdast-util-to-markdown": "^0.6.5" + }, + "dependencies": { + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==" + }, + "mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "requires": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } + }, "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, + "mdx-mermaid": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mdx-mermaid/-/mdx-mermaid-1.3.2.tgz", + "integrity": "sha512-8kw0tg3isKKBFzFwoe2DhIaEgKYtVeJXQtxZCCrdTPO0CTpXHnTHT0atDqsp7YkXi5iUCp/zAZPZu1cmr68T3w==", + "requires": {} + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -59711,6 +61695,37 @@ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" }, + "mermaid": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-10.2.2.tgz", + "integrity": "sha512-ifYKlCcZKYq48hxC1poJXnvk/PbCdgqqbg5B4qsybb8nIItPM1ATKqVEDkyde6BBJxVFhVJr9hoUjipzniQJZg==", + "requires": { + "@braintree/sanitize-url": "^6.0.2", + "cytoscape": "^3.23.0", + "cytoscape-cose-bilkent": "^4.1.0", + "cytoscape-fcose": "^2.1.0", + "d3": "^7.4.0", + "dagre-d3-es": "7.0.10", + "dayjs": "^1.11.7", + "dompurify": "3.0.3", + "elkjs": "^0.8.2", + "khroma": "^2.0.0", + "lodash-es": "^4.17.21", + "mdast-util-from-markdown": "^1.3.0", + "non-layered-tidy-tree-layout": "^2.0.2", + "stylis": "^4.1.3", + "ts-dedent": "^2.2.0", + "uuid": "^9.0.0", + "web-worker": "^1.2.0" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + } + } + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -59764,6 +61779,99 @@ "uvu": "^0.5.0" } }, + "micromark-extension-gfm": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-2.0.3.tgz", + "integrity": "sha512-vb9OoHqrhCmbRidQv/2+Bc6pkP0FrtlhurxZofvOEy5o8RtuuvTq+RQ1Vw5ZDNrVraQZu3HixESqbG+0iKk/MQ==", + "dev": true, + "requires": { + "micromark-extension-gfm-autolink-literal": "^1.0.0", + "micromark-extension-gfm-footnote": "^1.0.0", + "micromark-extension-gfm-strikethrough": "^1.0.0", + "micromark-extension-gfm-table": "^1.0.0", + "micromark-extension-gfm-tagfilter": "^1.0.0", + "micromark-extension-gfm-task-list-item": "^1.0.0", + "micromark-util-combine-extensions": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-autolink-literal": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-1.0.5.tgz", + "integrity": "sha512-z3wJSLrDf8kRDOh2qBtoTRD53vJ+CWIyo7uyZuxf/JAbNJjiHsOpG1y5wxk8drtv3ETAHutCu6N3thkOOgueWg==", + "dev": true, + "requires": { + "micromark-util-character": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-footnote": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-1.1.2.tgz", + "integrity": "sha512-Yxn7z7SxgyGWRNa4wzf8AhYYWNrwl5q1Z8ii+CSTTIqVkmGZF1CElX2JI8g5yGoM3GAman9/PVCUFUSJ0kB/8Q==", + "dev": true, + "requires": { + "micromark-core-commonmark": "^1.0.0", + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-normalize-identifier": "^1.0.0", + "micromark-util-sanitize-uri": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-strikethrough": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-1.0.7.tgz", + "integrity": "sha512-sX0FawVE1o3abGk3vRjOH50L5TTLr3b5XMqnP9YDRb34M0v5OoZhG+OHFz1OffZ9dlwgpTBKaT4XW/AsUVnSDw==", + "dev": true, + "requires": { + "micromark-util-chunked": "^1.0.0", + "micromark-util-classify-character": "^1.0.0", + "micromark-util-resolve-all": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-table": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-1.0.7.tgz", + "integrity": "sha512-3ZORTHtcSnMQEKtAOsBQ9/oHp9096pI/UvdPtN7ehKvrmZZ2+bbWhi0ln+I9drmwXMt5boocn6OlwQzNXeVeqw==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, + "micromark-extension-gfm-tagfilter": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-1.0.2.tgz", + "integrity": "sha512-5XWB9GbAUSHTn8VPU8/1DBXMuKYT5uOgEjJb8gN3mW0PNW5OPHpSdojoqf+iq1xo7vWzw/P8bAHY0n6ijpXF7g==", + "dev": true, + "requires": { + "micromark-util-types": "^1.0.0" + } + }, + "micromark-extension-gfm-task-list-item": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-1.0.5.tgz", + "integrity": "sha512-RMFXl2uQ0pNQy6Lun2YBYT9g9INXtWJULgbt01D/x8/6yJ2qpKyzdZD3pi6UIkzF++Da49xAelVKUeUMqd5eIQ==", + "dev": true, + "requires": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.0.0", + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0", + "uvu": "^0.5.0" + } + }, "micromark-extension-mdx-expression": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-1.0.8.tgz", @@ -60211,6 +62319,200 @@ "ufo": "^1.1.2" } }, + "mocha": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", + "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", + "dev": true, + "requires": { + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.4", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "5.0.1", + "ms": "2.1.3", + "nanoid": "3.3.3", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "workerpool": "6.2.1", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "dev": true + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + } + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "nanoid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", + "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", + "dev": true + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true + } + } + }, "modern-normalize": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", @@ -60292,7 +62594,6 @@ "version": "13.2.1", "resolved": "https://registry.npmjs.org/next/-/next-13.2.1.tgz", "integrity": "sha512-qhgJlDtG0xidNViJUPeQHLGJJoT4zDj/El7fP3D3OzpxJDUfxsm16cK4WTMyvSX1ciIfAq05u+0HqFAa+VJ+Hg==", - "dev": true, "peer": true, "requires": { "@next/env": "13.2.1", @@ -60319,7 +62620,6 @@ "version": "0.4.14", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz", "integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==", - "dev": true, "peer": true, "requires": { "tslib": "^2.4.0" @@ -60329,7 +62629,6 @@ "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "peer": true, "requires": { "nanoid": "^3.3.4", @@ -60350,6 +62649,13 @@ "vfile-matter": "^3.0.1" } }, + "next-themes": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.2.1.tgz", + "integrity": "sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==", + "peer": true, + "requires": {} + }, "node-addon-api": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", @@ -60425,6 +62731,11 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "non-layered-tidy-tree-layout": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -62404,6 +64715,29 @@ } } }, + "rehype-stringify": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/rehype-stringify/-/rehype-stringify-9.0.3.tgz", + "integrity": "sha512-kWiZ1bgyWlgOxpqD5HnxShKAdXtb2IUljn3hQAhySeak6IOQPPt6DeGnsIh4ixm7yKJWzm8TXFuC/lPfcWHJqw==", + "dev": true, + "requires": { + "@types/hast": "^2.0.0", + "hast-util-to-html": "^8.0.0", + "unified": "^10.0.0" + } + }, + "remark": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/remark/-/remark-14.0.3.tgz", + "integrity": "sha512-bfmJW1dmR2LvaMJuAnE88pZP9DktIFYXazkTfOIKZzi3Knk9lT0roItIA24ydOucI3bV/g/tXBA6hzqq3FV9Ew==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "remark-parse": "^10.0.0", + "remark-stringify": "^10.0.0", + "unified": "^10.0.0" + } + }, "remark-external-links": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/remark-external-links/-/remark-external-links-8.0.0.tgz", @@ -62452,6 +64786,18 @@ } } }, + "remark-gfm": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-3.0.1.tgz", + "integrity": "sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-gfm": "^2.0.0", + "micromark-extension-gfm": "^2.0.0", + "unified": "^10.0.0" + } + }, "remark-mdx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-2.3.0.tgz", @@ -62528,11 +64874,27 @@ } } }, + "remark-stringify": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-10.0.3.tgz", + "integrity": "sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==", + "dev": true, + "requires": { + "@types/mdast": "^3.0.0", + "mdast-util-to-markdown": "^1.0.0", + "unified": "^10.0.0" + } + }, "remove-accents": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, "request-progress": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", @@ -63851,7 +66213,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", - "dev": true, "peer": true, "requires": { "client-only": "0.0.1" @@ -63954,8 +66315,7 @@ "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "2.8.0", @@ -64019,6 +66379,11 @@ "tslib": "^2.5.0" } }, + "tabbable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.1.2.tgz", + "integrity": "sha512-qCN98uP7i9z0fIS4amQ5zbGBOq+OSigYeGvPy7NDk8Y9yncqDZ9pRPgfsc2PJIVM9RrJj7GIfuRgmjoUU9zTHQ==" + }, "tailwindcss": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", @@ -64441,6 +66806,11 @@ "globrex": "^0.1.2" } }, + "tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==" + }, "tiny-warning": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", @@ -64558,8 +66928,7 @@ "ts-dedent": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz", - "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==", - "dev": true + "integrity": "sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==" }, "ts-easing": { "version": "0.2.0", @@ -65251,6 +67620,18 @@ "unist-util-visit": "^4.0.0" } }, + "unist-util-select": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/unist-util-select/-/unist-util-select-4.0.3.tgz", + "integrity": "sha512-1074+K9VyR3NyUz3lgNtHKm7ln+jSZXtLJM4E22uVuoFn88a/Go2pX8dusrt/W+KWH1ncn8jcd8uCQuvXb/fXA==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "css-selector-parser": "^1.0.0", + "nth-check": "^2.0.0", + "zwitch": "^2.0.0" + } + }, "unist-util-stringify-position": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-3.0.3.tgz", @@ -65545,16 +67926,6 @@ "d3-array": "^3.2.2", "vega-dataflow": "^5.7.5", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - } } }, "vega-dataflow": { @@ -65617,24 +67988,6 @@ "vega-dataflow": "^5.7.5", "vega-scale": "^7.3.0", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - } } }, "vega-event-selector": { @@ -65666,18 +68019,6 @@ "d3-force": "^3.0.0", "vega-dataflow": "^5.7.5", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "requires": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - } - } } }, "vega-format": { @@ -65690,29 +68031,6 @@ "d3-time-format": "^4.1.0", "vega-time": "^2.1.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-format": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" - }, - "d3-time-format": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", - "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", - "requires": { - "d3-time": "1 - 3" - } - } } }, "vega-functions": { @@ -65731,29 +68049,6 @@ "vega-statistics": "^1.8.1", "vega-time": "^2.1.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - } } }, "vega-geo": { @@ -65769,29 +68064,6 @@ "vega-projection": "^1.6.0", "vega-statistics": "^1.8.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-color": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" - }, - "d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - } } }, "vega-hierarchy": { @@ -65802,13 +68074,6 @@ "d3-hierarchy": "^3.1.2", "vega-dataflow": "^5.7.5", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" - } } }, "vega-interpreter": { @@ -65846,11 +68111,6 @@ "yargs": "~16.2.0" }, "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" - }, "tslib": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", @@ -65905,31 +68165,6 @@ "topojson-client": "^3.1.0", "vega-format": "^1.1.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - }, - "d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "requires": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - } - }, - "iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - } } }, "vega-parser": { @@ -65952,16 +68187,6 @@ "d3-geo": "^3.1.0", "d3-geo-projection": "^4.0.0", "vega-scale": "^7.3.0" - }, - "dependencies": { - "d3-geo": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", - "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", - "requires": { - "d3-array": "2.5.0 - 3" - } - } } }, "vega-regression": { @@ -65973,16 +68198,6 @@ "vega-dataflow": "^5.7.3", "vega-statistics": "^1.9.0", "vega-util": "^1.15.2" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - } } }, "vega-runtime": { @@ -66004,36 +68219,6 @@ "d3-scale": "^4.0.2", "vega-time": "^2.1.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-interpolate": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", - "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", - "requires": { - "d3-color": "1 - 3" - } - }, - "d3-scale": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", - "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", - "requires": { - "d3-array": "2.10.0 - 3", - "d3-format": "1 - 3", - "d3-interpolate": "1.2.0 - 3", - "d3-time": "2.1.1 - 3", - "d3-time-format": "2 - 4" - } - } } }, "vega-scenegraph": { @@ -66047,21 +68232,6 @@ "vega-loader": "^4.5.1", "vega-scale": "^7.3.0", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" - }, - "d3-shape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", - "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", - "requires": { - "d3-path": "^3.1.0" - } - } } }, "vega-schema-url-parser": { @@ -66095,16 +68265,6 @@ "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", "requires": { "d3-array": "^3.2.2" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - } } }, "vega-themes": { @@ -66121,24 +68281,6 @@ "d3-array": "^3.2.2", "d3-time": "^3.1.0", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-time": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", - "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", - "requires": { - "d3-array": "2 - 3" - } - } } }, "vega-tooltip": { @@ -66159,16 +68301,6 @@ "vega-statistics": "^1.8.1", "vega-time": "^2.1.1", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - } } }, "vega-typings": { @@ -66200,21 +68332,6 @@ "vega-runtime": "^6.1.4", "vega-scenegraph": "^4.10.2", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-array": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", - "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", - "requires": { - "internmap": "1 - 2" - } - }, - "d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" - } } }, "vega-view-transforms": { @@ -66235,24 +68352,6 @@ "d3-delaunay": "^6.0.2", "vega-dataflow": "^5.7.5", "vega-util": "^1.17.1" - }, - "dependencies": { - "d3-delaunay": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", - "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", - "requires": { - "delaunator": "5" - } - }, - "delaunator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", - "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", - "requires": { - "robust-predicates": "^3.0.0" - } - } } }, "vega-wordcloud": { @@ -66289,6 +68388,16 @@ "vfile-message": "^3.0.0" } }, + "vfile-location": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", + "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "vfile": "^5.0.0" + } + }, "vfile-matter": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/vfile-matter/-/vfile-matter-3.0.1.tgz", @@ -66519,6 +68628,17 @@ "defaults": "^1.0.3" } }, + "web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "dev": true + }, + "web-worker": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/web-worker/-/web-worker-1.2.0.tgz", + "integrity": "sha512-PgF341avzqyx60neE9DD+XS26MMNMoUQRz9NOZwW32nPQrF6p77f1htcnjBSEV8BGMKZ16choqUG4hyI0Hx7mA==" + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -66751,6 +68871,12 @@ "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "dev": true }, + "workerpool": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", + "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", + "dev": true + }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -66873,6 +68999,32 @@ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true }, + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "requires": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "dependencies": { + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 87b36a0be..88ed9c006 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,8 @@ { "name": "portaljs", - "workspaces": ["./packages/*"], + "workspaces": [ + "./packages/*" + ], "version": "0.0.0", "license": "MIT", "scripts": { @@ -14,11 +16,11 @@ "@changesets/changelog-github": "^0.4.8", "@changesets/cli": "^2.26.1", "@nrwl/cypress": "15.9.2", - "@nrwl/eslint-plugin-nx": "^16.0.2", + "@nrwl/eslint-plugin-nx": "15.9.2", "@nrwl/jest": "15.9.2", "@nrwl/js": "15.9.2", "@nrwl/linter": "15.9.2", - "@nrwl/next": "^15.9.2", + "@nrwl/next": "15.9.2", "@nrwl/react": "15.9.2", "@nrwl/rollup": "15.9.2", "@nrwl/workspace": "15.9.2", @@ -28,13 +30,16 @@ "@swc/helpers": "~0.5.0", "@swc/jest": "0.2.20", "@testing-library/react": "14.0.0", + "@types/chai": "^4.3.5", "@types/jest": "^29.4.0", + "@types/mocha": "^10.0.1", "@types/node": "18.14.2", "@types/react": "18.0.28", "@types/react-dom": "18.0.11", "@typescript-eslint/eslint-plugin": "^5.36.1", "@typescript-eslint/parser": "^5.36.1", "babel-jest": "^29.4.1", + "chai": "^4.3.7", "cypress": "^12.2.0", "eslint": "~8.15.0", "eslint-config-next": "13.1.1", @@ -44,14 +49,21 @@ "eslint-plugin-jsx-a11y": "6.7.1", "eslint-plugin-react": "7.32.2", "eslint-plugin-react-hooks": "4.6.0", + "htmlparser2": "^9.0.0", "jest": "^29.4.1", "jest-environment-jsdom": "^29.4.1", + "micromark": "^3.2.0", + "mocha": "^10.2.0", "nx": "15.9.2", "prettier": "^2.6.2", "react-test-renderer": "18.2.0", + "rehype-stringify": "^9.0.3", + "remark": "^14.0.3", "swc-loader": "0.1.15", "ts-jest": "^29.0.5", "ts-node": "10.9.1", - "typescript": "~4.9.5" + "typescript": "~4.9.5", + "unist-util-select": "^4.0.3", + "unist-util-visit": "^4.1.2" } } diff --git a/packages/core/.babelrc b/packages/core/.babelrc new file mode 100644 index 000000000..ccae900be --- /dev/null +++ b/packages/core/.babelrc @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "@nrwl/react/babel", + { + "runtime": "automatic", + "useBuiltIns": "usage" + } + ] + ], + "plugins": [] +} diff --git a/packages/core/.eslintrc.json b/packages/core/.eslintrc.json new file mode 100644 index 000000000..eb7ded6f7 --- /dev/null +++ b/packages/core/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["plugin:@nrwl/nx/react", "../../.eslintrc.json"], + "ignorePatterns": ["!**/*", "dist/**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/core/README.md b/packages/core/README.md new file mode 100644 index 000000000..d823502e6 --- /dev/null +++ b/packages/core/README.md @@ -0,0 +1,3 @@ +# @portaljs/core + +Core Portal.JS package containing components, styles, and utils. diff --git a/packages/core/jest.config.ts b/packages/core/jest.config.ts new file mode 100644 index 000000000..7670c67f0 --- /dev/null +++ b/packages/core/jest.config.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +export default { + displayName: "core", + preset: "../../jest.preset.js", + transform: { + "^.+\\.[tj]sx?$": "babel-jest", + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"] +}; diff --git a/packages/core/package.json b/packages/core/package.json new file mode 100644 index 000000000..dc4fa0279 --- /dev/null +++ b/packages/core/package.json @@ -0,0 +1,42 @@ +{ + "name": "@portaljs/core", + "version": "1.0.0", + "description": "Core Portal.JS components, configs and utils.", + "repository": { + "type": "git", + "url": "git+https://github.com/datopian/portaljs.git", + "directory": "packages/core" + }, + "author": "Rufus Pollock", + "license": "MIT", + "bugs": { + "url": "https://github.com/datopian/portaljs/issues" + }, + "homepage": "https://github.com/datopian/portaljs#readme", + "publishConfig": { + "access": "public" + }, + "type": "module", + "main": "./dist/index.js", + "dependencies": { + "@docsearch/react": "^3.3.3", + "@floating-ui/react-dom": "^1.3.0", + "@floating-ui/react-dom-interactions": "^0.13.3", + "@giscus/react": "^2.2.6", + "@headlessui/react": "^1.7.12", + "clsx": "^1.2.1", + "core-js": "^3.30.2", + "disqus-react": "^1.1.5", + "framer-motion": "^10.0.1", + "kbar": "0.1.0-beta.40", + "mdx-mermaid": "^1.3.2", + "mermaid": "^10.2.2", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "next": "^13.2.1", + "next-themes": "^0.2.1", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } +} diff --git a/packages/core/project.json b/packages/core/project.json new file mode 100644 index 000000000..cd4104dc1 --- /dev/null +++ b/packages/core/project.json @@ -0,0 +1,45 @@ +{ + "name": "core", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/core/src", + "projectType": "library", + "tags": [], + "targets": { + "build": { + "executor": "@nrwl/rollup:rollup", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "packages/core/dist", + "tsConfig": "packages/core/tsconfig.lib.json", + "project": "packages/core/package.json", + "entryFile": "packages/core/src/index.ts", + "format": ["esm"], + "generateExportsField": true, + "rollupConfig": "@nrwl/react/plugins/bundle-rollup", + "compiler": "babel", + "assets": [ + { + "glob": "packages/core/README.md", + "input": ".", + "output": "." + } + ] + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/core/**/*.{ts,tsx,js,jsx}"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/core/jest.config.ts", + "passWithNoTests": true + } + } + } +} diff --git a/packages/core/src/config/default.ts b/packages/core/src/config/default.ts new file mode 100644 index 000000000..cb25e13c7 --- /dev/null +++ b/packages/core/src/config/default.ts @@ -0,0 +1,31 @@ +export const defaultConfig = { + title: "Flowershow", + description: "", + showEditLink: false, + showToc: true, + showSidebar: false, + showLinkPreviews: true, + author: "", + authorLogo: "", + domain: "", + // Google analytics key e.g. G-XXXX + analytics: "", + // content source directory for markdown files + // DO NOT CHANGE THIS VALUE + // if you have your notes in another (external) directory, + // /content dir should be a symlink to that directory + content: "content", + avatarPlaceholder: "/_flowershow/avatarplaceholder.png", + contentExclude: [], + contentInclude: [], + blogDir: "blog", + peopleDir: "people", + // Theme + theme: { + default: "dark", + toggleIcon: "/_flowershow/theme-button.svg", + }, + navLinks: [ + // { href: '/about', name: 'About' }, + ], +}; diff --git a/packages/core/src/config/index.ts b/packages/core/src/config/index.ts new file mode 100644 index 000000000..9f738efd9 --- /dev/null +++ b/packages/core/src/config/index.ts @@ -0,0 +1 @@ +export { defaultConfig } from "./default"; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 000000000..67df23658 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,3 @@ +export * from "./ui"; +export * from "./utils"; +export * from "./config"; diff --git a/packages/core/src/types/index.d.ts b/packages/core/src/types/index.d.ts new file mode 100644 index 000000000..6dc68fcad --- /dev/null +++ b/packages/core/src/types/index.d.ts @@ -0,0 +1,7 @@ +export {}; + +declare global { + interface Window { + gtag: any; // TODO + } +} diff --git a/packages/core/src/ui/Avatar/Avatar.tsx b/packages/core/src/ui/Avatar/Avatar.tsx new file mode 100644 index 000000000..247ed0df2 --- /dev/null +++ b/packages/core/src/ui/Avatar/Avatar.tsx @@ -0,0 +1,24 @@ +// TODO +type Props = any; + +export const Avatar: React.FC = ({ name, img, href }) => { + const Component = href ? "a" : "div"; + return ( + +
+
+ {name} +
+
+

+ {name} +

+
+
+
+ ); +}; diff --git a/packages/core/src/ui/Avatar/index.ts b/packages/core/src/ui/Avatar/index.ts new file mode 100644 index 000000000..4e1e5d996 --- /dev/null +++ b/packages/core/src/ui/Avatar/index.ts @@ -0,0 +1 @@ +export { Avatar } from "./Avatar"; diff --git a/packages/core/src/ui/Base/BaseLink.tsx b/packages/core/src/ui/Base/BaseLink.tsx new file mode 100644 index 000000000..a06c5af20 --- /dev/null +++ b/packages/core/src/ui/Base/BaseLink.tsx @@ -0,0 +1,15 @@ +import Link from "next/link.js"; +import { forwardRef } from "react"; + +const BaseLink = forwardRef((props: any, ref) => { + const { href, children, ...rest } = props; + return ( + + {children} + + ); +}); + +BaseLink.displayName = "BaseLink"; + +export { BaseLink }; diff --git a/packages/core/src/ui/Base/CustomLink.tsx b/packages/core/src/ui/Base/CustomLink.tsx new file mode 100644 index 000000000..84b77e426 --- /dev/null +++ b/packages/core/src/ui/Base/CustomLink.tsx @@ -0,0 +1,57 @@ +import Link from "next/link.js"; +import { Tooltip } from "../Tooltip"; +import TwitterEmbed from "./TwitterEmbed"; + +// TODO it's a mess, move twitter embeds support to remark-embed +const TWITTER_REGEX = + /^https?:\/\/twitter\.com\/(?:#!\/)?(\w+)\/status(es)?\/(\d+)/; + +interface Props { + href: string; + data: any; + usehook: any; + preview: boolean; + children: React.ReactNode; + className?: string; + [x: string]: unknown; +} + +export const CustomLink: React.FC = ({ + data, + usehook, + preview, + ...props +}) => { + const { href } = props; + const isInternalLink = !href.startsWith("http"); + // eslint-disable-next-line no-useless-escape + const isHeadingLink = href.startsWith("#"); + const isTwitterLink = TWITTER_REGEX.test(href); + + // Use next link for pages within app and for external links. + // https://nextjs.org/learn/basics/navigate-between-pages/client-side + if (isInternalLink) { + if (preview && !isHeadingLink) { + return ( + } + /> + ); + } else { + return ; + } + } + + if (isTwitterLink) { + return ; + } + + return ( + + {props.children} + + ); +}; diff --git a/packages/core/src/ui/Base/ThemeSelector.tsx b/packages/core/src/ui/Base/ThemeSelector.tsx new file mode 100644 index 000000000..a0e1dc314 --- /dev/null +++ b/packages/core/src/ui/Base/ThemeSelector.tsx @@ -0,0 +1,44 @@ +import { useTheme } from "next-themes"; +import { useEffect, useState } from "react"; + +interface Props { + defaultTheme: "dark" | "light"; + toggleIcon: string; +} + +export const ThemeSelector: React.FC = ({ + defaultTheme, + toggleIcon, +}) => { + const [mounted, setMounted] = useState(false); + const { theme, setTheme } = useTheme(); + + useEffect(() => setMounted(true), []); + + /** Avoid Hydration Mismatch + * https://github.com/pacocoursey/next-themes#avoid-hydration-mismatch + */ + if (!mounted) return null; + + // TODO why? + if (!defaultTheme) return null; + + return ( + + ); +}; diff --git a/packages/core/src/ui/Base/TwitterEmbed.tsx b/packages/core/src/ui/Base/TwitterEmbed.tsx new file mode 100644 index 000000000..ed5a10a0d --- /dev/null +++ b/packages/core/src/ui/Base/TwitterEmbed.tsx @@ -0,0 +1,105 @@ +// TODO dark and light theme + +import { useEffect, useState, useRef, RefObject } from "react"; + +const twitterWidgetJs = "https://platform.twitter.com/widgets.js"; +enum TweetState { + LOADING, + LOADED, + FAILED, +} + +interface TweetConfig { + theme: string; +} + +declare global { + interface Window { + twttr: { + widgets: { + createTweet: ( + id: string, + ref: RefObject, + options: TweetConfig + ) => Promise; // TODO type + load: (ref: RefObject) => void; + }; + }; + } +} + +export default function TwitterEmbed({ url, ...props }) { + const ref = useRef(null); + const [tweetState, setTweetState] = useState(TweetState.LOADING); + + const tweetId = url.split("status/").pop(); + + useEffect(() => { + const renderTweet = () => { + window.twttr.widgets + .createTweet(tweetId, ref.current as any, { + theme: "dark", + }) + .then((el) => { + if (el) { + setTweetState(TweetState.LOADED); + } else { + setTweetState(TweetState.FAILED); + } + }); + return window.twttr.widgets.load(ref.current as any); + }; + + if (!window.twttr) { + const script = document.createElement("script"); + script.src = twitterWidgetJs; + script.async = true; + script.onload = () => renderTweet(); + document.head.appendChild(script); + } else { + renderTweet(); + } + }, [tweetId]); + + return ( + <> + {tweetState === TweetState.LOADING && ( +
+
+ + Twitter + + +
+ {"Loading tweet..."} +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )} +
+ + ); +} diff --git a/packages/core/src/ui/Base/index.ts b/packages/core/src/ui/Base/index.ts new file mode 100644 index 000000000..eb887dab0 --- /dev/null +++ b/packages/core/src/ui/Base/index.ts @@ -0,0 +1,3 @@ +export { BaseLink } from "./BaseLink"; +export { ThemeSelector } from "./ThemeSelector"; +export { CustomLink } from "./CustomLink"; diff --git a/packages/core/src/ui/Blog/Avatar.jsx b/packages/core/src/ui/Blog/Avatar.jsx new file mode 100644 index 000000000..6d3cf4cfd --- /dev/null +++ b/packages/core/src/ui/Blog/Avatar.jsx @@ -0,0 +1,21 @@ +export function Avatar({ name, img, href }) { + const Component = href ? "a" : "div"; + return ( + +
+
+ {name} +
+
+

+ {name} +

+
+
+
+ ); +} diff --git a/packages/core/src/ui/Blog/BlogItem.tsx b/packages/core/src/ui/Blog/BlogItem.tsx new file mode 100644 index 000000000..a68dfaa24 --- /dev/null +++ b/packages/core/src/ui/Blog/BlogItem.tsx @@ -0,0 +1,40 @@ +import { Card } from "../Card"; +import { formatDate } from "../../utils/formatDate"; +import { Blog } from "../types"; + +interface Props { + blog: Blog; +} + +export const BlogItem: React.FC = ({ blog }) => { + return ( +
+ + + {blog.title} + + + {formatDate(blog.date)} + + {blog.description && ( + + {blog.description} + + )} + Read article + + + {formatDate(blog.date)} + +
+ ); +}; diff --git a/packages/core/src/ui/Blog/BlogsList.tsx b/packages/core/src/ui/Blog/BlogsList.tsx new file mode 100644 index 000000000..c997463c7 --- /dev/null +++ b/packages/core/src/ui/Blog/BlogsList.tsx @@ -0,0 +1,36 @@ +import { useState } from "react"; +import { BlogItem } from "./BlogItem"; + +const BLOGS_LOAD_COUNT = 10; + +// TODO types +export const BlogsList: React.FC = ({ blogs }) => { + const [blogsCount, setBlogsCount] = useState(BLOGS_LOAD_COUNT); + + const handleLoadMore = () => { + setBlogsCount((prevCount) => prevCount + BLOGS_LOAD_COUNT); + }; + + return ( + <> +
+
+ {blogs.slice(0, blogsCount).map((blog) => { + return ; + })} +
+
+ {blogs.length > blogsCount && ( +
+ +
+ )} + + ); +}; diff --git a/packages/core/src/ui/Blog/index.ts b/packages/core/src/ui/Blog/index.ts new file mode 100644 index 000000000..53165b482 --- /dev/null +++ b/packages/core/src/ui/Blog/index.ts @@ -0,0 +1 @@ +export { BlogsList } from "./BlogsList"; diff --git a/packages/core/src/ui/BlogLayout/BlogLayout.tsx b/packages/core/src/ui/BlogLayout/BlogLayout.tsx new file mode 100644 index 000000000..56f05f7c6 --- /dev/null +++ b/packages/core/src/ui/BlogLayout/BlogLayout.tsx @@ -0,0 +1,38 @@ +/* eslint import/no-default-export: off */ +import { formatDate } from "../../utils/formatDate"; +import { Avatar } from "../Avatar"; + +// TODO +type Props = any; + +export const BlogLayout: React.FC = ({ children, ...frontMatter }) => { + const { title, date, authors } = frontMatter; + + return ( +
+
+
+ {title &&

{title}

} + {date && ( +

+ +

+ )} + {authors && ( +
+ {authors.map(({ name, avatar, urlPath }) => ( + + ))} +
+ )} +
+
+
{children}
+
+ ); +}; diff --git a/packages/core/src/ui/BlogLayout/index.ts b/packages/core/src/ui/BlogLayout/index.ts new file mode 100644 index 000000000..865418650 --- /dev/null +++ b/packages/core/src/ui/BlogLayout/index.ts @@ -0,0 +1 @@ +export { BlogLayout } from "./BlogLayout"; diff --git a/packages/core/src/ui/Card/Card.tsx b/packages/core/src/ui/Card/Card.tsx new file mode 100644 index 000000000..f10b24509 --- /dev/null +++ b/packages/core/src/ui/Card/Card.tsx @@ -0,0 +1,170 @@ +// import Link from 'next/link' +import clsx from "clsx"; +import { ChevronRightIcon } from "../Icons"; + +interface CardProps extends React.PropsWithChildren { + as?: React.ElementType; + className?: string; +} + +interface CardLinkProps extends React.PropsWithChildren { + href?: string; + className?: string; +} + +interface CardTitleProps extends React.PropsWithChildren { + as?: React.ElementType; + href?: string; + className?: string; +} + +interface CardDescriptionProps extends React.PropsWithChildren { + className?: string; +} + +interface CardCtaProps extends React.PropsWithChildren { + className?: string; +} + +interface CardEyebrowProps extends React.PropsWithChildren { + as?: React.ElementType; + decorate?: boolean; + className?: string; + [x: string]: unknown; +} + +type Card = React.FC & { Link: React.FC } & { + Title: React.FC; +} & { Description: React.FC } & { + Cta: React.FC; +} & { Eyebrow: React.FC }; + +export const Card: Card = ({ children, as: Component = "div", className }) => { + return ( + + {children} + + ); +}; + +Card.Link = function CardLink({ children, href, className, ...props }) { + // + // + // {children} + // + return ( + <> +
+ + + {children} + + + ); +}; + +Card.Title = function CardTitle({ + as: Component = "h2", + href, + children, + className, +}) { + return ( + + {href ? {children} : children} + + ); +}; + +Card.Description = function CardDescription({ children, className }) { + return ( +

+ {children} +

+ ); +}; + +Card.Cta = function CardCta({ children, className }) { + return ( + + ); +}; + +/* Card.Avatar = function CardAvatar({ name, src, href }) { + * return ( + * + *
+ *
+ * {src ? ( + * {name} + * ) : ( + * + * + * {initialsFromName(name)} + * + * + * )} + *
+ *
+ *

+ * {name} + *

+ *
+ *
+ *
+ * ); + * }; */ + +Card.Eyebrow = function CardEyebrow({ + as: Component = "p", + decorate = false, + className, + children, + ...props +}) { + return ( + + {decorate && ( + + ); +}; diff --git a/packages/core/src/ui/Card/index.ts b/packages/core/src/ui/Card/index.ts new file mode 100644 index 000000000..fbaf43c22 --- /dev/null +++ b/packages/core/src/ui/Card/index.ts @@ -0,0 +1 @@ +export { Card } from "./Card"; diff --git a/packages/core/src/ui/Comments/Disqus.tsx b/packages/core/src/ui/Comments/Disqus.tsx new file mode 100644 index 000000000..1c66c808c --- /dev/null +++ b/packages/core/src/ui/Comments/Disqus.tsx @@ -0,0 +1,25 @@ +import { DiscussionEmbed } from "disqus-react"; + +export interface DisqusConfig { + provider: "disqus"; + pages?: Array; + config: { + shortname: string; + }; +} + +export type DisqusProps = DisqusConfig["config"] & { + slug?: string; +}; + +export const Disqus: React.FC = ({ shortname, slug }) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Comments/Giscus.tsx b/packages/core/src/ui/Comments/Giscus.tsx new file mode 100644 index 000000000..9011a0cc0 --- /dev/null +++ b/packages/core/src/ui/Comments/Giscus.tsx @@ -0,0 +1,53 @@ +import Giscus, { BooleanString, Mapping, Repo } from "@giscus/react"; +import { useTheme } from "next-themes"; + +export interface GiscusConfig { + provider: "giscus"; + pages?: Array; + config: { + theme?: string; + mapping: Mapping; + repo: Repo; + repositoryId: string; + category: string; + categoryId: string; + reactions: BooleanString; + metadata: BooleanString; + inputPosition?: string; + lang?: string; + }; +} + +export type GiscusProps = GiscusConfig["config"]; + +export const GiscusReactComponent: React.FC = ({ + repo, + repositoryId, + category, + categoryId, + reactions = "0", + metadata = "0", + mapping = "pathname", + theme = "light", +}) => { + const { theme: nextTheme, resolvedTheme } = useTheme(); + const commentsTheme = + nextTheme === "dark" || resolvedTheme === "dark" + ? "transparent_dark" + : theme; + + return ( + + ); +}; diff --git a/packages/core/src/ui/Comments/Utterances.tsx b/packages/core/src/ui/Comments/Utterances.tsx new file mode 100644 index 000000000..780ca7bd7 --- /dev/null +++ b/packages/core/src/ui/Comments/Utterances.tsx @@ -0,0 +1,59 @@ +import { useEffect, useCallback } from "react"; +import { useTheme } from "next-themes"; + +export interface UtterancesConfig { + provider: "utterances"; + pages?: Array; + config: { + theme?: string; + repo: string; + label: string; + issueTerm: string; + }; +} + +export type UtterancesProps = UtterancesConfig["config"]; + +export const Utterances: React.FC = ({ + repo, + label = "comments", + issueTerm = "pathname", + theme = "github-light", +}) => { + const { theme: nextTheme, resolvedTheme } = useTheme(); + // TODO: remove preferred-color-scheme after theme toggle fix + const commentsTheme = nextTheme + ? nextTheme === "dark" || resolvedTheme === "dark" + ? "github-dark" + : theme + : "preferred-color-scheme"; + + const COMMENTS_ID = "comments-container"; + + const LoadComments = useCallback(() => { + const script = document.createElement("script"); + script.src = "https://utteranc.es/client.js"; + script.setAttribute("repo", repo); + script.setAttribute("issue-term", issueTerm); + script.setAttribute("label", label); + script.setAttribute("theme", commentsTheme); + script.setAttribute("crossorigin", "anonymous"); + script.async = true; + + const comments = document.getElementById(COMMENTS_ID); + if (comments) comments.appendChild(script); + + return () => { + const comments = document.getElementById(COMMENTS_ID); + if (comments) comments.innerHTML = ""; + }; + }, [commentsTheme, issueTerm]); + + // Reload on theme change + useEffect(() => { + LoadComments(); + }, [LoadComments]); + + // Added `relative` to fix a weird bug with `utterances-frame` position + return
; +}; diff --git a/packages/core/src/ui/Comments/index.tsx b/packages/core/src/ui/Comments/index.tsx new file mode 100644 index 000000000..31750bc94 --- /dev/null +++ b/packages/core/src/ui/Comments/index.tsx @@ -0,0 +1,53 @@ +import dynamic from "next/dynamic.js"; +import { GiscusReactComponent, GiscusConfig, GiscusProps } from "./Giscus"; +import { Utterances, UtterancesConfig, UtterancesProps } from "./Utterances"; +import { Disqus, DisqusConfig, DisqusProps } from "./Disqus"; + +export type CommentsConfig = GiscusConfig | UtterancesConfig | DisqusConfig; + +export interface CommentsProps { + commentsConfig: CommentsConfig; + slug?: string; +} + +const GiscusComponent = dynamic( + () => { + return import("./Giscus").then((mod) => mod.GiscusReactComponent); + }, + { ssr: false } +); + +const UtterancesComponent = dynamic( + () => { + return import("./Utterances").then((mod) => mod.Utterances); + }, + { ssr: false } +); + +const DisqusComponent = dynamic( + () => { + return import("./Disqus").then((mod) => mod.Disqus); + }, + { ssr: false } +); + +export const Comments = ({ commentsConfig, slug }: CommentsProps) => { + switch (commentsConfig.provider) { + case "giscus": + return ; + case "utterances": + return ; + case "disqus": + return ; + } +}; + +export { GiscusReactComponent, Utterances, Disqus }; +export type { + GiscusConfig, + GiscusProps, + UtterancesConfig, + UtterancesProps, + DisqusConfig, + DisqusProps, +}; diff --git a/packages/core/src/ui/DocsLayout/Docs.tsx b/packages/core/src/ui/DocsLayout/Docs.tsx new file mode 100644 index 000000000..49fdc6689 --- /dev/null +++ b/packages/core/src/ui/DocsLayout/Docs.tsx @@ -0,0 +1,22 @@ +/* eslint import/no-default-export: off */ +import { formatDate } from "../../utils/formatDate"; + +// TODO types +export const DocsLayout: React.FC = ({ children, ...frontMatter }) => { + const { title, created } = frontMatter; + return ( +
+
+
+ {created && ( +

+ +

+ )} + {title &&

{title}

} +
+
+
{children}
+
+ ); +}; diff --git a/packages/core/src/ui/DocsLayout/index.ts b/packages/core/src/ui/DocsLayout/index.ts new file mode 100644 index 000000000..e977f0fd0 --- /dev/null +++ b/packages/core/src/ui/DocsLayout/index.ts @@ -0,0 +1 @@ +export { DocsLayout } from "./Docs"; diff --git a/packages/core/src/ui/Icons/ChevronRightIcon.tsx b/packages/core/src/ui/Icons/ChevronRightIcon.tsx new file mode 100644 index 000000000..87b6bcbb1 --- /dev/null +++ b/packages/core/src/ui/Icons/ChevronRightIcon.tsx @@ -0,0 +1,12 @@ +export const ChevronRightIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Icons/CloseIcon.tsx b/packages/core/src/ui/Icons/CloseIcon.tsx new file mode 100644 index 000000000..a18907f3b --- /dev/null +++ b/packages/core/src/ui/Icons/CloseIcon.tsx @@ -0,0 +1,14 @@ +export const CloseIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Icons/DiscordIcon.tsx b/packages/core/src/ui/Icons/DiscordIcon.tsx new file mode 100644 index 000000000..e340904a3 --- /dev/null +++ b/packages/core/src/ui/Icons/DiscordIcon.tsx @@ -0,0 +1,14 @@ +export const DiscordIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + + + ); +}; diff --git a/packages/core/src/ui/Icons/GitHubIcon.tsx b/packages/core/src/ui/Icons/GitHubIcon.tsx new file mode 100644 index 000000000..7f5696df7 --- /dev/null +++ b/packages/core/src/ui/Icons/GitHubIcon.tsx @@ -0,0 +1,7 @@ +export const GitHubIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Icons/MenuIcon.tsx b/packages/core/src/ui/Icons/MenuIcon.tsx new file mode 100644 index 000000000..e83445fa2 --- /dev/null +++ b/packages/core/src/ui/Icons/MenuIcon.tsx @@ -0,0 +1,14 @@ +export const MenuIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Icons/SearchIcon.tsx b/packages/core/src/ui/Icons/SearchIcon.tsx new file mode 100644 index 000000000..c9315c4e8 --- /dev/null +++ b/packages/core/src/ui/Icons/SearchIcon.tsx @@ -0,0 +1,7 @@ +export const SearchIcon: React.FC<{ [x: string]: unknown }> = (props) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Icons/index.tsx b/packages/core/src/ui/Icons/index.tsx new file mode 100644 index 000000000..f31611dfd --- /dev/null +++ b/packages/core/src/ui/Icons/index.tsx @@ -0,0 +1,6 @@ +export { GitHubIcon } from "./GitHubIcon"; +export { DiscordIcon } from "./DiscordIcon"; +export { MenuIcon } from "./MenuIcon"; +export { CloseIcon } from "./CloseIcon"; +export { SearchIcon } from "./SearchIcon"; +export { ChevronRightIcon } from "./ChevronRightIcon"; diff --git a/packages/core/src/ui/Layout/EditThisPage.tsx b/packages/core/src/ui/Layout/EditThisPage.tsx new file mode 100644 index 000000000..40648864d --- /dev/null +++ b/packages/core/src/ui/Layout/EditThisPage.tsx @@ -0,0 +1,30 @@ +export const EditThisPage = ({ url }: { url: string }) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Layout/Footer.tsx b/packages/core/src/ui/Layout/Footer.tsx new file mode 100644 index 000000000..f3348b1b3 --- /dev/null +++ b/packages/core/src/ui/Layout/Footer.tsx @@ -0,0 +1,61 @@ +import Link from "next/link.js"; + +import { AuthorConfig, NavLink } from "../types"; + +interface Props { + links: Array; + author: AuthorConfig; +} + +export const Footer: React.FC = ({ links, author }) => { + return ( + + ); +}; diff --git a/packages/core/src/ui/Layout/Layout.tsx b/packages/core/src/ui/Layout/Layout.tsx new file mode 100644 index 000000000..e1e2f9098 --- /dev/null +++ b/packages/core/src/ui/Layout/Layout.tsx @@ -0,0 +1,147 @@ +import { useEffect, useState } from "react"; +import Head from "next/head.js"; +import { NextRouter, useRouter } from "next/router.js"; +import clsx from "clsx"; + +import { useTableOfContents } from "./useTableOfContents"; +import { collectHeadings } from "../../utils"; + +import { Nav } from "../Nav"; +import { SiteToc, NavItem, NavGroup } from "../SiteToc"; +import { Comments, CommentsConfig } from "../Comments"; +import { Footer } from "./Footer"; +import { EditThisPage } from "./EditThisPage"; +import { TableOfContents, TocSection } from "./TableOfContents"; +import { NavConfig, ThemeConfig } from "../Nav"; +import { AuthorConfig } from "../types"; + +interface Props extends React.PropsWithChildren { + showComments: boolean; + showEditLink: boolean; + showSidebar: boolean; + showToc: boolean; + nav: NavConfig; + author: AuthorConfig; + theme: ThemeConfig; + urlPath: string; + commentsConfig: CommentsConfig; + siteMap: Array; + editUrl?: string; +} + +export const Layout: React.FC = ({ + children, + nav, + author, + theme, + showEditLink, + showToc, + showSidebar, + urlPath, + showComments, + commentsConfig, + editUrl, + siteMap, +}) => { + const [isScrolled, setIsScrolled] = useState(false); + const [tableOfContents, setTableOfContents] = useState([]); + const currentSection = useTableOfContents(tableOfContents); + const router: NextRouter = useRouter(); + + useEffect(() => { + if (!showToc) return; + const headingNodes: NodeListOf = + document.querySelectorAll("h1,h2,h3"); + const toc = collectHeadings(headingNodes); + setTableOfContents(toc ?? []); + }, [router.asPath, showToc]); // update table of contents on route change with next/link + + useEffect(() => { + function onScroll() { + setIsScrolled(window.scrollY > 0); + } + onScroll(); + window.addEventListener("scroll", onScroll, { passive: true }); + return () => { + window.removeEventListener("scroll", onScroll); + }; + }, []); + + return ( + <> + + + + + +
+ {/* NAVBAR */} +
+
+ +
+
+ {/* wrapper for sidebar, main content and ToC */} +
+ {/* SIDEBAR */} + {showSidebar && ( +
+ +
+ )} + {/* MAIN CONTENT & FOOTER */} +
+ {children} + {/* EDIT THIS PAGE LINK */} + {showEditLink && editUrl && } + {/* PAGE COMMENTS */} + {showComments && ( +
+ {} +
+ )} +
+
+ {/** TABLE OF CONTENTS */} + {showToc && tableOfContents.length > 0 && ( +
+ +
+ )} +
+
+ + ); +}; diff --git a/packages/core/src/ui/Layout/TableOfContents.tsx b/packages/core/src/ui/Layout/TableOfContents.tsx new file mode 100644 index 000000000..1fa9e067e --- /dev/null +++ b/packages/core/src/ui/Layout/TableOfContents.tsx @@ -0,0 +1,90 @@ +import Link from "next/link.js"; + +export interface TocSection { + id: string; + title: string; + level: string; + children?: any; +} + +interface Props { + tableOfContents: TocSection[]; + currentSection: string; +} + +export const TableOfContents: React.FC = ({ + tableOfContents, + currentSection, +}) => { + function isActiveSection(section) { + if (section.id === currentSection) { + return true; + } + if (!section.children) { + return false; + } + return section.children.findIndex(isActiveSection) > -1; + } + + return ( + + ); +}; diff --git a/packages/core/src/ui/Layout/index.ts b/packages/core/src/ui/Layout/index.ts new file mode 100644 index 000000000..fb13e9525 --- /dev/null +++ b/packages/core/src/ui/Layout/index.ts @@ -0,0 +1,5 @@ +export { EditThisPage } from "./EditThisPage"; +export { Layout } from "./Layout"; +export { useTableOfContents } from "./useTableOfContents"; +export { TableOfContents, TocSection } from "./TableOfContents"; +export { Footer } from "./Footer"; diff --git a/packages/core/src/ui/Layout/useTableOfContents.ts b/packages/core/src/ui/Layout/useTableOfContents.ts new file mode 100644 index 000000000..c3131faba --- /dev/null +++ b/packages/core/src/ui/Layout/useTableOfContents.ts @@ -0,0 +1,51 @@ +import { useCallback, useEffect, useState } from "react"; + +// TODO types +export const useTableOfContents = (tableOfContents) => { + const [currentSection, setCurrentSection] = useState(tableOfContents[0]?.id); + + const getHeadings = useCallback((toc) => { + return toc + .flatMap((node) => [ + node.id, + ...node.children.flatMap((child) => [ + child.id, + ...child.children.map((subChild) => subChild.id), + ]), + ]) + .map((id) => { + const el = document.getElementById(id); + if (!el) return null; + + const style = window.getComputedStyle(el); + const scrollMt = parseFloat(style.scrollMarginTop); + + const top = window.scrollY + el.getBoundingClientRect().top - scrollMt; + return { id, top }; + }) + .filter((el) => !!el); + }, []); + + useEffect(() => { + if (tableOfContents.length === 0) return; + const headings = getHeadings(tableOfContents); + function onScroll() { + const top = window.scrollY + 4.5; + let current = headings[0].id; + headings.forEach((heading) => { + if (top >= heading.top) { + current = heading.id; + } + return current; + }); + setCurrentSection(current); + } + window.addEventListener("scroll", onScroll, { passive: true }); + onScroll(); + return () => { + window.removeEventListener("scroll", onScroll); + }; + }, [getHeadings, tableOfContents]); + + return currentSection; +}; diff --git a/packages/core/src/ui/Mermaid/Mermaid.tsx b/packages/core/src/ui/Mermaid/Mermaid.tsx new file mode 100644 index 000000000..f425ee7d1 --- /dev/null +++ b/packages/core/src/ui/Mermaid/Mermaid.tsx @@ -0,0 +1,25 @@ +import dynamic from "next/dynamic.js"; +// import { useTheme } from "next-themes"; + +import type { MermaidProps } from "mdx-mermaid/lib/Mermaid"; +// import type { Config } from "mdx-mermaid/lib/config.model"; + +const MdxMermaid = dynamic( + () => import("mdx-mermaid/lib/Mermaid").then((res) => res.Mermaid), + { ssr: false } +); + +export const Mermaid: React.FC = ({ ...props }) => { + // TODO: add light and dark theme configs + // currently Mermaid component doesn't render if configs are passed as props. + + // const { theme } = useTheme() + // const config: Config = { + // mermaid: { + // fontFamily: "inherit", + // theme: theme + // } + // } + + return ; +}; diff --git a/packages/core/src/ui/Mermaid/index.ts b/packages/core/src/ui/Mermaid/index.ts new file mode 100644 index 000000000..966844156 --- /dev/null +++ b/packages/core/src/ui/Mermaid/index.ts @@ -0,0 +1 @@ +export { Mermaid } from "./Mermaid"; diff --git a/packages/core/src/ui/Nav/Nav.tsx b/packages/core/src/ui/Nav/Nav.tsx new file mode 100644 index 000000000..72394c1dd --- /dev/null +++ b/packages/core/src/ui/Nav/Nav.tsx @@ -0,0 +1,86 @@ +import { useEffect, useState } from "react"; + +import { ThemeSelector } from "../Base"; +import { SearchContext, SearchField } from "../Search"; +import { NavMobile } from "./NavMobile"; +import { NavItem } from "./NavItem"; +import { NavTitle } from "./NavTitle"; +import { NavSocial } from "./NavSocial"; +import { NavLink, SocialLink, SearchProviderConfig } from "../types"; + +export interface ThemeConfig { + defaultTheme: "dark" | "light"; + themeToggleIcon: string; +} + +export interface NavConfig { + title: string; + logo?: string; + version?: string; + links: Array; + search?: SearchProviderConfig; + social?: Array; +} + +interface Props extends NavConfig, ThemeConfig, React.PropsWithChildren {} + +export const Nav: React.FC = ({ + children, + title, + logo, + version, + links, + search, + social, + defaultTheme, + themeToggleIcon, +}) => { + const [modifierKey, setModifierKey] = useState(); + const [Search, setSearch] = useState(); // TODO types + + useEffect(() => { + const isMac = /(Mac|iPhone|iPod|iPad)/i.test(navigator.userAgent); + setModifierKey(isMac ? "⌘" : "Ctrl "); + }, []); + + useEffect(() => { + if (search) { + setSearch(SearchContext(search.provider)); + } + }, [search]); + + return ( + + ); +}; diff --git a/packages/core/src/ui/Nav/NavItem.tsx b/packages/core/src/ui/Nav/NavItem.tsx new file mode 100644 index 000000000..6ad05319f --- /dev/null +++ b/packages/core/src/ui/Nav/NavItem.tsx @@ -0,0 +1,21 @@ +import { Menu } from "@headlessui/react"; +import Link from "next/link.js"; +import { BaseLink } from "../Base"; +import { NavLink } from "../types"; + +interface Props { + link: NavLink; +} + +export const NavItem: React.FC = ({ link }) => { + return ( + + + {link.name} + + + ); +}; diff --git a/packages/core/src/ui/Nav/NavMobile.tsx b/packages/core/src/ui/Nav/NavMobile.tsx new file mode 100644 index 000000000..a975c0739 --- /dev/null +++ b/packages/core/src/ui/Nav/NavMobile.tsx @@ -0,0 +1,116 @@ +import { Dialog, Menu } from "@headlessui/react"; +import Link from "next/link.js"; +import { useRouter } from "next/router.js"; +import { useEffect, useState } from "react"; +import { SearchContext, SearchField } from "../Search"; +import { MenuIcon, CloseIcon } from "../Icons"; +import { NavLink, SearchProviderConfig } from "../types"; + +interface Props extends React.PropsWithChildren { + author?: string; + links?: Array; + search?: SearchProviderConfig; +} + +// TODO why mobile navigation only accepts author and regular nav accepts different things like title, logo, version +export const NavMobile: React.FC = ({ + children, + links, + search, + author, +}) => { + const router = useRouter(); + const [isOpen, setIsOpen] = useState(false); + const [Search, setSearch] = useState(); // TODO types + + useEffect(() => { + if (!isOpen) return; + + function onRouteChange() { + setIsOpen(false); + } + + router.events.on("routeChangeComplete", onRouteChange); + router.events.on("routeChangeError", onRouteChange); + + return () => { + router.events.off("routeChangeComplete", onRouteChange); + router.events.off("routeChangeError", onRouteChange); + }; + }, [router, isOpen]); + + useEffect(() => { + if (search) { + setSearch(SearchContext(search.provider)); + } + }, [search]); + + return ( + <> + + + +
+ + + {/* */} +
+ {author} +
+ +
+ {Search && ( + + {({ query }: any) => } + + )} + {links && ( +
    + {links.map((link) => ( + + +
  • + + {link.name} + +
  • +
    +
    + ))} +
+ )} + {/*
+ {children} +
*/} +
+
+ + ); +}; diff --git a/packages/core/src/ui/Nav/NavSocial.tsx b/packages/core/src/ui/Nav/NavSocial.tsx new file mode 100644 index 000000000..760f72d62 --- /dev/null +++ b/packages/core/src/ui/Nav/NavSocial.tsx @@ -0,0 +1,27 @@ +import Link from "next/link.js"; +import { GitHubIcon, DiscordIcon } from "../Icons"; +import { SocialLink, SocialPlatform } from "../types"; + +interface Props { + links: Array; +} + +const icons: { [K in SocialPlatform]: React.FC } = { + github: GitHubIcon, + discord: DiscordIcon, +}; + +export const NavSocial: React.FC = ({ links }) => { + return ( + <> + {links.map(({ label, href }) => { + const Icon = icons[label]; + return ( + + + + ); + })} + + ); +}; diff --git a/packages/core/src/ui/Nav/NavTitle.tsx b/packages/core/src/ui/Nav/NavTitle.tsx new file mode 100644 index 000000000..3c8cb5095 --- /dev/null +++ b/packages/core/src/ui/Nav/NavTitle.tsx @@ -0,0 +1,27 @@ +import Link from "next/link.js"; + +interface Props { + title: string; + logo?: string; + version?: string; +} + +export const NavTitle: React.FC = ({ title, logo, version }) => { + return ( + + {logo && ( + {title} + )} + {title && {title}} + {version && ( +
+ {version} +
+ )} + + ); +}; diff --git a/packages/core/src/ui/Nav/index.ts b/packages/core/src/ui/Nav/index.ts new file mode 100644 index 000000000..c6338b857 --- /dev/null +++ b/packages/core/src/ui/Nav/index.ts @@ -0,0 +1 @@ +export { Nav, NavConfig, ThemeConfig } from "./Nav"; diff --git a/packages/core/src/ui/Pre/Pre.tsx b/packages/core/src/ui/Pre/Pre.tsx new file mode 100644 index 000000000..92f3268b3 --- /dev/null +++ b/packages/core/src/ui/Pre/Pre.tsx @@ -0,0 +1,74 @@ +import { useRef, useState } from "react"; + +interface Props extends React.PropsWithChildren { + className?: string; +} + +export const Pre: React.FC = ({ children, ...props }) => { + const ref = useRef(); // TODO type + const [hovered, setHovered] = useState(false); + const [copied, setCopied] = useState(false); + + const onEnter = () => { + setHovered(true); + }; + const onExit = () => { + setHovered(false); + setCopied(false); + }; + const onCopy = () => { + setCopied(true); + navigator.clipboard.writeText(ref.current.textContent); + setTimeout(() => { + setCopied(false); + }, 2000); + }; + + return ( +
+ {hovered && ( + + )} +
{children}
+
+ ); +}; diff --git a/packages/core/src/ui/Pre/index.ts b/packages/core/src/ui/Pre/index.ts new file mode 100644 index 000000000..9cf7d3d70 --- /dev/null +++ b/packages/core/src/ui/Pre/index.ts @@ -0,0 +1 @@ +export { Pre } from "./Pre"; diff --git a/packages/core/src/ui/Search/Algolia.tsx b/packages/core/src/ui/Search/Algolia.tsx new file mode 100644 index 000000000..16d4c2737 --- /dev/null +++ b/packages/core/src/ui/Search/Algolia.tsx @@ -0,0 +1,132 @@ +import * as docsearch from "@docsearch/react"; +import Head from "next/head.js"; +import Link from "next/link.js"; +import { useRouter } from "next/router.js"; +import { createContext, useCallback, useMemo, useRef, useState } from "react"; +import { createPortal } from "react-dom"; + +const { useDocSearchKeyboardEvents } = docsearch; + +let DocSearchModal: any = null; + +function Hit({ hit, children }) { + return {children}; +} + +export const AlgoliaSearchContext = createContext({}); + +export function AlgoliaSearchProvider({ children, config }) { + const router = useRouter(); + const [isOpen, setIsOpen] = useState(false); + const [initialQuery, setInitialQuery] = useState(undefined); + + const importDocSearchModalIfNeeded = useCallback(async () => { + if (DocSearchModal) { + return Promise.resolve(); + } + + const [{ DocSearchModal: Modal }] = await Promise.all([docsearch]); + // eslint-disable-next-line + DocSearchModal = Modal; + }, [DocSearchModal]); + + const onOpen = useCallback(() => { + importDocSearchModalIfNeeded().then(() => { + setIsOpen(true); + }); + }, [importDocSearchModalIfNeeded, setIsOpen]); + + const onClose = useCallback(() => { + setIsOpen(false); + }, [setIsOpen]); + + const onInput = useCallback( + (event) => { + importDocSearchModalIfNeeded().then(() => { + setIsOpen(true); + setInitialQuery(event.key); + }); + }, + [importDocSearchModalIfNeeded, setIsOpen, setInitialQuery] + ); + + // web accessibility + // https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/keyboard-navigation/ + const navigator = useRef({ + navigate({ itemUrl }) { + // Algolia results could contain URL's from other domains which cannot + // be served through history and should navigate with window.location + const isInternalLink = itemUrl.startsWith("/"); + const isAnchorLink = itemUrl.startsWith("#"); + if (!isInternalLink && !isAnchorLink) { + window.location.href = itemUrl; + } else { + router.push(itemUrl); + } + }, + }).current; + + // https://docsearch.algolia.com/docs/api#transformitems + const transformItems = (items) => + items.map((item) => { + // If Algolia contains a external domain, we should navigate without + // relative URL + const isInternalLink = item.url.startsWith("/"); + const isAnchorLink = item.url.startsWith("#"); + if (!isInternalLink && !isAnchorLink) { + return item; + } + + // We transform the absolute URL into a relative URL. + const url = new URL(item.url); + return { + ...item, + // url: withBaseUrl(`${url.pathname}${url.hash}`), + url: `${url.pathname}${url.hash}`, + }; + }); + // ).current; + + useDocSearchKeyboardEvents({ + isOpen, + onOpen, + onClose, + onInput, + }); + + const providerValue = useMemo( + () => ({ query: { setSearch: setInitialQuery, toggle: onOpen } }), + [setInitialQuery, onOpen] + ); + + return ( + + + {/* This hints the browser that the website will load data from Algolia, + and allows it to preconnect to the DocSearch cluster. It makes the first + query faster, especially on mobile. */} + + + {children} + {isOpen && + DocSearchModal && + createPortal( + , + document.body + )} + + ); +} diff --git a/packages/core/src/ui/Search/KBar.tsx b/packages/core/src/ui/Search/KBar.tsx new file mode 100644 index 000000000..cd0f57ce0 --- /dev/null +++ b/packages/core/src/ui/Search/KBar.tsx @@ -0,0 +1,33 @@ +import router from "next/router.js"; +import { Action } from "kbar"; + +import { KBarModal } from "./KBarModal"; + +export const KBarSearchProvider = ({ config, children }) => { + const defaultActions = config?.defaultActions; + const searchDocumentsPath = "/search.json"; + + let startingActions: Action[] = [ + { + id: "homepage", + name: "Homepage", + keywords: "", + section: "Home", + perform: () => router.push("/"), + }, + ]; + + if (defaultActions && Array.isArray(defaultActions)) + startingActions = [...startingActions, ...defaultActions]; + + return KBarModal ? ( + + {children} + + ) : ( + children + ); +}; diff --git a/packages/core/src/ui/Search/KBarModal.tsx b/packages/core/src/ui/Search/KBarModal.tsx new file mode 100644 index 000000000..8184c7428 --- /dev/null +++ b/packages/core/src/ui/Search/KBarModal.tsx @@ -0,0 +1,21 @@ +import { KBarProvider, Action } from "kbar"; + +import { Portal } from "./KBarPortal"; + +interface Props extends React.PropsWithChildren { + searchDocumentsPath: string; + startingActions?: Action[]; +} + +export const KBarModal: React.FC = ({ + searchDocumentsPath, + startingActions, + children, +}) => { + return ( + + + {children} + + ); +}; diff --git a/packages/core/src/ui/Search/KBarPortal.tsx b/packages/core/src/ui/Search/KBarPortal.tsx new file mode 100644 index 000000000..c2867ffe8 --- /dev/null +++ b/packages/core/src/ui/Search/KBarPortal.tsx @@ -0,0 +1,120 @@ +import { useEffect, useState } from "react"; +import { + Action, + KBarAnimator, + KBarPortal, + KBarPositioner, + KBarResults, + KBarSearch, + useMatches, + useRegisterActions, +} from "kbar"; +import { kbarActionsFromDocuments } from "./kbarActionsFromDocuments"; + +interface Props { + searchDocumentsPath: string; +} + +export const Portal: React.FC = ({ searchDocumentsPath }) => { + const [searchActions, setSearchActions] = useState([]); + + useEffect(() => { + const fetchData = async () => { + const res = await fetch(searchDocumentsPath); + const json = await res.json(); + const actions = kbarActionsFromDocuments(json); + setSearchActions(actions); + }; + fetchData(); + }, [searchDocumentsPath]); + + useRegisterActions(searchActions, [searchActions]); + + return ( + + + +
+
+ + + + + + + + ESC + +
+ +
+
+
+
+ ); +}; + +function RenderItem(props) { + const { item, active } = props; + return ( +
+ {typeof item === "string" ? ( +
+
+ {item} +
+
+ ) : ( +
+ {item?.subtitle && ( +
+ {item.subtitle} +
+ )} +
{item?.name}
+
+ )} +
+ ); +} + +function RenderResults() { + const { results } = useMatches(); + + if (results.length) { + return ; + } + return ( +
+ No results for your search... +
+ ); +} diff --git a/packages/core/src/ui/Search/SearchField.tsx b/packages/core/src/ui/Search/SearchField.tsx new file mode 100644 index 000000000..a7d07c704 --- /dev/null +++ b/packages/core/src/ui/Search/SearchField.tsx @@ -0,0 +1,48 @@ +import { SearchIcon } from "../Icons"; + +// TODO types +export const SearchField: React.FC = (props) => { + const { modifierKey, onOpen, mobile } = props; + return ( + + ); +}; diff --git a/packages/core/src/ui/Search/SearchProvider.tsx b/packages/core/src/ui/Search/SearchProvider.tsx new file mode 100644 index 000000000..e6ec7e3e8 --- /dev/null +++ b/packages/core/src/ui/Search/SearchProvider.tsx @@ -0,0 +1,69 @@ +import dynamic from "next/dynamic.js"; +import { + SearchProvider as SearchProviderType, + SearchProviderConfig, +} from "../types"; + +const AlgoliaSearchProvider = dynamic( + async () => { + return await import("./Algolia").then((mod) => mod.AlgoliaSearchProvider); + }, + { ssr: false } +); + +const AlgoliaSearchContext = dynamic( + async () => { + return await import("./Algolia").then( + (mod) => mod.AlgoliaSearchContext.Consumer + ); + }, + { ssr: false } +); + +const KBarProvider = dynamic( + async () => { + return await import("./KBar").then((mod) => mod.KBarSearchProvider); + }, + { ssr: false } +); + +const KBarSearchContext = dynamic( + async () => { + return await import("kbar").then((mod) => mod.KBarContext.Consumer); + }, + { ssr: false } +); + +export const SearchProvider = ({ + searchConfig, + children, +}: { + searchConfig: SearchProviderConfig; + children: React.ReactNode; +}) => { + switch (searchConfig?.provider) { + case "algolia": + return ( + + {children} + + ); + case "kbar": + return ( + {children} + ); + default: + return <>{children}; + } +}; + +export const SearchContext = (provider: SearchProviderType) => { + switch (provider) { + case "algolia": + return AlgoliaSearchContext; + case "kbar": + return KBarSearchContext; + default: + return undefined; + } +}; diff --git a/packages/core/src/ui/Search/index.ts b/packages/core/src/ui/Search/index.ts new file mode 100644 index 000000000..7d27d4da1 --- /dev/null +++ b/packages/core/src/ui/Search/index.ts @@ -0,0 +1,3 @@ +// TODO tidy up this API +export { SearchField } from "./SearchField"; +export { SearchContext, SearchProvider } from "./SearchProvider"; diff --git a/packages/core/src/ui/Search/kbarActionsFromDocuments.ts b/packages/core/src/ui/Search/kbarActionsFromDocuments.ts new file mode 100644 index 000000000..01e4f7074 --- /dev/null +++ b/packages/core/src/ui/Search/kbarActionsFromDocuments.ts @@ -0,0 +1,26 @@ +// TODO don't import router here? +import router from "next/router.js"; +import { Action } from "kbar"; + +import { formatDate } from "../../utils/formatDate"; +import { nameFromUrl } from "../../utils/nameFromUrl"; + +// TODO temp type +type Document = any; + +export const kbarActionsFromDocuments = (docs: Document[]): Action[] => { + const actions: Action[] = []; + for (const doc of docs) { + // excluding home path as this is defined in starting actions + doc.url_path && + actions.push({ + id: doc.url_path, + name: doc.title ?? nameFromUrl(doc.url_path), + keywords: doc.description ?? "", + section: doc.sourceDir ?? "Page", + subtitle: doc.date && formatDate(doc.date, "en-US"), + perform: () => router.push(`/${doc.url_path}`), + }); + } + return actions; +}; diff --git a/packages/core/src/ui/SimpleLayout/Container.tsx b/packages/core/src/ui/SimpleLayout/Container.tsx new file mode 100644 index 000000000..3790a39ce --- /dev/null +++ b/packages/core/src/ui/SimpleLayout/Container.tsx @@ -0,0 +1,39 @@ +import { forwardRef } from "react"; +import clsx from "clsx"; + +const OuterContainer = forwardRef< + HTMLDivElement, + React.PropsWithChildren & { className?: string } +>(({ className, children, ...props }, ref) => { + return ( +
+
{children}
+
+ ); +}); + +const InnerContainer = forwardRef< + HTMLDivElement, + React.PropsWithChildren & { className?: string } +>(({ className, children, ...props }, ref) => { + return ( +
+
{children}
+
+ ); +}); + +export const Container = forwardRef< + HTMLDivElement, + React.PropsWithChildren & { className?: string } +>(({ children, ...props }, ref) => { + return ( + + {children} + + ); +}); diff --git a/packages/core/src/ui/SimpleLayout/SimpleLayout.tsx b/packages/core/src/ui/SimpleLayout/SimpleLayout.tsx new file mode 100644 index 000000000..9447726f3 --- /dev/null +++ b/packages/core/src/ui/SimpleLayout/SimpleLayout.tsx @@ -0,0 +1,20 @@ +/* eslint import/no-default-export: off */ +import { Container } from "./Container"; + +// TODO types +export const SimpleLayout: React.FC = ({ children, ...frontMatter }) => { + const { title, description } = frontMatter; + return ( + +
+

+ {title} +

+

+ {description} +

+
+
{children}
+
+ ); +}; diff --git a/packages/core/src/ui/SimpleLayout/index.ts b/packages/core/src/ui/SimpleLayout/index.ts new file mode 100644 index 000000000..087f30b79 --- /dev/null +++ b/packages/core/src/ui/SimpleLayout/index.ts @@ -0,0 +1 @@ +export { SimpleLayout } from "./SimpleLayout"; diff --git a/packages/core/src/ui/SiteToc/SiteToc.tsx b/packages/core/src/ui/SiteToc/SiteToc.tsx new file mode 100644 index 000000000..8d4ff9d79 --- /dev/null +++ b/packages/core/src/ui/SiteToc/SiteToc.tsx @@ -0,0 +1,108 @@ +import Link from "next/link.js"; +import clsx from "clsx"; +import { Disclosure, Transition } from "@headlessui/react"; + +export interface NavItem { + name: string; + href: string; +} + +export interface NavGroup { + name: string; + path: string; + level: number; + children: Array; +} + +interface Props { + currentPath: string; + nav: Array; +} + +function isNavGroup(item: NavItem | NavGroup): item is NavGroup { + return (item as NavGroup).children !== undefined; +} + +function navItemBeforeNavGroup(a, b) { + if (isNavGroup(a) === isNavGroup(b)) { + return 0; + } + if (isNavGroup(a) && !isNavGroup(b)) { + return 1; + } + return -1; +} + +function sortNavGroupChildren(items: Array) { + return items.sort( + (a, b) => navItemBeforeNavGroup(a, b) || a.name.localeCompare(b.name) + ); +} + +export const SiteToc: React.FC = ({ currentPath, nav }) => { + function isActiveItem(item: NavItem) { + return item.href === currentPath; + } + + return ( + + ); +}; + +const NavComponent: React.FC<{ + item: NavItem | NavGroup; + isActive: boolean; +}> = ({ item, isActive }) => { + return !isNavGroup(item) ? ( + + {item.name} + + ) : ( + + {({ open }) => ( +
+ + + {item.name} + + + + {sortNavGroupChildren(item.children).map((subItem) => ( + + ))} + + +
+ )} +
+ ); +}; diff --git a/packages/core/src/ui/SiteToc/index.ts b/packages/core/src/ui/SiteToc/index.ts new file mode 100644 index 000000000..2075f65e2 --- /dev/null +++ b/packages/core/src/ui/SiteToc/index.ts @@ -0,0 +1 @@ +export { SiteToc, NavItem, NavGroup } from "./SiteToc"; diff --git a/packages/core/src/ui/Tooltip/Tooltip.tsx b/packages/core/src/ui/Tooltip/Tooltip.tsx new file mode 100644 index 000000000..f5cb59f02 --- /dev/null +++ b/packages/core/src/ui/Tooltip/Tooltip.tsx @@ -0,0 +1,225 @@ +import React, { useState, useEffect, useRef, Fragment } from "react"; + +// importing separately due to build error +// Module '"@floating-ui/react-dom-interactions"' has no exported member 'autoPlacement' ... +import { + arrow, + autoPlacement, + inline, + offset, + shift, +} from "@floating-ui/react-dom"; + +import { + FloatingPortal, + useDismiss, + useFloating, + useHover, + useFocus, + useInteractions, + useRole, +} from "@floating-ui/react-dom-interactions"; + +import { motion, AnimatePresence } from "framer-motion"; + +interface Props extends React.PropsWithChildren { + render: (t) => React.ReactNode; + href: string; + data: any; + usehook?: any; + className?: string; +} + +const tooltipBoxStyle = (theme: string) => + ({ + height: "auto", + maxWidth: "40rem", + padding: "1rem", + background: theme === "light" ? "#fff" : "#000", + color: theme === "light" ? "rgb(99, 98, 98)" : "#A8A8A8", + borderRadius: "4px", + boxShadow: "rgba(0, 0, 0, 0.55) 0px 0px 16px -3px", + } as React.CSSProperties); + +const tooltipBodyStyle = (theme: string) => + ({ + maxHeight: "4.8rem", + position: "relative", + lineHeight: "1.2rem", + overflow: "hidden", + } as React.CSSProperties); + +const tooltipArrowStyle = ({ theme, x, y, side }) => + ({ + position: "absolute", + left: x != null ? `${x}px` : "", + top: y != null ? `${y}px` : "", + right: "", + bottom: "", + [side]: "-4px", + height: "8px", + width: "8px", + background: theme === "light" ? "#fff" : "#000", + transform: "rotate(45deg)", + } as React.CSSProperties); + +export const Tooltip: React.FC = ({ + render, + data, + usehook, + ...props +}) => { + const theme = "light"; // temporarily hard-coded; light theme tbd in next PR + + const arrowRef = useRef(null); + const [showTooltip, setShowTooltip] = useState(false); + const [tooltipData, setTooltipData] = useState({ + content: null || , + image: "", + }); + const [tooltipContentLoaded, setTooltipContentLoaded] = useState(false); + // floating-ui hook + const { + x, + y, + reference, // trigger element back ref + floating, // tooltip back ref + placement, // default: 'bottom' + strategy, // default: 'absolute' + context, + middlewareData: { arrow: { x: arrowX = 0, y: arrowY = 0 } = {} }, // data for arrow positioning + } = useFloating({ + open: showTooltip, // state value binding + onOpenChange: setShowTooltip, // state value setter + middleware: [ + offset(5), // offset from container border + autoPlacement({ padding: 5 }), // auto place vertically + shift({ padding: 5 }), // flip horizontally if necessary + arrow({ element: arrowRef, padding: 4 }), // add arrow element + inline(), // correct position for multiline anchor tags + ], + }); + // floating-ui hook + const { getReferenceProps, getFloatingProps } = useInteractions([ + useHover(context, { delay: 100 }), + useFocus(context), + useRole(context, { role: "tooltip" }), + useDismiss(context, { ancestorScroll: true }), + ]); + + const triggerElementProps = getReferenceProps({ ...props, ref: reference }); + const tooltipProps = getFloatingProps({ + ref: floating, + style: { + position: strategy, + left: x ?? "", + top: y ?? "", + }, + }); + + const arrowPlacement = { + top: "bottom", + right: "left", + bottom: "top", + left: "right", + }[placement.split("-")[0]]; + + // get tooltip data + let image: string; + let PageContent; + const filePath = props.href.slice(1); // remove slash from the beginning + + const page = data.find((p) => p._raw.flattenedPath === filePath); + + if (page && page.body.code.length > 0) { + const Component = usehook(page.body.code); + PageContent = Component; + image = page.image ?? ""; + } + + const fetchTooltipContent = () => { + setTooltipContentLoaded(false); + + let Body: React.ReactElement = ; + + // strip out all other elements from tooltip content + // since we only need the paragraph + const elems = ["h1", "h2", "h3", "div", "img", "pre", "blockquote"].reduce( + (acc, elem) => ({ ...acc, [elem]: () => }), + {} + ); + + if (PageContent) { + Body = ( + , // avoid hydration errors + wrapper: (props) =>
, + }} + /> + ); + + setTooltipData({ + content: Body, + image: image, + }); + + setTooltipContentLoaded(true); + } + }; + + useEffect(() => { + if (showTooltip) { + fetchTooltipContent(); + } + }, [showTooltip]); + + return ( + + {render?.(triggerElementProps)} + + + {showTooltip && tooltipContentLoaded && ( + +
+ {tooltipData.image && ( + + )} + {tooltipData.content && ( +
+ {tooltipData.content} +
+ )} +
+
+
+ )} +
+
+
+ ); +}; diff --git a/packages/core/src/ui/Tooltip/index.ts b/packages/core/src/ui/Tooltip/index.ts new file mode 100644 index 000000000..4b0a2f874 --- /dev/null +++ b/packages/core/src/ui/Tooltip/index.ts @@ -0,0 +1 @@ +export { Tooltip } from "./Tooltip"; diff --git a/packages/core/src/ui/UnstyledLayout/Unstyled.tsx b/packages/core/src/ui/UnstyledLayout/Unstyled.tsx new file mode 100644 index 000000000..e037ff1c1 --- /dev/null +++ b/packages/core/src/ui/UnstyledLayout/Unstyled.tsx @@ -0,0 +1,6 @@ +/* eslint import/no-default-export: off */ +export const UnstyledLayout: React.FC = ({ + children, +}) => { + return
{children}
; +}; diff --git a/packages/core/src/ui/UnstyledLayout/index.ts b/packages/core/src/ui/UnstyledLayout/index.ts new file mode 100644 index 000000000..54d7b803a --- /dev/null +++ b/packages/core/src/ui/UnstyledLayout/index.ts @@ -0,0 +1 @@ +export { UnstyledLayout } from "./Unstyled"; diff --git a/packages/core/src/ui/index.ts b/packages/core/src/ui/index.ts new file mode 100644 index 000000000..45a860cc9 --- /dev/null +++ b/packages/core/src/ui/index.ts @@ -0,0 +1,22 @@ +export { ThemeProvider } from "next-themes"; +export { Nav, NavConfig, ThemeConfig } from "./Nav"; +export { SearchProvider } from "./Search"; +export { + Layout, + TableOfContents, + TocSection, + EditThisPage, + useTableOfContents, +} from "./Layout"; +export { Pre } from "./Pre"; +export { CustomLink } from "./Base/CustomLink"; +export { BlogsList } from "./Blog"; +export { SimpleLayout } from "./SimpleLayout"; +export { DocsLayout } from "./DocsLayout"; +export { UnstyledLayout } from "./UnstyledLayout"; +export { BlogLayout } from "./BlogLayout"; +export { Mermaid } from "./Mermaid"; +export { SiteToc, NavItem, NavGroup } from "./SiteToc"; +export { Comments, CommentsConfig } from "./Comments"; + +export { AuthorConfig } from "./types"; diff --git a/packages/core/src/ui/types.ts b/packages/core/src/ui/types.ts new file mode 100644 index 000000000..dbbc5b609 --- /dev/null +++ b/packages/core/src/ui/types.ts @@ -0,0 +1,57 @@ +// shared types used in more than one component +// TODO find out what's the best place to put them, what's the best practice + +// layout +export interface NavLink { + name: string; + href: string; +} + +export interface AuthorConfig { + name: string; + url: string; + logo: string; +} + +// social +export type SocialPlatform = "github" | "discord"; + +export interface SocialLink { + label: SocialPlatform; + href: string; +} + +// search +export type SearchProvider = "algolia" | "kbar"; + +export interface SearchProviderConfig { + provider: SearchProvider; + config: object; +} + +// TEMP contentlayer +interface SharedFields { + title?: string; + description?: string; + image?: string; + layout: string; + showEditLink?: boolean; + showToc?: boolean; + showComments?: boolean; + isDraft?: boolean; + data: Array; +} + +interface ComputedFields { + urlPath: string; + editUrl?: string; + date?: string; +} + +export interface Page extends SharedFields, ComputedFields {} + +export interface Blog extends SharedFields, ComputedFields { + date: string; // TODO type? + authors?: Array; + tags?: Array; +} diff --git a/packages/core/src/utils/collectHeadings.ts b/packages/core/src/utils/collectHeadings.ts new file mode 100644 index 000000000..482de0716 --- /dev/null +++ b/packages/core/src/utils/collectHeadings.ts @@ -0,0 +1,60 @@ +// ToC: get the html nodelist for headings +import { TocSection } from "../ui/Layout"; + +export function collectHeadings(nodes: NodeListOf) { + const sections: Array = []; + + Array.from(nodes).forEach((node) => { + const { id, innerText: title, tagName: level } = node; + + if (!(id && title)) { + return; + } + + if (level === "H1") { + sections.push({ id, title, level, children: [] }); + } + + const parentSection = sections[sections.length - 1]; + + if (level === "H2") { + if (parentSection && level > parentSection.level) { + (parentSection as TocSection).children.push({ + id, + title, + level, + children: [], + }); + } else { + sections.push({ id, title, level, children: [] }); + } + } + + if (level === "H3") { + const subSection = + parentSection?.children[parentSection?.children?.length - 1]; + if (subSection && level > subSection.level) { + (subSection as TocSection).children.push({ + id, + title, + level, + children: [], + }); + } else if (parentSection && level > parentSection.level) { + (parentSection as TocSection).children.push({ + id, + title, + level, + children: [], + }); + } else { + sections.push({ id, title, level, children: [] }); + } + } + + // TODO types + sections.push(...collectHeadings((node.children as any) ?? [])); + }); + + return sections; +} diff --git a/packages/core/src/utils/formatDate.ts b/packages/core/src/utils/formatDate.ts new file mode 100644 index 000000000..2ca49c1f7 --- /dev/null +++ b/packages/core/src/utils/formatDate.ts @@ -0,0 +1,8 @@ +export const formatDate = (date: string, locales = "en-US") => { + const options: Intl.DateTimeFormatOptions = { + year: "numeric", + month: "long", + day: "numeric", + }; + return new Date(date).toLocaleDateString(locales, options); +}; diff --git a/packages/core/src/utils/gtag.ts b/packages/core/src/utils/gtag.ts new file mode 100644 index 000000000..59b2baf89 --- /dev/null +++ b/packages/core/src/utils/gtag.ts @@ -0,0 +1,25 @@ +// https://developers.google.com/analytics/devguides/collection/gtagjs/pages +export const pageview = ({ + url, + analyticsID, +}: { + url: string; + analyticsID: string; +}) => { + if (typeof window.gtag !== undefined) { + window.gtag("config", analyticsID, { + page_path: url, + }); + } +}; + +// https://developers.google.com/analytics/devguides/collection/gtagjs/events +export const event = ({ action, category, label, value }) => { + if (typeof window.gtag !== undefined) { + window.gtag("event", action, { + event_category: category, + event_label: label, + value, + }); + } +}; diff --git a/packages/core/src/utils/index.ts b/packages/core/src/utils/index.ts new file mode 100644 index 000000000..9d9efea6c --- /dev/null +++ b/packages/core/src/utils/index.ts @@ -0,0 +1,2 @@ +export { pageview } from "./gtag"; +export { collectHeadings } from "./collectHeadings"; diff --git a/packages/core/src/utils/nameFromUrl.ts b/packages/core/src/utils/nameFromUrl.ts new file mode 100644 index 000000000..e93151172 --- /dev/null +++ b/packages/core/src/utils/nameFromUrl.ts @@ -0,0 +1,4 @@ +export const nameFromUrl = (url: string) => { + const name = url.split("/").slice(-1)[0].replace("-", " "); + return name.charAt(0).toUpperCase() + name.slice(1); +}; diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json new file mode 100644 index 000000000..6a2b1418c --- /dev/null +++ b/packages/core/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "module": "es2020", + "moduleResolution": "node", + "allowJs": true, + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitAny": false, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/core/tsconfig.lib.json b/packages/core/tsconfig.lib.json new file mode 100644 index 000000000..f9ffa2124 --- /dev/null +++ b/packages/core/tsconfig.lib.json @@ -0,0 +1,23 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "types": ["node"] + }, + "files": [ + "../../node_modules/@nrwl/react/typings/cssmodule.d.ts", + "../../node_modules/@nrwl/react/typings/image.d.ts" + ], + "exclude": [ + "jest.config.ts", + "**/*.spec.ts", + "**/*.test.ts", + "**/*.spec.tsx", + "**/*.test.tsx", + "**/*.spec.js", + "**/*.test.js", + "**/*.spec.jsx", + "**/*.test.jsx" + ], + "include": ["**/*.js", "**/*.jsx", "**/*.ts", "**/*.tsx"] +} diff --git a/packages/core/tsconfig.spec.json b/packages/core/tsconfig.spec.json new file mode 100644 index 000000000..ff08addd6 --- /dev/null +++ b/packages/core/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "module": "commonjs", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/packages/remark-callouts/.babelrc b/packages/remark-callouts/.babelrc new file mode 100644 index 000000000..2fdda153e --- /dev/null +++ b/packages/remark-callouts/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": ["@babel/plugin-transform-runtime"] +} diff --git a/packages/remark-callouts/.eslintrc.json b/packages/remark-callouts/.eslintrc.json new file mode 100644 index 000000000..9d9c0db55 --- /dev/null +++ b/packages/remark-callouts/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/remark-callouts/.mocharc.yaml b/packages/remark-callouts/.mocharc.yaml new file mode 100644 index 000000000..dbc2c67b2 --- /dev/null +++ b/packages/remark-callouts/.mocharc.yaml @@ -0,0 +1,4 @@ +extension: [ts] +node-option: + - experimental-specifier-resolution=node + - loader=ts-node/esm diff --git a/packages/remark-callouts/README.md b/packages/remark-callouts/README.md new file mode 100644 index 000000000..bf4616b8b --- /dev/null +++ b/packages/remark-callouts/README.md @@ -0,0 +1,121 @@ +# @portaljs/remark-callouts + +Remark plugin to add support for blockquote-based callouts/admonitions similar to the approach of [Obsidian](https://help.obsidian.md/How+to/Use+callouts) and [Microsoft Learn](https://learn.microsoft.com/en-us/contribute/markdown-reference#alerts-note-tip-important-caution-warning) style. + +Using this plugin, markdown like this: + +```md +> [!tip] +> hello callout +``` + +Would render as a callout like this: + +Tip callout block + +## Features supported + +- [x] Supports blockquote style callouts +- [x] Supports nested blockquote callouts +- [x] Supports 13 types out of the box (with appropriate styling in default theme) - see list below +- [x] Supports aliases for types +- [x] Defaults to note callout for all other types eg. `> [!xyz]` +- [x] Supports dark and light mode styles + +Future support: + +- [ ] Support custom types and icons +- [ ] Support custom aliases +- [ ] Support Foldable callouts +- [ ] Support custom styles + +## Geting Started + +### Installation + +```bash +npm install remark-callouts +``` + +### Usage + +```js +import callouts from "remark-callouts"; + +await remark() + .use(remarkParse) + .use(callouts) + .use(remarkRehype) + .use(rehypeStringify).process(`\ +> [!tip] +> hello callout +`); +``` + +HTML output + +```js +
+
+
+ + ... + + Tip +
+
+

hello callout

+
+
+
+``` + +Import the styles in your .css file + +```css +@import "remark-callouts/styles.css"; +``` + +or in your app.js + +```js +import "remark-callouts/styles.css"; +``` + +### Supported Callout Types + +- note +- tip `aliases: hint, important` +- warning `alises: caution, attention` +- abstract `aliases: summary, tldr` +- info +- todo +- success `aliases: check, done` +- question `aliases: help, faq` +- failure `aliases: fail, missing` +- danger `alias: error` +- bug +- example +- quote `alias: cite` + +# Change Log + +## [2.0.0] - 2022-11-21 + +### Added + +- Classname for icon. + +### Changed + +- Extract css styles which can be imported separately. + +## [1.0.2] - 2022-11-03 + +### Fixed + +- Case insensitive match for types. + +## License + +MIT diff --git a/packages/remark-callouts/package.json b/packages/remark-callouts/package.json new file mode 100644 index 000000000..487cad690 --- /dev/null +++ b/packages/remark-callouts/package.json @@ -0,0 +1,41 @@ +{ + "name": "@portaljs/remark-callouts", + "version": "1.0.0", + "description": "Remark plugin to add support for blockquote-based admonitions/callouts", + "repository": { + "type": "git", + "url": "git+https://github.com/datopian/portaljs.git", + "directory": "packages/remark-callouts" + }, + "keywords": [ + "remark", + "remark-plugin", + "markdown", + "admonitions", + "callouts", + "obsidian" + ], + "author": "Rufus Pollock", + "license": "MIT", + "bugs": { + "url": "https://github.com/datopian/portaljs/issues" + }, + "homepage": "https://github.com/datopian/portaljs#readme", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "mdast-util-from-markdown": "^1.2.0", + "svg-parser": "^2.0.4", + "unist-util-visit": "^4.1.0" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "./styles.css": "./styles.css" + } +} diff --git a/packages/remark-callouts/project.json b/packages/remark-callouts/project.json new file mode 100644 index 000000000..095fcb107 --- /dev/null +++ b/packages/remark-callouts/project.json @@ -0,0 +1,48 @@ +{ + "name": "remark-callouts", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/remark-callouts/src", + "projectType": "library", + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/remark-callouts/**/*.ts"] + } + }, + "test": { + "executor": "nx:run-commands", + "options": { + "command": "TS_NODE_PROJECT='packages/remark-callouts/tsconfig.spec.json' mocha --config packages/remark-callouts/.mocharc.yaml packages/remark-callouts/test/**" + } + }, + "build": { + "executor": "@nrwl/rollup:rollup", + "outputs": ["{options.outputPath}"], + "options": { + "entryFile": "packages/remark-callouts/src/index.ts", + "outputPath": "packages/remark-callouts/dist", + "compiler": "babel", + "tsConfig": "packages/remark-callouts/tsconfig.lib.json", + "project": "packages/remark-callouts/package.json", + "format": ["esm", "cjs"], + "extractCss": true, + "generateExportsField": true, + "assets": [ + { + "glob": "packages/remark-callouts/README.md", + "input": ".", + "output": "." + }, + { + "glob": "packages/remark-callouts/styles.css", + "input": ".", + "output": "." + } + ] + } + } + }, + "tags": [] +} diff --git a/packages/remark-callouts/src/index.ts b/packages/remark-callouts/src/index.ts new file mode 100644 index 000000000..28c2aea52 --- /dev/null +++ b/packages/remark-callouts/src/index.ts @@ -0,0 +1,2 @@ +export * from "./lib/remark-callouts"; +export { default } from "./lib/remark-callouts"; diff --git a/packages/remark-callouts/src/lib/calloutTypes.ts b/packages/remark-callouts/src/lib/calloutTypes.ts new file mode 100644 index 000000000..a2dc81c45 --- /dev/null +++ b/packages/remark-callouts/src/lib/calloutTypes.ts @@ -0,0 +1,83 @@ +export const calloutTypes = { + // aliases + summary: "abstract", + tldr: "abstract", + hint: "tip", + important: "tip", + check: "success", + done: "success", + help: "question", + faq: "question", + caution: "warning", + attention: "warning", + fail: "failure", + missing: "failure", + error: "danger", + cite: "quote", + // base types + note: { + keyword: "note", + color: "#448aff", + svg: '', + }, + tip: { + keyword: "tip", + color: "#00bfa6", + svg: '', + }, + warning: { + keyword: "warning", + color: "#ff9100", + svg: '', + }, + abstract: { + keyword: "abstract", + color: "#00aeff", + svg: '', + }, + info: { + keyword: "info", + color: "#00b8d4", + svg: '', + }, + todo: { + keyword: "todo", + color: "#00b8d4", + svg: '', + }, + success: { + keyword: "success", + color: "#00c853", + svg: '', + }, + question: { + keyword: "question", + color: "#63dd17", + svg: '', + }, + failure: { + keyword: "failure", + color: "#ff5252", + svg: '', + }, + danger: { + keyword: "danger", + color: "#ff1745", + svg: '', + }, + bug: { + keyword: "bug", + color: "#f50057", + svg: '', + }, + example: { + keyword: "example", + color: "#7c4dff", + svg: '', + }, + quote: { + keyword: "quote", + color: "#9e9e9e", + svg: '', + }, +}; diff --git a/packages/remark-callouts/src/lib/remark-callouts.ts b/packages/remark-callouts/src/lib/remark-callouts.ts new file mode 100644 index 000000000..4924638f3 --- /dev/null +++ b/packages/remark-callouts/src/lib/remark-callouts.ts @@ -0,0 +1,285 @@ +import { visit } from "unist-util-visit"; +import { fromMarkdown } from "mdast-util-from-markdown"; +import type { Plugin } from "unified"; +import type { Node, Data, Parent } from "unist"; +import type { Blockquote, Heading, Text, BlockContent } from "mdast"; +import { parse } from "svg-parser"; +import { calloutTypes } from "./calloutTypes"; + +// escape regex special characters +function escapeRegExp(s: string) { + return s.replace(new RegExp(`[-[\\]{}()*+?.\\\\^$|/]`, "g"), "\\$&"); +} + +// match breaks +const find = /[\t ]*(?:\r?\n|\r)/g; + +export const callouts: Plugin = function (providedConfig?: Partial) { + const config: Config = { ...defaultConfig, ...providedConfig }; + const defaultKeywords: string = Object.keys(config.types) + .map(escapeRegExp) + .join("|"); + + return function (tree) { + visit(tree, (node: Node, index, parent: Parent) => { + // Filter required elems + if (node.type !== "blockquote") return; + + /** add breaks to text without needing spaces or escapes (turns enters into
) + * code taken directly from remark-breaks, + * see https://github.com/remarkjs/remark-breaks for more info on what this does. + */ + visit(node, "text", (node: Text, index: number, parent: Parent) => { + const result = []; + let start = 0; + + find.lastIndex = 0; + + let match = find.exec(node.value); + + while (match) { + const position = match.index; + + if (start !== position) { + result.push({ + type: "text", + value: node.value.slice(start, position), + }); + } + + result.push({ type: "break" }); + start = position + match[0].length; + match = find.exec(node.value); + } + + if (result.length > 0 && parent && typeof index === "number") { + if (start < node.value.length) { + result.push({ type: "text", value: node.value.slice(start) }); + } + + parent.children.splice(index, 1, ...result); + return index + result.length; + } + }); + + /** add classnames to headings within blockquotes, + * mainly to identify when using other plugins that + * might interfere. for eg, rehype-auto-link-headings. + */ + visit(node, "heading", (node) => { + const heading = node as Heading; + heading.data = { + hProperties: { + className: "blockquote-heading", + }, + }; + }); + + // wrap blockquote in a div + const wrapper = { + ...node, + type: "element", + tagName: "div", + data: { + hProperties: {}, + }, + children: [node], + }; + + parent.children.splice(Number(index), 1, wrapper); + + const blockquote = wrapper.children[0] as Blockquote; + + blockquote.data = { + hProperties: { + className: "blockquote", + }, + }; + + // check for callout syntax starts here + if ( + blockquote.children.length <= 0 || + blockquote.children[0].type !== "paragraph" + ) + return; + const paragraph = blockquote.children[0]; + + if ( + paragraph.children.length <= 0 || + paragraph.children[0].type !== "text" + ) + return; + + const [t, ...rest] = paragraph.children; + + const regex = new RegExp( + `^\\[!(?(.*?))\\][\t\f ]?(?.*?)$`, + "gi" + ); + const m = regex.exec(t.value); + + // if no callout syntax, forget about it. + if (!m) return; + + const [key, title] = [m.groups?.keyword, m.groups?.title]; + + // if there's nothing inside the brackets, is it really a callout ? + if (!key) return; + + const keyword = key.toLowerCase(); + const isOneOfKeywords: boolean = new RegExp(defaultKeywords).test( + keyword + ); + + if (title) { + const mdast = fromMarkdown(title.trim()).children[0]; + if (mdast.type === "heading") { + mdast.data = { + ...mdast.data, + hProperties: { + className: "blockquote-heading", + }, + }; + } + blockquote.children.unshift(mdast as BlockContent); + } else { + t.value = + typeof keyword.charAt(0) === "string" + ? keyword.charAt(0).toUpperCase() + keyword.slice(1) + : keyword; + } + + const entry: { [index: string]: string } = {}; + + if (isOneOfKeywords) { + if (typeof config?.types[keyword] === "string") { + const e = String(config?.types[keyword]); + Object.assign(entry, config?.types[e]); + } else { + Object.assign(entry, config?.types[keyword]); + } + } else { + Object.assign(entry, config?.types["note"]); + } + + let parsedSvg; + + if (entry && entry.svg) { + parsedSvg = parse(entry.svg); + } + + // create icon and title node wrapped in div + const titleNode: object = { + type: "element", + children: [ + { + type: "element", + tagName: "span", + data: { + hName: "span", + hProperties: { + style: `color:${entry?.color}`, + className: "callout-icon", + }, + hChildren: parsedSvg?.children ? parsedSvg.children : [], + }, + }, + { + type: "element", + children: title ? [blockquote.children[0]] : [t], + data: { + hName: "strong", + }, + }, + ], + data: { + ...blockquote.children[0]?.data, + hProperties: { + className: `${formatClassNameMap(config.classNameMaps.title)( + keyword + )} ${isOneOfKeywords ? keyword : "note"}`, + style: `background-color: ${entry?.color}1a;`, + }, + }, + }; + + // remove the callout paragraph from the content body + if (title) { + blockquote.children.shift(); + } + + if (rest.length > 0) { + rest.shift(); + paragraph.children = rest; + } else { + blockquote.children.shift(); + } + + // wrap blockquote content in div + const contentNode: object = { + type: "element", + children: blockquote.children, + data: { + hProperties: { + className: "callout-content", + style: + parent.type !== "root" + ? `border-right:1px solid ${entry?.color}33; + border-bottom:1px solid ${entry?.color}33;` + : "", + }, + }, + }; + + if (blockquote.children.length > 0) + blockquote.children = [contentNode] as BlockContent[]; + blockquote.children.unshift(titleNode as BlockContent); + + // Add classes for the callout block + blockquote.data = config.dataMaps.block({ + ...blockquote.data, + hProperties: { + className: formatClassNameMap(config.classNameMaps.block)( + keyword.toLowerCase() + ), + style: `border-left-color:${entry?.color};`, + }, + }); + }); + }; +}; + +export interface Config { + classNameMaps: { + block: ClassNameMap; + title: ClassNameMap; + }; + dataMaps: { + block: (data: Data) => Data; + title: (data: Data) => Data; + }; + types: { [index: string]: string | object }; +} + +export const defaultConfig: Config = { + classNameMaps: { + block: "callout", + title: "callout-title", + }, + dataMaps: { + block: (data) => data, + title: (data) => data, + }, + types: { ...calloutTypes }, +}; + +type ClassNames = string | string[]; +type ClassNameMap = ClassNames | ((title: string) => ClassNames); +function formatClassNameMap(gen: ClassNameMap) { + return (title: string) => { + const classNames = typeof gen == "function" ? gen(title) : gen; + return typeof classNames == "object" ? classNames.join(" ") : classNames; + }; +} + +export default callouts; diff --git a/packages/remark-callouts/styles.css b/packages/remark-callouts/styles.css new file mode 100644 index 000000000..d96092264 --- /dev/null +++ b/packages/remark-callouts/styles.css @@ -0,0 +1,64 @@ +:root { + --callout-bg-color: #f2f3f5; +} + +:root.dark { + --callout-bg-color: #161616; +} + +.blockquote, +.callout { + background: #f2f3f5; + background: var(--callout-bg-color); + font-style: normal; + border-radius: 2px; +} + +.callout { + padding: 0 !important; +} + +.callout-title { + display: flex; + align-items: center; + padding: 10px; + gap: 10px; +} + +.callout-title > strong { + font-weight: 700; +} + +.blockquote, +.callout-content { + padding: 10px 20px; +} + +.blockquote-heading { + margin: 5px 0 !important; + padding: 0 !important; +} + +.blockquote > p, +.callout-content > p { + font-weight: normal; + margin: 5px 0; +} + +.callout-title p { + margin: 0; +} + +.callout-title > strong { + line-height: 1.5; +} + +.callout p:before, +p:after { + display: none; +} + +.blockquote > p:before, +p:after { + display: none; +} diff --git a/packages/remark-callouts/test/remark-callouts.spec.ts b/packages/remark-callouts/test/remark-callouts.spec.ts new file mode 100644 index 000000000..518c5b850 --- /dev/null +++ b/packages/remark-callouts/test/remark-callouts.spec.ts @@ -0,0 +1,143 @@ +import { expect } from "chai"; +import { parseDocument } from "htmlparser2"; +import { selectOne } from "css-select"; +import { remark } from "remark"; +import remarkParse from "remark-parse"; +import remarkRehype from "remark-rehype"; +import rehypeStringify from "rehype-stringify"; +import { callouts, Config } from "../src"; + +async function mdToHtml(md: string, options?: Partial<Config>) { + return String( + await remark() + .use(remarkParse) + .use(callouts, options) + .use(remarkRehype) + .use(rehypeStringify) + .process(md) + ); +} + +describe("remark callouts", function () { + it("parses a blockquote without a callout", async function () { + const html = await mdToHtml(`\ +> no callout +`); + const doc = parseDocument(html); + const blockquote = selectOne("div > blockquote.blockquote > p", doc); + expect(blockquote).to.have.nested.property("firstChild.data", "no callout"); + }); + + it("parses a blockquote callout with title and content", async function () { + const html = await mdToHtml(`\ +> [!tip] +> example content here + `); + const doc = parseDocument(html); + const calloutTitle = selectOne( + "div > blockquote.callout > div.callout-title.tip > strong", + doc + ); + const calloutContent = selectOne( + "div > blockquote.callout > div.callout-content > p", + doc + ); + + expect(calloutTitle).to.have.nested.property("firstChild.data", "Tip"); + expect(calloutContent).to.have.nested.property( + "firstChild.data", + "example content here" + ); + }); + + it("parses a blockquote callout with case insensitive keyword", async function () { + const html = await mdToHtml(`\ +> [!INFO] + `); + const doc = parseDocument(html); + const calloutTitle = selectOne( + "div > blockquote.callout > div.callout-title.info > strong", + doc + ); + + expect(calloutTitle).to.have.nested.property("firstChild.data", "Info"); + }); + + it("parses a blockquote callout with an icon", async function () { + const html = await mdToHtml(`\ +> [!tip] +> example content here + `); + const doc = parseDocument(html); + const calloutIcon = selectOne( + "div > blockquote.callout > div.callout-title.tip > span.callout-icon > svg", + doc + ); + + expect(calloutIcon).to.exist; + }); + + it("parses a blockquote callout with a custom title", async function () { + const html = await mdToHtml(`\ +> [!tip] Custom Title +> content + `); + const doc = parseDocument(html); + const calloutTitle = selectOne( + "div > blockquote.callout > div.callout-title.tip > strong > p", + doc + ); + + expect(calloutTitle).to.have.nested.property( + "firstChild.data", + "Custom Title" + ); + }); + + it("parses a blockquote callout with unknown type to use note", async function () { + const html = await mdToHtml(`\ +> [!xyz] +> content + `); + const doc = parseDocument(html); + const calloutTitle = selectOne( + "div > blockquote.callout > div.callout-title.note > strong", + doc + ); + + expect(calloutTitle).to.have.nested.property("firstChild.data", "Xyz"); + }); + + it("parses a blockquote callout with unknown type and custom title", async function () { + const html = await mdToHtml(`\ +> [!xyz] Some title +> content + `); + const doc = parseDocument(html); + const calloutTitle = selectOne( + "div > blockquote.callout > div.callout-title.note > strong > p", + doc + ); + + expect(calloutTitle).to.have.nested.property( + "firstChild.data", + "Some title" + ); + }); + + it("parses a nested blockquote with callout", async function () { + const html = await mdToHtml(`\ +> [!note] +> content +> > [!info] +> > nested callout + `); + const doc = parseDocument(html); + const nestedCallout = selectOne( + "div > blockquote.callout > div.callout-content > div > blockquote.callout > div.callout-title > strong", + doc + ); + + expect(nestedCallout).to.have.nested.property("firstChild.data", "Info"); + }); +}); diff --git a/packages/remark-callouts/tsconfig.json b/packages/remark-callouts/tsconfig.json new file mode 100644 index 000000000..62ebbd946 --- /dev/null +++ b/packages/remark-callouts/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/remark-callouts/tsconfig.lib.json b/packages/remark-callouts/tsconfig.lib.json new file mode 100644 index 000000000..18857e49b --- /dev/null +++ b/packages/remark-callouts/tsconfig.lib.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "target": "es2020", + "module": "es2020", + "types": ["node"], + "moduleResolution": "node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true + }, + "exclude": ["**/*.spec.ts", "**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/packages/remark-callouts/tsconfig.spec.json b/packages/remark-callouts/tsconfig.spec.json new file mode 100644 index 000000000..094684db9 --- /dev/null +++ b/packages/remark-callouts/tsconfig.spec.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "module": "es2020", + "moduleResolution": "node", + "types": ["mocha", "node"] + }, + "include": [ + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/packages/remark-embed/.babelrc b/packages/remark-embed/.babelrc new file mode 100644 index 000000000..2fdda153e --- /dev/null +++ b/packages/remark-embed/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": ["@babel/plugin-transform-runtime"] +} diff --git a/packages/remark-embed/.eslintrc.json b/packages/remark-embed/.eslintrc.json new file mode 100644 index 000000000..9d9c0db55 --- /dev/null +++ b/packages/remark-embed/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/remark-embed/README.md b/packages/remark-embed/README.md new file mode 100644 index 000000000..fdf6ab1b5 --- /dev/null +++ b/packages/remark-embed/README.md @@ -0,0 +1,3 @@ +# @portaljs/remark-embed + +Converts Youtube link surrounded by newlines in markdown to embedded iframe diff --git a/packages/remark-embed/jest.config.ts b/packages/remark-embed/jest.config.ts new file mode 100644 index 000000000..b29ce6e59 --- /dev/null +++ b/packages/remark-embed/jest.config.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +export default { + displayName: "remark-embed", + preset: "../../jest.preset.js", + globals: { + "ts-jest": { + tsconfig: "<rootDir>/tsconfig.spec.json", + }, + }, + testEnvironment: "node", + transform: { + "^.+\\.[tj]sx?$": "ts-jest", + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx"] +}; diff --git a/packages/remark-embed/package.json b/packages/remark-embed/package.json new file mode 100644 index 000000000..4818de534 --- /dev/null +++ b/packages/remark-embed/package.json @@ -0,0 +1,36 @@ +{ + "name": "@portaljs/remark-embed", + "version": "1.0.0", + "description": "Converts youtube link in mdx to an iframe embed", + "repository": { + "type": "git", + "url": "git+https://github.com/datopian/portaljs.git", + "directory": "packages/remark-embed" + }, + "keywords": [ + "remark", + "remark-plugin", + "markdown", + "obsidian" + ], + "author": "Rufus Pollock", + "license": "MIT", + "bugs": { + "url": "https://github.com/datopian/portaljs/issues" + }, + "homepage": "https://github.com/datopian/portaljs#readme", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "unist-util-visit": "^4.1.1" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + } +} diff --git a/packages/remark-embed/project.json b/packages/remark-embed/project.json new file mode 100644 index 000000000..324d10c49 --- /dev/null +++ b/packages/remark-embed/project.json @@ -0,0 +1,45 @@ +{ + "name": "remark-embed", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/remark-embed/src", + "projectType": "library", + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/remark-embed/**/*.ts"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/remark-embed/jest.config.ts", + "passWithNoTests": true + } + }, + "build": { + "executor": "@nrwl/rollup:rollup", + "outputs": ["{options.outputPath}"], + "options": { + "entryFile": "packages/remark-embed/src/index.ts", + "outputPath": "packages/remark-embed/dist", + "compiler": "babel", + "tsConfig": "packages/remark-embed/tsconfig.lib.json", + "project": "packages/remark-embed/package.json", + "format": ["esm", "cjs"], + "external": ["unist-util-visit"], + "generateExportsField": true, + "assets": [ + { + "glob": "packages/remark-embed/README.md", + "input": ".", + "output": "." + } + ] + } + } + }, + "tags": [] +} diff --git a/packages/remark-embed/src/index.ts b/packages/remark-embed/src/index.ts new file mode 100644 index 000000000..f33f7677b --- /dev/null +++ b/packages/remark-embed/src/index.ts @@ -0,0 +1 @@ +export { default } from "./lib/remark-embed"; diff --git a/packages/remark-embed/src/lib/remark-embed.ts b/packages/remark-embed/src/lib/remark-embed.ts new file mode 100644 index 000000000..141602906 --- /dev/null +++ b/packages/remark-embed/src/lib/remark-embed.ts @@ -0,0 +1,49 @@ +import { visit } from "unist-util-visit"; + +function transformer(tree) { + visit(tree, "paragraph", (node) => { + visit(node, "text", (textNode) => { + if ( + textNode.value.includes("https://www.youtube.com") && + !textNode.value.includes("\n") + ) { + const urlSplit = textNode.value.split(/[=&]+/); + const iframeUrl = `https://www.youtube.com/embed/${urlSplit[1]}`; + Object.assign(node, { + ...node, + type: "element", + data: { + hProperties: { + style: "position:relative;padding-bottom:56.25%", + }, + }, + children: [ + { + ...textNode, + type: "element", + tagName: "iframe", + data: { + hName: "iframe", + hProperties: { + style: + "position:absolute;top:0;left:0;width:100%;height:100%", + src: iframeUrl, + allowfullscreen: true, + frameborder: "0", + allow: + "accelerometer autoplay clipboard-write encrypted-media gyroscope picture-in-picture", + }, + }, + }, + ], + }); + } + }); + }); +} + +function attacher() { + return transformer; +} + +export default attacher; diff --git a/packages/remark-embed/tsconfig.json b/packages/remark-embed/tsconfig.json new file mode 100644 index 000000000..62ebbd946 --- /dev/null +++ b/packages/remark-embed/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../tsconfig.base.json", + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/remark-embed/tsconfig.lib.json b/packages/remark-embed/tsconfig.lib.json new file mode 100644 index 000000000..02e91c69a --- /dev/null +++ b/packages/remark-embed/tsconfig.lib.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "target": "es2020", + "module": "es2020", + "types": ["node"], + "moduleResolution": "node", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true + }, + "exclude": ["**/*.spec.ts", "**/*.test.ts"], + "include": ["src/**/*.ts"] +} diff --git a/packages/remark-embed/tsconfig.spec.json b/packages/remark-embed/tsconfig.spec.json new file mode 100644 index 000000000..bbb3e0f90 --- /dev/null +++ b/packages/remark-embed/tsconfig.spec.json @@ -0,0 +1,21 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "dist", + "module": "es2020", + "moduleResolution": "node", + "types": ["jest", "node"] + }, + "include": [ + "jest.config.ts", + "**/*.test.ts", + "**/*.spec.ts", + "**/*.test.tsx", + "**/*.spec.tsx", + "**/*.test.js", + "**/*.spec.js", + "**/*.test.jsx", + "**/*.spec.jsx", + "**/*.d.ts" + ] +} diff --git a/packages/remark-wiki-link/.babelrc b/packages/remark-wiki-link/.babelrc new file mode 100644 index 000000000..2fdda153e --- /dev/null +++ b/packages/remark-wiki-link/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env"], + "plugins": ["@babel/plugin-transform-runtime"] +} diff --git a/packages/remark-wiki-link/.eslintrc.json b/packages/remark-wiki-link/.eslintrc.json new file mode 100644 index 000000000..3828ceb96 --- /dev/null +++ b/packages/remark-wiki-link/.eslintrc.json @@ -0,0 +1,7 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*", "dist/**/*"], + "env": { + "jest": true + } +} diff --git a/packages/remark-wiki-link/.npmignore b/packages/remark-wiki-link/.npmignore new file mode 100644 index 000000000..281df3934 --- /dev/null +++ b/packages/remark-wiki-link/.npmignore @@ -0,0 +1,2 @@ +src +test diff --git a/packages/remark-wiki-link/README.md b/packages/remark-wiki-link/README.md new file mode 100644 index 000000000..2f9ec4f92 --- /dev/null +++ b/packages/remark-wiki-link/README.md @@ -0,0 +1,132 @@ +# remark-wiki-link + +Parse and render wiki-style links in markdown especially Obsidian style links. + +## What is this ? + +Using obsidian, when we type in wiki link syntax for eg. `[[wiki_link]]` it would parse them as anchors. + +## Features supported + +- [x] Support `[[Internal link]]` +- [x] Support `[[Internal link|With custom text]]` +- [x] Support `[[Internal link#heading]]` +- [x] Support `[[Internal link#heading|With custom text]]` +- [x] Support `![[Document.pdf]]` +- [x] Support `![[Image.png]]` + +* Supported image formats are jpg, jpeg, png, apng, webp, gif, svg, bmp, ico +* Unsupported image formats will display a raw wiki link string, e.g. `[[Image.xyz]]`. + +Future support: + +- [ ] Support `![[Audio.mp3]]` +- [ ] Support `![[Video.mp4]]` +- [ ] Support `![[Embed note]]` +- [ ] Support `![[Embed note#heading]]` + +## Installation + +```bash +npm install @portaljs/remark-wiki-link +``` + +## Usage + +```javascript +import unified from "unified"; +import markdown from "remark-parse"; +import wikiLinkPlugin from "@portaljs/remark-wiki-link"; + +const processor = unified().use(markdown).use(wikiLinkPlugin); +``` + +## Configuration options + +### `pathFormat` + +Type: `"raw" | "obisidan-absolute" | "obsidian-short"` +Default: `"raw"` + +- `"raw"`: use this option for regular relative or absolute paths (or Obsidian relative paths), e.g. `[[../some/folder/file]]` or `[[[/some/folder/file]]]`, +- `"obsidian-absolute"`: use this option for Obsidian absolute paths, i.e. paths with no leading `/`, e.g. `[[some/folder/file]]` +- `"obsidian-short"`: use this option for Obsidian shortened paths, e.g. `[[file]]` to resolve them to absolute paths. Note that apart from setting this value, you will also need to pass a list of paths to files in your content folder, and pass it as `permalinks` option. You can generate this list yourself or use our util function `getPermalinks`. See below for more info. + +> [!note] +> Wiki link format in Obsidian can be configured in Settings -> Files & Links -> New link format. + +### `aliasDivider` + +Type: single character string +Default: `"|"` + +Alias divider character used in your wiki links. E.g. `[[/some/folder/file|Alias]]` + +### `permalinks` + +Type: `Array<string>` +Default: `[]` + +A list of permalinks you want to match your wiki link paths with. Wiki links with matched permalinks will have `node.data.exists` property set to `true`. Wiki links with no matching permalinks will also have additional class `new` set. + +### `wikiLinkResolver` + +Type: `(name: string) => Array<string>` +Default: `(name: string) => name.replace(/\/index$/, "")` (simplified; see source code for full version) + +A function that will take the wiki link target page (e.g. `"/some/folder/file"` in `[[/some/folder/file#Some Heading|Some Alias]]` wiki link) and return an array of pages to which the wiki link **can** be resolved (one of them will be used, depending on wheather `pemalinks` are passed, and if match is found). + +If `permalinks` are passed, the resulting array will be matched against these permalinks to find the match. The matching pemalink will be used as node's `href` (or `src` for images). + +If no matching permalink is found, the first item from the array returned by this function will be used as a node's `href` (or `src` for images). So, if you want to write a custom wiki link -> url + +### `newClassName` + +Type: `string` +Default: `"new"` + +Class name added to nodes created for wiki links for which no matching permalink (passed in `permalinks` option) was found. + +### `wikiLinkClassName` + +Type: `string` +Default: `"internal"` + +Class name added to all wiki link nodes. + +### `hrefTemplate` + +Type: `(permalink: string) => string` +Default: `(permalink: string) => permalink` + +A function that will be used to convert a matched permalink of the wiki link to `href` (or `src` for images). + +### `markdownFolder` ❌ (deprecated as of version 1.1.0) + +A string that points to the content folder, that will be used to resolve Obsidian shortened wiki link path format. + +Instead of using this option, use e.g. `getPermalinks` util function exported from this package to generate a list of permalinks from your content folder, and pass it explicitly as `permalinks` option. + +## Generating list of permalinks from content folder with `getPermalinks` + +If you're using shortened path format for your Obsidian wiki links, in order to resolve them correctly to paths they point to, you need to set `option.pathFormat: "obsidian-short"` but also provide the plugin with a list of permalinks that point to files in your content folder as `option.permalinks`. You can use your own script to generate this list or use our util function `getPermalinks` like so: + +```javascript {4,6,11-12} +import unified from "unified"; +import markdown from "remark-parse"; +import wikiLinkPlugin from "@portaljs/remark-wiki-link"; +import { getPermalinks } from "@portaljs/remark-wiki-link"; + +const permalinks = await getPermalinks("path-to-your-content-folder"); + +const processor = unified().use(markdown).use(wikiLinkPlugin, { + pathFormat: "obsidian-short", + permalinks, +}); +``` + +## Running tests + +```bash +pnpm nx test remark-wiki-link +``` diff --git a/packages/remark-wiki-link/jest.config.ts b/packages/remark-wiki-link/jest.config.ts new file mode 100644 index 000000000..395a20e73 --- /dev/null +++ b/packages/remark-wiki-link/jest.config.ts @@ -0,0 +1,14 @@ +import type { JestConfigWithTsJest } from "ts-jest"; + +const jestConfig: JestConfigWithTsJest = { + displayName: "remark-wiki-link", + preset: "ts-jest", + testEnvironment: "node", + transform: { + "^.+\\.[tj]s?$": "ts-jest", + }, + moduleFileExtensions: ["ts", "js"], + transformIgnorePatterns: ["<rootDir>/node_modules/(?!remark-parse)"], +}; + +export default jestConfig; diff --git a/packages/remark-wiki-link/package.json b/packages/remark-wiki-link/package.json new file mode 100644 index 000000000..ce58f675d --- /dev/null +++ b/packages/remark-wiki-link/package.json @@ -0,0 +1,43 @@ +{ + "name": "@portaljs/remark-wiki-link", + "version": "1.0.0", + "description": "Parse and render wiki-style links in markdown especially Obsidian style links.", + "repository": { + "type": "git", + "url": "git+https://github.com/datopian/portaljs.git", + "directory": "packages/remark-wiki-link" + }, + "keywords": [ + "remark", + "remark-plugin", + "markdown", + "gfm", + "obsidian" + ], + "author": "Rufus Pollock", + "license": "MIT", + "bugs": { + "url": "https://github.com/datopian/portaljs/issues" + }, + "homepage": "https://github.com/datopian/portaljs#readme", + "publishConfig": { + "access": "public" + }, + "dependencies": { + "mdast-util-to-markdown": "^1.5.0", + "mdast-util-wiki-link": "^0.0.2", + "micromark-util-symbol": "^1.0.1" + }, + "type": "module", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "devDependencies": { + "micromark": "^3.1.0", + "remark-gfm": "^3.0.1" + } +} diff --git a/packages/remark-wiki-link/project.json b/packages/remark-wiki-link/project.json new file mode 100644 index 000000000..d1270be0c --- /dev/null +++ b/packages/remark-wiki-link/project.json @@ -0,0 +1,45 @@ +{ + "name": "remark-wiki-link", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/remark-wiki-link/src", + "projectType": "library", + "targets": { + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/remark-wiki-link/**/*.{ts,js}"] + } + }, + "test": { + "executor": "@nrwl/jest:jest", + "outputs": ["{workspaceRoot}/coverage/{projectRoot}"], + "options": { + "jestConfig": "packages/remark-wiki-link/jest.config.ts", + "passWithNoTests": true + } + }, + "build": { + "executor": "@nrwl/rollup:rollup", + "outputs": ["{options.outputPath}"], + "options": { + "entryFile": "packages/remark-wiki-link/src/index.ts", + "outputPath": "packages/remark-wiki-link/dist", + "compiler": "babel", + "tsConfig": "packages/remark-wiki-link/tsconfig.lib.json", + "project": "packages/remark-wiki-link/package.json", + "format": ["esm", "cjs"], + "external": ["mdast-util-wiki-link"], + "generateExportsField": true, + "assets": [ + { + "glob": "packages/remark-wiki-link/README.md", + "input": ".", + "output": "." + } + ] + } + } + }, + "tags": [] +} diff --git a/packages/remark-wiki-link/src/index.ts b/packages/remark-wiki-link/src/index.ts new file mode 100644 index 000000000..8e6caaa7c --- /dev/null +++ b/packages/remark-wiki-link/src/index.ts @@ -0,0 +1,3 @@ +export * from "./lib/remarkWikiLink"; +export { default } from "./lib/remarkWikiLink"; +export { getPermalinks } from "./utils"; diff --git a/packages/remark-wiki-link/src/lib/fromMarkdown.ts b/packages/remark-wiki-link/src/lib/fromMarkdown.ts new file mode 100644 index 000000000..469cd2e0d --- /dev/null +++ b/packages/remark-wiki-link/src/lib/fromMarkdown.ts @@ -0,0 +1,172 @@ +import { isSupportedFileFormat } from "./isSupportedFileFormat"; + +const defaultWikiLinkResolver = (target: string) => { + // for [[#heading]] links + if (!target) { + return []; + } + let permalink = target.replace(/\/index$/, ""); + // TODO what to do with [[index]] link? + if (permalink.length === 0) { + permalink = "/"; + } + return [permalink]; +}; + +export interface FromMarkdownOptions { + pathFormat?: + | "raw" // default; use for regular relative or absolute paths + | "obsidian-absolute" // use for Obsidian-style absolute paths (with no leading slash) + | "obsidian-short"; // use for Obsidian-style shortened paths (shortest path possible) + permalinks?: string[]; // list of permalinks to match possible permalinks of a wiki link against + wikiLinkResolver?: (name: string) => string[]; // function to resolve wiki links to an array of possible permalinks + newClassName?: string; // class name to add to links that don't have a matching permalink + wikiLinkClassName?: string; // class name to add to all wiki links + hrefTemplate?: (permalink: string) => string; // function to generate the href attribute of a link +} + +// mdas-util-from-markdown extension +// https://github.com/syntax-tree/mdast-util-from-markdown#extension +function fromMarkdown(opts: FromMarkdownOptions = {}) { + const pathFormat = opts.pathFormat || "raw"; + const permalinks = opts.permalinks || []; + const wikiLinkResolver = opts.wikiLinkResolver || defaultWikiLinkResolver; + const newClassName = opts.newClassName || "new"; + const wikiLinkClassName = opts.wikiLinkClassName || "internal"; + const defaultHrefTemplate = (permalink: string) => permalink; + + const hrefTemplate = opts.hrefTemplate || defaultHrefTemplate; + + function top(stack) { + return stack[stack.length - 1]; + } + + function enterWikiLink(token) { + this.enter( + { + type: "wikiLink", + data: { + isEmbed: token.isType === "embed", + target: null, // the target of the link, e.g. "Foo Bar#Heading" in "[[Foo Bar#Heading]]" + alias: null, // the alias of the link, e.g. "Foo" in "[[Foo Bar|Foo]]" + permalink: null, // TODO shouldn't this be named just "link"? + exists: null, // TODO is this even needed here? + // fields for mdast-util-to-hast (used e.g. by remark-rehype) + hName: null, + hProperties: null, + hChildren: null, + }, + }, + token + ); + } + + function exitWikiLinkTarget(token) { + const target = this.sliceSerialize(token); + const current = top(this.stack); + current.data.target = target; + } + + function exitWikiLinkAlias(token) { + const alias = this.sliceSerialize(token); + const current = top(this.stack); + current.data.alias = alias; + } + + function exitWikiLink(token) { + const wikiLink = this.exit(token); + const { + data: { isEmbed, target, alias }, + } = wikiLink; + // eslint-disable-next-line no-useless-escape + const wikiLinkWithHeadingPattern = /([\w\s\/\.-]*)(#.*)?/; + const [, path, heading = ""] = target.match(wikiLinkWithHeadingPattern); + + const possibleWikiLinkPermalinks = wikiLinkResolver(path); + + const matchingPermalink = permalinks.find((e) => { + return possibleWikiLinkPermalinks.find((p) => { + if (pathFormat === "obsidian-short") { + if (e === p || e.endsWith(p)) { + return true; + } + } else if (pathFormat === "obsidian-absolute") { + if (e === "/" + p) { + return true; + } + } else { + if (e === p) { + return true; + } + } + return false; + }); + }); + + // TODO this is ugly + const link = + matchingPermalink || + (pathFormat === "obsidian-absolute" + ? "/" + possibleWikiLinkPermalinks[0] + : possibleWikiLinkPermalinks[0]) || + ""; + + wikiLink.data.exists = !!matchingPermalink; + wikiLink.data.permalink = link; + + // remove leading # if the target is a heading on the same page + const displayName = alias || target.replace(/^#/, ""); + const headingId = heading.replace(/\s+/, "-").toLowerCase(); + let classNames = wikiLinkClassName; + if (!matchingPermalink) { + classNames += " " + newClassName; + } + + if (isEmbed) { + const [isSupportedFormat, format] = isSupportedFileFormat(target); + if (!isSupportedFormat) { + wikiLink.data.hName = "p"; + wikiLink.data.hChildren = [ + { + type: "text", + value: `![[${target}]]`, + }, + ]; + } else if (format === "pdf") { + wikiLink.data.hName = "iframe"; + wikiLink.data.hProperties = { + className: classNames, + width: "100%", + src: `${hrefTemplate(link)}#toolbar=0`, + }; + } else { + wikiLink.data.hName = "img"; + wikiLink.data.hProperties = { + className: classNames, + src: hrefTemplate(link), + alt: displayName, + }; + } + } else { + wikiLink.data.hName = "a"; + wikiLink.data.hProperties = { + className: classNames, + href: hrefTemplate(link) + headingId, + }; + wikiLink.data.hChildren = [{ type: "text", value: displayName }]; + } + } + + return { + enter: { + wikiLink: enterWikiLink, + }, + exit: { + wikiLinkTarget: exitWikiLinkTarget, + wikiLinkAlias: exitWikiLinkAlias, + wikiLink: exitWikiLink, + }, + }; +} + +export { fromMarkdown }; diff --git a/packages/remark-wiki-link/src/lib/html.ts b/packages/remark-wiki-link/src/lib/html.ts new file mode 100644 index 000000000..8f23278d5 --- /dev/null +++ b/packages/remark-wiki-link/src/lib/html.ts @@ -0,0 +1,146 @@ +import { isSupportedFileFormat } from "./isSupportedFileFormat"; + +const defaultWikiLinkResolver = (target: string) => { + // for [[#heading]] links + if (!target) { + return []; + } + let permalink = target.replace(/\/index$/, ""); + // TODO what to do with [[index]] link? + if (permalink.length === 0) { + permalink = "/"; + } + return [permalink]; +}; + +export interface HtmlOptions { + pathFormat?: + | "raw" // default; use for regular relative or absolute paths + | "obsidian-absolute" // use for Obsidian-style absolute paths (with no leading slash) + | "obsidian-short"; // use for Obsidian-style shortened paths (shortest path possible) + permalinks?: string[]; // list of permalinks to match possible permalinks of a wiki link against + wikiLinkResolver?: (name: string) => string[]; // function to resolve wiki links to an array of possible permalinks + newClassName?: string; // class name to add to links that don't have a matching permalink + wikiLinkClassName?: string; // class name to add to all wiki links + hrefTemplate?: (permalink: string) => string; // function to generate the href attribute of a link +} + +// Micromark HtmlExtension +// https://github.com/micromark/micromark#htmlextension +function html(opts: HtmlOptions = {}) { + const pathFormat = opts.pathFormat || "raw"; + const permalinks = opts.permalinks || []; + const wikiLinkResolver = opts.wikiLinkResolver || defaultWikiLinkResolver; + const newClassName = opts.newClassName || "new"; + const wikiLinkClassName = opts.wikiLinkClassName || "internal"; + const defaultHrefTemplate = (permalink: string) => permalink; + const hrefTemplate = opts.hrefTemplate || defaultHrefTemplate; + + function top(stack) { + return stack[stack.length - 1]; + } + + function enterWikiLink() { + let stack = this.getData("wikiLinkStack"); + if (!stack) this.setData("wikiLinkStack", (stack = [])); + + stack.push({}); + } + + function exitWikiLinkTarget(token) { + const target = this.sliceSerialize(token); + const current = top(this.getData("wikiLinkStack")); + current.target = target; + } + + function exitWikiLinkAlias(token) { + const alias = this.sliceSerialize(token); + const current = top(this.getData("wikiLinkStack")); + current.alias = alias; + } + + function exitWikiLink(token) { + const wikiLink = this.getData("wikiLinkStack").pop(); + const { target, alias } = wikiLink; + const isEmbed = token.isType === "embed"; + // eslint-disable-next-line no-useless-escape + const wikiLinkWithHeadingPattern = /([\w\s\/\.-]*)(#.*)?/; + const [, path, heading = ""] = target.match(wikiLinkWithHeadingPattern); + + const possibleWikiLinkPermalinks = wikiLinkResolver(path); + + const matchingPermalink = permalinks.find((e) => { + return possibleWikiLinkPermalinks.find((p) => { + if (pathFormat === "obsidian-short") { + if (e === p || e.endsWith(p)) { + return true; + } + } else if (pathFormat === "obsidian-absolute") { + if (e === "/" + p) { + return true; + } + } else { + if (e === p) { + return true; + } + } + return false; + }); + }); + + // TODO this is ugly + const link = + matchingPermalink || + (pathFormat === "obsidian-absolute" + ? "/" + possibleWikiLinkPermalinks[0] + : possibleWikiLinkPermalinks[0]) || + ""; + + // remove leading # if the target is a heading on the same page + const displayName = alias || target.replace(/^#/, ""); + // replace spaces with dashes and lowercase headings + const headingId = heading.replace(/\s+/, "-").toLowerCase(); + let classNames = wikiLinkClassName; + if (!matchingPermalink) { + classNames += " " + newClassName; + } + + if (isEmbed) { + const [isSupportedFormat, format] = isSupportedFileFormat(target); + if (!isSupportedFormat) { + this.raw(`![[${target}]]`); + } else if (format === "pdf") { + this.tag( + `<iframe width="100%" src="${hrefTemplate( + link + )}#toolbar=0" class="${classNames}" />` + ); + } else { + this.tag( + `<img src="${hrefTemplate( + link + )}" alt="${displayName}" class="${classNames}" />` + ); + } + } else { + this.tag( + `<a href="${hrefTemplate(link + headingId)}" class="${classNames}">` + ); + this.raw(displayName); + this.tag("</a>"); + } + } + + return { + enter: { + wikiLink: enterWikiLink, + }, + exit: { + wikiLinkTarget: exitWikiLinkTarget, + wikiLinkAlias: exitWikiLinkAlias, + wikiLink: exitWikiLink, + }, + }; +} + +export { html }; diff --git a/packages/remark-wiki-link/src/lib/isSupportedFileFormat.ts b/packages/remark-wiki-link/src/lib/isSupportedFileFormat.ts new file mode 100644 index 000000000..bb3d44ad2 --- /dev/null +++ b/packages/remark-wiki-link/src/lib/isSupportedFileFormat.ts @@ -0,0 +1,28 @@ +// TODO why only these? +export const supportedFileFormats = [ + "webp", + "jpg", + "jpeg", + "gif", + "bmp", + "svg", + "apng", + "png", + "avif", + "ico", + "pdf", +]; + +export const isSupportedFileFormat = (filePath: string): [boolean, string] => { + const fileExtensionPattern = /\.([0-9a-z]{1,4})$/i; + const match = filePath.match(fileExtensionPattern); + + if (!match) { + return [false, null]; + } + + const [, extension] = match; + const isSupported = supportedFileFormats.includes(extension); + + return [isSupported, extension]; +}; diff --git a/packages/remark-wiki-link/src/lib/remarkWikiLink.ts b/packages/remark-wiki-link/src/lib/remarkWikiLink.ts new file mode 100644 index 000000000..6dac7d544 --- /dev/null +++ b/packages/remark-wiki-link/src/lib/remarkWikiLink.ts @@ -0,0 +1,42 @@ +import { toMarkdown } from "mdast-util-wiki-link"; +import { syntax, SyntaxOptions } from "./syntax"; +import { fromMarkdown, FromMarkdownOptions } from "./fromMarkdown"; + +let warningIssued = false; + +type RemarkWikiLinkOptions = FromMarkdownOptions & SyntaxOptions; + +function remarkWikiLink(opts: RemarkWikiLinkOptions = {}) { + const data = this.data(); // this is a reference to the processor + + function add(field, value) { + if (data[field]) data[field].push(value); + else data[field] = [value]; + } + + if ( + !warningIssued && + ((this.Parser && + this.Parser.prototype && + this.Parser.prototype.blockTokenizers) || + (this.Compiler && + this.Compiler.prototype && + this.Compiler.prototype.visitors)) + ) { + warningIssued = true; + console.warn( + "[remark-wiki-link] Warning: please upgrade to remark 13 to use this plugin" + ); + } + + // add extensions to packages used by remark-parse + // micromark extensions + add("micromarkExtensions", syntax(opts)); + // mdast-util-from-markdown extensions + add("fromMarkdownExtensions", fromMarkdown(opts)); + // mdast-util-to-markdown extensions + add("toMarkdownExtensions", toMarkdown(opts)); +} + +export default remarkWikiLink; +export { remarkWikiLink }; diff --git a/packages/remark-wiki-link/src/lib/syntax.ts b/packages/remark-wiki-link/src/lib/syntax.ts new file mode 100644 index 000000000..d9015c825 --- /dev/null +++ b/packages/remark-wiki-link/src/lib/syntax.ts @@ -0,0 +1,168 @@ +// Adjusted copy of https://github.com/landakram/micromark-extension-wiki-link/blob/master/src/index.js +import { codes } from "micromark-util-symbol/codes.js"; + +export interface SyntaxOptions { + aliasDivider?: string; +} + +function isEndOfLineOrFile(code: number) { + return ( + code === codes.carriageReturnLineFeed || + code === codes.carriageReturn || + code === codes.lineFeed || + code === codes.eof + ); +} + +/** + * Token types: + * - `wikiLink`: + * - `wikiLinkMarker`: The opening and closing brackets + * - `wikiLinkData`: The data between the brackets + * - `wikiLinkTarget`: The target of the link (the part before the alias divider) + * - `wikiLinkAliasMarker`: The alias divider + * - `wikiLinkAlias`: The alias of the link (the part after the alias divider) + * */ + +function wikiLink(opts: SyntaxOptions = {}) { + const aliasDivider = opts.aliasDivider || "|"; + + const aliasMarker = aliasDivider.charCodeAt(0); + const startMarker = codes.leftSquareBracket; + const embedStartMarker = codes.exclamationMark; + const endMarker = codes.rightSquareBracket; + + function tokenize(effects, ok, nok) { + let data = false; + let alias = false; + + let startMarkerCount = 0; + let endMarkerCount = 0; + + return start; + + // recognize the start of a wiki link + function start(code: number) { + if (code === startMarker) { + effects.enter("wikiLink"); + effects.enter("wikiLinkMarker"); + + return consumeStart(code); + } else if (code === embedStartMarker) { + effects.enter("wikiLink", { isType: "embed" }); + effects.enter("wikiLinkMarker", { isType: "embed" }); + + return consumeStart(code); + } else { + return nok(code); + } + } + function consumeStart(code: number) { + // when coursor is at the first character after the start marker `[[` + if (startMarkerCount === 2) { + effects.exit("wikiLinkMarker"); + return consumeData(code); + } + + if (code === startMarker || code === embedStartMarker) { + if (code === startMarker) { + startMarkerCount++; + } + effects.consume(code); + return consumeStart; + } else { + return nok(code); + } + } + + function consumeData(code: number) { + if (isEndOfLineOrFile(code)) { + return nok(code); + } + + effects.enter("wikiLinkData"); + effects.enter("wikiLinkTarget"); + return consumeTarget(code); + } + + function consumeTarget(code: number) { + if (code === aliasMarker) { + if (!data) return nok(code); + effects.exit("wikiLinkTarget"); + effects.enter("wikiLinkAliasMarker"); + return consumeAliasMarker(code); + } + + if (code === endMarker) { + if (!data) return nok(code); + effects.exit("wikiLinkTarget"); + effects.exit("wikiLinkData"); + effects.enter("wikiLinkMarker"); + return consumeEnd(code); + } + + if (isEndOfLineOrFile(code)) { + return nok(code); + } + + data = true; + effects.consume(code); + + return consumeTarget; + } + + function consumeAliasMarker(code) { + effects.consume(code); + effects.exit("wikiLinkAliasMarker"); + effects.enter("wikiLinkAlias"); + return consumeAlias(code); + } + + function consumeAlias(code: number) { + if (code === endMarker) { + if (!alias) return nok(code); + effects.exit("wikiLinkAlias"); + effects.exit("wikiLinkData"); + effects.enter("wikiLinkMarker"); + return consumeEnd(code); + } + + if (isEndOfLineOrFile(code)) { + return nok(code); + } + + alias = true; + effects.consume(code); + + return consumeAlias; + } + + function consumeEnd(code: number) { + if (endMarkerCount === 2) { + effects.exit("wikiLinkMarker"); + effects.exit("wikiLink"); + return ok(code); + } + + if (code !== endMarker) { + return nok(code); + } + + effects.consume(code); + endMarkerCount++; + + return consumeEnd; + } + } + + const wikiLinkConstruct = { tokenize }; + + return { + text: { + [codes.leftSquareBracket]: wikiLinkConstruct, + [codes.exclamationMark]: wikiLinkConstruct, + }, + }; +} + +export { wikiLink as syntax }; diff --git a/packages/remark-wiki-link/src/utils/getPermalinks.ts b/packages/remark-wiki-link/src/utils/getPermalinks.ts new file mode 100644 index 000000000..c3f6a6c91 --- /dev/null +++ b/packages/remark-wiki-link/src/utils/getPermalinks.ts @@ -0,0 +1,43 @@ +import fs from "fs"; +import path from "path"; + +// recursively get all files in a directory +const recursiveGetFiles = (dir: string) => { + const dirents = fs.readdirSync(dir, { withFileTypes: true }); + const files = dirents + .filter((dirent) => dirent.isFile()) + .map((dirent) => path.join(dir, dirent.name)); + const dirs = dirents + .filter((dirent) => dirent.isDirectory()) + .map((dirent) => path.join(dir, dirent.name)); + for (const d of dirs) { + files.push(...recursiveGetFiles(d)); + } + + return files; +}; + +export const getPermalinks = ( + markdownFolder: string, + ignorePatterns: Array<RegExp> = [], + func: (str: any, ...args: any[]) => string = defaultPathToPermalinkFunc +) => { + const files = recursiveGetFiles(markdownFolder); + const filesFiltered = files.filter((file) => { + return !ignorePatterns.some((pattern) => file.match(pattern)); + }); + + return filesFiltered.map((file) => func(file, markdownFolder)); +}; + +const defaultPathToPermalinkFunc = ( + filePath: string, + markdownFolder: string +) => { + const permalink = filePath + .replace(markdownFolder, "") // make the permalink relative to the markdown folder + .replace(/\.(mdx|md)/, "") + .replace(/\\/g, "/") // replace windows backslash with forward slash + .replace(/\/index$/, ""); // remove index from the end of the permalink + return permalink.length > 0 ? permalink : "/"; // for home page +}; diff --git a/packages/remark-wiki-link/src/utils/index.ts b/packages/remark-wiki-link/src/utils/index.ts new file mode 100644 index 000000000..580d6361e --- /dev/null +++ b/packages/remark-wiki-link/src/utils/index.ts @@ -0,0 +1 @@ +export { getPermalinks } from "./getPermalinks"; diff --git a/packages/remark-wiki-link/test/fixtures/content/abc.md b/packages/remark-wiki-link/test/fixtures/content/abc.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/abc.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/assets/Pasted Image 123.png b/packages/remark-wiki-link/test/fixtures/content/assets/Pasted Image 123.png new file mode 100644 index 000000000..12d4e2f55 Binary files /dev/null and b/packages/remark-wiki-link/test/fixtures/content/assets/Pasted Image 123.png differ diff --git a/packages/remark-wiki-link/test/fixtures/content/blog/Second Post.md b/packages/remark-wiki-link/test/fixtures/content/blog/Second Post.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/blog/Second Post.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/blog/first-post.md b/packages/remark-wiki-link/test/fixtures/content/blog/first-post.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/blog/first-post.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/blog/index.md b/packages/remark-wiki-link/test/fixtures/content/blog/index.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/blog/index.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/blog/third-post.md b/packages/remark-wiki-link/test/fixtures/content/blog/third-post.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/blog/third-post.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/blog/tutorials/first-tutorial.md b/packages/remark-wiki-link/test/fixtures/content/blog/tutorials/first-tutorial.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/blog/tutorials/first-tutorial.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/fixtures/content/index.md b/packages/remark-wiki-link/test/fixtures/content/index.md new file mode 100644 index 000000000..1a893be6a --- /dev/null +++ b/packages/remark-wiki-link/test/fixtures/content/index.md @@ -0,0 +1,2 @@ +# Document Title + diff --git a/packages/remark-wiki-link/test/getPermalinks.spec.ts b/packages/remark-wiki-link/test/getPermalinks.spec.ts new file mode 100644 index 000000000..1e1f51d30 --- /dev/null +++ b/packages/remark-wiki-link/test/getPermalinks.spec.ts @@ -0,0 +1,62 @@ +import * as path from "path"; +// import * as url from "url"; +import { getPermalinks } from "../src/utils"; + +// const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); +// const markdownFolder = path.join(__dirname, "/fixtures/content"); +const markdownFolder = path.join( + ".", + "/packages/remark-wiki-link/test/fixtures/content" +); + +describe("getPermalinks", () => { + test("should return an array of permalinks", () => { + const expectedPermalinks = [ + "/", // /index.md + "/abc", + "/blog/first-post", + "/blog/Second Post", + "/blog/third-post", + "/blog", // /blog/index.md + "/blog/tutorials/first-tutorial", + "/assets/Pasted Image 123.png", + ]; + + const permalinks = getPermalinks(markdownFolder, [/\.DS_Store/]); + expect(permalinks).toHaveLength(expectedPermalinks.length); + permalinks.forEach((permalink) => { + expect(expectedPermalinks).toContain(permalink); + }); + }); + + test("should return an array of permalinks with custom path -> permalink converter function", () => { + const expectedPermalinks = [ + "/", // /index.md + "/abc", + "/blog/first-post", + "/blog/second-post", + "/blog/third-post", + "/blog", // /blog/index.md + "/blog/tutorials/first-tutorial", + "/assets/pasted-image-123.png", + ]; + + const func = (filePath: string, markdownFolder: string) => { + const permalink = filePath + .replace(markdownFolder, "") // make the permalink relative to the markdown folder + .replace(/\.(mdx|md)/, "") + .replace(/\\/g, "/") // replace windows backslash with forward slash + .replace(/\/index$/, "") // remove index from the end of the permalink + .replace(/ /g, "-") // replace spaces with hyphens + .toLowerCase(); // convert to lowercase + + return permalink.length > 0 ? permalink : "/"; // for home page + }; + + const permalinks = getPermalinks(markdownFolder, [/\.DS_Store/], func); + expect(permalinks).toHaveLength(expectedPermalinks.length); + permalinks.forEach((permalink) => { + expect(expectedPermalinks).toContain(permalink); + }); + }); +}); diff --git a/packages/remark-wiki-link/test/isSupportedFileFormat.spec.ts b/packages/remark-wiki-link/test/isSupportedFileFormat.spec.ts new file mode 100644 index 000000000..eadbeea6c --- /dev/null +++ b/packages/remark-wiki-link/test/isSupportedFileFormat.spec.ts @@ -0,0 +1,23 @@ +import { + isSupportedFileFormat, + supportedFileFormats, +} from "../src/lib/isSupportedFileFormat"; + +describe("isSupportedFileFormat", () => { + test("should return [false, null] for a path with no file extension", () => { + const filePath = "/content/some/markdown/page"; + expect(isSupportedFileFormat(filePath)).toStrictEqual([false, null]); + }); + + test("should return [true, <extension>] for a path with supported file extension", () => { + supportedFileFormats.forEach((fileFormat) => { + const filePath = `image.${fileFormat}`; + expect(isSupportedFileFormat(filePath)).toStrictEqual([true, fileFormat]); + }); + }); + + test("should return [false, <extension>] for a path with unsupported file extension", () => { + const filePath = "image.xyz"; + expect(isSupportedFileFormat(filePath)).toStrictEqual([false, "xyz"]); + }); +}); diff --git a/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts b/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts new file mode 100644 index 000000000..5ef744763 --- /dev/null +++ b/packages/remark-wiki-link/test/micromarkExtensionWikiLink.spec.ts @@ -0,0 +1,312 @@ +import { syntax } from "../src/lib/syntax"; +import { html } from "../src/lib/html"; +import { micromark } from "micromark"; + +describe("micromark-extension-wiki-link", () => { + describe("parses a wikilink", () => { + test("with 'raw' file format (default) that has no matching permalink", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + // note: class="internal new" + expect(serialized).toBe( + '<p><a href="Wiki Link" class="internal new">Wiki Link</a></p>' + ); + }); + + test("with 'raw' file format (default) that has a matching permalink", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html({ permalinks: ["Wiki Link"] }) as any], // TODO type fix + }); + // note: class="internal" + expect(serialized).toBe( + '<p><a href="Wiki Link" class="internal">Wiki Link</a></p>' + ); + }); + + test("with shortened Obsidian-style path that has no matching permalink", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [ + html({ + pathFormat: "obsidian-short", + }) as any // TODO type fix + ], + }); + // note: class="internal new" + expect(serialized).toBe( + '<p><a href="Wiki Link" class="internal new">Wiki Link</a></p>' + ); + }); + + test("with shortened Obsidian-style path that has a matching permalink", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [ + html({ + permalinks: ["/some/folder/Wiki Link"], + pathFormat: "obsidian-short", + }) as any // TODO type fix + ], + }); + expect(serialized).toBe( + '<p><a href="/some/folder/Wiki Link" class="internal">Wiki Link</a></p>' + ); + }); + + // Obsidian absolute path doesn't have a leading slash + test("with 'obsidian-absolute' path format that has no matching permalink", () => { + const serialized = micromark("[[some/folder/Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html({ pathFormat: "obsidian-absolute" }) as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="/some/folder/Wiki Link" class="internal new">some/folder/Wiki Link</a></p>' + ); + }); + + // Obsidian absolute path doesn't have a leading slash + test("with 'obsidian-absolute' path format that has a matching permalink", () => { + const serialized = micromark("[[some/folder/Wiki Link]]", { + extensions: [syntax()], + htmlExtensions: [ + html({ + permalinks: ["/some/folder/Wiki Link"], + pathFormat: "obsidian-absolute", + }) as any // TODO type fix + ], + }); + expect(serialized).toBe( + '<p><a href="/some/folder/Wiki Link" class="internal">some/folder/Wiki Link</a></p>' + ); + }); + }); + + describe("aliases and headings", () => { + test("parses a wiki link with heading", () => { + const serialized = micromark("[[Wiki Link#Some Heading]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + // note: lowercased and hyphenated heading + expect(serialized).toBe( + '<p><a href="Wiki Link#some-heading" class="internal new">Wiki Link#Some Heading</a></p>' + ); + }); + + test("parses a wiki link with heading and alias", () => { + const serialized = micromark("[[Wiki Link#Some Heading|Alias]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + // note: lowercased and hyphenated heading + expect(serialized).toBe( + '<p><a href="Wiki Link#some-heading" class="internal new">Alias</a></p>' + ); + }); + + test("parses a wiki link to a heading on the same page", () => { + const serialized = micromark("[[#Some Heading]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="#some-heading" class="internal new">Some Heading</a></p>' + ); + }); + }); + + describe("image embeds", () => { + test("parses an image embed of supported file format", () => { + const serialized = micromark("![[My Image.jpg]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><img src="My Image.jpg" alt="My Image.jpg" class="internal new" /></p>' + ); + }); + + test("parses an image embed of unsupported file format", () => { + const serialized = micromark("![[My Image.xyz]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe("<p>![[My Image.xyz]]</p>"); + }); + + test("parses and image ambed with a matching permalink", () => { + const serialized = micromark("![[My Image.jpg]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html({ permalinks: ["My Image.jpg"] }) as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><img src="My Image.jpg" alt="My Image.jpg" class="internal" /></p>' + ); + }); + + test("parses an image embed with a matching permalink and Obsidian-style shortedned path", () => { + const serialized = micromark("![[My Image.jpg]]", { + extensions: [syntax()], + htmlExtensions: [ + html({ + permalinks: ["/assets/My Image.jpg"], + pathFormat: "obsidian-short", + }) as any // TODO type fix + ], + }); + expect(serialized).toBe( + '<p><img src="/assets/My Image.jpg" alt="My Image.jpg" class="internal" /></p>' + ); + }); + + test("parses an image embed with an alt text", () => { + const serialized = micromark("![[My Image.jpg|My Image Alt]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><img src="My Image.jpg" alt="My Image Alt" class="internal new" /></p>' + ); + }); + + test("parses a pdf embed", () => { + const serialized = micromark("![[My Document.pdf]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><iframe width="100%" src="My Document.pdf#toolbar=0" class="internal new" /></p>' + ); + }); + }); + + describe("invalid wiki links", () => { + test("doesn't parse a wiki link with two missing closing brackets", () => { + const serialized = micromark("[[Wiki Link", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe("<p>[[Wiki Link</p>"); + }); + + test("doesn't parse a wiki link with one missing closing bracket", () => { + const serialized = micromark("[[Wiki Link]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe("<p>[[Wiki Link]</p>"); + }); + + test("doesn't parse a wiki link with a missing opening bracket", () => { + const serialized = micromark("[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe("<p>[Wiki Link]]</p>"); + }); + + test("doesn't parse a wiki link in single brackets", () => { + const serialized = micromark("[Wiki Link]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe("<p>[Wiki Link]</p>"); + }); + }); + + describe("other options", () => { + test("parses a wiki link with a custom class", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [ + html({ + newClassName: "test-new", + wikiLinkClassName: "test-wiki-link", + }) as any // TODO type fix + ], + }); + expect(serialized).toBe( + '<p><a href="Wiki Link" class="test-wiki-link test-new">Wiki Link</a></p>' + ); + }); + + test("parses a wiki link with a custom divider", () => { + const serialized = micromark("[[Wiki Link:Alias Name]]", "ascii", { + extensions: [syntax({ aliasDivider: ":" })], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="Wiki Link" class="internal new">Alias Name</a></p>' + ); + }); + + test("parses a wiki link with a custom page resolver", () => { + const serialized = micromark("[[Wiki Link]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [ + html({ + wikiLinkResolver: (page) => [ + page.replace(/\s+/, "-").toLowerCase(), + ], + }) as any // TODO type fix + ], + }); + expect(serialized).toBe( + '<p><a href="wiki-link" class="internal new">Wiki Link</a></p>' + ); + }); + }); + + test("parses wiki links to index files", () => { + const serialized = micromark("[[/some/folder/index]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="/some/folder" class="internal new">/some/folder/index</a></p>' + ); + }); + + describe("other", () => { + test("parses a wiki link to some index page in a folder with no matching permalink", () => { + const serialized = micromark("[[/some/folder/index]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="/some/folder" class="internal new">/some/folder/index</a></p>' + ); + }); + + test("parses a wiki link to some index page in a folder with a matching permalink", () => { + const serialized = micromark("[[/some/folder/index]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html({ permalinks: ["/some/folder"] }) as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="/some/folder" class="internal">/some/folder/index</a></p>' + ); + }); + + test("parses a wiki link to home index page with no matching permalink", () => { + const serialized = micromark("[[/index]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html() as any], // TODO type fix + }); + expect(serialized).toBe( + '<p><a href="/" class="internal new">/index</a></p>' + ); + }); + + test("parses a wiki link to home index page with a matching permalink", () => { + const serialized = micromark("[[/index]]", "ascii", { + extensions: [syntax()], + htmlExtensions: [html({ permalinks: ["/"] }) as any], // TODO type fix + }); + expect(serialized).toBe('<p><a href="/" class="internal">/index</a></p>'); + }); + }); +}); diff --git a/packages/remark-wiki-link/test/remarkWikiLink.spec.ts b/packages/remark-wiki-link/test/remarkWikiLink.spec.ts new file mode 100644 index 000000000..15de7e1ad --- /dev/null +++ b/packages/remark-wiki-link/test/remarkWikiLink.spec.ts @@ -0,0 +1,538 @@ +import markdown from "remark-parse"; +import { unified } from "unified"; +import { select } from "unist-util-select"; +import { visit } from "unist-util-visit"; +import { Node } from "unist"; + +import wikiLinkPlugin from "../src/lib/remarkWikiLink"; + +describe("remark-wiki-link", () => { + describe("parses a wikilink", () => { + test("with 'raw' file format (default) that has no matching permalink", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual("Wiki Link"); + expect((node.data?.hChildren as any)[0].value).toEqual("Wiki Link"); + }); + }); + + test("with 'raw' file format (default) that has a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + permalinks: ["Wiki Link"], + }); + + let ast = processor.parse("[[Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal"); + expect((node.data?.hProperties as any).href).toEqual("Wiki Link"); + expect((node.data?.hChildren as any)[0].value).toEqual("Wiki Link"); + }); + }); + + test("with shortened Obsidian-style path that has no matching permalink", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin, { + pathFormat: "obsidian-short", + }); + + let ast = processor.parse("[[Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual("Wiki Link"); + expect((node.data?.hChildren as any)[0].value).toEqual("Wiki Link"); + }); + }); + + test("with shortened Obsidian-style path that has a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + permalinks: ["/some/folder/Wiki Link"], + pathFormat: "obsidian-short", + }); + + let ast = processor.parse("[[Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/some/folder/Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal"); + expect((node.data?.hProperties as any).href).toEqual( + "/some/folder/Wiki Link" + ); + expect((node.data?.hChildren as any)[0].value).toEqual("Wiki Link"); + }); + }); + + // Obsidian absolute path doesn't have a leading slash + test("with 'obsidian-absolute' path format that has no matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { pathFormat: "obsidian-absolute" }); + + let ast = processor.parse("[[some/folder/Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("/some/folder/Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual( + "/some/folder/Wiki Link" + ); + expect((node.data?.hChildren as any)[0].value).toEqual( + "some/folder/Wiki Link" + ); + }); + }); + + // Obsidian absolute path doesn't have a leading slash + test("with 'obsidian-absolute' path format that has a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + permalinks: ["/some/folder/Wiki Link"], + pathFormat: "obsidian-absolute", + }); + + let ast = processor.parse("[[some/folder/Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/some/folder/Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal"); + expect((node.data?.hProperties as any).href).toEqual( + "/some/folder/Wiki Link" + ); + expect((node.data?.hChildren as any)[0].value).toEqual( + "some/folder/Wiki Link" + ); + }); + }); + }); + + describe("aliases and headings", () => { + test("parses a wiki link with heading", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[Wiki Link#Some Heading]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("Wiki Link"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual( + "Wiki Link#some-heading" + ); + expect((node.data?.hChildren as any)[0].value).toEqual( + "Wiki Link#Some Heading" + ); + }); + }); + + test("parses a wiki link with heading and alias", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[Wiki Link#Some Heading|Alias]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("Wiki Link"); + expect(node.data?.alias).toEqual("Alias"); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual( + "Wiki Link#some-heading" + ); + expect((node.data?.hChildren as any)[0].value).toEqual("Alias"); + }); + }); + + test("parses a wiki link to a heading on the same page", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[#Some Heading]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual(""); // TODO should this be null? + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual("#some-heading"); + expect((node.data?.hChildren as any)[0].value).toEqual("Some Heading"); + }); + }); + }); + + describe("image embeds", () => { + test("parses an image embed of supported file format", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("![[My Image.png]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("My Image.png"); + expect(node.data?.permalink).toEqual("My Image.png"); + expect(node.data?.hName).toEqual("img"); + expect((node.data?.hProperties as any).src).toEqual("My Image.png"); + expect((node.data?.hProperties as any).alt).toEqual("My Image.png"); + }); + }); + + test("parses an image embed of unsupported file format", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("![[My Image.xyz]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("My Image.xyz"); + expect(node.data?.permalink).toEqual("My Image.xyz"); + expect(node.data?.hName).toEqual("p"); + expect((node.data?.hChildren as any)[0].value).toEqual( + "![[My Image.xyz]]" + ); + }); + }); + + test("parses an image embed with a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + permalinks: ["Pasted Image 123.png"], + }); + + let ast = processor.parse("![[Pasted Image 123.png]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("Pasted Image 123.png"); + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("Pasted Image 123.png"); + expect(node.data?.hName).toEqual("img"); + expect((node.data?.hProperties as any).src).toEqual( + "Pasted Image 123.png" + ); + expect((node.data?.hProperties as any).alt).toEqual( + "Pasted Image 123.png" + ); + }); + }); + + test("parses an image embed with a matching permalink and Obsidian-style shortedned path", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + pathFormat: "obsidian-short", + permalinks: ["/assets/Pasted Image 123.png"], + }); + + let ast = processor.parse("![[Pasted Image 123.png]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("Pasted Image 123.png"); + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/assets/Pasted Image 123.png"); + expect(node.data?.hName).toEqual("img"); + expect((node.data?.hProperties as any).src).toEqual( + "/assets/Pasted Image 123.png" + ); + expect((node.data?.hProperties as any).alt).toEqual( + "Pasted Image 123.png" + ); + }); + }); + + test("parses an image embed with an alt text", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("![[My Image.png|Alt Text]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("My Image.png"); + expect(node.data?.permalink).toEqual("My Image.png"); + expect(node.data?.hName).toEqual("img"); + expect((node.data?.hProperties as any).src).toEqual("My Image.png"); + expect((node.data?.hProperties as any).alt).toEqual("Alt Text"); + }); + }); + + test("parses a pdf embed", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("![[My Document.pdf]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.isEmbed).toEqual(true); + expect(node.data?.target).toEqual("My Document.pdf"); + expect(node.data?.permalink).toEqual("My Document.pdf"); + expect(node.data?.hName).toEqual("iframe"); + expect((node.data?.hProperties as any).src).toEqual( + "My Document.pdf#toolbar=0" + ); + }); + }); + }); + + describe("invalid wiki links", () => { + test("doesn't parse a wiki link with two missing closing brackets", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[Wiki Link"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).toEqual(null); + }); + + test("doesn't parse a wiki link with one missing closing bracket", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[Wiki Link]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).toEqual(null); + }); + + test("doesn't parse a wiki link with a missing opening bracket", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("Wiki Link]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).toEqual(null); + }); + + test("doesn't parse a wiki link in single brackets", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[Wiki Link]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).toEqual(null); + }); + }); + + test("supports different config options", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { + aliasDivider: ":", + pathFormat: "obsidian-short", + permalinks: ["/some/folder/123/real-page"], + wikiLinkResolver: (pageName: string) => [ + `123/${pageName.replace(/ /g, "-").toLowerCase()}`, + ], + wikiLinkClassName: "my-wiki-link-class", + hrefTemplate: (permalink: string) => `https://my-site.com${permalink}`, + }); + + let ast = processor.parse("[[Real Page#Some Heading:Page Alias]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/some/folder/123/real-page"); + expect(node.data?.alias).toEqual("Page Alias"); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "my-wiki-link-class" + ); + expect((node.data?.hProperties as any).href).toEqual( + "https://my-site.com/some/folder/123/real-page#some-heading" + ); + expect((node.data?.hChildren as any)[0].value).toEqual("Page Alias"); + }); + }); + + test("parses wiki links to index files", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[/some/folder/index]]"); + ast = processor.runSync(ast); + + expect(select("wikiLink", ast)).not.toEqual(null); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("/some/folder"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal new"); + expect((node.data?.hProperties as any).href).toEqual("/some/folder"); + expect((node.data?.hChildren as any)[0].value).toEqual( + "/some/folder/index" + ); + }); + }); + + describe("other", () => { + test("parses a wiki link to some index page in a folder with no matching permalink", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[/some/folder/index]]"); + ast = processor.runSync(ast); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("/some/folder"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual("/some/folder"); + expect((node.data?.hChildren as any)[0].value).toEqual( + "/some/folder/index" + ); + }); + }); + + test("parses a wiki link to some index page in a folder with a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { permalinks: ["/some/folder"] }); + + let ast = processor.parse("[[/some/folder/index]]"); + ast = processor.runSync(ast); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/some/folder"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal"); + expect((node.data?.hProperties as any).href).toEqual("/some/folder"); + expect((node.data?.hChildren as any)[0].value).toEqual( + "/some/folder/index" + ); + }); + }); + + test("parses a wiki link to home index page with no matching permalink", () => { + const processor = unified().use(markdown).use(wikiLinkPlugin); + + let ast = processor.parse("[[/index]]"); + ast = processor.runSync(ast); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(false); + expect(node.data?.permalink).toEqual("/"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual( + "internal new" + ); + expect((node.data?.hProperties as any).href).toEqual("/"); + expect((node.data?.hChildren as any)[0].value).toEqual("/index"); + }); + }); + + test("parses a wiki link to home index page with a matching permalink", () => { + const processor = unified() + .use(markdown) + .use(wikiLinkPlugin, { permalinks: ["/"] }); + + let ast = processor.parse("[[/index]]"); + ast = processor.runSync(ast); + + visit(ast, "wikiLink", (node: Node) => { + expect(node.data?.exists).toEqual(true); + expect(node.data?.permalink).toEqual("/"); + expect(node.data?.alias).toEqual(null); + expect(node.data?.hName).toEqual("a"); + expect((node.data?.hProperties as any).className).toEqual("internal"); + expect((node.data?.hProperties as any).href).toEqual("/"); + expect((node.data?.hChildren as any)[0].value).toEqual("/index"); + }); + }); + }); +}); diff --git a/packages/remark-wiki-link/tsconfig.json b/packages/remark-wiki-link/tsconfig.json new file mode 100644 index 000000000..08ec01ae1 --- /dev/null +++ b/packages/remark-wiki-link/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "allowJs": true, + "target": "es2020", + "module": "es2020", + "moduleResolution": "node", + "esModuleInterop": true + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/remark-wiki-link/tsconfig.lib.json b/packages/remark-wiki-link/tsconfig.lib.json new file mode 100644 index 000000000..87a9dea76 --- /dev/null +++ b/packages/remark-wiki-link/tsconfig.lib.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node"], + "outDir": "dist", + "forceConsistentCasingInFileNames": true + }, + "exclude": ["**/*.spec.ts"], + "include": ["**/*.ts", "**/*.js"] +} diff --git a/packages/remark-wiki-link/tsconfig.spec.json b/packages/remark-wiki-link/tsconfig.spec.json new file mode 100644 index 000000000..f8bb0440c --- /dev/null +++ b/packages/remark-wiki-link/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node", "jest"] + }, + "include": ["**/*.spec.ts", "**/*.d.ts"] +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 8220788fe..8392fc32e 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -17,7 +17,8 @@ "paths": { "@portaljs/portaljs-components": [ "packages/portaljs-components/src/index.ts" - ] + ], + "@portaljs/core": ["packages/core/src/index.ts"] } }, "exclude": ["node_modules", "tmp"]