feat: extract commands

This commit is contained in:
Michael Naumov 2026-01-16 23:27:46 -06:00
parent c321fbf247
commit 7f8722834b
3 changed files with 216 additions and 158 deletions

328
package-lock.json generated
View file

@ -50,13 +50,13 @@
}
},
"node_modules/@babel/code-frame": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz",
"integrity": "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-validator-identifier": "^7.27.1",
"@babel/helper-validator-identifier": "^7.28.5",
"js-tokens": "^4.0.0",
"picocolors": "^1.1.1"
},
@ -85,13 +85,13 @@
}
},
"node_modules/@babel/parser": {
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz",
"integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==",
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
"integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.5"
"@babel/types": "^7.28.6"
},
"bin": {
"parser": "bin/babel-parser.js"
@ -101,9 +101,9 @@
}
},
"node_modules/@babel/runtime": {
"version": "7.28.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
"integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz",
"integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==",
"dev": true,
"license": "MIT",
"engines": {
@ -111,9 +111,9 @@
}
},
"node_modules/@babel/types": {
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz",
"integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==",
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
"integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -1366,20 +1366,30 @@
}
},
"node_modules/@es-joy/jsdoccomment": {
"version": "0.78.0",
"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.78.0.tgz",
"integrity": "sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==",
"version": "0.79.0",
"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.79.0.tgz",
"integrity": "sha512-q/Nc241VsVRC5b1dgbsOI0fnWfrb1S9sdceFewpDHto4+4r2o6SSCpcY+Z+EdLdMPN6Nsj/PjlPcKag6WbU6XQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@types/estree": "^1.0.8",
"@typescript-eslint/types": "^8.46.4",
"@typescript-eslint/types": "^8.52.0",
"comment-parser": "1.4.1",
"esquery": "^1.6.0",
"esquery": "^1.7.0",
"jsdoc-type-pratt-parser": "~7.0.0"
},
"engines": {
"node": ">=20.11.0"
"node": "^20.19.0 || ^22.13.0 || >=24"
}
},
"node_modules/@es-joy/jsdoccomment/node_modules/comment-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/@es-joy/resolve.exports": {
@ -1835,14 +1845,14 @@
}
},
"node_modules/@eslint-community/eslint-plugin-eslint-comments": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.5.0.tgz",
"integrity": "sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==",
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.6.0.tgz",
"integrity": "sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^4.0.0",
"ignore": "^5.2.4"
"ignore": "^7.0.5"
},
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -2035,6 +2045,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/@eslint/eslintrc/node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@ -4271,16 +4291,6 @@
"typescript": ">=4.8.4 <6.0.0"
}
},
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/@typescript-eslint/parser": {
"version": "8.53.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.53.0.tgz",
@ -5846,9 +5856,9 @@
}
},
"node_modules/comment-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.3.tgz",
"integrity": "sha512-qvEp8Hk/uxsIbBe2gnu87CrP2wSFLzG0fIgcxF27DiBlD12Nlyydt91T4KQNiRxfebMxU5QEoWQBNiha+A9I3A==",
"dev": true,
"license": "MIT",
"engines": {
@ -6658,9 +6668,9 @@
}
},
"node_modules/d3-format": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz",
"integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==",
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz",
"integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==",
"dev": true,
"license": "ISC",
"engines": {
@ -7194,9 +7204,9 @@
"optional": true
},
"node_modules/devalue": {
"version": "5.6.1",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.1.tgz",
"integrity": "sha512-jDwizj+IlEZBunHcOuuFVBnIMPAEHvTsJj0BcIp94xYguLRVBcXO853px/MyIJvbVzWdsGvrRweIUWJw8hBP7A==",
"version": "5.6.2",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.2.tgz",
"integrity": "sha512-nPRkjWzzDQlsejL1WVifk5rvcFi/y1onBRxjaFMjZeR9mFpqu2gmAZ9xUB9/IEanEP/vBtGeGganC/GO1fmufg==",
"dev": true,
"license": "MIT",
"peer": true
@ -7386,9 +7396,9 @@
}
},
"node_modules/electron/node_modules/@types/node": {
"version": "22.19.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.5.tgz",
"integrity": "sha512-HfF8+mYcHPcPypui3w3mvzuIErlNOh2OAG+BCeBZCEwyiD5ls2SiCwEyT47OELtf7M3nHxBdu0FsmzdKxkN52Q==",
"version": "22.19.7",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.7.tgz",
"integrity": "sha512-MciR4AKGHWl7xwxkBa6xUGxQJ4VBOmPTF7sL+iGzuahOFaO0jHCsuEfS80pan1ef4gWId1oWOweIhrDEYLuaOw==",
"dev": true,
"license": "MIT",
"dependencies": {
@ -8097,13 +8107,13 @@
}
},
"node_modules/eslint-plugin-jsdoc": {
"version": "61.7.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-61.7.1.tgz",
"integrity": "sha512-36DpldF95MlTX//n3/naULFVt8d1cV4jmSkx7ZKrE9ikkKHAgMLesuWp1SmwpVwAs5ndIM6abKd6PeOYZUgdWg==",
"version": "62.0.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-62.0.0.tgz",
"integrity": "sha512-sNdIGLAvjFK3pB0SYFW74iXODZ4ifF8Ax13Wgq8jKepKnrCFzGo7+jRZfLf70h81SD7lPYnTE7MR2nhYSvaLTA==",
"dev": true,
"license": "BSD-3-Clause",
"dependencies": {
"@es-joy/jsdoccomment": "~0.78.0",
"@es-joy/jsdoccomment": "~0.79.0",
"@es-joy/resolve.exports": "1.2.0",
"are-docs-informative": "^0.0.2",
"comment-parser": "1.4.1",
@ -8119,12 +8129,22 @@
"to-valid-identifier": "^1.0.0"
},
"engines": {
"node": ">=20.11.0"
"node": "^20.19.0 || ^22.13.0 || >=24"
},
"peerDependencies": {
"eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/comment-parser": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
"integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/eslint-plugin-jsdoc/node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@ -8255,6 +8275,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint-plugin-n/node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/eslint-plugin-n/node_modules/minimatch": {
"version": "9.0.5",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
@ -8816,6 +8846,16 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/eslint/node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/eslint/node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@ -9704,16 +9744,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/globby/node_modules/ignore": {
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">= 4"
}
},
"node_modules/globby/node_modules/unicorn-magic": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz",
@ -10041,9 +10071,9 @@
"license": "BSD-3-Clause"
},
"node_modules/ignore": {
"version": "5.3.2",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"version": "7.0.5",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
"engines": {
@ -12789,9 +12819,9 @@
}
},
"node_modules/module-replacements": {
"version": "2.10.1",
"resolved": "https://registry.npmjs.org/module-replacements/-/module-replacements-2.10.1.tgz",
"integrity": "sha512-qkKuLpMHDqRSM676OPL7HUpCiiP3NSxgf8NNR1ga2h/iJLNKTsOSjMEwrcT85DMSti2vmOqxknOVBGWj6H6etQ==",
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/module-replacements/-/module-replacements-2.11.0.tgz",
"integrity": "sha512-j5sNQm3VCpQQ7nTqGeOZtoJtV3uKERgCBm9QRhmGRiXiqkf7iRFOkfxdJRZWLkqYY8PNf4cDQF/WfXUYLENrRA==",
"dev": true,
"license": "MIT"
},
@ -13131,90 +13161,90 @@
}
},
"node_modules/obsidian-dev-utils": {
"version": "46.17.1",
"resolved": "https://registry.npmjs.org/obsidian-dev-utils/-/obsidian-dev-utils-46.17.1.tgz",
"integrity": "sha512-InXfow2n/Zj2pfiPcoUQE/CtG8hEacTMgBhFzwLlpXGZ2vEvdOzDfjpt74ueTgk4eMHDyYz9pSFL2FfCahPhFA==",
"version": "48.0.2",
"resolved": "https://registry.npmjs.org/obsidian-dev-utils/-/obsidian-dev-utils-48.0.2.tgz",
"integrity": "sha512-mFRxp/6gHbO2V/196UTCKfRHH1TtmiohsF+SQyTuDJC+oKC6Bd0HDU9XSBKRsPOdCKo9YI12oX6DqAR3FDyNpQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@codemirror/state": "6.5.0",
"@codemirror/view": "6.38.6",
"@eslint-community/eslint-plugin-eslint-comments": "^4.5.0",
"@eslint/js": "^9.39.2",
"@guardian/eslint-plugin-tsdoc-required": "^0.1.3",
"@eslint-community/eslint-plugin-eslint-comments": "latest",
"@eslint/js": "latest",
"@guardian/eslint-plugin-tsdoc-required": "latest",
"@lezer/common": "1.2.3",
"@stylistic/eslint-plugin": "^5.6.1",
"@total-typescript/ts-reset": "^0.6.1",
"@tsconfig/strictest": "^2.0.8",
"@types/babel__core": "^7.20.5",
"@types/doctrine": "^0.0.9",
"@types/eslint": "^9.6.1",
"@types/luxon": "^3.7.1",
"@stylistic/eslint-plugin": "latest",
"@total-typescript/ts-reset": "latest",
"@tsconfig/strictest": "latest",
"@types/babel__core": "latest",
"@types/doctrine": "latest",
"@types/eslint": "latest",
"@types/luxon": "latest",
"@types/node": "25.0.3",
"@types/parsimmon": "^1.10.9",
"@types/path-browserify": "^1.0.3",
"@types/picomatch": "^4.0.2",
"@types/pug": "^2.0.10",
"@types/react": "^19.2.7",
"@types/shell-quote": "^1.7.5",
"@typescript-eslint/eslint-plugin": "^8.52.0",
"@typescript-eslint/parser": "^8.52.0",
"better-typescript-lib": "^2.12.0",
"commander": "^14.0.2",
"compare-versions": "^6.1.1",
"cspell": "^9.4.0",
"debug": "^4.4.3",
"dprint": "^0.51.1",
"enhanced-resolve": "^5.18.4",
"esbuild": "^0.27.2",
"esbuild-sass-plugin": "^3.3.1",
"esbuild-svelte": "^0.9.4",
"eslint": "^9.39.2",
"eslint-import-resolver-typescript": "^4.4.4",
"eslint-plugin-import-x": "^4.16.1",
"eslint-plugin-jsdoc": "^61.5.0",
"eslint-plugin-modules-newlines": "^0.0.7",
"eslint-plugin-obsidianmd": "^0.1.9",
"eslint-plugin-perfectionist": "^5.3.0",
"eslint-plugin-tsdoc": "^0.5.0",
"globals": "^17.0.0",
"i18next": "^25.7.3",
"jiti": "^2.6.1",
"linkinator": "^7.5.3",
"localforage": "^1.10.0",
"lru-cache": "^11.2.4",
"markdownlint": "^0.40.0",
"markdownlint-cli2": "^0.20.0",
"markdownlint-rule-relative-links": "^4.2.0",
"monkey-around": "^3.0.0",
"npm-run-all2": "^8.0.4",
"@types/parsimmon": "latest",
"@types/path-browserify": "latest",
"@types/picomatch": "latest",
"@types/pug": "latest",
"@types/react": "latest",
"@types/shell-quote": "latest",
"@typescript-eslint/eslint-plugin": "latest",
"@typescript-eslint/parser": "latest",
"better-typescript-lib": "latest",
"commander": "latest",
"compare-versions": "latest",
"cspell": "latest",
"debug": "latest",
"dprint": "latest",
"enhanced-resolve": "latest",
"esbuild": "latest",
"esbuild-sass-plugin": "latest",
"esbuild-svelte": "latest",
"eslint": "latest",
"eslint-import-resolver-typescript": "latest",
"eslint-plugin-import-x": "latest",
"eslint-plugin-jsdoc": "latest",
"eslint-plugin-modules-newlines": "latest",
"eslint-plugin-obsidianmd": "latest",
"eslint-plugin-perfectionist": "latest",
"eslint-plugin-tsdoc": "latest",
"globals": "latest",
"i18next": "latest",
"jiti": "latest",
"linkinator": "latest",
"localforage": "latest",
"lru-cache": "latest",
"markdownlint": "latest",
"markdownlint-cli2": "latest",
"markdownlint-rule-relative-links": "latest",
"monkey-around": "latest",
"npm-run-all2": "latest",
"obsidian": "latest",
"obsidian-typings": "obsidian-public-latest",
"path-browserify": "^1.0.1",
"postcss": "^8.5.6",
"postcss-modules": "^6.0.1",
"preact": "^10.28.2",
"react": "^19.2.3",
"remark": "^15.0.1",
"remark-parse": "^11.0.0",
"remark-wiki-link": "^2.0.1",
"sass": "^1.97.2",
"shell-quote": "^1.8.3",
"svelte-check": "^4.3.5",
"svelte-preprocess": "^6.0.3",
"type-fest": "^5.3.1",
"typescript": "^5.9.3",
"typescript-eslint": "^8.52.0",
"unist-util-visit": "^5.0.0"
"path-browserify": "latest",
"postcss": "latest",
"postcss-modules": "latest",
"preact": "latest",
"react": "latest",
"remark": "latest",
"remark-parse": "latest",
"remark-wiki-link": "latest",
"sass": "latest",
"shell-quote": "latest",
"svelte-check": "latest",
"svelte-preprocess": "latest",
"type-fest": "latest",
"typescript": "latest",
"typescript-eslint": "latest",
"unist-util-visit": "latest"
},
"bin": {
"obsidian-dev-utils": "dist/bin/cli.cjs"
}
},
"node_modules/obsidian-typings": {
"version": "4.92.0",
"resolved": "https://registry.npmjs.org/obsidian-typings/-/obsidian-typings-4.92.0.tgz",
"integrity": "sha512-U4c2gv5t+wk6K4j1BcfvzNXxluk2SIQgSo/oraVpg2hp/woIfuN3VOd+iwsdJ3Sky/zChxyplHHzi2nA2+QYpQ==",
"version": "4.93.0",
"resolved": "https://registry.npmjs.org/obsidian-typings/-/obsidian-typings-4.93.0.tgz",
"integrity": "sha512-6Recx5UyqQiDeGbrqmHvvlr9E3H3O/QBwVpJiX63h9kJ2PBoaH+UMP5BTxvul0BUFYDYb+3peT2xMUcZa+zHhw==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@ -15584,9 +15614,9 @@
}
},
"node_modules/svelte": {
"version": "5.46.1",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.1.tgz",
"integrity": "sha512-ynjfCHD3nP2el70kN5Pmg37sSi0EjOm9FgHYQdC4giWG/hzO3AatzXXJJgP305uIhGQxSufJLuYWtkY8uK/8RA==",
"version": "5.46.4",
"resolved": "https://registry.npmjs.org/svelte/-/svelte-5.46.4.tgz",
"integrity": "sha512-VJwdXrmv9L8L7ZasJeWcCjoIuMRVbhuxbss0fpVnR8yorMmjNDwcjIH08vS6wmSzzzgAG5CADQ1JuXPS2nwt9w==",
"dev": true,
"license": "MIT",
"peer": true,
@ -15599,7 +15629,7 @@
"aria-query": "^5.3.1",
"axobject-query": "^4.1.0",
"clsx": "^2.1.1",
"devalue": "^5.5.0",
"devalue": "^5.6.2",
"esm-env": "^1.2.1",
"esrap": "^2.2.1",
"is-reference": "^3.0.3",
@ -16019,9 +16049,9 @@
}
},
"node_modules/type-fest": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.0.tgz",
"integrity": "sha512-wfkA6r0tBpVfGiyO+zbf9e10QkRQSlK9F2UvyfnjoCmrvH2bjHyhPzhugSBOuq1dog3P0+FKckqe+Xf6WKVjwg==",
"version": "5.4.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.4.1.tgz",
"integrity": "sha512-xygQcmneDyzsEuKZrFbRMne5HDqMs++aFzefrJTgEIKjQ3rekM+RPfFCVq2Gp1VIDqddoYeppCj4Pcb+RZW0GQ==",
"dev": true,
"license": "(MIT OR CC0-1.0)",
"dependencies": {
@ -16158,9 +16188,9 @@
"license": "MIT"
},
"node_modules/ufo": {
"version": "1.6.2",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.2.tgz",
"integrity": "sha512-heMioaxBcG9+Znsda5Q8sQbWnLJSl98AFDXTO80wELWEzX3hordXsTdxrIfMQoO9IY1MEnoGoPjpoKpMj+Yx0Q==",
"version": "1.6.3",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz",
"integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==",
"dev": true,
"license": "MIT"
},
@ -16635,9 +16665,9 @@
}
},
"node_modules/which-typed-array": {
"version": "1.1.19",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz",
"integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==",
"version": "1.1.20",
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz",
"integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==",
"dev": true,
"license": "MIT",
"dependencies": {

View file

@ -0,0 +1,30 @@
import { CommandInvocationBase } from 'obsidian-dev-utils/obsidian/Commands/CommandBase';
import { NonEditorCommandBase } from 'obsidian-dev-utils/obsidian/Commands/NonEditorCommandBase';
import type { DevToolsComponent } from '../Components/DevToolsComponent.ts';
import type { Plugin } from '../Plugin.ts';
class ToggleDevToolsButtonCommandInvocation extends CommandInvocationBase<Plugin> {
public constructor(plugin: Plugin, private readonly devToolsComponent: DevToolsComponent) {
super(plugin);
}
public override async execute(): Promise<void> {
this.devToolsComponent.toggleDevToolsButton();
}
}
export class ToggleDevToolsButtonCommand extends NonEditorCommandBase<Plugin> {
public constructor(plugin: Plugin, private readonly devToolsComponent: DevToolsComponent) {
super({
icon: 'keyboard-toggle',
id: 'toggle-dev-tools-button',
name: 'Toggle dev tools button',
plugin
});
}
protected override createCommandInvocation(): CommandInvocationBase {
return new ToggleDevToolsButtonCommandInvocation(this.plugin, this.devToolsComponent);
}
}

View file

@ -7,6 +7,8 @@ import { throwExpression } from 'obsidian-dev-utils/Error';
import type { Plugin } from '../Plugin.ts';
import { ToggleDevToolsButtonCommand } from '../Commands/ToggleDevToolsButtonCommand.ts';
export class DevToolsComponent extends Component {
private erudaButton?: HTMLDivElement;
@ -27,11 +29,7 @@ export class DevToolsComponent extends Component {
this.erudaButton = erudaDiv.shadowRoot?.find('.eruda-entry-btn') as HTMLDivElement | undefined ?? throwExpression(new Error('Eruda button not found'));
this.erudaButton.hide();
this.plugin.addCommand({
callback: this.toggleDevToolsButton.bind(this),
id: 'toggle-dev-tools-button',
name: 'Toggle dev tools button'
});
new ToggleDevToolsButtonCommand(this.plugin, this).register();
this.register(() => {
erudaDiv.remove();
@ -39,6 +37,10 @@ export class DevToolsComponent extends Component {
this.registerDomEvent(erudaDiv, 'focusin', this.onFocusIn.bind(this));
}
public toggleDevToolsButton(): void {
this.erudaButton?.toggle(!this.erudaButton.isShown());
}
private isEnabled(): boolean {
return Platform.isMobile;
}
@ -46,8 +48,4 @@ export class DevToolsComponent extends Component {
private onFocusIn(evt: FocusEvent): void {
evt.stopPropagation();
}
private toggleDevToolsButton(): void {
this.erudaButton?.toggle(!this.erudaButton.isShown());
}
}