From ec7eec40be0bca76c4acecb0efe11b0dd7f2b263 Mon Sep 17 00:00:00 2001 From: Quorafind Date: Thu, 18 Jan 2024 22:06:08 +0800 Subject: [PATCH] fix: cannot tab --- manifest.json | 6 +- package.json | 2 +- pnpm-lock.yaml | 835 ++++++++++++++++++++++++++++++++++------ src/canvasMindMap.ts | 397 ++++++++----------- src/mindMapSettings.ts | 168 ++++++++ src/types/obsidian.d.ts | 10 +- src/utils.ts | 253 ++++++++---- 7 files changed, 1248 insertions(+), 423 deletions(-) create mode 100644 src/mindMapSettings.ts diff --git a/manifest.json b/manifest.json index 9ca3f8f..d87d185 100644 --- a/manifest.json +++ b/manifest.json @@ -1,8 +1,8 @@ { "id": "canvas-mindmap", "name": "Canvas Mindmap", - "version": "0.1.3", - "minAppVersion": "1.1.0", + "version": "0.1.4", + "minAppVersion": "1.4.0", "description": "A plugin to make your canvas work like a mindmap.", "author": "Boninall", "authorUrl": "https://github.com/quorafind", @@ -12,4 +12,4 @@ "支付宝": "https://cdn.jsdelivr.net/gh/Quorafind/.github@main/IMAGE/%E6%94%AF%E4%BB%98%E5%AE%9D%E4%BB%98%E6%AC%BE%E7%A0%81.jpg" }, "isDesktopOnly": false -} \ No newline at end of file +} diff --git a/package.json b/package.json index b8d2f3d..b0bb6aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "canvas-mindmap", - "version": "0.1.3", + "version": "0.1.4", "description": "A plugin to make your canvas work like a mindmap.", "main": "main.js", "scripts": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 908364d..283528c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,30 +1,115 @@ -lockfileVersion: 5.4 - -specifiers: - '@types/node': ^16.18.10 - '@typescript-eslint/eslint-plugin': 5.29.0 - '@typescript-eslint/parser': 5.29.0 - builtin-modules: 3.3.0 - esbuild: 0.14.47 - monkey-around: ^2.3.0 - obsidian: latest - tslib: 2.4.0 - typescript: 4.7.4 +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false devDependencies: - '@types/node': 16.18.10 - '@typescript-eslint/eslint-plugin': 5.29.0_treee22277sh3yq6pnqeflwlmi - '@typescript-eslint/parser': 5.29.0_typescript@4.7.4 - builtin-modules: 3.3.0 - esbuild: 0.14.47 - monkey-around: 2.3.0 - obsidian: 1.1.1 - tslib: 2.4.0 - typescript: 4.7.4 + '@types/node': + specifier: ^16.11.6 + version: 16.18.10 + '@typescript-eslint/eslint-plugin': + specifier: 5.29.0 + version: 5.29.0(@typescript-eslint/parser@5.29.0)(eslint@8.54.0)(typescript@4.7.4) + '@typescript-eslint/parser': + specifier: 5.29.0 + version: 5.29.0(eslint@8.54.0)(typescript@4.7.4) + builtin-modules: + specifier: 3.3.0 + version: 3.3.0 + esbuild: + specifier: 0.14.47 + version: 0.14.47 + monkey-around: + specifier: ^2.3.0 + version: 2.3.0 + obsidian: + specifier: latest + version: 1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0) + tslib: + specifier: 2.4.0 + version: 2.4.0 + typescript: + specifier: 4.7.4 + version: 4.7.4 packages: - /@nodelib/fs.scandir/2.1.5: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@codemirror/state@6.3.1: + resolution: {integrity: sha512-88e4HhMtKJyw6fKprGaN/yZfiaoGYOi2nM45YCUC6R/kex9sxFWBDGatS1vk4lMgnWmdIIB9tk8Gj1LmL8YfvA==} + dev: true + + /@codemirror/view@6.22.0: + resolution: {integrity: sha512-6zLj4YIoIpfTGKrDMTbeZRpa8ih4EymMCKmddEDcJWrCdp/N1D46B38YEz4creTb4T177AVS9EyXkLeC/HL2jA==} + dependencies: + '@codemirror/state': 6.3.1 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.54.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.54.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.3: + resolution: {integrity: sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.54.0: + resolution: {integrity: sha512-ut5V+D+fOoWPgGGNj83GGjnntO39xDy6DWxO0wb7Jp3DcMX0TfIqdzHF85VTQkerdyGmuuMD9AKAo5KiNlf/AQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} + dev: true + + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} dependencies: @@ -32,12 +117,12 @@ packages: run-parallel: 1.2.0 dev: true - /@nodelib/fs.stat/2.0.5: + /@nodelib/fs.stat@2.0.5: resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} engines: {node: '>= 8'} dev: true - /@nodelib/fs.walk/1.2.8: + /@nodelib/fs.walk@1.2.8: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} dependencies: @@ -45,31 +130,31 @@ packages: fastq: 1.14.0 dev: true - /@types/codemirror/0.0.108: - resolution: {integrity: sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==} + /@types/codemirror@5.60.8: + resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} dependencies: '@types/tern': 0.23.4 dev: true - /@types/estree/1.0.0: + /@types/estree@1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} dev: true - /@types/json-schema/7.0.11: + /@types/json-schema@7.0.11: resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} dev: true - /@types/node/16.18.10: + /@types/node@16.18.10: resolution: {integrity: sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==} dev: true - /@types/tern/0.23.4: + /@types/tern@0.23.4: resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} dependencies: '@types/estree': 1.0.0 dev: true - /@typescript-eslint/eslint-plugin/5.29.0_treee22277sh3yq6pnqeflwlmi: + /@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0)(eslint@8.54.0)(typescript@4.7.4): resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -80,22 +165,23 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.29.0_typescript@4.7.4 + '@typescript-eslint/parser': 5.29.0(eslint@8.54.0)(typescript@4.7.4) '@typescript-eslint/scope-manager': 5.29.0 - '@typescript-eslint/type-utils': 5.29.0_typescript@4.7.4 - '@typescript-eslint/utils': 5.29.0_typescript@4.7.4 + '@typescript-eslint/type-utils': 5.29.0(eslint@8.54.0)(typescript@4.7.4) + '@typescript-eslint/utils': 5.29.0(eslint@8.54.0)(typescript@4.7.4) debug: 4.3.4 + eslint: 8.54.0 functional-red-black-tree: 1.0.1 ignore: 5.2.4 regexpp: 3.2.0 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.29.0_typescript@4.7.4: + /@typescript-eslint/parser@5.29.0(eslint@8.54.0)(typescript@4.7.4): resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -107,14 +193,15 @@ packages: dependencies: '@typescript-eslint/scope-manager': 5.29.0 '@typescript-eslint/types': 5.29.0 - '@typescript-eslint/typescript-estree': 5.29.0_typescript@4.7.4 + '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) debug: 4.3.4 + eslint: 8.54.0 typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/scope-manager/5.29.0: + /@typescript-eslint/scope-manager@5.29.0: resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -122,7 +209,7 @@ packages: '@typescript-eslint/visitor-keys': 5.29.0 dev: true - /@typescript-eslint/type-utils/5.29.0_typescript@4.7.4: + /@typescript-eslint/type-utils@5.29.0(eslint@8.54.0)(typescript@4.7.4): resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -132,20 +219,21 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.29.0_typescript@4.7.4 + '@typescript-eslint/utils': 5.29.0(eslint@8.54.0)(typescript@4.7.4) debug: 4.3.4 - tsutils: 3.21.0_typescript@4.7.4 + eslint: 8.54.0 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/types/5.29.0: + /@typescript-eslint/types@5.29.0: resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/typescript-estree/5.29.0_typescript@4.7.4: + /@typescript-eslint/typescript-estree@5.29.0(typescript@4.7.4): resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -160,13 +248,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.3.8 - tsutils: 3.21.0_typescript@4.7.4 + tsutils: 3.21.0(typescript@4.7.4) typescript: 4.7.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils/5.29.0_typescript@4.7.4: + /@typescript-eslint/utils@5.29.0(eslint@8.54.0)(typescript@4.7.4): resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -175,15 +263,16 @@ packages: '@types/json-schema': 7.0.11 '@typescript-eslint/scope-manager': 5.29.0 '@typescript-eslint/types': 5.29.0 - '@typescript-eslint/typescript-estree': 5.29.0_typescript@4.7.4 + '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) + eslint: 8.54.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0 + eslint-utils: 3.0.0(eslint@8.54.0) transitivePeerDependencies: - supports-color - typescript dev: true - /@typescript-eslint/visitor-keys/5.29.0: + /@typescript-eslint/visitor-keys@5.29.0: resolution: {integrity: sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: @@ -191,24 +280,115 @@ packages: eslint-visitor-keys: 3.3.0 dev: true - /array-union/2.1.0: + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: true + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} dev: true - /braces/3.0.2: + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 dev: true - /builtin-modules/3.3.0: + /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true - /debug/4.3.4: + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} peerDependencies: @@ -220,14 +400,25 @@ packages: ms: 2.1.2 dev: true - /dir-glob/3.0.1: + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} dependencies: path-type: 4.0.0 dev: true - /esbuild-android-64/0.14.47: + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /esbuild-android-64@0.14.47: resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} engines: {node: '>=12'} cpu: [x64] @@ -236,7 +427,7 @@ packages: dev: true optional: true - /esbuild-android-arm64/0.14.47: + /esbuild-android-arm64@0.14.47: resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} engines: {node: '>=12'} cpu: [arm64] @@ -245,7 +436,7 @@ packages: dev: true optional: true - /esbuild-darwin-64/0.14.47: + /esbuild-darwin-64@0.14.47: resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} engines: {node: '>=12'} cpu: [x64] @@ -254,7 +445,7 @@ packages: dev: true optional: true - /esbuild-darwin-arm64/0.14.47: + /esbuild-darwin-arm64@0.14.47: resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} engines: {node: '>=12'} cpu: [arm64] @@ -263,7 +454,7 @@ packages: dev: true optional: true - /esbuild-freebsd-64/0.14.47: + /esbuild-freebsd-64@0.14.47: resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} engines: {node: '>=12'} cpu: [x64] @@ -272,7 +463,7 @@ packages: dev: true optional: true - /esbuild-freebsd-arm64/0.14.47: + /esbuild-freebsd-arm64@0.14.47: resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} engines: {node: '>=12'} cpu: [arm64] @@ -281,7 +472,7 @@ packages: dev: true optional: true - /esbuild-linux-32/0.14.47: + /esbuild-linux-32@0.14.47: resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} engines: {node: '>=12'} cpu: [ia32] @@ -290,7 +481,7 @@ packages: dev: true optional: true - /esbuild-linux-64/0.14.47: + /esbuild-linux-64@0.14.47: resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} engines: {node: '>=12'} cpu: [x64] @@ -299,25 +490,25 @@ packages: dev: true optional: true - /esbuild-linux-arm/0.14.47: - resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + /esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} engines: {node: '>=12'} - cpu: [arm] + cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-arm64/0.14.47: - resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + /esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} engines: {node: '>=12'} - cpu: [arm64] + cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /esbuild-linux-mips64le/0.14.47: + /esbuild-linux-mips64le@0.14.47: resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} engines: {node: '>=12'} cpu: [mips64el] @@ -326,7 +517,7 @@ packages: dev: true optional: true - /esbuild-linux-ppc64le/0.14.47: + /esbuild-linux-ppc64le@0.14.47: resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} engines: {node: '>=12'} cpu: [ppc64] @@ -335,7 +526,7 @@ packages: dev: true optional: true - /esbuild-linux-riscv64/0.14.47: + /esbuild-linux-riscv64@0.14.47: resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} engines: {node: '>=12'} cpu: [riscv64] @@ -344,7 +535,7 @@ packages: dev: true optional: true - /esbuild-linux-s390x/0.14.47: + /esbuild-linux-s390x@0.14.47: resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} engines: {node: '>=12'} cpu: [s390x] @@ -353,7 +544,7 @@ packages: dev: true optional: true - /esbuild-netbsd-64/0.14.47: + /esbuild-netbsd-64@0.14.47: resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} engines: {node: '>=12'} cpu: [x64] @@ -362,7 +553,7 @@ packages: dev: true optional: true - /esbuild-openbsd-64/0.14.47: + /esbuild-openbsd-64@0.14.47: resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} engines: {node: '>=12'} cpu: [x64] @@ -371,7 +562,7 @@ packages: dev: true optional: true - /esbuild-sunos-64/0.14.47: + /esbuild-sunos-64@0.14.47: resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} engines: {node: '>=12'} cpu: [x64] @@ -380,7 +571,7 @@ packages: dev: true optional: true - /esbuild-windows-32/0.14.47: + /esbuild-windows-32@0.14.47: resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} engines: {node: '>=12'} cpu: [ia32] @@ -389,7 +580,7 @@ packages: dev: true optional: true - /esbuild-windows-64/0.14.47: + /esbuild-windows-64@0.14.47: resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} engines: {node: '>=12'} cpu: [x64] @@ -398,7 +589,7 @@ packages: dev: true optional: true - /esbuild-windows-arm64/0.14.47: + /esbuild-windows-arm64@0.14.47: resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} engines: {node: '>=12'} cpu: [arm64] @@ -407,7 +598,7 @@ packages: dev: true optional: true - /esbuild/0.14.47: + /esbuild@0.14.47: resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} engines: {node: '>=12'} hasBin: true @@ -435,7 +626,12 @@ packages: esbuild-windows-arm64: 0.14.47 dev: true - /eslint-scope/5.1.1: + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} dependencies: @@ -443,43 +639,129 @@ packages: estraverse: 4.3.0 dev: true - /eslint-utils/3.0.0: + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@3.0.0(eslint@8.54.0): resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} peerDependencies: eslint: '>=5' dependencies: + eslint: 8.54.0 eslint-visitor-keys: 2.1.0 dev: true - /eslint-visitor-keys/2.1.0: + /eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} dev: true - /eslint-visitor-keys/3.3.0: + /eslint-visitor-keys@3.3.0: resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /esrecurse/4.3.0: + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.54.0: + resolution: {integrity: sha512-NY0DfAkM8BIZDVl6PgSa1ttZbx3xHgJzSNJKYcQglem6CppHyMhRIQkBVSSMaSRnLhig3jsDbEzOjwCVt4AmmA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.3 + '@eslint/js': 8.54.0 + '@humanwhocodes/config-array': 0.11.13 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + eslint-visitor-keys: 3.4.3 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 dev: true - /estraverse/4.3.0: + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} dev: true - /estraverse/5.3.0: + /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} dev: true - /fast-glob/3.2.12: + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} dependencies: @@ -490,31 +772,96 @@ packages: micromatch: 4.0.5 dev: true - /fastq/1.14.0: + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.14.0: resolution: {integrity: sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==} dependencies: reusify: 1.0.4 dev: true - /fill-range/7.0.1: + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 dev: true - /functional-red-black-tree/1.0.1: + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /functional-red-black-tree@1.0.1: resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} dev: true - /glob-parent/5.1.2: + /glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} dependencies: is-glob: 4.0.3 dev: true - /globby/11.1.0: + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} dependencies: @@ -526,41 +873,127 @@ packages: slash: 3.0.0 dev: true - /ignore/5.2.4: + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /is-extglob/2.1.1: + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} dev: true - /is-glob/4.0.3: + /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} dependencies: is-extglob: 2.1.1 dev: true - /is-number/7.0.0: + /is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} dev: true - /lru-cache/6.0.0: + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} dependencies: yallist: 4.0.0 dev: true - /merge2/1.4.1: + /merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} dev: true - /micromatch/4.0.5: + /micromatch@4.0.5: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: @@ -568,59 +1001,147 @@ packages: picomatch: 2.3.1 dev: true - /moment/2.29.4: + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} dev: true - /monkey-around/2.3.0: + /monkey-around@2.3.0: resolution: {integrity: sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==} dev: true - /ms/2.1.2: + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /obsidian/1.1.1: - resolution: {integrity: sha512-GcxhsHNkPEkwHEjeyitfYNBcQuYGeAHFs1pEpZIv0CnzSfui8p8bPLm2YKLgcg20B764770B1sYGtxCvk9ptxg==} + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /obsidian@1.4.11(@codemirror/state@6.3.1)(@codemirror/view@6.22.0): + resolution: {integrity: sha512-BCVYTvaXxElJMl6MMbDdY/CGK+aq18SdtDY/7vH8v6BxCBQ6KF4kKxL0vG9UZ0o5qh139KpUoJHNm+6O5dllKA==} peerDependencies: '@codemirror/state': ^6.0.0 '@codemirror/view': ^6.0.0 dependencies: - '@types/codemirror': 0.0.108 + '@codemirror/state': 6.3.1 + '@codemirror/view': 6.22.0 + '@types/codemirror': 5.60.8 moment: 2.29.4 dev: true - /path-type/4.0.0: + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} dev: true - /picomatch/2.3.1: + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} dev: true - /queue-microtask/1.2.3: + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + + /queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} dev: true - /regexpp/3.2.0: + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} dev: true - /reusify/1.0.4: + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} dev: true - /run-parallel/1.2.0: + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: queue-microtask: 1.2.3 dev: true - /semver/7.3.8: + /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} hasBin: true @@ -628,27 +1149,66 @@ packages: lru-cache: 6.0.0 dev: true - /slash/3.0.0: + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} dev: true - /to-regex-range/5.0.1: + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 dev: true - /tslib/1.14.1: + /tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib/2.4.0: + /tslib@2.4.0: resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} dev: true - /tsutils/3.21.0_typescript@4.7.4: + /tsutils@3.21.0(typescript@4.7.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: @@ -658,12 +1218,51 @@ packages: typescript: 4.7.4 dev: true - /typescript/4.7.4: + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /typescript@4.7.4: resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true - /yallist/4.0.0: + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/src/canvasMindMap.ts b/src/canvasMindMap.ts index b5fbbf8..55fd891 100644 --- a/src/canvasMindMap.ts +++ b/src/canvasMindMap.ts @@ -1,8 +1,13 @@ -import { Canvas, CanvasEdge, CanvasNode, ItemView, Plugin, requireApiVersion, TFile } from 'obsidian'; +import { Canvas, CanvasEdge, CanvasNode, ItemView, Plugin, requireApiVersion, SettingTab, TFile } from 'obsidian'; import { around } from "monkey-around"; -import { addEdge, createChildFileNode, random } from "./utils"; +import { addEdge, addNode, buildTrees, createChildFileNode, random } from "./utils"; +import { DEFAULT_SETTINGS, MindMapSettings } from "./mindMapSettings"; +import { CanvasEdgeData } from "obsidian/canvas"; + export default class CanvasMindMap extends Plugin { + settings: MindMapSettings; + async onload() { this.registerCommands(); @@ -17,34 +22,34 @@ export default class CanvasMindMap extends Plugin { registerCommands() { this.addCommand({ - id: 'split-heading-into-mindmap', - name: 'Split Heading into mindmap based on H1', - checkCallback: (checking: boolean) => { - // Conditions to check - const canvasView = app.workspace.getActiveViewOfType(ItemView); - if (canvasView?.getViewType() === "canvas") { - // If checking is true, we're simply "checking" if the command can be run. - // If checking is false, then we want to actually perform the operation. - - if (!checking) { + id: 'split-heading-into-mindmap', + name: 'Split Heading into mindmap based on H1', + checkCallback: (checking: boolean) => { + // Conditions to check + const canvasView = app.workspace.getActiveViewOfType(ItemView); + if (canvasView?.getViewType() === "canvas") { + // If checking is true, we're simply "checking" if the command can be run. + // If checking is false, then we want to actually perform the operation. + + if (!checking) { // @ts-ignore - const canvas = canvasView?.canvas; + const canvas = canvasView?.canvas; const currentSelection = canvas?.selection; - if(currentSelection.size > 1) { + if (currentSelection.size > 1) { return; } const currentSelectionItem = currentSelection.values().next().value; - if(!currentSelectionItem.filePath) return; + if (!currentSelectionItem.filePath) return; const currentSelectionItemFile = currentSelectionItem.file as TFile; - if(!(currentSelectionItemFile.extension === "md")) return; + if (!(currentSelectionItemFile.extension === "md")) return; const currentFileHeadings = app.metadataCache.getFileCache(currentSelectionItemFile)?.headings; - if(!currentFileHeadings) return; + if (!currentFileHeadings) return; const currentFileHeadingH1 = currentFileHeadings.filter(heading => heading.level === 1); - if(currentFileHeadingH1.length === 0) return; + if (currentFileHeadingH1.length === 0) return; const nodeGroupHeight = (currentSelectionItem.height * 0.6 + 20) * currentFileHeadingH1.length; let direction = -1; @@ -52,25 +57,25 @@ export default class CanvasMindMap extends Plugin { currentFileHeadingH1.forEach((item, index) => { createChildFileNode(canvas, currentSelectionItem, currentSelectionItemFile, "#" + item.heading, nodeGroupY - direction * (currentSelectionItem.height * 0.6 + 20) * index); - }) - } - return true; - } - } + }); + } + return true; + } + } }); this.addCommand({ - id: 'create-floating-node', - name: 'Create floating node', - checkCallback: (checking: boolean) => { - // Conditions to check + id: 'create-floating-node', + name: 'Create floating node', + checkCallback: (checking: boolean) => { + // Conditions to check const canvasView = app.workspace.getActiveViewOfType(ItemView); if (canvasView?.getViewType() === "canvas") { - // If checking is true, we're simply "checking" if the command can be run. - // If checking is false, then we want to actually perform the operation. - if (!checking) { + // If checking is true, we're simply "checking" if the command can be run. + // If checking is false, then we want to actually perform the operation. + if (!checking) { // @ts-ignore - const canvas = canvasView?.canvas; + const canvas = canvasView?.canvas; const node = canvas.createTextNode({ pos: { @@ -88,80 +93,38 @@ export default class CanvasMindMap extends Plugin { text: "", focus: true, save: true, - }) + }); canvas.addNode(node); canvas.requestSave(); - if(!node) return; + if (!node) return; setTimeout(() => { node.startEditing(); canvas.zoomToSelection(); - }, 0) - } + }, 0); + } - // This command will only show up in Command Palette when the check function returns true - return true; - } - } + // This command will only show up in Command Palette when the check function returns true + return true; + } + } }); } patchCanvas() { - const createEdge = async (node1: CanvasNode, node2: CanvasNode, canvas: Canvas) => { - if (requireApiVersion("1.1.9")) { - addEdge(canvas, random(16), { - fromOrTo: "from", - side: "right", - node: node1 - }, { - fromOrTo: "to", - side: "left", - node: node2 - }); - } else { - await createEdgeForOlderVersion(node1, node2, canvas); - } - }; - - const createEdgeForOlderVersion = async (node1: CanvasNode, node2: CanvasNode, canvas: Canvas) => { - const firstEdge = canvas.edges.get(canvas.getData().edges.first()?.id); - - if (firstEdge) { - const newEdge = new firstEdge.constructor(canvas, random(16), { side: "right", node: node1 }, { side: "left", node: node2 }); - canvas.addEdge(newEdge); - newEdge.render(); - } else { - await createEdgeFromFileData(node1, node2, canvas); - } - }; - - const createEdgeFromFileData = async (node1: CanvasNode, node2: CanvasNode, canvas: Canvas) => { - setTimeout(async () => { - const canvasFile = await canvas.view.file.read(); - const canvasFileData = JSON.parse(canvasFile); - - canvasFileData.edges.push({ - id: random(16), - fromNode: node1.id, - fromSide: "right", - toNode: node2.id, - toSide: "left" - }); - - canvasFileData.nodes.push({ - id: node2.id, - x: node2.x, - y: node2.y, - width: node2.width, - height: node2.height, - type: "text", - text: node2.text, - }); + const createEdge = async (node1: any, node2: any, canvas: any) => { + + addEdge(canvas, random(16), { + fromOrTo: "from", + side: "right", + node: node1 + }, { + fromOrTo: "to", + side: "left", + node: node2 + }); - canvas.setData(canvasFileData); - canvas.requestSave(); - }, 500); }; const navigate = (canvas: Canvas, direction: string) => { @@ -170,7 +133,7 @@ export default class CanvasMindMap extends Plugin { const selectedItem = currentSelection.values().next().value as CanvasNode; const viewportNodes = canvas.getViewportNodes(); - const { x, y, width, height } = selectedItem; + const {x, y, width, height} = selectedItem; canvas.deselectAll(); @@ -200,148 +163,124 @@ export default class CanvasMindMap extends Plugin { const createFloatingNode = (canvas: any, direction: string) => { let selection = canvas.selection; - if(selection.size !== 1) return; + if (selection.size !== 1) return; let node = selection.values().next().value; let x = direction === "left" ? node.x - node.width - 50 : direction === "right" ? node.x + node.width + 50 : node.x; let y = direction === "top" ? node.y - node.height - 100 : direction === "bottom" ? node.y + node.height + 100 : node.y; - if(requireApiVersion("1.1.10")) { - const tempChildNode = canvas.createTextNode({ - pos: { - x: x, - y: y, - height: node.height, - width: node.width - }, - size: { - x: x, - y: y, - height: node.height, - width: node.width - }, - text: "", - focus: true, - save: true, - }); - - canvas.zoomToSelection(); - return tempChildNode; - } else { - const tempChildNode = canvas.createTextNode({ + const tempChildNode = addNode( + canvas, random(16), { x: x, - y: y - }, { height: node.height, width: node.width }, true); + y: y, + width: node.width, + height: node.height, + type: 'text', + content: "", + } + ); - canvas.zoomToSelection(); + canvas?.requestSave(); - return tempChildNode; - } - } + const currentNode = canvas.nodes?.get(tempChildNode?.id!); + if (!currentNode) return; + canvas.selectOnly(currentNode); + canvas.zoomToSelection(); - const childNode = async (canvas: any, parentNode: any, y: number) => { - let tempChildNode; - if(!requireApiVersion("1.1.10")) { - tempChildNode = canvas.createTextNode({ - x: parentNode.x + parentNode.width + 200, - y: y - }, { height: parentNode.height, width: parentNode.width }, true); - } else { - tempChildNode = canvas.createTextNode({ - pos: { - x: parentNode.x + parentNode.width + 200, - y: y, - height: parentNode.height, - width: parentNode.width - }, - size: { - x: parentNode.x + parentNode.width + 200, - y: y, - height: parentNode.height, - width: parentNode.width - }, - text: "", - focus: false, - save: true, - }); - } - canvas.deselectAll(); - canvas.addNode(tempChildNode); + return tempChildNode; + }; + const childNode = async (canvas: Canvas, parentNode: any, y: number) => { + let tempChildNode = addNode( + canvas, random(16), { + x: parentNode.x + parentNode.width + 200, + y: y, + width: parentNode.width, + height: parentNode.height, + type: 'text', + content: "", + } + ); await createEdge(parentNode, tempChildNode, canvas); + canvas.deselectAll(); + const node = canvas.nodes?.get(tempChildNode?.id!); + if (!node) return; + canvas.selectOnly(node); + canvas.requestSave(); return tempChildNode; - } + }; - const createChildNode = async (canvas: any) => { + const createChildNode = async (canvas: Canvas) => { if (canvas.selection.size !== 1) return; const parentNode = canvas.selection.entries().next().value[1]; - if(parentNode.isEditing) return; + if (parentNode.isEditing) return; // Calculate the height of all the children nodes let wholeHeight = 0; let tempChildNode; + const canvasData = canvas.getData(); - const prevParentEdges = canvas.getEdgesForNode(parentNode).filter((item: any) => { - return (item.from.node.id === parentNode.id && item.to.side === "left") + const prevParentEdges = canvasData.edges.filter((item: CanvasEdgeData) => { + return (item.fromNode === parentNode.id && item.toSide === "left"); }); if (prevParentEdges.length === 0) { tempChildNode = await childNode(canvas, parentNode, parentNode.y); } else { - const prevAllNodes = []; - for (let i = 0; i < prevParentEdges?.length; i++) { - let node = prevParentEdges[i].to.node; - prevAllNodes.push(node); - } - - if (prevAllNodes.length > 1) { - prevAllNodes.sort((a: any, b: any) => { - return a.y - b.y; - }); - } - const distanceY = prevAllNodes[prevAllNodes.length - 1]?.y + prevAllNodes[prevAllNodes.length - 1]?.height + 20; - tempChildNode = await childNode(canvas, parentNode, distanceY); - - prevAllNodes.push(tempChildNode) - prevAllNodes.sort((a: any, b: any) => { - return a.y - b.y; - }); - - // Check if this is a Mindmap - if (prevAllNodes.length === 1) return; - - if (prevAllNodes.length > 1 && prevAllNodes[0].x === prevAllNodes[1]?.x) { - let preNode; - wholeHeight = prevAllNodes.length * (parentNode.height + 20); - - for (let i = 0; i < prevAllNodes.length; i++) { - let tempNode; - if (i === 0) { - (tempNode = prevAllNodes[i]).moveTo({ - x: tempChildNode.x, - y: parentNode.y + parentNode.height / 2 - (wholeHeight / 2) - }); - } else { - (tempNode = prevAllNodes[i]).moveTo({ - x: tempChildNode.x, - y: preNode.y + preNode.height + 20 - }); - } - - canvas.requestSave(); - preNode = tempNode; - } - } + // const prevAllNodes = []; + // for (let i = 0; i < prevParentEdges?.length; i++) { + // let node = prevParentEdges[i].toNode; + // prevAllNodes.push(node); + // } + // + // if (prevAllNodes.length > 1) { + // prevAllNodes.sort((a: any, b: any) => { + // return a.y - b.y; + // }); + // } + // const distanceY = prevAllNodes[prevAllNodes.length - 1]?.y + prevAllNodes[prevAllNodes.length - 1]?.height + 20; + // tempChildNode = await childNode(canvas, parentNode, distanceY); + // + // prevAllNodes.push(tempChildNode); + // prevAllNodes.sort((a: any, b: any) => { + // return a.y - b.y; + // }); + // + // // Check if this is a Mindmap + // if (prevAllNodes.length === 1) return; + // + // if (prevAllNodes.length > 1 && prevAllNodes[0].x === prevAllNodes[1]?.x) { + // let preNode; + // wholeHeight = prevAllNodes.length * (parentNode.height + 20); + // + // for (let i = 0; i < prevAllNodes.length; i++) { + // let tempNode; + // if (i === 0) { + // (tempNode = prevAllNodes[i]).moveTo({ + // x: tempChildNode.x, + // y: parentNode.y + parentNode.height / 2 - (wholeHeight / 2) + // }); + // } else { + // (tempNode = prevAllNodes[i]).moveTo({ + // x: tempChildNode.x, + // y: preNode.y + preNode.height + 20 + // }); + // } + // + // canvas.requestSave(); + // preNode = tempNode; + // } + // } } return tempChildNode; - } + }; const createSiblingNode = async (canvas: Canvas) => { if (canvas.selection.size !== 1) return; @@ -367,7 +306,7 @@ export default class CanvasMindMap extends Plugin { if (nodes.length > 1 && nodes[0].x === nodes[1]?.x) { nodes.forEach((node: CanvasNode, index: number) => { const yPos = index === 0 ? parentNode.y + parentNode.height / 2 - totalHeight / 2 : nodes[index - 1].y + nodes[index - 1].height + 20; - node.moveTo({ x: selectedNode.x, y: yPos }); + node.moveTo({x: selectedNode.x, y: yPos}); }); } @@ -384,14 +323,14 @@ export default class CanvasMindMap extends Plugin { const patchCanvasView = canvas.constructor; - console.log("patchCanvasView", patchCanvasView) + console.log("patchCanvasView", patchCanvasView); const canvasViewunistaller = around(canvasView.constructor.prototype, { onOpen: (next) => async function () { this.scope.register(["Mod"], "ArrowUp", () => { createFloatingNode(this.canvas, "top"); - }) + }); this.scope.register(["Mod"], "ArrowDown", () => { createFloatingNode(this.canvas, "bottom"); }); @@ -404,7 +343,7 @@ export default class CanvasMindMap extends Plugin { this.scope.register(["Alt"], "ArrowUp", () => { navigate(this.canvas, "top"); - }) + }); this.scope.register(["Alt"], "ArrowDown", () => { navigate(this.canvas, "bottom"); }); @@ -420,29 +359,27 @@ export default class CanvasMindMap extends Plugin { const node = await createSiblingNode(this.canvas); - if(!node) return; + if (!node) return; setTimeout(() => { node.startEditing(); this.canvas.zoomToSelection(); - }, 0) + }, 0); }); this.scope.register([], "Tab", async () => { - - const node = await createChildNode(this.canvas); - if(!node) return; + if (!node) return; setTimeout(() => { node.startEditing(); this.canvas.zoomToSelection(); - }, 0) + }, 0); }); - return next.call(this) + return next.call(this); } - }) + }); const uninstaller = around(patchCanvasView.prototype, { onKeydown: (next) => @@ -465,7 +402,7 @@ export default class CanvasMindMap extends Plugin { let wholeHeight = 0; let parentEdges = this.getEdgesForNode(parentNode).filter((item: any) => { - return (item.from.node.id === parentNode.id && item.to.side === "left") + return (item.from.node.id === parentNode.id && item.to.side === "left"); }); let allnodes = []; @@ -515,12 +452,12 @@ export default class CanvasMindMap extends Plugin { if (e.key === " ") { const selection = this.selection; - if(selection.size !== 1) return; + if (selection.size !== 1) return; const node = selection.entries().next().value[1]; - if(node?.label || node?.url) return ; + if (node?.label || node?.url) return; - if(node.isEditing) return; + if (node.isEditing) return; node.startEditing(); } @@ -533,7 +470,7 @@ export default class CanvasMindMap extends Plugin { canvas?.view.leaf.rebuildView(); console.log("Obsidian-Canvas-MindMap: canvas view patched"); return true; - } + }; this.app.workspace.onLayoutReady(() => { if (!patchCanvas()) { @@ -550,7 +487,7 @@ export default class CanvasMindMap extends Plugin { const canvasView = app.workspace.getLeavesOfType("canvas").first()?.view; // @ts-ignore const canvas = canvasView?.canvas; - if(!canvas) return false; + if (!canvas) return false; const node = Array.from(canvas.nodes).first(); if (!node) return false; @@ -563,12 +500,12 @@ export default class CanvasMindMap extends Plugin { function (e: any, t: any) { next.call(this, e, t); this.canvas.getEdgesForNode(this).forEach((edge: any) => { - if(edge.from.node === this) { + if (edge.from.node === this) { edge.setColor(e, true); edge.render(); // edge.to.node.setColor(e, true); } - }) + }); canvas.requestSave(); }, }); @@ -576,7 +513,7 @@ export default class CanvasMindMap extends Plugin { console.log("Obsidian-Canvas-MindMap: canvas node patched"); return true; - } + }; this.app.workspace.onLayoutReady(() => { if (!patchNode()) { @@ -591,7 +528,7 @@ export default class CanvasMindMap extends Plugin { patchMarkdownFileInfo() { const patchEditor = () => { const editorInfo = app.workspace.activeEditor; - if(!editorInfo) return false; + if (!editorInfo) return false; const patchEditorInfo = editorInfo.constructor; @@ -599,7 +536,7 @@ export default class CanvasMindMap extends Plugin { showPreview: (next) => function (e: any) { next.call(this, e); - if(e) { + if (e) { this.node?.canvas.wrapperEl.focus(); this.node?.setIsEditing(false); } @@ -609,12 +546,12 @@ export default class CanvasMindMap extends Plugin { console.log("Obsidian-Canvas-MindMap: markdown file info patched"); return true; - } + }; this.app.workspace.onLayoutReady(() => { if (!patchEditor()) { const evt = app.workspace.on("file-open", () => { - setTimeout(()=>{ + setTimeout(() => { patchEditor() && app.workspace.offref(evt); }, 100); }); @@ -622,4 +559,12 @@ export default class CanvasMindMap extends Plugin { } }); } + + public async loadSettings(): Promise { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + + async saveSettings(): Promise { + await this.saveData(this.settings); + } } diff --git a/src/mindMapSettings.ts b/src/mindMapSettings.ts new file mode 100644 index 0000000..60cb5ab --- /dev/null +++ b/src/mindMapSettings.ts @@ -0,0 +1,168 @@ +import { App, debounce, Platform, PluginSettingTab, Setting } from "obsidian"; +import CanvasMindMap from "./canvasMindMap"; + +type ModifierKey = 'Alt' | 'Mod' | 'Shift'; + +function supportModifierKey() { + + return ['Alt', 'Mod', 'Shift']; + +} + +export interface MindMapSettings { + navigate: { + useNavigate: boolean; + modifierKey: string[]; + }; + create: { + childDirection: string; + siblingWidth: number; + siblingHeight: number; + }; + layout: { + direction: 'TB' | 'BT' | 'LR' | 'RL'; + autoHeight: boolean; + autoLayout: boolean; + autoLayoutDirection: 'TB' | 'BT' | 'LR' | 'RL'; + }; + advanced: { + transferToCommands: boolean; + }; +} + + +export const DEFAULT_SETTINGS: MindMapSettings = { + navigate: { + useNavigate: true, + modifierKey: ['Alt'], + }, + create: { + childDirection: 'right', + siblingWidth: 200, + siblingHeight: 100, + }, + layout: { + direction: 'LR', + autoLayout: true, + autoLayoutDirection: 'LR', + autoHeight: true, + }, + advanced: { + transferToCommands: false, + } +}; + +class MindMapSettingTab extends PluginSettingTab { + plugin: CanvasMindMap; + + updateSettings(key: any, value: any): void { + this.plugin.settings = { + ...this.plugin.settings, + [key.split('.')[0]]: { + ...this.plugin.settings[key.split('.')[0]], + [key.split('.')[1]]: value, + }, + }; + this.applySettingsUpdate(); + } + + applySettingsUpdate = debounce( + async () => { + await this.plugin.saveSettings(); + console.log('debounce'); + }, + 300, + true, + ); + + constructor(app: App, plugin: CanvasMindMap) { + super(app, plugin); + this.plugin = plugin; + } + + display(): void { + const {containerEl} = this; + + containerEl.empty(); + + containerEl.createEl('h2', {text: 'Canvas MindMap'}); + + // let rowText: HTMLDivElement; + // new Setting(containerEl) + // .setName('Navigate') + // .setDesc('The number of rows in the table') + // .addSlider((slider) => + // slider + // .setLimits(2, 12, 1) + // .setValue(this.plugin.settings.rowCount) + // .onChange(async (value) => { + // rowText.innerText = ` ${value.toString()}`; + // this.plugin.settings.rowCount = value; + // }), + // ) + // .settingEl.createDiv("", (el) => { + // rowText = el; + // el.className = "table-generator-setting-text"; + // el.innerText = ` ${this.plugin.settings.rowCount.toString()}`; + // }); + // + // let columnText: HTMLDivElement; + // new Setting(containerEl) + // .setName('Columns Count') + // .setDesc('The number of columns in the table') + // .addSlider((slider) => + // slider + // .setLimits(2, 12, 1) + // .setValue(this.plugin.settings.columnCount) + // .onChange(async (value) => { + // columnText.innerText = ` ${value.toString()}`; + // this.plugin.settings.columnCount = value; + // }), + // ) + // .settingEl.createDiv("", (el) => { + // columnText = el; + // el.className = "table-generator-setting-text"; + // el.innerText = ` ${this.plugin.settings.columnCount.toString()}`; + // }); + + this.containerEl.createEl('h2', {text: 'Say Thank You'}); + + new Setting(containerEl) + .setName('Donate') + .setDesc('If you like this plugin, consider donating to support continued development:') + .addButton((bt) => { + bt.buttonEl.outerHTML = ``; + }); + } + + useNavigateHotkeySetting(containerEl: HTMLElement, setting: MindMapSettings) { + new Setting(containerEl) + .setName('Use Navigate Hotkey') + .setDesc('Use the hotkey to navigate the mind map') + .addToggle((toggle) => { + toggle.setValue(setting.navigate.useNavigate); + toggle.onChange((value) => { + this.updateSettings('navigate.useNavigate', value); + + setTimeout(() => { + this.display(); + }, 700); + }); + }); + + if (setting.navigate.useNavigate) { + new Setting(containerEl) + .setName('Modifier Key') + .setDesc('The modifier key to use with the hotkey') + .addDropdown((dropdown) => { + const mods = supportModifierKey(); + dropdown.addOption('None', 'None'); + dropdown.setValue(setting.navigate.modifierKey[0]); + dropdown.onChange((value) => { + this.updateSettings('navigate.modifierKey.0', value); + }); + }); + } + + } +} diff --git a/src/types/obsidian.d.ts b/src/types/obsidian.d.ts index d807577..43ec74b 100644 --- a/src/types/obsidian.d.ts +++ b/src/types/obsidian.d.ts @@ -50,6 +50,8 @@ declare module 'obsidian' { requestPushHistory: any; nodeIndex: any; + importData(data: CanvasData): void; + requestSave(save?: boolean, triggerBySelf?: boolean): void; getData(): CanvasData; @@ -139,7 +141,9 @@ declare module 'obsidian' { app: App; getBBox(containing?: boolean): CanvasCoords; - moveTo({x, y}:{x: number, y: number}): void; + + moveTo({x, y}: { x: number, y: number }): void; + render(): void; } @@ -175,12 +179,12 @@ declare module 'obsidian' { from: { node: CanvasNode; - } + }; to: { side: 'left' | 'right' | 'top' | 'bottom'; node: CanvasNode; - } + }; canvas: Canvas; bbox: CanvasCoords; diff --git a/src/utils.ts b/src/utils.ts index 556e18e..31bd9fd 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,85 +1,194 @@ -import { requireApiVersion, TFile } from "obsidian"; +import { Canvas, CanvasEdge, CanvasNode, requireApiVersion, TFile } from "obsidian"; +import { CanvasData, CanvasEdgeData, CanvasFileData, CanvasNodeData, CanvasTextData } from "obsidian/canvas"; interface edgeT { - fromOrTo: string; - side: string, - node: any, + fromOrTo: string; + side: string, + node: CanvasNode | CanvasNodeData, } -export const random = (e: number) => { - let t = []; - for (let n = 0; n < e; n++) { - t.push((16 * Math.random() | 0).toString(16)); - } - return t.join("") +interface TreeNode { + id: string; + children: TreeNode[]; } +export const random = (e: number) => { + let t = []; + for (let n = 0; n < e; n++) { + t.push((16 * Math.random() | 0).toString(16)); + } + return t.join(""); +}; + export const createChildFileNode = (canvas: any, parentNode: any, file: TFile, path: string, y: number) => { - // const edge = canvas.edges.get(canvas.getData().edges.first()?.id); - let tempChildNode; - if(!requireApiVersion("1.1.10")) { - tempChildNode = canvas.createFileNode(file, path, { - x: parentNode.x + parentNode.width + 200, - y: y, - height: parentNode.height * 0.6, - width: parentNode.width - }, true); - } - else { - tempChildNode = canvas.createFileNode({ - file: file, - subpath: path, - pos: { - x: parentNode.x + parentNode.width + 200, - y: y, - width: parentNode.width, - height: parentNode.height * 0.6 - }, - size: { - x: parentNode.x + parentNode.width + 200, - y: y, - width: parentNode.width, - height: parentNode.height * 0.6 - }, - save: true, - focus: false, - }); - } - canvas.deselectAll(); - canvas.addNode(tempChildNode); - - // const tempEdge = new edge.constructor(canvas, random(16), {side: "right", node: parentNode}, {side: "left", node: tempChildNode}) - // canvas.addEdge(tempEdge); - // - // tempEdge.render(); - - addEdge(canvas, random(16), { - fromOrTo: "from", - side: "right", - node: parentNode - },{ - fromOrTo: "to", - side: "left", - node: tempChildNode - }) - canvas.requestSave(); - - return tempChildNode; -} + const node = addNode( + canvas, random(16), + { + x: parentNode.x + parentNode.width + 200, + y: y, + width: parentNode.width, + height: parentNode.height * 0.6, + + type: 'file', + content: file.path, + subpath: path, + } + ); + + addEdge(canvas, random(16), { + fromOrTo: "from", + side: "right", + node: parentNode + }, { + fromOrTo: "to", + side: "left", + node: node + }); + + canvas.requestSave(); + + return node; +}; + + +export const addNode = (canvas: Canvas, id: string, { + x, + y, + width, + height, + type, + content, + subpath, +}: { + x: number, + y: number, + width: number, + height: number, + type: 'text' | 'file', + content: string, + subpath?: string, +}) => { + if (!canvas) return; + + const data = canvas.getData(); + if (!data) return; + + const node: Partial = { + "id": id, + "x": x, + "y": y, + "width": width, + "height": height, + "type": type, + }; + + switch (type) { + case 'text': + node.text = content; + break; + case 'file': + node.file = content; + if (subpath) node.subpath = subpath; + break; + } + + canvas.importData({ + "nodes": [ + ...data.nodes, + node], + "edges": data.edges, + }); + + canvas.requestFrame(); + + return node; +}; export const addEdge = (canvas: any, edgeID: string, fromEdge: edgeT, toEdge: edgeT) => { - if(!canvas) return; + if (!canvas) return; - const data = canvas.getData(); - if(!data) return; + const data = canvas.getData(); + if (!data) return; - canvas.importData({ - "edges": [ - ...data.edges, - {"id":edgeID,"fromNode":fromEdge.node.id,"fromSide":fromEdge.side,"toNode":toEdge.node.id,"toSide":toEdge.side} - ], - "nodes": data.nodes, - }) + canvas.importData({ + "edges": [ + ...data.edges, + { + "id": edgeID, + "fromNode": fromEdge.node.id, + "fromSide": fromEdge.side, + "toNode": toEdge.node.id, + "toSide": toEdge.side + } + ], + "nodes": data.nodes, + }); - canvas.requestFrame(); + canvas.requestFrame(); +}; + +export function buildTrees(canvasData: CanvasData, direction: 'LR' | 'RL' | 'TB' | 'BT'): TreeNode[] { + const trees: TreeNode[] = []; + const nodeMap: Map = new Map(); + const edgeMap: Map = new Map(); + + canvasData.nodes.forEach(node => { + nodeMap.set(node.id, { + ...node, + children: [] + }); + }); + + canvasData.edges.forEach(edge => { + if (!edgeMap.has(edge.fromNode)) { + edgeMap.set(edge.fromNode, []); + } + edgeMap.get(edge.fromNode)?.push(edge.toNode); + }); + + const rootNodes = canvasData.nodes.filter(node => + !canvasData.edges.some(edge => edge.toNode === node.id) + ); + + console.log(rootNodes, edgeMap); + + rootNodes.forEach(rootNode => { + const tree = buildTree(rootNode.id, edgeMap, nodeMap, direction); + trees.push(tree); + }); + + return trees; } + +function buildTree(nodeId: string, edgeMap: Map, nodeMap: Map, direction: 'LR' | 'RL' | 'TB' | 'BT'): TreeNode { + const node = nodeMap.get(nodeId) as TreeNode; + console.log(nodeId, node, edgeMap.get(nodeId)); + + edgeMap.get(nodeId)?.forEach(childId => { + if (shouldAddChild(nodeId, childId, direction, nodeMap)) { + node.children.push(buildTree(childId, edgeMap, nodeMap, direction)); + } + }); + return node; +} + +function shouldAddChild(parentId: string, childId: string, direction: 'LR' | 'RL' | 'TB' | 'BT', nodeMap: Map): boolean { + const parent = nodeMap.get(parentId) as unknown as CanvasNodeData; + const child = nodeMap.get(childId) as unknown as CanvasNodeData; + + console.log(parent, child); + + switch (direction) { + case 'LR': + return parent.x < child.x; + case 'RL': + return parent.x > child.x; + case 'TB': + return parent.y < child.y; + case 'BT': + return parent.y > child.y; + default: + return true; + } +} +