├── .env ├── .env.development ├── .env.production ├── .eslintrc.js ├── .github └── workflows │ └── static.yml ├── .gitignore ├── LICENSE ├── README.md ├── git-history.sh ├── index.html ├── package-lock.json ├── package.json ├── src ├── App.vue ├── components │ ├── MindmapView │ │ ├── MindmapView.js │ │ ├── Parser.js │ │ ├── TreeNode.js │ │ └── TreeProperties.js │ ├── MindnoteBox.vue │ ├── MindnoteCard.vue │ ├── MindnoteInput.vue │ ├── MindnoteItem.vue │ ├── MindnotePage.vue │ ├── MindnotePageX.vue │ └── SpacePage.vue ├── index.css ├── main.js ├── router │ └── index.js └── utils │ └── util.js └── vite.config.js /.env: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aregrid/aregrid-mindnote/a970b50086a8905319d2bacd1a704f9652fbde60/.env -------------------------------------------------------------------------------- /.env.development: -------------------------------------------------------------------------------- 1 | VITE_ASSETS_DIR ='./assets/' -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | # loaded in all cases 2 | # VITE_HOST = '0.0.0.0' 3 | # VITE_PORT = 8080 4 | VITE_BASE_URL = '/aregrid-mindnote/' 5 | VITE_OUTPUT_DIR = 'docs' 6 | VITE_ASSETS_DIR ='./assets/' 7 | #VITE_PUBLIC_DIR = 'https://cg0101.github.io/mindnote/assets/' 8 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | 'extends': [ 7 | 'plugin:vue/essential', 8 | 'eslint:recommended' 9 | ], 10 | parserOptions: { 11 | ecmaVersion: 2020 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy static content to Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ['master'] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow one concurrent deployment 19 | concurrency: 20 | group: 'pages' 21 | cancel-in-progress: true 22 | 23 | jobs: 24 | # Single deploy job since we're just deploying 25 | deploy: 26 | environment: 27 | name: github-pages 28 | url: ${{ steps.deployment.outputs.page_url }} 29 | runs-on: ubuntu-latest 30 | steps: 31 | - name: Checkout 32 | uses: actions/checkout@v3 33 | - uses: pnpm/action-setup@v2 34 | with: 35 | version: 7.9.5 36 | - uses: actions/setup-node@v3 37 | with: 38 | node-version: '16' 39 | cache: 'npm' 40 | 41 | - name: Install dependencies 42 | run: npm install --frozen-lockfile 43 | 44 | - name: Build App 45 | run: npm run build 46 | 47 | - name: Setup Pages 48 | uses: actions/configure-pages@v2 49 | - name: Upload artifact 50 | uses: actions/upload-pages-artifact@v1 51 | with: 52 | # Upload entire repository 53 | path: './docs/' 54 | - name: Deploy to GitHub Pages 55 | id: deployment 56 | uses: actions/deploy-pages@v1 57 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | /docs 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | 13 | # node-waf configuration 14 | .lock-wscript 15 | 16 | # Compiled binary addons (https://nodejs.org/api/addons.html) 17 | build/Release 18 | 19 | # Dependency directories 20 | node_modules/ 21 | jspm_packages/ 22 | 23 | # TypeScript v1 declaration files 24 | typings/ 25 | 26 | # TypeScript cache 27 | *.tsbuildinfo 28 | 29 | # Optional npm cache directory 30 | .npm 31 | 32 | # Editor directories and files 33 | .idea 34 | .vscode -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013-present, zhangchi 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in 13 | all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 21 | THE SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # aregrid-mindnote 2 | 3 | a powelful mindnote by vue + javascript 4 | 5 | # preview 6 | 7 | https://aregrid.github.io/aregrid-mindnote/#/ 8 | 9 | # quick start 10 | 11 | ``` 12 | npm i 13 | npm run dev 14 | npm run build 15 | ``` 16 | 17 | # License 18 | 19 | [MIT](https://opensource.org/licenses/MIT) 20 | 21 | Copyright (c) 2013-present, aregrid 22 | -------------------------------------------------------------------------------- /git-history.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | git filter-branch --commit-filter ' 4 | OLD_EMAIL="956238702@qq.com" 5 | CORRECT_NAME="tzhangchi" 6 | CORRECT_EMAIL="terry.zhangchi@outlook.com" 7 | if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] 8 | then 9 | export GIT_COMMITTER_NAME="$CORRECT_NAME" 10 | export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" 11 | fi' HEAD 12 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | mindnote 8 | 9 | 10 |
11 | 12 | 13 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mindnote", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "mindnote", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "@blocksuite/editor": "^0.5.0-20230326033652-70ca43c", 12 | "vue": "^3.0.5", 13 | "vue-router": "^4.0.0-rc.2", 14 | "vuex": "^4.0.0-rc.1" 15 | }, 16 | "devDependencies": { 17 | "@vitejs/plugin-vue": "^1.1.5", 18 | "@vue/compiler-sfc": "^3.0.5", 19 | "dotenv": "^8.2.0", 20 | "less": "^3.13.0", 21 | "vite": "^2.0.4" 22 | } 23 | }, 24 | "node_modules/@babel/parser": { 25 | "version": "7.13.11", 26 | "resolved": "https://registry.npm.taobao.org/@babel/parser/download/@babel/parser-7.13.11.tgz?cache=0&sync_timestamp=1615820421062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Fparser%2Fdownload%2F%40babel%2Fparser-7.13.11.tgz", 27 | "integrity": "sha1-+T6/yZ0hwXcq+7qhU/R+fOL1C4g=", 28 | "bin": { 29 | "parser": "bin/babel-parser.js" 30 | }, 31 | "engines": { 32 | "node": ">=6.0.0" 33 | } 34 | }, 35 | "node_modules/@babel/types": { 36 | "version": "7.13.0", 37 | "resolved": "https://registry.npm.taobao.org/@babel/types/download/@babel/types-7.13.0.tgz?cache=0&sync_timestamp=1614034819122&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40babel%2Ftypes%2Fdownload%2F%40babel%2Ftypes-7.13.0.tgz", 38 | "integrity": "sha1-dEJNKBbwFxtBAPCrNOmjdO/ff4A=", 39 | "dependencies": { 40 | "@babel/helper-validator-identifier": "^7.12.11", 41 | "lodash": "^4.17.19", 42 | "to-fast-properties": "^2.0.0" 43 | } 44 | }, 45 | "node_modules/@babel/types/node_modules/@babel/helper-validator-identifier": { 46 | "version": "7.12.11", 47 | "resolved": "https://registry.npm.taobao.org/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.12.11.tgz", 48 | "integrity": "sha1-yaHwIZF9y1zPDU5FPjmQIpgfye0=" 49 | }, 50 | "node_modules/@babel/types/node_modules/lodash": { 51 | "version": "4.17.21", 52 | "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.21.tgz", 53 | "integrity": "sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw=" 54 | }, 55 | "node_modules/@blocksuite/blocks": { 56 | "version": "0.5.0-20230326033652-70ca43c", 57 | "resolved": "https://registry.npmjs.org/@blocksuite/blocks/-/blocks-0.5.0-20230326033652-70ca43c.tgz", 58 | "integrity": "sha512-pfpPKdfiA8JZSwjwRQAy2ltGeySjcwNqApGT9k0ELVVmH2gNszMsEglZwQVkNXZxA+t/7OX6fnhIEjD3zpksfQ==", 59 | "peer": true, 60 | "dependencies": { 61 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c", 62 | "@blocksuite/phasor": "0.5.0-20230326033652-70ca43c", 63 | "@blocksuite/virgo": "0.5.0-20230326033652-70ca43c", 64 | "@popperjs/core": "^2.11.6", 65 | "hotkeys-js": "^3.10.1", 66 | "lit": "^2.6.1", 67 | "marked": "^4.2.12", 68 | "shiki": "^0.14.1", 69 | "turndown": "^7.1.1", 70 | "zod": "^3.21.4" 71 | }, 72 | "peerDependencies": { 73 | "@blocksuite/store": "0.5.0-20230326033652-70ca43c" 74 | } 75 | }, 76 | "node_modules/@blocksuite/blocks/node_modules/@blocksuite/phasor": { 77 | "version": "0.5.0-20230326033652-70ca43c", 78 | "resolved": "https://registry.npmjs.org/@blocksuite/phasor/-/phasor-0.5.0-20230326033652-70ca43c.tgz", 79 | "integrity": "sha512-t95D1Y/sPII1PgyOqf8AGLkcp5RLQFSApTj/kjDgvzqetCHn81qUc47o99eb2uHC8yY0TlxgaHmZsnIRspP9nQ==", 80 | "peer": true, 81 | "dependencies": { 82 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c", 83 | "fractional-indexing": "^3.2.0", 84 | "perfect-freehand": "^1.2.0" 85 | }, 86 | "peerDependencies": { 87 | "nanoid": "^4", 88 | "yjs": "^13" 89 | } 90 | }, 91 | "node_modules/@blocksuite/blocks/node_modules/nanoid": { 92 | "version": "4.0.2", 93 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", 94 | "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", 95 | "funding": [ 96 | { 97 | "type": "github", 98 | "url": "https://github.com/sponsors/ai" 99 | } 100 | ], 101 | "peer": true, 102 | "bin": { 103 | "nanoid": "bin/nanoid.js" 104 | }, 105 | "engines": { 106 | "node": "^14 || ^16 || >=18" 107 | } 108 | }, 109 | "node_modules/@blocksuite/editor": { 110 | "version": "0.5.0-20230326033652-70ca43c", 111 | "resolved": "https://registry.npmjs.org/@blocksuite/editor/-/editor-0.5.0-20230326033652-70ca43c.tgz", 112 | "integrity": "sha512-a9NGmui19veF5VOVFsp1H71yjlVzObMwSzV6Kjt21ADyPmV3d7OZ4Wbf9daEJrTujzMoo11Rk+WePy0mUFqDvQ==", 113 | "dependencies": { 114 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c", 115 | "lit": "^2.6.1", 116 | "marked": "^4.2.12", 117 | "turndown": "^7.1.1" 118 | }, 119 | "peerDependencies": { 120 | "@blocksuite/blocks": "0.5.0-20230326033652-70ca43c", 121 | "@blocksuite/store": "0.5.0-20230326033652-70ca43c" 122 | } 123 | }, 124 | "node_modules/@blocksuite/global": { 125 | "version": "0.5.0-20230326033652-70ca43c", 126 | "resolved": "https://registry.npmjs.org/@blocksuite/global/-/global-0.5.0-20230326033652-70ca43c.tgz", 127 | "integrity": "sha512-KEtU8L6szoHv5lnJYz4thk8QeRLWIzHnGdYlL/W131UFEOtg1/hQ+SUilFjX+JFQIi3692zdUg9KBywPHl6bfw==", 128 | "dependencies": { 129 | "ansi-colors": "^4.1.3", 130 | "zod": "^3.21.4" 131 | }, 132 | "peerDependencies": { 133 | "lit": "^2.6" 134 | }, 135 | "peerDependenciesMeta": { 136 | "lit": { 137 | "optional": true 138 | } 139 | } 140 | }, 141 | "node_modules/@blocksuite/store": { 142 | "version": "0.5.0-20230326033652-70ca43c", 143 | "resolved": "https://registry.npmjs.org/@blocksuite/store/-/store-0.5.0-20230326033652-70ca43c.tgz", 144 | "integrity": "sha512-m30GJI9Vuj9vEk3d5fqHU3tv4A4E4+eu2yUjDBYXORYG+YcmKu1c+aUTXR6iLoZv/77ju0XZnxjAnylln1y6Fw==", 145 | "peer": true, 146 | "dependencies": { 147 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c", 148 | "@blocksuite/virgo": "0.5.0-20230326033652-70ca43c", 149 | "@types/flexsearch": "^0.7.3", 150 | "buffer": "^6.0.3", 151 | "flexsearch": "0.7.21", 152 | "idb-keyval": "^6.2.0", 153 | "ky": "^0.33.3", 154 | "lib0": "^0.2.68", 155 | "merge": "^2.1.1", 156 | "nanoid": "^4.0.1", 157 | "y-protocols": "^1.0.5", 158 | "y-webrtc": "^10.2.5", 159 | "zod": "^3.21.4" 160 | }, 161 | "peerDependencies": { 162 | "yjs": "^13" 163 | } 164 | }, 165 | "node_modules/@blocksuite/store/node_modules/nanoid": { 166 | "version": "4.0.2", 167 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", 168 | "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", 169 | "funding": [ 170 | { 171 | "type": "github", 172 | "url": "https://github.com/sponsors/ai" 173 | } 174 | ], 175 | "peer": true, 176 | "bin": { 177 | "nanoid": "bin/nanoid.js" 178 | }, 179 | "engines": { 180 | "node": "^14 || ^16 || >=18" 181 | } 182 | }, 183 | "node_modules/@blocksuite/virgo": { 184 | "version": "0.5.0-20230326033652-70ca43c", 185 | "resolved": "https://registry.npmjs.org/@blocksuite/virgo/-/virgo-0.5.0-20230326033652-70ca43c.tgz", 186 | "integrity": "sha512-sUKStWCkoZ3NOc93Y2tBQzzmUVf+aERCGCP1HLFawW4yTNd55VTRAgJe65+fj4J3r/CORvv+YM8TFzH8wfBmwQ==", 187 | "peer": true, 188 | "dependencies": { 189 | "@blocksuite/global": "0.5.0-20230326033652-70ca43c", 190 | "zod": "^3.21.4" 191 | }, 192 | "peerDependencies": { 193 | "lit": "^2", 194 | "yjs": "^13" 195 | } 196 | }, 197 | "node_modules/@lit-labs/ssr-dom-shim": { 198 | "version": "1.1.0", 199 | "resolved": "https://registry.npmjs.org/@lit-labs/ssr-dom-shim/-/ssr-dom-shim-1.1.0.tgz", 200 | "integrity": "sha512-92uQ5ARf7UXYrzaFcAX3T2rTvaS9Z1//ukV+DqjACM4c8s0ZBQd7ayJU5Dh2AFLD/Ayuyz4uMmxQec8q3U4Ong==" 201 | }, 202 | "node_modules/@lit/reactive-element": { 203 | "version": "1.6.1", 204 | "resolved": "https://registry.npmjs.org/@lit/reactive-element/-/reactive-element-1.6.1.tgz", 205 | "integrity": "sha512-va15kYZr7KZNNPZdxONGQzpUr+4sxVu7V/VG7a8mRfPPXUyhEYj5RzXCQmGrlP3tAh0L3HHm5AjBMFYRqlM9SA==", 206 | "dependencies": { 207 | "@lit-labs/ssr-dom-shim": "^1.0.0" 208 | } 209 | }, 210 | "node_modules/@popperjs/core": { 211 | "version": "2.11.7", 212 | "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", 213 | "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", 214 | "peer": true, 215 | "funding": { 216 | "type": "opencollective", 217 | "url": "https://opencollective.com/popperjs" 218 | } 219 | }, 220 | "node_modules/@types/flexsearch": { 221 | "version": "0.7.3", 222 | "resolved": "https://registry.npmjs.org/@types/flexsearch/-/flexsearch-0.7.3.tgz", 223 | "integrity": "sha512-HXwADeHEP4exXkCIwy2n1+i0f1ilP1ETQOH5KDOugjkTFZPntWo0Gr8stZOaebkxsdx+k0X/K6obU/+it07ocg==", 224 | "peer": true 225 | }, 226 | "node_modules/@types/trusted-types": { 227 | "version": "2.0.3", 228 | "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", 229 | "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" 230 | }, 231 | "node_modules/@vitejs/plugin-vue": { 232 | "version": "1.1.5", 233 | "resolved": "https://registry.npm.taobao.org/@vitejs/plugin-vue/download/@vitejs/plugin-vue-1.1.5.tgz", 234 | "integrity": "sha1-+h6OXgScNeITZy4z9z/oFwatXb4=", 235 | "dev": true, 236 | "engines": { 237 | "node": ">=12.0.0" 238 | }, 239 | "peerDependencies": { 240 | "@vue/compiler-sfc": "^3.0.6" 241 | } 242 | }, 243 | "node_modules/@vue/compiler-core": { 244 | "version": "3.0.7", 245 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-core/download/@vue/compiler-core-3.0.7.tgz?cache=0&sync_timestamp=1614619144678&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-core%2Fdownload%2F%40vue%2Fcompiler-core-3.0.7.tgz", 246 | "integrity": "sha1-QheCpMZ8w/K3wwRX70RtdPhST3Q=", 247 | "dependencies": { 248 | "@babel/parser": "^7.12.0", 249 | "@babel/types": "^7.12.0", 250 | "@vue/shared": "3.0.7", 251 | "estree-walker": "^2.0.1", 252 | "source-map": "^0.6.1" 253 | } 254 | }, 255 | "node_modules/@vue/compiler-dom": { 256 | "version": "3.0.7", 257 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-dom/download/@vue/compiler-dom-3.0.7.tgz?cache=0&sync_timestamp=1614619147363&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-dom%2Fdownload%2F%40vue%2Fcompiler-dom-3.0.7.tgz", 258 | "integrity": "sha1-VNLhL7mnr/U6vRnawsJnlTPwyRk=", 259 | "dependencies": { 260 | "@vue/compiler-core": "3.0.7", 261 | "@vue/shared": "3.0.7" 262 | } 263 | }, 264 | "node_modules/@vue/compiler-sfc": { 265 | "version": "3.0.7", 266 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-sfc/download/@vue/compiler-sfc-3.0.7.tgz?cache=0&sync_timestamp=1614619149945&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-sfc%2Fdownload%2F%40vue%2Fcompiler-sfc-3.0.7.tgz", 267 | "integrity": "sha1-kAQUdQzHJlU7hwSQ9IBzRR/RTwc=", 268 | "dev": true, 269 | "dependencies": { 270 | "@babel/parser": "^7.12.0", 271 | "@babel/types": "^7.12.0", 272 | "@vue/compiler-core": "3.0.7", 273 | "@vue/compiler-dom": "3.0.7", 274 | "@vue/compiler-ssr": "3.0.7", 275 | "@vue/shared": "3.0.7", 276 | "consolidate": "^0.16.0", 277 | "estree-walker": "^2.0.1", 278 | "hash-sum": "^2.0.0", 279 | "lru-cache": "^5.1.1", 280 | "magic-string": "^0.25.7", 281 | "merge-source-map": "^1.1.0", 282 | "postcss": "^8.1.10", 283 | "postcss-modules": "^4.0.0", 284 | "postcss-selector-parser": "^6.0.4", 285 | "source-map": "^0.6.1" 286 | }, 287 | "peerDependencies": { 288 | "vue": "3.0.7" 289 | } 290 | }, 291 | "node_modules/@vue/compiler-sfc/node_modules/consolidate": { 292 | "version": "0.16.0", 293 | "resolved": "https://registry.npm.taobao.org/consolidate/download/consolidate-0.16.0.tgz?cache=0&sync_timestamp=1599597070540&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fconsolidate%2Fdownload%2Fconsolidate-0.16.0.tgz", 294 | "integrity": "sha1-oRhkdokw8vGUMWYKZZBmaPX73BY=", 295 | "dev": true, 296 | "dependencies": { 297 | "bluebird": "^3.7.2" 298 | }, 299 | "engines": { 300 | "node": ">= 0.10.0" 301 | } 302 | }, 303 | "node_modules/@vue/compiler-sfc/node_modules/hash-sum": { 304 | "version": "2.0.0", 305 | "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-2.0.0.tgz", 306 | "integrity": "sha1-gdAbtd6OpKIUrV1urRtSNGCwtFo=", 307 | "dev": true 308 | }, 309 | "node_modules/@vue/compiler-sfc/node_modules/postcss-selector-parser": { 310 | "version": "6.0.4", 311 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz", 312 | "integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=", 313 | "dev": true, 314 | "dependencies": { 315 | "cssesc": "^3.0.0", 316 | "indexes-of": "^1.0.1", 317 | "uniq": "^1.0.1", 318 | "util-deprecate": "^1.0.2" 319 | }, 320 | "engines": { 321 | "node": ">=4" 322 | } 323 | }, 324 | "node_modules/@vue/compiler-ssr": { 325 | "version": "3.0.7", 326 | "resolved": "https://registry.npm.taobao.org/@vue/compiler-ssr/download/@vue/compiler-ssr-3.0.7.tgz?cache=0&sync_timestamp=1614619154952&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fcompiler-ssr%2Fdownload%2F%40vue%2Fcompiler-ssr-3.0.7.tgz", 327 | "integrity": "sha1-KLhdSXOB11/kQjQFexQLAGXKnb8=", 328 | "dev": true, 329 | "dependencies": { 330 | "@vue/compiler-dom": "3.0.7", 331 | "@vue/shared": "3.0.7" 332 | } 333 | }, 334 | "node_modules/@vue/reactivity": { 335 | "version": "3.0.7", 336 | "resolved": "https://registry.npm.taobao.org/@vue/reactivity/download/@vue/reactivity-3.0.7.tgz?cache=0&sync_timestamp=1614619152518&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Freactivity%2Fdownload%2F%40vue%2Freactivity-3.0.7.tgz", 337 | "integrity": "sha1-5szHvvf8ELCXLk2XS61xZ507Jq0=", 338 | "dependencies": { 339 | "@vue/shared": "3.0.7" 340 | } 341 | }, 342 | "node_modules/@vue/runtime-core": { 343 | "version": "3.0.7", 344 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-core/download/@vue/runtime-core-3.0.7.tgz?cache=0&sync_timestamp=1614619157934&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fruntime-core%2Fdownload%2F%40vue%2Fruntime-core-3.0.7.tgz", 345 | "integrity": "sha1-1EwLClfX45KRKoc2KkQwzPRG7Oo=", 346 | "dependencies": { 347 | "@vue/reactivity": "3.0.7", 348 | "@vue/shared": "3.0.7" 349 | } 350 | }, 351 | "node_modules/@vue/runtime-dom": { 352 | "version": "3.0.7", 353 | "resolved": "https://registry.npm.taobao.org/@vue/runtime-dom/download/@vue/runtime-dom-3.0.7.tgz?cache=0&sync_timestamp=1614619164786&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fruntime-dom%2Fdownload%2F%40vue%2Fruntime-dom-3.0.7.tgz", 354 | "integrity": "sha1-twZo1ykCC8StYIwgNnIj8llXa6Y=", 355 | "dependencies": { 356 | "@vue/runtime-core": "3.0.7", 357 | "@vue/shared": "3.0.7", 358 | "csstype": "^2.6.8" 359 | } 360 | }, 361 | "node_modules/@vue/shared": { 362 | "version": "3.0.7", 363 | "resolved": "https://registry.npm.taobao.org/@vue/shared/download/@vue/shared-3.0.7.tgz?cache=0&sync_timestamp=1614619160213&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fshared%2Fdownload%2F%40vue%2Fshared-3.0.7.tgz", 364 | "integrity": "sha1-ltUpiO/AdETBCMfGgDunzJPkAEU=" 365 | }, 366 | "node_modules/ansi-colors": { 367 | "version": "4.1.3", 368 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 369 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 370 | "engines": { 371 | "node": ">=6" 372 | } 373 | }, 374 | "node_modules/ansi-sequence-parser": { 375 | "version": "1.1.0", 376 | "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz", 377 | "integrity": "sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==", 378 | "peer": true 379 | }, 380 | "node_modules/base64-js": { 381 | "version": "1.5.1", 382 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 383 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 384 | "funding": [ 385 | { 386 | "type": "github", 387 | "url": "https://github.com/sponsors/feross" 388 | }, 389 | { 390 | "type": "patreon", 391 | "url": "https://www.patreon.com/feross" 392 | }, 393 | { 394 | "type": "consulting", 395 | "url": "https://feross.org/support" 396 | } 397 | ], 398 | "peer": true 399 | }, 400 | "node_modules/big.js": { 401 | "version": "5.2.2", 402 | "resolved": "https://registry.npm.taobao.org/big.js/download/big.js-5.2.2.tgz", 403 | "integrity": "sha1-ZfCvOC9Xi83HQr2cKB6cstd2gyg=", 404 | "dev": true, 405 | "engines": { 406 | "node": "*" 407 | } 408 | }, 409 | "node_modules/bluebird": { 410 | "version": "3.7.2", 411 | "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.7.2.tgz", 412 | "integrity": "sha1-nyKcFb4nJFT/qXOs4NvueaGww28=", 413 | "dev": true 414 | }, 415 | "node_modules/buffer": { 416 | "version": "6.0.3", 417 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 418 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 419 | "funding": [ 420 | { 421 | "type": "github", 422 | "url": "https://github.com/sponsors/feross" 423 | }, 424 | { 425 | "type": "patreon", 426 | "url": "https://www.patreon.com/feross" 427 | }, 428 | { 429 | "type": "consulting", 430 | "url": "https://feross.org/support" 431 | } 432 | ], 433 | "peer": true, 434 | "dependencies": { 435 | "base64-js": "^1.3.1", 436 | "ieee754": "^1.2.1" 437 | } 438 | }, 439 | "node_modules/copy-anything": { 440 | "version": "2.0.3", 441 | "resolved": "https://registry.npm.taobao.org/copy-anything/download/copy-anything-2.0.3.tgz", 442 | "integrity": "sha1-hCQHugJGaw34RIGbvjuuu+XUXYc=", 443 | "dev": true, 444 | "dependencies": { 445 | "is-what": "^3.12.0" 446 | } 447 | }, 448 | "node_modules/cssesc": { 449 | "version": "3.0.0", 450 | "resolved": "https://registry.npm.taobao.org/cssesc/download/cssesc-3.0.0.tgz", 451 | "integrity": "sha1-N3QZGZA7hoVl4cCep0dEXNGJg+4=", 452 | "dev": true, 453 | "bin": { 454 | "cssesc": "bin/cssesc" 455 | }, 456 | "engines": { 457 | "node": ">=4" 458 | } 459 | }, 460 | "node_modules/csstype": { 461 | "version": "2.6.16", 462 | "resolved": "https://registry.npm.taobao.org/csstype/download/csstype-2.6.16.tgz?cache=0&sync_timestamp=1614159885468&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcsstype%2Fdownload%2Fcsstype-2.6.16.tgz", 463 | "integrity": "sha1-VE1p9UcBO4WkDRW/912zjzT+nDk=" 464 | }, 465 | "node_modules/debug": { 466 | "version": "4.3.4", 467 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 468 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 469 | "peer": true, 470 | "dependencies": { 471 | "ms": "2.1.2" 472 | }, 473 | "engines": { 474 | "node": ">=6.0" 475 | }, 476 | "peerDependenciesMeta": { 477 | "supports-color": { 478 | "optional": true 479 | } 480 | } 481 | }, 482 | "node_modules/domino": { 483 | "version": "2.1.6", 484 | "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", 485 | "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" 486 | }, 487 | "node_modules/dotenv": { 488 | "version": "8.2.0", 489 | "resolved": "https://registry.npm.taobao.org/dotenv/download/dotenv-8.2.0.tgz", 490 | "integrity": "sha1-l+YZJZradQ7qPk6j4mvO6lQksWo=", 491 | "dev": true, 492 | "engines": { 493 | "node": ">=8" 494 | } 495 | }, 496 | "node_modules/emojis-list": { 497 | "version": "3.0.0", 498 | "resolved": "https://registry.npm.taobao.org/emojis-list/download/emojis-list-3.0.0.tgz", 499 | "integrity": "sha1-VXBmIEatKeLpFucariYKvf9Pang=", 500 | "dev": true, 501 | "engines": { 502 | "node": ">= 4" 503 | } 504 | }, 505 | "node_modules/err-code": { 506 | "version": "3.0.1", 507 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz", 508 | "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA==", 509 | "peer": true 510 | }, 511 | "node_modules/errno": { 512 | "version": "0.1.7", 513 | "resolved": "https://registry.npm.taobao.org/errno/download/errno-0.1.7.tgz", 514 | "integrity": "sha1-RoTXF3mtOa8Xfj8AeZb3xnyFJhg=", 515 | "dev": true, 516 | "optional": true, 517 | "dependencies": { 518 | "prr": "~1.0.1" 519 | }, 520 | "bin": { 521 | "errno": "cli.js" 522 | } 523 | }, 524 | "node_modules/esbuild": { 525 | "version": "0.9.3", 526 | "resolved": "https://registry.npm.taobao.org/esbuild/download/esbuild-0.9.3.tgz?cache=0&sync_timestamp=1615968988121&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fesbuild%2Fdownload%2Fesbuild-0.9.3.tgz", 527 | "integrity": "sha1-CSk6C4JBWcaqJIjRxsIvV9hEj3Q=", 528 | "dev": true, 529 | "hasInstallScript": true, 530 | "bin": { 531 | "esbuild": "bin/esbuild" 532 | } 533 | }, 534 | "node_modules/estree-walker": { 535 | "version": "2.0.2", 536 | "resolved": "https://registry.npm.taobao.org/estree-walker/download/estree-walker-2.0.2.tgz", 537 | "integrity": "sha1-UvAQF4wqTBF6d1fP6UKtt9LaTKw=" 538 | }, 539 | "node_modules/flexsearch": { 540 | "version": "0.7.21", 541 | "resolved": "https://registry.npmjs.org/flexsearch/-/flexsearch-0.7.21.tgz", 542 | "integrity": "sha512-W7cHV7Hrwjid6lWmy0IhsWDFQboWSng25U3VVywpHOTJnnAZNPScog67G+cVpeX9f7yDD21ih0WDrMMT+JoaYg==", 543 | "peer": true 544 | }, 545 | "node_modules/fractional-indexing": { 546 | "version": "3.2.0", 547 | "resolved": "https://registry.npmjs.org/fractional-indexing/-/fractional-indexing-3.2.0.tgz", 548 | "integrity": "sha512-PcOxmqwYCW7O2ovKRU8OoQQj2yqTfEB/yeTYk4gPid6dN5ODRfU1hXd9tTVZzax/0NkO7AxpHykvZnT1aYp/BQ==", 549 | "peer": true, 550 | "engines": { 551 | "node": "^14.13.1 || >=16.0.0" 552 | } 553 | }, 554 | "node_modules/function-bind": { 555 | "version": "1.1.1", 556 | "resolved": "https://registry.npm.taobao.org/function-bind/download/function-bind-1.1.1.tgz", 557 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", 558 | "dev": true 559 | }, 560 | "node_modules/generic-names": { 561 | "version": "2.0.1", 562 | "resolved": "https://registry.npm.taobao.org/generic-names/download/generic-names-2.0.1.tgz?cache=0&sync_timestamp=1603545201878&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgeneric-names%2Fdownload%2Fgeneric-names-2.0.1.tgz", 563 | "integrity": "sha1-+KN46tLMqno08DF7BVVIMq5BuHI=", 564 | "dev": true, 565 | "dependencies": { 566 | "loader-utils": "^1.1.0" 567 | } 568 | }, 569 | "node_modules/get-browser-rtc": { 570 | "version": "1.1.0", 571 | "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz", 572 | "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ==", 573 | "peer": true 574 | }, 575 | "node_modules/graceful-fs": { 576 | "version": "4.2.4", 577 | "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.2.4.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fgraceful-fs%2Fdownload%2Fgraceful-fs-4.2.4.tgz", 578 | "integrity": "sha1-Ila94U02MpWMRl68ltxGfKB6Kfs=", 579 | "dev": true, 580 | "optional": true 581 | }, 582 | "node_modules/has": { 583 | "version": "1.0.3", 584 | "resolved": "https://registry.npm.taobao.org/has/download/has-1.0.3.tgz", 585 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", 586 | "dev": true, 587 | "dependencies": { 588 | "function-bind": "^1.1.1" 589 | }, 590 | "engines": { 591 | "node": ">= 0.4.0" 592 | } 593 | }, 594 | "node_modules/hotkeys-js": { 595 | "version": "3.10.1", 596 | "resolved": "https://registry.npmjs.org/hotkeys-js/-/hotkeys-js-3.10.1.tgz", 597 | "integrity": "sha512-mshqjgTqx8ee0qryHvRgZaZDxTwxam/2yTQmQlqAWS3+twnq1jsY9Yng9zB7lWq6WRrjTbTOc7knNwccXQiAjQ==", 598 | "peer": true 599 | }, 600 | "node_modules/icss-replace-symbols": { 601 | "version": "1.1.0", 602 | "resolved": "https://registry.npm.taobao.org/icss-replace-symbols/download/icss-replace-symbols-1.1.0.tgz", 603 | "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", 604 | "dev": true 605 | }, 606 | "node_modules/idb-keyval": { 607 | "version": "6.2.0", 608 | "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.0.tgz", 609 | "integrity": "sha512-uw+MIyQn2jl3+hroD7hF8J7PUviBU7BPKWw4f/ISf32D4LoGu98yHjrzWWJDASu9QNrX10tCJqk9YY0ClWm8Ng==", 610 | "peer": true, 611 | "dependencies": { 612 | "safari-14-idb-fix": "^3.0.0" 613 | } 614 | }, 615 | "node_modules/ieee754": { 616 | "version": "1.2.1", 617 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 618 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 619 | "funding": [ 620 | { 621 | "type": "github", 622 | "url": "https://github.com/sponsors/feross" 623 | }, 624 | { 625 | "type": "patreon", 626 | "url": "https://www.patreon.com/feross" 627 | }, 628 | { 629 | "type": "consulting", 630 | "url": "https://feross.org/support" 631 | } 632 | ], 633 | "peer": true 634 | }, 635 | "node_modules/image-size": { 636 | "version": "0.5.5", 637 | "resolved": "https://registry.npm.taobao.org/image-size/download/image-size-0.5.5.tgz", 638 | "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", 639 | "dev": true, 640 | "optional": true, 641 | "bin": { 642 | "image-size": "bin/image-size.js" 643 | }, 644 | "engines": { 645 | "node": ">=0.10.0" 646 | } 647 | }, 648 | "node_modules/indexes-of": { 649 | "version": "1.0.1", 650 | "resolved": "https://registry.npm.taobao.org/indexes-of/download/indexes-of-1.0.1.tgz", 651 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", 652 | "dev": true 653 | }, 654 | "node_modules/inherits": { 655 | "version": "2.0.4", 656 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 657 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 658 | "peer": true 659 | }, 660 | "node_modules/is-core-module": { 661 | "version": "2.2.0", 662 | "resolved": "https://registry.npm.taobao.org/is-core-module/download/is-core-module-2.2.0.tgz?cache=0&sync_timestamp=1606413651726&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fis-core-module%2Fdownload%2Fis-core-module-2.2.0.tgz", 663 | "integrity": "sha1-lwN+89UiJNhRY/VZeytj2a/tmBo=", 664 | "dev": true, 665 | "dependencies": { 666 | "has": "^1.0.3" 667 | }, 668 | "funding": { 669 | "url": "https://github.com/sponsors/ljharb" 670 | } 671 | }, 672 | "node_modules/is-what": { 673 | "version": "3.14.1", 674 | "resolved": "https://registry.npm.taobao.org/is-what/download/is-what-3.14.1.tgz", 675 | "integrity": "sha1-4SIvRt3ahd6tD9HJ3xMXYOd3VcE=", 676 | "dev": true 677 | }, 678 | "node_modules/isomorphic.js": { 679 | "version": "0.2.5", 680 | "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz", 681 | "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==", 682 | "peer": true, 683 | "funding": { 684 | "type": "GitHub Sponsors ❤", 685 | "url": "https://github.com/sponsors/dmonad" 686 | } 687 | }, 688 | "node_modules/json5": { 689 | "version": "1.0.1", 690 | "resolved": "https://registry.npm.taobao.org/json5/download/json5-1.0.1.tgz", 691 | "integrity": "sha1-d5+wAYYE+oVOrL9iUhgNg1Q+Pb4=", 692 | "dev": true, 693 | "dependencies": { 694 | "minimist": "^1.2.0" 695 | }, 696 | "bin": { 697 | "json5": "lib/cli.js" 698 | } 699 | }, 700 | "node_modules/jsonc-parser": { 701 | "version": "3.2.0", 702 | "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", 703 | "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", 704 | "peer": true 705 | }, 706 | "node_modules/ky": { 707 | "version": "0.33.3", 708 | "resolved": "https://registry.npmjs.org/ky/-/ky-0.33.3.tgz", 709 | "integrity": "sha512-CasD9OCEQSFIam2U8efFK81Yeg8vNMTBUqtMOHlrcWQHqUX3HeCl9Dr31u4toV7emlH8Mymk5+9p0lL6mKb/Xw==", 710 | "peer": true, 711 | "engines": { 712 | "node": ">=14.16" 713 | }, 714 | "funding": { 715 | "url": "https://github.com/sindresorhus/ky?sponsor=1" 716 | } 717 | }, 718 | "node_modules/less": { 719 | "version": "3.13.1", 720 | "resolved": "https://registry.npm.taobao.org/less/download/less-3.13.1.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fless%2Fdownload%2Fless-3.13.1.tgz", 721 | "integrity": "sha1-DryR0qDpwMZzW4PUlrCrBYMHeQk=", 722 | "dev": true, 723 | "dependencies": { 724 | "copy-anything": "^2.0.1", 725 | "tslib": "^1.10.0" 726 | }, 727 | "bin": { 728 | "lessc": "bin/lessc" 729 | }, 730 | "engines": { 731 | "node": ">=6" 732 | }, 733 | "optionalDependencies": { 734 | "errno": "^0.1.1", 735 | "graceful-fs": "^4.1.2", 736 | "image-size": "~0.5.0", 737 | "make-dir": "^2.1.0", 738 | "mime": "^1.4.1", 739 | "native-request": "^1.0.5", 740 | "source-map": "~0.6.0" 741 | } 742 | }, 743 | "node_modules/less/node_modules/mime": { 744 | "version": "1.6.0", 745 | "resolved": "https://registry.npm.taobao.org/mime/download/mime-1.6.0.tgz", 746 | "integrity": "sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=", 747 | "dev": true, 748 | "optional": true, 749 | "bin": { 750 | "mime": "cli.js" 751 | }, 752 | "engines": { 753 | "node": ">=4" 754 | } 755 | }, 756 | "node_modules/lib0": { 757 | "version": "0.2.73", 758 | "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.73.tgz", 759 | "integrity": "sha512-aJJIElCLWnHMcYZPtsM07QoSfHwpxCy4VUzBYGXFYEmh/h2QS5uZNbCCfL0CqnkOE30b7Tp9DVfjXag+3qzZjQ==", 760 | "peer": true, 761 | "dependencies": { 762 | "isomorphic.js": "^0.2.4" 763 | }, 764 | "bin": { 765 | "0gentesthtml": "bin/gentesthtml.js", 766 | "0serve": "bin/0serve.js" 767 | }, 768 | "engines": { 769 | "node": ">=14" 770 | }, 771 | "funding": { 772 | "type": "GitHub Sponsors ❤", 773 | "url": "https://github.com/sponsors/dmonad" 774 | } 775 | }, 776 | "node_modules/lit": { 777 | "version": "2.7.0", 778 | "resolved": "https://registry.npmjs.org/lit/-/lit-2.7.0.tgz", 779 | "integrity": "sha512-qSy2BAVA+OiWtNptP404egcC/izDdNRw6iHGIbUmkZtbMJvPKfNsaoKrNs8Zmsbjmv5ZX2tur1l9TfzkSWWT4g==", 780 | "dependencies": { 781 | "@lit/reactive-element": "^1.6.0", 782 | "lit-element": "^3.3.0", 783 | "lit-html": "^2.7.0" 784 | } 785 | }, 786 | "node_modules/lit-element": { 787 | "version": "3.3.0", 788 | "resolved": "https://registry.npmjs.org/lit-element/-/lit-element-3.3.0.tgz", 789 | "integrity": "sha512-M3OIoblNS7LZdRxOIk8g0wyLEA/lRw/UGJ1TX+767OpkuDsRdSoxBIvewpWqCo7sMd9xt1XedUNZIr9jUO1X3g==", 790 | "dependencies": { 791 | "@lit-labs/ssr-dom-shim": "^1.1.0", 792 | "@lit/reactive-element": "^1.3.0", 793 | "lit-html": "^2.7.0" 794 | } 795 | }, 796 | "node_modules/lit-html": { 797 | "version": "2.7.0", 798 | "resolved": "https://registry.npmjs.org/lit-html/-/lit-html-2.7.0.tgz", 799 | "integrity": "sha512-/zPOl8EfeB3HHpTzINSpnWgvgQ8N07g/j272EOAIyB0Ys2RzBqTVT23i+JZuUlNbB2WHHeSsTCFi92NtWrtpqQ==", 800 | "dependencies": { 801 | "@types/trusted-types": "^2.0.2" 802 | } 803 | }, 804 | "node_modules/loader-utils": { 805 | "version": "1.4.0", 806 | "resolved": "https://registry.npm.taobao.org/loader-utils/download/loader-utils-1.4.0.tgz", 807 | "integrity": "sha1-xXm140yzSxp07cbB+za/o3HVphM=", 808 | "dev": true, 809 | "dependencies": { 810 | "big.js": "^5.2.2", 811 | "emojis-list": "^3.0.0", 812 | "json5": "^1.0.1" 813 | }, 814 | "engines": { 815 | "node": ">=4.0.0" 816 | } 817 | }, 818 | "node_modules/lodash.camelcase": { 819 | "version": "4.3.0", 820 | "resolved": "https://registry.npm.taobao.org/lodash.camelcase/download/lodash.camelcase-4.3.0.tgz?cache=0&sync_timestamp=1577806297529&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash.camelcase%2Fdownload%2Flodash.camelcase-4.3.0.tgz", 821 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", 822 | "dev": true 823 | }, 824 | "node_modules/lru-cache": { 825 | "version": "5.1.1", 826 | "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-5.1.1.tgz", 827 | "integrity": "sha1-HaJ+ZxAnGUdpXa9oSOhH8B2EuSA=", 828 | "dev": true, 829 | "dependencies": { 830 | "yallist": "^3.0.2" 831 | } 832 | }, 833 | "node_modules/magic-string": { 834 | "version": "0.25.7", 835 | "resolved": "https://registry.npm.taobao.org/magic-string/download/magic-string-0.25.7.tgz", 836 | "integrity": "sha1-P0l9b9NMZpxnmNy4IfLvMfVEUFE=", 837 | "dev": true, 838 | "dependencies": { 839 | "sourcemap-codec": "^1.4.4" 840 | } 841 | }, 842 | "node_modules/make-dir": { 843 | "version": "2.1.0", 844 | "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-2.1.0.tgz", 845 | "integrity": "sha1-XwMQ4YuL6JjMBwCSlaMK5B6R5vU=", 846 | "dev": true, 847 | "optional": true, 848 | "dependencies": { 849 | "pify": "^4.0.1", 850 | "semver": "^5.6.0" 851 | }, 852 | "engines": { 853 | "node": ">=6" 854 | } 855 | }, 856 | "node_modules/marked": { 857 | "version": "4.3.0", 858 | "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", 859 | "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", 860 | "bin": { 861 | "marked": "bin/marked.js" 862 | }, 863 | "engines": { 864 | "node": ">= 12" 865 | } 866 | }, 867 | "node_modules/merge": { 868 | "version": "2.1.1", 869 | "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", 870 | "integrity": "sha512-jz+Cfrg9GWOZbQAnDQ4hlVnQky+341Yk5ru8bZSe6sIDTCIg8n9i/u7hSQGSVOF3C7lH6mGtqjkiT9G4wFLL0w==", 871 | "peer": true 872 | }, 873 | "node_modules/merge-source-map": { 874 | "version": "1.1.0", 875 | "resolved": "https://registry.npm.taobao.org/merge-source-map/download/merge-source-map-1.1.0.tgz", 876 | "integrity": "sha1-L93n5gIJOfcJBqaPLXrmheTIxkY=", 877 | "dev": true, 878 | "dependencies": { 879 | "source-map": "^0.6.1" 880 | } 881 | }, 882 | "node_modules/minimist": { 883 | "version": "1.2.5", 884 | "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.5.tgz", 885 | "integrity": "sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI=", 886 | "dev": true 887 | }, 888 | "node_modules/ms": { 889 | "version": "2.1.2", 890 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 891 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 892 | "peer": true 893 | }, 894 | "node_modules/nanoid": { 895 | "version": "3.3.6", 896 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", 897 | "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", 898 | "dev": true, 899 | "funding": [ 900 | { 901 | "type": "github", 902 | "url": "https://github.com/sponsors/ai" 903 | } 904 | ], 905 | "bin": { 906 | "nanoid": "bin/nanoid.cjs" 907 | }, 908 | "engines": { 909 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 910 | } 911 | }, 912 | "node_modules/native-request": { 913 | "version": "1.0.8", 914 | "resolved": "https://registry.npm.taobao.org/native-request/download/native-request-1.0.8.tgz?cache=0&sync_timestamp=1603412804149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fnative-request%2Fdownload%2Fnative-request-1.0.8.tgz", 915 | "integrity": "sha1-j2a/YG4PfqJ8DlmV6y9dA+M65vs=", 916 | "dev": true, 917 | "optional": true 918 | }, 919 | "node_modules/path-parse": { 920 | "version": "1.0.6", 921 | "resolved": "https://registry.npm.taobao.org/path-parse/download/path-parse-1.0.6.tgz", 922 | "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", 923 | "dev": true 924 | }, 925 | "node_modules/perfect-freehand": { 926 | "version": "1.2.0", 927 | "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.0.tgz", 928 | "integrity": "sha512-h/0ikF1M3phW7CwpZ5MMvKnfpHficWoOEyr//KVNTxV4F6deRK1eYMtHyBKEAKFK0aXIEUK9oBvlF6PNXMDsAw==", 929 | "peer": true 930 | }, 931 | "node_modules/picocolors": { 932 | "version": "1.0.0", 933 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", 934 | "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", 935 | "dev": true 936 | }, 937 | "node_modules/pify": { 938 | "version": "4.0.1", 939 | "resolved": "https://registry.npm.taobao.org/pify/download/pify-4.0.1.tgz", 940 | "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=", 941 | "dev": true, 942 | "optional": true, 943 | "engines": { 944 | "node": ">=6" 945 | } 946 | }, 947 | "node_modules/postcss": { 948 | "version": "8.4.21", 949 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", 950 | "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", 951 | "dev": true, 952 | "funding": [ 953 | { 954 | "type": "opencollective", 955 | "url": "https://opencollective.com/postcss/" 956 | }, 957 | { 958 | "type": "tidelift", 959 | "url": "https://tidelift.com/funding/github/npm/postcss" 960 | } 961 | ], 962 | "dependencies": { 963 | "nanoid": "^3.3.4", 964 | "picocolors": "^1.0.0", 965 | "source-map-js": "^1.0.2" 966 | }, 967 | "engines": { 968 | "node": "^10 || ^12 || >=14" 969 | } 970 | }, 971 | "node_modules/postcss-modules": { 972 | "version": "4.0.0", 973 | "resolved": "https://registry.npm.taobao.org/postcss-modules/download/postcss-modules-4.0.0.tgz?cache=0&sync_timestamp=1606641122441&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules%2Fdownload%2Fpostcss-modules-4.0.0.tgz", 974 | "integrity": "sha1-K8fydquI8/Gw+t9svXdy1DtfO5s=", 975 | "dev": true, 976 | "dependencies": { 977 | "generic-names": "^2.0.1", 978 | "icss-replace-symbols": "^1.1.0", 979 | "lodash.camelcase": "^4.3.0", 980 | "postcss-modules-extract-imports": "^3.0.0", 981 | "postcss-modules-local-by-default": "^4.0.0", 982 | "postcss-modules-scope": "^3.0.0", 983 | "postcss-modules-values": "^4.0.0", 984 | "string-hash": "^1.1.1" 985 | }, 986 | "peerDependencies": { 987 | "postcss": "^8.0.0" 988 | } 989 | }, 990 | "node_modules/postcss-modules/node_modules/icss-utils": { 991 | "version": "5.1.0", 992 | "resolved": "https://registry.npm.taobao.org/icss-utils/download/icss-utils-5.1.0.tgz?cache=0&sync_timestamp=1605801458520&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ficss-utils%2Fdownload%2Ficss-utils-5.1.0.tgz", 993 | "integrity": "sha1-xr5oWKvQE9do6YNmrkfiXViHsa4=", 994 | "dev": true, 995 | "engines": { 996 | "node": "^10 || ^12 || >= 14" 997 | }, 998 | "peerDependencies": { 999 | "postcss": "^8.1.0" 1000 | } 1001 | }, 1002 | "node_modules/postcss-modules/node_modules/postcss-modules-extract-imports": { 1003 | "version": "3.0.0", 1004 | "resolved": "https://registry.npm.taobao.org/postcss-modules-extract-imports/download/postcss-modules-extract-imports-3.0.0.tgz?cache=0&sync_timestamp=1602588202058&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-extract-imports%2Fdownload%2Fpostcss-modules-extract-imports-3.0.0.tgz", 1005 | "integrity": "sha1-zaHwR8CugMl9vijD52pDuIAldB0=", 1006 | "dev": true, 1007 | "engines": { 1008 | "node": "^10 || ^12 || >= 14" 1009 | }, 1010 | "peerDependencies": { 1011 | "postcss": "^8.1.0" 1012 | } 1013 | }, 1014 | "node_modules/postcss-modules/node_modules/postcss-modules-local-by-default": { 1015 | "version": "4.0.0", 1016 | "resolved": "https://registry.npm.taobao.org/postcss-modules-local-by-default/download/postcss-modules-local-by-default-4.0.0.tgz?cache=0&sync_timestamp=1602587625149&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-local-by-default%2Fdownload%2Fpostcss-modules-local-by-default-4.0.0.tgz", 1017 | "integrity": "sha1-67tU+uFZjuz99pGgKz/zs5ClpRw=", 1018 | "dev": true, 1019 | "dependencies": { 1020 | "icss-utils": "^5.0.0", 1021 | "postcss-selector-parser": "^6.0.2", 1022 | "postcss-value-parser": "^4.1.0" 1023 | }, 1024 | "engines": { 1025 | "node": "^10 || ^12 || >= 14" 1026 | }, 1027 | "peerDependencies": { 1028 | "postcss": "^8.1.0" 1029 | } 1030 | }, 1031 | "node_modules/postcss-modules/node_modules/postcss-modules-scope": { 1032 | "version": "3.0.0", 1033 | "resolved": "https://registry.npm.taobao.org/postcss-modules-scope/download/postcss-modules-scope-3.0.0.tgz?cache=0&sync_timestamp=1602593133331&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-scope%2Fdownload%2Fpostcss-modules-scope-3.0.0.tgz", 1034 | "integrity": "sha1-nvMVFFbTu/oSDKRImN/Kby+gHwY=", 1035 | "dev": true, 1036 | "dependencies": { 1037 | "postcss-selector-parser": "^6.0.4" 1038 | }, 1039 | "engines": { 1040 | "node": "^10 || ^12 || >= 14" 1041 | }, 1042 | "peerDependencies": { 1043 | "postcss": "^8.1.0" 1044 | } 1045 | }, 1046 | "node_modules/postcss-modules/node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { 1047 | "version": "6.0.4", 1048 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.4.tgz", 1049 | "integrity": "sha1-VgdaE4CgRgTDiwY+p3Z6Epr1wrM=", 1050 | "dev": true, 1051 | "dependencies": { 1052 | "cssesc": "^3.0.0", 1053 | "indexes-of": "^1.0.1", 1054 | "uniq": "^1.0.1", 1055 | "util-deprecate": "^1.0.2" 1056 | }, 1057 | "engines": { 1058 | "node": ">=4" 1059 | } 1060 | }, 1061 | "node_modules/postcss-modules/node_modules/postcss-modules-values": { 1062 | "version": "4.0.0", 1063 | "resolved": "https://registry.npm.taobao.org/postcss-modules-values/download/postcss-modules-values-4.0.0.tgz?cache=0&sync_timestamp=1602586179271&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpostcss-modules-values%2Fdownload%2Fpostcss-modules-values-4.0.0.tgz", 1064 | "integrity": "sha1-18Xn5ow7s8myfL9Iyguz/7RgLJw=", 1065 | "dev": true, 1066 | "dependencies": { 1067 | "icss-utils": "^5.0.0" 1068 | }, 1069 | "engines": { 1070 | "node": "^10 || ^12 || >= 14" 1071 | }, 1072 | "peerDependencies": { 1073 | "postcss": "^8.1.0" 1074 | } 1075 | }, 1076 | "node_modules/postcss-modules/node_modules/postcss-value-parser": { 1077 | "version": "4.1.0", 1078 | "resolved": "https://registry.npm.taobao.org/postcss-value-parser/download/postcss-value-parser-4.1.0.tgz", 1079 | "integrity": "sha1-RD9qIM7WSBor2k+oUypuVdeJoss=", 1080 | "dev": true 1081 | }, 1082 | "node_modules/postcss-selector-parser": { 1083 | "version": "6.0.2", 1084 | "resolved": "https://registry.npm.taobao.org/postcss-selector-parser/download/postcss-selector-parser-6.0.2.tgz", 1085 | "integrity": "sha1-k0z3mdAWyDQRhZ4J3Oyt4BKG7Fw=", 1086 | "dev": true, 1087 | "dependencies": { 1088 | "cssesc": "^3.0.0", 1089 | "indexes-of": "^1.0.1", 1090 | "uniq": "^1.0.1" 1091 | }, 1092 | "engines": { 1093 | "node": ">=4" 1094 | } 1095 | }, 1096 | "node_modules/prr": { 1097 | "version": "1.0.1", 1098 | "resolved": "https://registry.npm.taobao.org/prr/download/prr-1.0.1.tgz", 1099 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", 1100 | "dev": true, 1101 | "optional": true 1102 | }, 1103 | "node_modules/queue-microtask": { 1104 | "version": "1.2.3", 1105 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 1106 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 1107 | "funding": [ 1108 | { 1109 | "type": "github", 1110 | "url": "https://github.com/sponsors/feross" 1111 | }, 1112 | { 1113 | "type": "patreon", 1114 | "url": "https://www.patreon.com/feross" 1115 | }, 1116 | { 1117 | "type": "consulting", 1118 | "url": "https://feross.org/support" 1119 | } 1120 | ], 1121 | "peer": true 1122 | }, 1123 | "node_modules/randombytes": { 1124 | "version": "2.1.0", 1125 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1126 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1127 | "peer": true, 1128 | "dependencies": { 1129 | "safe-buffer": "^5.1.0" 1130 | } 1131 | }, 1132 | "node_modules/readable-stream": { 1133 | "version": "3.6.2", 1134 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", 1135 | "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", 1136 | "peer": true, 1137 | "dependencies": { 1138 | "inherits": "^2.0.3", 1139 | "string_decoder": "^1.1.1", 1140 | "util-deprecate": "^1.0.1" 1141 | }, 1142 | "engines": { 1143 | "node": ">= 6" 1144 | } 1145 | }, 1146 | "node_modules/rollup": { 1147 | "version": "2.41.5", 1148 | "resolved": "https://registry.npm.taobao.org/rollup/download/rollup-2.41.5.tgz", 1149 | "integrity": "sha1-55zvjMXBIWElKPWQMZY5sfMtotc=", 1150 | "dev": true, 1151 | "bin": { 1152 | "rollup": "dist/bin/rollup" 1153 | }, 1154 | "engines": { 1155 | "node": ">=10.0.0" 1156 | }, 1157 | "optionalDependencies": { 1158 | "fsevents": "~2.3.1" 1159 | } 1160 | }, 1161 | "node_modules/rollup/node_modules/fsevents": { 1162 | "version": "2.3.2", 1163 | "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536512306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", 1164 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", 1165 | "dev": true, 1166 | "hasInstallScript": true, 1167 | "optional": true, 1168 | "os": [ 1169 | "darwin" 1170 | ], 1171 | "engines": { 1172 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1173 | } 1174 | }, 1175 | "node_modules/safari-14-idb-fix": { 1176 | "version": "3.0.0", 1177 | "resolved": "https://registry.npmjs.org/safari-14-idb-fix/-/safari-14-idb-fix-3.0.0.tgz", 1178 | "integrity": "sha512-eBNFLob4PMq8JA1dGyFn6G97q3/WzNtFK4RnzT1fnLq+9RyrGknzYiM/9B12MnKAxuj1IXr7UKYtTNtjyKMBog==", 1179 | "peer": true 1180 | }, 1181 | "node_modules/safe-buffer": { 1182 | "version": "5.2.1", 1183 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1184 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1185 | "funding": [ 1186 | { 1187 | "type": "github", 1188 | "url": "https://github.com/sponsors/feross" 1189 | }, 1190 | { 1191 | "type": "patreon", 1192 | "url": "https://www.patreon.com/feross" 1193 | }, 1194 | { 1195 | "type": "consulting", 1196 | "url": "https://feross.org/support" 1197 | } 1198 | ], 1199 | "peer": true 1200 | }, 1201 | "node_modules/semver": { 1202 | "version": "5.7.1", 1203 | "resolved": "https://registry.npm.taobao.org/semver/download/semver-5.7.1.tgz?cache=0&sync_timestamp=1606854493763&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsemver%2Fdownload%2Fsemver-5.7.1.tgz", 1204 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", 1205 | "dev": true, 1206 | "optional": true, 1207 | "bin": { 1208 | "semver": "bin/semver" 1209 | } 1210 | }, 1211 | "node_modules/shiki": { 1212 | "version": "0.14.1", 1213 | "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.1.tgz", 1214 | "integrity": "sha512-+Jz4nBkCBe0mEDqo1eKRcCdjRtrCjozmcbTUjbPTX7OOJfEbTZzlUWlZtGe3Gb5oV1/jnojhG//YZc3rs9zSEw==", 1215 | "peer": true, 1216 | "dependencies": { 1217 | "ansi-sequence-parser": "^1.1.0", 1218 | "jsonc-parser": "^3.2.0", 1219 | "vscode-oniguruma": "^1.7.0", 1220 | "vscode-textmate": "^8.0.0" 1221 | } 1222 | }, 1223 | "node_modules/simple-peer": { 1224 | "version": "9.11.1", 1225 | "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz", 1226 | "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==", 1227 | "funding": [ 1228 | { 1229 | "type": "github", 1230 | "url": "https://github.com/sponsors/feross" 1231 | }, 1232 | { 1233 | "type": "patreon", 1234 | "url": "https://www.patreon.com/feross" 1235 | }, 1236 | { 1237 | "type": "consulting", 1238 | "url": "https://feross.org/support" 1239 | } 1240 | ], 1241 | "peer": true, 1242 | "dependencies": { 1243 | "buffer": "^6.0.3", 1244 | "debug": "^4.3.2", 1245 | "err-code": "^3.0.1", 1246 | "get-browser-rtc": "^1.1.0", 1247 | "queue-microtask": "^1.2.3", 1248 | "randombytes": "^2.1.0", 1249 | "readable-stream": "^3.6.0" 1250 | } 1251 | }, 1252 | "node_modules/source-map": { 1253 | "version": "0.6.1", 1254 | "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.6.1.tgz", 1255 | "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", 1256 | "engines": { 1257 | "node": ">=0.10.0" 1258 | } 1259 | }, 1260 | "node_modules/source-map-js": { 1261 | "version": "1.0.2", 1262 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", 1263 | "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", 1264 | "dev": true, 1265 | "engines": { 1266 | "node": ">=0.10.0" 1267 | } 1268 | }, 1269 | "node_modules/sourcemap-codec": { 1270 | "version": "1.4.8", 1271 | "resolved": "https://registry.npm.taobao.org/sourcemap-codec/download/sourcemap-codec-1.4.8.tgz", 1272 | "integrity": "sha1-6oBL2UhXQC5pktBaOO8a41qatMQ=", 1273 | "deprecated": "Please use @jridgewell/sourcemap-codec instead", 1274 | "dev": true 1275 | }, 1276 | "node_modules/string_decoder": { 1277 | "version": "1.3.0", 1278 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1279 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1280 | "peer": true, 1281 | "dependencies": { 1282 | "safe-buffer": "~5.2.0" 1283 | } 1284 | }, 1285 | "node_modules/string-hash": { 1286 | "version": "1.1.3", 1287 | "resolved": "https://registry.npm.taobao.org/string-hash/download/string-hash-1.1.3.tgz", 1288 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=", 1289 | "dev": true 1290 | }, 1291 | "node_modules/to-fast-properties": { 1292 | "version": "2.0.0", 1293 | "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", 1294 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1295 | "engines": { 1296 | "node": ">=4" 1297 | } 1298 | }, 1299 | "node_modules/tslib": { 1300 | "version": "1.13.0", 1301 | "resolved": "https://registry.npm.taobao.org/tslib/download/tslib-1.13.0.tgz?cache=0&sync_timestamp=1609887785854&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ftslib%2Fdownload%2Ftslib-1.13.0.tgz", 1302 | "integrity": "sha1-yIHhPMcBWJTtkUhi0nZDb6mkcEM=", 1303 | "dev": true 1304 | }, 1305 | "node_modules/turndown": { 1306 | "version": "7.1.2", 1307 | "resolved": "https://registry.npmjs.org/turndown/-/turndown-7.1.2.tgz", 1308 | "integrity": "sha512-ntI9R7fcUKjqBP6QU8rBK2Ehyt8LAzt3UBT9JR9tgo6GtuKvyUzpayWmeMKJw1DPdXzktvtIT8m2mVXz+bL/Qg==", 1309 | "dependencies": { 1310 | "domino": "^2.1.6" 1311 | } 1312 | }, 1313 | "node_modules/uniq": { 1314 | "version": "1.0.1", 1315 | "resolved": "https://registry.npm.taobao.org/uniq/download/uniq-1.0.1.tgz", 1316 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 1317 | "dev": true 1318 | }, 1319 | "node_modules/util-deprecate": { 1320 | "version": "1.0.2", 1321 | "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", 1322 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1323 | }, 1324 | "node_modules/vite": { 1325 | "version": "2.1.2", 1326 | "resolved": "https://registry.npm.taobao.org/vite/download/vite-2.1.2.tgz", 1327 | "integrity": "sha1-CuyvbTQRKyRTbfGhTNjXT9yrbiA=", 1328 | "dev": true, 1329 | "dependencies": { 1330 | "esbuild": "^0.9.3", 1331 | "postcss": "^8.2.1", 1332 | "resolve": "^1.19.0", 1333 | "rollup": "^2.38.5" 1334 | }, 1335 | "bin": { 1336 | "vite": "bin/vite.js" 1337 | }, 1338 | "engines": { 1339 | "node": ">=12.0.0" 1340 | }, 1341 | "optionalDependencies": { 1342 | "fsevents": "~2.3.1" 1343 | } 1344 | }, 1345 | "node_modules/vite/node_modules/fsevents": { 1346 | "version": "2.3.2", 1347 | "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-2.3.2.tgz?cache=0&sync_timestamp=1612536512306&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Ffsevents%2Fdownload%2Ffsevents-2.3.2.tgz", 1348 | "integrity": "sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=", 1349 | "dev": true, 1350 | "hasInstallScript": true, 1351 | "optional": true, 1352 | "os": [ 1353 | "darwin" 1354 | ], 1355 | "engines": { 1356 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1357 | } 1358 | }, 1359 | "node_modules/vite/node_modules/resolve": { 1360 | "version": "1.20.0", 1361 | "resolved": "https://registry.npm.taobao.org/resolve/download/resolve-1.20.0.tgz", 1362 | "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", 1363 | "dev": true, 1364 | "dependencies": { 1365 | "is-core-module": "^2.2.0", 1366 | "path-parse": "^1.0.6" 1367 | }, 1368 | "funding": { 1369 | "url": "https://github.com/sponsors/ljharb" 1370 | } 1371 | }, 1372 | "node_modules/vscode-oniguruma": { 1373 | "version": "1.7.0", 1374 | "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", 1375 | "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", 1376 | "peer": true 1377 | }, 1378 | "node_modules/vscode-textmate": { 1379 | "version": "8.0.0", 1380 | "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", 1381 | "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", 1382 | "peer": true 1383 | }, 1384 | "node_modules/vue": { 1385 | "version": "3.0.7", 1386 | "resolved": "https://registry.npm.taobao.org/vue/download/vue-3.0.7.tgz", 1387 | "integrity": "sha1-i8/1H4vlcPnkzozF9S4qsP48dKE=", 1388 | "dependencies": { 1389 | "@vue/compiler-dom": "3.0.7", 1390 | "@vue/runtime-dom": "3.0.7", 1391 | "@vue/shared": "3.0.7" 1392 | } 1393 | }, 1394 | "node_modules/vue-router": { 1395 | "version": "4.0.5", 1396 | "resolved": "https://registry.npm.taobao.org/vue-router/download/vue-router-4.0.5.tgz?cache=0&sync_timestamp=1615477493682&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fvue-router%2Fdownload%2Fvue-router-4.0.5.tgz", 1397 | "integrity": "sha1-3QpBNLyVDDeu9kuXPp7hAIQo2Po=", 1398 | "peerDependencies": { 1399 | "vue": "^3.0.0" 1400 | } 1401 | }, 1402 | "node_modules/vuex": { 1403 | "version": "4.0.0", 1404 | "resolved": "https://registry.npm.taobao.org/vuex/download/vuex-4.0.0.tgz", 1405 | "integrity": "sha1-rId6p2qcRTaMl5Rx5GG1INOObPU=", 1406 | "peerDependencies": { 1407 | "vue": "^3.0.2" 1408 | } 1409 | }, 1410 | "node_modules/ws": { 1411 | "version": "7.5.9", 1412 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 1413 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 1414 | "optional": true, 1415 | "peer": true, 1416 | "engines": { 1417 | "node": ">=8.3.0" 1418 | }, 1419 | "peerDependencies": { 1420 | "bufferutil": "^4.0.1", 1421 | "utf-8-validate": "^5.0.2" 1422 | }, 1423 | "peerDependenciesMeta": { 1424 | "bufferutil": { 1425 | "optional": true 1426 | }, 1427 | "utf-8-validate": { 1428 | "optional": true 1429 | } 1430 | } 1431 | }, 1432 | "node_modules/y-protocols": { 1433 | "version": "1.0.5", 1434 | "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.5.tgz", 1435 | "integrity": "sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A==", 1436 | "peer": true, 1437 | "dependencies": { 1438 | "lib0": "^0.2.42" 1439 | }, 1440 | "funding": { 1441 | "type": "GitHub Sponsors ❤", 1442 | "url": "https://github.com/sponsors/dmonad" 1443 | } 1444 | }, 1445 | "node_modules/y-webrtc": { 1446 | "version": "10.2.5", 1447 | "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.5.tgz", 1448 | "integrity": "sha512-ZyBNvTI5L28sQ2PQI0T/JvyWgvuTq05L21vGkIlcvNLNSJqAaLCBJRe3FHEqXoaogqWmRcEAKGfII4ErNXMnNw==", 1449 | "peer": true, 1450 | "dependencies": { 1451 | "lib0": "^0.2.42", 1452 | "simple-peer": "^9.11.0", 1453 | "y-protocols": "^1.0.5" 1454 | }, 1455 | "bin": { 1456 | "y-webrtc-signaling": "bin/server.js" 1457 | }, 1458 | "engines": { 1459 | "node": ">=12" 1460 | }, 1461 | "funding": { 1462 | "type": "GitHub Sponsors ❤", 1463 | "url": "https://github.com/sponsors/dmonad" 1464 | }, 1465 | "optionalDependencies": { 1466 | "ws": "^7.2.0" 1467 | } 1468 | }, 1469 | "node_modules/yallist": { 1470 | "version": "3.1.1", 1471 | "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-3.1.1.tgz", 1472 | "integrity": "sha1-27fa+b/YusmrRev2ArjLrQ1dCP0=", 1473 | "dev": true 1474 | }, 1475 | "node_modules/yjs": { 1476 | "version": "13.5.51", 1477 | "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.5.51.tgz", 1478 | "integrity": "sha512-F1Nb3z3TdandD80IAeQqgqy/2n9AhDLcXoBhZvCUX1dNVe0ef7fIwi6MjSYaGAYF2Ev8VcLcsGnmuGGOl7AWbw==", 1479 | "peer": true, 1480 | "dependencies": { 1481 | "lib0": "^0.2.72" 1482 | }, 1483 | "engines": { 1484 | "node": ">=16.0.0", 1485 | "npm": ">=8.0.0" 1486 | }, 1487 | "funding": { 1488 | "type": "GitHub Sponsors ❤", 1489 | "url": "https://github.com/sponsors/dmonad" 1490 | } 1491 | }, 1492 | "node_modules/zod": { 1493 | "version": "3.21.4", 1494 | "resolved": "https://registry.npmjs.org/zod/-/zod-3.21.4.tgz", 1495 | "integrity": "sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==", 1496 | "funding": { 1497 | "url": "https://github.com/sponsors/colinhacks" 1498 | } 1499 | } 1500 | } 1501 | } 1502 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aregrid-mindnote", 3 | "version": "1.0.0", 4 | "private": true, 5 | "author": "zhangchi", 6 | "scripts": { 7 | "dev": "NODE_ENV=development vite", 8 | "build": "NODE_ENV=production vite build", 9 | "docs": "NODE_ENV=production vite build && git add . && git commit -m 'docs pub' && git push origin master" 10 | }, 11 | "dependencies": { 12 | "@blocksuite/editor": "^0.5.0-20230326033652-70ca43c", 13 | "vue": "^3.0.5", 14 | "vue-router": "^4.0.0-rc.2", 15 | "vuex": "^4.0.0-rc.1" 16 | }, 17 | "devDependencies": { 18 | "@vitejs/plugin-vue": "^1.1.5", 19 | "@vue/compiler-sfc": "^3.0.5", 20 | "dotenv": "^8.2.0", 21 | "less": "^3.13.0", 22 | "vite": "^2.0.4" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/components/MindmapView/MindmapView.js: -------------------------------------------------------------------------------- 1 | import * as utils from "../../utils/util"; 2 | import TreeNode from "./TreeNode.js"; 3 | import treeProperties from "./TreeProperties.js"; 4 | import parseList from "./Parser.js"; 5 | 6 | function MindmapView(opts) { 7 | this.el = opts.el; // container 8 | this.currentTree = undefined; 9 | this.treeProperties = {}; 10 | this.sourceCode = opts.sourceCode; 11 | for (var propName in treeProperties) { 12 | this.treeProperties[propName] = treeProperties[propName].val; 13 | } 14 | this.parseSource(); 15 | } 16 | MindmapView.prototype = { 17 | parseSource: function () { 18 | console.log("Parsing..."); 19 | 20 | try { 21 | console.log(222); 22 | console.log(this.sourceCode); 23 | var parsed = parseList(this.sourceCode); 24 | console.log(parsed); 25 | } catch (err) { 26 | console.log("Error sourceCode parse fail"); 27 | 28 | return; 29 | } 30 | 31 | if (parsed.children.length == 0) return; 32 | parsed = parsed.children[0]; 33 | 34 | try { 35 | if (treeProperties["textFilter"].val != "") { 36 | this.textFilter = new RegExp(treeProperties["textFilter"].val); 37 | } else { 38 | this.textFilter = new RegExp(".+"); 39 | } 40 | } catch (err) { 41 | console.log(err); 42 | return; 43 | } 44 | 45 | this.currentTree = this.parseObjectBranch(parsed, true); 46 | this.regenerateDiagram(); 47 | }, 48 | 49 | parseObjectBranch: function (branch, isRoot = false) { 50 | var node = new TreeNode(branch.label, isRoot); 51 | 52 | for (var child of branch.children) { 53 | if (this.textFilter.test(child.label)) { 54 | node.addChild(this.parseObjectBranch(child, false)); 55 | } 56 | } 57 | 58 | return node; 59 | }, 60 | 61 | regenerateDiagram: function () { 62 | var canvas = this.el; 63 | var ctx = canvas.getContext("2d"); 64 | 65 | if (!(this.currentTree instanceof TreeNode)) { 66 | console.log("Not a valid tree", this.currentTree); 67 | return; 68 | } 69 | 70 | //dDraw the mindmap 71 | var beautifulDrawing = this.currentTree.draw(); 72 | 73 | // resize canvas to the size of the mindmap plus some margin 74 | canvas.width = beautifulDrawing.width + 25; 75 | canvas.height = beautifulDrawing.height + 25; 76 | 77 | // console.log("Canvas", canvas.width, canvas.height); 78 | 79 | // draw the mindmap onto the existing canvas 80 | ctx.drawImage(beautifulDrawing, 25, 25); 81 | }, 82 | 83 | buildGlobalProperties: function () { 84 | for (var propName in treeProperties) { 85 | if ("textFilter" != propName) { 86 | treeProperties[propName].val = Number(this.treeProperties[propName]); 87 | } else { 88 | treeProperties[propName].val = this.treeProperties[propName]; 89 | } 90 | } 91 | this.parseSource(); 92 | }, 93 | }; 94 | 95 | export default MindmapView; 96 | -------------------------------------------------------------------------------- /src/components/MindmapView/Parser.js: -------------------------------------------------------------------------------- 1 | export default function parseList(text) { 2 | var items = { label: "ROOT", children: [], depth: -1 }; 3 | var lines = text.split("\n"); 4 | lines = lines.filter((c) => !c.match(/^\s*$/)); // Remove blank lines 5 | 6 | var currentParent = items; 7 | var currentParentDepth = -1; 8 | 9 | var currentItemLabel = ""; 10 | var currentItemDepth; 11 | 12 | for (var line of lines) { 13 | var itemMatch = line.match(/^( *)-\s*(.*)$/); 14 | 15 | // New item 16 | if (itemMatch) { 17 | // Store previous item (if any) 18 | if (currentItemLabel != "") { 19 | // Build the node for the previously read node 20 | var node = { 21 | label: currentItemLabel, 22 | children: [], 23 | parent: currentParent, 24 | depth: currentItemDepth, 25 | }; 26 | 27 | // Store the node within its parent 28 | currentParent["children"].push(node); 29 | 30 | // Set the new "parent" to the previous item 31 | currentParent = node; 32 | currentParentDepth = node.depth; 33 | } 34 | 35 | // Fetch the data from the newly-read item 36 | currentItemDepth = itemMatch[1].length; 37 | currentItemLabel = itemMatch[2]; 38 | 39 | // If the parent is deeper than the new item, switch the parent 40 | // to one with lower depth than current item 41 | while (currentItemDepth <= currentParentDepth) { 42 | currentParent = currentParent["parent"]; 43 | currentParentDepth = currentParent["depth"]; 44 | } 45 | } 46 | // Continued string from previous item 47 | else { 48 | currentItemLabel += "\n" + line; 49 | } 50 | } 51 | 52 | // Force insert last item 53 | if (currentItemLabel) { 54 | var node = { 55 | label: currentItemLabel, 56 | children: [], 57 | parent: currentParent, 58 | depth: currentParentDepth + 1, 59 | }; 60 | currentParent["children"].push(node); 61 | } 62 | 63 | return items; 64 | } 65 | -------------------------------------------------------------------------------- /src/components/MindmapView/TreeNode.js: -------------------------------------------------------------------------------- 1 | import * as utils from "../../utils/util"; 2 | import treeProperties from "./TreeProperties"; 3 | 4 | var fontFamily = "Open Sans"; 5 | 6 | var labelPaddingBottom = 8; 7 | var labelPaddingRight = 10; 8 | 9 | var DEBUG = false; 10 | 11 | export default class TreeNode { 12 | constructor(label, isRoot = false) { 13 | this.label = label; 14 | this.labelLines = this.label.split("\n"); 15 | this.isRoot = isRoot; 16 | this.parent = undefined; 17 | this.children = []; 18 | } 19 | 20 | get isLeaf() { 21 | return this.children.length == 0; 22 | } 23 | 24 | addChild(child) { 25 | child.parent = this; 26 | this.children.push(child); 27 | } 28 | 29 | addChildren(...children) { 30 | for (var child of children) { 31 | this.addChild(child); 32 | } 33 | } 34 | 35 | draw(currentBranchColor) { 36 | var that = this; 37 | 38 | var dl = function (x, y, c = "#00ff00", w = 100) { 39 | that.ctx.fillStyle = c; 40 | that.ctx.fillRect(x, y, w, 1); 41 | }; 42 | 43 | var dr = function (x, y, w, h, c = "#00ff00") { 44 | that.ctx.lineWidth = 1; 45 | that.ctx.strokeStyle = c; 46 | that.ctx.rect(x, y, w, h); 47 | that.ctx.stroke(); 48 | }; 49 | 50 | this.canvas = document.createElement("canvas"); 51 | this.ctx = this.canvas.getContext("2d"); 52 | 53 | // The width of the label will be the width of the widest line 54 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily; 55 | 56 | // The height of the lines of text (only) 57 | this.textHeight = treeProperties.fontSize.val * this.labelLines.length; 58 | 59 | // The height of the text + the separation from the line + the line height + the label margin 60 | this.composedHeight = 61 | this.textHeight + 62 | labelPaddingBottom + 63 | treeProperties.connectorLineWidth.val; 64 | 65 | // The composed height plus the margin 66 | this.paddedHeight = this.composedHeight + treeProperties.nodeMarginTop.val; 67 | 68 | this.labelHeight = 69 | treeProperties.nodeMarginTop.val + // top margin 70 | treeProperties.fontSize.val * (this.labelLines.length + 1) + // text lines' height 71 | treeProperties.nodeMarginBottom.val; // bottom margin 72 | 73 | this.labelWidth = Math.ceil( 74 | Math.max(...this.labelLines.map((c) => this.ctx.measureText(c).width)) 75 | ); 76 | 77 | if (this.isLeaf) { 78 | // Resize the canvas 79 | this.canvas.width = this.labelWidth + labelPaddingRight * 2; 80 | this.canvas.height = this.labelHeight; 81 | 82 | // Set the font 83 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily; 84 | 85 | // Draw the text lines 86 | for (var i = 0; i < this.labelLines.length; i++) { 87 | this.ctx.fillText( 88 | this.labelLines[i], 89 | 0, 90 | treeProperties.fontSize.val * (i + 1) + 91 | treeProperties.nodeMarginTop.val 92 | ); 93 | } 94 | 95 | // The anchorPoint defines where the line should start 96 | this.anchorPoint = { 97 | x: 0, 98 | y: 99 | this.labelLines.length * treeProperties.fontSize.val + 100 | labelPaddingBottom + 101 | treeProperties.nodeMarginTop.val, 102 | }; 103 | } else { 104 | // If this is the root, we need to generate a random color for each branch 105 | if (this.isRoot) { 106 | var branchColors = this.children.map((c) => 107 | utils.generateRandomColor(treeProperties.useGrayscale) 108 | ); 109 | var canvases = this.children.map((c, i) => c.draw(branchColors[i])); 110 | } 111 | 112 | // Otherwise, use the received branchColor 113 | else { 114 | var canvases = this.children.map((c, i) => c.draw(currentBranchColor)); 115 | } 116 | 117 | // Get the vertical positions for the children 118 | var childrenVerticalPositions = [0]; 119 | 120 | // Each position is the sum of the acumulated heights of the previous elements 121 | for (var i = 0; i < canvases.length; i++) { 122 | childrenVerticalPositions[i + 1] = 123 | childrenVerticalPositions[i] + canvases[i].height; 124 | } 125 | 126 | let childrenHeight = childrenVerticalPositions[canvases.length]; 127 | 128 | this.anchorPoint = { x: this.isRoot ? 10 : 0, y: 0 }; 129 | 130 | /* 131 | If the height of the children is smaller than the height of the node, take the height of the node and 132 | don't center it vertically. 133 | Otherwise, take the max between 2*height of the node and the children height, and center it vertically. 134 | */ 135 | 136 | if ( 137 | childrenHeight < 138 | this.composedHeight + treeProperties.nodeMarginTop.val * 2 139 | ) { 140 | this.canvas.height = 141 | this.composedHeight + treeProperties.nodeMarginTop.val * 2; 142 | this.anchorPoint.y = this.canvas.height / 2 + this.composedHeight / 2; 143 | } else { 144 | this.canvas.height = Math.max( 145 | childrenVerticalPositions[canvases.length], 146 | this.composedHeight * 2 147 | ); 148 | this.anchorPoint.y = this.canvas.height / 2; 149 | } 150 | 151 | console.log( 152 | this.label, 153 | this.canvas.height, 154 | childrenVerticalPositions[canvases.length] 155 | ); 156 | 157 | // Compute left margin (label width + separation) 158 | var leftMargin = 10 + this.labelWidth + treeProperties.connectorWidth.val; 159 | 160 | // Set the width to the leftMargin plus the width of the widest child branch 161 | this.canvas.width = 162 | leftMargin + Math.max(...canvases.map((c) => c.width)); 163 | this.ctx.font = treeProperties.fontSize.val + "px " + fontFamily; 164 | 165 | // Draw each child 166 | for (var i = 0; i < canvases.length; i++) { 167 | if (this.isRoot) { 168 | currentBranchColor = branchColors[i]; 169 | } 170 | 171 | this.ctx.drawImage( 172 | canvases[i], 173 | leftMargin, 174 | childrenVerticalPositions[i] 175 | ); 176 | 177 | var connector_a = { 178 | x: this.anchorPoint.x + this.labelWidth + labelPaddingRight, 179 | y: this.anchorPoint.y, 180 | }; 181 | 182 | var connector_b = { 183 | x: leftMargin, 184 | y: childrenVerticalPositions[i] + this.children[i].anchorPoint.y, 185 | }; 186 | 187 | this.ctx.beginPath(); 188 | this.ctx.moveTo(connector_a.x, connector_a.y); 189 | 190 | this.ctx.bezierCurveTo( 191 | connector_a.x + 192 | treeProperties.connectorSteepness.val * 193 | treeProperties.connectorWidth.val, 194 | connector_a.y, 195 | connector_b.x - 196 | treeProperties.connectorSteepness.val * 197 | treeProperties.connectorWidth.val, 198 | connector_b.y, 199 | connector_b.x, 200 | connector_b.y 201 | ); 202 | 203 | this.ctx.lineTo( 204 | connector_b.x + this.children[i].labelWidth + labelPaddingRight, 205 | connector_b.y 206 | ); 207 | this.ctx.lineWidth = treeProperties.connectorLineWidth.val; 208 | this.ctx.lineCap = "round"; 209 | this.ctx.strokeStyle = currentBranchColor; 210 | this.ctx.stroke(); 211 | } 212 | 213 | // For the root node, print a containing rectangle and always center the text 214 | if (this.isRoot) { 215 | this.ctx.fillStyle = "#ffffff"; 216 | this.ctx.lineWidth = 3; 217 | utils.roundRect( 218 | this.ctx, 219 | 2, 220 | this.canvas.height / 2 - 221 | this.labelLines.length * treeProperties.fontSize.val, 222 | this.labelWidth + 18, 223 | treeProperties.fontSize.val * (this.labelLines.length + 1.5), 224 | 5, 225 | true, 226 | true 227 | ); 228 | 229 | this.ctx.fillStyle = "#000000"; 230 | 231 | for (var i = 0; i < this.labelLines.length; i++) { 232 | this.ctx.fillText( 233 | this.labelLines[i], 234 | 10, // Fixed margin from the left 235 | this.canvas.height / 2 + // Vertical center 236 | treeProperties.fontSize.val / 2 - // Middle of the line height 237 | treeProperties.fontSize.val * (this.labelLines.length - i - 1) // Correctly account for multilines 238 | ); 239 | } 240 | } else { 241 | this.ctx.fillStyle = "#000000"; 242 | 243 | for (var i = 0; i < this.labelLines.length; i++) { 244 | this.ctx.fillText( 245 | this.labelLines[i], 246 | 10, // Fixed margin from the left 247 | this.anchorPoint.y - // From the anchor point 248 | labelPaddingBottom - // Move up the padding 249 | treeProperties.fontSize.val * (this.labelLines.length - i - 1) 250 | ); 251 | } 252 | } 253 | } 254 | 255 | if (DEBUG) { 256 | dr(1, 1, this.canvas.width - 1, this.canvas.height - 1); 257 | } 258 | 259 | return this.canvas; 260 | } 261 | } 262 | -------------------------------------------------------------------------------- /src/components/MindmapView/TreeProperties.js: -------------------------------------------------------------------------------- 1 | export default { 2 | textFilter: { label: "Text Filter (regex)", type: "text", val: "." }, 3 | fontSize: { label: "Font size", model: "fontSize", min: 5, max: 50, val: 13 }, 4 | connectorWidth: { 5 | label: "Connector width", 6 | model: "connectorWidth", 7 | min: 20, 8 | max: 100, 9 | val: 65, 10 | }, 11 | connectorSteepness: { 12 | label: "Connector steepness", 13 | min: 0.1, 14 | max: 1, 15 | step: 0.01, 16 | val: 0.65, 17 | }, 18 | connectorLineWidth: { 19 | label: "Line width", 20 | min: 0.5, 21 | max: 10, 22 | step: 0.25, 23 | val: 4.5, 24 | }, 25 | nodeMarginTop: { label: " Top margin", min: 0, max: 50, val: 5 }, 26 | nodeMarginBottom: { label: " Bottom margin", min: 0, max: 50, val: 5 }, 27 | useGrayscale: { label: "Use grayscale", type: "boolean", val: 0 }, 28 | }; 29 | -------------------------------------------------------------------------------- /src/components/MindnoteBox.vue: -------------------------------------------------------------------------------- 1 | 29 | 30 | 167 | 168 | 182 | -------------------------------------------------------------------------------- /src/components/MindnoteCard.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 74 | 75 | 112 | -------------------------------------------------------------------------------- /src/components/MindnoteInput.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 82 | 83 | 92 | -------------------------------------------------------------------------------- /src/components/MindnoteItem.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 65 | 66 | 107 | -------------------------------------------------------------------------------- /src/components/MindnotePage.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 146 | 147 | 208 | -------------------------------------------------------------------------------- /src/components/MindnotePageX.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 168 | 169 | 209 | -------------------------------------------------------------------------------- /src/components/SpacePage.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 107 | 146 | -------------------------------------------------------------------------------- /src/index.css: -------------------------------------------------------------------------------- 1 | #app { 2 | font-family: SourceSansPro, -apple-system, "PingFang SC", "Apple Color Emoji", 3 | BlinkMacSystemFont, Helvetica, Arial, "Segoe UI Emoji", "Segoe UI Symbol", 4 | "Microsoft YaHei", 微软雅黑, 黑体, Heiti, sans-serif, SimSun, 宋体, serif; 5 | -webkit-font-smoothing: antialiased; 6 | -moz-osx-font-smoothing: grayscale; 7 | background-color: #f7f7f7; 8 | } 9 | 10 | :root { 11 | --footer-color: #229999; 12 | --block-border-color: #888; 13 | --block-bg-color: #ffffff; 14 | --block-shadow: 0px 0.5px 2px rgba(0, 0, 0, 0.3); 15 | --block-title-color: #333; 16 | --block-time-color: #555; 17 | } 18 | 19 | * { 20 | margin: 0; 21 | padding: 0; 22 | } 23 | * { 24 | box-sizing: border-box; 25 | } 26 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import router from './router' 2 | 3 | import { createApp } from 'vue' 4 | 5 | import App from './App.vue' 6 | import './index.css' 7 | 8 | 9 | var app = createApp(App); 10 | app.use(router); 11 | 12 | app.mount('#app') 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from "vue-router"; 2 | 3 | const routes = [ 4 | { 5 | path: "/", 6 | name: "SpacePage", 7 | component: () => import("../components/SpacePage.vue"), 8 | }, 9 | { 10 | path: "/mindnote/:mindnoteId", 11 | name: "MindnotePage", 12 | component: () => import("../components/MindnotePageX.vue"), 13 | }, 14 | ]; 15 | 16 | export default createRouter({ 17 | // mode: "history", 18 | history: createWebHistory("/aregrid-mindnote/#/"), // 19 | routes, 20 | }); 21 | -------------------------------------------------------------------------------- /src/utils/util.js: -------------------------------------------------------------------------------- 1 | let keyVersion = "1.0.0"; 2 | let buildTrueKey = (key) => { 3 | return key + keyVersion; 4 | }; 5 | export function setLocalStorage(key, value) { 6 | return localStorage.setItem(buildTrueKey(key), JSON.stringify(value)); 7 | } 8 | 9 | export function getLocalStorage(key) { 10 | return JSON.parse(localStorage.getItem(buildTrueKey(key))); 11 | } 12 | export function uniqueid() { 13 | return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { 14 | const r = (Math.random() * 16) | 0, 15 | v = c == "x" ? r : (r & 0x3) | 0x8; 16 | return v.toString(16); 17 | }); 18 | } 19 | 20 | /** 21 | * Draws a rounded rectangle using the current state of the canvas. 22 | * If you omit the last three params, it will draw a rectangle 23 | * outline with a 5 pixel border radius 24 | * @param {CanvasRenderingContext2D} ctx 25 | * @param {Number} x The top left x coordinate 26 | * @param {Number} y The top left y coordinate 27 | * @param {Number} width The width of the rectangle 28 | * @param {Number} height The height of the rectangle 29 | * @param {Number} [radius = 5] The corner radius; It can also be an object 30 | * to specify different radii for corners 31 | * @param {Number} [radius.tl = 0] Top left 32 | * @param {Number} [radius.tr = 0] Top right 33 | * @param {Number} [radius.br = 0] Bottom right 34 | * @param {Number} [radius.bl = 0] Bottom left 35 | * @param {Boolean} [fill = false] Whether to fill the rectangle. 36 | * @param {Boolean} [stroke = true] Whether to stroke the rectangle. 37 | */ 38 | export function roundRect(ctx, x, y, width, height, radius, fill, stroke) { 39 | if (typeof stroke == "undefined") { 40 | stroke = true; 41 | } 42 | if (typeof radius === "undefined") { 43 | radius = 5; 44 | } 45 | if (typeof radius === "number") { 46 | radius = { 47 | tl: radius, 48 | tr: radius, 49 | br: radius, 50 | bl: radius, 51 | }; 52 | } else { 53 | var defaultRadius = { 54 | tl: 0, 55 | tr: 0, 56 | br: 0, 57 | bl: 0, 58 | }; 59 | for (var side in defaultRadius) { 60 | radius[side] = radius[side] || defaultRadius[side]; 61 | } 62 | } 63 | ctx.beginPath(); 64 | ctx.moveTo(x + radius.tl, y); 65 | ctx.lineTo(x + width - radius.tr, y); 66 | ctx.quadraticCurveTo(x + width, y, x + width, y + radius.tr); 67 | ctx.lineTo(x + width, y + height - radius.br); 68 | ctx.quadraticCurveTo( 69 | x + width, 70 | y + height, 71 | x + width - radius.br, 72 | y + height 73 | ); 74 | ctx.lineTo(x + radius.bl, y + height); 75 | ctx.quadraticCurveTo(x, y + height, x, y + height - radius.bl); 76 | ctx.lineTo(x, y + radius.tl); 77 | ctx.quadraticCurveTo(x, y, x + radius.tl, y); 78 | ctx.closePath(); 79 | if (fill) { 80 | ctx.fill(); 81 | } 82 | if (stroke) { 83 | ctx.stroke(); 84 | } 85 | } 86 | 87 | export function getRandomInt(min, max) { 88 | return Math.floor(Math.random() * (max - min)) + min; 89 | } 90 | 91 | function componentToHex(c) { 92 | var hex = c.toString(16); 93 | return hex.length == 1 ? "0" + hex : hex; 94 | } 95 | 96 | function rgbToHex(r, g, b) { 97 | return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b); 98 | } 99 | 100 | export function generateRandomColor(useGrayscale) { 101 | var baseColor = [256, 256, 256]; 102 | var red = getRandomInt(0, 256); 103 | var green = getRandomInt(0, 256); 104 | var blue = getRandomInt(0, 256); 105 | 106 | // mix the color 107 | 108 | var mixture = 0.7; 109 | 110 | red = Math.round(red * mixture + baseColor[0] * (1 - mixture)); 111 | green = Math.round(green * mixture + baseColor[1] * (1 - mixture)); 112 | blue = Math.round(blue * mixture + baseColor[2] * (1 - mixture)); 113 | 114 | if (useGrayscale.val == 1) { 115 | return rgbToHex(red, red, red); 116 | } else { 117 | return rgbToHex(red, green, blue); 118 | } 119 | } 120 | 121 | export function getLoremIpsum(numWords = 5) { 122 | var baseText = 123 | "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus gravida eu leo vitae imperdiet. Nam pulvinar luctus arcu, vel semper ligula efficitur in. Mauris non semper ante. Nullam scelerisque hendrerit urna, lacinia egestas enim laoreet vitae. Aliquam erat volutpat. Duis posuere magna libero, vel rhoncus nisl ullamcorper eu. Etiam ac libero consectetur, congue nisi quis, vulputate erat."; 124 | var sentences = baseText.split("."); 125 | var sentences_words = sentences.map((s) => s.split(/[\s\.,]/)); 126 | 127 | var chosenSentenceNumber = getRandomInt(0, sentences.length - 1); 128 | var chosenWords = sentences_words[chosenSentenceNumber] 129 | .slice(0, numWords) 130 | .join(" "); 131 | 132 | return chosenWords; 133 | } 134 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const path = require("path"); 3 | import { defineConfig } from "vite"; 4 | import vue from "@vitejs/plugin-vue"; 5 | 6 | // https://vitejs.dev/config/ 7 | 8 | // Dotenv 是一个零依赖的模块,它能将环境变量中的变量从 .env 文件加载到 process.env 中 9 | const dotenv = require("dotenv"); 10 | 11 | const envFiles = [ 12 | /** default file */ `.env`, 13 | /** mode file */ `.env.${process.env.NODE_ENV}`, 14 | ]; 15 | 16 | for (const file of envFiles) { 17 | const envConfig = dotenv.parse(fs.readFileSync(file)); 18 | for (const k in envConfig) { 19 | process.env[k] = envConfig[k]; 20 | } 21 | } 22 | module.exports = defineConfig({ 23 | base: process.env.VITE_BASE_URL, 24 | build: process.env.VITE_OUTPUT_DIR 25 | ? { 26 | outDir: process.env.VITE_OUTPUT_DIR, 27 | } 28 | : null, 29 | plugins: [vue()], 30 | }); 31 | --------------------------------------------------------------------------------