From edba685a794c0c2f96dabf0ed1cc5bdecdd02111 Mon Sep 17 00:00:00 2001 From: Sytone Date: Thu, 10 Nov 2022 21:39:03 +0000 Subject: [PATCH 01/34] feat: add parsing and display of priority/importance Fixes #8 --- package-lock.json | 3509 +------------------------------ src/api/todoApi.ts | 94 +- src/command/msTodoCommand.ts | 41 +- src/gui/msTodoSyncSettingTab.ts | 77 + src/lib/locale/en.json | 8 +- src/lib/locale/zh-cn.json | 8 +- src/model/ObsidianTodoTask.ts | 183 ++ 7 files changed, 387 insertions(+), 3533 deletions(-) create mode 100644 src/model/ObsidianTodoTask.ts diff --git a/package-lock.json b/package-lock.json index 22940f0..bdd0914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3442 +1,8 @@ { "name": "obsidian-mstodo-sync", "version": "1.0.1", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "obsidian-mstodo-sync", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@azure/msal-node": "^1.14.2", - "@microsoft/microsoft-graph-client": "^3.0.2", - "@microsoft/microsoft-graph-types": "^2.25.0", - "eventemitter2": "^6.4.5", - "node-fetch": "^2.6.1" - }, - "devDependencies": { - "@types/node": "^16.11.6", - "@types/node-fetch": "^2.6.2", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", - "builtin-modules": "3.3.0", - "esbuild": "0.14.47", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-no-loops": "^0.3.0", - "eslint-plugin-prettier": "^4.2.1", - "obsidian": "latest", - "prettier": "^2.7.1", - "tslib": "2.4.0", - "typescript": "4.7.4" - } - }, - "node_modules/@azure/msal-common": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", - "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz", - "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==", - "dependencies": { - "@azure/msal-common": "^7.6.0", - "jsonwebtoken": "^8.5.1", - "uuid": "^8.3.0" - }, - "engines": { - "node": "10 || 12 || 14 || 16 || 18" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "dependencies": { - "regenerator-runtime": "^0.13.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/state": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz", - "integrity": "sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==", - "dev": true, - "peer": true - }, - "node_modules/@codemirror/view": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.4.1.tgz", - "integrity": "sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==", - "dev": true, - "peer": true, - "dependencies": { - "@codemirror/state": "^6.0.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@microsoft/microsoft-graph-client": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.3.tgz", - "integrity": "sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependenciesMeta": { - "@azure/identity": { - "optional": true - }, - "@azure/msal-browser": { - "optional": true - }, - "buffer": { - "optional": true - }, - "stream-browserify": { - "optional": true - } - } - }, - "node_modules/@microsoft/microsoft-graph-types": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.25.0.tgz", - "integrity": "sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/codemirror": { - "version": "0.0.108", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", - "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", - "dev": true, - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", - "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/type-utils": "5.29.0", - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", - "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", - "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", - "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "esbuild-android-64": "0.14.47", - "esbuild-android-arm64": "0.14.47", - "esbuild-darwin-64": "0.14.47", - "esbuild-darwin-arm64": "0.14.47", - "esbuild-freebsd-64": "0.14.47", - "esbuild-freebsd-arm64": "0.14.47", - "esbuild-linux-32": "0.14.47", - "esbuild-linux-64": "0.14.47", - "esbuild-linux-arm": "0.14.47", - "esbuild-linux-arm64": "0.14.47", - "esbuild-linux-mips64le": "0.14.47", - "esbuild-linux-ppc64le": "0.14.47", - "esbuild-linux-riscv64": "0.14.47", - "esbuild-linux-s390x": "0.14.47", - "esbuild-netbsd-64": "0.14.47", - "esbuild-openbsd-64": "0.14.47", - "esbuild-sunos-64": "0.14.47", - "esbuild-windows-32": "0.14.47", - "esbuild-windows-64": "0.14.47", - "esbuild-windows-arm64": "0.14.47" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", - "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", - "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", - "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", - "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", - "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", - "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", - "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", - "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", - "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", - "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", - "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", - "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", - "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", - "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", - "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", - "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", - "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", - "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", - "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", - "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/eslint-plugin-no-loops": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", - "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obsidian": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", - "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", - "dev": true, - "dependencies": { - "@types/codemirror": "0.0.108", - "moment": "2.29.4" - }, - "peerDependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", - "dev": true, - "peer": true - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "dev": true, - "peer": true - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, "dependencies": { "@azure/msal-common": { "version": "7.6.0", @@ -3545,25 +111,6 @@ "regenerator-runtime": "^0.13.10" } }, - "@codemirror/state": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.1.2.tgz", - "integrity": "sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==", - "dev": true, - "peer": true - }, - "@codemirror/view": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.4.1.tgz", - "integrity": "sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==", - "dev": true, - "peer": true, - "requires": { - "@codemirror/state": "^6.0.0", - "style-mod": "^4.0.0", - "w3c-keyname": "^2.2.4" - } - }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -3803,8 +350,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.12.6", @@ -3888,15 +434,8 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", - "requires": { - "follow-redirects": "^1.14.4" - } + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "balanced-match": { "version": "1.0.2", @@ -3979,6 +518,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -4028,7 +568,8 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true }, "dir-glob": { "version": "3.0.1", @@ -4380,8 +921,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -4475,8 +1015,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "4.2.1", @@ -4676,15 +1215,11 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, - "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" - }, "form-data": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -5190,12 +1725,14 @@ "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "requires": { "mime-db": "1.52.0" } @@ -5583,13 +2120,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "style-mod": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.0.0.tgz", - "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw==", - "dev": true, - "peer": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5745,13 +2275,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "w3c-keyname": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.6.tgz", - "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg==", - "dev": true, - "peer": true - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -5800,12 +2323,6 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", - "requires": {} - }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 76b5048..ba567c4 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,7 +1,7 @@ import * as msal from '@azure/msal-node'; import * as msalCommon from '@azure/msal-common'; import { Client } from '@microsoft/microsoft-graph-client'; -import { TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; +import { Importance, TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; import { DataAdapter, Notice } from 'obsidian'; import { MicrosoftAuthModal } from '../gui/microsoftAuthModal'; export class TodoApi { @@ -65,21 +65,91 @@ export class TodoApi { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; return (await this.client.api(endpoint).get()) as TodoTask; } - async createTask(listId: string | undefined, title: string, body?: string): Promise { + + /* + { + "@odata.type": "#microsoft.graph.todoTask", + "id": "String (identifier)", + "body": { + "@odata.type": "microsoft.graph.itemBody" + }, + "categories": ["string"], + "completedDateTime": { + "@odata.type": "microsoft.graph.dateTimeTimeZone" + }, + "dueDateTime": { + "@odata.type": "microsoft.graph.dateTimeTimeZone" + }, + "importance": "String", // low, normal, high + "isReminderOn": "Boolean", + "recurrence": { + "@odata.type": "microsoft.graph.patternedRecurrence" + }, + "reminderDateTime": { + "@odata.type": "microsoft.graph.dateTimeTimeZone" + }, + "status": "String", + "title": "String", + "createdDateTime": "String (timestamp)", + "lastModifiedDateTime": "String (timestamp)", + "bodyLastModifiedDateTime": "String (timestamp)" + } + */ + async createTask(listId: string | undefined, title: string, body?: string, importance?: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks`; - return await this.client.api(endpoint).post({ - title: title, - body: { - content: body, - contentType: 'text', - }, - }); + const toDo: TodoTask = this.getToDoTaskObject(title, body, importance); + return await this.client.api(endpoint).post(toDo); } - async updateTask(listId: string | undefined, taskId: string, title: string): Promise { + + async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks`; + return await this.client.api(endpoint).post(toDo); + } + + async updateTask( + listId: string | undefined, + taskId: string, + title: string, + body?: string, + importance?: string, + ): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return await this.client.api(endpoint).patch({ + const toDo: TodoTask = this.getToDoTaskObject(title, body, importance); + + return await this.client.api(endpoint).patch(toDo); + } + + async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + return await this.client.api(endpoint).patch(toDo); + } + + /** + * Takes a set of primitive values and returns a TodoTask object. This + * is used in the create and update paths. + * + * @param {string} title + * @param {string} [body] + * @param {string} [importance] + * @return {*} + * @memberof TodoApi + */ + getToDoTaskObject(title: string, body?: string, importance?: string) { + const toDo: TodoTask = { title: title, - }); + }; + + if (body && body.length > 0) { + toDo.body = { + content: body, + contentType: 'text', + }; + } + + if (importance && importance.length > 0) { + toDo.importance = importance as Importance; + } + return toDo; } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index d580322..2da0ced 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,5 +1,6 @@ import { Editor, Notice } from 'obsidian'; import { formatTask } from 'src/utils/formatter'; +import { ObsidianTodoTask } from 'src/model/ObsidianTodoTask'; import MsTodoSync from '../main'; import { TodoApi } from '../api/todoApi'; import { MsTodoSyncSettings } from '../gui/msTodoSyncSettingTab'; @@ -35,7 +36,6 @@ export async function postTask( return; } new Notice('创建待办中...', 3000); - const body = `${t('displayOptions_CreatedInFile')} [[${fileName}]]`; const formatted = editor .getSelection() .replace(/(- \[ \] )|\*|^> |^#* |- /gm, '') @@ -44,30 +44,25 @@ export async function postTask( log('debug', formatted.join(' :: ')); Promise.all( formatted.map(async (s) => { - const line = s.trim(); - const regex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; - const blocklistMatch = regex.exec(line); - if (blocklistMatch) { - const blocklink = blocklistMatch[1]; - const taskId = plugin.settings.taskIdLookup[blocklink]; - //FIXME If there's a 'Created at xxxx' replaced line, - // it's not enough to get a cleanTaskTitle after the next line. - const cleanTaskTitle = line.replace(`^${blocklink}`, ''); + const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); - console.log(blocklink); - console.log(taskId); - const updatedTask = await todoApi.updateTask(listId, taskId, cleanTaskTitle); - console.log(updatedTask); - return { line: cleanTaskTitle, index: blocklink }; + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + if (todo.hasBlockLink && todo.id) { + log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo); + log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + log('debug', `updated: ${returnedTask.id}`); + + return { line: todo.title, index: todo.blockLink }; } else { - const newTask = await todoApi.createTask(listId, line, body); - plugin.settings.taskIdIndex = plugin.settings.taskIdIndex + 1; - const index = `${Math.random().toString(20).substring(2, 6)}${plugin.settings.taskIdIndex - .toString() - .padStart(5, '0')}`; - plugin.settings.taskIdLookup[index] = newTask.id === undefined ? '' : newTask.id; - await plugin.saveSettings(); - return { line, index }; + const returnedTask = await todoApi.createTaskFromToDo(listId, todo); + + todo.cacheTaskId(returnedTask.id); + log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + + return { line: todo.title, index: todo.blockLink }; } }), ).then((res) => { diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index d14aa4e..454816a 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -24,6 +24,15 @@ export interface MsTodoSyncSettings { displayOptions_ReplaceAddCreatedAt: boolean; displayOptions_ReplacementFormat: string; + // importance + // The importance of the task. Possible values + // are: low, normal, high. + // By default it is normal and the absence of a + // indicator will also mean normal. + displayOptions_TaskImportance_Low: string; + displayOptions_TaskImportance_Normal: string; + displayOptions_TaskImportance_High: string; + // Microsoft To Do open handler. todo_OpenUsingApplicationProtocol: boolean; @@ -53,6 +62,11 @@ export const DEFAULT_SETTINGS: MsTodoSyncSettings = { displayOptions_TaskBodyPrefix: '💡', displayOptions_ReplaceAddCreatedAt: false, displayOptions_ReplacementFormat: '- [ ] {{TASK}}', + + displayOptions_TaskImportance_Low: '🔽', + displayOptions_TaskImportance_Normal: '🔼', + displayOptions_TaskImportance_High: '⏫', + todo_OpenUsingApplicationProtocol: true, loggingOptions: { @@ -74,6 +88,36 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { this.settings = plugin.settings; } + /** + * Creates a setting entry in the settings form + * for text based properties. If there is a update + * it will save the new value. + * + * @param {HTMLElement} containerEl + * @param {string} title + * @param {string} description + * @param {string} currentValue + * @param {(value: string) => any} changeCallback + * @memberof MsTodoSyncSettingTab + */ + addTextSetting( + containerEl: HTMLElement, + title: string, + description: string, + currentValue: string, + changeCallback: (value: string) => any, + ): void { + new Setting(containerEl) + .setName(t(title)) + .setDesc(t(description)) + .addText((text) => + text.setValue(currentValue).onChange(async (value) => { + changeCallback(value); + await this.plugin.saveSettings(); + }), + ); + } + display(): void { const { containerEl } = this; @@ -154,6 +198,39 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }), ); + // Task Importance Indicators - High + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_HighName', + 'Settings_Todo_Display_Importance_HighDescription', + this.settings.displayOptions_TaskImportance_High, + async (value) => { + this.settings.displayOptions_TaskImportance_High = value; + }, + ); + + // Task Importance Indicators - Normal + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_NormalName', + 'Settings_Todo_Display_Importance_NormalDescription', + this.settings.displayOptions_TaskImportance_Normal, + async (value) => { + this.settings.displayOptions_TaskImportance_Normal = value; + }, + ); + + // Task Importance Indicators - Low + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_LowName', + 'Settings_Todo_Display_Importance_LowDescription', + this.settings.displayOptions_TaskImportance_Low, + async (value) => { + this.settings.displayOptions_TaskImportance_Low = value; + }, + ); + containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle((toggle) => toggle.setValue(this.settings.diary.stayWithPN).onChange(async (value) => { diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index 6b69e7b..b7353ea 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -50,5 +50,11 @@ "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "If you select to replace the task and this is enabled 'Created at {Time Format}'", "EditorMenu_OpenToDo": "Open To Do", "Settings_Todo_OpenUsingApplicationProtocolTitle": "Open with application protocol?", - "Settings_Todo_OpenUsingApplicationProtocolDescription": "If this is set to true it will open the todo in the locally installed application, set it to off if you want to open the todo in the browser." + "Settings_Todo_OpenUsingApplicationProtocolDescription": "If this is set to true it will open the todo in the locally installed application, set it to off if you want to open the todo in the browser.", + "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", + "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", + "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line." } diff --git a/src/lib/locale/zh-cn.json b/src/lib/locale/zh-cn.json index e579e3f..0f6dfc6 100644 --- a/src/lib/locale/zh-cn.json +++ b/src/lib/locale/zh-cn.json @@ -50,5 +50,11 @@ "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "在选择“创建待办并替换”时添加当前时间,格式为上面填写的时间格式", "EditorMenu_OpenToDo": "在微软Todo中打开", "Settings_Todo_OpenUsingApplicationProtocolTitle": "使用微软Todo桌面应用打开待办", - "Settings_Todo_OpenUsingApplicationProtocolDescription": "选中则使用微软Todo桌面应用打开待办,未选中则在浏览器中打开" + "Settings_Todo_OpenUsingApplicationProtocolDescription": "选中则使用微软Todo桌面应用打开待办,未选中则在浏览器中打开", + "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", + "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", + "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line." } diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts new file mode 100644 index 0000000..7ed5334 --- /dev/null +++ b/src/model/ObsidianTodoTask.ts @@ -0,0 +1,183 @@ +import { + AttachmentBase, + AttachmentSession, + ChecklistItem, + DateTimeTimeZone, + Extension, + Importance, + ItemBody, + LinkedResource, + NullableOption, + PatternedRecurrence, + TaskStatus, + TodoTask, +} from '@microsoft/microsoft-graph-types'; +import { MsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; +import MsTodoSync from './../main'; +import { t } from './../lib/lang'; +import { log } from './../lib/logging'; + +export class ObsidianTodoTask implements TodoTask { + id?: string; + + // The task body that typically contains information about the task. + public body?: NullableOption; + /** + * The date and time when the task body was last modified. By default, it is in UTC. You can provide a custom time zone in + * the request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan + * 1, 2020 would look like this: '2020-01-01T00:00:00Z'. + */ + public bodyLastModifiedDateTime?: string; + /** + * The categories associated with the task. Each category corresponds to the displayName property of an outlookCategory + * that the user has defined. + */ + public categories?: NullableOption; + // The date and time in the specified time zone that the task was finished. + public completedDateTime?: NullableOption; + /** + * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the + * request header. The property value uses ISO 8601 format. For example, midnight UTC on Jan 1, 2020 would look like this: + * '2020-01-01T00:00:00Z'. + */ + public createdDateTime?: string; + // The date and time in the specified time zone that the task is to be finished. + public dueDateTime?: NullableOption; + public hasAttachments?: NullableOption; + // The importance of the task. Possible values are: low, normal, high. + public importance?: Importance; + // Set to true if an alert is set to remind the user of the task. + public isReminderOn?: boolean; + /** + * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the + * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, + * 2020 would look like this: '2020-01-01T00:00:00Z'. + */ + public lastModifiedDateTime?: string; + // The recurrence pattern for the task. + public recurrence?: NullableOption; + // The date and time in the specified time zone for a reminder alert of the task to occur. + public reminderDateTime?: NullableOption; + public startDateTime?: NullableOption; + /** + * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, + * deferred. + */ + public status?: TaskStatus; + // A brief description of the task. + public title?: NullableOption; + public attachments?: NullableOption; + public attachmentSessions?: NullableOption; + // A collection of checklistItems linked to a task. + public checklistItems?: NullableOption; + // The collection of open extensions defined for the task. Nullable. + public extensions?: NullableOption; + // A collection of resources linked to the task. + public linkedResources?: NullableOption; + + public blockLink?: string; + public fileName?: string; + private plugin: MsTodoSync; + private settings: MsTodoSyncSettings; + + /** + * + */ + constructor(plugin: MsTodoSync, line: string, fileName: string) { + this.plugin = plugin; + this.settings = plugin.settings; + this.fileName = fileName; + + this.title = line.trim(); + + this.checkForBlockLink(line); + + this.checkForImportance(line); + + this.body = { + content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + contentType: 'text', + }; + } + + private checkForImportance(line: string) { + this.importance = 'normal'; + + if (line.includes(this.settings.displayOptions_TaskImportance_Low)) { + this.importance = 'low'; + } + + if (line.includes(this.settings.displayOptions_TaskImportance_High)) { + this.importance = 'high'; + } + } + + private checkForBlockLink(line: string) { + const blocklinkRegex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; + const blocklinkMatch = blocklinkRegex.exec(line); + if (blocklinkMatch) { + this.blockLink = blocklinkMatch[1]; + + //FIXME If there's a 'Created at xxxx' replaced line, + // it's not enough to get a cleanTaskTitle after the next line. + this.title = line.replace(`^${this.blockLink}`, ''); + } + + if (this.hasBlockLink && this.blockLink) { + this.id = this.settings.taskIdLookup[this.blockLink]; + } + } + + public get cleanTitle(): string { + return ''; + } + + public get hasBlockLink(): boolean { + return this.blockLink !== undefined && this.blockLink.length > 0; + } + + /** + * Cache the ID internally and generate blocklink. + * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask + */ + public async cacheTaskId(id?: string): Promise { + this.settings.taskIdIndex = this.settings.taskIdIndex + 1; + const index = `${Math.random().toString(20).substring(2, 6)}${this.settings.taskIdIndex + .toString() + .padStart(5, '0')}`; + this.settings.taskIdLookup[index] = id ?? ''; + await this.plugin.saveSettings(); + this.blockLink = index; + } + + /** + * Takes a set of primitive values and returns a TodoTask object. This + * is used in the create and update paths. + * + * @param {string} title + * @param {string} [body] + * @param {string} [importance] + * @return {*} + * @memberof TodoApi + */ + getToDoTask(title: string, body?: string, importance?: string) { + const toDo: TodoTask = { + title: title, + }; + + if (body && body.length > 0) { + toDo.body = { + content: body, + contentType: 'text', + }; + } + + if (importance && importance.length > 0) { + toDo.importance = importance as Importance; + } + return toDo; + } +} From 003d9f76c4bb02cfd7ad379f5f0f6396f3856b7a Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 10 Nov 2022 16:32:46 -0800 Subject: [PATCH 02/34] feat: priority sync on update --- src/command/msTodoCommand.ts | 37 ++++++++--------- src/constants.ts | 1 + src/gui/msTodoSyncSettingTab.ts | 5 ++- src/lib/logging.ts | 5 +-- src/model/ObsidianTodoTask.ts | 70 ++++++++++++++++++++++++++++++++- 5 files changed, 90 insertions(+), 28 deletions(-) diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 2da0ced..4fcbdb2 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,11 +1,10 @@ import { Editor, Notice } from 'obsidian'; -import { formatTask } from 'src/utils/formatter'; import { ObsidianTodoTask } from 'src/model/ObsidianTodoTask'; import MsTodoSync from '../main'; import { TodoApi } from '../api/todoApi'; import { MsTodoSyncSettings } from '../gui/msTodoSyncSettingTab'; import { t } from './../lib/lang'; -import { log } from './../lib/logging'; +import { log, logging } from './../lib/logging'; export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { const regex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; @@ -27,6 +26,8 @@ export async function postTask( plugin: MsTodoSync, replace?: boolean, ) { + const logger = logging.getLogger('mstodo-sync.command.post'); + if (!editor.somethingSelected()) { new Notice('好像没有选中什么'); return; @@ -49,21 +50,22 @@ export async function postTask( // If there is a block link in the line, we will try to find // the task id from the block link and update the task instead. if (todo.hasBlockLink && todo.id) { - log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo); - log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - log('debug', `updated: ${returnedTask.id}`); + logger.debug(`Updating Task: ${todo.title}`); - return { line: todo.title, index: todo.blockLink }; + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); } else { - const returnedTask = await todoApi.createTaskFromToDo(listId, todo); + logger.debug(`Creating Task: ${todo.title}`); - todo.cacheTaskId(returnedTask.id); - log('debug', `blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); - return { line: todo.title, index: todo.blockLink }; + todo.status = returnedTask.status; + todo.cacheTaskId(returnedTask.id); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } + + return todo; }), ).then((res) => { new Notice('创建待办成功√'); @@ -71,15 +73,8 @@ export async function postTask( editor.replaceSelection( res .map((i) => { - let createdAt = ''; - const blocklink = `^${i.index}`; - const formattedTask = formatTask(plugin, i.line); - if (plugin.settings.displayOptions_ReplaceAddCreatedAt) { - createdAt = `${t('displayOptions_CreatedAtTime')} ${window - .moment() - .format(plugin.settings.displayOptions_TimeFormat)}`; - } - return `${formattedTask} ${createdAt} ${blocklink}`; + logger.debug('Processed blockLink', i.blockLink); + return i.getMarkdownTask(); }) .join('\n'), ); diff --git a/src/constants.ts b/src/constants.ts index 10d545e..99f282b 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,2 +1,3 @@ // Format export const TASK_REGEX = new RegExp(/{{TASK}}/); +export const IMPORTANCE_REGEX = new RegExp(/{{IMPORTANCE}}/); diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 454816a..02ff3db 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -61,7 +61,7 @@ export const DEFAULT_SETTINGS: MsTodoSyncSettings = { displayOptions_TaskStartPrefix: '🛫', displayOptions_TaskBodyPrefix: '💡', displayOptions_ReplaceAddCreatedAt: false, - displayOptions_ReplacementFormat: '- [ ] {{TASK}}', + displayOptions_ReplacementFormat: '- [ ] {{TASK}} {{IMPORTANCE}}', displayOptions_TaskImportance_Low: '🔽', displayOptions_TaskImportance_Normal: '🔼', @@ -71,7 +71,8 @@ export const DEFAULT_SETTINGS: MsTodoSyncSettings = { loggingOptions: { minLevels: { - '': 'info', + '': 'debug', + 'mstodo-sync': 'debug', }, }, taskIdLookup: { ['0000ABCD']: '0' }, diff --git a/src/lib/logging.ts b/src/lib/logging.ts index bc7f7c1..20ecd23 100644 --- a/src/lib/logging.ts +++ b/src/lib/logging.ts @@ -1,4 +1,3 @@ -import { Z_VERSION_ERROR } from 'zlib'; import moment from 'moment'; import { Platform, Plugin } from 'obsidian'; /* @@ -71,8 +70,8 @@ export type TLogLevelName = ILogLevel[TLogLevelId]; export class LogManager extends EventEmitter2 { private options: LogOptions = { minLevels: { - '': 'info', - 'mstodo-sync': 'info', + '': 'debug', + 'mstodo-sync': 'debug', }, }; diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 7ed5334..8115e48 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -15,7 +15,8 @@ import { import { MsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; import MsTodoSync from './../main'; import { t } from './../lib/lang'; -import { log } from './../lib/logging'; +import { logging } from './../lib/logging'; +import { IMPORTANCE_REGEX, TASK_REGEX } from './../constants'; export class ObsidianTodoTask implements TodoTask { id?: string; @@ -79,6 +80,7 @@ export class ObsidianTodoTask implements TodoTask { public fileName?: string; private plugin: MsTodoSync; private settings: MsTodoSyncSettings; + logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); /** * @@ -90,6 +92,8 @@ export class ObsidianTodoTask implements TodoTask { this.title = line.trim(); + // This will strip out the block link if it exists as + // it is part of this plugin and not user specified. this.checkForBlockLink(line); this.checkForImportance(line); @@ -100,6 +104,50 @@ export class ObsidianTodoTask implements TodoTask { }; } + public getTodoTask(): TodoTask { + const toDo: TodoTask = { + title: this.title, + }; + + if (this.body && this.body.content && this.body.content.length > 0) { + toDo.body = this.body; + } + + if (this.importance && this.importance.length > 0) { + toDo.importance = this.importance as Importance; + } + return toDo; + } + + public getMarkdownTask(): string { + let output: string; + const format = this.settings.displayOptions_ReplacementFormat; + const priorityIndicator = this.getPriorityIndicator(); + + // eslint-disable-next-line prefer-const + output = format.replace(TASK_REGEX, this.title ?? ''); + + if (output.includes(priorityIndicator)) { + // Already in title, don't add it again and clear replacement tag. + output = output.replace(IMPORTANCE_REGEX, ''); + } else { + output = output.replace(IMPORTANCE_REGEX, priorityIndicator); + } + + if (this.settings.displayOptions_ReplaceAddCreatedAt) { + output = `${output} ${t('displayOptions_CreatedAtTime')} ${window + .moment() + .format(this.settings.displayOptions_TimeFormat)}`; + } + + // Append blocklink at the end if it exists + if (this.hasBlockLink && this.blockLink) { + output = `${output} ^${this.blockLink}`; + } + + return output; + } + private checkForImportance(line: string) { this.importance = 'normal'; @@ -112,6 +160,19 @@ export class ObsidianTodoTask implements TodoTask { } } + private getPriorityIndicator(): string { + switch (this.importance) { + case 'normal': + return this.settings.displayOptions_TaskImportance_Normal; + case 'low': + return this.settings.displayOptions_TaskImportance_Low; + case 'high': + return this.settings.displayOptions_TaskImportance_High; + default: + return ''; + } + } + private checkForBlockLink(line: string) { const blocklinkRegex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; const blocklinkMatch = blocklinkRegex.exec(line); @@ -145,12 +206,17 @@ export class ObsidianTodoTask implements TodoTask { */ public async cacheTaskId(id?: string): Promise { this.settings.taskIdIndex = this.settings.taskIdIndex + 1; + const index = `${Math.random().toString(20).substring(2, 6)}${this.settings.taskIdIndex .toString() .padStart(5, '0')}`; + this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settings.taskIdIndex}`); + this.settings.taskIdLookup[index] = id ?? ''; - await this.plugin.saveSettings(); this.blockLink = index; + this.id = id; + + await this.plugin.saveSettings(); } /** From 759288f5d3c0359f425677eceacfa144b0a4d8a7 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 11 Nov 2022 18:26:17 -0800 Subject: [PATCH 03/34] feat: multiline task --- .gitattributes | 4 + esbuild.config.mjs | 72 +- package-lock.json | 3371 ++++++++++++++++++++++++++++++- src/api/todoApi.ts | 78 +- src/command/msTodoCommand.ts | 140 +- src/constants.ts | 1 + src/gui/microsoftAuthModal.ts | 5 +- src/gui/msTodoSyncSettingTab.ts | 39 +- src/lib/locale/en.json | 15 +- src/lib/locale/zh-cn.json | 13 +- src/main.ts | 20 +- src/model/ObsidianTodoTask.ts | 98 +- 12 files changed, 3697 insertions(+), 159 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3623f74 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +*.js eol=lf +*.jsx eol=lf +*.json eol=lf +*.ts eol=lf diff --git a/esbuild.config.mjs b/esbuild.config.mjs index b33ec53..aa59f1c 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,42 +1,44 @@ -import esbuild from "esbuild"; -import process from "process"; -import builtins from 'builtin-modules' +import process from 'process'; +import esbuild from 'esbuild'; +import builtins from 'builtin-modules'; -const banner = -`/* +const banner = `/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ `; -const prod = (process.argv[2] === 'production'); +const prod = process.argv[2] === 'production'; -esbuild.build({ - banner: { - js: banner, - }, - entryPoints: ['src/main.ts'], - bundle: true, - external: [ - 'obsidian', - 'electron', - '@codemirror/autocomplete', - '@codemirror/collab', - '@codemirror/commands', - '@codemirror/language', - '@codemirror/lint', - '@codemirror/search', - '@codemirror/state', - '@codemirror/view', - '@lezer/common', - '@lezer/highlight', - '@lezer/lr', - ...builtins], - format: 'cjs', - watch: !prod, - target: 'es2018', - logLevel: "info", - sourcemap: prod ? false : 'inline', - treeShaking: true, - outfile: 'main.js', -}).catch(() => process.exit(1)); +esbuild + .build({ + banner: { + js: banner, + }, + entryPoints: ['src/main.ts'], + bundle: true, + external: [ + 'obsidian', + 'electron', + '@codemirror/autocomplete', + '@codemirror/collab', + '@codemirror/commands', + '@codemirror/language', + '@codemirror/lint', + '@codemirror/search', + '@codemirror/state', + '@codemirror/view', + '@lezer/common', + '@lezer/highlight', + '@lezer/lr', + ...builtins, + ], + format: 'cjs', + watch: !prod, + target: 'es2018', + logLevel: 'info', + sourcemap: prod ? false : 'inline', + treeShaking: true, + outfile: 'main.js', + }) + .catch(() => process.exit(1)); diff --git a/package-lock.json b/package-lock.json index bdd0914..8088f4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,3368 @@ { "name": "obsidian-mstodo-sync", "version": "1.0.1", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "obsidian-mstodo-sync", + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@azure/msal-node": "^1.14.2", + "@microsoft/microsoft-graph-client": "^3.0.2", + "@microsoft/microsoft-graph-types": "^2.25.0", + "eventemitter2": "^6.4.5", + "node-fetch": "^2.6.1" + }, + "devDependencies": { + "@types/node": "^16.11.6", + "@types/node-fetch": "^2.6.2", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.14.47", + "eslint": "^7.22.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-no-loops": "^0.3.0", + "eslint-plugin-prettier": "^4.2.1", + "obsidian": "latest", + "prettier": "^2.7.1", + "tslib": "2.4.0", + "typescript": "4.7.4" + } + }, + "node_modules/@azure/msal-common": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", + "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@azure/msal-node": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz", + "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==", + "dependencies": { + "@azure/msal-common": "^7.6.0", + "jsonwebtoken": "^8.5.1", + "uuid": "^8.3.0" + }, + "engines": { + "node": "10 || 12 || 14 || 16 || 18" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", + "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", + "dependencies": { + "regenerator-runtime": "^0.13.10" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@microsoft/microsoft-graph-client": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.3.tgz", + "integrity": "sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependenciesMeta": { + "@azure/identity": { + "optional": true + }, + "@azure/msal-browser": { + "optional": true + }, + "buffer": { + "optional": true + }, + "stream-browserify": { + "optional": true + } + } + }, + "node_modules/@microsoft/microsoft-graph-types": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.25.0.tgz", + "integrity": "sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/codemirror": { + "version": "0.0.108", + "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", + "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", + "dev": true, + "dependencies": { + "@types/tern": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", + "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.18.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", + "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", + "dev": true + }, + "node_modules/@types/node-fetch": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^3.0.0" + } + }, + "node_modules/@types/tern": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", + "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", + "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/type-utils": "5.29.0", + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "functional-red-black-tree": "^1.0.1", + "ignore": "^5.2.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", + "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", + "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", + "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", + "dev": true, + "dependencies": { + "@typescript-eslint/utils": "5.29.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", + "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", + "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/visitor-keys": "5.29.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", + "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.29.0", + "@typescript-eslint/types": "5.29.0", + "@typescript-eslint/typescript-estree": "5.29.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.29.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", + "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.29.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", + "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/es-abstract": { + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", + "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", + "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-64": "0.14.47", + "esbuild-android-arm64": "0.14.47", + "esbuild-darwin-64": "0.14.47", + "esbuild-darwin-arm64": "0.14.47", + "esbuild-freebsd-64": "0.14.47", + "esbuild-freebsd-arm64": "0.14.47", + "esbuild-linux-32": "0.14.47", + "esbuild-linux-64": "0.14.47", + "esbuild-linux-arm": "0.14.47", + "esbuild-linux-arm64": "0.14.47", + "esbuild-linux-mips64le": "0.14.47", + "esbuild-linux-ppc64le": "0.14.47", + "esbuild-linux-riscv64": "0.14.47", + "esbuild-linux-s390x": "0.14.47", + "esbuild-netbsd-64": "0.14.47", + "esbuild-openbsd-64": "0.14.47", + "esbuild-sunos-64": "0.14.47", + "esbuild-windows-32": "0.14.47", + "esbuild-windows-64": "0.14.47", + "esbuild-windows-arm64": "0.14.47" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", + "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", + "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", + "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", + "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", + "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", + "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", + "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", + "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", + "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", + "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", + "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", + "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", + "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", + "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", + "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", + "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", + "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", + "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", + "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.47", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", + "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", + "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-no-loops": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", + "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", + "dev": true, + "peerDependencies": { + "eslint": ">=2.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", + "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.9", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", + "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.17.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", + "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonwebtoken": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=4", + "npm": ">=1.4.28" + } + }, + "node_modules/jsonwebtoken/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obsidian": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", + "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", + "dev": true, + "dependencies": { + "@types/codemirror": "0.0.108", + "moment": "2.29.4" + }, + "peerDependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", + "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/regenerator-runtime": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", + "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", + "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", + "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "dev": true + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + }, "dependencies": { "@azure/msal-common": { "version": "7.6.0", @@ -350,7 +3710,8 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true + "dev": true, + "requires": {} }, "ajv": { "version": "6.12.6", @@ -921,7 +4282,8 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true + "dev": true, + "requires": {} }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -1015,7 +4377,8 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true + "dev": true, + "requires": {} }, "eslint-plugin-prettier": { "version": "4.2.1", diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index ba567c4..a078a42 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,7 +1,7 @@ import * as msal from '@azure/msal-node'; import * as msalCommon from '@azure/msal-common'; import { Client } from '@microsoft/microsoft-graph-client'; -import { Importance, TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; +import { TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; import { DataAdapter, Notice } from 'obsidian'; import { MicrosoftAuthModal } from '../gui/microsoftAuthModal'; export class TodoApi { @@ -66,91 +66,15 @@ export class TodoApi { return (await this.client.api(endpoint).get()) as TodoTask; } - /* - { - "@odata.type": "#microsoft.graph.todoTask", - "id": "String (identifier)", - "body": { - "@odata.type": "microsoft.graph.itemBody" - }, - "categories": ["string"], - "completedDateTime": { - "@odata.type": "microsoft.graph.dateTimeTimeZone" - }, - "dueDateTime": { - "@odata.type": "microsoft.graph.dateTimeTimeZone" - }, - "importance": "String", // low, normal, high - "isReminderOn": "Boolean", - "recurrence": { - "@odata.type": "microsoft.graph.patternedRecurrence" - }, - "reminderDateTime": { - "@odata.type": "microsoft.graph.dateTimeTimeZone" - }, - "status": "String", - "title": "String", - "createdDateTime": "String (timestamp)", - "lastModifiedDateTime": "String (timestamp)", - "bodyLastModifiedDateTime": "String (timestamp)" - } - */ - async createTask(listId: string | undefined, title: string, body?: string, importance?: string): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks`; - const toDo: TodoTask = this.getToDoTaskObject(title, body, importance); - return await this.client.api(endpoint).post(toDo); - } - async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks`; return await this.client.api(endpoint).post(toDo); } - async updateTask( - listId: string | undefined, - taskId: string, - title: string, - body?: string, - importance?: string, - ): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - const toDo: TodoTask = this.getToDoTaskObject(title, body, importance); - - return await this.client.api(endpoint).patch(toDo); - } - async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; return await this.client.api(endpoint).patch(toDo); } - - /** - * Takes a set of primitive values and returns a TodoTask object. This - * is used in the create and update paths. - * - * @param {string} title - * @param {string} [body] - * @param {string} [importance] - * @return {*} - * @memberof TodoApi - */ - getToDoTaskObject(title: string, body?: string, importance?: string) { - const toDo: TodoTask = { - title: title, - }; - - if (body && body.length > 0) { - toDo.body = { - content: body, - contentType: 'text', - }; - } - - if (importance && importance.length > 0) { - toDo.importance = importance as Importance; - } - return toDo; - } } export class MicrosoftClientProvider { diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 4fcbdb2..f6e1ab7 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -29,17 +29,149 @@ export async function postTask( const logger = logging.getLogger('mstodo-sync.command.post'); if (!editor.somethingSelected()) { - new Notice('好像没有选中什么'); + new Notice(t('CommandNotice_NothingSelected')); return; } if (!listId) { - new Notice('请先设置同步列表'); + new Notice(t('CommandNotice_SetListName')); return; } - new Notice('创建待办中...', 3000); + new Notice(t('CommandNotice_CreatingToDo'), 3000); const formatted = editor .getSelection() - .replace(/(- \[ \] )|\*|^> |^#* |- /gm, '') + .replace(/\*|^> |^#* |- /gm, '') + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + .split('\n') + .filter((s) => s != ''); + log('debug', formatted.join(' :: ')); + Promise.all( + formatted.map(async (s) => { + const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`); + + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } else { + logger.debug(`Creating Task: ${todo.title}`); + + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + todo.status = returnedTask.status; + todo.cacheTaskId(returnedTask.id); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + return todo; + }), + ).then((res) => { + new Notice('创建待办成功√'); + if (replace) { + editor.replaceSelection( + res + .map((i) => { + logger.debug('Processed blockLink', i.blockLink); + return i.getMarkdownTask(); + }) + .join('\n'), + ); + } + }); +} + +// Experimental +// Should handle the following cases: +// - [ ] Task +// - [ ] Task with indented note +// note +// - [ ] Task with subtasks +// - [ ] Task One +// - [ ] Task Two +// - [ ] Task with subtasks and notes +// Need to think about this one. Perhaps a task 3? +// - [ ] Task One +// - [ ] Task Two +// Lines are processed until the next line is blank or not indented by two spaces. +// Also EOF will stop processing. +// TODO: +// Allow variable depth or match column of first [ +export async function postTaskAndChildren( + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, + replace?: boolean, +) { + const logger = logging.getLogger('mstodo-sync.command.post'); + + if (!listId) { + new Notice(t('CommandNotice_SetListName')); + return; + } + new Notice(t('CommandNotice_CreatingToDo'), 3000); + + const cursorLocation = editor.getCursor(); + const topLevelTask = editor.getLine(cursorLocation.line); + logger.debug(`topLevelTask: ${topLevelTask}`); + logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); + + let body = ''; + const childTasks: string[] = []; + + const lines = editor.getValue().split('\n').slice(cursorLocation.line); + logger.debug(`editor: ${cursorLocation}`, lines); + + const endLine = lines.findIndex((line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ')); + logger.debug(`endLine: ${endLine}`); + + lines.slice(cursorLocation.line, endLine).forEach((line, index) => { + if (line.startsWith(' - [')) { + childTasks.push( + line + .trim() + .replace(/[ ]{2,}- \[(.)\]/, '') + .trim(), + ); + } else { + body += line + '\n'; + } + }); + logger.debug(`endLine: ${body}`); + logger.debug(`childTasks: ${childTasks}`, childTasks); + + const todo = new ObsidianTodoTask(plugin, topLevelTask, fileName ?? ''); + todo.setBody(body); + childTasks.forEach((childTask) => { + todo.addChecklistItem(childTask); + }); + + logger.debug(`updated: ${todo.title}`, todo); + return; + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`); + + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } else { + logger.debug(`Creating Task: ${todo.title}`); + + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + todo.status = returnedTask.status; + todo.cacheTaskId(returnedTask.id); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + const formatted = editor + .getSelection() + .replace(/\*|^> |^#* |- /gm, '') + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') .split('\n') .filter((s) => s != ''); log('debug', formatted.join(' :: ')); diff --git a/src/constants.ts b/src/constants.ts index 99f282b..946967e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,4 @@ // Format export const TASK_REGEX = new RegExp(/{{TASK}}/); export const IMPORTANCE_REGEX = new RegExp(/{{IMPORTANCE}}/); +export const STATUS_SYMBOL_REGEX = new RegExp(/{{STATUS_SYMBOL}}/); diff --git a/src/gui/microsoftAuthModal.ts b/src/gui/microsoftAuthModal.ts index c327c3e..1d0f9bc 100644 --- a/src/gui/microsoftAuthModal.ts +++ b/src/gui/microsoftAuthModal.ts @@ -1,4 +1,5 @@ import { Modal } from 'obsidian'; +import { t } from './../lib/lang'; export class MicrosoftAuthModal extends Modal { constructor(private readonly deviceCode: string, private readonly authUrl: string) { @@ -10,11 +11,11 @@ export class MicrosoftAuthModal extends Modal { contentEl.empty(); contentEl.addClass('auth-modal'); - contentEl.createEl('h2', { text: '首次使用需要进行微软验证' }); + contentEl.createEl('h2', { text: t('Auth_Heading_VerificationRequiredForFirstUse') }); // contentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) contentEl.createEl('h4', { text: this.deviceCode }); // contentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) - contentEl.createEl('div', { text: '设备代码已复制到剪贴板,请点击下面的链接验证' }); + contentEl.createEl('div', { text: t('Auth_Text_CodeCopiedClipboard') }); contentEl.createEl('a', { text: this.authUrl, href: this.authUrl }); contentEl.createEl('hr'); } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 02ff3db..356c194 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -33,6 +33,10 @@ export interface MsTodoSyncSettings { displayOptions_TaskImportance_Normal: string; displayOptions_TaskImportance_High: string; + displayOptions_TaskStatus_NotStarted: string; + displayOptions_TaskStatus_InProgress: string; + displayOptions_TaskStatus_Completed: string; + // Microsoft To Do open handler. todo_OpenUsingApplicationProtocol: boolean; @@ -61,12 +65,16 @@ export const DEFAULT_SETTINGS: MsTodoSyncSettings = { displayOptions_TaskStartPrefix: '🛫', displayOptions_TaskBodyPrefix: '💡', displayOptions_ReplaceAddCreatedAt: false, - displayOptions_ReplacementFormat: '- [ ] {{TASK}} {{IMPORTANCE}}', + displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', displayOptions_TaskImportance_Low: '🔽', displayOptions_TaskImportance_Normal: '🔼', displayOptions_TaskImportance_High: '⏫', + displayOptions_TaskStatus_NotStarted: ' ', + displayOptions_TaskStatus_InProgress: '/', + displayOptions_TaskStatus_Completed: 'x', + todo_OpenUsingApplicationProtocol: true, loggingOptions: { @@ -232,6 +240,35 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }, ); + // Task Status Indicator - Not Started + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_NotStartedName', + 'Settings_Todo_Display_Status_NotStartedDescription', + this.settings.displayOptions_TaskStatus_NotStarted, + async (value) => { + this.settings.displayOptions_TaskStatus_NotStarted = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_InProgressName', + 'Settings_Todo_Display_Status_InProgressDescription', + this.settings.displayOptions_TaskStatus_InProgress, + async (value) => { + this.settings.displayOptions_TaskStatus_InProgress = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_CompletedName', + 'Settings_Todo_Display_Status_CompletedDescription', + this.settings.displayOptions_TaskStatus_Completed, + async (value) => { + this.settings.displayOptions_TaskStatus_Completed = value; + }, + ); + containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle((toggle) => toggle.setValue(this.settings.diary.stayWithPN).onChange(async (value) => { diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index b7353ea..bd36ca1 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -23,9 +23,12 @@ "Close": "Close", "Submit": "Submit", "EditorMenu_SyncToTodo": "Sync to Microsoft Todo", - "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft Todo and replace", + "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft Todo and update", "PluginTitle": "Microsoft To Do Sync", "PluginDescription": "An obsidian plugin that syncs Microsoft Todo", + "CommandNotice_NothingSelected": "It seems that nothing is selected", + "CommandNotice_SetListName": "Set the name of the list to synchronize within settings first.", + "CommandNotice_CreatingToDo": "Creating To Do...", "Settings_Todo_DefaultListName": "The default synchronization Microsoft Todo list name", "Settings_Todo_DefaultListNameDescription": "If it does not exist, the list is created with that name", "Settings_Uptimer": "Uptimer", @@ -56,5 +59,13 @@ "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", - "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line." + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", + "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", + "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", + "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", + "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", + "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown." } diff --git a/src/lib/locale/zh-cn.json b/src/lib/locale/zh-cn.json index 0f6dfc6..22c26ec 100644 --- a/src/lib/locale/zh-cn.json +++ b/src/lib/locale/zh-cn.json @@ -26,6 +26,9 @@ "EditorMenu_SyncToTodoAndReplace": "同步到微软待办并替换", "PluginTitle": "Microsoft To Do Sync", "PluginDescription": "一个可以同步微软Todo的obsidian插件", + "CommandNotice_NothingSelected": "好像没有选中什么", + "CommandNotice_SetListName": "请先设置同步列表", + "CommandNotice_CreatingToDo": "创建待办中...", "Settings_Todo_DefaultListName": "默认的同步微软Todo列表名称", "Settings_Todo_DefaultListNameDescription": "如不存在则以该名称创建列表", "Settings_Uptimer": "Uptimer设置", @@ -56,5 +59,13 @@ "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", - "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line." + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", + "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", + "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", + "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", + "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", + "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown." } diff --git a/src/main.ts b/src/main.ts index 8664d67..ddf40f6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,7 @@ import { Editor, MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, MsTodoSyncSettings } from './gui/msTodoSyncSettingTab'; -import { createTodayTasks, getTaskIdFromLine, postTask } from './command/msTodoCommand'; +import { createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren } from './command/msTodoCommand'; import { t } from './lib/lang'; import { log, logging } from './lib/logging'; @@ -54,6 +54,24 @@ export default class MsTodoSync extends Plugin { }), ); + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem((item) => { + item.setTitle('Sync Task with details').onClick( + async () => + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.basename, + this, + true, + ), + ); + }); + }), + ); + this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 8115e48..9fcaae0 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -16,7 +16,7 @@ import { MsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; import MsTodoSync from './../main'; import { t } from './../lib/lang'; import { logging } from './../lib/logging'; -import { IMPORTANCE_REGEX, TASK_REGEX } from './../constants'; +import { IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from './../constants'; export class ObsidianTodoTask implements TodoTask { id?: string; @@ -91,17 +91,23 @@ export class ObsidianTodoTask implements TodoTask { this.fileName = fileName; this.title = line.trim(); + this.logger.debug(`Creating: '${this.title}'`); // This will strip out the block link if it exists as // it is part of this plugin and not user specified. this.checkForBlockLink(line); + // This will strip out the checkbox if in title. + this.checkForStatus(line); + this.checkForImportance(line); this.body = { content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, contentType: 'text', }; + + this.logger.debug(`Created: '${this.title}'`); } public getTodoTask(): TodoTask { @@ -113,19 +119,50 @@ export class ObsidianTodoTask implements TodoTask { toDo.body = this.body; } + if (this.status && this.status.length > 0) { + toDo.status = this.status; + } + if (this.importance && this.importance.length > 0) { toDo.importance = this.importance as Importance; } + + if (this.checklistItems && this.checklistItems.length > 0) { + toDo.checklistItems = this.checklistItems; + } return toDo; } + public setBody(body: string) { + this.body = { + content: body, + contentType: 'text', + }; + } + + public addChecklistItem(item: string) { + if (!this.checklistItems) { + this.checklistItems = []; + } + + this.checklistItems.push({ + displayName: item, + }); + } + + /** + * Return the task as a well formed markdown task. + * + * @return {*} {string} + * @memberof ObsidianTodoTask + */ public getMarkdownTask(): string { let output: string; const format = this.settings.displayOptions_ReplacementFormat; const priorityIndicator = this.getPriorityIndicator(); // eslint-disable-next-line prefer-const - output = format.replace(TASK_REGEX, this.title ?? ''); + output = format.replace(TASK_REGEX, this.title ?? '').replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); if (output.includes(priorityIndicator)) { // Already in title, don't add it again and clear replacement tag. @@ -142,12 +179,24 @@ export class ObsidianTodoTask implements TodoTask { // Append blocklink at the end if it exists if (this.hasBlockLink && this.blockLink) { - output = `${output} ^${this.blockLink}`; + output = `${output.trim()} ^${this.blockLink}`; } return output; } + private checkForStatus(line: string) { + const regex = /\[(.)\]/; + + const m = regex.exec(line); + if (m && m.length > 0) { + this.status = m[1] === 'x' ? 'completed' : 'notStarted'; + this.title = this.title?.replace(regex, '').trim(); + } else { + this.status = 'notStarted'; + } + } + private checkForImportance(line: string) { this.importance = 'normal'; @@ -173,6 +222,19 @@ export class ObsidianTodoTask implements TodoTask { } } + private getStatusIndicator(): string { + switch (this.status) { + case 'notStarted': + return this.settings.displayOptions_TaskStatus_NotStarted; + case 'inProgress': + return this.settings.displayOptions_TaskStatus_InProgress; + case 'completed': + return this.settings.displayOptions_TaskStatus_Completed; + default: + return ' '; + } + } + private checkForBlockLink(line: string) { const blocklinkRegex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; const blocklinkMatch = blocklinkRegex.exec(line); @@ -181,7 +243,7 @@ export class ObsidianTodoTask implements TodoTask { //FIXME If there's a 'Created at xxxx' replaced line, // it's not enough to get a cleanTaskTitle after the next line. - this.title = line.replace(`^${this.blockLink}`, ''); + this.title = this.title?.replace(`^${this.blockLink}`, ''); } if (this.hasBlockLink && this.blockLink) { @@ -218,32 +280,4 @@ export class ObsidianTodoTask implements TodoTask { await this.plugin.saveSettings(); } - - /** - * Takes a set of primitive values and returns a TodoTask object. This - * is used in the create and update paths. - * - * @param {string} title - * @param {string} [body] - * @param {string} [importance] - * @return {*} - * @memberof TodoApi - */ - getToDoTask(title: string, body?: string, importance?: string) { - const toDo: TodoTask = { - title: title, - }; - - if (body && body.length > 0) { - toDo.body = { - content: body, - contentType: 'text', - }; - } - - if (importance && importance.length > 0) { - toDo.importance = importance as Importance; - } - return toDo; - } } From 6ad57aadec5dcf5989fc1a05830ddacd545117e1 Mon Sep 17 00:00:00 2001 From: sytone Date: Tue, 6 Dec 2022 16:23:11 -0800 Subject: [PATCH 04/34] feat: added push and pull logic with update --- package-lock.json | 3371 +-------------------------------- src/command/msTodoCommand.ts | 118 +- src/main.ts | 20 +- src/model/ObsidianTodoTask.ts | 68 +- 4 files changed, 134 insertions(+), 3443 deletions(-) diff --git a/package-lock.json b/package-lock.json index 8088f4a..bdd0914 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,3368 +1,8 @@ { "name": "obsidian-mstodo-sync", "version": "1.0.1", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "obsidian-mstodo-sync", - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "@azure/msal-node": "^1.14.2", - "@microsoft/microsoft-graph-client": "^3.0.2", - "@microsoft/microsoft-graph-types": "^2.25.0", - "eventemitter2": "^6.4.5", - "node-fetch": "^2.6.1" - }, - "devDependencies": { - "@types/node": "^16.11.6", - "@types/node-fetch": "^2.6.2", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", - "builtin-modules": "3.3.0", - "esbuild": "0.14.47", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-no-loops": "^0.3.0", - "eslint-plugin-prettier": "^4.2.1", - "obsidian": "latest", - "prettier": "^2.7.1", - "tslib": "2.4.0", - "typescript": "4.7.4" - } - }, - "node_modules/@azure/msal-common": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", - "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@azure/msal-node": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz", - "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==", - "dependencies": { - "@azure/msal-common": "^7.6.0", - "jsonwebtoken": "^8.5.1", - "uuid": "^8.3.0" - }, - "engines": { - "node": "10 || 12 || 14 || 16 || 18" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "dependencies": { - "regenerator-runtime": "^0.13.10" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@microsoft/microsoft-graph-client": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.3.tgz", - "integrity": "sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "tslib": "^2.2.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependenciesMeta": { - "@azure/identity": { - "optional": true - }, - "@azure/msal-browser": { - "optional": true - }, - "buffer": { - "optional": true - }, - "stream-browserify": { - "optional": true - } - } - }, - "node_modules/@microsoft/microsoft-graph-types": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.25.0.tgz", - "integrity": "sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==" - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@types/codemirror": { - "version": "0.0.108", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", - "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", - "dev": true, - "dependencies": { - "@types/tern": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", - "dev": true - }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", - "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/type-utils": "5.29.0", - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", - "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", - "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", - "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", - "dev": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "esbuild-android-64": "0.14.47", - "esbuild-android-arm64": "0.14.47", - "esbuild-darwin-64": "0.14.47", - "esbuild-darwin-arm64": "0.14.47", - "esbuild-freebsd-64": "0.14.47", - "esbuild-freebsd-arm64": "0.14.47", - "esbuild-linux-32": "0.14.47", - "esbuild-linux-64": "0.14.47", - "esbuild-linux-arm": "0.14.47", - "esbuild-linux-arm64": "0.14.47", - "esbuild-linux-mips64le": "0.14.47", - "esbuild-linux-ppc64le": "0.14.47", - "esbuild-linux-riscv64": "0.14.47", - "esbuild-linux-s390x": "0.14.47", - "esbuild-netbsd-64": "0.14.47", - "esbuild-openbsd-64": "0.14.47", - "esbuild-sunos-64": "0.14.47", - "esbuild-windows-32": "0.14.47", - "esbuild-windows-64": "0.14.47", - "esbuild-windows-arm64": "0.14.47" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", - "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", - "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", - "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", - "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", - "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", - "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", - "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", - "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", - "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", - "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", - "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", - "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", - "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", - "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", - "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", - "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", - "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", - "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", - "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", - "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/eslint-plugin-no-loops": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", - "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true, - "peerDependencies": { - "eslint": ">=2.0.0" - } - }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" - }, - "peerDependenciesMeta": { - "eslint-config-prettier": { - "optional": true - } - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "engines": { - "node": ">=4", - "npm": ">=1.4.28" - } - }, - "node_modules/jsonwebtoken/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "dependencies": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/obsidian": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", - "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", - "dev": true, - "dependencies": { - "@types/codemirror": "0.0.108", - "moment": "2.29.4" - }, - "peerDependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - }, "dependencies": { "@azure/msal-common": { "version": "7.6.0", @@ -3710,8 +350,7 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "ajv": { "version": "6.12.6", @@ -4282,8 +921,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-import-resolver-node": { "version": "0.3.6", @@ -4377,8 +1015,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "4.2.1", diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index f6e1ab7..1e6a579 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,4 +1,4 @@ -import { Editor, Notice } from 'obsidian'; +import { Editor, EditorPosition, Notice } from 'obsidian'; import { ObsidianTodoTask } from 'src/model/ObsidianTodoTask'; import MsTodoSync from '../main'; import { TodoApi } from '../api/todoApi'; @@ -62,7 +62,7 @@ export async function postTask( const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id); + todo.cacheTaskId(returnedTask.id ?? ''); logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } @@ -105,7 +105,7 @@ export async function postTaskAndChildren( editor: Editor, fileName: string | undefined, plugin: MsTodoSync, - replace?: boolean, + push = true, ) { const logger = logging.getLogger('mstodo-sync.command.post'); @@ -118,30 +118,35 @@ export async function postTaskAndChildren( const cursorLocation = editor.getCursor(); const topLevelTask = editor.getLine(cursorLocation.line); logger.debug(`topLevelTask: ${topLevelTask}`); - logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); + // logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); let body = ''; const childTasks: string[] = []; + // Get all lines including the line the cursor is on. const lines = editor.getValue().split('\n').slice(cursorLocation.line); - logger.debug(`editor: ${cursorLocation}`, lines); + // logger.debug(`editor: ${cursorLocation}`, lines); - const endLine = lines.findIndex((line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ')); + // Find the end of section which a blank line or a line that is not indented by two spaces. + const endLine = lines.findIndex( + //(line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, + (line, index) => line.length == 0 && index > 0, + ); logger.debug(`endLine: ${endLine}`); - lines.slice(cursorLocation.line, endLine).forEach((line, index) => { + // Scan lines below task for sub tasks and body. + lines.slice(1, endLine).forEach((line, index) => { + // logger.debug(`processing line: ${index} -- ${line}`); + if (line.startsWith(' - [')) { - childTasks.push( - line - .trim() - .replace(/[ ]{2,}- \[(.)\]/, '') - .trim(), - ); + childTasks.push(line.trim()); } else { - body += line + '\n'; + // remove the two spaces at the beginning of the line, will be added back on sync. + // on sync the body will be indented by two spaces and the tasks will be appended at this point. + body += line.trim() + '\n'; } }); - logger.debug(`endLine: ${body}`); + logger.debug(`body: ${body}`); logger.debug(`childTasks: ${childTasks}`, childTasks); const todo = new ObsidianTodoTask(plugin, topLevelTask, fileName ?? ''); @@ -151,67 +156,58 @@ export async function postTaskAndChildren( }); logger.debug(`updated: ${todo.title}`, todo); - return; + if (todo.hasBlockLink && todo.id) { logger.debug(`Updating Task: ${todo.title}`); - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + //const currentTaskState = await todoApi.getTask(listId, todo.id); + let returnedTask; + if (push) { + returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + // TODO Push the checklist items... + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } else { + returnedTask = await todoApi.getTask(listId, todo.id); + if (returnedTask) { + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } + } + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask.id}`); + logger.debug(`updated: ${returnedTask?.id}`); } else { logger.debug(`Creating Task: ${todo.title}`); - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask(true)); todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id); + todo.cacheTaskId(returnedTask.id ?? ''); logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } - const formatted = editor - .getSelection() - .replace(/\*|^> |^#* |- /gm, '') - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - .split('\n') - .filter((s) => s != ''); - log('debug', formatted.join(' :: ')); - Promise.all( - formatted.map(async (s) => { - const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); - - // If there is a block link in the line, we will try to find - // the task id from the block link and update the task instead. - if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`); + // Update the task on the page. + const start = getLineStartPos(cursorLocation.line); + const end = getLineEndPos(cursorLocation.line + endLine, editor); - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask.id}`); - } else { - logger.debug(`Creating Task: ${todo.title}`); - - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + editor.replaceRange(todo.getMarkdownTask(), start, end); +} - todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - } +function getLineStartPos(line: number): EditorPosition { + return { + line, + ch: 0, + }; +} - return todo; - }), - ).then((res) => { - new Notice('创建待办成功√'); - if (replace) { - editor.replaceSelection( - res - .map((i) => { - logger.debug('Processed blockLink', i.blockLink); - return i.getMarkdownTask(); - }) - .join('\n'), - ); - } - }); +function getLineEndPos(line: number, editor: Editor): EditorPosition { + return { + line, + ch: editor.getLine(line).length, + }; } export async function createTodayTasks(todoApi: TodoApi, settings: MsTodoSyncSettings, editor?: Editor) { diff --git a/src/main.ts b/src/main.ts index ddf40f6..64ace23 100644 --- a/src/main.ts +++ b/src/main.ts @@ -57,7 +57,7 @@ export default class MsTodoSync extends Plugin { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { - item.setTitle('Sync Task with details').onClick( + item.setTitle('Sync Task with details (Push)').onClick( async () => await postTaskAndChildren( this.todoApi, @@ -72,6 +72,24 @@ export default class MsTodoSync extends Plugin { }), ); + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem((item) => { + item.setTitle('Sync Task with details (Pull)').onClick( + async () => + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.basename, + this, + false, + ), + ); + }); + }), + ); + this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 9fcaae0..5963299 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -19,7 +19,7 @@ import { logging } from './../lib/logging'; import { IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from './../constants'; export class ObsidianTodoTask implements TodoTask { - id?: string; + id: string; // The task body that typically contains information about the task. public body?: NullableOption; @@ -90,9 +90,10 @@ export class ObsidianTodoTask implements TodoTask { this.settings = plugin.settings; this.fileName = fileName; - this.title = line.trim(); this.logger.debug(`Creating: '${this.title}'`); + this.title = line.trim(); + // This will strip out the block link if it exists as // it is part of this plugin and not user specified. this.checkForBlockLink(line); @@ -102,6 +103,11 @@ export class ObsidianTodoTask implements TodoTask { this.checkForImportance(line); + this.title = this.title + .trim() + .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + .trim(); + this.body = { content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, contentType: 'text', @@ -110,7 +116,7 @@ export class ObsidianTodoTask implements TodoTask { this.logger.debug(`Created: '${this.title}'`); } - public getTodoTask(): TodoTask { + public getTodoTask(withChecklist = false): TodoTask { const toDo: TodoTask = { title: this.title, }; @@ -127,8 +133,10 @@ export class ObsidianTodoTask implements TodoTask { toDo.importance = this.importance as Importance; } - if (this.checklistItems && this.checklistItems.length > 0) { - toDo.checklistItems = this.checklistItems; + if (withChecklist) { + if (this.checklistItems && this.checklistItems.length > 0) { + toDo.checklistItems = this.checklistItems; + } } return toDo; } @@ -146,7 +154,10 @@ export class ObsidianTodoTask implements TodoTask { } this.checklistItems.push({ - displayName: item, + displayName: item + .trim() + .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + .trim(), }); } @@ -158,11 +169,16 @@ export class ObsidianTodoTask implements TodoTask { */ public getMarkdownTask(): string { let output: string; + + // Format and display the task which is the first line. const format = this.settings.displayOptions_ReplacementFormat; const priorityIndicator = this.getPriorityIndicator(); // eslint-disable-next-line prefer-const - output = format.replace(TASK_REGEX, this.title ?? '').replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); + output = format + .replace(TASK_REGEX, this.title?.trim() ?? '') + .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); + this.logger.debug(`output: '${output}'`); if (output.includes(priorityIndicator)) { // Already in title, don't add it again and clear replacement tag. @@ -170,17 +186,41 @@ export class ObsidianTodoTask implements TodoTask { } else { output = output.replace(IMPORTANCE_REGEX, priorityIndicator); } - - if (this.settings.displayOptions_ReplaceAddCreatedAt) { - output = `${output} ${t('displayOptions_CreatedAtTime')} ${window - .moment() - .format(this.settings.displayOptions_TimeFormat)}`; - } + this.logger.debug(`output: '${output}'`); // Append blocklink at the end if it exists if (this.hasBlockLink && this.blockLink) { output = `${output.trim()} ^${this.blockLink}`; } + this.logger.debug(`output: '${output}'`); + + let formattedBody = ''; + let formattedChecklist = ''; + + // Add in the body if it exists and indented by two spaces. + if (this.body?.content && this.body.content.length > 0) { + this.body?.content.split('\n').forEach((bodyLine) => { + if (bodyLine.trim().length > 0) { + formattedBody += ' ' + bodyLine + '\n'; + } + }); + } + this.logger.debug(`formattedBody: '${formattedBody}'`); + + if (this.checklistItems && this.checklistItems.length > 0) { + this.checklistItems.forEach((item) => { + if (item.isChecked) { + formattedChecklist += ' - [x] ' + item.displayName + '\n'; + } else { + formattedChecklist += ' - [ ] ' + item.displayName + '\n'; + } + }); + } + this.logger.debug(`formattedChecklist: '${formattedChecklist}'`); + + output = `${output.trim()}\n${formattedBody}${formattedChecklist}`; + + this.logger.debug(`output: '${output}'`); return output; } @@ -266,7 +306,7 @@ export class ObsidianTodoTask implements TodoTask { * @return {*} {Promise} * @memberof ObsidianTodoTask */ - public async cacheTaskId(id?: string): Promise { + public async cacheTaskId(id: string): Promise { this.settings.taskIdIndex = this.settings.taskIdIndex + 1; const index = `${Math.random().toString(20).substring(2, 6)}${this.settings.taskIdIndex From 3f0699f62276bff0f34faa30de541a6a17297d32 Mon Sep 17 00:00:00 2001 From: sytone Date: Tue, 6 Dec 2022 16:37:18 -0800 Subject: [PATCH 05/34] chore: cleaned up logging a bit --- src/command/msTodoCommand.ts | 4 ++-- src/model/ObsidianTodoTask.ts | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 1e6a579..2ab251b 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -158,7 +158,7 @@ export async function postTaskAndChildren( logger.debug(`updated: ${todo.title}`, todo); if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`); + logger.debug(`Updating Task: ${todo.title}`, todo.getTodoTask()); //const currentTaskState = await todoApi.getTask(listId, todo.id); let returnedTask; @@ -178,7 +178,7 @@ export async function postTaskAndChildren( } logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask?.id}`); + logger.debug(`updated: ${returnedTask?.id}`, returnedTask); } else { logger.debug(`Creating Task: ${todo.title}`); diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 5963299..cfe348a 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -178,7 +178,6 @@ export class ObsidianTodoTask implements TodoTask { output = format .replace(TASK_REGEX, this.title?.trim() ?? '') .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); - this.logger.debug(`output: '${output}'`); if (output.includes(priorityIndicator)) { // Already in title, don't add it again and clear replacement tag. @@ -186,13 +185,12 @@ export class ObsidianTodoTask implements TodoTask { } else { output = output.replace(IMPORTANCE_REGEX, priorityIndicator); } - this.logger.debug(`output: '${output}'`); // Append blocklink at the end if it exists if (this.hasBlockLink && this.blockLink) { output = `${output.trim()} ^${this.blockLink}`; } - this.logger.debug(`output: '${output}'`); + this.logger.debug(`Updated task: '${output}'`); let formattedBody = ''; let formattedChecklist = ''; @@ -205,7 +203,7 @@ export class ObsidianTodoTask implements TodoTask { } }); } - this.logger.debug(`formattedBody: '${formattedBody}'`); + // this.logger.debug(`formattedBody: '${formattedBody}'`); if (this.checklistItems && this.checklistItems.length > 0) { this.checklistItems.forEach((item) => { @@ -216,11 +214,11 @@ export class ObsidianTodoTask implements TodoTask { } }); } - this.logger.debug(`formattedChecklist: '${formattedChecklist}'`); + // this.logger.debug(`formattedChecklist: '${formattedChecklist}'`); output = `${output.trim()}\n${formattedBody}${formattedChecklist}`; - this.logger.debug(`output: '${output}'`); + // this.logger.debug(`output: '${output}'`); return output; } From 45bc2e650b43cc87fc509582ba3262fb99e63d8a Mon Sep 17 00:00:00 2001 From: sytone Date: Tue, 24 Jan 2023 18:18:14 -0800 Subject: [PATCH 06/34] playing with cache --- src/api/todoApi.ts | 8 +-- src/lib/locale/en.json | 7 ++- src/lib/locale/zh-cn.json | 7 ++- src/main.ts | 7 ++- src/model/ObsidianTodoTask.ts | 91 +++++++++++++++++++++++++++-------- 5 files changed, 91 insertions(+), 29 deletions(-) diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index a078a42..9e0f788 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -4,6 +4,8 @@ import { Client } from '@microsoft/microsoft-graph-client'; import { TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; import { DataAdapter, Notice } from 'obsidian'; import { MicrosoftAuthModal } from '../gui/microsoftAuthModal'; +import { t } from '../lib/lang'; + export class TodoApi { private client: Client; constructor() { @@ -55,7 +57,7 @@ export class TodoApi { .filter(searchText) .get() .catch((err) => { - new Notice('获取失败,请检查同步列表是否已删除'); + new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); return; }); if (!res) return; @@ -130,10 +132,10 @@ export class MicrosoftClientProvider { private async authByDevice(): Promise { const deviceCodeRequest = { deviceCodeCallback: (response: msalCommon.DeviceCodeResponse) => { - new Notice('设备代码已复制到剪贴板,请在打开的浏览器界面输入'); + new Notice(t('Notice_DeviceCodeOnClipboard')); navigator.clipboard.writeText(response['userCode']); new MicrosoftAuthModal(response['userCode'], response['verificationUri']).open(); - console.log('设备代码已复制到剪贴板', response['userCode']); + console.log(t('Notice_DeviceCodeCopiedToClipboard'), response['userCode']); }, scopes: this.scopes, }; diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index bd36ca1..c3baea0 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -67,5 +67,8 @@ "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", - "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown." -} + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", + "Notice_UnableToAcquireTaskFromConfiguredList": "Unable to acquire task from configured list, check to see it exists and has not been deleted", + "Notice_DeviceCodeOnClipboard": "The device code has been copied to the clipboard, please enter it in the browser interface that opens", + "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard" +} \ No newline at end of file diff --git a/src/lib/locale/zh-cn.json b/src/lib/locale/zh-cn.json index 22c26ec..0a6476c 100644 --- a/src/lib/locale/zh-cn.json +++ b/src/lib/locale/zh-cn.json @@ -67,5 +67,8 @@ "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", - "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown." -} + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", + "Notice_UnableToAcquireTaskFromConfiguredList": "获取失败,请检查同步列表是否已删除", + "Notice_DeviceCodeOnClipboard": "设备代码已复制到剪贴板,请在打开的浏览器界面输入", + "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板" +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 64ace23..835fc17 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { Editor, MarkdownView, Plugin } from 'obsidian'; +import { CachedMetadata, Editor, MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, MsTodoSyncSettings } from './gui/msTodoSyncSettingTab'; import { createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren } from './command/msTodoCommand'; @@ -9,6 +9,11 @@ export default class MsTodoSync extends Plugin { settings: MsTodoSyncSettings; public todoApi: TodoApi; + // Pulls the meta data for the a page to help with list processing. + getPageMetadata(path: string): CachedMetadata | null { + return this.app.metadataCache.getCache(path); + } + async onload() { logging.registerConsoleLogger(); diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index cfe348a..5d0e3fe 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -13,6 +13,7 @@ import { TodoTask, } from '@microsoft/microsoft-graph-types'; import { MsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; +import { CachedMetadata } from 'obsidian'; import MsTodoSync from './../main'; import { t } from './../lib/lang'; import { logging } from './../lib/logging'; @@ -81,39 +82,87 @@ export class ObsidianTodoTask implements TodoTask { private plugin: MsTodoSync; private settings: MsTodoSyncSettings; logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); + private originalTitle: string; /** * */ - constructor(plugin: MsTodoSync, line: string, fileName: string) { - this.plugin = plugin; - this.settings = plugin.settings; - this.fileName = fileName; + constructor() { + // this.plugin = plugin; + // this.settings = plugin.settings; + // this.fileName = fileName; + // this.originalTitle = line; + // this.logger.debug(`Creating: '${this.title}'`); + // this.title = line.trim(); + // // This will strip out the block link if it exists as + // // it is part of this plugin and not user specified. + // this.checkForBlockLink(line); + // // This will strip out the checkbox if in title. + // this.checkForStatus(line); + // this.checkForImportance(line); + // this.title = this.title + // .trim() + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .trim(); + // this.body = { + // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + // contentType: 'text', + // }; + // this.logger.debug(`Created: '${this.title}'`); + } + // constructor(plugin: MsTodoSync, line: string, fileName: string) { + // this.plugin = plugin; + // this.settings = plugin.settings; + // this.fileName = fileName; + // this.originalTitle = line; - this.logger.debug(`Creating: '${this.title}'`); + // this.logger.debug(`Creating: '${this.title}'`); - this.title = line.trim(); + // this.title = line.trim(); - // This will strip out the block link if it exists as - // it is part of this plugin and not user specified. - this.checkForBlockLink(line); + // // This will strip out the block link if it exists as + // // it is part of this plugin and not user specified. + // this.checkForBlockLink(line); - // This will strip out the checkbox if in title. - this.checkForStatus(line); + // // This will strip out the checkbox if in title. + // this.checkForStatus(line); - this.checkForImportance(line); + // this.checkForImportance(line); - this.title = this.title - .trim() - .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - .trim(); + // this.title = this.title + // .trim() + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .trim(); - this.body = { - content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - contentType: 'text', - }; + // this.body = { + // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + // contentType: 'text', + // }; + + // this.logger.debug(`Created: '${this.title}'`); + // } + + static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { + const task = new ObsidianTodoTask(); + + task.plugin = plugin; + task.settings = plugin.settings; + task.fileName = fileName; + + const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; + + await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); + + app.vault.read(this.config.target_file); + + plugin.app.vault.getAbstractFileByPath; + pageMetadata.listItems?.find((item) => { + if (item.position.start.line === lineNumber) { + task.originalTitle = item.line; + } + }); - this.logger.debug(`Created: '${this.title}'`); + return task; } public getTodoTask(withChecklist = false): TodoTask { From 8724210a4324a021bf5e78292c56cb61f59e0469 Mon Sep 17 00:00:00 2001 From: Sytone Date: Wed, 29 Mar 2023 17:35:28 -0700 Subject: [PATCH 07/34] fix path issues and cleanup the lines managment --- src/command/msTodoCommand.ts | 136 ++++++++++++++++++++++------- src/main.ts | 64 +++++++++----- src/model/ObsidianTodoTask.ts | 156 +++++++++++++++++++--------------- 3 files changed, 238 insertions(+), 118 deletions(-) diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 2ab251b..462a694 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -17,6 +17,45 @@ export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { } return ''; } +interface Selection { + start: EditorPosition; + end?: EditorPosition; + lines: number[]; +} + +export async function getCurrentLinesFromEditor(editor: Editor): Promise { + log( + 'info', + `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( + 'anchor', + )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + ); + + // const activeFile = this.app.workspace.getActiveFile(); + // const source = await this.app.vault.read(activeFile); + + let start: EditorPosition; + let end: EditorPosition; + //let lines: string[] = []; + let lines: number[] = []; + if (editor.somethingSelected()) { + start = editor.getCursor('from'); + end = editor.getCursor('to'); + //lines = source.split('\n').slice(start.line, end.line + 1); + lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); + } else { + start = editor.getCursor(); + end = editor.getCursor(); + //lines = source.split('\n').slice(start.line, end.line + 1); + lines.push(start.line); + } + + return { + start, + end, + lines, + }; +} export async function postTask( todoApi: TodoApi, @@ -28,25 +67,30 @@ export async function postTask( ) { const logger = logging.getLogger('mstodo-sync.command.post'); - if (!editor.somethingSelected()) { - new Notice(t('CommandNotice_NothingSelected')); - return; - } + // if (!editor.somethingSelected()) { + // new Notice(t('CommandNotice_NothingSelected')); + // return; + // } if (!listId) { new Notice(t('CommandNotice_SetListName')); return; } new Notice(t('CommandNotice_CreatingToDo'), 3000); - const formatted = editor - .getSelection() - .replace(/\*|^> |^#* |- /gm, '') - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - .split('\n') - .filter((s) => s != ''); - log('debug', formatted.join(' :: ')); - Promise.all( - formatted.map(async (s) => { - const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); + // const formatted = editor + // .getSelection() + // .replace(/\*|^> |^#* |- /gm, '') + // // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .split('\n') + // .filter((s) => s != ''); + const activeFile = this.app.workspace.getActiveFile(); + const source = await this.app.vault.read(activeFile); + const lines = (await getCurrentLinesFromEditor(editor)).lines; + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + if (!lines.includes(index)) return line; + const todo = new ObsidianTodoTask(plugin, line, fileName ?? ''); // If there is a block link in the line, we will try to find // the task id from the block link and update the task instead. @@ -66,21 +110,55 @@ export async function postTask( logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } - return todo; + if (replace) { + return todo.getMarkdownTask(true); + } + return line; }), - ).then((res) => { - new Notice('创建待办成功√'); - if (replace) { - editor.replaceSelection( - res - .map((i) => { - logger.debug('Processed blockLink', i.blockLink); - return i.getMarkdownTask(); - }) - .join('\n'), - ); - } - }); + ); + + await this.app.vault.modify(activeFile, modifiedPage.join('\n')); + + //return split.join('\n'); + + // log('debug', formatted.join(' :: ')); + // Promise.all( + // formatted.map(async (s) => { + // const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); + + // // If there is a block link in the line, we will try to find + // // the task id from the block link and update the task instead. + // if (todo.hasBlockLink && todo.id) { + // logger.debug(`Updating Task: ${todo.title}`); + + // const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + // logger.debug(`updated: ${returnedTask.id}`); + // } else { + // logger.debug(`Creating Task: ${todo.title}`); + + // const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + // todo.status = returnedTask.status; + // todo.cacheTaskId(returnedTask.id ?? ''); + // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + // } + + // return todo; + // }), + // ).then((res) => { + // new Notice('创建待办成功√'); + // if (replace) { + // editor.replaceSelection( + // res + // .map((i) => { + // logger.debug('Processed blockLink', i.blockLink); + // return i.getMarkdownTask(); + // }) + // .join('\n'), + // ); + // } + // }); } // Experimental @@ -193,7 +271,7 @@ export async function postTaskAndChildren( const start = getLineStartPos(cursorLocation.line); const end = getLineEndPos(cursorLocation.line + endLine, editor); - editor.replaceRange(todo.getMarkdownTask(), start, end); + editor.replaceRange(todo.getMarkdownTask(false), start, end); } function getLineStartPos(line: number): EditorPosition { diff --git a/src/main.ts b/src/main.ts index 835fc17..5b7fef0 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { CachedMetadata, Editor, MarkdownView, Plugin } from 'obsidian'; +import { CachedMetadata, Editor, EditorPosition, MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, MsTodoSyncSettings } from './gui/msTodoSyncSettingTab'; import { createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren } from './command/msTodoCommand'; @@ -26,12 +26,12 @@ export default class MsTodoSync extends Plugin { this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { item.setTitle(t('EditorMenu_SyncToTodo')).onClick( - async () => + async (e) => await postTask( this.todoApi, this.settings.todoListSync?.listId, editor, - this.app.workspace.getActiveFile()?.basename, + this.app.workspace.getActiveFile()?.path, this, ), ); @@ -45,12 +45,12 @@ export default class MsTodoSync extends Plugin { this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( - async () => + async (e) => await postTask( this.todoApi, this.settings.todoListSync?.listId, editor, - this.app.workspace.getActiveFile()?.basename, + this.app.workspace.getActiveFile()?.path, this, true, ), @@ -62,17 +62,16 @@ export default class MsTodoSync extends Plugin { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem((item) => { - item.setTitle('Sync Task with details (Push)').onClick( - async () => - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.basename, - this, - true, - ), - ); + item.setTitle('Sync Task with details (Push)').onClick(async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }); }); }), ); @@ -86,7 +85,7 @@ export default class MsTodoSync extends Plugin { this.todoApi, this.settings.todoListSync?.listId, editor, - this.app.workspace.getActiveFile()?.basename, + this.app.workspace.getActiveFile()?.path, this, false, ), @@ -125,7 +124,7 @@ export default class MsTodoSync extends Plugin { this.todoApi, this.settings.todoListSync?.listId, editor, - this.app.workspace.getActiveFile()?.basename, + this.app.workspace.getActiveFile()?.path, this, ), }); @@ -140,7 +139,7 @@ export default class MsTodoSync extends Plugin { this.todoApi, this.settings.todoListSync?.listId, editor, - this.app.workspace.getActiveFile()?.basename, + this.app.workspace.getActiveFile()?.path, this, true, ), @@ -200,4 +199,31 @@ export default class MsTodoSync extends Plugin { async saveSettings() { await this.saveData(this.settings); } + + // getCurrentLinesFromEditor(editor: Editor): Selection { + // log( + // 'info', + // `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( + // 'anchor', + // )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + // ); + + // let start: EditorPosition; + // let end: EditorPosition; + // let lines: number[] = []; + // if (editor.somethingSelected()) { + // start = editor.getCursor('from'); + // end = editor.getCursor('to'); + // lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); + // } else { + // start = editor.getCursor(); + // end = editor.getCursor(); + // lines.push(start.line); + // } + // return { + // start, + // end, + // lines, + // }; + // } } diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 5d0e3fe..dd63ae7 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -87,83 +87,92 @@ export class ObsidianTodoTask implements TodoTask { /** * */ - constructor() { - // this.plugin = plugin; - // this.settings = plugin.settings; - // this.fileName = fileName; - // this.originalTitle = line; - // this.logger.debug(`Creating: '${this.title}'`); - // this.title = line.trim(); - // // This will strip out the block link if it exists as - // // it is part of this plugin and not user specified. - // this.checkForBlockLink(line); - // // This will strip out the checkbox if in title. - // this.checkForStatus(line); - // this.checkForImportance(line); - // this.title = this.title - // .trim() - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .trim(); - // this.body = { - // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - // contentType: 'text', - // }; - // this.logger.debug(`Created: '${this.title}'`); - } - // constructor(plugin: MsTodoSync, line: string, fileName: string) { - // this.plugin = plugin; - // this.settings = plugin.settings; - // this.fileName = fileName; - // this.originalTitle = line; - - // this.logger.debug(`Creating: '${this.title}'`); - - // this.title = line.trim(); - - // // This will strip out the block link if it exists as - // // it is part of this plugin and not user specified. - // this.checkForBlockLink(line); - - // // This will strip out the checkbox if in title. - // this.checkForStatus(line); - - // this.checkForImportance(line); + //constructor() { + // this.plugin = plugin; + // this.settings = plugin.settings; + // this.fileName = fileName; + // this.originalTitle = line; + // this.logger.debug(`Creating: '${this.title}'`); + // this.title = line.trim(); + // // This will strip out the block link if it exists as + // // it is part of this plugin and not user specified. + // this.checkForBlockLink(line); + // // This will strip out the checkbox if in title. + // this.checkForStatus(line); + // this.checkForImportance(line); + // this.title = this.title + // .trim() + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .trim(); + // this.body = { + // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + // contentType: 'text', + // }; + // this.logger.debug(`Created: '${this.title}'`); + //} + constructor(plugin: MsTodoSync, line: string, fileName: string) { + this.plugin = plugin; + this.settings = plugin.settings; + this.fileName = fileName; + this.originalTitle = line; + + this.logger.debug(`Creating: '${this.title}'`); + + this.title = line.trim(); + + // This will strip out the block link if it exists as + // it is part of this plugin and not user specified. + this.checkForBlockLink(line); + + // This will strip out the checkbox if in title. + this.checkForStatus(line); + + this.checkForImportance(line); + + this.title = this.title + .trim() + .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + .trim(); - // this.title = this.title - // .trim() - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .trim(); + this.body = { + content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + contentType: 'text', + }; - // this.body = { - // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - // contentType: 'text', - // }; + if (!this.linkedResources) { + this.linkedResources = []; + } + this.linkedResources.push({ + webUrl: `obsidian://advanced-uri?filepath=${fileName}`, + applicationName: 'Obsidian', + displayName: 'fileName', + }); - // this.logger.debug(`Created: '${this.title}'`); - // } + this.logger.debug(`Created: '${this.title}'`); + } - static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { - const task = new ObsidianTodoTask(); + // static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { + // const task = new ObsidianTodoTask(); - task.plugin = plugin; - task.settings = plugin.settings; - task.fileName = fileName; + // task.plugin = plugin; + // task.settings = plugin.settings; + // task.fileName = fileName; - const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; + // const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; - await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); + // await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); - app.vault.read(this.config.target_file); + // app.vault.read(this.config.target_file); - plugin.app.vault.getAbstractFileByPath; - pageMetadata.listItems?.find((item) => { - if (item.position.start.line === lineNumber) { - task.originalTitle = item.line; - } - }); + // plugin.app.vault.getAbstractFileByPath; + // pageMetadata.listItems?.find((item) => { + // if (item.position.start.line === lineNumber) { + // task.originalTitle = item.line; + // } + // }); - return task; - } + // return task; + // } public getTodoTask(withChecklist = false): TodoTask { const toDo: TodoTask = { @@ -187,6 +196,10 @@ export class ObsidianTodoTask implements TodoTask { toDo.checklistItems = this.checklistItems; } } + + if (this.linkedResources && this.linkedResources.length > 0) { + toDo.linkedResources = this.linkedResources; + } return toDo; } @@ -216,7 +229,7 @@ export class ObsidianTodoTask implements TodoTask { * @return {*} {string} * @memberof ObsidianTodoTask */ - public getMarkdownTask(): string { + public getMarkdownTask(singleLine: boolean): string { let output: string; // Format and display the task which is the first line. @@ -265,8 +278,11 @@ export class ObsidianTodoTask implements TodoTask { } // this.logger.debug(`formattedChecklist: '${formattedChecklist}'`); - output = `${output.trim()}\n${formattedBody}${formattedChecklist}`; - + if (singleLine) { + output = `${output.trim()}`; + } else { + output = `${output.trim()}\n${formattedBody}${formattedChecklist}`; + } // this.logger.debug(`output: '${output}'`); return output; From 85df9c7a0a9a51baecce6e8174a340aacb1d8bb0 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 19 Dec 2024 15:32:00 -0800 Subject: [PATCH 08/34] refactor: moved to pnpm and cleaned up repo formatting Moved to pnpm and added xo for more consistent formatting. Started the refactor to make it more managable and start increaing the reliability for the community that has asked. --- .eslintignore | 2 - .eslintrc | 74 - .github/workflows/release.yml | 4 +- .github/workflows/verify.yml | 4 +- .gitignore | 7 +- .vscode/settings.json | 6 + README.md | 16 +- esbuild.config.mjs | 66 +- package-lock.json | 2333 ------------ package.json | 19 +- pnpm-lock.yaml | 5704 ++++++++++++++++++++++++++++ src/api/microsoftClientProvider.ts | 103 + src/api/todoApi.ts | 275 +- src/command/msTodoCommand.ts | 589 +-- src/gui/microsoftAuthModal.ts | 44 +- src/gui/msTodoSyncSettingTab.ts | 674 ++-- src/lib/lang.ts | 25 +- src/lib/logging.ts | 554 +-- src/main.ts | 461 +-- src/model/ObsidianTodoTask.ts | 694 ++-- src/utils/formatter.ts | 14 +- version-bump.mjs | 16 +- 22 files changed, 7555 insertions(+), 4129 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc create mode 100644 .vscode/settings.json delete mode 100644 package-lock.json create mode 100644 pnpm-lock.yaml create mode 100644 src/api/microsoftClientProvider.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 965d55e..0000000 --- a/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -# don't ever lint node_modules -node_modules diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 74b9dc1..0000000 --- a/.eslintrc +++ /dev/null @@ -1,74 +0,0 @@ -{ - "root": true, - "parser": "@typescript-eslint/parser", - "env": { - "es6": true, - "node": true, - "browser": true - }, - "plugins": [ - "@typescript-eslint", - "import", - "prettier", - "no-loops" - ], - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "plugin:import/typescript", - "prettier" - ], - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module", - "ecmaFeatures": { - "modules": true - } - }, - "ignorePatterns": [ - "main.js", - "node_modules" - ], - "globals": { - "Atomics": "readonly", - "SharedArrayBuffer": "readonly" - }, - "rules": { - "prettier/prettier": 2, - "linebreak-style": [ - "error", - "unix" - ], - "quotes": [ - "error", - "single", - { - "avoidEscape": true - } - ], - "semi": [ - "error", - "always" - ], - "import/order": "error", - "sort-imports": [ - "error", - { - "ignoreDeclarationSort": true - } - ], - "no-unused-vars": "off", - "@typescript-eslint/no-unused-vars": [ - "error", - { - "args": "none" - } - ], - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/ban-ts-comment": "off", - "no-prototype-builtins": "off", - "@typescript-eslint/no-empty-function": "off", - "no-loops/no-loops": 2 - } -} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cbd8707..3353eac 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -26,8 +26,8 @@ jobs: - name: Build id: build run: | - npm install - npm run build + pnpm install + pnpm run build # Package the required files into a zip - name: Package Plugin 📦 run: | diff --git a/.github/workflows/verify.yml b/.github/workflows/verify.yml index 144563f..3babeb0 100644 --- a/.github/workflows/verify.yml +++ b/.github/workflows/verify.yml @@ -12,10 +12,10 @@ jobs: - uses: actions/checkout@v2 - name: Install modules - run: npm install + run: pnpm install - name: Run build - run: npm run build + run: pnpm run build # - name: Run TypeScript compiler ESLint # run: yarn run lint diff --git a/.gitignore b/.gitignore index 03b952f..5bf6757 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1,8 @@ -# vscode -.vscode - # Intellij *.iml .idea -# npm +# pnpm node_modules # Don't include the compiled main.js file in the repo. @@ -21,4 +18,4 @@ data.json # Exclude macOS Finder (System Explorer) View States .DS_Store # Exclude cache -cache \ No newline at end of file +cache diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6d16992 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "msal", + "mstodo" + ] +} \ No newline at end of file diff --git a/README.md b/README.md index 60a2971..be33ecd 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ This plugin allows you to create and synchronize tasks with Microsoft To Do. If you are working on the plugin, you can use the following commands to build and run the plugin: ```bash -npm install -npm run build +pnpm install +pnpm run build ``` ### Releasing new releases @@ -36,7 +36,7 @@ npm run build - Upload the files `manifest.json`, `main.js`, `styles.css` as binary attachments. Note: The manifest.json file must be in two places, first the root path of your repository and also in the release. - Publish the release. -> You can simplify the version bump process by running `npm version patch`, `npm version minor` or `npm version major` after updating `minAppVersion` manually in `manifest.json`. +> You can simplify the version bump process by running `pnpm version patch`, `pnpm version minor` or `pnpm version major` after updating `minAppVersion` manually in `manifest.json`. > The command will bump version in `manifest.json` and `package.json`, and add the entry for the new version to `versions.json` ### Adding your plugin to the community plugin list @@ -49,8 +49,8 @@ npm run build ### How to use - Clone this repo. -- `npm i` to install dependencies -- `npm run dev` to start compilation in watch mode. +- `pnpm i` to install dependencies +- `pnpm run dev` to start compilation in watch mode. ### Manually installing the plugin @@ -61,14 +61,14 @@ npm run build To look for issues. ```bash -npm run lint +pnpm run lint ``` To automatically fix issues where possible. ```bash -npm run lint:fix -npm run prettier-format +pnpm run lint:fix +pnpm run prettier-format ``` ### API Documentation diff --git a/esbuild.config.mjs b/esbuild.config.mjs index aa59f1c..7b8d0dd 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -1,4 +1,4 @@ -import process from 'process'; +import process from 'node:process'; import esbuild from 'esbuild'; import builtins from 'builtin-modules'; @@ -8,37 +8,37 @@ if you want to view the source, please visit the github repository of this plugi */ `; -const prod = process.argv[2] === 'production'; +const production = process.argv[2] === 'production'; esbuild - .build({ - banner: { - js: banner, - }, - entryPoints: ['src/main.ts'], - bundle: true, - external: [ - 'obsidian', - 'electron', - '@codemirror/autocomplete', - '@codemirror/collab', - '@codemirror/commands', - '@codemirror/language', - '@codemirror/lint', - '@codemirror/search', - '@codemirror/state', - '@codemirror/view', - '@lezer/common', - '@lezer/highlight', - '@lezer/lr', - ...builtins, - ], - format: 'cjs', - watch: !prod, - target: 'es2018', - logLevel: 'info', - sourcemap: prod ? false : 'inline', - treeShaking: true, - outfile: 'main.js', - }) - .catch(() => process.exit(1)); + .build({ + banner: { + js: banner, + }, + entryPoints: ['src/main.ts'], + bundle: true, + external: [ + 'obsidian', + 'electron', + '@codemirror/autocomplete', + '@codemirror/collab', + '@codemirror/commands', + '@codemirror/language', + '@codemirror/lint', + '@codemirror/search', + '@codemirror/state', + '@codemirror/view', + '@lezer/common', + '@lezer/highlight', + '@lezer/lr', + ...builtins, + ], + format: 'cjs', + watch: !production, + target: 'es2018', + logLevel: 'info', + sourcemap: production ? false : 'inline', + treeShaking: true, + outfile: 'main.js', + }) + .catch(() => process.exit(1)); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index bdd0914..0000000 --- a/package-lock.json +++ /dev/null @@ -1,2333 +0,0 @@ -{ - "name": "obsidian-mstodo-sync", - "version": "1.0.1", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@azure/msal-common": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@azure/msal-common/-/msal-common-7.6.0.tgz", - "integrity": "sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==" - }, - "@azure/msal-node": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@azure/msal-node/-/msal-node-1.14.2.tgz", - "integrity": "sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==", - "requires": { - "@azure/msal-common": "^7.6.0", - "jsonwebtoken": "^8.5.1", - "uuid": "^8.3.0" - } - }, - "@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "requires": { - "@babel/highlight": "^7.10.4" - } - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/runtime": { - "version": "7.20.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.1.tgz", - "integrity": "sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==", - "requires": { - "regenerator-runtime": "^0.13.10" - } - }, - "@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - } - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@microsoft/microsoft-graph-client": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-client/-/microsoft-graph-client-3.0.3.tgz", - "integrity": "sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==", - "requires": { - "@babel/runtime": "^7.12.5", - "tslib": "^2.2.0" - } - }, - "@microsoft/microsoft-graph-types": { - "version": "2.25.0", - "resolved": "https://registry.npmjs.org/@microsoft/microsoft-graph-types/-/microsoft-graph-types-2.25.0.tgz", - "integrity": "sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==" - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/codemirror": { - "version": "0.0.108", - "resolved": "https://registry.npmjs.org/@types/codemirror/-/codemirror-0.0.108.tgz", - "integrity": "sha512-3FGFcus0P7C2UOGCNUVENqObEb4SFk+S8Dnxq7K6aIsLVs/vDtlangl3PEO0ykaKXyK56swVF6Nho7VsA44uhw==", - "dev": true, - "requires": { - "@types/tern": "*" - } - }, - "@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, - "@types/node": { - "version": "16.18.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.3.tgz", - "integrity": "sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==", - "dev": true - }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dev": true, - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "@types/tern": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/@types/tern/-/tern-0.23.4.tgz", - "integrity": "sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==", - "dev": true, - "requires": { - "@types/estree": "*" - } - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.29.0.tgz", - "integrity": "sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/type-utils": "5.29.0", - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.2.0", - "regexpp": "^3.2.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/parser": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.29.0.tgz", - "integrity": "sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.29.0.tgz", - "integrity": "sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==", - "dev": true, - "requires": { - "@typescript-eslint/utils": "5.29.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-includes": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz", - "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.19.5", - "get-intrinsic": "^1.1.1", - "is-string": "^1.0.7" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" - }, - "builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "esbuild": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.47.tgz", - "integrity": "sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==", - "dev": true, - "requires": { - "esbuild-android-64": "0.14.47", - "esbuild-android-arm64": "0.14.47", - "esbuild-darwin-64": "0.14.47", - "esbuild-darwin-arm64": "0.14.47", - "esbuild-freebsd-64": "0.14.47", - "esbuild-freebsd-arm64": "0.14.47", - "esbuild-linux-32": "0.14.47", - "esbuild-linux-64": "0.14.47", - "esbuild-linux-arm": "0.14.47", - "esbuild-linux-arm64": "0.14.47", - "esbuild-linux-mips64le": "0.14.47", - "esbuild-linux-ppc64le": "0.14.47", - "esbuild-linux-riscv64": "0.14.47", - "esbuild-linux-s390x": "0.14.47", - "esbuild-netbsd-64": "0.14.47", - "esbuild-openbsd-64": "0.14.47", - "esbuild-sunos-64": "0.14.47", - "esbuild-windows-32": "0.14.47", - "esbuild-windows-64": "0.14.47", - "esbuild-windows-arm64": "0.14.47" - } - }, - "esbuild-android-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.47.tgz", - "integrity": "sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.47.tgz", - "integrity": "sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.47.tgz", - "integrity": "sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.47.tgz", - "integrity": "sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.47.tgz", - "integrity": "sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.47.tgz", - "integrity": "sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.47.tgz", - "integrity": "sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.47.tgz", - "integrity": "sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.47.tgz", - "integrity": "sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.47.tgz", - "integrity": "sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.47.tgz", - "integrity": "sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.47.tgz", - "integrity": "sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.47.tgz", - "integrity": "sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.47.tgz", - "integrity": "sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.47.tgz", - "integrity": "sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.47.tgz", - "integrity": "sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.47.tgz", - "integrity": "sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.47.tgz", - "integrity": "sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.47.tgz", - "integrity": "sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.14.47", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.47.tgz", - "integrity": "sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==", - "dev": true, - "optional": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "requires": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "dependencies": { - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - } - } - }, - "eslint-config-prettier": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", - "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", - "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "resolve": "^1.20.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.26.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", - "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", - "dev": true, - "requires": { - "array-includes": "^3.1.4", - "array.prototype.flat": "^1.2.5", - "debug": "^2.6.9", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.6", - "eslint-module-utils": "^2.7.3", - "has": "^1.0.3", - "is-core-module": "^2.8.1", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.5", - "resolve": "^1.22.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "eslint-plugin-no-loops": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-no-loops/-/eslint-plugin-no-loops-0.3.0.tgz", - "integrity": "sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==", - "dev": true - }, - "eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", - "dev": true, - "requires": { - "prettier-linter-helpers": "^1.0.0" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^2.0.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true - }, - "espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "requires": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, - "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "13.17.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", - "integrity": "sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" - }, - "lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" - }, - "lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" - }, - "lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" - }, - "lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" - }, - "lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" - }, - "lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", - "dev": true - }, - "moment": { - "version": "2.29.4", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", - "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "obsidian": { - "version": "0.16.3", - "resolved": "https://registry.npmjs.org/obsidian/-/obsidian-0.16.3.tgz", - "integrity": "sha512-hal9qk1A0GMhHSeLr2/+o3OpLmImiP+Y+sx2ewP13ds76KXsziG96n+IPFT0mSkup1zSwhEu+DeRhmbcyCCXWw==", - "dev": true, - "requires": { - "@types/codemirror": "0.0.108", - "moment": "2.29.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "prettier": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.7.1.tgz", - "integrity": "sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==", - "dev": true - }, - "prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", - "dev": true, - "requires": { - "fast-diff": "^1.1.2" - } - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, - "regenerator-runtime": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", - "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true - }, - "require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true - }, - "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "requires": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "dependencies": { - "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - } - }, - "json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - } - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - }, - "typescript": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } -} diff --git a/package.json b/package.json index 7f096d2..ae16564 100644 --- a/package.json +++ b/package.json @@ -4,12 +4,14 @@ "description": "This is a MsTodoSync plugin for Obsidian (https://obsidian.md)", "main": "main.js", "scripts": { + "preinstall": "npx only-allow pnpm", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", "dev": "node esbuild.config.mjs", "version": "node version-bump.mjs && git add manifest.json versions.json", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix", - "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write" + "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", + "test": "xo" }, "keywords": [], "author": "", @@ -29,13 +31,26 @@ "obsidian": "latest", "prettier": "^2.7.1", "tslib": "2.4.0", - "typescript": "4.7.4" + "typescript": "4.7.4", + "xo": "^0.60.0" }, "dependencies": { + "@azure/msal-common": "^14.16.0", "@azure/msal-node": "^1.14.2", "@microsoft/microsoft-graph-client": "^3.0.2", "@microsoft/microsoft-graph-types": "^2.25.0", "eventemitter2": "^6.4.5", "node-fetch": "^2.6.1" + }, + "xo": { + "space": true, + "rules": { + "unicorn/filename-case": [ + "error", + { + "case": "camelCase" + } + ] + } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..1a8bc17 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5704 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@azure/msal-common': + specifier: ^14.16.0 + version: 14.16.0 + '@azure/msal-node': + specifier: ^1.14.2 + version: 1.14.2 + '@microsoft/microsoft-graph-client': + specifier: ^3.0.2 + version: 3.0.3 + '@microsoft/microsoft-graph-types': + specifier: ^2.25.0 + version: 2.25.0 + eventemitter2: + specifier: ^6.4.5 + version: 6.4.9 + node-fetch: + specifier: ^2.6.1 + version: 2.6.7 + devDependencies: + '@types/node': + specifier: ^16.11.6 + version: 16.18.3 + '@types/node-fetch': + specifier: ^2.6.2 + version: 2.6.2 + '@typescript-eslint/eslint-plugin': + specifier: 5.29.0 + version: 5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/parser': + specifier: 5.29.0 + version: 5.29.0(eslint@7.32.0)(typescript@4.7.4) + builtin-modules: + specifier: 3.3.0 + version: 3.3.0 + esbuild: + specifier: 0.14.47 + version: 0.14.47 + eslint: + specifier: ^7.22.0 + version: 7.32.0 + eslint-config-prettier: + specifier: ^8.5.0 + version: 8.5.0(eslint@7.32.0) + eslint-plugin-import: + specifier: ^2.22.1 + version: 2.26.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) + eslint-plugin-no-loops: + specifier: ^0.3.0 + version: 0.3.0(eslint@7.32.0) + eslint-plugin-prettier: + specifier: ^4.2.1 + version: 4.2.1(eslint-config-prettier@8.5.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.7.1) + obsidian: + specifier: latest + version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) + prettier: + specifier: ^2.7.1 + version: 2.7.1 + tslib: + specifier: 2.4.0 + version: 2.4.0 + typescript: + specifier: 4.7.4 + version: 4.7.4 + xo: + specifier: ^0.60.0 + version: 0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.47)) + +packages: + + '@azure/msal-common@14.16.0': + resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} + engines: {node: '>=0.8.0'} + + '@azure/msal-common@7.6.0': + resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==} + engines: {node: '>=0.8.0'} + + '@azure/msal-node@1.14.2': + resolution: {integrity: sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==} + engines: {node: 10 || 12 || 14 || 16 || 18} + deprecated: A newer major version of this library is available. Please upgrade to the latest available version. + + '@babel/code-frame@7.12.11': + resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} + + '@babel/helper-validator-identifier@7.19.1': + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.18.6': + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.20.1': + resolution: {integrity: sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==} + engines: {node: '>=6.9.0'} + + '@codemirror/state@6.1.2': + resolution: {integrity: sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==} + + '@codemirror/view@6.4.1': + resolution: {integrity: sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==} + + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@0.4.3': + resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} + engines: {node: ^10.12.0 || >=12.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.2.0': + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@8.57.1': + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/config-array@0.5.0': + resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@1.2.1': + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + deprecated: Use @eslint/object-schema instead + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + deprecated: Use @eslint/object-schema instead + + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/source-map@0.3.6': + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@microsoft/microsoft-graph-client@3.0.3': + resolution: {integrity: sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + '@azure/identity': '*' + '@azure/msal-browser': '*' + buffer: '*' + stream-browserify: '*' + peerDependenciesMeta: + '@azure/identity': + optional: true + '@azure/msal-browser': + optional: true + buffer: + optional: true + stream-browserify: + optional: true + + '@microsoft/microsoft-graph-types@2.25.0': + resolution: {integrity: sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@rtsao/scc@1.1.0': + resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@sindresorhus/merge-streams@2.3.0': + resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} + engines: {node: '>=18'} + + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + + '@types/codemirror@5.60.8': + resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} + + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@8.56.12': + resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + + '@types/estree@1.0.0': + resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/json-schema@7.0.11': + resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/node-fetch@2.6.2': + resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + + '@types/node@16.18.3': + resolution: {integrity: sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/tern@0.23.4': + resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} + + '@typescript-eslint/eslint-plugin@5.29.0': + resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.18.0': + resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@5.29.0': + resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.18.0': + resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.29.0': + resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.18.0': + resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@5.29.0': + resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.18.0': + resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.29.0': + resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.18.0': + resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.29.0': + resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.18.0': + resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.29.0': + resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.18.0': + resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.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} + + '@typescript-eslint/visitor-keys@7.18.0': + resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@ungap/structured-clone@1.2.1': + resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} + + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@3.5.2: + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ajv@8.11.0: + resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-includes@3.1.5: + resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + engines: {node: '>= 0.4'} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.1: + resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.3: + resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.3: + resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} + engines: {node: '>= 0.4'} + + arraybuffer.prototype.slice@1.0.4: + resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} + engines: {node: '>= 0.4'} + + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + + astral-regex@2.0.0: + resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} + engines: {node: '>=8'} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browserslist@4.24.3: + resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + + call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + + call-bind@1.0.8: + resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} + engines: {node: '>= 0.4'} + + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + caniuse-lite@1.0.30001690: + resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.4.0: + resolution: {integrity: sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + ci-info@4.1.0: + resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + engines: {node: '>=8'} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + common-path-prefix@3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + + core-js-compat@3.39.0: + resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.1: + resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + + define-properties@1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + + electron-to-chromium@1.5.75: + resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} + + emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + enhance-visitors@1.0.0: + resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} + engines: {node: '>=4.0.0'} + + enhanced-resolve@0.9.1: + resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} + engines: {node: '>=0.6'} + + enhanced-resolve@5.17.1: + resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + engines: {node: '>=10.13.0'} + + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + + env-editor@1.1.0: + resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.20.4: + resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} + engines: {node: '>= 0.4'} + + es-abstract@1.23.6: + resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + es-to-primitive@1.3.0: + resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} + engines: {node: '>= 0.4'} + + esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-compat-utils@0.5.1: + resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} + engines: {node: '>=12'} + peerDependencies: + eslint: '>=6.0.0' + + eslint-config-prettier@8.5.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-xo-typescript@5.0.0: + resolution: {integrity: sha512-ukAYCKf3p039pRai7hb6xaomZzsKlCjV5qx3NbYe27UC7Nz75If1HcpQL5sNW2b5aH8+Axb6dIIv28+bVtwlVQ==} + engines: {node: '>=18'} + peerDependencies: + '@typescript-eslint/eslint-plugin': '>=7.16.0' + '@typescript-eslint/parser': '>=7.16.0' + eslint: '>=8.56.0' + typescript: '>=5.0.0' + + eslint-config-xo@0.45.0: + resolution: {integrity: sha512-T30F2S2HKKmr/RoHopKE7wMUMWrsLMab1qFl2WyFJjETbD+l7p4hSQWpTVGW7TEbSKG1QBekwf6Jn9ZDPA6thA==} + engines: {node: '>=18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-formatter-pretty@6.0.1: + resolution: {integrity: sha512-znAUcXmBthdIUmlnRkPSxz3zSJHFUhfHF/nJPcCMVKg/mOa4yUie2Olqg1Ghbi5JJRBZVU3rIgzWSObvIspxMA==} + engines: {node: '>=18'} + + eslint-import-resolver-node@0.3.6: + resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-webpack@0.13.10: + resolution: {integrity: sha512-ciVTEg7sA56wRMR772PyjcBRmyBMLS46xgzQZqt6cWBEKc7cK65ZSSLCTLVRu2gGtKyXUb5stwf4xxLBfERLFA==} + engines: {node: '>= 6'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + webpack: '>=1.11.0' + + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-module-utils@2.7.4: + resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-ava@14.0.0: + resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} + engines: {node: '>=14.17 <15 || >=16.4'} + peerDependencies: + eslint: '>=8.26.0' + + eslint-plugin-es-x@7.8.0: + resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '>=8' + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.26.0: + resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-import@2.31.0: + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-n@17.15.0: + resolution: {integrity: sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: '>=8.23.0' + + eslint-plugin-no-loops@0.3.0: + resolution: {integrity: sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==} + peerDependencies: + eslint: '>=2.0.0' + + eslint-plugin-no-use-extend-native@0.5.0: + resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} + engines: {node: '>=6.0.0'} + + eslint-plugin-prettier@4.2.1: + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + + eslint-plugin-promise@6.6.0: + resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + + eslint-plugin-unicorn@56.0.1: + resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} + engines: {node: '>=18.18'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-rule-docs@1.1.235: + resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.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} + + eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + + eslint-utils@3.0.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + + eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + 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} + + 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} + + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@7.32.0: + resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} + engines: {node: ^10.12.0 || >=12.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + eslint@8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + + esm-utils@4.3.0: + resolution: {integrity: sha512-KupZztbWAnuksy1TYPjTkePxVlMWzmXdmB72z1WvUadtUiFv6x+0PKjYfyy1io9gdvU1A6QIcu055NRrJu1TEA==} + + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@7.3.1: + resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} + engines: {node: ^10.12.0 || >=12.0.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + espurify@2.1.1: + resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} + + esquery@1.4.0: + resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} + engines: {node: '>=0.10'} + + esquery@1.6.0: + resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + eventemitter2@6.4.9: + resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-diff@1.2.0: + resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} + + fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fastq@1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + + file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-cache-dir@5.0.0: + resolution: {integrity: sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig==} + engines: {node: '>=16'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + flat-cache@3.0.4: + resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + engines: {node: ^10.12.0 || >=12.0.0} + + flatted@3.2.7: + resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + + function.prototype.name@1.1.7: + resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + engines: {node: '>= 0.4'} + + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + + get-intrinsic@1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + + get-intrinsic@1.2.6: + resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} + engines: {node: '>= 0.4'} + + get-set-props@0.1.0: + resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} + engines: {node: '>=0.10.0'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + + get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + + get-symbol-description@1.1.0: + resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.8.1: + resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + + globals@13.17.0: + resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} + engines: {node: '>=8'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@14.0.2: + resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} + engines: {node: '>=18'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.2.0: + resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + has@1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + + ignore@4.0.6: + resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} + engines: {node: '>= 4'} + + ignore@5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + import-modules@2.1.0: + resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + engines: {node: '>=8'} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + internal-slot@1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + + internal-slot@1.1.0: + resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} + engines: {node: '>= 0.4'} + + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + irregular-plurals@3.5.0: + resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} + engines: {node: '>=8'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-array-buffer@3.0.5: + resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-bigint@1.1.0: + resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-boolean-object@1.2.1: + resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} + engines: {node: '>= 0.4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.11.0: + resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + + is-core-module@2.16.0: + resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + engines: {node: '>= 0.4'} + + is-data-view@1.0.2: + resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-date-object@1.1.0: + resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} + engines: {node: '>= 0.4'} + + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.1.1: + resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} + engines: {node: '>= 0.4'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-get-set-prop@1.0.0: + resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + + is-js-type@2.0.0: + resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negated-glob@1.0.0: + resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} + engines: {node: '>=0.10.0'} + + is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number-object@1.1.1: + resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-obj-prop@1.0.0: + resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-proto-prop@2.0.0: + resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + + is-shared-array-buffer@1.0.4: + resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} + engines: {node: '>= 0.4'} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-string@1.1.1: + resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} + engines: {node: '>= 0.4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-symbol@1.1.1: + resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.15: + resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakref@1.1.0: + resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} + engines: {node: '>= 0.4'} + + is-weakset@2.0.4: + resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-types@1.0.0: + resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} + engines: {node: '>=0.10.0'} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.1: + resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} + hasBin: true + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonwebtoken@8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + + jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + + jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + line-column-path@3.0.0: + resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + + lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + + lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + + lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + + lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + + lodash.truncate@4.4.2: + resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + lowercase-keys@1.0.1: + resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} + engines: {node: '>=0.10.0'} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memory-fs@0.2.0: + resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micro-spelling-correcter@1.1.1: + resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.7: + resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + + moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-releases@2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + obj-props@1.4.0: + resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} + engines: {node: '>=0.10.0'} + + object-inspect@1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + + object.assign@4.1.7: + resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.values@1.1.6: + resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} + engines: {node: '>= 0.4'} + + object.values@1.2.1: + resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} + engines: {node: '>= 0.4'} + + obsidian@1.7.2: + resolution: {integrity: sha512-k9hN9brdknJC+afKr5FQzDRuEFGDKbDjfCazJwpgibwCAoZNYHYV8p/s3mM8I6AsnKrPKNXf8xGuMZ4enWelZQ==} + peerDependencies: + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + open-editor@5.0.0: + resolution: {integrity: sha512-fRHi4my03WQSbWfqChs9AdFfSp6SLalB3zadfwfYIojoKanLDBfv2uAdiZCfzdvom7TBdlXu2UeiiydBc56/EQ==} + engines: {node: '>=18'} + + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + + optionator@0.9.1: + resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} + engines: {node: '>= 0.8.0'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + path-type@5.0.0: + resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} + engines: {node: '>=12'} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pkg-dir@5.0.0: + resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} + engines: {node: '>=10'} + + pkg-dir@7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + + plur@5.1.0: + resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + + prettier@2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} + hasBin: true + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + proto-props@2.0.0: + resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} + engines: {node: '>=4'} + + punycode@2.1.1: + resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + engines: {node: '>=6'} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.9: + resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.13.10: + resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + + regexp.prototype.flags@1.5.3: + resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} + engines: {node: '>= 0.4'} + + regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve@1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + safe-array-concat@1.1.3: + resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + + safe-regex-test@1.1.0: + resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} + engines: {node: '>= 0.4'} + + schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + + schema-utils@4.3.0: + resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} + engines: {node: '>= 10.13.0'} + + semver@5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + + semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + + side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@5.1.0: + resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} + engines: {node: '>=14.16'} + + slice-ansi@4.0.0: + resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} + engines: {node: '>=10'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.20: + resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + + string.prototype.trim@1.2.10: + resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.6: + resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} + + string.prototype.trimend@1.0.9: + resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} + engines: {node: '>= 0.4'} + + string.prototype.trimstart@1.0.6: + resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + style-mod@4.1.2: + resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-hyperlinks@3.1.0: + resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} + engines: {node: '>=14.18'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + + table@6.8.1: + resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + engines: {node: '>=10.0.0'} + + tapable@0.1.10: + resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} + engines: {node: '>=0.6'} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + terser-webpack-plugin@5.3.11: + resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + + terser@5.37.0: + resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} + engines: {node: '>=10'} + hasBin: true + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + to-absolute-glob@3.0.0: + resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} + engines: {node: '>=0.10.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + tsconfig-paths@3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typed-array-buffer@1.0.3: + resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.3: + resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.4: + resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.7: + resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} + engines: {node: '>= 0.4'} + + typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + + typescript@5.7.2: + resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} + engines: {node: '>=14.17'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + unicorn-magic@0.1.0: + resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} + engines: {node: '>=18'} + + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-or-path@2.3.2: + resolution: {integrity: sha512-DOI9KXk0bc/JOmFQHbn25knW2GX/ym7+egKFEFApG3VdDzRlLBMCIrMnruq4AZUGop1W0aiYQ5Vry6clzhxcOQ==} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + + watchpack@2.4.2: + resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} + engines: {node: '>=10.13.0'} + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + webpack@5.97.1: + resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.18: + resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.3: + resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} + engines: {node: '>=0.10.0'} + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xo@0.60.0: + resolution: {integrity: sha512-Il6Ap/bkYQm2CvocfiNY8yR52OospMdlxwbT2V/8KBRRCc+JKI1ARyFJpemuze9ZHBy/AAaDurjqWNj0C2DCYQ==} + engines: {node: '>=18.18'} + hasBin: true + peerDependencies: + webpack: '>=1.11.0' + peerDependenciesMeta: + webpack: + optional: true + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.1.1: + resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} + engines: {node: '>=12.20'} + + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + +snapshots: + + '@azure/msal-common@14.16.0': {} + + '@azure/msal-common@7.6.0': {} + + '@azure/msal-node@1.14.2': + dependencies: + '@azure/msal-common': 7.6.0 + jsonwebtoken: 8.5.1 + uuid: 8.3.2 + + '@babel/code-frame@7.12.11': + dependencies: + '@babel/highlight': 7.18.6 + + '@babel/helper-validator-identifier@7.19.1': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/highlight@7.18.6': + dependencies: + '@babel/helper-validator-identifier': 7.19.1 + chalk: 2.4.2 + js-tokens: 4.0.0 + + '@babel/runtime@7.20.1': + dependencies: + regenerator-runtime: 0.13.10 + + '@codemirror/state@6.1.2': {} + + '@codemirror/view@6.4.1': + dependencies: + '@codemirror/state': 6.1.2 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.12.1': {} + + '@eslint/eslintrc@0.4.3': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 7.3.1 + globals: 13.17.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.2.0': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@8.57.1': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/config-array@0.5.0': + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@1.2.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/source-map@0.3.6': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@microsoft/microsoft-graph-client@3.0.3': + dependencies: + '@babel/runtime': 7.20.1 + tslib: 2.4.0 + + '@microsoft/microsoft-graph-types@2.25.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + + '@pkgr/core@0.1.1': {} + + '@rtsao/scc@1.1.0': {} + + '@sec-ant/readable-stream@0.4.1': {} + + '@sindresorhus/merge-streams@2.3.0': {} + + '@sindresorhus/merge-streams@4.0.0': {} + + '@types/codemirror@5.60.8': + dependencies: + '@types/tern': 0.23.4 + + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.6 + + '@types/eslint@8.56.12': + dependencies: + '@types/estree': 1.0.0 + '@types/json-schema': 7.0.11 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.11 + + '@types/estree@1.0.0': {} + + '@types/estree@1.0.6': {} + + '@types/json-schema@7.0.11': {} + + '@types/json5@0.0.29': {} + + '@types/node-fetch@2.6.2': + dependencies: + '@types/node': 16.18.3 + form-data: 3.0.1 + + '@types/node@16.18.3': {} + + '@types/normalize-package-data@2.4.4': {} + + '@types/tern@0.23.4': + dependencies: + '@types/estree': 1.0.0 + + '@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4)': + dependencies: + '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/scope-manager': 5.29.0 + '@typescript-eslint/type-utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + debug: 4.3.4 + eslint: 7.32.0 + functional-red-black-tree: 1.0.1 + ignore: 5.2.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0(typescript@4.7.4) + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 7.18.0 + eslint: 8.57.1 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + 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) + debug: 4.3.4 + eslint: 7.32.0 + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.4 + eslint: 8.57.1 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.29.0': + dependencies: + '@typescript-eslint/types': 5.29.0 + '@typescript-eslint/visitor-keys': 5.29.0 + + '@typescript-eslint/scope-manager@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + + '@typescript-eslint/type-utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + dependencies: + '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + debug: 4.3.4 + eslint: 7.32.0 + tsutils: 3.21.0(typescript@4.7.4) + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) + '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + debug: 4.3.4 + eslint: 8.57.1 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.29.0': {} + + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/typescript-estree@5.29.0(typescript@4.7.4)': + dependencies: + '@typescript-eslint/types': 5.29.0 + '@typescript-eslint/visitor-keys': 5.29.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.3.8 + tsutils: 3.21.0(typescript@4.7.4) + optionalDependencies: + typescript: 4.7.4 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': + dependencies: + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/visitor-keys': 7.18.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.7.2) + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + dependencies: + '@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) + eslint: 7.32.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0(eslint@7.32.0) + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@typescript-eslint/scope-manager': 7.18.0 + '@typescript-eslint/types': 7.18.0 + '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) + eslint: 8.57.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.29.0': + dependencies: + '@typescript-eslint/types': 5.29.0 + eslint-visitor-keys: 3.3.0 + + '@typescript-eslint/visitor-keys@7.18.0': + dependencies: + '@typescript-eslint/types': 7.18.0 + eslint-visitor-keys: 3.4.3 + + '@ungap/structured-clone@1.2.1': {} + + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + + acorn-jsx@5.3.2(acorn@7.4.1): + dependencies: + acorn: 7.4.1 + + acorn-jsx@5.3.2(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + + acorn@7.4.1: {} + + acorn@8.14.0: {} + + ajv-formats@2.1.1(ajv@8.11.0): + optionalDependencies: + ajv: 8.11.0 + + ajv-keywords@3.5.2(ajv@6.12.6): + dependencies: + ajv: 6.12.6 + + ajv-keywords@5.1.0(ajv@8.11.0): + dependencies: + ajv: 8.11.0 + fast-deep-equal: 3.1.3 + + ajv@6.12.6: + 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 + + ajv@8.11.0: + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-escapes@6.2.1: {} + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.8 + is-array-buffer: 3.0.5 + + array-includes@3.1.5: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + get-intrinsic: 1.1.3 + is-string: 1.0.7 + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.6 + is-string: 1.0.7 + + array-union@2.1.0: {} + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.1: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + es-shim-unscopables: 1.0.0 + + array.prototype.flat@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.4: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + is-array-buffer: 3.0.5 + + arrify@3.0.0: {} + + astral-regex@2.0.0: {} + + asynckit@0.4.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + balanced-match@1.0.2: {} + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browserslist@4.24.3: + dependencies: + caniuse-lite: 1.0.30001690 + electron-to-chromium: 1.5.75 + node-releases: 2.0.19 + update-browserslist-db: 1.1.1(browserslist@4.24.3) + + buffer-equal-constant-time@1.0.1: {} + + buffer-from@1.1.2: {} + + builtin-modules@3.3.0: {} + + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + call-bind@1.0.2: + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.3 + + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + get-intrinsic: 1.2.6 + set-function-length: 1.2.2 + + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.6 + + callsites@3.1.0: {} + + caniuse-lite@1.0.30001690: {} + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.4.0: {} + + chrome-trace-event@1.0.4: {} + + ci-info@4.1.0: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + commander@2.20.3: {} + + common-path-prefix@3.0.0: {} + + concat-map@0.0.1: {} + + confusing-browser-globals@1.0.11: {} + + core-js-compat@3.39.0: + dependencies: + browserslist: 4.24.3 + + cosmiconfig@9.0.0(typescript@5.7.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.7.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.8 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.8 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + data-view-byte-offset@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.2 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + deep-is@0.1.4: {} + + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + define-lazy-prop@3.0.0: {} + + define-properties@1.1.4: + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + delayed-stream@1.0.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + doctrine@3.0.0: + dependencies: + esutils: 2.0.3 + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + + ecdsa-sig-formatter@1.0.11: + dependencies: + safe-buffer: 5.2.1 + + electron-to-chromium@1.5.75: {} + + emoji-regex@10.4.0: {} + + emoji-regex@8.0.0: {} + + enhance-visitors@1.0.0: + dependencies: + lodash: 4.17.21 + + enhanced-resolve@0.9.1: + dependencies: + graceful-fs: 4.2.11 + memory-fs: 0.2.0 + tapable: 0.1.10 + + enhanced-resolve@5.17.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + + env-editor@1.1.0: {} + + env-paths@2.2.1: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.20.4: + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.3 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + unbox-primitive: 1.0.2 + + es-abstract@1.23.6: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.7 + get-intrinsic: 1.2.6 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 + is-callable: 1.2.7 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.0 + math-intrinsics: 1.1.0 + object-inspect: 1.13.3 + object-keys: 1.1.1 + object.assign: 4.1.7 + regexp.prototype.flags: 1.5.3 + safe-array-concat: 1.1.3 + safe-regex-test: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.18 + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-module-lexer@1.5.4: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.6 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.0: + dependencies: + has: 1.0.3 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + es-to-primitive@1.3.0: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild-android-64@0.14.47: + optional: true + + esbuild-android-arm64@0.14.47: + optional: true + + esbuild-darwin-64@0.14.47: + optional: true + + esbuild-darwin-arm64@0.14.47: + optional: true + + esbuild-freebsd-64@0.14.47: + optional: true + + esbuild-freebsd-arm64@0.14.47: + optional: true + + esbuild-linux-32@0.14.47: + optional: true + + esbuild-linux-64@0.14.47: + optional: true + + esbuild-linux-arm64@0.14.47: + optional: true + + esbuild-linux-arm@0.14.47: + optional: true + + esbuild-linux-mips64le@0.14.47: + optional: true + + esbuild-linux-ppc64le@0.14.47: + optional: true + + esbuild-linux-riscv64@0.14.47: + optional: true + + esbuild-linux-s390x@0.14.47: + optional: true + + esbuild-netbsd-64@0.14.47: + optional: true + + esbuild-openbsd-64@0.14.47: + optional: true + + esbuild-sunos-64@0.14.47: + optional: true + + esbuild-windows-32@0.14.47: + optional: true + + esbuild-windows-64@0.14.47: + optional: true + + esbuild-windows-arm64@0.14.47: + optional: true + + esbuild@0.14.47: + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + + escalade@3.2.0: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@4.0.0: {} + + eslint-compat-utils@0.5.1(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + semver: 7.6.3 + + eslint-config-prettier@8.5.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + + eslint-config-prettier@9.1.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-config-xo-typescript@5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2): + dependencies: + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + eslint: 8.57.1 + typescript: 5.7.2 + + eslint-config-xo@0.45.0(eslint@8.57.1): + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.57.1 + + eslint-formatter-pretty@6.0.1: + dependencies: + '@types/eslint': 8.56.12 + ansi-escapes: 6.2.1 + chalk: 5.4.0 + eslint-rule-docs: 1.1.235 + log-symbols: 6.0.0 + plur: 5.1.0 + string-width: 7.2.0 + supports-hyperlinks: 3.1.0 + + eslint-import-resolver-node@0.3.6: + dependencies: + debug: 3.2.7 + resolve: 1.22.1 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.16.0 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)): + dependencies: + debug: 3.2.7 + enhanced-resolve: 0.9.1 + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) + find-root: 1.1.0 + hasown: 2.0.2 + interpret: 1.4.0 + is-core-module: 2.16.0 + is-regex: 1.2.1 + lodash: 4.17.21 + resolve: 2.0.0-next.5 + semver: 5.7.2 + webpack: 5.97.1(esbuild@0.14.47) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)) + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.7.4(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.6)(eslint@7.32.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.6 + transitivePeerDependencies: + - supports-color + + eslint-plugin-ava@14.0.0(eslint@8.57.1): + dependencies: + enhance-visitors: 1.0.0 + eslint: 8.57.1 + eslint-utils: 3.0.0(eslint@8.57.1) + espree: 9.6.1 + espurify: 2.1.1 + import-modules: 2.1.0 + micro-spelling-correcter: 1.1.1 + pkg-dir: 5.0.0 + resolve-from: 5.0.0 + + eslint-plugin-es-x@7.8.0(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1(eslint@8.57.1) + + eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): + dependencies: + escape-string-regexp: 1.0.5 + eslint: 8.57.1 + ignore: 5.2.0 + + eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0): + dependencies: + array-includes: 3.1.5 + array.prototype.flat: 1.3.1 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 7.32.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.6)(eslint@7.32.0) + has: 1.0.3 + is-core-module: 2.11.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.6 + resolve: 1.22.1 + tsconfig-paths: 3.14.1 + optionalDependencies: + '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1): + dependencies: + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) + hasown: 2.0.2 + is-core-module: 2.16.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-n@17.15.0(eslint@8.57.1): + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + enhanced-resolve: 5.17.1 + eslint: 8.57.1 + eslint-plugin-es-x: 7.8.0(eslint@8.57.1) + get-tsconfig: 4.8.1 + globals: 15.14.0 + ignore: 5.3.2 + minimatch: 9.0.5 + semver: 7.6.3 + + eslint-plugin-no-loops@0.3.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + + eslint-plugin-no-use-extend-native@0.5.0: + dependencies: + is-get-set-prop: 1.0.0 + is-js-type: 2.0.0 + is-obj-prop: 1.0.0 + is-proto-prop: 2.0.0 + + eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.5.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.7.1): + dependencies: + eslint: 7.32.0 + prettier: 2.7.1 + prettier-linter-helpers: 1.0.0 + optionalDependencies: + eslint-config-prettier: 8.5.0(eslint@7.32.0) + + eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): + dependencies: + eslint: 8.57.1 + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + + eslint-plugin-promise@6.6.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + + eslint-plugin-unicorn@56.0.1(eslint@8.57.1): + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + ci-info: 4.1.0 + clean-regexp: 1.0.0 + core-js-compat: 3.39.0 + eslint: 8.57.1 + esquery: 1.6.0 + globals: 15.14.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.1.0 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.3 + strip-indent: 3.0.0 + + eslint-rule-docs@1.1.235: {} + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@7.2.2: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-utils@2.1.0: + dependencies: + eslint-visitor-keys: 1.3.0 + + eslint-utils@3.0.0(eslint@7.32.0): + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 2.1.0 + + eslint-utils@3.0.0(eslint@8.57.1): + dependencies: + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + + eslint-visitor-keys@1.3.0: {} + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.3.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.2.0: {} + + eslint@7.32.0: + dependencies: + '@babel/code-frame': 7.12.11 + '@eslint/eslintrc': 0.4.3 + '@humanwhocodes/config-array': 0.5.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 5.1.1 + eslint-utils: 2.1.0 + eslint-visitor-keys: 2.1.0 + espree: 7.3.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 5.1.2 + globals: 13.17.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 3.14.1 + 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.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.8 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + table: 6.8.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + + eslint@8.57.1: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 + 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.6.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.24.0 + graphemer: 1.4.0 + ignore: 5.2.0 + 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.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + esm-utils@4.3.0: + dependencies: + import-meta-resolve: 4.1.0 + url-or-path: 2.3.2 + + espree@10.3.0: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + + espree@7.3.1: + dependencies: + acorn: 7.4.1 + acorn-jsx: 5.3.2(acorn@7.4.1) + eslint-visitor-keys: 1.3.0 + + espree@9.6.1: + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + espurify@2.1.1: {} + + esquery@1.4.0: + dependencies: + estraverse: 5.3.0 + + esquery@1.6.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + esutils@2.0.3: {} + + eventemitter2@6.4.9: {} + + events@3.3.0: {} + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.3 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + + fast-deep-equal@3.1.3: {} + + fast-diff@1.2.0: {} + + fast-glob@3.2.12: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fastq@1.13.0: + dependencies: + reusify: 1.0.4 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + + file-entry-cache@6.0.1: + dependencies: + flat-cache: 3.0.4 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-cache-dir@5.0.0: + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + + find-root@1.1.0: {} + + find-up-simple@1.0.0: {} + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-up@6.3.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + + flat-cache@3.0.4: + dependencies: + flatted: 3.2.7 + rimraf: 3.0.2 + + flatted@3.2.7: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + form-data@3.0.1: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + fs.realpath@1.0.0: {} + + function-bind@1.1.1: {} + + function-bind@1.1.2: {} + + function.prototype.name@1.1.5: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + functions-have-names: 1.2.3 + + function.prototype.name@1.1.7: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 + + functional-red-black-tree@1.0.1: {} + + functions-have-names@1.2.3: {} + + get-east-asian-width@1.3.0: {} + + get-intrinsic@1.1.3: + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + + get-intrinsic@1.2.6: + dependencies: + call-bind-apply-helpers: 1.0.1 + dunder-proto: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + function-bind: 1.1.2 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-set-props@0.1.0: {} + + get-stdin@9.0.0: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + + get-symbol-description@1.0.0: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + + get-symbol-description@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + + get-tsconfig@4.8.1: + dependencies: + resolve-pkg-maps: 1.0.0 + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@7.2.3: + 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 + + globals@13.17.0: + dependencies: + type-fest: 0.20.2 + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globals@15.14.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.2.0 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + + globby@14.0.2: + dependencies: + '@sindresorhus/merge-streams': 2.3.0 + fast-glob: 3.3.2 + ignore: 5.3.2 + path-type: 5.0.0 + slash: 5.1.0 + unicorn-magic: 0.1.0 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + graphemer@1.4.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.0: + dependencies: + get-intrinsic: 1.1.3 + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.1 + + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + + has-symbols@1.0.3: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.0: + dependencies: + has-symbols: 1.0.3 + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + has@1.0.3: + dependencies: + function-bind: 1.1.1 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hosted-git-info@2.8.9: {} + + human-signals@8.0.0: {} + + ignore@4.0.6: {} + + ignore@5.2.0: {} + + ignore@5.3.2: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-meta-resolve@4.1.0: {} + + import-modules@2.1.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + internal-slot@1.0.3: + dependencies: + get-intrinsic: 1.1.3 + has: 1.0.3 + side-channel: 1.0.4 + + internal-slot@1.1.0: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 + + interpret@1.4.0: {} + + irregular-plurals@3.5.0: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-array-buffer@3.0.5: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + + is-arrayish@0.2.1: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-bigint@1.1.0: + dependencies: + has-bigints: 1.0.2 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + is-boolean-object@1.2.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.11.0: + dependencies: + has: 1.0.3 + + is-core-module@2.16.0: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + is-typed-array: 1.1.15 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.0 + + is-date-object@1.1.0: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-docker@3.0.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.3 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-get-set-prop@1.0.0: + dependencies: + get-set-props: 0.1.0 + lowercase-keys: 1.0.1 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + + is-js-type@2.0.0: + dependencies: + js-types: 1.0.0 + + is-map@2.0.3: {} + + is-negated-glob@1.0.0: {} + + is-negative-zero@2.0.2: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.0 + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-obj-prop@1.0.0: + dependencies: + lowercase-keys: 1.0.1 + obj-props: 1.4.0 + + is-path-inside@3.0.3: {} + + is-plain-obj@4.1.0: {} + + is-proto-prop@2.0.0: + dependencies: + lowercase-keys: 1.0.1 + proto-props: 2.0.0 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.2 + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@4.0.1: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.0 + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.2 + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + + is-windows@1.0.2: {} + + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + jest-worker@27.5.1: + dependencies: + '@types/node': 16.18.3 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + js-tokens@4.0.0: {} + + js-types@1.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@0.5.0: {} + + jsesc@3.1.0: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-traverse@0.4.1: {} + + json-schema-traverse@1.0.0: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.1: + dependencies: + minimist: 1.2.7 + + json5@1.0.2: + dependencies: + minimist: 1.2.7 + + jsonwebtoken@8.5.1: + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.2 + semver: 5.7.1 + + jwa@1.4.1: + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + + jws@3.2.2: + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + line-column-path@3.0.0: + dependencies: + type-fest: 2.19.0 + + lines-and-columns@1.2.4: {} + + loader-runner@4.3.0: {} + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + locate-path@7.2.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.17.21: {} + + lodash.includes@4.3.0: {} + + lodash.isboolean@3.0.3: {} + + lodash.isinteger@4.0.4: {} + + lodash.isnumber@3.0.3: {} + + lodash.isplainobject@4.0.6: {} + + lodash.isstring@4.0.1: {} + + lodash.merge@4.6.2: {} + + lodash.once@4.1.1: {} + + lodash.truncate@4.4.2: {} + + lodash@4.17.21: {} + + log-symbols@6.0.0: + dependencies: + chalk: 5.4.0 + is-unicode-supported: 1.3.0 + + lowercase-keys@1.0.1: {} + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + math-intrinsics@1.1.0: {} + + memory-fs@0.2.0: {} + + meow@13.2.0: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micro-spelling-correcter@1.1.1: {} + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.7: {} + + moment@2.29.4: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + natural-compare@1.4.0: {} + + neo-async@2.6.2: {} + + node-fetch@2.6.7: + dependencies: + whatwg-url: 5.0.0 + + node-releases@2.0.19: {} + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + obj-props@1.4.0: {} + + object-inspect@1.12.2: {} + + object-inspect@1.13.3: {} + + object-keys@1.1.1: {} + + object.assign@4.1.4: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.assign@4.1.7: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + has-symbols: 1.1.0 + object-keys: 1.1.1 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.23.6 + + object.values@1.1.6: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + + object.values@1.2.1: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + obsidian@1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1): + dependencies: + '@codemirror/state': 6.1.2 + '@codemirror/view': 6.4.1 + '@types/codemirror': 5.60.8 + moment: 2.29.4 + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + open-editor@5.0.0: + dependencies: + env-editor: 1.1.0 + execa: 9.5.2 + line-column-path: 3.0.0 + open: 10.1.0 + + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + + optionator@0.9.1: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.3 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@4.0.0: + dependencies: + yocto-queue: 1.1.1 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-locate@6.0.0: + dependencies: + p-limit: 4.0.0 + + p-try@2.2.0: {} + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.12.11 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-ms@4.0.0: {} + + path-exists@4.0.0: {} + + path-exists@5.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-type@4.0.0: {} + + path-type@5.0.0: {} + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pkg-dir@5.0.0: + dependencies: + find-up: 5.0.0 + + pkg-dir@7.0.0: + dependencies: + find-up: 6.3.0 + + plur@5.1.0: + dependencies: + irregular-plurals: 3.5.0 + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + prelude-ls@1.2.1: {} + + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.2.0 + + prettier@2.7.1: {} + + prettier@3.4.2: {} + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + + progress@2.0.3: {} + + proto-props@2.0.0: {} + + punycode@2.1.1: {} + + queue-microtask@1.2.3: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + reflect.getprototypeof@1.0.9: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + dunder-proto: 1.0.1 + es-abstract: 1.23.6 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + which-builtin-type: 1.2.1 + + regenerator-runtime@0.13.10: {} + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.4.3: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + + regexp.prototype.flags@1.5.3: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regexpp@3.2.0: {} + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + require-from-string@2.0.2: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve@1.22.1: + dependencies: + is-core-module: 2.11.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@1.22.10: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.16.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + run-applescript@7.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + safe-array-concat@1.1.3: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + has-symbols: 1.1.0 + isarray: 2.0.5 + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.0: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + is-regex: 1.1.4 + + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-regex: 1.2.1 + + schema-utils@3.3.0: + dependencies: + '@types/json-schema': 7.0.11 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + schema-utils@4.3.0: + dependencies: + '@types/json-schema': 7.0.11 + ajv: 8.11.0 + ajv-formats: 2.1.1(ajv@8.11.0) + ajv-keywords: 5.1.0(ajv@8.11.0) + + semver@5.7.1: {} + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.3.8: + dependencies: + lru-cache: 6.0.0 + + semver@7.6.3: {} + + serialize-javascript@6.0.2: + dependencies: + randombytes: 2.1.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.6 + gopd: 1.2.0 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.6 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + + side-channel@1.0.4: + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.3 + object-inspect: 1.12.2 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + + signal-exit@4.1.0: {} + + slash@3.0.0: {} + + slash@5.1.0: {} + + slice-ansi@4.0.0: + dependencies: + ansi-styles: 4.3.0 + astral-regex: 2.0.0 + is-fullwidth-code-point: 3.0.0 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.20 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.20 + + spdx-license-ids@3.0.20: {} + + sprintf-js@1.0.3: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@7.2.0: + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + + string.prototype.trim@1.2.10: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.23.6 + es-object-atoms: 1.0.0 + has-property-descriptors: 1.0.2 + + string.prototype.trimend@1.0.6: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + + string.prototype.trimend@1.0.9: + dependencies: + call-bind: 1.0.8 + call-bound: 1.0.3 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.6: + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.4 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-bom@3.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + style-mod@4.1.2: {} + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-hyperlinks@3.1.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + + table@6.8.1: + dependencies: + ajv: 8.11.0 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + tapable@0.1.10: {} + + tapable@2.2.1: {} + + terser-webpack-plugin@5.3.11(esbuild@0.14.47)(webpack@5.97.1(esbuild@0.14.47)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.97.1(esbuild@0.14.47) + optionalDependencies: + esbuild: 0.14.47 + + terser@5.37.0: + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.14.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + text-table@0.2.0: {} + + to-absolute-glob@3.0.0: + dependencies: + is-absolute: 1.0.0 + is-negated-glob: 1.0.0 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + ts-api-utils@1.4.3(typescript@5.7.2): + dependencies: + typescript: 5.7.2 + + tsconfig-paths@3.14.1: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.1 + minimist: 1.2.7 + strip-bom: 3.0.0 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.7 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.4.0: {} + + tslib@2.8.1: {} + + tsutils@3.21.0(typescript@4.7.4): + dependencies: + tslib: 1.14.1 + typescript: 4.7.4 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-fest@0.20.2: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@2.19.0: {} + + typed-array-buffer@1.0.3: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + is-typed-array: 1.1.15 + + typed-array-byte-length@1.0.3: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + + typed-array-byte-offset@1.0.4: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.9 + + typed-array-length@1.0.7: + dependencies: + call-bind: 1.0.8 + for-each: 0.3.3 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.0.0 + reflect.getprototypeof: 1.0.9 + + typescript@4.7.4: {} + + typescript@5.7.2: {} + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unc-path-regex@0.1.2: {} + + unicorn-magic@0.1.0: {} + + unicorn-magic@0.3.0: {} + + update-browserslist-db@1.1.1(browserslist@4.24.3): + dependencies: + browserslist: 4.24.3 + escalade: 3.2.0 + picocolors: 1.1.1 + + uri-js@4.4.1: + dependencies: + punycode: 2.1.1 + + url-or-path@2.3.2: {} + + uuid@8.3.2: {} + + v8-compile-cache@2.3.0: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + w3c-keyname@2.2.8: {} + + watchpack@2.4.2: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + webidl-conversions@3.0.1: {} + + webpack-sources@3.2.3: {} + + webpack@5.97.1(esbuild@0.14.47): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + browserslist: 4.24.3 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.17.1 + es-module-lexer: 1.5.4 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(esbuild@0.14.47)(webpack@5.97.1(esbuild@0.14.47)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-boxed-primitive@1.1.1: + dependencies: + is-bigint: 1.1.0 + is-boolean-object: 1.2.1 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 + + which-builtin-type@1.2.1: + dependencies: + call-bound: 1.0.3 + function.prototype.name: 1.1.7 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.0.10 + is-regex: 1.2.1 + is-weakref: 1.1.0 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.18 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.18: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.3 + for-each: 0.3.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + word-wrap@1.2.3: {} + + word-wrap@1.2.5: {} + + wrappy@1.0.2: {} + + xo@0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.47)): + dependencies: + '@eslint/eslintrc': 3.2.0 + '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + arrify: 3.0.0 + cosmiconfig: 9.0.0(typescript@5.7.2) + define-lazy-prop: 3.0.0 + eslint: 8.57.1 + eslint-config-prettier: 9.1.0(eslint@8.57.1) + eslint-config-xo: 0.45.0(eslint@8.57.1) + eslint-config-xo-typescript: 5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) + eslint-formatter-pretty: 6.0.1 + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)) + eslint-plugin-ava: 14.0.0(eslint@8.57.1) + eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) + eslint-plugin-n: 17.15.0(eslint@8.57.1) + eslint-plugin-no-use-extend-native: 0.5.0 + eslint-plugin-prettier: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) + eslint-plugin-promise: 6.6.0(eslint@8.57.1) + eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) + esm-utils: 4.3.0 + find-cache-dir: 5.0.0 + find-up-simple: 1.0.0 + get-stdin: 9.0.0 + get-tsconfig: 4.8.1 + globby: 14.0.2 + imurmurhash: 0.1.4 + json-stable-stringify-without-jsonify: 1.0.1 + lodash-es: 4.17.21 + meow: 13.2.0 + micromatch: 4.0.8 + open-editor: 5.0.0 + prettier: 3.4.2 + semver: 7.6.3 + slash: 5.1.0 + to-absolute-glob: 3.0.0 + typescript: 5.7.2 + optionalDependencies: + webpack: 5.97.1(esbuild@0.14.47) + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - supports-color + + yallist@4.0.0: {} + + yocto-queue@0.1.0: {} + + yocto-queue@1.1.1: {} + + yoctocolors@2.1.1: {} diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts new file mode 100644 index 0000000..7ffb881 --- /dev/null +++ b/src/api/microsoftClientProvider.ts @@ -0,0 +1,103 @@ +import type * as msalCommon from '@azure/msal-common'; +import * as msal from '@azure/msal-node'; +import {Client} from '@microsoft/microsoft-graph-client'; +import {type App, type DataAdapter, Notice} from 'obsidian'; +import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; +import {t} from 'src/lib/lang'; + +export class MicrosoftClientProvider { + private get clientId() { + return 'a1172059-5f55-45cd-9665-8dccc98c2587'; + } + + private get authority() { + return 'https://login.microsoftonline.com/consumers'; + } + + private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; + private readonly pca: msal.PublicClientApplication; + private readonly adapter: DataAdapter; + private readonly cachePath: string; + + constructor(app: App) { + this.adapter = app.vault.adapter; + this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; + + const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { + if (await this.adapter.exists(this.cachePath)) { + cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); + } + }; + + const afterCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { + if (cacheContext.cacheHasChanged) { + await this.adapter.write(this.cachePath, cacheContext.tokenCache.serialize()); + } + }; + + const cachePlugin = { + beforeCacheAccess, + afterCacheAccess, + }; + const config = { + auth: { + clientId: this.clientId, + authority: this.authority, + }, + cache: { + cachePlugin, + }, + }; + this.pca = new msal.PublicClientApplication(config); + } + + public async getClient() { + const authProvider = async (callback: (argument0: string, argument1: string) => void) => { + const accessToken = await this.getAccessToken(); + const error = ' '; + callback(error, accessToken); + }; + + return Client.init({ + authProvider, + }); + } + + private async getAccessToken() { + const msalCacheManager = this.pca.getTokenCache(); + if (await this.adapter.exists(this.cachePath)) { + msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); + } + + const accounts = await msalCacheManager.getAllAccounts(); + if (accounts.length === 0) { + return this.authByDevice(); + } + + return this.authByCache(accounts[0]); + } + + private async authByDevice(): Promise { + const deviceCodeRequest = { + async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { + const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); + await navigator.clipboard.writeText(response.userCode); + new MicrosoftAuthModal(response.userCode, response.verificationUri).open(); + console.log(t('Notice_DeviceCodeCopiedToClipboard'), response.userCode); + }, + scopes: this.scopes, + }; + return this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then(request => request === null ? 'error' : request.accessToken); + } + + private async authByCache(account: msal.AccountInfo): Promise { + const silentRequest = { + account, + scopes: this.scopes, + }; + return this.pca + .acquireTokenSilent(silentRequest) + .then(request => request === null ? 'error' : request.accessToken) + .catch(async () => this.authByDevice()); + } +} diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 9e0f788..73c4609 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,172 +1,111 @@ -import * as msal from '@azure/msal-node'; -import * as msalCommon from '@azure/msal-common'; -import { Client } from '@microsoft/microsoft-graph-client'; -import { TodoTask, TodoTaskList } from '@microsoft/microsoft-graph-types'; -import { DataAdapter, Notice } from 'obsidian'; -import { MicrosoftAuthModal } from '../gui/microsoftAuthModal'; -import { t } from '../lib/lang'; +import {type Client} from '@microsoft/microsoft-graph-client'; +import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; +import {type App, Notice} from 'obsidian'; +import {t} from '../lib/lang.js'; +import {log, logging} from '../lib/logging.js'; +import {MicrosoftClientProvider} from './microsoftClientProvider.js'; export class TodoApi { - private client: Client; - constructor() { - new MicrosoftClientProvider().getClient().then((client) => (this.client = client)); - } - // List operation - async getLists(searchPattern?: string): Promise { - const endpoint = '/me/todo/lists'; - const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; - return await Promise.all( - todoLists.map(async (taskList) => { - const containedTasks = await this.getListTasks(taskList.id, searchPattern); - return { - ...taskList, - tasks: containedTasks, - }; - }), - ); - } - async getListIdByName(listName: string | undefined): Promise { - if (!listName) return; - const endpoint = '/me/todo/lists'; - const res: TodoTaskList[] = ( - await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get() - ).value; - if (!res || res.length == 0) return; - const target = res[0] as TodoTaskList; - return target.id; - } - async getList(listId: string | undefined): Promise { - if (!listId) return; - const endpoint = `/me/todo/lists/${listId}`; - return (await this.client.api(endpoint).get()) as TodoTaskList; - } - async createTaskList(displayName: string | undefined): Promise { - if (!displayName) return; - return await this.client.api('/me/todo/lists').post({ - displayName, - }); - } - - // Task operation - async getListTasks(listId: string | undefined, searchText?: string): Promise { - if (!listId) return; - const endpoint = `/me/todo/lists/${listId}/tasks`; - if (!searchText) return; - const res = await this.client - .api(endpoint) - .filter(searchText) - .get() - .catch((err) => { - new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); - return; - }); - if (!res) return; - return res.value as TodoTask[]; - } - async getTask(listId: string, taskId: string): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return (await this.client.api(endpoint).get()) as TodoTask; - } - - async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks`; - return await this.client.api(endpoint).post(toDo); - } - - async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return await this.client.api(endpoint).patch(toDo); - } -} + private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); + + private client: Client; + + constructor(app: App) { + new MicrosoftClientProvider(app).getClient().then(client => { + this.client = client; + }).catch(() => { + const notice = new Notice(t('Notice_UnableToAcquireClient')); + }); + } + + // List operation + async getLists(searchPattern?: string): Promise { + const endpoint = '/me/todo/lists'; + const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; + return Promise.all( + todoLists.map(async taskList => { + const containedTasks = await this.getListTasks(taskList.id, searchPattern); + return { + ...taskList, + tasks: containedTasks, + }; + }), + ); + } + + async getListIdByName(listName: string | undefined): Promise { + if (!listName) { + return; + } + + const endpoint = '/me/todo/lists'; + const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); // eslint-disable-line @typescript-eslint/no-unsafe-assignment + const resource: TodoTaskList[] = response.value as TodoTaskList[]; + if (!resource || resource.length === 0) { + return; + } + + const target = resource[0]; + return target.id; + } + + async getList(listId: string | undefined): Promise { + if (!listId) { + return; + } + + const endpoint = `/me/todo/lists/${listId}`; + return (await this.client.api(endpoint).get()) as TodoTaskList; + } + + async createTaskList(displayName: string | undefined): Promise { + if (!displayName) { + return; + } + + return this.client.api('/me/todo/lists').post({ + displayName, + }); + } + + // Task operation + async getListTasks(listId: string | undefined, searchText?: string): Promise { + if (!listId) { + return; + } + + const endpoint = `/me/todo/lists/${listId}/tasks`; + if (!searchText) { + return; + } + + const res = await this.client + .api(endpoint) + .filter(searchText) + .get() + .catch(error => { + new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); + }); + if (!res) { + return; + } + + return res.value as TodoTask[]; + } + + async getTask(listId: string, taskId: string): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + return (await this.client.api(endpoint).get()) as TodoTask; + } + + async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks`; + this.logger.debug('Creating task from endpoint', endpoint); + return this.client.api(endpoint).post(toDo); + } -export class MicrosoftClientProvider { - private readonly clientId = 'a1172059-5f55-45cd-9665-8dccc98c2587'; - private readonly authority = 'https://login.microsoftonline.com/consumers'; - private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; - private readonly pca: msal.PublicClientApplication; - private readonly adapter: DataAdapter; - private readonly cachePath: string; - - constructor() { - this.adapter = app.vault.adapter; - this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; - - const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { - if (await this.adapter.exists(this.cachePath)) { - cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); - } - }; - const afterCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { - if (cacheContext.cacheHasChanged) { - await this.adapter.write(this.cachePath, cacheContext.tokenCache.serialize()); - } - }; - const cachePlugin = { - beforeCacheAccess, - afterCacheAccess, - }; - const config = { - auth: { - clientId: this.clientId, - authority: this.authority, - }, - cache: { - cachePlugin, - }, - }; - this.pca = new msal.PublicClientApplication(config); - } - - private async getAccessToken() { - const msalCacheManager = this.pca.getTokenCache(); - if (await this.adapter.exists(this.cachePath)) { - msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); - } - const accounts = await msalCacheManager.getAllAccounts(); - if (accounts.length == 0) { - return await this.authByDevice(); - } else { - return await this.authByCache(accounts[0]); - } - } - private async authByDevice(): Promise { - const deviceCodeRequest = { - deviceCodeCallback: (response: msalCommon.DeviceCodeResponse) => { - new Notice(t('Notice_DeviceCodeOnClipboard')); - navigator.clipboard.writeText(response['userCode']); - new MicrosoftAuthModal(response['userCode'], response['verificationUri']).open(); - console.log(t('Notice_DeviceCodeCopiedToClipboard'), response['userCode']); - }, - scopes: this.scopes, - }; - return await this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then((res) => { - return res == null ? 'error' : res['accessToken']; - }); - } - - private async authByCache(account: msal.AccountInfo): Promise { - const silentRequest = { - account: account, - scopes: this.scopes, - }; - return await this.pca - .acquireTokenSilent(silentRequest) - .then((res) => { - return res == null ? 'error' : res['accessToken']; - }) - .catch(async (err) => { - return await this.authByDevice(); - }); - } - - public async getClient() { - const authProvider = async (callback: (arg0: string, arg1: string) => void) => { - const accessToken = await this.getAccessToken(); - const error = ' '; - callback(error, accessToken); - }; - return Client.init({ - authProvider, - }); - } + async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + return this.client.api(endpoint).patch(toDo); + } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 462a694..8178d3a 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,164 +1,172 @@ -import { Editor, EditorPosition, Notice } from 'obsidian'; -import { ObsidianTodoTask } from 'src/model/ObsidianTodoTask'; -import MsTodoSync from '../main'; -import { TodoApi } from '../api/todoApi'; -import { MsTodoSyncSettings } from '../gui/msTodoSyncSettingTab'; -import { t } from './../lib/lang'; -import { log, logging } from './../lib/logging'; +import {type Editor, type EditorPosition, Notice} from 'obsidian'; +import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask'; +import type MsTodoSync from '../main.js'; +import {type TodoApi} from '../api/todoApi.js'; +import {type MsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; +import {t} from '../lib/lang.js'; +import {log, logging} from '../lib/logging.js'; export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { - const regex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; - const blocklistMatch = regex.exec(line.trim()); - if (blocklistMatch) { - const blocklink = blocklistMatch[1]; - const taskId = plugin.settings.taskIdLookup[blocklink]; - console.log(taskId); - return taskId; - } - return ''; -} -interface Selection { - start: EditorPosition; - end?: EditorPosition; - lines: number[]; + const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; + const blocklistMatch = regex.exec(line.trim()); + if (blocklistMatch) { + const blocklink = blocklistMatch[1]; + const taskId = plugin.settings.taskIdLookup[blocklink]; + console.log(taskId); + return taskId; + } + + return ''; } +type Selection = { + start: EditorPosition; + end?: EditorPosition; + lines: number[]; +}; + export async function getCurrentLinesFromEditor(editor: Editor): Promise { - log( - 'info', - `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( - 'anchor', - )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, - ); - - // const activeFile = this.app.workspace.getActiveFile(); - // const source = await this.app.vault.read(activeFile); - - let start: EditorPosition; - let end: EditorPosition; - //let lines: string[] = []; - let lines: number[] = []; - if (editor.somethingSelected()) { - start = editor.getCursor('from'); - end = editor.getCursor('to'); - //lines = source.split('\n').slice(start.line, end.line + 1); - lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); - } else { - start = editor.getCursor(); - end = editor.getCursor(); - //lines = source.split('\n').slice(start.line, end.line + 1); - lines.push(start.line); - } - - return { - start, - end, - lines, - }; + log( + 'info', + `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( + 'anchor', + )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + ); + + // Const activeFile = this.app.workspace.getActiveFile(); + // const source = await this.app.vault.read(activeFile); + + let start: EditorPosition; + let end: EditorPosition; + // Let lines: string[] = []; + let lines: number[] = []; + if (editor.somethingSelected()) { + start = editor.getCursor('from'); + end = editor.getCursor('to'); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines = Array.from({length: end.line + 1 - start.line}, (v, k) => k + start.line); + } else { + start = editor.getCursor(); + end = editor.getCursor(); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines.push(start.line); + } + + return { + start, + end, + lines, + }; } export async function postTask( - todoApi: TodoApi, - listId: string | undefined, - editor: Editor, - fileName: string | undefined, - plugin: MsTodoSync, - replace?: boolean, + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, + replace?: boolean, ) { - const logger = logging.getLogger('mstodo-sync.command.post'); - - // if (!editor.somethingSelected()) { - // new Notice(t('CommandNotice_NothingSelected')); - // return; - // } - if (!listId) { - new Notice(t('CommandNotice_SetListName')); - return; - } - new Notice(t('CommandNotice_CreatingToDo'), 3000); - // const formatted = editor - // .getSelection() - // .replace(/\*|^> |^#* |- /gm, '') - // // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .split('\n') - // .filter((s) => s != ''); - const activeFile = this.app.workspace.getActiveFile(); - const source = await this.app.vault.read(activeFile); - const lines = (await getCurrentLinesFromEditor(editor)).lines; - - const split = source.split('\n'); - const modifiedPage = await Promise.all( - split.map(async (line: string, index: number) => { - if (!lines.includes(index)) return line; - const todo = new ObsidianTodoTask(plugin, line, fileName ?? ''); - - // If there is a block link in the line, we will try to find - // the task id from the block link and update the task instead. - if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`); - - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask.id}`); - } else { - logger.debug(`Creating Task: ${todo.title}`); - - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); - - todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id ?? ''); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - } - - if (replace) { - return todo.getMarkdownTask(true); - } - return line; - }), - ); - - await this.app.vault.modify(activeFile, modifiedPage.join('\n')); - - //return split.join('\n'); - - // log('debug', formatted.join(' :: ')); - // Promise.all( - // formatted.map(async (s) => { - // const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); - - // // If there is a block link in the line, we will try to find - // // the task id from the block link and update the task instead. - // if (todo.hasBlockLink && todo.id) { - // logger.debug(`Updating Task: ${todo.title}`); - - // const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - // logger.debug(`updated: ${returnedTask.id}`); - // } else { - // logger.debug(`Creating Task: ${todo.title}`); - - // const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); - - // todo.status = returnedTask.status; - // todo.cacheTaskId(returnedTask.id ?? ''); - // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - // } - - // return todo; - // }), - // ).then((res) => { - // new Notice('创建待办成功√'); - // if (replace) { - // editor.replaceSelection( - // res - // .map((i) => { - // logger.debug('Processed blockLink', i.blockLink); - // return i.getMarkdownTask(); - // }) - // .join('\n'), - // ); - // } - // }); + const logger = logging.getLogger('mstodo-sync.command.post'); + + // If (!editor.somethingSelected()) { + // new Notice(t('CommandNotice_NothingSelected')); + // return; + // } + if (!listId) { + new Notice(t('CommandNotice_SetListName')); + return; + } + + new Notice(t('CommandNotice_CreatingToDo'), 3000); + // Const formatted = editor + // .getSelection() + // .replace(/\*|^> |^#* |- /gm, '') + // // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .split('\n') + // .filter((s) => s != ''); + const activeFile = this.app.workspace.getActiveFile(); + const source = await this.app.vault.read(activeFile); + const {lines} = await getCurrentLinesFromEditor(editor); + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + if (!lines.includes(index)) { + return line; + } + + const todo = new ObsidianTodoTask(plugin, line, fileName ?? ''); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`); + + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } else { + logger.debug(`Creating Task: ${todo.title}`); + logger.debug(`Creating Task: ${listId}`); + + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + todo.status = returnedTask.status; + todo.cacheTaskId(returnedTask.id ?? ''); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + if (replace) { + return todo.getMarkdownTask(true); + } + + return line; + }), + ); + + await this.app.vault.modify(activeFile, modifiedPage.join('\n')); + + // Return split.join('\n'); + + // log('debug', formatted.join(' :: ')); + // Promise.all( + // formatted.map(async (s) => { + // const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); + + // // If there is a block link in the line, we will try to find + // // the task id from the block link and update the task instead. + // if (todo.hasBlockLink && todo.id) { + // logger.debug(`Updating Task: ${todo.title}`); + + // const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + // logger.debug(`updated: ${returnedTask.id}`); + // } else { + // logger.debug(`Creating Task: ${todo.title}`); + + // const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + // todo.status = returnedTask.status; + // todo.cacheTaskId(returnedTask.id ?? ''); + // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + // } + + // return todo; + // }), + // ).then((res) => { + // new Notice('创建待办成功√'); + // if (replace) { + // editor.replaceSelection( + // res + // .map((i) => { + // logger.debug('Processed blockLink', i.blockLink); + // return i.getMarkdownTask(); + // }) + // .join('\n'), + // ); + // } + // }); } // Experimental @@ -178,150 +186,159 @@ export async function postTask( // TODO: // Allow variable depth or match column of first [ export async function postTaskAndChildren( - todoApi: TodoApi, - listId: string | undefined, - editor: Editor, - fileName: string | undefined, - plugin: MsTodoSync, - push = true, + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, + push = true, ) { - const logger = logging.getLogger('mstodo-sync.command.post'); - - if (!listId) { - new Notice(t('CommandNotice_SetListName')); - return; - } - new Notice(t('CommandNotice_CreatingToDo'), 3000); - - const cursorLocation = editor.getCursor(); - const topLevelTask = editor.getLine(cursorLocation.line); - logger.debug(`topLevelTask: ${topLevelTask}`); - // logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); - - let body = ''; - const childTasks: string[] = []; - - // Get all lines including the line the cursor is on. - const lines = editor.getValue().split('\n').slice(cursorLocation.line); - // logger.debug(`editor: ${cursorLocation}`, lines); - - // Find the end of section which a blank line or a line that is not indented by two spaces. - const endLine = lines.findIndex( - //(line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, - (line, index) => line.length == 0 && index > 0, - ); - logger.debug(`endLine: ${endLine}`); - - // Scan lines below task for sub tasks and body. - lines.slice(1, endLine).forEach((line, index) => { - // logger.debug(`processing line: ${index} -- ${line}`); - - if (line.startsWith(' - [')) { - childTasks.push(line.trim()); - } else { - // remove the two spaces at the beginning of the line, will be added back on sync. - // on sync the body will be indented by two spaces and the tasks will be appended at this point. - body += line.trim() + '\n'; - } - }); - logger.debug(`body: ${body}`); - logger.debug(`childTasks: ${childTasks}`, childTasks); - - const todo = new ObsidianTodoTask(plugin, topLevelTask, fileName ?? ''); - todo.setBody(body); - childTasks.forEach((childTask) => { - todo.addChecklistItem(childTask); - }); - - logger.debug(`updated: ${todo.title}`, todo); - - if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`, todo.getTodoTask()); - - //const currentTaskState = await todoApi.getTask(listId, todo.id); - let returnedTask; - if (push) { - returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - // TODO Push the checklist items... - todo.checklistItems = returnedTask.checklistItems; - todo.status = returnedTask.status; - todo.body = returnedTask.body; - } else { - returnedTask = await todoApi.getTask(listId, todo.id); - if (returnedTask) { - todo.checklistItems = returnedTask.checklistItems; - todo.status = returnedTask.status; - todo.body = returnedTask.body; - } - } - - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask?.id}`, returnedTask); - } else { - logger.debug(`Creating Task: ${todo.title}`); - - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask(true)); - - todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id ?? ''); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - } - - // Update the task on the page. - const start = getLineStartPos(cursorLocation.line); - const end = getLineEndPos(cursorLocation.line + endLine, editor); - - editor.replaceRange(todo.getMarkdownTask(false), start, end); + const logger = logging.getLogger('mstodo-sync.command.post'); + + if (!listId) { + new Notice(t('CommandNotice_SetListName')); + return; + } + + new Notice(t('CommandNotice_CreatingToDo'), 3000); + + const cursorLocation = editor.getCursor(); + const topLevelTask = editor.getLine(cursorLocation.line); + logger.debug(`topLevelTask: ${topLevelTask}`); + // Logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); + + let body = ''; + const childTasks: string[] = []; + + // Get all lines including the line the cursor is on. + const lines = editor.getValue().split('\n').slice(cursorLocation.line); + // Logger.debug(`editor: ${cursorLocation}`, lines); + + // Find the end of section which a blank line or a line that is not indented by two spaces. + const endLine = lines.findIndex( + // (line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, + (line, index) => line.length === 0 && index > 0, + ); + logger.debug(`endLine: ${endLine}`); + + // Scan lines below task for sub tasks and body. + for (const [index, line] of lines.slice(1, endLine).entries()) { + // Logger.debug(`processing line: ${index} -- ${line}`); + + if (line.startsWith(' - [')) { + childTasks.push(line.trim()); + } else { + // Remove the two spaces at the beginning of the line, will be added back on sync. + // on sync the body will be indented by two spaces and the tasks will be appended at this point. + body += line.trim() + '\n'; + } + } + + logger.debug(`body: ${body}`); + logger.debug(`childTasks: ${childTasks}`, childTasks); + + const todo = new ObsidianTodoTask(plugin, topLevelTask, fileName ?? ''); + todo.setBody(body); + for (const childTask of childTasks) { + todo.addChecklistItem(childTask); + } + + logger.debug(`updated: ${todo.title}`, todo); + + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`, todo.getTodoTask()); + + // Const currentTaskState = await todoApi.getTask(listId, todo.id); + let returnedTask; + if (push) { + returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + // TODO Push the checklist items... + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } else { + returnedTask = await todoApi.getTask(listId, todo.id); + if (returnedTask) { + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } + } + + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask?.id}`, returnedTask); + } else { + logger.debug(`Creating Task: ${todo.title}`); + + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask(true)); + + todo.status = returnedTask.status; + todo.cacheTaskId(returnedTask.id ?? ''); + logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + // Update the task on the page. + const start = getLineStartPos(cursorLocation.line); + const end = getLineEndPos(cursorLocation.line + endLine, editor); + + editor.replaceRange(todo.getMarkdownTask(false), start, end); } function getLineStartPos(line: number): EditorPosition { - return { - line, - ch: 0, - }; + return { + line, + ch: 0, + }; } function getLineEndPos(line: number, editor: Editor): EditorPosition { - return { - line, - ch: editor.getLine(line).length, - }; + return { + line, + ch: editor.getLine(line).length, + }; } export async function createTodayTasks(todoApi: TodoApi, settings: MsTodoSyncSettings, editor?: Editor) { - new Notice('获取微软待办中', 3000); - const now = window.moment(); - const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; - const taskLists = await todoApi.getLists(pattern); - if (!taskLists || taskLists.length == 0) { - new Notice('任务列表为空'); - return; - } - const segments = taskLists - .map((taskList) => { - if (!taskList.tasks || taskList.tasks.length == 0) return; - taskList.tasks.sort((a, b) => (a.status == 'completed' ? 1 : -1)); - const lines = taskList.tasks?.map((task) => { - const formattedCreateDate = window - .moment(task.createdDateTime) - .format(settings.displayOptions_DateFormat); - const done = task.status == 'completed' ? 'x' : ' '; - const createDate = - formattedCreateDate == now.format(settings.displayOptions_DateFormat) - ? '' - : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; - const body = !task.body?.content ? '' : `${settings.displayOptions_TaskBodyPrefix}${task.body.content}`; - - return `- [${done}] ${task.title} ${createDate} ${body}`; - }); - return `**${taskList.displayName}** + new Notice('获取微软待办中', 3000); + const now = globalThis.moment(); + const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; + const taskLists = await todoApi.getLists(pattern); + if (!taskLists || taskLists.length === 0) { + new Notice('任务列表为空'); + return; + } + + const segments = taskLists + .map(taskList => { + if (!taskList.tasks || taskList.tasks.length === 0) { + return; + } + + taskList.tasks.sort((a, b) => (a.status == 'completed' ? 1 : -1)); + const lines = taskList.tasks?.map(task => { + const formattedCreateDate = globalThis + .moment(task.createdDateTime) + .format(settings.displayOptions_DateFormat); + const done = task.status == 'completed' ? 'x' : ' '; + const createDate + = formattedCreateDate == now.format(settings.displayOptions_DateFormat) + ? '' + : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; + const body = task.body?.content ? `${settings.displayOptions_TaskBodyPrefix}${task.body.content}` : ''; + + return `- [${done}] ${task.title} ${createDate} ${body}`; + }); + return `**${taskList.displayName}** ${lines?.join('\n')} `; - }) - .filter((s) => s != undefined) - .join('\n\n'); - - new Notice('待办列表已获取'); - if (editor) editor.replaceSelection(segments); - else return segments; + }) + .filter(s => s != undefined) + .join('\n\n'); + + new Notice('待办列表已获取'); + if (editor) { + editor.replaceSelection(segments); + } else { + return segments; + } } diff --git a/src/gui/microsoftAuthModal.ts b/src/gui/microsoftAuthModal.ts index 1d0f9bc..7a18fb3 100644 --- a/src/gui/microsoftAuthModal.ts +++ b/src/gui/microsoftAuthModal.ts @@ -1,26 +1,28 @@ -import { Modal } from 'obsidian'; -import { t } from './../lib/lang'; +import {Modal} from 'obsidian'; +import {t} from '../lib/lang.js'; export class MicrosoftAuthModal extends Modal { - constructor(private readonly deviceCode: string, private readonly authUrl: string) { - super(app); - } - onOpen(): void { - const { contentEl } = this; + constructor(private readonly deviceCode: string, private readonly authUrl: string) { + super(app); + } - contentEl.empty(); - contentEl.addClass('auth-modal'); + onOpen(): void { + const {contentEl} = this; - contentEl.createEl('h2', { text: t('Auth_Heading_VerificationRequiredForFirstUse') }); - // contentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) - contentEl.createEl('h4', { text: this.deviceCode }); - // contentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) - contentEl.createEl('div', { text: t('Auth_Text_CodeCopiedClipboard') }); - contentEl.createEl('a', { text: this.authUrl, href: this.authUrl }); - contentEl.createEl('hr'); - } - onClose(): void { - const { contentEl } = this; - contentEl.empty(); - } + contentEl.empty(); + contentEl.addClass('auth-modal'); + + contentEl.createEl('h2', {text: t('Auth_Heading_VerificationRequiredForFirstUse')}); + // ContentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) + contentEl.createEl('h4', {text: this.deviceCode}); + // ContentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) + contentEl.createEl('div', {text: t('Auth_Text_CodeCopiedClipboard')}); + contentEl.createEl('a', {text: this.authUrl, href: this.authUrl}); + contentEl.createEl('hr'); + } + + onClose(): void { + const {contentEl} = this; + contentEl.empty(); + } } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 356c194..c02c8c5 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,103 +1,103 @@ -import { Notice, PluginSettingTab, Setting } from 'obsidian'; -import MsTodoSync from '../main'; -import { t } from './../lib/lang'; -import { LogOptions } from './../lib/logging'; - -export interface MsTodoSyncSettings { - todoListSync: { - listName: string | undefined; - listId: string | undefined; - }; - - diary: { - folder: string; - format: string; - stayWithPN: boolean; - }; - - displayOptions_DateFormat: string; - displayOptions_TimeFormat: string; - displayOptions_TaskCreatedPrefix: string; - displayOptions_TaskDuePrefix: string; - displayOptions_TaskStartPrefix: string; - displayOptions_TaskBodyPrefix: string; - displayOptions_ReplaceAddCreatedAt: boolean; - displayOptions_ReplacementFormat: string; - - // importance - // The importance of the task. Possible values - // are: low, normal, high. - // By default it is normal and the absence of a - // indicator will also mean normal. - displayOptions_TaskImportance_Low: string; - displayOptions_TaskImportance_Normal: string; - displayOptions_TaskImportance_High: string; - - displayOptions_TaskStatus_NotStarted: string; - displayOptions_TaskStatus_InProgress: string; - displayOptions_TaskStatus_Completed: string; - - // Microsoft To Do open handler. - todo_OpenUsingApplicationProtocol: boolean; - - // Logging options. - loggingOptions: LogOptions; - - // Private configuration updated by the plugin and not user. - taskIdLookup: { [key: string]: string }; - taskIdIndex: number; -} +import {Notice, PluginSettingTab, Setting} from 'obsidian'; +import type MsTodoSync from '../main.js'; +import {t} from '../lib/lang.js'; +import {type LogOptions} from '../lib/logging.js'; + +export type MsTodoSyncSettings = { + todoListSync: { + listName: string | undefined; + listId: string | undefined; + }; + + diary: { + folder: string; + format: string; + stayWithPN: boolean; + }; + + displayOptions_DateFormat: string; + displayOptions_TimeFormat: string; + displayOptions_TaskCreatedPrefix: string; + displayOptions_TaskDuePrefix: string; + displayOptions_TaskStartPrefix: string; + displayOptions_TaskBodyPrefix: string; + displayOptions_ReplaceAddCreatedAt: boolean; + displayOptions_ReplacementFormat: string; + + // Importance + // The importance of the task. Possible values + // are: low, normal, high. + // By default it is normal and the absence of a + // indicator will also mean normal. + displayOptions_TaskImportance_Low: string; + displayOptions_TaskImportance_Normal: string; + displayOptions_TaskImportance_High: string; + + displayOptions_TaskStatus_NotStarted: string; + displayOptions_TaskStatus_InProgress: string; + displayOptions_TaskStatus_Completed: string; + + // Microsoft To Do open handler. + todo_OpenUsingApplicationProtocol: boolean; + + // Logging options. + loggingOptions: LogOptions; + + // Private configuration updated by the plugin and not user. + taskIdLookup: Record; + taskIdIndex: number; +}; export const DEFAULT_SETTINGS: MsTodoSyncSettings = { - todoListSync: { - listName: undefined, - listId: undefined, - }, - diary: { - folder: '', - format: '', - stayWithPN: false, - }, - displayOptions_DateFormat: 'YYYY-MM-DD', - displayOptions_TimeFormat: 'HH:mm', - displayOptions_TaskCreatedPrefix: '🔎', - displayOptions_TaskDuePrefix: '📅', - displayOptions_TaskStartPrefix: '🛫', - displayOptions_TaskBodyPrefix: '💡', - displayOptions_ReplaceAddCreatedAt: false, - displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', - - displayOptions_TaskImportance_Low: '🔽', - displayOptions_TaskImportance_Normal: '🔼', - displayOptions_TaskImportance_High: '⏫', - - displayOptions_TaskStatus_NotStarted: ' ', - displayOptions_TaskStatus_InProgress: '/', - displayOptions_TaskStatus_Completed: 'x', - - todo_OpenUsingApplicationProtocol: true, - - loggingOptions: { - minLevels: { - '': 'debug', - 'mstodo-sync': 'debug', - }, - }, - taskIdLookup: { ['0000ABCD']: '0' }, - taskIdIndex: 0, + todoListSync: { + listName: undefined, + listId: undefined, + }, + diary: { + folder: '', + format: '', + stayWithPN: false, + }, + displayOptions_DateFormat: 'YYYY-MM-DD', + displayOptions_TimeFormat: 'HH:mm', + displayOptions_TaskCreatedPrefix: '🔎', + displayOptions_TaskDuePrefix: '📅', + displayOptions_TaskStartPrefix: '🛫', + displayOptions_TaskBodyPrefix: '💡', + displayOptions_ReplaceAddCreatedAt: false, + displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', + + displayOptions_TaskImportance_Low: '🔽', + displayOptions_TaskImportance_Normal: '🔼', + displayOptions_TaskImportance_High: '⏫', + + displayOptions_TaskStatus_NotStarted: ' ', + displayOptions_TaskStatus_InProgress: '/', + displayOptions_TaskStatus_Completed: 'x', + + todo_OpenUsingApplicationProtocol: true, + + loggingOptions: { + minLevels: { + '': 'debug', + 'mstodo-sync': 'debug', + }, + }, + taskIdLookup: {'0000ABCD': '0'}, + taskIdIndex: 0, }; export class MsTodoSyncSettingTab extends PluginSettingTab { - plugin: MsTodoSync; - settings: MsTodoSyncSettings; + plugin: MsTodoSync; + settings: MsTodoSyncSettings; - constructor(plugin: MsTodoSync) { - super(app, plugin); - this.plugin = plugin; - this.settings = plugin.settings; - } + constructor(plugin: MsTodoSync) { + super(app, plugin); + this.plugin = plugin; + this.settings = plugin.settings; + } - /** + /** * Creates a setting entry in the settings form * for text based properties. If there is a update * it will save the new value. @@ -109,249 +109,249 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { * @param {(value: string) => any} changeCallback * @memberof MsTodoSyncSettingTab */ - addTextSetting( - containerEl: HTMLElement, - title: string, - description: string, - currentValue: string, - changeCallback: (value: string) => any, - ): void { - new Setting(containerEl) - .setName(t(title)) - .setDesc(t(description)) - .addText((text) => - text.setValue(currentValue).onChange(async (value) => { - changeCallback(value); - await this.plugin.saveSettings(); - }), - ); - } - - display(): void { - const { containerEl } = this; - - containerEl.empty(); - - containerEl.createEl('h2', { - text: `${this.plugin.manifest.name}`, - }); - const span = containerEl.createSpan(); - span.style.fontSize = '0.8em'; - span.innerHTML = `Version ${this.plugin.manifest.version}
${this.plugin.manifest.description} created by ${this.plugin.manifest.author}`; - - new Setting(containerEl) - .setName(t('Settings_Todo_DefaultListName')) - .setDesc(t('Settings_Todo_DefaultListNameDescription')) - .addText((text) => - text - // .setPlaceholder('输入Todo列表名称') - .setValue(this.settings.todoListSync.listName ?? '') - .onChange(async (value) => { - this.settings.todoListSync.listName = value; - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_OpenUsingApplicationProtocolTitle')) - .setDesc(t('Settings_Todo_OpenUsingApplicationProtocolDescription')) - .addToggle((toggle) => - toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async (value) => { - this.settings.todo_OpenUsingApplicationProtocol = value; - await this.plugin.saveSettings(); - }), - ); - - // Formatting Options that user can set - containerEl.createEl('h2', { - text: t('Settings_Todo_Display_Heading'), - }); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_DateFormat')) - .setDesc(t('Settings_Todo_Display_DateFormatDescription')) - .addText((text) => - text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async (value) => { - this.settings.displayOptions_DateFormat = value; - await this.plugin.saveSettings(); - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_TimeFormat')) - .setDesc(t('Settings_Todo_Display_TimeFormatDescription')) - .addText((text) => - text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async (value) => { - this.settings.displayOptions_TimeFormat = value; - await this.plugin.saveSettings(); - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) - .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) - .addToggle((toggle) => - toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async (value) => { - this.settings.displayOptions_ReplaceAddCreatedAt = value; - await this.plugin.saveSettings(); - }), - ); - - // Replacement Format: default: - [ ] {{TASK}} - new Setting(containerEl) - .setName(t('Settings_Todo_Display_ReplacementFormat')) - .setDesc(t('Settings_Todo_Display_ReplacementFormatDescription')) - .addText((text) => - text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async (value) => { - this.settings.displayOptions_ReplacementFormat = value; - await this.plugin.saveSettings(); - }), - ); - - // Task Importance Indicators - High - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_HighName', - 'Settings_Todo_Display_Importance_HighDescription', - this.settings.displayOptions_TaskImportance_High, - async (value) => { - this.settings.displayOptions_TaskImportance_High = value; - }, - ); - - // Task Importance Indicators - Normal - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_NormalName', - 'Settings_Todo_Display_Importance_NormalDescription', - this.settings.displayOptions_TaskImportance_Normal, - async (value) => { - this.settings.displayOptions_TaskImportance_Normal = value; - }, - ); - - // Task Importance Indicators - Low - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_LowName', - 'Settings_Todo_Display_Importance_LowDescription', - this.settings.displayOptions_TaskImportance_Low, - async (value) => { - this.settings.displayOptions_TaskImportance_Low = value; - }, - ); - - // Task Status Indicator - Not Started - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_NotStartedName', - 'Settings_Todo_Display_Status_NotStartedDescription', - this.settings.displayOptions_TaskStatus_NotStarted, - async (value) => { - this.settings.displayOptions_TaskStatus_NotStarted = value; - }, - ); - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_InProgressName', - 'Settings_Todo_Display_Status_InProgressDescription', - this.settings.displayOptions_TaskStatus_InProgress, - async (value) => { - this.settings.displayOptions_TaskStatus_InProgress = value; - }, - ); - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_CompletedName', - 'Settings_Todo_Display_Status_CompletedDescription', - this.settings.displayOptions_TaskStatus_Completed, - async (value) => { - this.settings.displayOptions_TaskStatus_Completed = value; - }, - ); - - containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); - new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle((toggle) => - toggle.setValue(this.settings.diary.stayWithPN).onChange(async (value) => { - if (value) { - // @ts-ignore - const PNsetting = + addTextSetting( + containerElement: HTMLElement, + title: string, + description: string, + currentValue: string, + changeCallback: (value: string) => any, + ): void { + new Setting(containerElement) + .setName(t(title)) + .setDesc(t(description)) + .addText(text => + text.setValue(currentValue).onChange(async value => { + changeCallback(value); + await this.plugin.saveSettings(); + }), + ); + } + + display(): void { + const {containerEl} = this; + + containerEl.empty(); + + containerEl.createEl('h2', { + text: `${this.plugin.manifest.name}`, + }); + const span = containerEl.createSpan(); + span.style.fontSize = '0.8em'; + span.innerHTML = `Version ${this.plugin.manifest.version}
${this.plugin.manifest.description} created by ${this.plugin.manifest.author}`; + + new Setting(containerEl) + .setName(t('Settings_Todo_DefaultListName')) + .setDesc(t('Settings_Todo_DefaultListNameDescription')) + .addText(text => + text + // .setPlaceholder('输入Todo列表名称') + .setValue(this.settings.todoListSync.listName ?? '') + .onChange(async value => { + this.settings.todoListSync.listName = value; + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_OpenUsingApplicationProtocolTitle')) + .setDesc(t('Settings_Todo_OpenUsingApplicationProtocolDescription')) + .addToggle(toggle => + toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async value => { + this.settings.todo_OpenUsingApplicationProtocol = value; + await this.plugin.saveSettings(); + }), + ); + + // Formatting Options that user can set + containerEl.createEl('h2', { + text: t('Settings_Todo_Display_Heading'), + }); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_DateFormat')) + .setDesc(t('Settings_Todo_Display_DateFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async value => { + this.settings.displayOptions_DateFormat = value; + await this.plugin.saveSettings(); + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_TimeFormat')) + .setDesc(t('Settings_Todo_Display_TimeFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async value => { + this.settings.displayOptions_TimeFormat = value; + await this.plugin.saveSettings(); + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) + .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) + .addToggle(toggle => + toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async value => { + this.settings.displayOptions_ReplaceAddCreatedAt = value; + await this.plugin.saveSettings(); + }), + ); + + // Replacement Format: default: - [ ] {{TASK}} + new Setting(containerEl) + .setName(t('Settings_Todo_Display_ReplacementFormat')) + .setDesc(t('Settings_Todo_Display_ReplacementFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async value => { + this.settings.displayOptions_ReplacementFormat = value; + await this.plugin.saveSettings(); + }), + ); + + // Task Importance Indicators - High + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_HighName', + 'Settings_Todo_Display_Importance_HighDescription', + this.settings.displayOptions_TaskImportance_High, + async value => { + this.settings.displayOptions_TaskImportance_High = value; + }, + ); + + // Task Importance Indicators - Normal + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_NormalName', + 'Settings_Todo_Display_Importance_NormalDescription', + this.settings.displayOptions_TaskImportance_Normal, + async value => { + this.settings.displayOptions_TaskImportance_Normal = value; + }, + ); + + // Task Importance Indicators - Low + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_LowName', + 'Settings_Todo_Display_Importance_LowDescription', + this.settings.displayOptions_TaskImportance_Low, + async value => { + this.settings.displayOptions_TaskImportance_Low = value; + }, + ); + + // Task Status Indicator - Not Started + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_NotStartedName', + 'Settings_Todo_Display_Status_NotStartedDescription', + this.settings.displayOptions_TaskStatus_NotStarted, + async value => { + this.settings.displayOptions_TaskStatus_NotStarted = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_InProgressName', + 'Settings_Todo_Display_Status_InProgressDescription', + this.settings.displayOptions_TaskStatus_InProgress, + async value => { + this.settings.displayOptions_TaskStatus_InProgress = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_CompletedName', + 'Settings_Todo_Display_Status_CompletedDescription', + this.settings.displayOptions_TaskStatus_Completed, + async value => { + this.settings.displayOptions_TaskStatus_Completed = value; + }, + ); + + containerEl.createEl('h2', {text: t('Settings_JournalFormatting')}); + new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => + toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { + if (value) { + // @ts-ignore + const PNsetting // @ts-ignore - app.plugins.plugins['periodic-notes']; - if (PNsetting) { - const { format, folder } = PNsetting.settings.daily; - this.settings.diary = { - format, - folder, - stayWithPN: true, - }; - console.log('🚀 ~ this.settings.diary', this.settings.diary); - await this.plugin.saveSettings(); - this.display(); - } else { - new Notice('Periodic Notes 中未设置'); - this.display(); - } - } else { - this.settings.diary.stayWithPN = false; - await this.plugin.saveSettings(); - this.display(); - } - }), - ); - - const dateFormat = new Setting(containerEl) - .setName(t('Settings_JournalFormatting_DateFormat')) - .setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - !this.settings.diary.format ? '' : window.moment().format(this.settings.diary.format) - }`, - ) - .addText((text) => - text.setValue(this.settings.diary.format).onChange(async (value) => { - this.settings.diary.format = value; - dateFormat.setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - !this.settings.diary.format ? '' : window.moment().format(this.settings.diary.format) - }`, - ); - await this.plugin.saveSettings(); - }), - ) - .setDisabled(this.settings.diary.stayWithPN); - - new Setting(containerEl) - .setName(t('Settings_JournalFormatting_Folder')) - .setDesc(t('Settings_JournalFormatting_FolderDescription')) - .addText((text) => - text.setValue(this.settings.diary.folder).onChange(async (value) => { - this.settings.diary.format = value; - await this.plugin.saveSettings(); - }), - ) - .setDisabled(this.settings.diary.stayWithPN); - } - - async hide() { - const listName = this.settings.todoListSync.listName; - - if (this.settings.todoListSync.listId != undefined || !listName) { - if (!listName) new Notice('微软同步列表未设置'); - } else { - let listId = await this.plugin.todoApi.getListIdByName(listName); - if (!listId) { - listId = (await this.plugin.todoApi.createTaskList(listName))?.id; - } - if (!listId) { - new Notice('创建列表失败'); - return; - } else { - this.settings.todoListSync = { - listName, - listId, - }; - new Notice('设置同步列表成功√'); - await this.plugin.saveSettings(); - } - } - } + = app.plugins.plugins['periodic-notes']; + if (PNsetting) { + const {format, folder} = PNsetting.settings.daily; + this.settings.diary = { + format, + folder, + stayWithPN: true, + }; + console.log('🚀 ~ this.settings.diary', this.settings.diary); + await this.plugin.saveSettings(); + this.display(); + } else { + new Notice('Periodic Notes 中未设置'); + this.display(); + } + } else { + this.settings.diary.stayWithPN = false; + await this.plugin.saveSettings(); + this.display(); + } + }), + ); + + const dateFormat = new Setting(containerEl) + .setName(t('Settings_JournalFormatting_DateFormat')) + .setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ) + .addText(text => + text.setValue(this.settings.diary.format).onChange(async value => { + this.settings.diary.format = value; + dateFormat.setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ); + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + + new Setting(containerEl) + .setName(t('Settings_JournalFormatting_Folder')) + .setDesc(t('Settings_JournalFormatting_FolderDescription')) + .addText(text => + text.setValue(this.settings.diary.folder).onChange(async value => { + this.settings.diary.format = value; + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + } + + async hide() { + const listName = this.settings.todoListSync.listName; + + if (this.settings.todoListSync.listId != undefined || !listName) { + if (!listName) { + new Notice('微软同步列表未设置'); + } + } else { + let listId = await this.plugin.todoApi.getListIdByName(listName); + listId ||= (await this.plugin.todoApi.createTaskList(listName))?.id; + + if (listId) { + this.settings.todoListSync = { + listName, + listId, + }; + new Notice('设置同步列表成功√'); + await this.plugin.saveSettings(); + } else { + new Notice('创建列表失败'); + } + } + } } diff --git a/src/lib/lang.ts b/src/lib/lang.ts index e94865c..d810481 100644 --- a/src/lib/lang.ts +++ b/src/lib/lang.ts @@ -1,22 +1,21 @@ import en from './locale/en.json'; import zhCN from './locale/zh-cn.json'; -export interface Translations { - [key: string]: string; -} +export type Translations = Record; -const localeMap: { [k: string]: Translations } = { - en, - zh: zhCN, +const localeMap: Record = { + en, + 'en-GB': en, // Yes I know it's not the same. But it's close enough. + zh: zhCN, }; -const lang = window.localStorage.getItem('language'); -const locale = localeMap[lang || 'en']; +const lang = globalThis.localStorage.getItem('language'); +const locale = localeMap[lang ?? 'en']; -export function t(str: string): string { - if (!locale) { - console.error('Error: locale not found', lang); - } +export function t(string_: string): string { + if (!locale) { + console.error('Error: locale not found', lang); + } - return (locale && locale[str]) || str; + return locale?.[string_] || string_; } diff --git a/src/lib/logging.ts b/src/lib/logging.ts index 20ecd23..9e54b3a 100644 --- a/src/lib/logging.ts +++ b/src/lib/logging.ts @@ -1,5 +1,4 @@ -import moment from 'moment'; -import { Platform, Plugin } from 'obsidian'; +import {Platform, type Plugin} from 'obsidian'; /* * EventEmitter2 is an implementation of the EventEmitter module found in Node.js. * In addition to having a better benchmark performance than EventEmitter and being @@ -9,19 +8,19 @@ import { Platform, Plugin } from 'obsidian'; * This has been added as EventEmitter in Node.JS is not available in the browser. * https://www.npmjs.com/package/eventemitter2 */ -import { EventEmitter2 } from 'eventemitter2'; +import {EventEmitter2} from 'eventemitter2'; /** * All possible log levels * @public */ -export interface ILogLevel { - 1: 'trace'; - 2: 'debug'; - 3: 'info'; - 4: 'warn'; - 5: 'error'; -} +export type ILogLevel = { + 1: 'trace'; + 2: 'debug'; + 3: 'info'; + 4: 'warn'; + 5: 'error'; +}; /** * Logger class to handle consistency of logs across the plugin. @@ -29,14 +28,14 @@ export interface ILogLevel { * @export * @interface LogEntry */ -export interface LogEntry { - traceId?: string; - level: string; - module: string; - location?: string; - message: string; - objects: any; -} +export type LogEntry = { + traceId?: string; + level: string; + module: string; + location?: string; + message: string; + objects: any; +}; /** * Logging options structure. @@ -44,9 +43,9 @@ export interface LogEntry { * @export * @interface LogOptions */ -export interface LogOptions { - minLevels: { [moduleName: string]: string }; -} +export type LogOptions = { + minLevels: Record; +}; /** * Log level IDs (1 - 5) @@ -68,110 +67,125 @@ export type TLogLevelName = ILogLevel[TLogLevelId]; * @extends {EventEmitter2} */ export class LogManager extends EventEmitter2 { - private options: LogOptions = { - minLevels: { - '': 'debug', - 'mstodo-sync': 'debug', - }, - }; + private options: LogOptions = { + minLevels: { + '': 'debug', + 'mstodo-sync': 'debug', + }, + }; - // Prevent the console logger from being added twice - private consoleLoggerRegistered = false; + // Prevent the console logger from being added twice + private consoleLoggerRegistered = false; - /** + /** * Set the minimum log levels for the module name or global. * * @param {LogOptions} options * @return {*} {LogManager} * @memberof LogManager */ - public configure(options: LogOptions): LogManager { - this.options = Object.assign({}, this.options, options); - return this; - } + public configure(options: LogOptions): this { + this.options = Object.assign({}, this.options, options); + return this; + } - /** + /** * Returns a logger instance for the given module name. * * @param {string} module * @return {*} {Logger} * @memberof LogManager */ - public getLogger(moduleName: string): Logger { - let currentMinimumLevel = 'none'; - let match = ''; - - // eslint-disable-next-line no-loops/no-loops - for (const key in this.options.minLevels) { - if (moduleName.startsWith(key) && key.length >= match.length) { - currentMinimumLevel = this.options.minLevels[key]; - match = key; - } - } - - return new Logger(this, moduleName, currentMinimumLevel); - } - - /** + public getLogger(moduleName: string): Logger { + let currentMinimumLevel = 'none'; + let match = ''; + + for (const key in this.options.minLevels) { + if (moduleName.startsWith(key) && key.length >= match.length) { + currentMinimumLevel = this.options.minLevels[key]; + match = key; + } + } + + return new Logger(this, moduleName, currentMinimumLevel); + } + + /** * * * @param {(logEntry: LogEntry) => void} listener * @return {*} {LogManager} * @memberof LogManager */ - public onLogEntry(listener: (logEntry: LogEntry) => void): LogManager { - this.on('log', listener); - return this; - } + public onLogEntry(listener: (logEntry: LogEntry) => void): this { + this.on('log', listener); + return this; + } - // private period: number = 0; - arrAvg = (arr: number[]) => arr.reduce((a, b) => a + b, 0) / arr.length; + // Private period: number = 0; + arrAvg = (array: number[]) => array.reduce((a, b) => a + b, 0) / array.length; - /** + /** * Registers a logger that write to the console. * * @return {*} {LogManager} * @memberof LogManager */ - public registerConsoleLogger(): LogManager { - if (this.consoleLoggerRegistered) return this; - - this.onLogEntry((logEntry) => { - let msg = `[${moment().format('YYYYMMDDHHmmss')}][${logEntry.level}][${logEntry.module}]`; - - if (logEntry.traceId) { - msg += `[${logEntry.traceId}]`; - } - - msg += ` ${logEntry.message}`; - if (logEntry.objects === undefined) { - logEntry.objects = ''; - } - - switch (logEntry.level) { - case 'trace': - console.trace(msg, logEntry.objects); - break; - case 'debug': - console.debug(msg, logEntry.objects); - break; - case 'info': - console.info(msg, logEntry.objects); - break; - case 'warn': - console.warn(msg, logEntry.objects); - break; - case 'error': - console.error(msg, logEntry.objects); - break; - default: - console.log(`{${logEntry.level}} ${msg}`, logEntry.objects); - } - }); - - this.consoleLoggerRegistered = true; - return this; - } + public registerConsoleLogger(): this { + if (this.consoleLoggerRegistered) { + return this; + } + + this.onLogEntry(logEntry => { + // 2024-12-19T22:53:37.000Z - >'2024-12-19 22:53:37' + const messageDate = new Date().toISOString().slice(0, 19).replace('T', ' '); + + let message = `[${messageDate}][${logEntry.level}][${logEntry.module}]`; + + if (logEntry.traceId) { + message += `[${logEntry.traceId}]`; + } + + message += ` ${logEntry.message}`; + if (logEntry.objects === undefined) { + logEntry.objects = ''; + } + + switch (logEntry.level) { + case 'trace': { + console.trace(message, logEntry.objects); + break; + } + + case 'debug': { + console.debug(message, logEntry.objects); + break; + } + + case 'info': { + console.info(message, logEntry.objects); + break; + } + + case 'warn': { + console.warn(message, logEntry.objects); + break; + } + + case 'error': { + console.error(message, logEntry.objects); + break; + } + + default: { + console.log(`{${logEntry.level}} ${message}`, logEntry.objects); + } + } + }); + + this.consoleLoggerRegistered = true; + return this; + } } export const logging = new LogManager(); @@ -184,146 +198,162 @@ export const logging = new LogManager(); * @class Logger */ export class Logger { - private logManager: EventEmitter2; - private minLevel: number; - private module: string; - private readonly levels: { [key: string]: number } = { - trace: 1, - debug: 2, - info: 3, - warn: 4, - error: 5, - }; - - /** + private readonly logManager: EventEmitter2; + private readonly minLevel: number; + private readonly module: string; + private readonly levels: Record = { + trace: 1, + debug: 2, + info: 3, + warn: 4, + error: 5, + }; + + /** * Creates an instance of Logger. * @param {EventEmitter2} logManager * @param {string} module * @param {string} minLevel * @memberof Logger */ - constructor(logManager: EventEmitter2, module: string, minLevel: string) { - this.logManager = logManager; - this.module = module; - this.minLevel = this.levelToInt(minLevel); - } + constructor(logManager: EventEmitter2, module: string, minLevel: string) { + this.logManager = logManager; + this.module = module; + this.minLevel = this.levelToInt(minLevel); + } - /** + /** * Converts a string level (trace/debug/info/warn/error) into a number * * @param minLevel */ - private levelToInt(minLevel: string): number { - if (minLevel.toLowerCase() in this.levels) return this.levels[minLevel.toLowerCase()]; - else return 99; - } + private levelToInt(minLevel: string): number { + if (minLevel.toLowerCase() in this.levels) { + return this.levels[minLevel.toLowerCase()]; + } + + return 99; + } - /** + /** * Central logging method. * @param logLevel * @param message */ - public log(logLevel: string, message: string, objects?: any): void { - const level = this.levelToInt(logLevel); - if (level < this.minLevel) return; - - const logEntry: LogEntry = { - level: logLevel, - module: this.module, - message, - objects, - traceId: undefined, - }; - - // Obtain the line/file through a thoroughly hacky method - // This creates a new stack trace and pulls the caller from it. If the caller - // if .trace() - // const error = new Error(''); - // if (error.stack) { - // const cla = error.stack.split('\n'); - // let idx = 1; - // while (idx < cla.length && cla[idx].includes('at Logger.Object.')) idx++; - // if (idx < cla.length) { - // logEntry.location = cla[idx].slice(cla[idx].indexOf('at ') + 3, cla[idx].length); - // } - // } - - this.logManager.emit('log', logEntry); - } - - public trace(message: string, objects?: any): void { - this.log('trace', message, objects); - } - public debug(message: string, objects?: any): void { - this.log('debug', message, objects); - } - public info(message: string, objects?: any): void { - this.log('info', message, objects); - } - public warn(message: string, objects?: any): void { - this.log('warn', message, objects); - } - public error(message: string, objects?: any): void { - this.log('error', message, objects); - } - - /** + public log(logLevel: string, message: string, objects?: any): void { + const level = this.levelToInt(logLevel); + if (level < this.minLevel) { + return; + } + + const logEntry: LogEntry = { + level: logLevel, + module: this.module, + message, + objects, + traceId: undefined, + }; + + // Obtain the line/file through a thoroughly hacky method + // This creates a new stack trace and pulls the caller from it. If the caller + // if .trace() + // const error = new Error(''); + // if (error.stack) { + // const cla = error.stack.split('\n'); + // let idx = 1; + // while (idx < cla.length && cla[idx].includes('at Logger.Object.')) idx++; + // if (idx < cla.length) { + // logEntry.location = cla[idx].slice(cla[idx].indexOf('at ') + 3, cla[idx].length); + // } + // } + + this.logManager.emit('log', logEntry); + } + + public trace(message: string, objects?: any): void { + this.log('trace', message, objects); + } + + public debug(message: string, objects?: any): void { + this.log('debug', message, objects); + } + + public info(message: string, objects?: any): void { + this.log('info', message, objects); + } + + public warn(message: string, objects?: any): void { + this.log('warn', message, objects); + } + + public error(message: string, objects?: any): void { + this.log('error', message, objects); + } + + /** * Central logging method with a trace ID to track calls between modules/components. * @param logLevel * @param message */ - public logWithId(logLevel: string, traceId: string, message: string, objects?: any): void { - const level = this.levelToInt(logLevel); - if (level < this.minLevel) return; - - const logEntry: LogEntry = { - level: logLevel, - module: this.module, - message, - objects, - traceId, - }; - - this.logManager.emit('log', logEntry); - } - - public traceWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('trace', traceId, message, objects); - } - public debugWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('debug', traceId, message, objects); - } - public infoWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('info', traceId, message, objects); - } - public warnWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('warn', traceId, message, objects); - } - public errorWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('error', traceId, message, objects); - } + public logWithId(logLevel: string, traceId: string, message: string, objects?: any): void { + const level = this.levelToInt(logLevel); + if (level < this.minLevel) { + return; + } + + const logEntry: LogEntry = { + level: logLevel, + module: this.module, + message, + objects, + traceId, + }; + + this.logManager.emit('log', logEntry); + } + + public traceWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('trace', traceId, message, objects); + } + + public debugWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('debug', traceId, message, objects); + } + + public infoWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('info', traceId, message, objects); + } + + public warnWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('warn', traceId, message, objects); + } + + public errorWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('error', traceId, message, objects); + } } export function logCallDetails() { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { - const originalMethod = descriptor.value; - const logger = logging.getLogger('mstodo-sync'); - - descriptor.value = async function (...args: any[]) { - const startTime = new Date(Date.now()); - const result = await originalMethod.apply(this, args); - const endTime = new Date(Date.now()); - const elapsed = endTime.getTime() - startTime.getTime(); - - logger.debug( - `${typeof target}:${propertyKey} called with ${ - args.length - } arguments. Took: ${elapsed}ms ${JSON.stringify(args)}`, - ); - return result; - }; - return descriptor; - }; + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; + const logger = logging.getLogger('mstodo-sync'); + + descriptor.value = async function (...arguments_: any[]) { + const startTime = new Date(Date.now()); + const result = await originalMethod.apply(this, arguments_); + const endTime = new Date(Date.now()); + const elapsed = endTime.getTime() - startTime.getTime(); + + logger.debug( + `${typeof target}:${propertyKey} called with ${ + arguments_.length + } arguments. Took: ${elapsed}ms ${JSON.stringify(arguments_)}`, + ); + return result; + }; + + return descriptor; + }; } /** @@ -334,27 +364,38 @@ export function logCallDetails() { * @param {string} message */ export function log(logLevel: TLogLevelName, message: string) { - const logger = logging.getLogger('mstodo-sync'); - - switch (logLevel) { - case 'trace': - logger.trace(message); - break; - case 'debug': - logger.debug(message); - break; - case 'info': - logger.info(message); - break; - case 'warn': - logger.warn(message); - break; - case 'error': - logger.error(message); - break; - default: - break; - } + const logger = logging.getLogger('mstodo-sync'); + + switch (logLevel) { + case 'trace': { + logger.trace(message); + break; + } + + case 'debug': { + logger.debug(message); + break; + } + + case 'info': { + logger.info(message); + break; + } + + case 'warn': { + logger.warn(message); + break; + } + + case 'error': { + logger.error(message); + break; + } + + default: { + break; + } + } } /** @@ -367,25 +408,26 @@ export function log(logLevel: TLogLevelName, message: string) { * @return {*} */ export function monkeyPatchConsole(plugin: Plugin) { - if (!Platform.isMobile) { - return; - } - - const logFile = `${plugin.manifest.dir}/mstodo-sync-logs.txt`; - const logs: string[] = []; - const logMessages = - (prefix: string) => - (...messages: unknown[]) => { - logs.push(`\n[${prefix}]`); - messages.forEach((message) => { - logs.push(String(message)); - }); - plugin.app.vault.adapter.write(logFile, logs.join(' ')); - }; - - console.debug = logMessages('debug'); - console.error = logMessages('error'); - console.info = logMessages('info'); - console.log = logMessages('log'); - console.warn = logMessages('warn'); + if (!Platform.isMobile) { + return; + } + + const logFile = `${plugin.manifest.dir}/mstodo-sync-logs.txt`; + const logs: string[] = []; + const logMessages + = (prefix: string) => + (...messages: unknown[]) => { + logs.push(`\n[${prefix}]`); + for (const message of messages) { + logs.push(String(message)); + } + + plugin.app.vault.adapter.write(logFile, logs.join(' ')); + }; + + console.debug = logMessages('debug'); + console.error = logMessages('error'); + console.info = logMessages('info'); + console.log = logMessages('log'); + console.warn = logMessages('warn'); } diff --git a/src/main.ts b/src/main.ts index 5b7fef0..2cebfcc 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,229 +1,238 @@ -import { CachedMetadata, Editor, EditorPosition, MarkdownView, Plugin } from 'obsidian'; -import { TodoApi } from './api/todoApi'; -import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, MsTodoSyncSettings } from './gui/msTodoSyncSettingTab'; -import { createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren } from './command/msTodoCommand'; -import { t } from './lib/lang'; -import { log, logging } from './lib/logging'; +import { + type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Plugin, +} from 'obsidian'; +import {TodoApi} from './api/todoApi.js'; +import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type MsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; +import { + createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren, +} from './command/msTodoCommand.js'; +import {t} from './lib/lang.js'; +import {log, logging} from './lib/logging.js'; export default class MsTodoSync extends Plugin { - settings: MsTodoSyncSettings; - public todoApi: TodoApi; - - // Pulls the meta data for the a page to help with list processing. - getPageMetadata(path: string): CachedMetadata | null { - return this.app.metadataCache.getCache(path); - } - - async onload() { - logging.registerConsoleLogger(); - - log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); - - await this.loadSettings(); - // 在右键菜单中注册命令:将选中的文字创建微软待办 - // Register command in the context menu: Create to Do with the selected text - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem((item) => { - item.setTitle(t('EditorMenu_SyncToTodo')).onClick( - async (e) => - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ), - ); - }); - }), - ); - - // 在右键菜单中注册命令:将选中的文字创建微软待办并替换 - // Register command in the context menu: Create and replace the selected text to Microsoft To-Do - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem((item) => { - item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( - async (e) => - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ), - ); - }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem((item) => { - item.setTitle('Sync Task with details (Push)').onClick(async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); - }); - }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem((item) => { - item.setTitle('Sync Task with details (Pull)').onClick( - async () => - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - false, - ), - ); - }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem((item) => { - item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - // @ts-ignore Not available in mobile app - if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } - }); - }); - }), - ); - - // 注册命令:将选中的文字创建微软待办 - // Register command: Create to Do with the selected text - this.addCommand({ - id: 'only-create-task', - name: 'Post the selection as todos to MsTodo.', - editorCallback: async (editor: Editor, view: MarkdownView) => - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ), - }); - - // 注册命令:将选中的文字创建微软待办并替换 - // Register command: Create and replace the selected text to Microsoft To-Do - this.addCommand({ - id: 'create-task-replace', - name: 'Post the selection as todos to MsTodo and Replace.', - editorCallback: async (editor: Editor, view: MarkdownView) => - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ), - }); - - // Register command: Open link to ToDo - this.addCommand({ - id: 'open-task-link', - name: 'Open To Do', - editorCallback: async (editor: Editor, view: MarkdownView) => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - // @ts-ignore Not available in mobile app - if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } - }, - }); - - this.addCommand({ - id: 'add-microsoft-todo', - name: 'Insert the MsTodo summary.', - editorCallback: async (editor: Editor, view: MarkdownView) => { - // TODO 模板化日期 - await createTodayTasks(this.todoApi, this.settings, editor); - }, - }); - - this.addSettingTab(new MsTodoSyncSettingTab(this)); - this.todoApi = new TodoApi(); - - // const a = this.app.vault.getAbstractFileByPath('0进行中/00Today/未命名 2.md') - // if(a) await this.app.vault.append(a,"hello") - // this.registerInterval(window.setTimeout(() => this.uptimerApi.getTodayActivities(),(window.moment("18:21", "HH:mm") as unknown as number) - (window.moment() as unknown as number))); - // This creates an icon in the left ribbon. - // const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { - // }); - // Perform additional things with the ribbon - // ribbonIconEl.addClass('my-plugin-ribbon-class'); - - // console.log(await this.todoApi.getListIdByName("obsidian")) - } - - async onunload() { - log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); - } - - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - - async saveSettings() { - await this.saveData(this.settings); - } - - // getCurrentLinesFromEditor(editor: Editor): Selection { - // log( - // 'info', - // `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( - // 'anchor', - // )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, - // ); - - // let start: EditorPosition; - // let end: EditorPosition; - // let lines: number[] = []; - // if (editor.somethingSelected()) { - // start = editor.getCursor('from'); - // end = editor.getCursor('to'); - // lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); - // } else { - // start = editor.getCursor(); - // end = editor.getCursor(); - // lines.push(start.line); - // } - // return { - // start, - // end, - // lines, - // }; - // } + settings: MsTodoSyncSettings; + public todoApi: TodoApi; + + // Pulls the meta data for the a page to help with list processing. + getPageMetadata(path: string): CachedMetadata | undefined { + return this.app.metadataCache.getCache(path); + } + + async onload() { + logging.registerConsoleLogger(); + + log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); + + await this.loadSettings(); + // 在右键菜单中注册命令:将选中的文字创建微软待办 + // Register command in the context menu: Create to Do with the selected text + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_SyncToTodo')).onClick( + async e => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }, + ); + }); + }), + ); + + // 在右键菜单中注册命令:将选中的文字创建微软待办并替换 + // Register command in the context menu: Create and replace the selected text to Microsoft To-Do + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( + async e => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Sync Task with details (Push)').onClick(async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Sync Task with details (Pull)').onClick( + async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + false, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = getTaskIdFromLine(line, this); + if (taskId !== '') { + // @ts-ignore Not available in mobile app + if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } + }); + }); + }), + ); + + // 注册命令:将选中的文字创建微软待办 + // Register command: Create to Do with the selected text + this.addCommand({ + id: 'only-create-task', + name: 'Post the selection as todos to MsTodo.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }, + }); + + // 注册命令:将选中的文字创建微软待办并替换 + // Register command: Create and replace the selected text to Microsoft To-Do + this.addCommand({ + id: 'create-task-replace', + name: 'Post the selection as todos to MsTodo and Replace.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }, + }); + + // Register command: Open link to ToDo + this.addCommand({ + id: 'open-task-link', + name: 'Open To Do', + editorCallback: async (editor: Editor, view: MarkdownView) => { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = getTaskIdFromLine(line, this); + if (taskId !== '') { + // @ts-ignore Not available in mobile app + if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } + }, + }); + + this.addCommand({ + id: 'add-microsoft-todo', + name: 'Insert the MsTodo summary.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + // TODO 模板化日期 + await createTodayTasks(this.todoApi, this.settings, editor); + }, + }); + + this.addSettingTab(new MsTodoSyncSettingTab(this)); + this.todoApi = new TodoApi(this.app); + + // Const a = this.app.vault.getAbstractFileByPath('0进行中/00Today/未命名 2.md') + // if(a) await this.app.vault.append(a,"hello") + // this.registerInterval(window.setTimeout(() => this.uptimerApi.getTodayActivities(),(window.moment("18:21", "HH:mm") as unknown as number) - (window.moment() as unknown as number))); + // This creates an icon in the left ribbon. + // const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { + // }); + // Perform additional things with the ribbon + // ribbonIconEl.addClass('my-plugin-ribbon-class'); + + // console.log(await this.todoApi.getListIdByName("obsidian")) + } + + async onunload() { + log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); + } + + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); + } + + async saveSettings() { + await this.saveData(this.settings); + } + + // GetCurrentLinesFromEditor(editor: Editor): Selection { + // log( + // 'info', + // `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( + // 'anchor', + // )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + // ); + + // let start: EditorPosition; + // let end: EditorPosition; + // let lines: number[] = []; + // if (editor.somethingSelected()) { + // start = editor.getCursor('from'); + // end = editor.getCursor('to'); + // lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); + // } else { + // start = editor.getCursor(); + // end = editor.getCursor(); + // lines.push(start.line); + // } + // return { + // start, + // end, + // lines, + // }; + // } } diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index dd63ae7..34a9ca4 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -1,386 +1,388 @@ import { - AttachmentBase, - AttachmentSession, - ChecklistItem, - DateTimeTimeZone, - Extension, - Importance, - ItemBody, - LinkedResource, - NullableOption, - PatternedRecurrence, - TaskStatus, - TodoTask, + type AttachmentBase, + type AttachmentSession, + type ChecklistItem, + type DateTimeTimeZone, + type Extension, + type Importance, + type ItemBody, + type LinkedResource, + type NullableOption, + type PatternedRecurrence, + type TaskStatus, + type TodoTask, } from '@microsoft/microsoft-graph-types'; -import { MsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; -import { CachedMetadata } from 'obsidian'; -import MsTodoSync from './../main'; -import { t } from './../lib/lang'; -import { logging } from './../lib/logging'; -import { IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from './../constants'; +import {type MsTodoSyncSettings} from 'src/gui/msTodoSyncSettingTab'; +import {CachedMetadata} from 'obsidian'; +import type MsTodoSync from '../main.js'; +import {t} from '../lib/lang.js'; +import {logging} from '../lib/logging.js'; +import {IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX} from '../constants.js'; export class ObsidianTodoTask implements TodoTask { - id: string; + id: string; - // The task body that typically contains information about the task. - public body?: NullableOption; - /** + // The task body that typically contains information about the task. + public body?: NullableOption; + /** * The date and time when the task body was last modified. By default, it is in UTC. You can provide a custom time zone in * the request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan * 1, 2020 would look like this: '2020-01-01T00:00:00Z'. */ - public bodyLastModifiedDateTime?: string; - /** + public bodyLastModifiedDateTime?: string; + /** * The categories associated with the task. Each category corresponds to the displayName property of an outlookCategory * that the user has defined. */ - public categories?: NullableOption; - // The date and time in the specified time zone that the task was finished. - public completedDateTime?: NullableOption; - /** + public categories?: NullableOption; + // The date and time in the specified time zone that the task was finished. + public completedDateTime?: NullableOption; + /** * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the * request header. The property value uses ISO 8601 format. For example, midnight UTC on Jan 1, 2020 would look like this: * '2020-01-01T00:00:00Z'. */ - public createdDateTime?: string; - // The date and time in the specified time zone that the task is to be finished. - public dueDateTime?: NullableOption; - public hasAttachments?: NullableOption; - // The importance of the task. Possible values are: low, normal, high. - public importance?: Importance; - // Set to true if an alert is set to remind the user of the task. - public isReminderOn?: boolean; - /** + public createdDateTime?: string; + // The date and time in the specified time zone that the task is to be finished. + public dueDateTime?: NullableOption; + public hasAttachments?: NullableOption; + // The importance of the task. Possible values are: low, normal, high. + public importance?: Importance; + // Set to true if an alert is set to remind the user of the task. + public isReminderOn?: boolean; + /** * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, * 2020 would look like this: '2020-01-01T00:00:00Z'. */ - public lastModifiedDateTime?: string; - // The recurrence pattern for the task. - public recurrence?: NullableOption; - // The date and time in the specified time zone for a reminder alert of the task to occur. - public reminderDateTime?: NullableOption; - public startDateTime?: NullableOption; - /** + public lastModifiedDateTime?: string; + // The recurrence pattern for the task. + public recurrence?: NullableOption; + // The date and time in the specified time zone for a reminder alert of the task to occur. + public reminderDateTime?: NullableOption; + public startDateTime?: NullableOption; + /** * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, * deferred. */ - public status?: TaskStatus; - // A brief description of the task. - public title?: NullableOption; - public attachments?: NullableOption; - public attachmentSessions?: NullableOption; - // A collection of checklistItems linked to a task. - public checklistItems?: NullableOption; - // The collection of open extensions defined for the task. Nullable. - public extensions?: NullableOption; - // A collection of resources linked to the task. - public linkedResources?: NullableOption; - - public blockLink?: string; - public fileName?: string; - private plugin: MsTodoSync; - private settings: MsTodoSyncSettings; - logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); - private originalTitle: string; - - /** + public status?: TaskStatus; + // A brief description of the task. + public title?: NullableOption; + public attachments?: NullableOption; + public attachmentSessions?: NullableOption; + // A collection of checklistItems linked to a task. + public checklistItems?: NullableOption; + // The collection of open extensions defined for the task. Nullable. + public extensions?: NullableOption; + // A collection of resources linked to the task. + public linkedResources?: NullableOption; + + public blockLink?: string; + public fileName?: string; + private readonly plugin: MsTodoSync; + private readonly settings: MsTodoSyncSettings; + logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); + private readonly originalTitle: string; + + /** * */ - //constructor() { - // this.plugin = plugin; - // this.settings = plugin.settings; - // this.fileName = fileName; - // this.originalTitle = line; - // this.logger.debug(`Creating: '${this.title}'`); - // this.title = line.trim(); - // // This will strip out the block link if it exists as - // // it is part of this plugin and not user specified. - // this.checkForBlockLink(line); - // // This will strip out the checkbox if in title. - // this.checkForStatus(line); - // this.checkForImportance(line); - // this.title = this.title - // .trim() - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .trim(); - // this.body = { - // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - // contentType: 'text', - // }; - // this.logger.debug(`Created: '${this.title}'`); - //} - constructor(plugin: MsTodoSync, line: string, fileName: string) { - this.plugin = plugin; - this.settings = plugin.settings; - this.fileName = fileName; - this.originalTitle = line; - - this.logger.debug(`Creating: '${this.title}'`); - - this.title = line.trim(); - - // This will strip out the block link if it exists as - // it is part of this plugin and not user specified. - this.checkForBlockLink(line); - - // This will strip out the checkbox if in title. - this.checkForStatus(line); - - this.checkForImportance(line); - - this.title = this.title - .trim() - .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - .trim(); - - this.body = { - content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - contentType: 'text', - }; - - if (!this.linkedResources) { - this.linkedResources = []; - } - this.linkedResources.push({ - webUrl: `obsidian://advanced-uri?filepath=${fileName}`, - applicationName: 'Obsidian', - displayName: 'fileName', - }); - - this.logger.debug(`Created: '${this.title}'`); - } - - // static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { - // const task = new ObsidianTodoTask(); - - // task.plugin = plugin; - // task.settings = plugin.settings; - // task.fileName = fileName; - - // const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; - - // await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); - - // app.vault.read(this.config.target_file); - - // plugin.app.vault.getAbstractFileByPath; - // pageMetadata.listItems?.find((item) => { - // if (item.position.start.line === lineNumber) { - // task.originalTitle = item.line; - // } - // }); - - // return task; - // } - - public getTodoTask(withChecklist = false): TodoTask { - const toDo: TodoTask = { - title: this.title, - }; - - if (this.body && this.body.content && this.body.content.length > 0) { - toDo.body = this.body; - } - - if (this.status && this.status.length > 0) { - toDo.status = this.status; - } - - if (this.importance && this.importance.length > 0) { - toDo.importance = this.importance as Importance; - } - - if (withChecklist) { - if (this.checklistItems && this.checklistItems.length > 0) { - toDo.checklistItems = this.checklistItems; - } - } - - if (this.linkedResources && this.linkedResources.length > 0) { - toDo.linkedResources = this.linkedResources; - } - return toDo; - } - - public setBody(body: string) { - this.body = { - content: body, - contentType: 'text', - }; - } - - public addChecklistItem(item: string) { - if (!this.checklistItems) { - this.checklistItems = []; - } - - this.checklistItems.push({ - displayName: item - .trim() - .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - .trim(), - }); - } - - /** + // constructor() { + // this.plugin = plugin; + // this.settings = plugin.settings; + // this.fileName = fileName; + // this.originalTitle = line; + // this.logger.debug(`Creating: '${this.title}'`); + // this.title = line.trim(); + // // This will strip out the block link if it exists as + // // it is part of this plugin and not user specified. + // this.checkForBlockLink(line); + // // This will strip out the checkbox if in title. + // this.checkForStatus(line); + // this.checkForImportance(line); + // this.title = this.title + // .trim() + // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') + // .trim(); + // this.body = { + // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + // contentType: 'text', + // }; + // this.logger.debug(`Created: '${this.title}'`); + // } + constructor(plugin: MsTodoSync, line: string, fileName: string) { + this.plugin = plugin; + this.settings = plugin.settings; + this.fileName = fileName; + this.originalTitle = line; + + this.logger.debug(`Creating: '${this.title}'`); + + this.title = line.trim(); + + // This will strip out the block link if it exists as + // it is part of this plugin and not user specified. + this.checkForBlockLink(line); + + // This will strip out the checkbox if in title. + this.checkForStatus(line); + + this.checkForImportance(line); + + this.title = this.title + .trim() + .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') + .trim(); + + this.body = { + content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + contentType: 'text', + }; + + this.linkedResources ||= []; + + this.linkedResources.push({ + webUrl: `obsidian://advanced-uri?filepath=${fileName}`, + applicationName: 'Obsidian', + displayName: 'fileName', + }); + + this.logger.debug(`Created: '${this.title}'`); + } + + // Static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { + // const task = new ObsidianTodoTask(); + + // task.plugin = plugin; + // task.settings = plugin.settings; + // task.fileName = fileName; + + // const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; + + // await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); + + // app.vault.read(this.config.target_file); + + // plugin.app.vault.getAbstractFileByPath; + // pageMetadata.listItems?.find((item) => { + // if (item.position.start.line === lineNumber) { + // task.originalTitle = item.line; + // } + // }); + + // return task; + // } + + public getTodoTask(withChecklist = false): TodoTask { + const toDo: TodoTask = { + title: this.title, + }; + + if (this.body?.content && this.body.content.length > 0) { + toDo.body = this.body; + } + + if (this.status && this.status.length > 0) { + toDo.status = this.status; + } + + if (this.importance && this.importance.length > 0) { + toDo.importance = this.importance; + } + + if (withChecklist && this.checklistItems && this.checklistItems.length > 0) { + toDo.checklistItems = this.checklistItems; + } + + if (this.linkedResources && this.linkedResources.length > 0) { + toDo.linkedResources = this.linkedResources; + } + + return toDo; + } + + public setBody(body: string) { + this.body = { + content: body, + contentType: 'text', + }; + } + + public addChecklistItem(item: string) { + this.checklistItems ||= []; + + this.checklistItems.push({ + displayName: item + .trim() + .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') + .trim(), + }); + } + + /** * Return the task as a well formed markdown task. * * @return {*} {string} * @memberof ObsidianTodoTask */ - public getMarkdownTask(singleLine: boolean): string { - let output: string; - - // Format and display the task which is the first line. - const format = this.settings.displayOptions_ReplacementFormat; - const priorityIndicator = this.getPriorityIndicator(); - - // eslint-disable-next-line prefer-const - output = format - .replace(TASK_REGEX, this.title?.trim() ?? '') - .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); - - if (output.includes(priorityIndicator)) { - // Already in title, don't add it again and clear replacement tag. - output = output.replace(IMPORTANCE_REGEX, ''); - } else { - output = output.replace(IMPORTANCE_REGEX, priorityIndicator); - } - - // Append blocklink at the end if it exists - if (this.hasBlockLink && this.blockLink) { - output = `${output.trim()} ^${this.blockLink}`; - } - this.logger.debug(`Updated task: '${output}'`); - - let formattedBody = ''; - let formattedChecklist = ''; - - // Add in the body if it exists and indented by two spaces. - if (this.body?.content && this.body.content.length > 0) { - this.body?.content.split('\n').forEach((bodyLine) => { - if (bodyLine.trim().length > 0) { - formattedBody += ' ' + bodyLine + '\n'; - } - }); - } - // this.logger.debug(`formattedBody: '${formattedBody}'`); - - if (this.checklistItems && this.checklistItems.length > 0) { - this.checklistItems.forEach((item) => { - if (item.isChecked) { - formattedChecklist += ' - [x] ' + item.displayName + '\n'; - } else { - formattedChecklist += ' - [ ] ' + item.displayName + '\n'; - } - }); - } - // this.logger.debug(`formattedChecklist: '${formattedChecklist}'`); - - if (singleLine) { - output = `${output.trim()}`; - } else { - output = `${output.trim()}\n${formattedBody}${formattedChecklist}`; - } - // this.logger.debug(`output: '${output}'`); - - return output; - } - - private checkForStatus(line: string) { - const regex = /\[(.)\]/; - - const m = regex.exec(line); - if (m && m.length > 0) { - this.status = m[1] === 'x' ? 'completed' : 'notStarted'; - this.title = this.title?.replace(regex, '').trim(); - } else { - this.status = 'notStarted'; - } - } - - private checkForImportance(line: string) { - this.importance = 'normal'; - - if (line.includes(this.settings.displayOptions_TaskImportance_Low)) { - this.importance = 'low'; - } - - if (line.includes(this.settings.displayOptions_TaskImportance_High)) { - this.importance = 'high'; - } - } - - private getPriorityIndicator(): string { - switch (this.importance) { - case 'normal': - return this.settings.displayOptions_TaskImportance_Normal; - case 'low': - return this.settings.displayOptions_TaskImportance_Low; - case 'high': - return this.settings.displayOptions_TaskImportance_High; - default: - return ''; - } - } - - private getStatusIndicator(): string { - switch (this.status) { - case 'notStarted': - return this.settings.displayOptions_TaskStatus_NotStarted; - case 'inProgress': - return this.settings.displayOptions_TaskStatus_InProgress; - case 'completed': - return this.settings.displayOptions_TaskStatus_Completed; - default: - return ' '; - } - } - - private checkForBlockLink(line: string) { - const blocklinkRegex = /\^(?!.*\^)([A-Za-z0-9]+)/gm; - const blocklinkMatch = blocklinkRegex.exec(line); - if (blocklinkMatch) { - this.blockLink = blocklinkMatch[1]; - - //FIXME If there's a 'Created at xxxx' replaced line, - // it's not enough to get a cleanTaskTitle after the next line. - this.title = this.title?.replace(`^${this.blockLink}`, ''); - } - - if (this.hasBlockLink && this.blockLink) { - this.id = this.settings.taskIdLookup[this.blockLink]; - } - } - - public get cleanTitle(): string { - return ''; - } - - public get hasBlockLink(): boolean { - return this.blockLink !== undefined && this.blockLink.length > 0; - } - - /** + public getMarkdownTask(singleLine: boolean): string { + let output: string; + + // Format and display the task which is the first line. + const format = this.settings.displayOptions_ReplacementFormat; + const priorityIndicator = this.getPriorityIndicator(); + + output = format + .replace(TASK_REGEX, this.title?.trim() ?? '') + .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); + + if (output.includes(priorityIndicator)) { + // Already in title, don't add it again and clear replacement tag. + output = output.replace(IMPORTANCE_REGEX, ''); + } else { + output = output.replace(IMPORTANCE_REGEX, priorityIndicator); + } + + // Append blocklink at the end if it exists + if (this.hasBlockLink && this.blockLink) { + output = `${output.trim()} ^${this.blockLink}`; + } + + this.logger.debug(`Updated task: '${output}'`); + + let formattedBody = ''; + let formattedChecklist = ''; + + // Add in the body if it exists and indented by two spaces. + if (this.body?.content && this.body.content.length > 0) { + for (const bodyLine of this.body?.content.split('\n')) { + if (bodyLine.trim().length > 0) { + formattedBody += ' ' + bodyLine + '\n'; + } + } + } + // This.logger.debug(`formattedBody: '${formattedBody}'`); + + if (this.checklistItems && this.checklistItems.length > 0) { + for (const item of this.checklistItems) { + formattedChecklist += item.isChecked ? ' - [x] ' + item.displayName + '\n' : ' - [ ] ' + item.displayName + '\n'; + } + } + // This.logger.debug(`formattedChecklist: '${formattedChecklist}'`); + + output = singleLine ? `${output.trim()}` : `${output.trim()}\n${formattedBody}${formattedChecklist}`; + // This.logger.debug(`output: '${output}'`); + + return output; + } + + private checkForStatus(line: string) { + const regex = /\[(.)]/; + + const m = regex.exec(line); + if (m && m.length > 0) { + this.status = m[1] === 'x' ? 'completed' : 'notStarted'; + this.title = this.title?.replace(regex, '').trim(); + } else { + this.status = 'notStarted'; + } + } + + private checkForImportance(line: string) { + this.importance = 'normal'; + + if (line.includes(this.settings.displayOptions_TaskImportance_Low)) { + this.importance = 'low'; + } + + if (line.includes(this.settings.displayOptions_TaskImportance_High)) { + this.importance = 'high'; + } + } + + private getPriorityIndicator(): string { + switch (this.importance) { + case 'normal': { + return this.settings.displayOptions_TaskImportance_Normal; + } + + case 'low': { + return this.settings.displayOptions_TaskImportance_Low; + } + + case 'high': { + return this.settings.displayOptions_TaskImportance_High; + } + + default: { + return ''; + } + } + } + + private getStatusIndicator(): string { + switch (this.status) { + case 'notStarted': { + return this.settings.displayOptions_TaskStatus_NotStarted; + } + + case 'inProgress': { + return this.settings.displayOptions_TaskStatus_InProgress; + } + + case 'completed': { + return this.settings.displayOptions_TaskStatus_Completed; + } + + default: { + return ' '; + } + } + } + + private checkForBlockLink(line: string) { + const blocklinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; + const blocklinkMatch = blocklinkRegex.exec(line); + if (blocklinkMatch) { + this.blockLink = blocklinkMatch[1]; + + // FIXME If there's a 'Created at xxxx' replaced line, + // it's not enough to get a cleanTaskTitle after the next line. + this.title = this.title?.replace(`^${this.blockLink}`, ''); + } + + if (this.hasBlockLink && this.blockLink) { + this.id = this.settings.taskIdLookup[this.blockLink]; + } + } + + public get cleanTitle(): string { + return ''; + } + + public get hasBlockLink(): boolean { + return this.blockLink !== undefined && this.blockLink.length > 0; + } + + /** * Cache the ID internally and generate blocklink. * * @param {string} [id] * @return {*} {Promise} * @memberof ObsidianTodoTask */ - public async cacheTaskId(id: string): Promise { - this.settings.taskIdIndex = this.settings.taskIdIndex + 1; + public async cacheTaskId(id: string): Promise { + this.settings.taskIdIndex = this.settings.taskIdIndex + 1; - const index = `${Math.random().toString(20).substring(2, 6)}${this.settings.taskIdIndex - .toString() - .padStart(5, '0')}`; - this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settings.taskIdIndex}`); + const index = `${Math.random().toString(20).slice(2, 6)}${this.settings.taskIdIndex + .toString() + .padStart(5, '0')}`; + this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settings.taskIdIndex}`); - this.settings.taskIdLookup[index] = id ?? ''; - this.blockLink = index; - this.id = id; + this.settings.taskIdLookup[index] = id ?? ''; + this.blockLink = index; + this.id = id; - await this.plugin.saveSettings(); - } + await this.plugin.saveSettings(); + } } diff --git a/src/utils/formatter.ts b/src/utils/formatter.ts index 36b6e6a..02b9e4b 100644 --- a/src/utils/formatter.ts +++ b/src/utils/formatter.ts @@ -1,10 +1,10 @@ -import { TASK_REGEX } from 'src/constants'; -import MsTodoSync from '../main'; +import {TASK_REGEX} from 'src/constants'; +import type MsTodoSync from '../main.js'; export const formatTask = (plugin: MsTodoSync, line: string) => { - let output: string; - const format = plugin.settings.displayOptions_ReplacementFormat; - // eslint-disable-next-line prefer-const - output = format.replace(TASK_REGEX, line); - return output; + let output: string; + const format = plugin.settings.displayOptions_ReplacementFormat; + // eslint-disable-next-line prefer-const + output = format.replace(TASK_REGEX, line); + return output; }; diff --git a/version-bump.mjs b/version-bump.mjs index d409fa0..d12d785 100644 --- a/version-bump.mjs +++ b/version-bump.mjs @@ -1,14 +1,14 @@ -import { readFileSync, writeFileSync } from "fs"; +import {readFileSync, writeFileSync} from 'node:fs'; const targetVersion = process.env.npm_package_version; -// read minAppVersion from manifest.json and bump version to target version -let manifest = JSON.parse(readFileSync("manifest.json", "utf8")); -const { minAppVersion } = manifest; +// Read minAppVersion from manifest.json and bump version to target version +const manifest = JSON.parse(readFileSync('manifest.json', 'utf8')); +const {minAppVersion} = manifest; manifest.version = targetVersion; -writeFileSync("manifest.json", JSON.stringify(manifest, null, "\t")); +writeFileSync('manifest.json', JSON.stringify(manifest, null, '\t')); -// update versions.json with target version and minAppVersion from manifest.json -let versions = JSON.parse(readFileSync("versions.json", "utf8")); +// Update versions.json with target version and minAppVersion from manifest.json +const versions = JSON.parse(readFileSync('versions.json', 'utf8')); versions[targetVersion] = minAppVersion; -writeFileSync("versions.json", JSON.stringify(versions, null, "\t")); +writeFileSync('versions.json', JSON.stringify(versions, null, '\t')); From cfa13b36b048494f3e75975e15f1b01a8c720bd6 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 27 Dec 2024 17:30:19 -0800 Subject: [PATCH 09/34] feat: get the update path working for task updates to mstodo --- .editorconfig | 2 +- package.json | 127 +++--- src/api/microsoftClientProvider.ts | 165 ++++---- src/api/todoApi.ts | 228 ++++++---- src/command/msTodoCommand.ts | 531 +++++++++++------------ src/gui/microsoftAuthModal.ts | 40 +- src/gui/msTodoSyncSettingTab.ts | 660 +++++++++++++++-------------- src/lib/locale/en.json | 144 +++---- src/lib/locale/zh-cn.json | 144 +++---- src/main.ts | 435 ++++++++++--------- src/model/ObsidianTodoTask.ts | 569 +++++++++++-------------- src/utils/settingsManager.ts | 24 ++ tsconfig.json | 52 ++- 13 files changed, 1572 insertions(+), 1549 deletions(-) create mode 100644 src/utils/settingsManager.ts diff --git a/.editorconfig b/.editorconfig index add1721..ecd114d 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ root = true charset = utf-8 end_of_line = lf insert_final_newline = true -indent_style = tab +indent_style = space indent_size = 4 tab_width = 4 max_line_length = 120 diff --git a/package.json b/package.json index ae16564..2693325 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,73 @@ { - "name": "obsidian-mstodo-sync", - "version": "1.0.1", - "description": "This is a MsTodoSync plugin for Obsidian (https://obsidian.md)", - "main": "main.js", - "scripts": { - "preinstall": "npx only-allow pnpm", - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "dev": "node esbuild.config.mjs", - "version": "node version-bump.mjs && git add manifest.json versions.json", - "lint": "eslint ./src --ext .ts", - "lint:fix": "eslint ./src --ext .ts --fix", - "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", - "test": "xo" - }, - "keywords": [], - "author": "", - "license": "MIT", - "devDependencies": { - "@types/node": "^16.11.6", - "@types/node-fetch": "^2.6.2", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", - "builtin-modules": "3.3.0", - "esbuild": "0.14.47", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.22.1", - "eslint-plugin-no-loops": "^0.3.0", - "eslint-plugin-prettier": "^4.2.1", - "obsidian": "latest", - "prettier": "^2.7.1", - "tslib": "2.4.0", - "typescript": "4.7.4", - "xo": "^0.60.0" - }, - "dependencies": { - "@azure/msal-common": "^14.16.0", - "@azure/msal-node": "^1.14.2", - "@microsoft/microsoft-graph-client": "^3.0.2", - "@microsoft/microsoft-graph-types": "^2.25.0", - "eventemitter2": "^6.4.5", - "node-fetch": "^2.6.1" - }, - "xo": { - "space": true, - "rules": { - "unicorn/filename-case": [ - "error", - { - "case": "camelCase" - } - ] - } - } -} + "name": "obsidian-mstodo-sync", + "version": "1.0.1", + "description": "This is a MsTodoSync plugin for Obsidian (https://obsidian.md)", + "main": "main.js", + "scripts": { + "preinstall": "npx only-allow pnpm", + "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "dev": "node esbuild.config.mjs", + "version": "node version-bump.mjs && git add manifest.json versions.json", + "lint": "eslint ./src --ext .ts", + "lint:fix": "eslint ./src --ext .ts --fix", + "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", + "test": "xo" + }, + "keywords": [], + "author": "", + "license": "MIT", + "devDependencies": { + "@types/node": "^16.11.6", + "@types/node-fetch": "^2.6.2", + "@typescript-eslint/eslint-plugin": "5.29.0", + "@typescript-eslint/parser": "5.29.0", + "builtin-modules": "3.3.0", + "esbuild": "0.14.47", + "eslint": "^7.22.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-import": "^2.22.1", + "eslint-plugin-no-loops": "^0.3.0", + "eslint-plugin-prettier": "^4.2.1", + "obsidian": "latest", + "prettier": "^2.7.1", + "tslib": "2.4.0", + "typescript": "4.7.4", + "xo": "^0.60.0" + }, + "dependencies": { + "@azure/msal-common": "^14.16.0", + "@azure/msal-node": "^1.14.2", + "@microsoft/microsoft-graph-client": "^3.0.2", + "@microsoft/microsoft-graph-types": "^2.25.0", + "eventemitter2": "^6.4.5", + "node-fetch": "^2.6.1" + }, + "xo": { + "space": 4, + "rules": { + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "interface", + "format": [ + "PascalCase" + ], + "custom": { + "regex": "^I[A-Z]", + "match": true + } + } + ], + "@typescript-eslint/consistent-type-definitions": [ + "error", + "interface" + ], + "unicorn/filename-case": [ + "error", + { + "case": "camelCase" + } + ] + } + } +} \ No newline at end of file diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index 7ffb881..fd4c0eb 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -6,98 +6,101 @@ import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; import {t} from 'src/lib/lang'; export class MicrosoftClientProvider { - private get clientId() { - return 'a1172059-5f55-45cd-9665-8dccc98c2587'; - } - - private get authority() { - return 'https://login.microsoftonline.com/consumers'; - } + private get clientId() { + return 'a1172059-5f55-45cd-9665-8dccc98c2587'; + } - private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; - private readonly pca: msal.PublicClientApplication; - private readonly adapter: DataAdapter; - private readonly cachePath: string; + private get authority() { + return 'https://login.microsoftonline.com/consumers'; + } - constructor(app: App) { - this.adapter = app.vault.adapter; - this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; + private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; + private readonly pca: msal.PublicClientApplication; + private readonly adapter: DataAdapter; + private readonly app: App; + private readonly cachePath: string; - const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { - if (await this.adapter.exists(this.cachePath)) { - cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); - } - }; + constructor(app: App) { + this.adapter = app.vault.adapter; + this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; + this.app = app; - const afterCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { - if (cacheContext.cacheHasChanged) { - await this.adapter.write(this.cachePath, cacheContext.tokenCache.serialize()); - } - }; + const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { + if (await this.adapter.exists(this.cachePath)) { + cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); + } + }; - const cachePlugin = { - beforeCacheAccess, - afterCacheAccess, - }; - const config = { - auth: { - clientId: this.clientId, - authority: this.authority, - }, - cache: { - cachePlugin, - }, - }; - this.pca = new msal.PublicClientApplication(config); - } + const afterCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { + if (cacheContext.cacheHasChanged) { + await this.adapter.write(this.cachePath, cacheContext.tokenCache.serialize()); + } + }; - public async getClient() { - const authProvider = async (callback: (argument0: string, argument1: string) => void) => { - const accessToken = await this.getAccessToken(); - const error = ' '; - callback(error, accessToken); - }; + const cachePlugin = { + beforeCacheAccess, + afterCacheAccess, + }; + const config = { + auth: { + clientId: this.clientId, + authority: this.authority, + }, + cache: { + cachePlugin, + }, + }; + this.pca = new msal.PublicClientApplication(config); + } - return Client.init({ - authProvider, - }); - } + public async getClient() { + const authProvider = async (callback: (argument0: string, argument1: string) => void) => { + const accessToken = await this.getAccessToken(); + const error = ' '; + callback(error, accessToken); + }; - private async getAccessToken() { - const msalCacheManager = this.pca.getTokenCache(); - if (await this.adapter.exists(this.cachePath)) { - msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); + return Client.init({ + authProvider, + }); } - const accounts = await msalCacheManager.getAllAccounts(); - if (accounts.length === 0) { - return this.authByDevice(); - } + private async getAccessToken() { + const msalCacheManager = this.pca.getTokenCache(); + if (await this.adapter.exists(this.cachePath)) { + msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); + } - return this.authByCache(accounts[0]); - } + const accounts = await msalCacheManager.getAllAccounts(); + if (accounts.length === 0) { + return this.authByDevice(); + } - private async authByDevice(): Promise { - const deviceCodeRequest = { - async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { - const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); - await navigator.clipboard.writeText(response.userCode); - new MicrosoftAuthModal(response.userCode, response.verificationUri).open(); - console.log(t('Notice_DeviceCodeCopiedToClipboard'), response.userCode); - }, - scopes: this.scopes, - }; - return this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then(request => request === null ? 'error' : request.accessToken); - } + return this.authByCache(accounts[0]); + } + + private async authByDevice(): Promise { + const app = this.app; + const deviceCodeRequest = { + async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { + const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); + await navigator.clipboard.writeText(response.userCode); + new MicrosoftAuthModal(app, response.userCode, response.verificationUri).open(); + console.log(t('Notice_DeviceCodeCopiedToClipboard'), response.userCode); + }, + scopes: this.scopes, + }; + return this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then(request => request === null ? 'error' : request.accessToken); + } - private async authByCache(account: msal.AccountInfo): Promise { - const silentRequest = { - account, - scopes: this.scopes, - }; - return this.pca - .acquireTokenSilent(silentRequest) - .then(request => request === null ? 'error' : request.accessToken) - .catch(async () => this.authByDevice()); - } + private async authByCache(account: msal.AccountInfo): Promise { + const silentRequest = { + account, + scopes: this.scopes, + }; + return this.pca + .acquireTokenSilent(silentRequest) + .then(request => request === null ? 'error' : request.accessToken) + .catch(async () => this.authByDevice()); + } } diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 73c4609..227e320 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -6,106 +6,160 @@ import {log, logging} from '../lib/logging.js'; import {MicrosoftClientProvider} from './microsoftClientProvider.js'; export class TodoApi { - private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); - - private client: Client; - - constructor(app: App) { - new MicrosoftClientProvider(app).getClient().then(client => { - this.client = client; - }).catch(() => { - const notice = new Notice(t('Notice_UnableToAcquireClient')); - }); - } - - // List operation - async getLists(searchPattern?: string): Promise { - const endpoint = '/me/todo/lists'; - const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; - return Promise.all( - todoLists.map(async taskList => { - const containedTasks = await this.getListTasks(taskList.id, searchPattern); - return { - ...taskList, - tasks: containedTasks, - }; - }), - ); - } - - async getListIdByName(listName: string | undefined): Promise { - if (!listName) { - return; - } - - const endpoint = '/me/todo/lists'; - const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); // eslint-disable-line @typescript-eslint/no-unsafe-assignment - const resource: TodoTaskList[] = response.value as TodoTaskList[]; - if (!resource || resource.length === 0) { - return; - } + private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); - const target = resource[0]; - return target.id; - } + private client: Client; - async getList(listId: string | undefined): Promise { - if (!listId) { - return; + constructor(app: App) { + new MicrosoftClientProvider(app).getClient().then(client => { + this.client = client; + }).catch(() => { + const notice = new Notice(t('Notice_UnableToAcquireClient')); + }); } - const endpoint = `/me/todo/lists/${listId}`; - return (await this.client.api(endpoint).get()) as TodoTaskList; - } - - async createTaskList(displayName: string | undefined): Promise { - if (!displayName) { - return; + /** + * Retrieves the lists of tasks from the Todo API. + * + * @param searchPattern - An optional search pattern to filter tasks within the lists. + * @returns A promise that resolves to an array of `TodoTaskList` objects, each containing their respective tasks, or `undefined` if no lists are found. + */ + async getLists(searchPattern?: string): Promise { + const endpoint = '/me/todo/lists'; + const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; + return Promise.all( + todoLists.map(async taskList => { + const containedTasks = await this.getListTasks(taskList.id, searchPattern); + return { + ...taskList, + tasks: containedTasks, + }; + }), + ); } - return this.client.api('/me/todo/lists').post({ - displayName, - }); - } - - // Task operation - async getListTasks(listId: string | undefined, searchText?: string): Promise { - if (!listId) { - return; + /** + * Retrieves the ID of a to-do list by its name. + * + * @param listName - The name of the to-do list to search for. If undefined, the function returns immediately. + * @returns A promise that resolves to the ID of the to-do list if found, otherwise undefined. + * + * @throws Will throw an error if the API request fails. + */ + async getListIdByName(listName: string | undefined): Promise { + if (!listName) { + return; + } + + const endpoint = '/me/todo/lists'; + const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); // eslint-disable-line @typescript-eslint/no-unsafe-assignment + const resource: TodoTaskList[] = response.value as TodoTaskList[]; + if (!resource || resource.length === 0) { + return; + } + + const target = resource[0]; + return target.id; } - const endpoint = `/me/todo/lists/${listId}/tasks`; - if (!searchText) { - return; + /** + * Retrieves a TodoTaskList by its ID. + * + * @param listId - The ID of the TodoTaskList to retrieve. If undefined, the function returns undefined. + * @returns A promise that resolves to the TodoTaskList if found, or undefined if the listId is not provided. + */ + async getList(listId: string | undefined): Promise { + if (!listId) { + return; + } + + const endpoint = `/me/todo/lists/${listId}`; + return (await this.client.api(endpoint).get()) as TodoTaskList; } - const res = await this.client - .api(endpoint) - .filter(searchText) - .get() - .catch(error => { - new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); - }); - if (!res) { - return; + /** + * Creates a new task list with the given display name. + * + * @param displayName - The name to be displayed for the new task list. If undefined, the task list will not be created. + * @returns A promise that resolves to the created TodoTaskList object, or undefined if the display name is not provided. + */ + async createTaskList(displayName: string | undefined): Promise { + if (!displayName) { + return; + } + + return this.client.api('/me/todo/lists').post({ + displayName, + }); } - return res.value as TodoTask[]; - } + /** + * Retrieves a list of tasks from a specified to-do list. + * + * @param listId - The ID of the to-do list. If undefined, the function will return immediately. + * @param searchText - Optional search text to filter the tasks. If not provided, the function will return immediately. + * @returns A promise that resolves to an array of `TodoTask` objects, or undefined if the listId or searchText is not provided, or if an error occurs. + */ + async getListTasks(listId: string | undefined, searchText?: string): Promise { + if (!listId) { + return; + } + + const endpoint = `/me/todo/lists/${listId}/tasks`; + if (!searchText) { + return; + } + + const res = await this.client + .api(endpoint) + .filter(searchText) + .get() + .catch(error => { + new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); + }); + if (!res) { + return; + } + + return res.value as TodoTask[]; + } - async getTask(listId: string, taskId: string): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return (await this.client.api(endpoint).get()) as TodoTask; - } + /** + * Retrieves a specific task from a to-do list. + * + * @param listId - The ID of the to-do list containing the task. + * @param taskId - The ID of the task to retrieve. + * @returns A promise that resolves to the `TodoTask` object if found, or `undefined` if not found. + */ + async getTask(listId: string, taskId: string): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + return (await this.client.api(endpoint).get()) as TodoTask; + } - async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks`; - this.logger.debug('Creating task from endpoint', endpoint); - return this.client.api(endpoint).post(toDo); - } + /** + * Creates a new task in the specified To-Do list. + * + * @param listId - The ID of the To-Do list where the task will be created. If undefined, the task will not be created. + * @param toDo - The task details to be created. + * @returns A promise that resolves to the created TodoTask. + */ + async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks`; + this.logger.debug('Creating task from endpoint', endpoint); + return this.client.api(endpoint).post(toDo); + } - async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return this.client.api(endpoint).patch(toDo); - } + /** + * Updates a task in the specified To-Do list. + * + * @param listId - The ID of the To-Do list. Can be undefined. + * @param taskId - The ID of the task to update. + * @param toDo - The updated task details. + * @returns A promise that resolves to the updated task. + */ + async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + toDo.linkedResources = undefined; + return this.client.api(endpoint).patch(toDo); + } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 8178d3a..24e4465 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,172 +1,149 @@ +/* eslint-disable max-params */ import {type Editor, type EditorPosition, Notice} from 'obsidian'; import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask'; import type MsTodoSync from '../main.js'; import {type TodoApi} from '../api/todoApi.js'; -import {type MsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; +import {type IMsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; import {t} from '../lib/lang.js'; import {log, logging} from '../lib/logging.js'; export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { - const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; - const blocklistMatch = regex.exec(line.trim()); - if (blocklistMatch) { - const blocklink = blocklistMatch[1]; - const taskId = plugin.settings.taskIdLookup[blocklink]; - console.log(taskId); - return taskId; - } - - return ''; + const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; + const blocklistMatch = regex.exec(line.trim()); + if (blocklistMatch) { + const blockLink = blocklistMatch[1]; + const taskId = plugin.settings.taskIdLookup[blockLink]; + console.log(taskId); + return taskId; + } + + return ''; } -type Selection = { - start: EditorPosition; - end?: EditorPosition; - lines: number[]; -}; - -export async function getCurrentLinesFromEditor(editor: Editor): Promise { - log( - 'info', - `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( - 'anchor', - )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, - ); - - // Const activeFile = this.app.workspace.getActiveFile(); - // const source = await this.app.vault.read(activeFile); - - let start: EditorPosition; - let end: EditorPosition; - // Let lines: string[] = []; - let lines: number[] = []; - if (editor.somethingSelected()) { - start = editor.getCursor('from'); - end = editor.getCursor('to'); - // Lines = source.split('\n').slice(start.line, end.line + 1); - lines = Array.from({length: end.line + 1 - start.line}, (v, k) => k + start.line); - } else { - start = editor.getCursor(); - end = editor.getCursor(); - // Lines = source.split('\n').slice(start.line, end.line + 1); - lines.push(start.line); - } - - return { - start, - end, - lines, - }; +interface ISelection { + start: EditorPosition; + end?: EditorPosition; + lines: number[]; +} + +/** + * Retrieves the current lines from the editor based on the cursor position or selection. + * + * @param editor - The editor instance from which to get the current lines. + * @returns A promise that resolves to a Selection object containing: + * - `start`: The starting position of the cursor or selection. + * - `end`: The ending position of the cursor or selection. + * - `lines`: An array of line numbers that are currently selected or where the cursor is located. + */ +export async function getCurrentLinesFromEditor(editor: Editor): Promise { + log( + 'info', + `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor('anchor')}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + ); + + // Const activeFile = this.app.workspace.getActiveFile(); + // const source = await this.app.vault.read(activeFile); + + let start: EditorPosition; + let end: EditorPosition; + // Let lines: string[] = []; + let lines: number[] = []; + if (editor.somethingSelected()) { + start = editor.getCursor('from'); + end = editor.getCursor('to'); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines = Array.from({length: end.line + 1 - start.line}, (v, k) => k + start.line); + } else { + start = editor.getCursor(); + end = editor.getCursor(); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines.push(start.line); + } + + return { + start, + end, + lines, + }; } +/** + * Posts tasks to Microsoft To Do from the selected lines in the editor. + * + * @param todoApi - The TodoApi instance used to interact with Microsoft To Do. + * @param listId - The ID of the list where the tasks will be posted. If undefined, a notice will be shown to set the list name. + * @param editor - The editor instance from which the tasks will be extracted. + * @param fileName - The name of the file being edited. If undefined, an empty string will be used. + * @param plugin - The MsTodoSync plugin instance. + * @param replace - Optional. If true, the original tasks in the editor will be replaced with the new tasks. Defaults to false. + * + * @returns A promise that resolves when the tasks have been posted and the file has been modified. + */ export async function postTask( - todoApi: TodoApi, - listId: string | undefined, - editor: Editor, - fileName: string | undefined, - plugin: MsTodoSync, - replace?: boolean, + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, + replace?: boolean, ) { - const logger = logging.getLogger('mstodo-sync.command.post'); - - // If (!editor.somethingSelected()) { - // new Notice(t('CommandNotice_NothingSelected')); - // return; - // } - if (!listId) { - new Notice(t('CommandNotice_SetListName')); - return; - } - - new Notice(t('CommandNotice_CreatingToDo'), 3000); - // Const formatted = editor - // .getSelection() - // .replace(/\*|^> |^#* |- /gm, '') - // // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .split('\n') - // .filter((s) => s != ''); - const activeFile = this.app.workspace.getActiveFile(); - const source = await this.app.vault.read(activeFile); - const {lines} = await getCurrentLinesFromEditor(editor); - - const split = source.split('\n'); - const modifiedPage = await Promise.all( - split.map(async (line: string, index: number) => { - if (!lines.includes(index)) { - return line; - } - - const todo = new ObsidianTodoTask(plugin, line, fileName ?? ''); - - // If there is a block link in the line, we will try to find - // the task id from the block link and update the task instead. - if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`); - - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask.id}`); - } else { - logger.debug(`Creating Task: ${todo.title}`); - logger.debug(`Creating Task: ${listId}`); + const logger = logging.getLogger('mstodo-sync.command.post'); + + // If (!editor.somethingSelected()) { + // new Notice(t('CommandNotice_NothingSelected')); + // return; + // } + if (!listId) { + const notice = new Notice(t('CommandNotice_SetListName')); + return; + } - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + const notice = new Notice(t('CommandNotice_CreatingToDo'), 3000); + const activeFile = plugin.app.workspace.getActiveFile(); + if (activeFile === null) { + return; + } - todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id ?? ''); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - } - - if (replace) { - return todo.getMarkdownTask(true); - } - - return line; - }), - ); - - await this.app.vault.modify(activeFile, modifiedPage.join('\n')); - - // Return split.join('\n'); - - // log('debug', formatted.join(' :: ')); - // Promise.all( - // formatted.map(async (s) => { - // const todo = new ObsidianTodoTask(plugin, s, fileName ?? ''); - - // // If there is a block link in the line, we will try to find - // // the task id from the block link and update the task instead. - // if (todo.hasBlockLink && todo.id) { - // logger.debug(`Updating Task: ${todo.title}`); - - // const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - // logger.debug(`updated: ${returnedTask.id}`); - // } else { - // logger.debug(`Creating Task: ${todo.title}`); - - // const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); - - // todo.status = returnedTask.status; - // todo.cacheTaskId(returnedTask.id ?? ''); - // logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - // } - - // return todo; - // }), - // ).then((res) => { - // new Notice('创建待办成功√'); - // if (replace) { - // editor.replaceSelection( - // res - // .map((i) => { - // logger.debug('Processed blockLink', i.blockLink); - // return i.getMarkdownTask(); - // }) - // .join('\n'), - // ); - // } - // }); + const source = await plugin.app.vault.read(activeFile); + const {lines} = await getCurrentLinesFromEditor(editor); + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + if (!lines.includes(index)) { + return line; + } + + const todo = new ObsidianTodoTask(plugin.settingsManager, line, fileName ?? ''); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`); + + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } else { + logger.debug(`Creating Task: ${todo.title}`); + logger.debug(`Creating Task: ${listId}`); + + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + todo.status = returnedTask.status; + await todo.cacheTaskId(returnedTask.id ?? ''); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + if (replace) { + return todo.getMarkdownTask(true); + } + + return line; + }), + ); + + await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } // Experimental @@ -183,162 +160,160 @@ export async function postTask( // - [ ] Task Two // Lines are processed until the next line is blank or not indented by two spaces. // Also EOF will stop processing. -// TODO: // Allow variable depth or match column of first [ export async function postTaskAndChildren( - todoApi: TodoApi, - listId: string | undefined, - editor: Editor, - fileName: string | undefined, - plugin: MsTodoSync, - push = true, + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, + push = true, ) { - const logger = logging.getLogger('mstodo-sync.command.post'); + const logger = logging.getLogger('mstodo-sync.command.post'); - if (!listId) { - new Notice(t('CommandNotice_SetListName')); - return; - } + if (!listId) { + const notice = new Notice(t('CommandNotice_SetListName')); + return; + } - new Notice(t('CommandNotice_CreatingToDo'), 3000); + const notice = new Notice(t('CommandNotice_CreatingToDo'), 3000); - const cursorLocation = editor.getCursor(); - const topLevelTask = editor.getLine(cursorLocation.line); - logger.debug(`topLevelTask: ${topLevelTask}`); - // Logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); + const cursorLocation = editor.getCursor(); + const topLevelTask = editor.getLine(cursorLocation.line); + logger.debug(`topLevelTask: ${topLevelTask}`); + // Logger.debug(`cursorLocation: ${cursorLocation.line}`, cursorLocation); - let body = ''; - const childTasks: string[] = []; + let body = ''; + const childTasks: string[] = []; - // Get all lines including the line the cursor is on. - const lines = editor.getValue().split('\n').slice(cursorLocation.line); - // Logger.debug(`editor: ${cursorLocation}`, lines); + // Get all lines including the line the cursor is on. + const lines = editor.getValue().split('\n').slice(cursorLocation.line); + // Logger.debug(`editor: ${cursorLocation}`, lines); - // Find the end of section which a blank line or a line that is not indented by two spaces. - const endLine = lines.findIndex( + // Find the end of section which a blank line or a line that is not indented by two spaces. + const endLine = lines.findIndex( // (line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, - (line, index) => line.length === 0 && index > 0, - ); - logger.debug(`endLine: ${endLine}`); + (line, index) => line.length === 0 && index > 0, + ); + logger.debug(`endLine: ${endLine}`); - // Scan lines below task for sub tasks and body. - for (const [index, line] of lines.slice(1, endLine).entries()) { + // Scan lines below task for sub tasks and body. + for (const [index, line] of lines.slice(1, endLine).entries()) { // Logger.debug(`processing line: ${index} -- ${line}`); - if (line.startsWith(' - [')) { - childTasks.push(line.trim()); - } else { - // Remove the two spaces at the beginning of the line, will be added back on sync. - // on sync the body will be indented by two spaces and the tasks will be appended at this point. - body += line.trim() + '\n'; + if (line.startsWith(' - [')) { + childTasks.push(line.trim()); + } else { + // Remove the two spaces at the beginning of the line, will be added back on sync. + // on sync the body will be indented by two spaces and the tasks will be appended at this point. + body += line.trim() + '\n'; + } } - } - - logger.debug(`body: ${body}`); - logger.debug(`childTasks: ${childTasks}`, childTasks); - - const todo = new ObsidianTodoTask(plugin, topLevelTask, fileName ?? ''); - todo.setBody(body); - for (const childTask of childTasks) { - todo.addChecklistItem(childTask); - } - - logger.debug(`updated: ${todo.title}`, todo); - - if (todo.hasBlockLink && todo.id) { - logger.debug(`Updating Task: ${todo.title}`, todo.getTodoTask()); - - // Const currentTaskState = await todoApi.getTask(listId, todo.id); - let returnedTask; - if (push) { - returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - // TODO Push the checklist items... - todo.checklistItems = returnedTask.checklistItems; - todo.status = returnedTask.status; - todo.body = returnedTask.body; - } else { - returnedTask = await todoApi.getTask(listId, todo.id); - if (returnedTask) { - todo.checklistItems = returnedTask.checklistItems; - todo.status = returnedTask.status; - todo.body = returnedTask.body; - } + + logger.debug(`body: ${body}`); + logger.debug(`childTasks: ${childTasks}`, childTasks); + + const todo = new ObsidianTodoTask(plugin.settingsManager, topLevelTask, fileName ?? ''); + todo.setBody(body); + for (const childTask of childTasks) { + todo.addChecklistItem(childTask); } - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask?.id}`, returnedTask); - } else { - logger.debug(`Creating Task: ${todo.title}`); + logger.debug(`updated: ${todo.title}`, todo); + + if (todo.hasBlockLink && todo.id) { + logger.debug(`Updating Task: ${todo.title}`, todo.getTodoTask()); + + // Const currentTaskState = await todoApi.getTask(listId, todo.id); + let returnedTask; + if (push) { + returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + // Push the checklist items... + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } else { + returnedTask = await todoApi.getTask(listId, todo.id); + if (returnedTask) { + todo.checklistItems = returnedTask.checklistItems; + todo.status = returnedTask.status; + todo.body = returnedTask.body; + } + } + + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask?.id}`, returnedTask); + } else { + logger.debug(`Creating Task: ${todo.title}`); - const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask(true)); + const returnedTask = await todoApi.createTaskFromToDo(listId, todo.getTodoTask(true)); - todo.status = returnedTask.status; - todo.cacheTaskId(returnedTask.id ?? ''); - logger.debug(`blocklink: ${todo.blockLink}, taskId: ${todo.id}`, todo); - } + todo.status = returnedTask.status; + await todo.cacheTaskId(returnedTask.id ?? ''); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } - // Update the task on the page. - const start = getLineStartPos(cursorLocation.line); - const end = getLineEndPos(cursorLocation.line + endLine, editor); + // Update the task on the page. + const start = getLineStartPos(cursorLocation.line); + const end = getLineEndPos(cursorLocation.line + endLine, editor); - editor.replaceRange(todo.getMarkdownTask(false), start, end); + editor.replaceRange(todo.getMarkdownTask(false), start, end); } function getLineStartPos(line: number): EditorPosition { - return { - line, - ch: 0, - }; + return { + line, + ch: 0, + }; } function getLineEndPos(line: number, editor: Editor): EditorPosition { - return { - line, - ch: editor.getLine(line).length, - }; + return { + line, + ch: editor.getLine(line).length, + }; } -export async function createTodayTasks(todoApi: TodoApi, settings: MsTodoSyncSettings, editor?: Editor) { - new Notice('获取微软待办中', 3000); - const now = globalThis.moment(); - const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; - const taskLists = await todoApi.getLists(pattern); - if (!taskLists || taskLists.length === 0) { - new Notice('任务列表为空'); - return; - } - - const segments = taskLists - .map(taskList => { - if (!taskList.tasks || taskList.tasks.length === 0) { +export async function createTodayTasks(todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { + const notice = new Notice('获取微软待办中', 3000); + const now = globalThis.moment(); + const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; + const taskLists = await todoApi.getLists(pattern); + if (!taskLists || taskLists.length === 0) { + const notice = new Notice('任务列表为空'); return; - } - - taskList.tasks.sort((a, b) => (a.status == 'completed' ? 1 : -1)); - const lines = taskList.tasks?.map(task => { - const formattedCreateDate = globalThis - .moment(task.createdDateTime) - .format(settings.displayOptions_DateFormat); - const done = task.status == 'completed' ? 'x' : ' '; - const createDate + } + + const segments = taskLists + .map(taskList => { + if (!taskList.tasks || taskList.tasks.length === 0) { + return; + } + + taskList.tasks.sort((a, b) => (a.status == 'completed' ? 1 : -1)); + const lines = taskList.tasks?.map(task => { + const formattedCreateDate = globalThis + .moment(task.createdDateTime) + .format(settings.displayOptions_DateFormat); + const done = task.status == 'completed' ? 'x' : ' '; + const createDate = formattedCreateDate == now.format(settings.displayOptions_DateFormat) - ? '' - : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; - const body = task.body?.content ? `${settings.displayOptions_TaskBodyPrefix}${task.body.content}` : ''; + ? '' + : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; + const body = task.body?.content ? `${settings.displayOptions_TaskBodyPrefix}${task.body.content}` : ''; - return `- [${done}] ${task.title} ${createDate} ${body}`; - }); - return `**${taskList.displayName}** + return `- [${done}] ${task.title} ${createDate} ${body}`; + }); + return `**${taskList.displayName}** ${lines?.join('\n')} `; - }) - .filter(s => s != undefined) - .join('\n\n'); - - new Notice('待办列表已获取'); - if (editor) { - editor.replaceSelection(segments); - } else { - return segments; - } + }) + .filter(s => s != undefined) + .join('\n\n'); + + if (editor) { + editor.replaceSelection(segments); + } else { + return segments; + } } diff --git a/src/gui/microsoftAuthModal.ts b/src/gui/microsoftAuthModal.ts index 7a18fb3..52b3664 100644 --- a/src/gui/microsoftAuthModal.ts +++ b/src/gui/microsoftAuthModal.ts @@ -1,28 +1,28 @@ -import {Modal} from 'obsidian'; +import {type App, Modal} from 'obsidian'; import {t} from '../lib/lang.js'; export class MicrosoftAuthModal extends Modal { - constructor(private readonly deviceCode: string, private readonly authUrl: string) { - super(app); - } + constructor(app: App, private readonly deviceCode: string, private readonly authUrl: string) { + super(app); + } - onOpen(): void { - const {contentEl} = this; + onOpen(): void { + const {contentEl} = this; - contentEl.empty(); - contentEl.addClass('auth-modal'); + contentEl.empty(); + contentEl.addClass('auth-modal'); - contentEl.createEl('h2', {text: t('Auth_Heading_VerificationRequiredForFirstUse')}); - // ContentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) - contentEl.createEl('h4', {text: this.deviceCode}); - // ContentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) - contentEl.createEl('div', {text: t('Auth_Text_CodeCopiedClipboard')}); - contentEl.createEl('a', {text: this.authUrl, href: this.authUrl}); - contentEl.createEl('hr'); - } + contentEl.createEl('h2', {text: t('Auth_Heading_VerificationRequiredForFirstUse')}); + // ContentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) + contentEl.createEl('h4', {text: this.deviceCode}); + // ContentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) + contentEl.createEl('div', {text: t('Auth_Text_CodeCopiedClipboard')}); + contentEl.createEl('a', {text: this.authUrl, href: this.authUrl}); + contentEl.createEl('hr'); + } - onClose(): void { - const {contentEl} = this; - contentEl.empty(); - } + onClose(): void { + const {contentEl} = this; + contentEl.empty(); + } } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index c02c8c5..5da09de 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,103 +1,105 @@ -import {Notice, PluginSettingTab, Setting} from 'obsidian'; +import { + type App, Notice, PluginSettingTab, Setting, +} from 'obsidian'; import type MsTodoSync from '../main.js'; import {t} from '../lib/lang.js'; import {type LogOptions} from '../lib/logging.js'; -export type MsTodoSyncSettings = { - todoListSync: { - listName: string | undefined; - listId: string | undefined; - }; - - diary: { - folder: string; - format: string; - stayWithPN: boolean; - }; - - displayOptions_DateFormat: string; - displayOptions_TimeFormat: string; - displayOptions_TaskCreatedPrefix: string; - displayOptions_TaskDuePrefix: string; - displayOptions_TaskStartPrefix: string; - displayOptions_TaskBodyPrefix: string; - displayOptions_ReplaceAddCreatedAt: boolean; - displayOptions_ReplacementFormat: string; - - // Importance - // The importance of the task. Possible values - // are: low, normal, high. - // By default it is normal and the absence of a - // indicator will also mean normal. - displayOptions_TaskImportance_Low: string; - displayOptions_TaskImportance_Normal: string; - displayOptions_TaskImportance_High: string; - - displayOptions_TaskStatus_NotStarted: string; - displayOptions_TaskStatus_InProgress: string; - displayOptions_TaskStatus_Completed: string; - - // Microsoft To Do open handler. - todo_OpenUsingApplicationProtocol: boolean; - - // Logging options. - loggingOptions: LogOptions; - - // Private configuration updated by the plugin and not user. - taskIdLookup: Record; - taskIdIndex: number; -}; +export interface IMsTodoSyncSettings { + todoListSync: { + listName: string | undefined; + listId: string | undefined; + }; + + diary: { + folder: string; + format: string; + stayWithPN: boolean; + }; + + displayOptions_DateFormat: string; + displayOptions_TimeFormat: string; + displayOptions_TaskCreatedPrefix: string; + displayOptions_TaskDuePrefix: string; + displayOptions_TaskStartPrefix: string; + displayOptions_TaskBodyPrefix: string; + displayOptions_ReplaceAddCreatedAt: boolean; + displayOptions_ReplacementFormat: string; + + // Importance + // The importance of the task. Possible values + // are: low, normal, high. + // By default it is normal and the absence of a + // indicator will also mean normal. + displayOptions_TaskImportance_Low: string; + displayOptions_TaskImportance_Normal: string; + displayOptions_TaskImportance_High: string; + + displayOptions_TaskStatus_NotStarted: string; + displayOptions_TaskStatus_InProgress: string; + displayOptions_TaskStatus_Completed: string; + + // Microsoft To Do open handler. + todo_OpenUsingApplicationProtocol: boolean; + + // Logging options. + loggingOptions: LogOptions; + + // Private configuration updated by the plugin and not user. + taskIdLookup: Record; + taskIdIndex: number; +} -export const DEFAULT_SETTINGS: MsTodoSyncSettings = { - todoListSync: { - listName: undefined, - listId: undefined, - }, - diary: { - folder: '', - format: '', - stayWithPN: false, - }, - displayOptions_DateFormat: 'YYYY-MM-DD', - displayOptions_TimeFormat: 'HH:mm', - displayOptions_TaskCreatedPrefix: '🔎', - displayOptions_TaskDuePrefix: '📅', - displayOptions_TaskStartPrefix: '🛫', - displayOptions_TaskBodyPrefix: '💡', - displayOptions_ReplaceAddCreatedAt: false, - displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', - - displayOptions_TaskImportance_Low: '🔽', - displayOptions_TaskImportance_Normal: '🔼', - displayOptions_TaskImportance_High: '⏫', - - displayOptions_TaskStatus_NotStarted: ' ', - displayOptions_TaskStatus_InProgress: '/', - displayOptions_TaskStatus_Completed: 'x', - - todo_OpenUsingApplicationProtocol: true, - - loggingOptions: { - minLevels: { - '': 'debug', - 'mstodo-sync': 'debug', +export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { + todoListSync: { + listName: undefined, + listId: undefined, + }, + diary: { + folder: '', + format: '', + stayWithPN: false, }, - }, - taskIdLookup: {'0000ABCD': '0'}, - taskIdIndex: 0, + displayOptions_DateFormat: 'YYYY-MM-DD', + displayOptions_TimeFormat: 'HH:mm', + displayOptions_TaskCreatedPrefix: '🔎', + displayOptions_TaskDuePrefix: '📅', + displayOptions_TaskStartPrefix: '🛫', + displayOptions_TaskBodyPrefix: '💡', + displayOptions_ReplaceAddCreatedAt: false, + displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', + + displayOptions_TaskImportance_Low: '🔽', + displayOptions_TaskImportance_Normal: '🔼', + displayOptions_TaskImportance_High: '⏫', + + displayOptions_TaskStatus_NotStarted: ' ', + displayOptions_TaskStatus_InProgress: '/', + displayOptions_TaskStatus_Completed: 'x', + + todo_OpenUsingApplicationProtocol: true, + + loggingOptions: { + minLevels: { + '': 'debug', + 'mstodo-sync': 'debug', + }, + }, + taskIdLookup: {'0000ABCD': '0'}, + taskIdIndex: 0, }; export class MsTodoSyncSettingTab extends PluginSettingTab { - plugin: MsTodoSync; - settings: MsTodoSyncSettings; + plugin: MsTodoSync; + settings: IMsTodoSyncSettings; - constructor(plugin: MsTodoSync) { - super(app, plugin); - this.plugin = plugin; - this.settings = plugin.settings; - } + constructor(app: App, plugin: MsTodoSync) { + super(app, plugin); + this.plugin = plugin; + this.settings = plugin.settings; + } - /** + /** * Creates a setting entry in the settings form * for text based properties. If there is a update * it will save the new value. @@ -109,249 +111,249 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { * @param {(value: string) => any} changeCallback * @memberof MsTodoSyncSettingTab */ - addTextSetting( - containerElement: HTMLElement, - title: string, - description: string, - currentValue: string, - changeCallback: (value: string) => any, - ): void { - new Setting(containerElement) - .setName(t(title)) - .setDesc(t(description)) - .addText(text => - text.setValue(currentValue).onChange(async value => { - changeCallback(value); - await this.plugin.saveSettings(); - }), - ); - } - - display(): void { - const {containerEl} = this; - - containerEl.empty(); - - containerEl.createEl('h2', { - text: `${this.plugin.manifest.name}`, - }); - const span = containerEl.createSpan(); - span.style.fontSize = '0.8em'; - span.innerHTML = `Version ${this.plugin.manifest.version}
${this.plugin.manifest.description} created by ${this.plugin.manifest.author}`; - - new Setting(containerEl) - .setName(t('Settings_Todo_DefaultListName')) - .setDesc(t('Settings_Todo_DefaultListNameDescription')) - .addText(text => - text - // .setPlaceholder('输入Todo列表名称') - .setValue(this.settings.todoListSync.listName ?? '') - .onChange(async value => { - this.settings.todoListSync.listName = value; - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_OpenUsingApplicationProtocolTitle')) - .setDesc(t('Settings_Todo_OpenUsingApplicationProtocolDescription')) - .addToggle(toggle => - toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async value => { - this.settings.todo_OpenUsingApplicationProtocol = value; - await this.plugin.saveSettings(); - }), - ); - - // Formatting Options that user can set - containerEl.createEl('h2', { - text: t('Settings_Todo_Display_Heading'), - }); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_DateFormat')) - .setDesc(t('Settings_Todo_Display_DateFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async value => { - this.settings.displayOptions_DateFormat = value; - await this.plugin.saveSettings(); - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_TimeFormat')) - .setDesc(t('Settings_Todo_Display_TimeFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async value => { - this.settings.displayOptions_TimeFormat = value; - await this.plugin.saveSettings(); - }), - ); - - new Setting(containerEl) - .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) - .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) - .addToggle(toggle => - toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async value => { - this.settings.displayOptions_ReplaceAddCreatedAt = value; - await this.plugin.saveSettings(); - }), - ); - - // Replacement Format: default: - [ ] {{TASK}} - new Setting(containerEl) - .setName(t('Settings_Todo_Display_ReplacementFormat')) - .setDesc(t('Settings_Todo_Display_ReplacementFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async value => { - this.settings.displayOptions_ReplacementFormat = value; - await this.plugin.saveSettings(); - }), - ); - - // Task Importance Indicators - High - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_HighName', - 'Settings_Todo_Display_Importance_HighDescription', - this.settings.displayOptions_TaskImportance_High, - async value => { - this.settings.displayOptions_TaskImportance_High = value; - }, - ); - - // Task Importance Indicators - Normal - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_NormalName', - 'Settings_Todo_Display_Importance_NormalDescription', - this.settings.displayOptions_TaskImportance_Normal, - async value => { - this.settings.displayOptions_TaskImportance_Normal = value; - }, - ); - - // Task Importance Indicators - Low - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Importance_LowName', - 'Settings_Todo_Display_Importance_LowDescription', - this.settings.displayOptions_TaskImportance_Low, - async value => { - this.settings.displayOptions_TaskImportance_Low = value; - }, - ); - - // Task Status Indicator - Not Started - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_NotStartedName', - 'Settings_Todo_Display_Status_NotStartedDescription', - this.settings.displayOptions_TaskStatus_NotStarted, - async value => { - this.settings.displayOptions_TaskStatus_NotStarted = value; - }, - ); - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_InProgressName', - 'Settings_Todo_Display_Status_InProgressDescription', - this.settings.displayOptions_TaskStatus_InProgress, - async value => { - this.settings.displayOptions_TaskStatus_InProgress = value; - }, - ); - this.addTextSetting( - containerEl, - 'Settings_Todo_Display_Status_CompletedName', - 'Settings_Todo_Display_Status_CompletedDescription', - this.settings.displayOptions_TaskStatus_Completed, - async value => { - this.settings.displayOptions_TaskStatus_Completed = value; - }, - ); - - containerEl.createEl('h2', {text: t('Settings_JournalFormatting')}); - new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => - toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { - if (value) { - // @ts-ignore - const PNsetting + addTextSetting( + containerElement: HTMLElement, + title: string, + description: string, + currentValue: string, + changeCallback: (value: string) => any, + ): void { + new Setting(containerElement) + .setName(t(title)) + .setDesc(t(description)) + .addText(text => + text.setValue(currentValue).onChange(async value => { + changeCallback(value); + await this.plugin.saveSettings(); + }), + ); + } + + display(): void { + const {containerEl} = this; + + containerEl.empty(); + + containerEl.createEl('h2', { + text: `${this.plugin.manifest.name}`, + }); + const span = containerEl.createSpan(); + span.style.fontSize = '0.8em'; + span.innerHTML = `Version ${this.plugin.manifest.version}
${this.plugin.manifest.description} created by ${this.plugin.manifest.author}`; + + new Setting(containerEl) + .setName(t('Settings_Todo_DefaultListName')) + .setDesc(t('Settings_Todo_DefaultListNameDescription')) + .addText(text => + text + // .setPlaceholder('输入Todo列表名称') + .setValue(this.settings.todoListSync.listName ?? '') + .onChange(async value => { + this.settings.todoListSync.listName = value; + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_OpenUsingApplicationProtocolTitle')) + .setDesc(t('Settings_Todo_OpenUsingApplicationProtocolDescription')) + .addToggle(toggle => + toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async value => { + this.settings.todo_OpenUsingApplicationProtocol = value; + await this.plugin.saveSettings(); + }), + ); + + // Formatting Options that user can set + containerEl.createEl('h2', { + text: t('Settings_Todo_Display_Heading'), + }); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_DateFormat')) + .setDesc(t('Settings_Todo_Display_DateFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async value => { + this.settings.displayOptions_DateFormat = value; + await this.plugin.saveSettings(); + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_TimeFormat')) + .setDesc(t('Settings_Todo_Display_TimeFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async value => { + this.settings.displayOptions_TimeFormat = value; + await this.plugin.saveSettings(); + }), + ); + + new Setting(containerEl) + .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) + .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) + .addToggle(toggle => + toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async value => { + this.settings.displayOptions_ReplaceAddCreatedAt = value; + await this.plugin.saveSettings(); + }), + ); + + // Replacement Format: default: - [ ] {{TASK}} + new Setting(containerEl) + .setName(t('Settings_Todo_Display_ReplacementFormat')) + .setDesc(t('Settings_Todo_Display_ReplacementFormatDescription')) + .addText(text => + text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async value => { + this.settings.displayOptions_ReplacementFormat = value; + await this.plugin.saveSettings(); + }), + ); + + // Task Importance Indicators - High + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_HighName', + 'Settings_Todo_Display_Importance_HighDescription', + this.settings.displayOptions_TaskImportance_High, + async value => { + this.settings.displayOptions_TaskImportance_High = value; + }, + ); + + // Task Importance Indicators - Normal + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_NormalName', + 'Settings_Todo_Display_Importance_NormalDescription', + this.settings.displayOptions_TaskImportance_Normal, + async value => { + this.settings.displayOptions_TaskImportance_Normal = value; + }, + ); + + // Task Importance Indicators - Low + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Importance_LowName', + 'Settings_Todo_Display_Importance_LowDescription', + this.settings.displayOptions_TaskImportance_Low, + async value => { + this.settings.displayOptions_TaskImportance_Low = value; + }, + ); + + // Task Status Indicator - Not Started + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_NotStartedName', + 'Settings_Todo_Display_Status_NotStartedDescription', + this.settings.displayOptions_TaskStatus_NotStarted, + async value => { + this.settings.displayOptions_TaskStatus_NotStarted = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_InProgressName', + 'Settings_Todo_Display_Status_InProgressDescription', + this.settings.displayOptions_TaskStatus_InProgress, + async value => { + this.settings.displayOptions_TaskStatus_InProgress = value; + }, + ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_Status_CompletedName', + 'Settings_Todo_Display_Status_CompletedDescription', + this.settings.displayOptions_TaskStatus_Completed, + async value => { + this.settings.displayOptions_TaskStatus_Completed = value; + }, + ); + + containerEl.createEl('h2', {text: t('Settings_JournalFormatting')}); + new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => + toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { + if (value) { + // @ts-ignore + const PNsetting // @ts-ignore = app.plugins.plugins['periodic-notes']; - if (PNsetting) { - const {format, folder} = PNsetting.settings.daily; - this.settings.diary = { - format, - folder, - stayWithPN: true, - }; - console.log('🚀 ~ this.settings.diary', this.settings.diary); - await this.plugin.saveSettings(); - this.display(); - } else { - new Notice('Periodic Notes 中未设置'); - this.display(); - } + if (PNsetting) { + const {format, folder} = PNsetting.settings.daily; + this.settings.diary = { + format, + folder, + stayWithPN: true, + }; + console.log('🚀 ~ this.settings.diary', this.settings.diary); + await this.plugin.saveSettings(); + this.display(); + } else { + new Notice('Periodic Notes 中未设置'); + this.display(); + } + } else { + this.settings.diary.stayWithPN = false; + await this.plugin.saveSettings(); + this.display(); + } + }), + ); + + const dateFormat = new Setting(containerEl) + .setName(t('Settings_JournalFormatting_DateFormat')) + .setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ) + .addText(text => + text.setValue(this.settings.diary.format).onChange(async value => { + this.settings.diary.format = value; + dateFormat.setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ); + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + + new Setting(containerEl) + .setName(t('Settings_JournalFormatting_Folder')) + .setDesc(t('Settings_JournalFormatting_FolderDescription')) + .addText(text => + text.setValue(this.settings.diary.folder).onChange(async value => { + this.settings.diary.format = value; + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + } + + async hide() { + const listName = this.settings.todoListSync.listName; + + if (this.settings.todoListSync.listId != undefined || !listName) { + if (!listName) { + new Notice('微软同步列表未设置'); + } } else { - this.settings.diary.stayWithPN = false; - await this.plugin.saveSettings(); - this.display(); + let listId = await this.plugin.todoApi.getListIdByName(listName); + listId ||= (await this.plugin.todoApi.createTaskList(listName))?.id; + + if (listId) { + this.settings.todoListSync = { + listName, + listId, + }; + new Notice('设置同步列表成功√'); + await this.plugin.saveSettings(); + } else { + new Notice('创建列表失败'); + } } - }), - ); - - const dateFormat = new Setting(containerEl) - .setName(t('Settings_JournalFormatting_DateFormat')) - .setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' - }`, - ) - .addText(text => - text.setValue(this.settings.diary.format).onChange(async value => { - this.settings.diary.format = value; - dateFormat.setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' - }`, - ); - await this.plugin.saveSettings(); - }), - ) - .setDisabled(this.settings.diary.stayWithPN); - - new Setting(containerEl) - .setName(t('Settings_JournalFormatting_Folder')) - .setDesc(t('Settings_JournalFormatting_FolderDescription')) - .addText(text => - text.setValue(this.settings.diary.folder).onChange(async value => { - this.settings.diary.format = value; - await this.plugin.saveSettings(); - }), - ) - .setDisabled(this.settings.diary.stayWithPN); - } - - async hide() { - const listName = this.settings.todoListSync.listName; - - if (this.settings.todoListSync.listId != undefined || !listName) { - if (!listName) { - new Notice('微软同步列表未设置'); - } - } else { - let listId = await this.plugin.todoApi.getListIdByName(listName); - listId ||= (await this.plugin.todoApi.createTaskList(listName))?.id; - - if (listId) { - this.settings.todoListSync = { - listName, - listId, - }; - new Notice('设置同步列表成功√'); - await this.plugin.saveSettings(); - } else { - new Notice('创建列表失败'); - } } - } } diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index c3baea0..0f89e2e 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -1,74 +1,74 @@ { - "Language": "English", - "Complete": "Complete", - "Archive": "Archive", - "Untitled": "Untitled", - "default": "default", - "Search...": "Search...", - "Enter": "Enter", - "Prepend": "Prepend", - "Append": "Append", - "Sunday": "Sunday", - "Monday": "Monday", - "Tuesday": "Tuesday", - "Wednesday": "Wednesday", - "Thursday": "Thursday", - "Friday": "Friday", - "Saturday": "Saturday", - "Delete": "Delete", - "Cancel": "Cancel", - "today": "today", - "yesterday": "yesterday", - "tomorrow": "tomorrow", - "Close": "Close", - "Submit": "Submit", - "EditorMenu_SyncToTodo": "Sync to Microsoft Todo", - "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft Todo and update", - "PluginTitle": "Microsoft To Do Sync", - "PluginDescription": "An obsidian plugin that syncs Microsoft Todo", - "CommandNotice_NothingSelected": "It seems that nothing is selected", - "CommandNotice_SetListName": "Set the name of the list to synchronize within settings first.", - "CommandNotice_CreatingToDo": "Creating To Do...", - "Settings_Todo_DefaultListName": "The default synchronization Microsoft Todo list name", - "Settings_Todo_DefaultListNameDescription": "If it does not exist, the list is created with that name", - "Settings_Uptimer": "Uptimer", - "Settings_Uptimer_UpTimerEmail": "Uptimer registration email", - "Settings_Uptimer_UpTimerPassword": "Uptimer password", - "Settings_JournalFormatting": "Journal formatting", - "Settings_JournalFormatting_PeriodicNotes": "Consistent with the Periodic Notes plugin", - "Settings_JournalFormatting_DateFormat": "Date format", - "Settings_JournalFormatting_DateFormatDescription": "The current format is", - "Settings_JournalFormatting_Folder": "Folder", - "Settings_JournalFormatting_FolderDescription": "Folder where the diary is stored", - "displayOptions_CreatedInFile": "Created in", - "displayOptions_CreatedAtTime": "Created at", - "Settings_Todo_Display_Heading": "🎨 Task Formatting Options", - "Settings_Todo_Display_DateFormat": "Date format", - "Settings_Todo_Display_DateFormatDescription": "The format used when adding or rendering a date for a task.", - "Settings_Todo_Display_TimeFormat": "Time format", - "Settings_Todo_Display_TimeFormatDescription": "The format used when adding or rendering a time for a task.", - "Settings_Todo_Display_ReplacementFormat": "Replacement Format", - "Settings_Todo_Display_ReplacementFormatDescription": "If you select to replace the task and this is the replacement format, use {{TASK}} as the placeholder", - "Settings_Todo_Display_AddCreatedAtOnReplace": "Add Created At on Replace", - "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "If you select to replace the task and this is enabled 'Created at {Time Format}'", - "EditorMenu_OpenToDo": "Open To Do", - "Settings_Todo_OpenUsingApplicationProtocolTitle": "Open with application protocol?", - "Settings_Todo_OpenUsingApplicationProtocolDescription": "If this is set to true it will open the todo in the locally installed application, set it to off if you want to open the todo in the browser.", - "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", - "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", - "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", - "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", - "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", - "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", - "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", - "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", - "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", - "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", - "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", - "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", - "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", - "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", - "Notice_UnableToAcquireTaskFromConfiguredList": "Unable to acquire task from configured list, check to see it exists and has not been deleted", - "Notice_DeviceCodeOnClipboard": "The device code has been copied to the clipboard, please enter it in the browser interface that opens", - "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard" + "Append": "Append", + "Archive": "Archive", + "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", + "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", + "Cancel": "Cancel", + "Close": "Close", + "CommandNotice_CreatingToDo": "Creating To Do...", + "CommandNotice_NothingSelected": "It seems that nothing is selected", + "CommandNotice_SetListName": "Set the name of the list to synchronize within settings first.", + "Complete": "Complete", + "Delete": "Delete", + "EditorMenu_OpenToDo": "Open To Do", + "EditorMenu_SyncToTodo": "Sync to Microsoft Todo", + "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft Todo and update", + "Enter": "Enter", + "Friday": "Friday", + "Language": "English", + "Monday": "Monday", + "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard", + "Notice_DeviceCodeOnClipboard": "The device code has been copied to the clipboard, please enter it in the browser interface that opens", + "Notice_UnableToAcquireTaskFromConfiguredList": "Unable to acquire task from configured list, check to see it exists and has not been deleted", + "PluginDescription": "An obsidian plugin that syncs Microsoft Todo", + "PluginTitle": "Microsoft To Do Sync", + "Prepend": "Prepend", + "Saturday": "Saturday", + "Search...": "Search...", + "Settings_JournalFormatting": "Journal formatting", + "Settings_JournalFormatting_DateFormat": "Date format", + "Settings_JournalFormatting_DateFormatDescription": "The current format is", + "Settings_JournalFormatting_Folder": "Folder", + "Settings_JournalFormatting_FolderDescription": "Folder where the diary is stored", + "Settings_JournalFormatting_PeriodicNotes": "Consistent with the Periodic Notes plugin", + "Settings_Todo_DefaultListName": "The default synchronization Microsoft Todo list name", + "Settings_Todo_DefaultListNameDescription": "If it does not exist, the list is created with that name", + "Settings_Todo_Display_AddCreatedAtOnReplace": "Add Created At on Replace", + "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "If you select to replace the task and this is enabled 'Created at {Time Format}'", + "Settings_Todo_Display_DateFormat": "Date format", + "Settings_Todo_Display_DateFormatDescription": "The format used when adding or rendering a date for a task.", + "Settings_Todo_Display_Heading": "🎨 Task Formatting Options", + "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", + "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", + "Settings_Todo_Display_ReplacementFormat": "Replacement Format", + "Settings_Todo_Display_ReplacementFormatDescription": "If you select to replace the task and this is the replacement format, use {{TASK}} as the placeholder", + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", + "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", + "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", + "Settings_Todo_Display_TimeFormat": "Time format", + "Settings_Todo_Display_TimeFormatDescription": "The format used when adding or rendering a time for a task.", + "Settings_Todo_OpenUsingApplicationProtocolDescription": "If this is set to true it will open the todo in the locally installed application, set it to off if you want to open the todo in the browser.", + "Settings_Todo_OpenUsingApplicationProtocolTitle": "Open with application protocol?", + "Settings_Uptimer": "Uptimer", + "Settings_Uptimer_UpTimerEmail": "Uptimer registration email", + "Settings_Uptimer_UpTimerPassword": "Uptimer password", + "Submit": "Submit", + "Sunday": "Sunday", + "Thursday": "Thursday", + "Tuesday": "Tuesday", + "Untitled": "Untitled", + "Wednesday": "Wednesday", + "default": "default", + "displayOptions_CreatedAtTime": "Created at", + "displayOptions_CreatedInFile": "Created in", + "today": "today", + "tomorrow": "tomorrow", + "yesterday": "yesterday" } \ No newline at end of file diff --git a/src/lib/locale/zh-cn.json b/src/lib/locale/zh-cn.json index 0a6476c..8de48d2 100644 --- a/src/lib/locale/zh-cn.json +++ b/src/lib/locale/zh-cn.json @@ -1,74 +1,74 @@ { - "Language": "简体中文", - "Complete": "完成", - "Archive": "归档", - "Untitled": "未命名", - "default": "默认", - "Search...": "搜索……", - "Enter": "输入", - "Prepend": "头部", - "Append": "尾部", - "Sunday": "周日", - "Monday": "周一", - "Tuesday": "周二", - "Wednesday": "周三", - "Thursday": "周四", - "Friday": "周五", - "Saturday": "周六", - "Delete": "删除", - "Cancel": "取消", - "today": "今天", - "yesterday": "昨天", - "tomorrow": "明天", - "Close": "关闭", - "Submit": "提交", - "EditorMenu_SyncToTodo": "同步到微软待办", - "EditorMenu_SyncToTodoAndReplace": "同步到微软待办并替换", - "PluginTitle": "Microsoft To Do Sync", - "PluginDescription": "一个可以同步微软Todo的obsidian插件", - "CommandNotice_NothingSelected": "好像没有选中什么", - "CommandNotice_SetListName": "请先设置同步列表", - "CommandNotice_CreatingToDo": "创建待办中...", - "Settings_Todo_DefaultListName": "默认的同步微软Todo列表名称", - "Settings_Todo_DefaultListNameDescription": "如不存在则以该名称创建列表", - "Settings_Uptimer": "Uptimer设置", - "Settings_Uptimer_UpTimerEmail": "uptimer注册邮箱", - "Settings_Uptimer_UpTimerPassword": "uptimer密码", - "Settings_JournalFormatting": "日记格式设置", - "Settings_JournalFormatting_PeriodicNotes": "与 Periodic Notes 插件保持一致", - "Settings_JournalFormatting_DateFormat": "日期格式", - "Settings_JournalFormatting_DateFormatDescription": "当前格式为", - "Settings_JournalFormatting_Folder": "文件夹", - "Settings_JournalFormatting_FolderDescription": "日记存放的文件夹", - "displayOptions_CreatedInFile": "来自笔记", - "displayOptions_CreatedAtTime": "创建于", - "Settings_Todo_Display_Heading": "🎨 待办格式设置", - "Settings_Todo_Display_DateFormat": "日期格式", - "Settings_Todo_Display_DateFormatDescription": "添加或生成待办时显示的日期格式", - "Settings_Todo_Display_TimeFormat": "时间格式", - "Settings_Todo_Display_TimeFormatDescription": "添加或生成待办时显示的时间格式", - "Settings_Todo_Display_ReplacementFormat": "待办替换格式", - "Settings_Todo_Display_ReplacementFormatDescription": "在选择“创建待办并替换”时使用的替换格式, 可以使用{{TASK}}作为占位符", - "Settings_Todo_Display_AddCreatedAtOnReplace": "“创建待办并替换”时添加时间", - "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "在选择“创建待办并替换”时添加当前时间,格式为上面填写的时间格式", - "EditorMenu_OpenToDo": "在微软Todo中打开", - "Settings_Todo_OpenUsingApplicationProtocolTitle": "使用微软Todo桌面应用打开待办", - "Settings_Todo_OpenUsingApplicationProtocolDescription": "选中则使用微软Todo桌面应用打开待办,未选中则在浏览器中打开", - "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", - "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", - "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", - "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", - "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", - "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", - "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", - "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", - "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", - "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", - "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", - "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", - "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", - "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", - "Notice_UnableToAcquireTaskFromConfiguredList": "获取失败,请检查同步列表是否已删除", - "Notice_DeviceCodeOnClipboard": "设备代码已复制到剪贴板,请在打开的浏览器界面输入", - "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板" + "Append": "尾部", + "Archive": "归档", + "Auth_Heading_VerificationRequiredForFirstUse": "Microsoft verification is required for first use", + "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", + "Cancel": "取消", + "Close": "关闭", + "CommandNotice_CreatingToDo": "创建待办中...", + "CommandNotice_NothingSelected": "好像没有选中什么", + "CommandNotice_SetListName": "请先设置同步列表", + "Complete": "完成", + "Delete": "删除", + "EditorMenu_OpenToDo": "在微软Todo中打开", + "EditorMenu_SyncToTodo": "同步到微软待办", + "EditorMenu_SyncToTodoAndReplace": "同步到微软待办并替换", + "Enter": "输入", + "Friday": "周五", + "Language": "简体中文", + "Monday": "周一", + "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板", + "Notice_DeviceCodeOnClipboard": "设备代码已复制到剪贴板,请在打开的浏览器界面输入", + "Notice_UnableToAcquireTaskFromConfiguredList": "获取失败,请检查同步列表是否已删除", + "PluginDescription": "一个可以同步微软Todo的obsidian插件", + "PluginTitle": "Microsoft To Do Sync", + "Prepend": "头部", + "Saturday": "周六", + "Search...": "搜索……", + "Settings_JournalFormatting": "日记格式设置", + "Settings_JournalFormatting_DateFormat": "日期格式", + "Settings_JournalFormatting_DateFormatDescription": "当前格式为", + "Settings_JournalFormatting_Folder": "文件夹", + "Settings_JournalFormatting_FolderDescription": "日记存放的文件夹", + "Settings_JournalFormatting_PeriodicNotes": "与 Periodic Notes 插件保持一致", + "Settings_Todo_DefaultListName": "默认的同步微软Todo列表名称", + "Settings_Todo_DefaultListNameDescription": "如不存在则以该名称创建列表", + "Settings_Todo_Display_AddCreatedAtOnReplace": "“创建待办并替换”时添加时间", + "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "在选择“创建待办并替换”时添加当前时间,格式为上面填写的时间格式", + "Settings_Todo_Display_DateFormat": "日期格式", + "Settings_Todo_Display_DateFormatDescription": "添加或生成待办时显示的日期格式", + "Settings_Todo_Display_Heading": "🎨 待办格式设置", + "Settings_Todo_Display_Importance_HighDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_HighName": "High Priority Indicator", + "Settings_Todo_Display_Importance_LowDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_LowName": "Low Priority Indicator", + "Settings_Todo_Display_Importance_NormalDescription": "Used to display and create/update To Do items if found on line.", + "Settings_Todo_Display_Importance_NormalName": "Medium Priority Indicator", + "Settings_Todo_Display_ReplacementFormat": "待办替换格式", + "Settings_Todo_Display_ReplacementFormatDescription": "在选择“创建待办并替换”时使用的替换格式, 可以使用{{TASK}}作为占位符", + "Settings_Todo_Display_Status_CompletedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_CompletedName": "Completed Status Indicator", + "Settings_Todo_Display_Status_InProgressDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_InProgressName": "In Progress Status Indicator", + "Settings_Todo_Display_Status_NotStartedDescription": "Used between the square brackets in markdown.", + "Settings_Todo_Display_Status_NotStartedName": "Not Started Status Indicator", + "Settings_Todo_Display_TimeFormat": "时间格式", + "Settings_Todo_Display_TimeFormatDescription": "添加或生成待办时显示的时间格式", + "Settings_Todo_OpenUsingApplicationProtocolDescription": "选中则使用微软Todo桌面应用打开待办,未选中则在浏览器中打开", + "Settings_Todo_OpenUsingApplicationProtocolTitle": "使用微软Todo桌面应用打开待办", + "Settings_Uptimer": "Uptimer设置", + "Settings_Uptimer_UpTimerEmail": "uptimer注册邮箱", + "Settings_Uptimer_UpTimerPassword": "uptimer密码", + "Submit": "提交", + "Sunday": "周日", + "Thursday": "周四", + "Tuesday": "周二", + "Untitled": "未命名", + "Wednesday": "周三", + "default": "默认", + "displayOptions_CreatedAtTime": "创建于", + "displayOptions_CreatedInFile": "来自笔记", + "today": "今天", + "tomorrow": "明天", + "yesterday": "昨天" } \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 2cebfcc..82148f2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,238 +1,235 @@ import { - type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Plugin, + type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Platform, Plugin, } from 'obsidian'; import {TodoApi} from './api/todoApi.js'; -import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type MsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; +import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; import { - createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren, + createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import {t} from './lib/lang.js'; import {log, logging} from './lib/logging.js'; +import {SettingsManager} from './utils/settingsManager.js'; export default class MsTodoSync extends Plugin { - settings: MsTodoSyncSettings; - public todoApi: TodoApi; - - // Pulls the meta data for the a page to help with list processing. - getPageMetadata(path: string): CachedMetadata | undefined { - return this.app.metadataCache.getCache(path); - } - - async onload() { - logging.registerConsoleLogger(); - - log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); - - await this.loadSettings(); - // 在右键菜单中注册命令:将选中的文字创建微软待办 - // Register command in the context menu: Create to Do with the selected text - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle(t('EditorMenu_SyncToTodo')).onClick( - async e => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ); + settings: IMsTodoSyncSettings; + public todoApi: TodoApi; + public settingsManager: SettingsManager; + + // Pulls the meta data for the a page to help with list processing. + getPageMetadata(path: string): CachedMetadata | undefined { + return this.app.metadataCache.getCache(path) ?? undefined; + } + + async onload() { + logging.registerConsoleLogger(); + + log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); + + await this.loadSettings(); + + this.registerMenuEditorOptions(); + + this.registerCommands(); + + this.addSettingTab(new MsTodoSyncSettingTab(this.app, this)); + + this.todoApi = new TodoApi(this.app); + this.settingsManager = new SettingsManager(this); + } + + async onunload() { + log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); + } + + async loadSettings() { + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); // eslint-disable-line @typescript-eslint/no-unsafe-assignment + } + + async saveSettings() { + await this.saveData(this.settings); + } + + /** + * Registers commands for the plugin. + * + * This method adds the following commands: + * + * - `only-create-task`: Posts the selected text as tasks to Microsoft To-Do. + * - `create-task-replace`: Posts the selected text as tasks to Microsoft To-Do and replaces the selected text. + * - `open-task-link`: Opens the link to the task in Microsoft To-Do. + * - `add-microsoft-todo`: Inserts a summary of today's tasks from Microsoft To-Do. + * + * Each command is associated with an `editorCallback` that defines the action to be performed when the command is executed. + * + * @private + */ + private registerCommands() { + this.addCommand({ + id: 'only-create-task', + name: 'Post the selection as todos to MsTodo.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); }, - ); }); - }), - ); - - // 在右键菜单中注册命令:将选中的文字创建微软待办并替换 - // Register command in the context menu: Create and replace the selected text to Microsoft To-Do - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( - async e => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); + + // 注册命令:将选中的文字创建微软待办并替换 + // Register command: Create and replace the selected text to Microsoft To-Do + this.addCommand({ + id: 'create-task-replace', + name: 'Post the selection as todos to MsTodo and Replace.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); }, - ); - }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle('Sync Task with details (Push)').onClick(async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); - }); }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle('Sync Task with details (Pull)').onClick( - async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - false, - ); + + // Register command: Open link to ToDo + this.addCommand({ + id: 'open-task-link', + name: 'Open To Do', + editorCallback: async (editor: Editor, view: MarkdownView) => { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = getTaskIdFromLine(line, this); + if (taskId !== '') { + if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } }, - ); }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - // @ts-ignore Not available in mobile app - if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } - }); + + this.addCommand({ + id: 'add-microsoft-todo', + name: 'Insert the MsTodo summary.', + editorCallback: async (editor: Editor, view: MarkdownView) => { + await createTodayTasks(this.todoApi, this.settings, editor); + }, }); - }), - ); - - // 注册命令:将选中的文字创建微软待办 - // Register command: Create to Do with the selected text - this.addCommand({ - id: 'only-create-task', - name: 'Post the selection as todos to MsTodo.', - editorCallback: async (editor: Editor, view: MarkdownView) => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, + } + + /** + * Registers various options in the editor's context menu. + * + * This method adds multiple items to the editor's right-click context menu, each performing different actions related to Microsoft To-Do integration: + * + * - Sync selected text to Microsoft To-Do. + * - Sync and replace selected text with a Microsoft To-Do task. + * - Sync task with details (Push). + * - Sync task with details (Pull). + * - Open Microsoft To-Do task details. + * + * Each menu item triggers an asynchronous function to handle the respective action. + * + * @private + */ + private registerMenuEditorOptions() { + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_SyncToTodo')).onClick( + async e => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }, + ); + }); + }), + ); + + // 在右键菜单中注册命令:将选中的文字创建微软待办并替换 + // Register command in the context menu: Create and replace the selected text to Microsoft To-Do + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( + async e => { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Sync Task with details (Push)').onClick(async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }); + }); + }), ); - }, - }); - - // 注册命令:将选中的文字创建微软待办并替换 - // Register command: Create and replace the selected text to Microsoft To-Do - this.addCommand({ - id: 'create-task-replace', - name: 'Post the selection as todos to MsTodo and Replace.', - editorCallback: async (editor: Editor, view: MarkdownView) => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Sync Task with details (Pull)').onClick( + async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + false, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = getTaskIdFromLine(line, this); + if (taskId !== '') { + if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } + }); + }); + }), ); - }, - }); - - // Register command: Open link to ToDo - this.addCommand({ - id: 'open-task-link', - name: 'Open To Do', - editorCallback: async (editor: Editor, view: MarkdownView) => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - // @ts-ignore Not available in mobile app - if (!this.app.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } - }, - }); - - this.addCommand({ - id: 'add-microsoft-todo', - name: 'Insert the MsTodo summary.', - editorCallback: async (editor: Editor, view: MarkdownView) => { - // TODO 模板化日期 - await createTodayTasks(this.todoApi, this.settings, editor); - }, - }); - - this.addSettingTab(new MsTodoSyncSettingTab(this)); - this.todoApi = new TodoApi(this.app); - - // Const a = this.app.vault.getAbstractFileByPath('0进行中/00Today/未命名 2.md') - // if(a) await this.app.vault.append(a,"hello") - // this.registerInterval(window.setTimeout(() => this.uptimerApi.getTodayActivities(),(window.moment("18:21", "HH:mm") as unknown as number) - (window.moment() as unknown as number))); - // This creates an icon in the left ribbon. - // const ribbonIconEl = this.addRibbonIcon('dice', 'Sample Plugin', (evt: MouseEvent) => { - // }); - // Perform additional things with the ribbon - // ribbonIconEl.addClass('my-plugin-ribbon-class'); - - // console.log(await this.todoApi.getListIdByName("obsidian")) - } - - async onunload() { - log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); - } - - async loadSettings() { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); - } - - async saveSettings() { - await this.saveData(this.settings); - } - - // GetCurrentLinesFromEditor(editor: Editor): Selection { - // log( - // 'info', - // `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor( - // 'anchor', - // )}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, - // ); - - // let start: EditorPosition; - // let end: EditorPosition; - // let lines: number[] = []; - // if (editor.somethingSelected()) { - // start = editor.getCursor('from'); - // end = editor.getCursor('to'); - // lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); - // } else { - // start = editor.getCursor(); - // end = editor.getCursor(); - // lines.push(start.line); - // } - // return { - // start, - // end, - // lines, - // }; - // } + } } diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 34a9ca4..fb8417d 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -1,388 +1,333 @@ +/* eslint-disable @typescript-eslint/parameter-properties */ import { - type AttachmentBase, - type AttachmentSession, - type ChecklistItem, - type DateTimeTimeZone, - type Extension, - type Importance, - type ItemBody, - type LinkedResource, - type NullableOption, - type PatternedRecurrence, - type TaskStatus, - type TodoTask, + type AttachmentBase, + type AttachmentSession, + type ChecklistItem, + type DateTimeTimeZone, + type Extension, + type Importance, + type ItemBody, + type LinkedResource, + type NullableOption, + type PatternedRecurrence, + type TaskStatus, + type TodoTask, } from '@microsoft/microsoft-graph-types'; -import {type MsTodoSyncSettings} from 'src/gui/msTodoSyncSettingTab'; -import {CachedMetadata} from 'obsidian'; -import type MsTodoSync from '../main.js'; +import {type ISettingsManager} from 'src/utils/settingsManager.js'; import {t} from '../lib/lang.js'; import {logging} from '../lib/logging.js'; import {IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX} from '../constants.js'; export class ObsidianTodoTask implements TodoTask { - id: string; + id: string; - // The task body that typically contains information about the task. - public body?: NullableOption; - /** + // The task body that typically contains information about the task. + public body?: NullableOption; + /** * The date and time when the task body was last modified. By default, it is in UTC. You can provide a custom time zone in * the request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan * 1, 2020 would look like this: '2020-01-01T00:00:00Z'. */ - public bodyLastModifiedDateTime?: string; - /** + public bodyLastModifiedDateTime?: string; + /** * The categories associated with the task. Each category corresponds to the displayName property of an outlookCategory * that the user has defined. */ - public categories?: NullableOption; - // The date and time in the specified time zone that the task was finished. - public completedDateTime?: NullableOption; - /** + public categories?: NullableOption; + // The date and time in the specified time zone that the task was finished. + public completedDateTime?: NullableOption; + /** * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the * request header. The property value uses ISO 8601 format. For example, midnight UTC on Jan 1, 2020 would look like this: * '2020-01-01T00:00:00Z'. */ - public createdDateTime?: string; - // The date and time in the specified time zone that the task is to be finished. - public dueDateTime?: NullableOption; - public hasAttachments?: NullableOption; - // The importance of the task. Possible values are: low, normal, high. - public importance?: Importance; - // Set to true if an alert is set to remind the user of the task. - public isReminderOn?: boolean; - /** + public createdDateTime?: string; + // The date and time in the specified time zone that the task is to be finished. + public dueDateTime?: NullableOption; + public hasAttachments?: NullableOption; + // The importance of the task. Possible values are: low, normal, high. + public importance?: Importance; + // Set to true if an alert is set to remind the user of the task. + public isReminderOn?: boolean; + /** * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, * 2020 would look like this: '2020-01-01T00:00:00Z'. */ - public lastModifiedDateTime?: string; - // The recurrence pattern for the task. - public recurrence?: NullableOption; - // The date and time in the specified time zone for a reminder alert of the task to occur. - public reminderDateTime?: NullableOption; - public startDateTime?: NullableOption; - /** + public lastModifiedDateTime?: string; + // The recurrence pattern for the task. + public recurrence?: NullableOption; + // The date and time in the specified time zone for a reminder alert of the task to occur. + public reminderDateTime?: NullableOption; + public startDateTime?: NullableOption; + /** * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, * deferred. */ - public status?: TaskStatus; - // A brief description of the task. - public title?: NullableOption; - public attachments?: NullableOption; - public attachmentSessions?: NullableOption; - // A collection of checklistItems linked to a task. - public checklistItems?: NullableOption; - // The collection of open extensions defined for the task. Nullable. - public extensions?: NullableOption; - // A collection of resources linked to the task. - public linkedResources?: NullableOption; - - public blockLink?: string; - public fileName?: string; - private readonly plugin: MsTodoSync; - private readonly settings: MsTodoSyncSettings; - logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); - private readonly originalTitle: string; - - /** + public status?: TaskStatus; + // A brief description of the task. + public title?: NullableOption; + public attachments?: NullableOption; + public attachmentSessions?: NullableOption; + // A collection of checklistItems linked to a task. + public checklistItems?: NullableOption; + // The collection of open extensions defined for the task. Nullable. + public extensions?: NullableOption; + // A collection of resources linked to the task. + public linkedResources?: NullableOption; + + public blockLink?: string; + public fileName?: string; + + private readonly logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); + + private readonly settingsManager: ISettingsManager; + private readonly originalTitle: string; + + constructor(settingsManager: ISettingsManager, line: string, fileName: string) { + this.settingsManager = settingsManager; + this.fileName = fileName; + this.originalTitle = line; + + this.logger.debug(`Creating: '${this.title}'`); + + this.title = line.trim(); + + // This will strip out the block link if it exists as + // it is part of this plugin and not user specified. + this.checkForBlockLink(line); + + // This will strip out the checkbox if in title. + this.checkForStatus(line); + + this.checkForImportance(line); + + this.title = this.title + .trim() + .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') + .trim(); + + this.body = { + content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + contentType: 'text', + }; + + this.linkedResources ||= []; + + this.linkedResources.push({ + webUrl: `obsidian://advanced-uri?filepath=${fileName}`, + applicationName: 'Obsidian', + displayName: 'fileName', + }); + + this.logger.debug(`Created: '${this.title}'`); + } + + /** + * Cache the ID internally and generate block link. * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask */ - // constructor() { - // this.plugin = plugin; - // this.settings = plugin.settings; - // this.fileName = fileName; - // this.originalTitle = line; - // this.logger.debug(`Creating: '${this.title}'`); - // this.title = line.trim(); - // // This will strip out the block link if it exists as - // // it is part of this plugin and not user specified. - // this.checkForBlockLink(line); - // // This will strip out the checkbox if in title. - // this.checkForStatus(line); - // this.checkForImportance(line); - // this.title = this.title - // .trim() - // .replace(/(- \[( |x|\/)\] )|\*|^> |^#* |- /gm, '') - // .trim(); - // this.body = { - // content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - // contentType: 'text', - // }; - // this.logger.debug(`Created: '${this.title}'`); - // } - constructor(plugin: MsTodoSync, line: string, fileName: string) { - this.plugin = plugin; - this.settings = plugin.settings; - this.fileName = fileName; - this.originalTitle = line; - - this.logger.debug(`Creating: '${this.title}'`); - - this.title = line.trim(); - - // This will strip out the block link if it exists as - // it is part of this plugin and not user specified. - this.checkForBlockLink(line); - - // This will strip out the checkbox if in title. - this.checkForStatus(line); - - this.checkForImportance(line); - - this.title = this.title - .trim() - .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') - .trim(); - - this.body = { - content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, - contentType: 'text', - }; - - this.linkedResources ||= []; - - this.linkedResources.push({ - webUrl: `obsidian://advanced-uri?filepath=${fileName}`, - applicationName: 'Obsidian', - displayName: 'fileName', - }); - - this.logger.debug(`Created: '${this.title}'`); - } - - // Static async fromLineNumber(plugin: MsTodoSync, fileName: string, lineNumber: number): Promise { - // const task = new ObsidianTodoTask(); - - // task.plugin = plugin; - // task.settings = plugin.settings; - // task.fileName = fileName; - - // const pageMetadata = plugin.getPageMetadata(fileName) as CachedMetadata; - - // await app.vault.read(app.vault.getAbstractFileByPath('400 Reference/HomeTech/Unraid.md')); - - // app.vault.read(this.config.target_file); - - // plugin.app.vault.getAbstractFileByPath; - // pageMetadata.listItems?.find((item) => { - // if (item.position.start.line === lineNumber) { - // task.originalTitle = item.line; - // } - // }); - - // return task; - // } - - public getTodoTask(withChecklist = false): TodoTask { - const toDo: TodoTask = { - title: this.title, - }; - - if (this.body?.content && this.body.content.length > 0) { - toDo.body = this.body; - } + public async cacheTaskId(id: string): Promise { + this.settingsManager.settings.taskIdIndex += 1; - if (this.status && this.status.length > 0) { - toDo.status = this.status; - } + const index = `${Math.random().toString(20).slice(2, 6)}${this.settingsManager.settings.taskIdIndex + .toString() + .padStart(5, '0')}`; + this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settingsManager.settings.taskIdIndex}`); - if (this.importance && this.importance.length > 0) { - toDo.importance = this.importance; - } + this.settingsManager.settings.taskIdLookup[index] = id ?? ''; + this.blockLink = index; + this.id = id; - if (withChecklist && this.checklistItems && this.checklistItems.length > 0) { - toDo.checklistItems = this.checklistItems; + this.settingsManager.saveSettings(); } - if (this.linkedResources && this.linkedResources.length > 0) { - toDo.linkedResources = this.linkedResources; - } + public getTodoTask(withChecklist = false): TodoTask { + const toDo: TodoTask = { + title: this.title, + }; + + if (this.body?.content && this.body.content.length > 0) { + toDo.body = this.body; + } + + if (this.status && this.status.length > 0) { + toDo.status = this.status; + } + + if (this.importance && this.importance.length > 0) { + toDo.importance = this.importance; + } + + if (withChecklist && this.checklistItems && this.checklistItems.length > 0) { + toDo.checklistItems = this.checklistItems; + } + + if (this.linkedResources && this.linkedResources.length > 0) { + toDo.linkedResources = this.linkedResources; + } - return toDo; - } + return toDo; + } - public setBody(body: string) { - this.body = { - content: body, - contentType: 'text', - }; - } + public setBody(body: string) { + this.body = { + content: body, + contentType: 'text', + }; + } - public addChecklistItem(item: string) { - this.checklistItems ||= []; + public addChecklistItem(item: string) { + this.checklistItems ||= []; - this.checklistItems.push({ - displayName: item - .trim() - .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') - .trim(), - }); - } + this.checklistItems.push({ + displayName: item + .trim() + .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') + .trim(), + }); + } - /** + /** * Return the task as a well formed markdown task. * * @return {*} {string} * @memberof ObsidianTodoTask */ - public getMarkdownTask(singleLine: boolean): string { - let output: string; - - // Format and display the task which is the first line. - const format = this.settings.displayOptions_ReplacementFormat; - const priorityIndicator = this.getPriorityIndicator(); - - output = format - .replace(TASK_REGEX, this.title?.trim() ?? '') - .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); - - if (output.includes(priorityIndicator)) { - // Already in title, don't add it again and clear replacement tag. - output = output.replace(IMPORTANCE_REGEX, ''); - } else { - output = output.replace(IMPORTANCE_REGEX, priorityIndicator); - } + public getMarkdownTask(singleLine: boolean): string { + let output: string; - // Append blocklink at the end if it exists - if (this.hasBlockLink && this.blockLink) { - output = `${output.trim()} ^${this.blockLink}`; - } + // Format and display the task which is the first line. + const format = this.settingsManager.settings.displayOptions_ReplacementFormat; + const priorityIndicator = this.getPriorityIndicator(); - this.logger.debug(`Updated task: '${output}'`); + output = format + .replace(TASK_REGEX, this.title?.trim() ?? '') + .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); - let formattedBody = ''; - let formattedChecklist = ''; + output = output.includes(priorityIndicator) ? output.replace(IMPORTANCE_REGEX, '') : output.replace(IMPORTANCE_REGEX, priorityIndicator); - // Add in the body if it exists and indented by two spaces. - if (this.body?.content && this.body.content.length > 0) { - for (const bodyLine of this.body?.content.split('\n')) { - if (bodyLine.trim().length > 0) { - formattedBody += ' ' + bodyLine + '\n'; + // Append block link at the end if it exists + if (this.hasBlockLink && this.blockLink) { + output = `${output.trim()} ^${this.blockLink}`; } - } - } - // This.logger.debug(`formattedBody: '${formattedBody}'`); - - if (this.checklistItems && this.checklistItems.length > 0) { - for (const item of this.checklistItems) { - formattedChecklist += item.isChecked ? ' - [x] ' + item.displayName + '\n' : ' - [ ] ' + item.displayName + '\n'; - } - } - // This.logger.debug(`formattedChecklist: '${formattedChecklist}'`); - output = singleLine ? `${output.trim()}` : `${output.trim()}\n${formattedBody}${formattedChecklist}`; - // This.logger.debug(`output: '${output}'`); + this.logger.debug(`Updated task: '${output}'`); - return output; - } + let formattedBody = ''; + let formattedChecklist = ''; - private checkForStatus(line: string) { - const regex = /\[(.)]/; + // Add in the body if it exists and indented by two spaces. + if (this.body?.content && this.body.content.length > 0) { + for (const bodyLine of this.body?.content.split('\n')) { + if (bodyLine.trim().length > 0) { + formattedBody += ' ' + bodyLine + '\n'; + } + } + } + // This.logger.debug(`formattedBody: '${formattedBody}'`); - const m = regex.exec(line); - if (m && m.length > 0) { - this.status = m[1] === 'x' ? 'completed' : 'notStarted'; - this.title = this.title?.replace(regex, '').trim(); - } else { - this.status = 'notStarted'; - } - } + if (this.checklistItems && this.checklistItems.length > 0) { + for (const item of this.checklistItems) { + formattedChecklist += item.isChecked ? ' - [x] ' + item.displayName + '\n' : ' - [ ] ' + item.displayName + '\n'; + } + } + // This.logger.debug(`formattedChecklist: '${formattedChecklist}'`); - private checkForImportance(line: string) { - this.importance = 'normal'; + output = singleLine ? `${output.trim()}` : `${output.trim()}\n${formattedBody}${formattedChecklist}`; + // This.logger.debug(`output: '${output}'`); - if (line.includes(this.settings.displayOptions_TaskImportance_Low)) { - this.importance = 'low'; + return output; } - if (line.includes(this.settings.displayOptions_TaskImportance_High)) { - this.importance = 'high'; - } - } + private checkForStatus(line: string) { + const regex = /\[(.)]/; - private getPriorityIndicator(): string { - switch (this.importance) { - case 'normal': { - return this.settings.displayOptions_TaskImportance_Normal; - } + const m = regex.exec(line); + if (m && m.length > 0) { + this.status = m[1] === 'x' ? 'completed' : 'notStarted'; + this.title = this.title?.replace(regex, '').trim(); + } else { + this.status = 'notStarted'; + } + } - case 'low': { - return this.settings.displayOptions_TaskImportance_Low; - } + private checkForImportance(line: string) { + this.importance = 'normal'; - case 'high': { - return this.settings.displayOptions_TaskImportance_High; - } + if (line.includes(this.settingsManager.settings.displayOptions_TaskImportance_Low)) { + this.importance = 'low'; + } - default: { - return ''; - } + if (line.includes(this.settingsManager.settings.displayOptions_TaskImportance_High)) { + this.importance = 'high'; + } } - } - private getStatusIndicator(): string { - switch (this.status) { - case 'notStarted': { - return this.settings.displayOptions_TaskStatus_NotStarted; - } + private getPriorityIndicator(): string { + switch (this.importance) { + case 'normal': { + return this.settingsManager.settings.displayOptions_TaskImportance_Normal; + } - case 'inProgress': { - return this.settings.displayOptions_TaskStatus_InProgress; - } + case 'low': { + return this.settingsManager.settings.displayOptions_TaskImportance_Low; + } - case 'completed': { - return this.settings.displayOptions_TaskStatus_Completed; - } + case 'high': { + return this.settingsManager.settings.displayOptions_TaskImportance_High; + } - default: { - return ' '; - } + default: { + return ''; + } + } } - } - private checkForBlockLink(line: string) { - const blocklinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; - const blocklinkMatch = blocklinkRegex.exec(line); - if (blocklinkMatch) { - this.blockLink = blocklinkMatch[1]; + private getStatusIndicator(): string { + switch (this.status) { + case 'notStarted': { + return this.settingsManager.settings.displayOptions_TaskStatus_NotStarted; + } - // FIXME If there's a 'Created at xxxx' replaced line, - // it's not enough to get a cleanTaskTitle after the next line. - this.title = this.title?.replace(`^${this.blockLink}`, ''); - } + case 'inProgress': { + return this.settingsManager.settings.displayOptions_TaskStatus_InProgress; + } - if (this.hasBlockLink && this.blockLink) { - this.id = this.settings.taskIdLookup[this.blockLink]; - } - } + case 'completed': { + return this.settingsManager.settings.displayOptions_TaskStatus_Completed; + } - public get cleanTitle(): string { - return ''; - } + default: { + return ' '; + } + } + } - public get hasBlockLink(): boolean { - return this.blockLink !== undefined && this.blockLink.length > 0; - } + private checkForBlockLink(line: string) { + const blockLinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; + const blockLinkMatch = blockLinkRegex.exec(line); + if (blockLinkMatch) { + this.blockLink = blockLinkMatch[1]; - /** - * Cache the ID internally and generate blocklink. - * - * @param {string} [id] - * @return {*} {Promise} - * @memberof ObsidianTodoTask - */ - public async cacheTaskId(id: string): Promise { - this.settings.taskIdIndex = this.settings.taskIdIndex + 1; + // If there's a 'Created at xxxx' replaced line, + // it's not enough to get a cleanTaskTitle after the next line. + this.title = this.title?.replace(`^${this.blockLink}`, ''); + } - const index = `${Math.random().toString(20).slice(2, 6)}${this.settings.taskIdIndex - .toString() - .padStart(5, '0')}`; - this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settings.taskIdIndex}`); + if (this.hasBlockLink && this.blockLink) { + this.id = this.settingsManager.settings.taskIdLookup[this.blockLink]; + } + } - this.settings.taskIdLookup[index] = id ?? ''; - this.blockLink = index; - this.id = id; + public get cleanTitle(): string { + return ''; + } - await this.plugin.saveSettings(); - } + public get hasBlockLink(): boolean { + return this.blockLink !== undefined && this.blockLink.length > 0; + } } diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts new file mode 100644 index 0000000..858bfcb --- /dev/null +++ b/src/utils/settingsManager.ts @@ -0,0 +1,24 @@ +// Src/utils/settingsManager.ts + +import {type IMsTodoSyncSettings} from 'src/gui/msTodoSyncSettingTab'; +import type MsTodoSync from 'src/main'; + +interface ISettingsManager { + settings: IMsTodoSyncSettings; + saveSettings(): void; +} + +class SettingsManager implements ISettingsManager { + constructor(private readonly plugin: MsTodoSync) {} + + public get settings() { + return this.plugin.settings; + } + + async saveSettings(): Promise { + // Implementation to save settings + await this.plugin.saveData(this.plugin.settings); + } +} + +export {type ISettingsManager, SettingsManager}; diff --git a/tsconfig.json b/tsconfig.json index c038e09..534d29a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,25 +1,31 @@ { - "compilerOptions": { - "allowSyntheticDefaultImports": true, - "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "CommonJS", - "target": "ES6", - "allowJs": true, - "noImplicitAny": true, - "moduleResolution": "node", - "importHelpers": true, - "isolatedModules": true, - "resolveJsonModule": true, - "strictNullChecks": true, - "lib": [ - "DOM", - "ES5", - "ES6", - "ES7" + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "baseUrl": ".", + "inlineSourceMap": true, + "inlineSources": true, + "module": "CommonJS", + "target": "ES6", + "allowJs": true, + "noImplicitAny": true, + "moduleResolution": "node", + "importHelpers": true, + "isolatedModules": true, + "resolveJsonModule": true, + "strictNullChecks": true, + "lib": [ + "DOM", + "ES5", + "ES6", + "ES7", + "ES2021" + ] + }, + "include": [ + "**/*.ts" + ], + "exclude": [ + "node_modules", + "tests" ] - }, - "include": ["**/*.ts"], - "exclude": ["node_modules", "tests"] -} +} \ No newline at end of file From 18c9d7cfe018982e48e2ad0b9142cf402349f51d Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 09:53:05 -0800 Subject: [PATCH 10/34] feat: updated versions can calling pattern to reduce obsidian references --- package.json | 22 +- pnpm-lock.yaml | 1190 ++++++++++----------------------- src/api/todoApi.ts | 36 +- src/command/msTodoCommand.ts | 2 +- src/lib/locale/en.json | 13 +- src/main.ts | 141 ++-- src/model/ObsidianTodoTask.ts | 134 +++- src/utils/formatter.ts | 10 +- 8 files changed, 612 insertions(+), 936 deletions(-) diff --git a/package.json b/package.json index 2693325..abbaf7d 100644 --- a/package.json +++ b/package.json @@ -17,30 +17,30 @@ "author": "", "license": "MIT", "devDependencies": { - "@types/node": "^16.11.6", - "@types/node-fetch": "^2.6.2", + "@types/node": "^16.18.122", + "@types/node-fetch": "^2.6.12", "@typescript-eslint/eslint-plugin": "5.29.0", "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "0.14.47", - "eslint": "^7.22.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-import": "^2.22.1", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.10.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-loops": "^0.3.0", "eslint-plugin-prettier": "^4.2.1", "obsidian": "latest", - "prettier": "^2.7.1", + "prettier": "^2.8.8", "tslib": "2.4.0", "typescript": "4.7.4", "xo": "^0.60.0" }, "dependencies": { "@azure/msal-common": "^14.16.0", - "@azure/msal-node": "^1.14.2", - "@microsoft/microsoft-graph-client": "^3.0.2", - "@microsoft/microsoft-graph-types": "^2.25.0", - "eventemitter2": "^6.4.5", - "node-fetch": "^2.6.1" + "@azure/msal-node": "^1.18.4", + "@microsoft/microsoft-graph-client": "^3.0.7", + "@microsoft/microsoft-graph-types": "^2.40.0", + "eventemitter2": "^6.4.9", + "node-fetch": "^2.7.0" }, "xo": { "space": 4, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1a8bc17..b36089b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,27 +12,27 @@ importers: specifier: ^14.16.0 version: 14.16.0 '@azure/msal-node': - specifier: ^1.14.2 - version: 1.14.2 + specifier: ^1.18.4 + version: 1.18.4 '@microsoft/microsoft-graph-client': - specifier: ^3.0.2 - version: 3.0.3 + specifier: ^3.0.7 + version: 3.0.7 '@microsoft/microsoft-graph-types': - specifier: ^2.25.0 - version: 2.25.0 + specifier: ^2.40.0 + version: 2.40.0 eventemitter2: - specifier: ^6.4.5 + specifier: ^6.4.9 version: 6.4.9 node-fetch: - specifier: ^2.6.1 - version: 2.6.7 + specifier: ^2.7.0 + version: 2.7.0 devDependencies: '@types/node': - specifier: ^16.11.6 - version: 16.18.3 + specifier: ^16.18.122 + version: 16.18.122 '@types/node-fetch': - specifier: ^2.6.2 - version: 2.6.2 + specifier: ^2.6.12 + version: 2.6.12 '@typescript-eslint/eslint-plugin': specifier: 5.29.0 version: 5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4) @@ -46,26 +46,26 @@ importers: specifier: 0.14.47 version: 0.14.47 eslint: - specifier: ^7.22.0 + specifier: ^7.32.0 version: 7.32.0 eslint-config-prettier: - specifier: ^8.5.0 - version: 8.5.0(eslint@7.32.0) + specifier: ^8.10.0 + version: 8.10.0(eslint@7.32.0) eslint-plugin-import: - specifier: ^2.22.1 - version: 2.26.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) + specifier: ^2.31.0 + version: 2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) eslint-plugin-no-loops: specifier: ^0.3.0 version: 0.3.0(eslint@7.32.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.5.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.7.1) + version: 4.2.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8) obsidian: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) prettier: - specifier: ^2.7.1 - version: 2.7.1 + specifier: ^2.8.8 + version: 2.8.8 tslib: specifier: 2.4.0 version: 2.4.0 @@ -78,36 +78,36 @@ importers: packages: - '@azure/msal-common@14.16.0': - resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} + '@azure/msal-common@13.3.1': + resolution: {integrity: sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==} engines: {node: '>=0.8.0'} - '@azure/msal-common@7.6.0': - resolution: {integrity: sha512-XqfbglUTVLdkHQ8F9UQJtKseRr3sSnr9ysboxtoswvaMVaEfvyLtMoHv9XdKUfOc0qKGzNgRFd9yRjIWVepl6Q==} + '@azure/msal-common@14.16.0': + resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@1.14.2': - resolution: {integrity: sha512-t3whVhhLdZVVeDEtUPD2Wqfa8BDi3EDMnpWp8dbuRW0GhUpikBfs4AQU0Fe6P9zS87n9LpmUTLrIcPEEuzkvfA==} + '@azure/msal-node@1.18.4': + resolution: {integrity: sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==} engines: {node: 10 || 12 || 14 || 16 || 18} deprecated: A newer major version of this library is available. Please upgrade to the latest available version. '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - '@babel/helper-validator-identifier@7.19.1': - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.18.6': - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + '@babel/highlight@7.25.9': + resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/runtime@7.20.1': - resolution: {integrity: sha512-mrzLkl6U9YLF8qpqI7TB82PESyEGjm/0Ly91jG575eVxMMlb8fYfOXFZIJ8XfLrJZQbm7dlKry2bJmXBUEkdFg==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} '@codemirror/state@6.1.2': @@ -185,8 +185,8 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - '@microsoft/microsoft-graph-client@3.0.3': - resolution: {integrity: sha512-+v4b3Y0Dva71uiF85AuhXx4t3IrL0HgJNQaWxysrc/BStSHucwln1lMHCclxI6GsWs0P1BZksUE/EyY5K/TYgQ==} + '@microsoft/microsoft-graph-client@3.0.7': + resolution: {integrity: sha512-/AazAV/F+HK4LIywF9C+NYHcJo038zEnWkteilcxC1FM/uK/4NVGDKGrxx7nNq1ybspAroRKT4I1FHfxQzxkUw==} engines: {node: '>=12.0.0'} peerDependencies: '@azure/identity': '*' @@ -203,8 +203,8 @@ packages: stream-browserify: optional: true - '@microsoft/microsoft-graph-types@2.25.0': - resolution: {integrity: sha512-H/HK4MsRJ1H+G/HwbU/z225BKwzoMU3fawD8xivGxDgyGIDzdZf07Ruz/wPSM+tSJJin/swz3TwFllxveduG8Q==} + '@microsoft/microsoft-graph-types@2.40.0': + resolution: {integrity: sha512-1fcPVrB/NkbNcGNfCy+Cgnvwxt6/sbIEEFgZHFBJ670zYLegENYJF8qMo7x3LqBjWX2/Eneq5BVVRCLTmlJN+g==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -248,29 +248,26 @@ packages: '@types/eslint@9.6.1': resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/estree@1.0.0': - resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/json-schema@7.0.11': - resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==} + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node-fetch@2.6.2': - resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} + '@types/node-fetch@2.6.12': + resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} - '@types/node@16.18.3': - resolution: {integrity: sha512-jh6m0QUhIRcZpNv7Z/rpN+ZWXOicUUQbSoWks7Htkbb9IjFQj4kzcX/xFCkjstCj5flMsN8FiSvt+q+Tcs4Llg==} + '@types/node@16.18.122': + resolution: {integrity: sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/tern@0.23.4': - resolution: {integrity: sha512-JAUw1iXGO1qaWwEOzxTKJZ/5JxVeON9kvGZ/osgZaJImBnyjyn0cjovPsf6FNLmyGY8Vw9DoXZCMlfMkMwHRWg==} + '@types/tern@0.23.9': + resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} '@typescript-eslint/eslint-plugin@5.29.0': resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} @@ -478,8 +475,8 @@ packages: ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.11.0: - resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -511,12 +508,8 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-includes@3.1.5: - resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==} + array-buffer-byte-length@1.0.2: + resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} array-includes@3.1.8: @@ -531,10 +524,6 @@ packages: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} - array.prototype.flat@1.3.1: - resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} - engines: {node: '>= 0.4'} - array.prototype.flat@1.3.3: resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} engines: {node: '>= 0.4'} @@ -571,10 +560,6 @@ packages: brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} @@ -602,9 +587,6 @@ packages: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} - call-bind@1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} - call-bind@1.0.8: resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} engines: {node: '>= 0.4'} @@ -628,8 +610,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.0: - resolution: {integrity: sha512-ZkD35Mx92acjB2yNJgziGqT9oKHEOxjTBTDRpOsRWtdecL/0jM3z5kM/CTzHWvHIen1GvkM85p6TuFfDGfc8/Q==} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} chrome-trace-event@1.0.4: @@ -685,30 +667,22 @@ packages: typescript: optional: true - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + data-view-buffer@1.0.2: + resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + data-view-byte-length@1.0.2: + resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} engines: {node: '>= 0.4'} data-view-byte-offset@1.0.1: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -717,8 +691,8 @@ packages: supports-color: optional: true - debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -745,10 +719,6 @@ packages: resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} engines: {node: '>=12'} - define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} - engines: {node: '>= 0.4'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -776,8 +746,8 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} - electron-to-chromium@1.5.75: - resolution: {integrity: sha512-Lf3++DumRE/QmweGjU+ZcKqQ+3bKkU/qjaKYhIJKEOhgIO9Xs6IiAQFkfFoj+RhgDk4LUeNsLo6plExHqSyu6Q==} + electron-to-chromium@1.5.76: + resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -793,12 +763,12 @@ packages: resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} engines: {node: '>=0.6'} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} - enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} env-editor@1.1.0: @@ -812,12 +782,8 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.20.4: - resolution: {integrity: sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==} - engines: {node: '>= 0.4'} - - es-abstract@1.23.6: - resolution: {integrity: sha512-Ifco6n3yj2tMZDWNLyloZrytt9lqqlwvS83P3HtaETR0NUOYnIULGGHpktqYGObGy+8wc1okO25p8TjemhImvA==} + es-abstract@1.23.8: + resolution: {integrity: sha512-lfab8IzDn6EpI1ibZakcgS6WsfEBiB+43cuJo+wgylx1xKXf+Sp+YR3vFuQwC/u3sxYwV8Cxe3B0DpVUu/WiJQ==} engines: {node: '>= 0.4'} es-define-property@1.0.1: @@ -828,8 +794,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} @@ -839,16 +805,9 @@ packages: resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} - es-shim-unscopables@1.0.2: resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - es-to-primitive@1.3.0: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} @@ -996,8 +955,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-config-prettier@8.5.0: - resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + eslint-config-prettier@8.10.0: + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -1027,9 +986,6 @@ packages: resolution: {integrity: sha512-znAUcXmBthdIUmlnRkPSxz3zSJHFUhfHF/nJPcCMVKg/mOa4yUie2Olqg1Ghbi5JJRBZVU3rIgzWSObvIspxMA==} engines: {node: '>=18'} - eslint-import-resolver-node@0.3.6: - resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==} - eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -1061,27 +1017,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-module-utils@2.7.4: - resolution: {integrity: sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - eslint-plugin-ava@14.0.0: resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} engines: {node: '>=14.17 <15 || >=16.4'} @@ -1100,16 +1035,6 @@ packages: peerDependencies: eslint: '>=4.19.1' - eslint-plugin-import@2.26.0: - resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -1120,8 +1045,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.15.0: - resolution: {integrity: sha512-xF3zJkOfLlFOm5TvmqmsnA9/fO+/z2pYs0dkuKXKN/ymS6UB1yEcaoIkqxLKQ9Dw/WmLX/Tdh6/5ZS5azVixFQ==} + eslint-plugin-n@17.15.1: + resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -1201,10 +1126,6 @@ packages: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} - 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} - 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} @@ -1248,10 +1169,6 @@ packages: espurify@2.1.1: resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} - esquery@1.4.0: - resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} - engines: {node: '>=0.10'} - esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} @@ -1286,12 +1203,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.2.0: - resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} - - fast-glob@3.2.12: - resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} - engines: {node: '>=8.6.0'} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} @@ -1303,8 +1216,11 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fastq@1.13.0: - resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + fast-uri@3.0.3: + resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} + + fastq@1.18.0: + resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} figures@6.1.0: resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} @@ -1314,10 +1230,6 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1345,35 +1257,28 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} + flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} - flatted@3.2.7: - resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==} + flatted@3.3.2: + resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + form-data@4.0.1: + resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.5: - resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} - engines: {node: '>= 0.4'} - - function.prototype.name@1.1.7: - resolution: {integrity: sha512-2g4x+HqTJKM9zcJqBSpjoRmdcPFtJM60J3xJisTQSXBWka5XqyBN/2tNUgma1mztTXyDuUsEtYe5qcs7xYzYQA==} + function.prototype.name@1.1.8: + resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} functional-red-black-tree@1.0.1: @@ -1386,9 +1291,6 @@ packages: resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} engines: {node: '>=18'} - get-intrinsic@1.1.3: - resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} - get-intrinsic@1.2.6: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} @@ -1405,10 +1307,6 @@ packages: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} - get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -1431,10 +1329,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@13.17.0: - resolution: {integrity: sha512-1C+6nQRb1GwGMKm2dH/E7enFAMxGTmGI7/dEdhy/DNelv85w9B72t3uc5frtMNXIbzrarJJ/lTCjcaZwbLJmyw==} - engines: {node: '>=8'} - globals@13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -1469,8 +1363,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + has-bigints@1.1.0: + resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} + engines: {node: '>= 0.4'} has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1480,9 +1375,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.0: - resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} - has-property-descriptors@1.0.2: resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} @@ -1490,26 +1382,14 @@ packages: resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} engines: {node: '>= 0.4'} - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} - has-tostringtag@1.0.2: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -1525,10 +1405,6 @@ packages: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} - ignore@5.2.0: - resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} - engines: {node: '>= 4'} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -1559,10 +1435,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internal-slot@1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} - engines: {node: '>= 0.4'} - internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -1590,17 +1462,10 @@ packages: resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} engines: {node: '>= 0.4'} - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - is-bigint@1.1.0: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - is-boolean-object@1.2.1: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} @@ -1613,21 +1478,14 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} - - is-core-module@2.16.0: - resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} is-data-view@1.0.2: resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} engines: {node: '>= 0.4'} - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - is-date-object@1.1.0: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} @@ -1676,18 +1534,6 @@ packages: resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} engines: {node: '>=0.10.0'} - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1710,10 +1556,6 @@ packages: is-proto-prop@2.0.0: resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1726,9 +1568,6 @@ packages: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} - is-shared-array-buffer@1.0.4: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} @@ -1737,18 +1576,10 @@ packages: resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} engines: {node: '>=18'} - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - is-symbol@1.1.1: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} @@ -1773,9 +1604,6 @@ packages: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - is-weakref@1.1.0: resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==} engines: {node: '>= 0.4'} @@ -1826,6 +1654,9 @@ packages: engines: {node: '>=6'} hasBin: true + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -1838,17 +1669,13 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json5@1.0.1: - resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} - hasBin: true - json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true - jsonwebtoken@8.5.1: - resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} - engines: {node: '>=4', npm: '>=1.4.28'} + jsonwebtoken@9.0.2: + resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} + engines: {node: '>=12', npm: '>=6'} jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} @@ -1856,6 +1683,9 @@ packages: jws@3.2.2: resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -1924,10 +1754,6 @@ packages: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} - lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -1949,10 +1775,6 @@ packages: micro-spelling-correcter@1.1.1: resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1976,17 +1798,14 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1994,8 +1813,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} peerDependencies: encoding: ^0.1.0 @@ -2017,9 +1836,6 @@ packages: resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} engines: {node: '>=0.10.0'} - object-inspect@1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - object-inspect@1.13.3: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} @@ -2028,10 +1844,6 @@ packages: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} - object.assign@4.1.7: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} @@ -2044,10 +1856,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.values@1.1.6: - resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==} - engines: {node: '>= 0.4'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -2061,22 +1869,22 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - open-editor@5.0.0: - resolution: {integrity: sha512-fRHi4my03WQSbWfqChs9AdFfSp6SLalB3zadfwfYIojoKanLDBfv2uAdiZCfzdvom7TBdlXu2UeiiydBc56/EQ==} + open-editor@5.1.0: + resolution: {integrity: sha512-KkNqM6FdoegD6WhY2YXmWcovOux45NV+zBped2+G3+V74zkDPkIl4cqh6hte2zNDojtwO2nBOV8U+sgziWfPrg==} engines: {node: '>=18'} open@10.1.0: resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} engines: {node: '>=18'} - optionator@0.9.1: - resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==} - engines: {node: '>= 0.8.0'} - optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + own-keys@1.0.1: + resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} + engines: {node: '>= 0.4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -2183,8 +1991,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true @@ -2205,8 +2013,8 @@ packages: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} - punycode@2.1.1: - resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} queue-microtask@1.2.3: @@ -2227,17 +2035,13 @@ packages: resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} engines: {node: '>= 0.4'} - regenerator-runtime@0.13.10: - resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true - regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} - engines: {node: '>= 0.4'} - regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} @@ -2265,10 +2069,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} - hasBin: true - resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -2301,8 +2101,9 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-push-apply@1.0.0: + resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} + engines: {node: '>= 0.4'} safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} @@ -2316,10 +2117,6 @@ packages: resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} engines: {node: '>= 10.13.0'} - semver@5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -2328,11 +2125,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.3.8: - resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} - engines: {node: '>=10'} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} @@ -2369,9 +2161,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - side-channel@1.1.0: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} @@ -2426,16 +2215,10 @@ packages: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} - string.prototype.trimend@1.0.6: - resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==} - string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} - string.prototype.trimstart@1.0.6: - resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==} - string.prototype.trimstart@1.0.8: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} @@ -2491,8 +2274,8 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} - table@6.8.1: - resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} + table@6.9.0: + resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} tapable@0.1.10: @@ -2544,9 +2327,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - tsconfig-paths@3.14.1: - resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2611,8 +2391,9 @@ packages: engines: {node: '>=14.17'} hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} + engines: {node: '>= 0.4'} unc-path-regex@0.1.2: resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} @@ -2642,8 +2423,8 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - v8-compile-cache@2.3.0: - resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + v8-compile-cache@2.4.0: + resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -2675,9 +2456,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -2699,10 +2477,6 @@ packages: engines: {node: '>= 8'} hasBin: true - word-wrap@1.2.3: - resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} - engines: {node: '>=0.10.0'} - word-wrap@1.2.5: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} @@ -2720,9 +2494,6 @@ packages: webpack: optional: true - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2737,33 +2508,38 @@ packages: snapshots: - '@azure/msal-common@14.16.0': {} + '@azure/msal-common@13.3.1': {} - '@azure/msal-common@7.6.0': {} + '@azure/msal-common@14.16.0': {} - '@azure/msal-node@1.14.2': + '@azure/msal-node@1.18.4': dependencies: - '@azure/msal-common': 7.6.0 - jsonwebtoken: 8.5.1 + '@azure/msal-common': 13.3.1 + jsonwebtoken: 9.0.2 uuid: 8.3.2 '@babel/code-frame@7.12.11': dependencies: - '@babel/highlight': 7.18.6 + '@babel/highlight': 7.25.9 - '@babel/helper-validator-identifier@7.19.1': {} + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 '@babel/helper-validator-identifier@7.25.9': {} - '@babel/highlight@7.18.6': + '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.19.1 + '@babel/helper-validator-identifier': 7.25.9 chalk: 2.4.2 js-tokens: 4.0.0 + picocolors: 1.1.1 - '@babel/runtime@7.20.1': + '@babel/runtime@7.26.0': dependencies: - regenerator-runtime: 0.13.10 + regenerator-runtime: 0.14.1 '@codemirror/state@6.1.2': {} @@ -2783,9 +2559,9 @@ snapshots: '@eslint/eslintrc@0.4.3': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 7.3.1 - globals: 13.17.0 + globals: 13.24.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -2797,10 +2573,10 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 9.6.1 globals: 13.24.0 - ignore: 5.2.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2811,10 +2587,10 @@ snapshots: '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.3.4 + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 - ignore: 5.2.0 + ignore: 5.3.2 import-fresh: 3.3.0 js-yaml: 4.1.0 minimatch: 3.1.2 @@ -2827,7 +2603,7 @@ snapshots: '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.4 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2835,7 +2611,7 @@ snapshots: '@humanwhocodes/config-array@0.5.0': dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -2868,12 +2644,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 - '@microsoft/microsoft-graph-client@3.0.3': + '@microsoft/microsoft-graph-client@3.0.7': dependencies: - '@babel/runtime': 7.20.1 + '@babel/runtime': 7.26.0 tslib: 2.4.0 - '@microsoft/microsoft-graph-types@2.25.0': {} + '@microsoft/microsoft-graph-types@2.40.0': {} '@nodelib/fs.scandir@2.1.5': dependencies: @@ -2885,7 +2661,7 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.13.0 + fastq: 1.18.0 '@pkgr/core@0.1.1': {} @@ -2899,7 +2675,7 @@ snapshots: '@types/codemirror@5.60.8': dependencies: - '@types/tern': 0.23.4 + '@types/tern': 0.23.9 '@types/eslint-scope@3.7.7': dependencies: @@ -2908,34 +2684,32 @@ snapshots: '@types/eslint@8.56.12': dependencies: - '@types/estree': 1.0.0 - '@types/json-schema': 7.0.11 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 '@types/eslint@9.6.1': dependencies: '@types/estree': 1.0.6 - '@types/json-schema': 7.0.11 - - '@types/estree@1.0.0': {} + '@types/json-schema': 7.0.15 '@types/estree@1.0.6': {} - '@types/json-schema@7.0.11': {} + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} - '@types/node-fetch@2.6.2': + '@types/node-fetch@2.6.12': dependencies: - '@types/node': 16.18.3 - form-data: 3.0.1 + '@types/node': 16.18.122 + form-data: 4.0.1 - '@types/node@16.18.3': {} + '@types/node@16.18.122': {} '@types/normalize-package-data@2.4.4': {} - '@types/tern@0.23.4': + '@types/tern@0.23.9': dependencies: - '@types/estree': 1.0.0 + '@types/estree': 1.0.6 '@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4)': dependencies: @@ -2943,12 +2717,12 @@ snapshots: '@typescript-eslint/scope-manager': 5.29.0 '@typescript-eslint/type-utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) - debug: 4.3.4 + debug: 4.4.0 eslint: 7.32.0 functional-red-black-tree: 1.0.1 - ignore: 5.2.0 + ignore: 5.3.2 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.6.3 tsutils: 3.21.0(typescript@4.7.4) optionalDependencies: typescript: 4.7.4 @@ -2978,7 +2752,7 @@ snapshots: '@typescript-eslint/scope-manager': 5.29.0 '@typescript-eslint/types': 5.29.0 '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) - debug: 4.3.4 + debug: 4.4.0 eslint: 7.32.0 optionalDependencies: typescript: 4.7.4 @@ -2991,7 +2765,7 @@ snapshots: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 optionalDependencies: typescript: 5.7.2 @@ -3011,7 +2785,7 @@ snapshots: '@typescript-eslint/type-utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': dependencies: '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) - debug: 4.3.4 + debug: 4.4.0 eslint: 7.32.0 tsutils: 3.21.0(typescript@4.7.4) optionalDependencies: @@ -3023,7 +2797,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - debug: 4.3.4 + debug: 4.4.0 eslint: 8.57.1 ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: @@ -3039,10 +2813,10 @@ snapshots: dependencies: '@typescript-eslint/types': 5.29.0 '@typescript-eslint/visitor-keys': 5.29.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.8 + semver: 7.6.3 tsutils: 3.21.0(typescript@4.7.4) optionalDependencies: typescript: 4.7.4 @@ -3053,7 +2827,7 @@ snapshots: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.4 + debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -3066,7 +2840,7 @@ snapshots: '@typescript-eslint/utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 '@typescript-eslint/scope-manager': 5.29.0 '@typescript-eslint/types': 5.29.0 '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) @@ -3091,7 +2865,7 @@ snapshots: '@typescript-eslint/visitor-keys@5.29.0': dependencies: '@typescript-eslint/types': 5.29.0 - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.3 '@typescript-eslint/visitor-keys@7.18.0': dependencies: @@ -3192,17 +2966,17 @@ snapshots: acorn@8.14.0: {} - ajv-formats@2.1.1(ajv@8.11.0): + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: - ajv: 8.11.0 + ajv: 8.17.1 ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 - ajv-keywords@5.1.0(ajv@8.11.0): + ajv-keywords@5.1.0(ajv@8.17.1): dependencies: - ajv: 8.11.0 + ajv: 8.17.1 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -3212,12 +2986,12 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.11.0: + ajv@8.17.1: dependencies: fast-deep-equal: 3.1.3 + fast-uri: 3.0.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 ansi-colors@4.1.3: {} @@ -3241,27 +3015,19 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.1: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 is-array-buffer: 3.0.5 - array-includes@3.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - get-intrinsic: 1.1.3 - is-string: 1.0.7 - array-includes@3.1.8: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 get-intrinsic: 1.2.6 - is-string: 1.0.7 + is-string: 1.1.1 array-union@2.1.0: {} @@ -3269,38 +3035,31 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-shim-unscopables: 1.0.2 - array.prototype.flat@1.3.1: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - es-shim-unscopables: 1.0.0 - array.prototype.flat@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-shim-unscopables: 1.0.2 array.prototype.flatmap@1.3.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-shim-unscopables: 1.0.2 arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 is-array-buffer: 3.0.5 @@ -3326,10 +3085,6 @@ snapshots: dependencies: balanced-match: 1.0.2 - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - braces@3.0.3: dependencies: fill-range: 7.1.1 @@ -3337,7 +3092,7 @@ snapshots: browserslist@4.24.3: dependencies: caniuse-lite: 1.0.30001690 - electron-to-chromium: 1.5.75 + electron-to-chromium: 1.5.76 node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) @@ -3356,11 +3111,6 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.2: - dependencies: - function-bind: 1.1.1 - get-intrinsic: 1.1.3 - call-bind@1.0.8: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3388,7 +3138,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.0: {} + chalk@5.4.1: {} chrome-trace-event@1.0.4: {} @@ -3435,21 +3185,21 @@ snapshots: optionalDependencies: typescript: 5.7.2 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 - data-view-buffer@1.0.1: + data-view-buffer@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 - data-view-byte-length@1.0.1: + data-view-byte-length@1.0.2: dependencies: - call-bind: 1.0.8 + call-bound: 1.0.3 es-errors: 1.3.0 is-data-view: 1.0.2 @@ -3459,17 +3209,13 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 - debug@2.6.9: - dependencies: - ms: 2.0.0 - debug@3.2.7: dependencies: - ms: 2.1.2 + ms: 2.1.3 - debug@4.3.4: + debug@4.4.0: dependencies: - ms: 2.1.2 + ms: 2.1.3 deep-is@0.1.4: {} @@ -3488,15 +3234,10 @@ snapshots: define-lazy-prop@3.0.0: {} - define-properties@1.1.4: - dependencies: - has-property-descriptors: 1.0.0 - object-keys: 1.1.1 - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 - has-property-descriptors: 1.0.0 + has-property-descriptors: 1.0.2 object-keys: 1.1.1 delayed-stream@1.0.0: {} @@ -3523,7 +3264,7 @@ snapshots: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.75: {} + electron-to-chromium@1.5.76: {} emoji-regex@10.4.0: {} @@ -3539,14 +3280,15 @@ snapshots: memory-fs: 0.2.0 tapable: 0.1.10 - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 - enquirer@2.3.6: + enquirer@2.4.1: dependencies: ansi-colors: 4.1.3 + strip-ansi: 6.0.1 env-editor@1.1.0: {} @@ -3556,49 +3298,22 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.20.4: - dependencies: - call-bind: 1.0.2 - es-to-primitive: 1.2.1 - function-bind: 1.1.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.1.3 - get-symbol-description: 1.0.0 - has: 1.0.3 - has-property-descriptors: 1.0.0 - has-symbols: 1.0.3 - internal-slot: 1.0.3 - is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-weakref: 1.0.2 - object-inspect: 1.12.2 - object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.4.3 - safe-regex-test: 1.0.0 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 - unbox-primitive: 1.0.2 - - es-abstract@1.23.6: + es-abstract@1.23.8: dependencies: - array-buffer-byte-length: 1.0.1 + array-buffer-byte-length: 1.0.2 arraybuffer.prototype.slice: 1.0.4 available-typed-arrays: 1.0.7 call-bind: 1.0.8 call-bound: 1.0.3 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 data-view-byte-offset: 1.0.1 es-define-property: 1.0.1 es-errors: 1.3.0 es-object-atoms: 1.0.0 es-set-tostringtag: 2.0.3 es-to-primitive: 1.3.0 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 get-intrinsic: 1.2.6 get-symbol-description: 1.1.0 globalthis: 1.0.4 @@ -3611,7 +3326,6 @@ snapshots: is-array-buffer: 3.0.5 is-callable: 1.2.7 is-data-view: 1.0.2 - is-negative-zero: 2.0.3 is-regex: 1.2.1 is-shared-array-buffer: 1.0.4 is-string: 1.1.1 @@ -3621,8 +3335,10 @@ snapshots: object-inspect: 1.13.3 object-keys: 1.1.1 object.assign: 4.1.7 + own-keys: 1.0.1 regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 string.prototype.trim: 1.2.10 string.prototype.trimend: 1.0.9 @@ -3631,14 +3347,14 @@ snapshots: typed-array-byte-length: 1.0.3 typed-array-byte-offset: 1.0.4 typed-array-length: 1.0.7 - unbox-primitive: 1.0.2 + unbox-primitive: 1.1.0 which-typed-array: 1.1.18 es-define-property@1.0.1: {} es-errors@1.3.0: {} - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} es-object-atoms@1.0.0: dependencies: @@ -3650,25 +3366,15 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.0.0: - dependencies: - has: 1.0.3 - es-shim-unscopables@1.0.2: dependencies: hasown: 2.0.2 - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 esbuild-android-64@0.14.47: optional: true @@ -3764,7 +3470,7 @@ snapshots: eslint: 8.57.1 semver: 7.6.3 - eslint-config-prettier@8.5.0(eslint@7.32.0): + eslint-config-prettier@8.10.0(eslint@7.32.0): dependencies: eslint: 7.32.0 @@ -3788,37 +3494,30 @@ snapshots: dependencies: '@types/eslint': 8.56.12 ansi-escapes: 6.2.1 - chalk: 5.4.0 + chalk: 5.4.1 eslint-rule-docs: 1.1.235 log-symbols: 6.0.0 plur: 5.1.0 string-width: 7.2.0 supports-hyperlinks: 3.1.0 - eslint-import-resolver-node@0.3.6: - dependencies: - debug: 3.2.7 - resolve: 1.22.1 - transitivePeerDependencies: - - supports-color - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 - is-core-module: 2.16.0 + is-core-module: 2.16.1 resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)): + eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)): dependencies: debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 - is-core-module: 2.16.0 + is-core-module: 2.16.1 is-regex: 1.2.1 lodash: 4.17.21 resolve: 2.0.0-next.5 @@ -3827,24 +3526,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 + '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + eslint: 7.32.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.7.4(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.6)(eslint@7.32.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) - eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + eslint: 8.57.1 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)) transitivePeerDependencies: - supports-color @@ -3871,24 +3570,30 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 eslint: 8.57.1 - ignore: 5.2.0 + ignore: 5.3.2 - eslint-plugin-import@2.26.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0): dependencies: - array-includes: 3.1.5 - array.prototype.flat: 1.3.1 - debug: 2.6.9 + '@rtsao/scc': 1.1.0 + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 doctrine: 2.1.0 eslint: 7.32.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.4(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.6)(eslint@7.32.0) - has: 1.0.3 - is-core-module: 2.11.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.values: 1.1.6 - resolve: 1.22.1 - tsconfig-paths: 3.14.1 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + string.prototype.trimend: 1.0.9 + tsconfig-paths: 3.15.0 optionalDependencies: '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) transitivePeerDependencies: @@ -3896,7 +3601,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3907,9 +3612,9 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1) hasown: 2.0.2 - is-core-module: 2.16.0 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 object.fromentries: 2.0.8 @@ -3925,10 +3630,10 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.15.0(eslint@8.57.1): + eslint-plugin-n@17.15.1(eslint@8.57.1): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 eslint: 8.57.1 eslint-plugin-es-x: 7.8.0(eslint@8.57.1) get-tsconfig: 4.8.1 @@ -3948,13 +3653,13 @@ snapshots: is-obj-prop: 1.0.0 is-proto-prop: 2.0.0 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.5.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.7.1): + eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8): dependencies: eslint: 7.32.0 - prettier: 2.7.1 + prettier: 2.8.8 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 8.5.0(eslint@7.32.0) + eslint-config-prettier: 8.10.0(eslint@7.32.0) eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): dependencies: @@ -4020,8 +3725,6 @@ snapshots: eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.3.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} @@ -4033,22 +3736,22 @@ snapshots: '@humanwhocodes/config-array': 0.5.0 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 + cross-spawn: 7.0.6 + debug: 4.4.0 doctrine: 3.0.0 - enquirer: 2.3.6 + enquirer: 2.4.1 escape-string-regexp: 4.0.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 eslint-visitor-keys: 2.1.0 espree: 7.3.1 - esquery: 1.4.0 + esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.17.0 + globals: 13.24.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -4059,15 +3762,15 @@ snapshots: lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 - optionator: 0.9.1 + optionator: 0.9.4 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.8 + semver: 7.6.3 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.8.1 + table: 6.9.0 text-table: 0.2.0 - v8-compile-cache: 2.3.0 + v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color @@ -4083,8 +3786,8 @@ snapshots: '@ungap/structured-clone': 1.2.1 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 + cross-spawn: 7.0.6 + debug: 4.4.0 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -4098,7 +3801,7 @@ snapshots: glob-parent: 6.0.2 globals: 13.24.0 graphemer: 1.4.0 - ignore: 5.2.0 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 is-path-inside: 3.0.3 @@ -4141,10 +3844,6 @@ snapshots: espurify@2.1.1: {} - esquery@1.4.0: - dependencies: - estraverse: 5.3.0 - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -4166,7 +3865,7 @@ snapshots: execa@9.5.2: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.0 @@ -4180,15 +3879,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.2.0: {} - - fast-glob@3.2.12: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 + fast-diff@1.3.0: {} fast-glob@3.3.2: dependencies: @@ -4202,7 +3893,9 @@ snapshots: fast-levenshtein@2.0.6: {} - fastq@1.13.0: + fast-uri@3.0.3: {} + + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -4212,11 +3905,7 @@ snapshots: file-entry-cache@6.0.1: dependencies: - flat-cache: 3.0.4 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 + flat-cache: 3.2.0 fill-range@7.1.1: dependencies: @@ -4246,18 +3935,19 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 - flat-cache@3.0.4: + flat-cache@3.2.0: dependencies: - flatted: 3.2.7 + flatted: 3.3.2 + keyv: 4.5.4 rimraf: 3.0.2 - flatted@3.2.7: {} + flatted@3.3.2: {} for-each@0.3.3: dependencies: is-callable: 1.2.7 - form-data@3.0.1: + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -4265,20 +3955,12 @@ snapshots: fs.realpath@1.0.0: {} - function-bind@1.1.1: {} - function-bind@1.1.2: {} - function.prototype.name@1.1.5: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - functions-have-names: 1.2.3 - - function.prototype.name@1.1.7: + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 + call-bound: 1.0.3 define-properties: 1.2.1 functions-have-names: 1.2.3 hasown: 2.0.2 @@ -4290,12 +3972,6 @@ snapshots: get-east-asian-width@1.3.0: {} - get-intrinsic@1.1.3: - dependencies: - function-bind: 1.1.1 - has: 1.0.3 - has-symbols: 1.0.3 - get-intrinsic@1.2.6: dependencies: call-bind-apply-helpers: 1.0.1 @@ -4318,11 +3994,6 @@ snapshots: '@sec-ant/readable-stream': 0.4.1 is-stream: 4.0.1 - get-symbol-description@1.0.0: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 @@ -4352,10 +4023,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.17.0: - dependencies: - type-fest: 0.20.2 - globals@13.24.0: dependencies: type-fest: 0.20.2 @@ -4373,8 +4040,8 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.2.12 - ignore: 5.2.0 + fast-glob: 3.3.2 + ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -4393,16 +4060,12 @@ snapshots: graphemer@1.4.0: {} - has-bigints@1.0.2: {} + has-bigints@1.1.0: {} has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.0: - dependencies: - get-intrinsic: 1.1.3 - has-property-descriptors@1.0.2: dependencies: es-define-property: 1.0.1 @@ -4411,21 +4074,11 @@ snapshots: dependencies: dunder-proto: 1.0.1 - has-symbols@1.0.3: {} - has-symbols@1.1.0: {} - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 - has-tostringtag@1.0.2: dependencies: - has-symbols: 1.0.3 - - has@1.0.3: - dependencies: - function-bind: 1.1.1 + has-symbols: 1.1.0 hasown@2.0.2: dependencies: @@ -4437,8 +4090,6 @@ snapshots: ignore@4.0.6: {} - ignore@5.2.0: {} - ignore@5.3.2: {} import-fresh@3.3.0: @@ -4461,12 +4112,6 @@ snapshots: inherits@2.0.4: {} - internal-slot@1.0.3: - dependencies: - get-intrinsic: 1.1.3 - has: 1.0.3 - side-channel: 1.0.4 - internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -4494,18 +4139,9 @@ snapshots: dependencies: has-tostringtag: 1.0.2 - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - is-bigint@1.1.0: dependencies: - has-bigints: 1.0.2 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 + has-bigints: 1.1.0 is-boolean-object@1.2.1: dependencies: @@ -4518,11 +4154,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.11.0: - dependencies: - has: 1.0.3 - - is-core-module@2.16.0: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -4532,10 +4164,6 @@ snapshots: get-intrinsic: 1.2.6 is-typed-array: 1.1.15 - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.0 - is-date-object@1.1.0: dependencies: call-bound: 1.0.3 @@ -4576,14 +4204,6 @@ snapshots: is-negated-glob@1.0.0: {} - is-negative-zero@2.0.2: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - is-number-object@1.1.1: dependencies: call-bound: 1.0.3 @@ -4605,11 +4225,6 @@ snapshots: lowercase-keys: 1.0.1 proto-props: 2.0.0 - is-regex@1.1.4: - dependencies: - call-bind: 1.0.2 - has-tostringtag: 1.0.0 - is-regex@1.2.1: dependencies: call-bound: 1.0.3 @@ -4623,29 +4238,17 @@ snapshots: is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.2 - is-shared-array-buffer@1.0.4: dependencies: call-bound: 1.0.3 is-stream@4.0.1: {} - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.0 - is-string@1.1.1: dependencies: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - is-symbol@1.1.1: dependencies: call-bound: 1.0.3 @@ -4666,10 +4269,6 @@ snapshots: is-weakmap@2.0.2: {} - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.2 - is-weakref@1.1.0: dependencies: call-bound: 1.0.3 @@ -4691,7 +4290,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 16.18.3 + '@types/node': 16.18.122 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -4712,6 +4311,8 @@ snapshots: jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} @@ -4720,15 +4321,11 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - json5@1.0.1: - dependencies: - minimist: 1.2.7 - json5@1.0.2: dependencies: - minimist: 1.2.7 + minimist: 1.2.8 - jsonwebtoken@8.5.1: + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 lodash.includes: 4.3.0 @@ -4738,8 +4335,8 @@ snapshots: lodash.isplainobject: 4.0.6 lodash.isstring: 4.0.1 lodash.once: 4.1.1 - ms: 2.1.2 - semver: 5.7.1 + ms: 2.1.3 + semver: 7.6.3 jwa@1.4.1: dependencies: @@ -4752,6 +4349,10 @@ snapshots: jwa: 1.4.1 safe-buffer: 5.2.1 + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -4801,15 +4402,11 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.4.0 + chalk: 5.4.1 is-unicode-supported: 1.3.0 lowercase-keys@1.0.1: {} - lru-cache@6.0.0: - dependencies: - yallist: 4.0.0 - math-intrinsics@1.1.0: {} memory-fs@0.2.0: {} @@ -4822,11 +4419,6 @@ snapshots: micro-spelling-correcter@1.1.1: {} - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -4848,19 +4440,17 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minimist@1.2.7: {} + minimist@1.2.8: {} moment@2.29.4: {} - ms@2.0.0: {} - - ms@2.1.2: {} + ms@2.1.3: {} natural-compare@1.4.0: {} neo-async@2.6.2: {} - node-fetch@2.6.7: + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -4869,8 +4459,8 @@ snapshots: normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 - semver: 5.7.1 + resolve: 1.22.10 + semver: 5.7.2 validate-npm-package-license: 3.0.4 npm-run-path@6.0.0: @@ -4880,19 +4470,10 @@ snapshots: obj-props@1.4.0: {} - object-inspect@1.12.2: {} - object-inspect@1.13.3: {} object-keys@1.1.1: {} - object.assign@4.1.4: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - has-symbols: 1.0.3 - object-keys: 1.1.1 - object.assign@4.1.7: dependencies: call-bind: 1.0.8 @@ -4906,20 +4487,14 @@ snapshots: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 object.groupby@1.0.3: dependencies: call-bind: 1.0.8 define-properties: 1.2.1 - es-abstract: 1.23.6 - - object.values@1.1.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 + es-abstract: 1.23.8 object.values@1.2.1: dependencies: @@ -4939,7 +4514,7 @@ snapshots: dependencies: wrappy: 1.0.2 - open-editor@5.0.0: + open-editor@5.1.0: dependencies: env-editor: 1.1.0 execa: 9.5.2 @@ -4953,15 +4528,6 @@ snapshots: is-inside-container: 1.0.0 is-wsl: 3.1.0 - optionator@0.9.1: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.3 - optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -4971,6 +4537,12 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.2.6 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -5003,7 +4575,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.12.11 + '@babel/code-frame': 7.26.2 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5050,9 +4622,9 @@ snapshots: prettier-linter-helpers@1.0.0: dependencies: - fast-diff: 1.2.0 + fast-diff: 1.3.0 - prettier@2.7.1: {} + prettier@2.8.8: {} prettier@3.4.2: {} @@ -5064,7 +4636,7 @@ snapshots: proto-props@2.0.0: {} - punycode@2.1.1: {} + punycode@2.3.1: {} queue-microtask@1.2.3: {} @@ -5090,22 +4662,16 @@ snapshots: call-bind: 1.0.8 define-properties: 1.2.1 dunder-proto: 1.0.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-errors: 1.3.0 get-intrinsic: 1.2.6 gopd: 1.2.0 which-builtin-type: 1.2.1 - regenerator-runtime@0.13.10: {} + regenerator-runtime@0.14.1: {} regexp-tree@0.1.27: {} - regexp.prototype.flags@1.4.3: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - functions-have-names: 1.2.3 - regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.8 @@ -5127,21 +4693,15 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.1: - dependencies: - is-core-module: 2.11.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - resolve@1.22.10: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.5: dependencies: - is-core-module: 2.16.0 + is-core-module: 2.16.1 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -5167,11 +4727,10 @@ snapshots: safe-buffer@5.2.1: {} - safe-regex-test@1.0.0: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - is-regex: 1.1.4 + es-errors: 1.3.0 + isarray: 2.0.5 safe-regex-test@1.1.0: dependencies: @@ -5181,27 +4740,21 @@ snapshots: schema-utils@3.3.0: dependencies: - '@types/json-schema': 7.0.11 + '@types/json-schema': 7.0.15 ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) schema-utils@4.3.0: dependencies: - '@types/json-schema': 7.0.11 - ajv: 8.11.0 - ajv-formats: 2.1.1(ajv@8.11.0) - ajv-keywords: 5.1.0(ajv@8.11.0) - - semver@5.7.1: {} + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) semver@5.7.2: {} semver@6.3.1: {} - semver@7.3.8: - dependencies: - lru-cache: 6.0.0 - semver@7.6.3: {} serialize-javascript@6.0.2: @@ -5250,12 +4803,6 @@ snapshots: object-inspect: 1.13.3 side-channel-map: 1.0.1 - side-channel@1.0.4: - dependencies: - call-bind: 1.0.2 - get-intrinsic: 1.1.3 - object-inspect: 1.12.2 - side-channel@1.1.0: dependencies: es-errors: 1.3.0 @@ -5317,16 +4864,10 @@ snapshots: call-bound: 1.0.3 define-data-property: 1.1.4 define-properties: 1.2.1 - es-abstract: 1.23.6 + es-abstract: 1.23.8 es-object-atoms: 1.0.0 has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -5334,12 +4875,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 - string.prototype.trimstart@1.0.6: - dependencies: - call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.4 - string.prototype.trimstart@1.0.8: dependencies: call-bind: 1.0.8 @@ -5390,9 +4925,9 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 - table@6.8.1: + table@6.9.0: dependencies: - ajv: 8.11.0 + ajv: 8.17.1 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -5437,18 +4972,11 @@ snapshots: dependencies: typescript: 5.7.2 - tsconfig-paths@3.14.1: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.1 - minimist: 1.2.7 - strip-bom: 3.0.0 - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 json5: 1.0.2 - minimist: 1.2.7 + minimist: 1.2.8 strip-bom: 3.0.0 tslib@1.14.1: {} @@ -5511,12 +5039,12 @@ snapshots: typescript@5.7.2: {} - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.2 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + call-bound: 1.0.3 + has-bigints: 1.1.0 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 unc-path-regex@0.1.2: {} @@ -5532,13 +5060,13 @@ snapshots: uri-js@4.4.1: dependencies: - punycode: 2.1.1 + punycode: 2.3.1 url-or-path@2.3.2: {} uuid@8.3.2: {} - v8-compile-cache@2.3.0: {} + v8-compile-cache@2.4.0: {} validate-npm-package-license@3.0.4: dependencies: @@ -5566,8 +5094,8 @@ snapshots: acorn: 8.14.0 browserslist: 4.24.3 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.17.1 - es-module-lexer: 1.5.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 @@ -5591,14 +5119,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -5610,7 +5130,7 @@ snapshots: which-builtin-type@1.2.1: dependencies: call-bound: 1.0.3 - function.prototype.name: 1.1.7 + function.prototype.name: 1.1.8 has-tostringtag: 1.0.2 is-async-function: 2.0.0 is-date-object: 1.1.0 @@ -5643,8 +5163,6 @@ snapshots: dependencies: isexe: 2.0.0 - word-wrap@1.2.3: {} - word-wrap@1.2.5: {} wrappy@1.0.2: {} @@ -5662,11 +5180,11 @@ snapshots: eslint-config-xo: 0.45.0(eslint@8.57.1) eslint-config-xo-typescript: 5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) eslint-formatter-pretty: 6.0.1 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0)(webpack@5.97.1(esbuild@0.14.47)) + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)) eslint-plugin-ava: 14.0.0(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10)(eslint@8.57.1) - eslint-plugin-n: 17.15.0(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1) + eslint-plugin-n: 17.15.1(eslint@8.57.1) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) eslint-plugin-promise: 6.6.0(eslint@8.57.1) @@ -5682,7 +5200,7 @@ snapshots: lodash-es: 4.17.21 meow: 13.2.0 micromatch: 4.0.8 - open-editor: 5.0.0 + open-editor: 5.1.0 prettier: 3.4.2 semver: 7.6.3 slash: 5.1.0 @@ -5695,8 +5213,6 @@ snapshots: - eslint-import-resolver-typescript - supports-color - yallist@4.0.0: {} - yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 227e320..2723e3f 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,20 +1,20 @@ import {type Client} from '@microsoft/microsoft-graph-client'; import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; -import {type App, Notice} from 'obsidian'; +import {Notice} from 'obsidian'; import {t} from '../lib/lang.js'; -import {log, logging} from '../lib/logging.js'; -import {MicrosoftClientProvider} from './microsoftClientProvider.js'; +import {logging} from '../lib/logging.js'; +import {type MicrosoftClientProvider} from './microsoftClientProvider.js'; export class TodoApi { private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); private client: Client; - constructor(app: App) { - new MicrosoftClientProvider(app).getClient().then(client => { + constructor(clientProvider: MicrosoftClientProvider) { + clientProvider.getClient().then(client => { this.client = client; }).catch(() => { - const notice = new Notice(t('Notice_UnableToAcquireClient')); + throw new Error(t('Notice_UnableToAcquireClient')); }); } @@ -29,11 +29,23 @@ export class TodoApi { const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; return Promise.all( todoLists.map(async taskList => { - const containedTasks = await this.getListTasks(taskList.id, searchPattern); - return { - ...taskList, - tasks: containedTasks, - }; + try { + const containedTasks = await this.getListTasks(taskList.id, searchPattern); + return { + ...taskList, + tasks: containedTasks, + }; + } catch (error) { + this.logger.error('Failed to get tasks for list', taskList.displayName); + if (error instanceof Error) { + this.logger.error(error.message); + this.logger.error(error.stack ?? 'No stack trace available'); + const raisedError = new Error(error.message); + throw raisedError; + } + + throw new Error('Unknown issue getting Lists'); + } }), ); } @@ -115,7 +127,7 @@ export class TodoApi { .filter(searchText) .get() .catch(error => { - new Notice(t('Notice_UnableToAcquireTaskFromConfiguredList')); + throw new Error(t('Notice_UnableToAcquireTaskFromConfiguredList')); }); if (!res) { return; diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 24e4465..2ac0c03 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -98,7 +98,7 @@ export async function postTask( return; } - const notice = new Notice(t('CommandNotice_CreatingToDo'), 3000); + const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); const activeFile = plugin.app.workspace.getActiveFile(); if (activeFile === null) { return; diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index 0f89e2e..e7a0b98 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -6,13 +6,18 @@ "Cancel": "Cancel", "Close": "Close", "CommandNotice_CreatingToDo": "Creating To Do...", + "CommandNotice_UpdatingToDo": "Updating To Do...", "CommandNotice_NothingSelected": "It seems that nothing is selected", "CommandNotice_SetListName": "Set the name of the list to synchronize within settings first.", + "CommandName_PushToMsTodo": "Push to Microsoft To Do", + "CommandName_PushToMsTodoAndReplace": "Push to Microsoft To Do and replace", + "CommandName_OpenToDo": "Open To Do", + "CommandName_InsertSummary": "Insert summary from Microsoft To Do.", "Complete": "Complete", "Delete": "Delete", "EditorMenu_OpenToDo": "Open To Do", - "EditorMenu_SyncToTodo": "Sync to Microsoft Todo", - "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft Todo and update", + "EditorMenu_SyncToTodo": "Sync to Microsoft To Do", + "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft To Do and update", "Enter": "Enter", "Friday": "Friday", "Language": "English", @@ -20,7 +25,7 @@ "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard", "Notice_DeviceCodeOnClipboard": "The device code has been copied to the clipboard, please enter it in the browser interface that opens", "Notice_UnableToAcquireTaskFromConfiguredList": "Unable to acquire task from configured list, check to see it exists and has not been deleted", - "PluginDescription": "An obsidian plugin that syncs Microsoft Todo", + "PluginDescription": "An obsidian plugin that syncs Microsoft To Do", "PluginTitle": "Microsoft To Do Sync", "Prepend": "Prepend", "Saturday": "Saturday", @@ -31,7 +36,7 @@ "Settings_JournalFormatting_Folder": "Folder", "Settings_JournalFormatting_FolderDescription": "Folder where the diary is stored", "Settings_JournalFormatting_PeriodicNotes": "Consistent with the Periodic Notes plugin", - "Settings_Todo_DefaultListName": "The default synchronization Microsoft Todo list name", + "Settings_Todo_DefaultListName": "The default synchronization Microsoft To Do list name", "Settings_Todo_DefaultListNameDescription": "If it does not exist, the list is created with that name", "Settings_Todo_Display_AddCreatedAtOnReplace": "Add Created At on Replace", "Settings_Todo_Display_AddCreatedAtOnReplaceDescription": "If you select to replace the task and this is enabled 'Created at {Time Format}'", diff --git a/src/main.ts b/src/main.ts index 82148f2..31ae35c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,5 +1,5 @@ import { - type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Platform, Plugin, + type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Notice, Platform, Plugin, } from 'obsidian'; import {TodoApi} from './api/todoApi.js'; import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; @@ -9,11 +9,13 @@ import { import {t} from './lib/lang.js'; import {log, logging} from './lib/logging.js'; import {SettingsManager} from './utils/settingsManager.js'; +import {MicrosoftClientProvider} from './api/microsoftClientProvider.js'; export default class MsTodoSync extends Plugin { settings: IMsTodoSyncSettings; public todoApi: TodoApi; public settingsManager: SettingsManager; + public microsoftClientProvider: MicrosoftClientProvider; // Pulls the meta data for the a page to help with list processing. getPageMetadata(path: string): CachedMetadata | undefined { @@ -33,7 +35,18 @@ export default class MsTodoSync extends Plugin { this.addSettingTab(new MsTodoSyncSettingTab(this.app, this)); - this.todoApi = new TodoApi(this.app); + try { + this.microsoftClientProvider = new MicrosoftClientProvider(this.app); + } catch (error) { + if (error instanceof Error) { + const notice = new Notice(error.message); + log('error', error.message); + log('error', error.stack ?? 'No stack trace available'); + return; + } + } + + this.todoApi = new TodoApi(this.microsoftClientProvider); this.settingsManager = new SettingsManager(this); } @@ -66,15 +79,9 @@ export default class MsTodoSync extends Plugin { private registerCommands() { this.addCommand({ id: 'only-create-task', - name: 'Post the selection as todos to MsTodo.', + name: t('CommandName_PushToMsTodo'), editorCallback: async (editor: Editor, view: MarkdownView) => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ); + await this.pushTaskToMsTodo(editor); }, }); @@ -82,40 +89,24 @@ export default class MsTodoSync extends Plugin { // Register command: Create and replace the selected text to Microsoft To-Do this.addCommand({ id: 'create-task-replace', - name: 'Post the selection as todos to MsTodo and Replace.', + name: t('CommandName_PushToMsTodoAndReplace'), editorCallback: async (editor: Editor, view: MarkdownView) => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); + await this.pushTaskToMsTodoAndUpdatePage(editor); }, }); // Register command: Open link to ToDo this.addCommand({ id: 'open-task-link', - name: 'Open To Do', + name: t('CommandName_OpenToDo'), editorCallback: async (editor: Editor, view: MarkdownView) => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } + this.viewTaskInTodo(editor); }, }); this.addCommand({ id: 'add-microsoft-todo', - name: 'Insert the MsTodo summary.', + name: t('CommandName_InsertSummary'), editorCallback: async (editor: Editor, view: MarkdownView) => { await createTodayTasks(this.todoApi, this.settings, editor); }, @@ -143,13 +134,7 @@ export default class MsTodoSync extends Plugin { menu.addItem(item => { item.setTitle(t('EditorMenu_SyncToTodo')).onClick( async e => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ); + await this.pushTaskToMsTodo(editor); }, ); }); @@ -163,14 +148,7 @@ export default class MsTodoSync extends Plugin { menu.addItem(item => { item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( async e => { - await postTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); + await this.pushTaskToMsTodoAndUpdatePage(editor); }, ); }); @@ -217,19 +195,70 @@ export default class MsTodoSync extends Plugin { this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } + this.viewTaskInTodo(editor); }); }); }), ); } + + /** + * Opens the task in Microsoft To Do based on the cursor location in the editor. + * If the task ID is found in the current line, it will open the task details either + * using the application protocol (if not on mobile and the setting is enabled) or + * via the web URL. + * + * @param editor - The editor instance where the cursor is located. + */ + private viewTaskInTodo(editor: Editor) { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = getTaskIdFromLine(line, this); + if (taskId !== '') { + if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } + } + + /** + * Pushes a task to Microsoft To-Do and updates the page. + * + * This method posts a task to the Microsoft To-Do API using the provided editor instance, + * the active file's path, and the current settings. After posting the task, it updates + * the page accordingly. + * + * @param editor - The editor instance containing the task to be posted. + * @returns A promise that resolves when the task has been posted and the page updated. + */ + private async pushTaskToMsTodoAndUpdatePage(editor: Editor) { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + } + + /** + * Pushes a task to Microsoft To-Do. + * + * @param editor - The editor instance containing the task to be pushed. + * @returns A promise that resolves when the task has been successfully pushed. + */ + private async pushTaskToMsTodo(editor: Editor) { + await postTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + false, + ); + } } + diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index fb8417d..22e141c 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/parameter-properties */ import { type AttachmentBase, type AttachmentSession, @@ -18,6 +17,10 @@ import {t} from '../lib/lang.js'; import {logging} from '../lib/logging.js'; import {IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX} from '../constants.js'; +/** + * Represents a task in Obsidian that can be synchronized with Microsoft To Do. + * Implements the TodoTask interface. + */ export class ObsidianTodoTask implements TodoTask { id: string; @@ -34,7 +37,9 @@ export class ObsidianTodoTask implements TodoTask { * that the user has defined. */ public categories?: NullableOption; - // The date and time in the specified time zone that the task was finished. + /** + * The date and time in the specified time zone that the task was finished. + */ public completedDateTime?: NullableOption; /** * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the @@ -43,47 +48,115 @@ export class ObsidianTodoTask implements TodoTask { */ public createdDateTime?: string; // The date and time in the specified time zone that the task is to be finished. + + /** + * The date and time in the specified time zone that the task is to be finished. + */ public dueDateTime?: NullableOption; + + /** + * Indicates whether the task has attachments. + */ public hasAttachments?: NullableOption; - // The importance of the task. Possible values are: low, normal, high. + + /** + * The importance of the task. Possible values are: low, normal, high. + */ public importance?: Importance; - // Set to true if an alert is set to remind the user of the task. + + /** + * Set to true if an alert is set to remind the user of the task. + */ public isReminderOn?: boolean; + /** * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, * 2020 would look like this: '2020-01-01T00:00:00Z'. */ public lastModifiedDateTime?: string; - // The recurrence pattern for the task. + + /** + * The recurrence pattern for the task. + */ public recurrence?: NullableOption; - // The date and time in the specified time zone for a reminder alert of the task to occur. + + /** + * The date and time in the specified time zone for a reminder alert of the task to occur. + */ public reminderDateTime?: NullableOption; + + /** + * The date and time in the specified time zone that the task is to start. + */ public startDateTime?: NullableOption; + /** * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, * deferred. */ public status?: TaskStatus; - // A brief description of the task. + /** + * A brief description of the task. + */ public title?: NullableOption; + + /** + * A collection of attachments linked to the task. + */ public attachments?: NullableOption; + + /** + * A collection of attachment sessions linked to the task. + */ public attachmentSessions?: NullableOption; - // A collection of checklistItems linked to a task. + + /** + * A collection of checklist items linked to the task. + */ public checklistItems?: NullableOption; - // The collection of open extensions defined for the task. Nullable. + + /** + * The collection of open extensions defined for the task. Nullable. + */ public extensions?: NullableOption; - // A collection of resources linked to the task. + + /** + * A collection of resources linked to the task. + */ public linkedResources?: NullableOption; + /** + * The block link associated with the task. + */ public blockLink?: string; + + /** + * The name of the file where the task is located. + */ public fileName?: string; + /** + * Logger instance for logging task-related information. + */ private readonly logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); + /** + * Manager for handling settings related to the task. + */ private readonly settingsManager: ISettingsManager; + + /** + * The original title of the task. + */ private readonly originalTitle: string; + /** + * Creates an instance of ObsidianTodoTask. + * @param settingsManager - The settings manager instance. + * @param line - The line of text representing the task. + * @param fileName - The name of the file where the task is located. + */ constructor(settingsManager: ISettingsManager, line: string, fileName: string) { this.settingsManager = settingsManager; this.fileName = fileName; @@ -145,6 +218,11 @@ export class ObsidianTodoTask implements TodoTask { this.settingsManager.saveSettings(); } + /** + * Get the task as a TodoTask object. + * @param withChecklist - Whether to include checklist items in the returned task. + * @returns The task as a TodoTask object. + */ public getTodoTask(withChecklist = false): TodoTask { const toDo: TodoTask = { title: this.title, @@ -173,6 +251,10 @@ export class ObsidianTodoTask implements TodoTask { return toDo; } + /** + * Set the body content of the task. + * @param body - The body content to set. + */ public setBody(body: string) { this.body = { content: body, @@ -180,6 +262,10 @@ export class ObsidianTodoTask implements TodoTask { }; } + /** + * Add a checklist item to the task. + * @param item - The checklist item to add. + */ public addChecklistItem(item: string) { this.checklistItems ||= []; @@ -243,6 +329,10 @@ export class ObsidianTodoTask implements TodoTask { return output; } + /** + * Check the task title for a status indicator and update the status accordingly. + * @param line - The line of text representing the task. + */ private checkForStatus(line: string) { const regex = /\[(.)]/; @@ -255,6 +345,10 @@ export class ObsidianTodoTask implements TodoTask { } } + /** + * Check the task title for an importance indicator and update the importance accordingly. + * @param line - The line of text representing the task. + */ private checkForImportance(line: string) { this.importance = 'normal'; @@ -267,6 +361,10 @@ export class ObsidianTodoTask implements TodoTask { } } + /** + * Get the priority indicator based on the task's importance. + * @returns The priority indicator as a string. + */ private getPriorityIndicator(): string { switch (this.importance) { case 'normal': { @@ -287,6 +385,10 @@ export class ObsidianTodoTask implements TodoTask { } } + /** + * Get the status indicator based on the task's status. + * @returns The status indicator as a string. + */ private getStatusIndicator(): string { switch (this.status) { case 'notStarted': { @@ -307,6 +409,10 @@ export class ObsidianTodoTask implements TodoTask { } } + /** + * Check the task title for a block link and update the block link and ID accordingly. + * @param line - The line of text representing the task. + */ private checkForBlockLink(line: string) { const blockLinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blockLinkMatch = blockLinkRegex.exec(line); @@ -323,10 +429,18 @@ export class ObsidianTodoTask implements TodoTask { } } + /** + * Get the clean title of the task, without any block links or status indicators. + * @returns The clean title as a string. + */ public get cleanTitle(): string { return ''; } + /** + * Check if the task has a block link. + * @returns True if the task has a block link, false otherwise. + */ public get hasBlockLink(): boolean { return this.blockLink !== undefined && this.blockLink.length > 0; } diff --git a/src/utils/formatter.ts b/src/utils/formatter.ts index 02b9e4b..03042aa 100644 --- a/src/utils/formatter.ts +++ b/src/utils/formatter.ts @@ -2,9 +2,9 @@ import {TASK_REGEX} from 'src/constants'; import type MsTodoSync from '../main.js'; export const formatTask = (plugin: MsTodoSync, line: string) => { - let output: string; - const format = plugin.settings.displayOptions_ReplacementFormat; - // eslint-disable-next-line prefer-const - output = format.replace(TASK_REGEX, line); - return output; + let output: string; + const format = plugin.settings.displayOptions_ReplacementFormat; + // eslint-disable-next-line prefer-const + output = format.replace(TASK_REGEX, line); + return output; }; From a6680de480d61bf69b742a856c84c0b35ab5fd95 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 09:57:59 -0800 Subject: [PATCH 11/34] chore: updated @azure/msal-node to a supported version --- package.json | 2 +- pnpm-lock.yaml | 21 +++++++-------------- 2 files changed, 8 insertions(+), 15 deletions(-) diff --git a/package.json b/package.json index abbaf7d..82f22fc 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ }, "dependencies": { "@azure/msal-common": "^14.16.0", - "@azure/msal-node": "^1.18.4", + "@azure/msal-node": "^2.16.2", "@microsoft/microsoft-graph-client": "^3.0.7", "@microsoft/microsoft-graph-types": "^2.40.0", "eventemitter2": "^6.4.9", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b36089b..8e60028 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,8 +12,8 @@ importers: specifier: ^14.16.0 version: 14.16.0 '@azure/msal-node': - specifier: ^1.18.4 - version: 1.18.4 + specifier: ^2.16.2 + version: 2.16.2 '@microsoft/microsoft-graph-client': specifier: ^3.0.7 version: 3.0.7 @@ -78,18 +78,13 @@ importers: packages: - '@azure/msal-common@13.3.1': - resolution: {integrity: sha512-Lrk1ozoAtaP/cp53May3v6HtcFSVxdFrg2Pa/1xu5oIvsIwhxW6zSPibKefCOVgd5osgykMi5jjcZHv8XkzZEQ==} - engines: {node: '>=0.8.0'} - '@azure/msal-common@14.16.0': resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@1.18.4': - resolution: {integrity: sha512-Kc/dRvhZ9Q4+1FSfsTFDME/v6+R2Y1fuMty/TfwqE5p9GTPw08BPbKgeWinE8JRHRp+LemjQbUZsn4Q4l6Lszg==} - engines: {node: 10 || 12 || 14 || 16 || 18} - deprecated: A newer major version of this library is available. Please upgrade to the latest available version. + '@azure/msal-node@2.16.2': + resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} + engines: {node: '>=16'} '@babel/code-frame@7.12.11': resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -2508,13 +2503,11 @@ packages: snapshots: - '@azure/msal-common@13.3.1': {} - '@azure/msal-common@14.16.0': {} - '@azure/msal-node@1.18.4': + '@azure/msal-node@2.16.2': dependencies: - '@azure/msal-common': 13.3.1 + '@azure/msal-common': 14.16.0 jsonwebtoken: 9.0.2 uuid: 8.3.2 From a1a7950e1cabd636ffd04b9338430bd8fbc3fcf5 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 10:01:59 -0800 Subject: [PATCH 12/34] chore: update typescript to 4.9.5 --- package.json | 10 +- pnpm-lock.yaml | 383 ++++++++++++++++++++++++++----------------------- 2 files changed, 206 insertions(+), 187 deletions(-) diff --git a/package.json b/package.json index 82f22fc..1aca97f 100644 --- a/package.json +++ b/package.json @@ -19,10 +19,10 @@ "devDependencies": { "@types/node": "^16.18.122", "@types/node-fetch": "^2.6.12", - "@typescript-eslint/eslint-plugin": "5.29.0", - "@typescript-eslint/parser": "5.29.0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "builtin-modules": "3.3.0", - "esbuild": "0.14.47", + "esbuild": "^0.14.54", "eslint": "^7.32.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-import": "^2.31.0", @@ -30,8 +30,8 @@ "eslint-plugin-prettier": "^4.2.1", "obsidian": "latest", "prettier": "^2.8.8", - "tslib": "2.4.0", - "typescript": "4.7.4", + "tslib": "^2.8.1", + "typescript": "^4.9.5", "xo": "^0.60.0" }, "dependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8e60028..e949b4a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,17 +34,17 @@ importers: specifier: ^2.6.12 version: 2.6.12 '@typescript-eslint/eslint-plugin': - specifier: 5.29.0 - version: 5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4) + specifier: ^5.62.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) '@typescript-eslint/parser': - specifier: 5.29.0 - version: 5.29.0(eslint@7.32.0)(typescript@4.7.4) + specifier: ^5.62.0 + version: 5.62.0(eslint@7.32.0)(typescript@4.9.5) builtin-modules: specifier: 3.3.0 version: 3.3.0 esbuild: - specifier: 0.14.47 - version: 0.14.47 + specifier: ^0.14.54 + version: 0.14.54 eslint: specifier: ^7.32.0 version: 7.32.0 @@ -53,7 +53,7 @@ importers: version: 8.10.0(eslint@7.32.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) + version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0) eslint-plugin-no-loops: specifier: ^0.3.0 version: 0.3.0(eslint@7.32.0) @@ -67,14 +67,14 @@ importers: specifier: ^2.8.8 version: 2.8.8 tslib: - specifier: 2.4.0 - version: 2.4.0 + specifier: ^2.8.1 + version: 2.8.1 typescript: - specifier: 4.7.4 - version: 4.7.4 + specifier: ^4.9.5 + version: 4.9.5 xo: specifier: ^0.60.0 - version: 0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.47)) + version: 0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.54)) packages: @@ -111,6 +111,12 @@ packages: '@codemirror/view@6.4.1': resolution: {integrity: sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==} + '@esbuild/linux-loong64@0.14.54': + resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -261,11 +267,14 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/tern@0.23.9': resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} - '@typescript-eslint/eslint-plugin@5.29.0': - resolution: {integrity: sha512-kgTsISt9pM53yRFQmLZ4npj99yGl3x3Pl7z4eA66OuTzAGC4bQB5H5fuLwPnqTKU3yyrrg4MIhjF17UYnL4c0w==} + '@typescript-eslint/eslint-plugin@5.62.0': + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -286,8 +295,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@5.29.0': - resolution: {integrity: sha512-ruKWTv+x0OOxbzIw9nW5oWlUopvP/IQDjB5ZqmTglLIoDTctLlAJpAQFpNPJP/ZI7hTT9sARBosEfaKbcFuECw==} + '@typescript-eslint/parser@5.62.0': + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -306,16 +315,16 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@5.29.0': - resolution: {integrity: sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==} + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@5.29.0': - resolution: {integrity: sha512-JK6bAaaiJozbox3K220VRfCzLa9n0ib/J+FHIwnaV3Enw/TO267qe0pM1b1QrrEuy6xun374XEAsRlA86JJnyg==} + '@typescript-eslint/type-utils@5.62.0': + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -334,16 +343,16 @@ packages: typescript: optional: true - '@typescript-eslint/types@5.29.0': - resolution: {integrity: sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==} + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@5.29.0': - resolution: {integrity: sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==} + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -360,8 +369,8 @@ packages: typescript: optional: true - '@typescript-eslint/utils@5.29.0': - resolution: {integrity: sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==} + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -372,8 +381,8 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@5.29.0': - resolution: {integrity: sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==} + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} '@typescript-eslint/visitor-keys@7.18.0': @@ -807,128 +816,128 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild-android-64@0.14.47: - resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + esbuild-android-64@0.14.54: + resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==} engines: {node: '>=12'} cpu: [x64] os: [android] - esbuild-android-arm64@0.14.47: - resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + esbuild-android-arm64@0.14.54: + resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==} engines: {node: '>=12'} cpu: [arm64] os: [android] - esbuild-darwin-64@0.14.47: - resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + esbuild-darwin-64@0.14.54: + resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==} engines: {node: '>=12'} cpu: [x64] os: [darwin] - esbuild-darwin-arm64@0.14.47: - resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + esbuild-darwin-arm64@0.14.54: + resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] - esbuild-freebsd-64@0.14.47: - resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + esbuild-freebsd-64@0.14.54: + resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] - esbuild-freebsd-arm64@0.14.47: - resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + esbuild-freebsd-arm64@0.14.54: + resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] - esbuild-linux-32@0.14.47: - resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + esbuild-linux-32@0.14.54: + resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==} engines: {node: '>=12'} cpu: [ia32] os: [linux] - esbuild-linux-64@0.14.47: - resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + esbuild-linux-64@0.14.54: + resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==} engines: {node: '>=12'} cpu: [x64] os: [linux] - esbuild-linux-arm64@0.14.47: - resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + esbuild-linux-arm64@0.14.54: + resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==} engines: {node: '>=12'} cpu: [arm64] os: [linux] - esbuild-linux-arm@0.14.47: - resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + esbuild-linux-arm@0.14.54: + resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==} engines: {node: '>=12'} cpu: [arm] os: [linux] - esbuild-linux-mips64le@0.14.47: - resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + esbuild-linux-mips64le@0.14.54: + resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] - esbuild-linux-ppc64le@0.14.47: - resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + esbuild-linux-ppc64le@0.14.54: + resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] - esbuild-linux-riscv64@0.14.47: - resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + esbuild-linux-riscv64@0.14.54: + resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] - esbuild-linux-s390x@0.14.47: - resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + esbuild-linux-s390x@0.14.54: + resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==} engines: {node: '>=12'} cpu: [s390x] os: [linux] - esbuild-netbsd-64@0.14.47: - resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + esbuild-netbsd-64@0.14.54: + resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - esbuild-openbsd-64@0.14.47: - resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + esbuild-openbsd-64@0.14.54: + resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - esbuild-sunos-64@0.14.47: - resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + esbuild-sunos-64@0.14.54: + resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} engines: {node: '>=12'} cpu: [x64] os: [sunos] - esbuild-windows-32@0.14.47: - resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + esbuild-windows-32@0.14.54: + resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==} engines: {node: '>=12'} cpu: [ia32] os: [win32] - esbuild-windows-64@0.14.47: - resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + esbuild-windows-64@0.14.54: + resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] - esbuild-windows-arm64@0.14.47: - resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + esbuild-windows-arm64@0.14.54: + resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==} engines: {node: '>=12'} cpu: [arm64] os: [win32] - esbuild@0.14.47: - resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + esbuild@0.14.54: + resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==} engines: {node: '>=12'} hasBin: true @@ -1802,6 +1811,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -2328,9 +2340,6 @@ packages: tslib@1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.4.0: - resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -2376,8 +2385,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript@4.7.4: - resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true @@ -2542,6 +2551,14 @@ snapshots: style-mod: 4.1.2 w3c-keyname: 2.2.8 + '@esbuild/linux-loong64@0.14.54': + optional: true + + '@eslint-community/eslint-utils@4.4.1(eslint@7.32.0)': + dependencies: + eslint: 7.32.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -2640,7 +2657,7 @@ snapshots: '@microsoft/microsoft-graph-client@3.0.7': dependencies: '@babel/runtime': 7.26.0 - tslib: 2.4.0 + tslib: 2.8.1 '@microsoft/microsoft-graph-types@2.40.0': {} @@ -2700,25 +2717,28 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/semver@7.5.8': {} + '@types/tern@0.23.9': dependencies: '@types/estree': 1.0.6 - '@typescript-eslint/eslint-plugin@5.29.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0)(typescript@4.7.4)': + '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) - '@typescript-eslint/scope-manager': 5.29.0 - '@typescript-eslint/type-utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) - '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) debug: 4.4.0 eslint: 7.32.0 - functional-red-black-tree: 1.0.1 + graphemer: 1.4.0 ignore: 5.3.2 - regexpp: 3.2.0 + natural-compare-lite: 1.4.0 semver: 7.6.3 - tsutils: 3.21.0(typescript@4.7.4) + tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: - typescript: 4.7.4 + typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -2740,15 +2760,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + '@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5)': 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/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) debug: 4.4.0 eslint: 7.32.0 optionalDependencies: - typescript: 4.7.4 + typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -2765,24 +2785,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.29.0': + '@typescript-eslint/scope-manager@5.62.0': dependencies: - '@typescript-eslint/types': 5.29.0 - '@typescript-eslint/visitor-keys': 5.29.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + '@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/utils': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) debug: 4.4.0 eslint: 7.32.0 - tsutils: 3.21.0(typescript@4.7.4) + tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: - typescript: 4.7.4 + typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -2798,21 +2819,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.29.0': {} + '@typescript-eslint/types@5.62.0': {} '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/typescript-estree@5.29.0(typescript@4.7.4)': + '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 5.29.0 - '@typescript-eslint/visitor-keys': 5.29.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 - tsutils: 3.21.0(typescript@4.7.4) + tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: - typescript: 4.7.4 + typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -2831,15 +2852,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.29.0(eslint@7.32.0)(typescript@4.7.4)': + '@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@7.32.0) '@types/json-schema': 7.0.15 - '@typescript-eslint/scope-manager': 5.29.0 - '@typescript-eslint/types': 5.29.0 - '@typescript-eslint/typescript-estree': 5.29.0(typescript@4.7.4) + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 7.32.0 eslint-scope: 5.1.1 - eslint-utils: 3.0.0(eslint@7.32.0) + semver: 7.6.3 transitivePeerDependencies: - supports-color - typescript @@ -2855,9 +2878,9 @@ snapshots: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.29.0': + '@typescript-eslint/visitor-keys@5.62.0': dependencies: - '@typescript-eslint/types': 5.29.0 + '@typescript-eslint/types': 5.62.0 eslint-visitor-keys: 3.4.3 '@typescript-eslint/visitor-keys@7.18.0': @@ -3369,88 +3392,89 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-android-64@0.14.47: + esbuild-android-64@0.14.54: optional: true - esbuild-android-arm64@0.14.47: + esbuild-android-arm64@0.14.54: optional: true - esbuild-darwin-64@0.14.47: + esbuild-darwin-64@0.14.54: optional: true - esbuild-darwin-arm64@0.14.47: + esbuild-darwin-arm64@0.14.54: optional: true - esbuild-freebsd-64@0.14.47: + esbuild-freebsd-64@0.14.54: optional: true - esbuild-freebsd-arm64@0.14.47: + esbuild-freebsd-arm64@0.14.54: optional: true - esbuild-linux-32@0.14.47: + esbuild-linux-32@0.14.54: optional: true - esbuild-linux-64@0.14.47: + esbuild-linux-64@0.14.54: optional: true - esbuild-linux-arm64@0.14.47: + esbuild-linux-arm64@0.14.54: optional: true - esbuild-linux-arm@0.14.47: + esbuild-linux-arm@0.14.54: optional: true - esbuild-linux-mips64le@0.14.47: + esbuild-linux-mips64le@0.14.54: optional: true - esbuild-linux-ppc64le@0.14.47: + esbuild-linux-ppc64le@0.14.54: optional: true - esbuild-linux-riscv64@0.14.47: + esbuild-linux-riscv64@0.14.54: optional: true - esbuild-linux-s390x@0.14.47: + esbuild-linux-s390x@0.14.54: optional: true - esbuild-netbsd-64@0.14.47: + esbuild-netbsd-64@0.14.54: optional: true - esbuild-openbsd-64@0.14.47: + esbuild-openbsd-64@0.14.54: optional: true - esbuild-sunos-64@0.14.47: + esbuild-sunos-64@0.14.54: optional: true - esbuild-windows-32@0.14.47: + esbuild-windows-32@0.14.54: optional: true - esbuild-windows-64@0.14.47: + esbuild-windows-64@0.14.54: optional: true - esbuild-windows-arm64@0.14.47: + esbuild-windows-arm64@0.14.54: optional: true - esbuild@0.14.47: + esbuild@0.14.54: optionalDependencies: - esbuild-android-64: 0.14.47 - esbuild-android-arm64: 0.14.47 - esbuild-darwin-64: 0.14.47 - esbuild-darwin-arm64: 0.14.47 - esbuild-freebsd-64: 0.14.47 - esbuild-freebsd-arm64: 0.14.47 - esbuild-linux-32: 0.14.47 - esbuild-linux-64: 0.14.47 - esbuild-linux-arm: 0.14.47 - esbuild-linux-arm64: 0.14.47 - esbuild-linux-mips64le: 0.14.47 - esbuild-linux-ppc64le: 0.14.47 - esbuild-linux-riscv64: 0.14.47 - esbuild-linux-s390x: 0.14.47 - esbuild-netbsd-64: 0.14.47 - esbuild-openbsd-64: 0.14.47 - esbuild-sunos-64: 0.14.47 - esbuild-windows-32: 0.14.47 - esbuild-windows-64: 0.14.47 - esbuild-windows-arm64: 0.14.47 + '@esbuild/linux-loong64': 0.14.54 + esbuild-android-64: 0.14.54 + esbuild-android-arm64: 0.14.54 + esbuild-darwin-64: 0.14.54 + esbuild-darwin-arm64: 0.14.54 + esbuild-freebsd-64: 0.14.54 + esbuild-freebsd-arm64: 0.14.54 + esbuild-linux-32: 0.14.54 + esbuild-linux-64: 0.14.54 + esbuild-linux-arm: 0.14.54 + esbuild-linux-arm64: 0.14.54 + esbuild-linux-mips64le: 0.14.54 + esbuild-linux-ppc64le: 0.14.54 + esbuild-linux-riscv64: 0.14.54 + esbuild-linux-s390x: 0.14.54 + esbuild-netbsd-64: 0.14.54 + esbuild-openbsd-64: 0.14.54 + esbuild-sunos-64: 0.14.54 + esbuild-windows-32: 0.14.54 + esbuild-windows-64: 0.14.54 + esbuild-windows-arm64: 0.14.54 escalade@3.2.0: {} @@ -3502,11 +3526,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)): + eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)): dependencies: debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -3515,28 +3539,28 @@ snapshots: lodash: 4.17.21 resolve: 2.0.0-next.5 semver: 5.7.2 - webpack: 5.97.1(esbuild@0.14.47) + webpack: 5.97.1(esbuild@0.14.54) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) eslint: 7.32.0 eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)) + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)) transitivePeerDependencies: - supports-color @@ -3565,7 +3589,7 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3576,7 +3600,7 @@ snapshots: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3588,13 +3612,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.29.0(eslint@7.32.0)(typescript@4.7.4) + '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3605,7 +3629,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3704,11 +3728,6 @@ snapshots: dependencies: eslint-visitor-keys: 1.3.0 - eslint-utils@3.0.0(eslint@7.32.0): - dependencies: - eslint: 7.32.0 - eslint-visitor-keys: 2.1.0 - eslint-utils@3.0.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -4439,6 +4458,8 @@ snapshots: ms@2.1.3: {} + natural-compare-lite@1.4.0: {} + natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -4930,16 +4951,16 @@ snapshots: tapable@2.2.1: {} - terser-webpack-plugin@5.3.11(esbuild@0.14.47)(webpack@5.97.1(esbuild@0.14.47)): + terser-webpack-plugin@5.3.11(esbuild@0.14.54)(webpack@5.97.1(esbuild@0.14.54)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 4.3.0 serialize-javascript: 6.0.2 terser: 5.37.0 - webpack: 5.97.1(esbuild@0.14.47) + webpack: 5.97.1(esbuild@0.14.54) optionalDependencies: - esbuild: 0.14.47 + esbuild: 0.14.54 terser@5.37.0: dependencies: @@ -4974,14 +4995,12 @@ snapshots: tslib@1.14.1: {} - tslib@2.4.0: {} - tslib@2.8.1: {} - tsutils@3.21.0(typescript@4.7.4): + tsutils@3.21.0(typescript@4.9.5): dependencies: tslib: 1.14.1 - typescript: 4.7.4 + typescript: 4.9.5 type-check@0.4.0: dependencies: @@ -5028,7 +5047,7 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.9 - typescript@4.7.4: {} + typescript@4.9.5: {} typescript@5.7.2: {} @@ -5077,7 +5096,7 @@ snapshots: webpack-sources@3.2.3: {} - webpack@5.97.1(esbuild@0.14.47): + webpack@5.97.1(esbuild@0.14.54): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -5099,7 +5118,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(esbuild@0.14.47)(webpack@5.97.1(esbuild@0.14.47)) + terser-webpack-plugin: 5.3.11(esbuild@0.14.54)(webpack@5.97.1(esbuild@0.14.54)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -5160,7 +5179,7 @@ snapshots: wrappy@1.0.2: {} - xo@0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.47)): + xo@0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.54)): dependencies: '@eslint/eslintrc': 3.2.0 '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) @@ -5173,10 +5192,10 @@ snapshots: eslint-config-xo: 0.45.0(eslint@8.57.1) eslint-config-xo-typescript: 5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) eslint-formatter-pretty: 6.0.1 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)) + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)) eslint-plugin-ava: 14.0.0(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.29.0(eslint@7.32.0)(typescript@4.7.4))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.47)))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) eslint-plugin-n: 17.15.1(eslint@8.57.1) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) @@ -5200,7 +5219,7 @@ snapshots: to-absolute-glob: 3.0.0 typescript: 5.7.2 optionalDependencies: - webpack: 5.97.1(esbuild@0.14.47) + webpack: 5.97.1(esbuild@0.14.54) transitivePeerDependencies: - '@types/eslint' - eslint-import-resolver-typescript From 0dc2e63b88c5a3a8541822a320880d541ea7ca96 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 10:05:08 -0800 Subject: [PATCH 13/34] refactor: remove obsidian reference from todo api --- src/api/todoApi.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 2723e3f..13aab7a 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,6 +1,5 @@ import {type Client} from '@microsoft/microsoft-graph-client'; import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; -import {Notice} from 'obsidian'; import {t} from '../lib/lang.js'; import {logging} from '../lib/logging.js'; import {type MicrosoftClientProvider} from './microsoftClientProvider.js'; @@ -40,8 +39,7 @@ export class TodoApi { if (error instanceof Error) { this.logger.error(error.message); this.logger.error(error.stack ?? 'No stack trace available'); - const raisedError = new Error(error.message); - throw raisedError; + throw new Error(error.message); } throw new Error('Unknown issue getting Lists'); From 16885d94f8500c0bd0d31864e28752296b46383d Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 10:22:19 -0800 Subject: [PATCH 14/34] feat: allow users to provide own client id for authentication --- src/api/microsoftClientProvider.ts | 50 ++++++++++++++++++++---------- src/gui/msTodoSyncSettingTab.ts | 33 ++++++++++++++++++++ src/lib/locale/en.json | 8 ++++- src/main.ts | 9 ++++++ 4 files changed, 82 insertions(+), 18 deletions(-) diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index fd4c0eb..0381949 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -6,16 +6,27 @@ import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; import {t} from 'src/lib/lang'; export class MicrosoftClientProvider { - private get clientId() { - return 'a1172059-5f55-45cd-9665-8dccc98c2587'; + private _clientId: string; + private _authority: string; + + public get clientId() { + return this._clientId; + } + + public set clientId(value: string) { + this._clientId = value; + } + + public get authority() { + return this._authority; } - private get authority() { - return 'https://login.microsoftonline.com/consumers'; + public set authority(value: string) { + this._authority = value; } private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; - private readonly pca: msal.PublicClientApplication; + private pca: msal.PublicClientApplication; private readonly adapter: DataAdapter; private readonly app: App; private readonly cachePath: string; @@ -25,6 +36,23 @@ export class MicrosoftClientProvider { this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; this.app = app; + this._clientId = 'a1172059-5f55-45cd-9665-8dccc98c2587'; + this._authority = 'https://login.microsoftonline.com/consumers'; + } + + public async getClient() { + const authProvider = async (callback: (argument0: string, argument1: string) => void) => { + const accessToken = await this.getAccessToken(); + const error = ' '; + callback(error, accessToken); + }; + + return Client.init({ + authProvider, + }); + } + + public createPublicClientApplication() { const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { if (await this.adapter.exists(this.cachePath)) { cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); @@ -53,18 +81,6 @@ export class MicrosoftClientProvider { this.pca = new msal.PublicClientApplication(config); } - public async getClient() { - const authProvider = async (callback: (argument0: string, argument1: string) => void) => { - const accessToken = await this.getAccessToken(); - const error = ' '; - callback(error, accessToken); - }; - - return Client.init({ - authProvider, - }); - } - private async getAccessToken() { const msalCacheManager = this.pca.getTokenCache(); if (await this.adapter.exists(this.cachePath)) { diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 5da09de..6e24c43 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -42,6 +42,9 @@ export interface IMsTodoSyncSettings { // Microsoft To Do open handler. todo_OpenUsingApplicationProtocol: boolean; + microsoft_AuthenticationClientId: string; + microsoft_AuthenticationAuthority: string; + // Logging options. loggingOptions: LogOptions; @@ -87,6 +90,8 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { }, taskIdLookup: {'0000ABCD': '0'}, taskIdIndex: 0, + microsoft_AuthenticationClientId: '', + microsoft_AuthenticationAuthority: '', }; export class MsTodoSyncSettingTab extends PluginSettingTab { @@ -331,6 +336,34 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }), ) .setDisabled(this.settings.diary.stayWithPN); + + // Authentication Overrides + containerEl.createEl('h2', { + text: t('Settings_Authentication_Heading'), + }); + containerEl.createEl('p', { + text: t('Settings_Authentication_Heading_Description'), + }); + + this.addTextSetting( + containerEl, + 'Settings_Authentication_ClientId', + 'Settings_Authentication_ClientId_Description', + this.settings.microsoft_AuthenticationClientId, + async value => { + this.settings.microsoft_AuthenticationClientId = value; + }, + ); + + this.addTextSetting( + containerEl, + 'Settings_Authentication_ClientId', + 'Settings_Authentication_ClientId_Description', + this.settings.microsoft_AuthenticationClientId, + async value => { + this.settings.microsoft_AuthenticationClientId = value; + }, + ); } async hide() { diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index e7a0b98..bb1d4d9 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -30,6 +30,12 @@ "Prepend": "Prepend", "Saturday": "Saturday", "Search...": "Search...", + "Settings_Authentication_Heading": "🔐 Authentication", + "Settings_Authentication_Heading_Description": "To use this plugin, you need to authenticate with Microsoft. There is already a client created to do this, if you wish to use your own please update the details below. If empty the default client id will be used.", + "Settings_Authentication_ClientId": "Client ID", + "Settings_Authentication_ClientId_Description": "The client id is used to authenticate with Microsoft.", + "Settings_Authentication_Authority": "Authority", + "Settings_Authentication_Authority_Description": "The authority is used to authenticate with Microsoft. This is https://login.microsoftonline.com/consumers by default.", "Settings_JournalFormatting": "Journal formatting", "Settings_JournalFormatting_DateFormat": "Date format", "Settings_JournalFormatting_DateFormatDescription": "The current format is", @@ -76,4 +82,4 @@ "today": "today", "tomorrow": "tomorrow", "yesterday": "yesterday" -} \ No newline at end of file +} diff --git a/src/main.ts b/src/main.ts index 31ae35c..5b39b83 100644 --- a/src/main.ts +++ b/src/main.ts @@ -37,6 +37,15 @@ export default class MsTodoSync extends Plugin { try { this.microsoftClientProvider = new MicrosoftClientProvider(this.app); + if (this.settings.microsoft_AuthenticationClientId !== '') { + this.microsoftClientProvider.clientId = this.settings.microsoft_AuthenticationClientId; + } + + if (this.settings.microsoft_AuthenticationAuthority !== '') { + this.microsoftClientProvider.authority = this.settings.microsoft_AuthenticationAuthority; + } + + this.microsoftClientProvider.createPublicClientApplication(); } catch (error) { if (error instanceof Error) { const notice = new Notice(error.message); From 694eb0a2d3b25db012d51f35494e29f8d47fb355 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 10:23:37 -0800 Subject: [PATCH 15/34] refactor: cleanup async calls for commands --- src/main.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main.ts b/src/main.ts index 5b39b83..87fe025 100644 --- a/src/main.ts +++ b/src/main.ts @@ -142,7 +142,7 @@ export default class MsTodoSync extends Plugin { this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle(t('EditorMenu_SyncToTodo')).onClick( - async e => { + async () => { await this.pushTaskToMsTodo(editor); }, ); @@ -156,7 +156,7 @@ export default class MsTodoSync extends Plugin { this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( - async e => { + async () => { await this.pushTaskToMsTodoAndUpdatePage(editor); }, ); From d2e42197ce3dcc560ec48cad5350b9613d854168 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 10:32:07 -0800 Subject: [PATCH 16/34] refactor: error and translation cleanup --- src/gui/msTodoSyncSettingTab.ts | 28 ++++++++++++++-------------- src/lib/locale/en.json | 3 +++ 2 files changed, 17 insertions(+), 14 deletions(-) diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 6e24c43..7db58e9 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,3 +1,4 @@ +/* eslint-disable max-params */ import { type App, Notice, PluginSettingTab, Setting, } from 'obsidian'; @@ -280,22 +281,20 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { if (value) { - // @ts-ignore - const PNsetting - // @ts-ignore - = app.plugins.plugins['periodic-notes']; - if (PNsetting) { - const {format, folder} = PNsetting.settings.daily; + const periodicNotesSettings // eslint-disable-line @typescript-eslint/no-unsafe-assignment + = (this.app as any).plugins.plugins['periodic-notes']; + if (periodicNotesSettings) { + const {format, folder} = periodicNotesSettings.settings.daily; // eslint-disable-line @typescript-eslint/no-unsafe-assignment this.settings.diary = { - format, - folder, + format, // eslint-disable-line @typescript-eslint/no-unsafe-assignment + folder, // eslint-disable-line @typescript-eslint/no-unsafe-assignment stayWithPN: true, }; console.log('🚀 ~ this.settings.diary', this.settings.diary); await this.plugin.saveSettings(); this.display(); } else { - new Notice('Periodic Notes 中未设置'); + const periodicNotesNotice = new Notice('Periodic Notes 中未设置'); this.display(); } } else { @@ -369,23 +368,24 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { async hide() { const listName = this.settings.todoListSync.listName; - if (this.settings.todoListSync.listId != undefined || !listName) { + if (this.settings.todoListSync.listId !== undefined || !listName) { if (!listName) { - new Notice('微软同步列表未设置'); + const noListNotice = new Notice(t('General_NoListNameSet')); } } else { let listId = await this.plugin.todoApi.getListIdByName(listName); - listId ||= (await this.plugin.todoApi.createTaskList(listName))?.id; + const createdTaskList = await this.plugin.todoApi.createTaskList(listName); + listId ||= createdTaskList?.id; if (listId) { this.settings.todoListSync = { listName, listId, }; - new Notice('设置同步列表成功√'); + const listSetNotice = new Notice(t('General_ListNameSet')); await this.plugin.saveSettings(); } else { - new Notice('创建列表失败'); + const listFiledNotice = new Notice(t('General_FailedToCreateList')); } } } diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index bb1d4d9..e7ffe02 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -5,6 +5,9 @@ "Auth_Text_CodeCopiedClipboard": "The device code has been copied to the clipboard, please click the link below to verify", "Cancel": "Cancel", "Close": "Close", + "General_FailedToCreateList": "Failed to create list", + "General_ListNameSet": "The list to synchronize is set.", + "General_NoListNameSet": "No list to synchronize is set.", "CommandNotice_CreatingToDo": "Creating To Do...", "CommandNotice_UpdatingToDo": "Updating To Do...", "CommandNotice_NothingSelected": "It seems that nothing is selected", From 14bd523ef5ea00e636359e3edd4e0aead316d038 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 11:16:11 -0800 Subject: [PATCH 17/34] refactor: updated the block link prefix and allows objects in logging --- src/command/msTodoCommand.ts | 21 +- src/gui/msTodoSyncSettingTab.ts | 4 +- src/lib/logging.ts | 628 ++++++++++++++++---------------- src/model/ObsidianTodoTask.ts | 32 +- 4 files changed, 339 insertions(+), 346 deletions(-) diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 2ac0c03..3702993 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,6 +1,6 @@ /* eslint-disable max-params */ import {type Editor, type EditorPosition, Notice} from 'obsidian'; -import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask'; +import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask.js'; import type MsTodoSync from '../main.js'; import {type TodoApi} from '../api/todoApi.js'; import {type IMsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; @@ -38,7 +38,10 @@ interface ISelection { export async function getCurrentLinesFromEditor(editor: Editor): Promise { log( 'info', - `from: ${editor.getCursor('from')}, to: ${editor.getCursor('to')}, anchor: ${editor.getCursor('anchor')}, head: ${editor.getCursor('head')}, general: ${editor.getCursor()}`, + 'Getting current lines from editor', + { + from: editor.getCursor('from'), to: editor.getCursor('to'), anchor: editor.getCursor('anchor'), head: editor.getCursor('head'), general: editor.getCursor(), + }, ); // Const activeFile = this.app.workspace.getActiveFile(); @@ -89,36 +92,37 @@ export async function postTask( ) { const logger = logging.getLogger('mstodo-sync.command.post'); - // If (!editor.somethingSelected()) { - // new Notice(t('CommandNotice_NothingSelected')); - // return; - // } if (!listId) { const notice = new Notice(t('CommandNotice_SetListName')); return; } - const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); const activeFile = plugin.app.workspace.getActiveFile(); if (activeFile === null) { return; } + const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); + const source = await plugin.app.vault.read(activeFile); const {lines} = await getCurrentLinesFromEditor(editor); const split = source.split('\n'); const modifiedPage = await Promise.all( split.map(async (line: string, index: number) => { + // If the line is not in the selection, return the line as is. if (!lines.includes(index)) { return line; } + // Create the to do task from the line that is in the selection. const todo = new ObsidianTodoTask(plugin.settingsManager, line, fileName ?? ''); // If there is a block link in the line, we will try to find // the task id from the block link and update the task instead. - if (todo.hasBlockLink && todo.id) { + // As a user can add a block link, not all tasks will be able to + // lookup a id from the internal cache. + if (todo.hasBlockLink && todo.hasId) { logger.debug(`Updating Task: ${todo.title}`); const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); @@ -135,6 +139,7 @@ export async function postTask( logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } + // If false there will be a orphaned block id for this task. if (replace) { return todo.getMarkdownTask(true); } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 7db58e9..1b88064 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -4,7 +4,7 @@ import { } from 'obsidian'; import type MsTodoSync from '../main.js'; import {t} from '../lib/lang.js'; -import {type LogOptions} from '../lib/logging.js'; +import {type ILogOptions} from '../lib/logging.js'; export interface IMsTodoSyncSettings { todoListSync: { @@ -47,7 +47,7 @@ export interface IMsTodoSyncSettings { microsoft_AuthenticationAuthority: string; // Logging options. - loggingOptions: LogOptions; + loggingOptions: ILogOptions; // Private configuration updated by the plugin and not user. taskIdLookup: Record; diff --git a/src/lib/logging.ts b/src/lib/logging.ts index 9e54b3a..f3bff20 100644 --- a/src/lib/logging.ts +++ b/src/lib/logging.ts @@ -14,38 +14,38 @@ import {EventEmitter2} from 'eventemitter2'; * All possible log levels * @public */ -export type ILogLevel = { - 1: 'trace'; - 2: 'debug'; - 3: 'info'; - 4: 'warn'; - 5: 'error'; -}; +export interface ILogLevel { + 1: 'trace'; + 2: 'debug'; + 3: 'info'; + 4: 'warn'; + 5: 'error'; +} /** * Logger class to handle consistency of logs across the plugin. * * @export - * @interface LogEntry + * @interface ILogEntry */ -export type LogEntry = { - traceId?: string; - level: string; - module: string; - location?: string; - message: string; - objects: any; -}; +export interface ILogEntry { + traceId?: string; + level: string; + module: string; + location?: string; + message: string; + objects: any; +} /** * Logging options structure. * * @export - * @interface LogOptions + * @interface ILogOptions */ -export type LogOptions = { - minLevels: Record; -}; +export interface ILogOptions { + minLevels: Record; +} /** * Log level IDs (1 - 5) @@ -67,125 +67,125 @@ export type TLogLevelName = ILogLevel[TLogLevelId]; * @extends {EventEmitter2} */ export class LogManager extends EventEmitter2 { - private options: LogOptions = { - minLevels: { - '': 'debug', - 'mstodo-sync': 'debug', - }, - }; - - // Prevent the console logger from being added twice - private consoleLoggerRegistered = false; - - /** - * Set the minimum log levels for the module name or global. - * - * @param {LogOptions} options - * @return {*} {LogManager} - * @memberof LogManager - */ - public configure(options: LogOptions): this { - this.options = Object.assign({}, this.options, options); - return this; - } - - /** - * Returns a logger instance for the given module name. - * - * @param {string} module - * @return {*} {Logger} - * @memberof LogManager - */ - public getLogger(moduleName: string): Logger { - let currentMinimumLevel = 'none'; - let match = ''; - - for (const key in this.options.minLevels) { - if (moduleName.startsWith(key) && key.length >= match.length) { - currentMinimumLevel = this.options.minLevels[key]; - match = key; - } - } + private options: ILogOptions = { + minLevels: { + '': 'debug', + 'mstodo-sync': 'debug', + }, + }; - return new Logger(this, moduleName, currentMinimumLevel); - } - - /** - * - * - * @param {(logEntry: LogEntry) => void} listener - * @return {*} {LogManager} - * @memberof LogManager - */ - public onLogEntry(listener: (logEntry: LogEntry) => void): this { - this.on('log', listener); - return this; - } - - // Private period: number = 0; - arrAvg = (array: number[]) => array.reduce((a, b) => a + b, 0) / array.length; - - /** - * Registers a logger that write to the console. - * - * @return {*} {LogManager} - * @memberof LogManager - */ - public registerConsoleLogger(): this { - if (this.consoleLoggerRegistered) { - return this; + // Prevent the console logger from being added twice + private consoleLoggerRegistered = false; + + /** + * Set the minimum log levels for the module name or global. + * + * @param {ILogOptions} options + * @return {*} {LogManager} + * @memberof LogManager + */ + public configure(options: ILogOptions): this { + this.options = Object.assign({}, this.options, options); + return this; } - this.onLogEntry(logEntry => { - // 2024-12-19T22:53:37.000Z - >'2024-12-19 22:53:37' - const messageDate = new Date().toISOString().slice(0, 19).replace('T', ' '); - - let message = `[${messageDate}][${logEntry.level}][${logEntry.module}]`; - - if (logEntry.traceId) { - message += `[${logEntry.traceId}]`; - } - - message += ` ${logEntry.message}`; - if (logEntry.objects === undefined) { - logEntry.objects = ''; - } - - switch (logEntry.level) { - case 'trace': { - console.trace(message, logEntry.objects); - break; + /** + * Returns a logger instance for the given module name. + * + * @param {string} module + * @return {*} {Logger} + * @memberof LogManager + */ + public getLogger(moduleName: string): Logger { + let currentMinimumLevel = 'none'; + let match = ''; + + for (const key in this.options.minLevels) { + if (moduleName.startsWith(key) && key.length >= match.length) { + currentMinimumLevel = this.options.minLevels[key]; + match = key; + } } - case 'debug': { - console.debug(message, logEntry.objects); - break; - } - - case 'info': { - console.info(message, logEntry.objects); - break; - } - - case 'warn': { - console.warn(message, logEntry.objects); - break; - } + return new Logger(this, moduleName, currentMinimumLevel); + } - case 'error': { - console.error(message, logEntry.objects); - break; - } + /** + * + * + * @param {(logEntry: ILogEntry) => void} listener + * @return {*} {LogManager} + * @memberof LogManager + */ + public onLogEntry(listener: (logEntry: ILogEntry) => void): this { + this.on('log', listener); + return this; + } - default: { - console.log(`{${logEntry.level}} ${message}`, logEntry.objects); + // Private period: number = 0; + arrAvg = (array: number[]) => array.reduce((a, b) => a + b, 0) / array.length; + + /** + * Registers a logger that write to the console. + * + * @return {*} {LogManager} + * @memberof LogManager + */ + public registerConsoleLogger(): this { + if (this.consoleLoggerRegistered) { + return this; } - } - }); - this.consoleLoggerRegistered = true; - return this; - } + this.onLogEntry(logEntry => { + // 2024-12-19T22:53:37.000Z - >'2024-12-19 22:53:37' + const messageDate = new Date().toISOString().slice(0, 19).replace('T', ' '); + + let message = `[${messageDate}][${logEntry.level}][${logEntry.module}]`; + + if (logEntry.traceId) { + message += `[${logEntry.traceId}]`; + } + + message += ` ${logEntry.message}`; + if (logEntry.objects === undefined) { + logEntry.objects = ''; + } + + switch (logEntry.level) { + case 'trace': { + console.trace(message, logEntry.objects); + break; + } + + case 'debug': { + console.debug(message, logEntry.objects); + break; + } + + case 'info': { + console.info(message, logEntry.objects); + break; + } + + case 'warn': { + console.warn(message, logEntry.objects); + break; + } + + case 'error': { + console.error(message, logEntry.objects); + break; + } + + default: { + console.log(`{${logEntry.level}} ${message}`, logEntry.objects); + } + } + }); + + this.consoleLoggerRegistered = true; + return this; + } } export const logging = new LogManager(); @@ -198,162 +198,158 @@ export const logging = new LogManager(); * @class Logger */ export class Logger { - private readonly logManager: EventEmitter2; - private readonly minLevel: number; - private readonly module: string; - private readonly levels: Record = { - trace: 1, - debug: 2, - info: 3, - warn: 4, - error: 5, - }; - - /** - * Creates an instance of Logger. - * @param {EventEmitter2} logManager - * @param {string} module - * @param {string} minLevel - * @memberof Logger - */ - constructor(logManager: EventEmitter2, module: string, minLevel: string) { - this.logManager = logManager; - this.module = module; - this.minLevel = this.levelToInt(minLevel); - } - - /** - * Converts a string level (trace/debug/info/warn/error) into a number - * - * @param minLevel - */ - private levelToInt(minLevel: string): number { - if (minLevel.toLowerCase() in this.levels) { - return this.levels[minLevel.toLowerCase()]; + private readonly minLevel: number; + private readonly levels: Record = { + trace: 1, + debug: 2, + info: 3, + warn: 4, + error: 5, + }; + + /** + * Creates an instance of Logger. + * @param {EventEmitter2} logManager + * @param {string} name + * @param {string} minLevel + * @memberof Logger + */ + constructor(private readonly logManager: EventEmitter2, private readonly name: string, minLevel: string) { + this.minLevel = this.levelToInt(minLevel); } - return 99; - } - - /** - * Central logging method. - * @param logLevel - * @param message - */ - public log(logLevel: string, message: string, objects?: any): void { - const level = this.levelToInt(logLevel); - if (level < this.minLevel) { - return; + /** + * Central logging method. + * @param logLevel + * @param message + */ + public log(logLevel: string, message: string, objects?: any): void { + const level = this.levelToInt(logLevel); + if (level < this.minLevel) { + return; + } + + const logEntry: ILogEntry = { + level: logLevel, + module: this.name, + message, + objects, // eslint-disable-line @typescript-eslint/no-unsafe-assignment + traceId: undefined, + }; + + // Obtain the line/file through a thoroughly hacky method + // This creates a new stack trace and pulls the caller from it. If the caller + // if .trace() + // const error = new Error(''); + // if (error.stack) { + // const cla = error.stack.split('\n'); + // let idx = 1; + // while (idx < cla.length && cla[idx].includes('at Logger.Object.')) idx++; + // if (idx < cla.length) { + // logEntry.location = cla[idx].slice(cla[idx].indexOf('at ') + 3, cla[idx].length); + // } + // } + + this.logManager.emit('log', logEntry); } - const logEntry: LogEntry = { - level: logLevel, - module: this.module, - message, - objects, - traceId: undefined, - }; + public trace(message: string, objects?: any): void { + this.log('trace', message, objects); + } - // Obtain the line/file through a thoroughly hacky method - // This creates a new stack trace and pulls the caller from it. If the caller - // if .trace() - // const error = new Error(''); - // if (error.stack) { - // const cla = error.stack.split('\n'); - // let idx = 1; - // while (idx < cla.length && cla[idx].includes('at Logger.Object.')) idx++; - // if (idx < cla.length) { - // logEntry.location = cla[idx].slice(cla[idx].indexOf('at ') + 3, cla[idx].length); - // } - // } - - this.logManager.emit('log', logEntry); - } - - public trace(message: string, objects?: any): void { - this.log('trace', message, objects); - } - - public debug(message: string, objects?: any): void { - this.log('debug', message, objects); - } - - public info(message: string, objects?: any): void { - this.log('info', message, objects); - } - - public warn(message: string, objects?: any): void { - this.log('warn', message, objects); - } - - public error(message: string, objects?: any): void { - this.log('error', message, objects); - } - - /** - * Central logging method with a trace ID to track calls between modules/components. - * @param logLevel - * @param message - */ - public logWithId(logLevel: string, traceId: string, message: string, objects?: any): void { - const level = this.levelToInt(logLevel); - if (level < this.minLevel) { - return; + public debug(message: string, objects?: any): void { + this.log('debug', message, objects); } - const logEntry: LogEntry = { - level: logLevel, - module: this.module, - message, - objects, - traceId, - }; + public info(message: string, objects?: any): void { + this.log('info', message, objects); + } + + public warn(message: string, objects?: any): void { + this.log('warn', message, objects); + } + + public error(message: string, objects?: any): void { + this.log('error', message, objects); + } - this.logManager.emit('log', logEntry); - } + /** + * Central logging method with a trace ID to track calls between modules/components. + * @param logLevel + * @param message + */ + public logWithId(logLevel: string, traceId: string, message: string, objects?: any): void { + const level = this.levelToInt(logLevel); + if (level < this.minLevel) { + return; + } + + const logEntry: ILogEntry = { + level: logLevel, + module: this.name, + message, + objects, // eslint-disable-line @typescript-eslint/no-unsafe-assignment + traceId, + }; - public traceWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('trace', traceId, message, objects); - } + this.logManager.emit('log', logEntry); + } + + public traceWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('trace', traceId, message, objects); + } + + public debugWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('debug', traceId, message, objects); + } + + public infoWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('info', traceId, message, objects); + } - public debugWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('debug', traceId, message, objects); - } + public warnWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('warn', traceId, message, objects); + } - public infoWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('info', traceId, message, objects); - } + public errorWithId(traceId: string, message: string, objects?: any): void { + this.logWithId('error', traceId, message, objects); + } - public warnWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('warn', traceId, message, objects); - } + /** + * Converts a string level (trace/debug/info/warn/error) into a number + * + * @param minLevel + */ + private levelToInt(minLevel: string): number { + if (minLevel.toLowerCase() in this.levels) { + return this.levels[minLevel.toLowerCase()]; + } - public errorWithId(traceId: string, message: string, objects?: any): void { - this.logWithId('error', traceId, message, objects); - } + return 99; + } } export function logCallDetails() { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { - const originalMethod = descriptor.value; - const logger = logging.getLogger('mstodo-sync'); - - descriptor.value = async function (...arguments_: any[]) { - const startTime = new Date(Date.now()); - const result = await originalMethod.apply(this, arguments_); - const endTime = new Date(Date.now()); - const elapsed = endTime.getTime() - startTime.getTime(); - - logger.debug( - `${typeof target}:${propertyKey} called with ${ - arguments_.length - } arguments. Took: ${elapsed}ms ${JSON.stringify(arguments_)}`, - ); - return result; + return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; // eslint-disable-line @typescript-eslint/no-unsafe-assignment + const logger = logging.getLogger('mstodo-sync'); + + descriptor.value = async function (...arguments_: any[]) { + const startTime = new Date(Date.now()); + const result = await originalMethod.apply(this, arguments_); // eslint-disable-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + const endTime = new Date(Date.now()); + const elapsed = endTime.getTime() - startTime.getTime(); + + logger.debug( + `${typeof target}:${propertyKey} called with ${ + arguments_.length + } arguments. Took: ${elapsed}ms ${JSON.stringify(arguments_)}`, + ); + return result; // eslint-disable-line @typescript-eslint/no-unsafe-return + }; + + return descriptor; }; - - return descriptor; - }; } /** @@ -363,39 +359,35 @@ export function logCallDetails() { * @param {TLogLevelName} logLevel * @param {string} message */ -export function log(logLevel: TLogLevelName, message: string) { - const logger = logging.getLogger('mstodo-sync'); - - switch (logLevel) { - case 'trace': { - logger.trace(message); - break; - } +export function log(logLevel: TLogLevelName, message: string, objects?: any) { + const logger = logging.getLogger('mstodo-sync'); - case 'debug': { - logger.debug(message); - break; - } + switch (logLevel) { + case 'trace': { + logger.trace(message, objects); + break; + } - case 'info': { - logger.info(message); - break; - } + case 'debug': { + logger.debug(message, objects); + break; + } - case 'warn': { - logger.warn(message); - break; - } + case 'info': { + logger.info(message, objects); + break; + } - case 'error': { - logger.error(message); - break; - } + case 'warn': { + logger.warn(message, objects); + break; + } - default: { - break; + case 'error': { + logger.error(message, objects); + break; + } } - } } /** @@ -408,26 +400,26 @@ export function log(logLevel: TLogLevelName, message: string) { * @return {*} */ export function monkeyPatchConsole(plugin: Plugin) { - if (!Platform.isMobile) { - return; - } - - const logFile = `${plugin.manifest.dir}/mstodo-sync-logs.txt`; - const logs: string[] = []; - const logMessages - = (prefix: string) => - (...messages: unknown[]) => { - logs.push(`\n[${prefix}]`); - for (const message of messages) { - logs.push(String(message)); - } - - plugin.app.vault.adapter.write(logFile, logs.join(' ')); - }; - - console.debug = logMessages('debug'); - console.error = logMessages('error'); - console.info = logMessages('info'); - console.log = logMessages('log'); - console.warn = logMessages('warn'); + if (!Platform.isMobile) { + return; + } + + const logFile = `${plugin.manifest.dir}/mstodo-sync-logs.txt`; + const logs: string[] = []; + const logMessages + = (prefix: string) => + (...messages: unknown[]) => { + logs.push(`\n[${prefix}]`); + for (const message of messages) { + logs.push(String(message)); + } + + plugin.app.vault.adapter.write(logFile, logs.join(' ')); // eslint-disable-line @typescript-eslint/no-floating-promises + }; + + console.debug = logMessages('debug'); + console.error = logMessages('error'); + console.info = logMessages('info'); + console.log = logMessages('log'); + console.warn = logMessages('warn'); } diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 22e141c..57d269c 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -1,3 +1,4 @@ +/* eslint-disable unicorn/filename-case */ import { type AttachmentBase, type AttachmentSession, @@ -131,21 +132,11 @@ export class ObsidianTodoTask implements TodoTask { */ public blockLink?: string; - /** - * The name of the file where the task is located. - */ - public fileName?: string; - /** * Logger instance for logging task-related information. */ private readonly logger = logging.getLogger('mstodo-sync.ObsidianTodoTask'); - /** - * Manager for handling settings related to the task. - */ - private readonly settingsManager: ISettingsManager; - /** * The original title of the task. */ @@ -157,12 +148,9 @@ export class ObsidianTodoTask implements TodoTask { * @param line - The line of text representing the task. * @param fileName - The name of the file where the task is located. */ - constructor(settingsManager: ISettingsManager, line: string, fileName: string) { - this.settingsManager = settingsManager; - this.fileName = fileName; + constructor(private readonly settingsManager: ISettingsManager, line: string, public fileName: string) { this.originalTitle = line; - - this.logger.debug(`Creating: '${this.title}'`); + this.logger.debug(`Creating: '${this.originalTitle}'`); this.title = line.trim(); @@ -206,7 +194,7 @@ export class ObsidianTodoTask implements TodoTask { public async cacheTaskId(id: string): Promise { this.settingsManager.settings.taskIdIndex += 1; - const index = `${Math.random().toString(20).slice(2, 6)}${this.settingsManager.settings.taskIdIndex + const index = `MSTD${Math.random().toString(20).slice(2, 6)}${this.settingsManager.settings.taskIdIndex .toString() .padStart(5, '0')}`; this.logger.debug(`id: ${id}, index: ${index}, taskIdIndex: ${this.settingsManager.settings.taskIdIndex}`); @@ -288,7 +276,7 @@ export class ObsidianTodoTask implements TodoTask { // Format and display the task which is the first line. const format = this.settingsManager.settings.displayOptions_ReplacementFormat; - const priorityIndicator = this.getPriorityIndicator(); + const priorityIndicator = this.importance === 'normal' ? '' : this.getPriorityIndicator(); output = format .replace(TASK_REGEX, this.title?.trim() ?? '') @@ -308,7 +296,7 @@ export class ObsidianTodoTask implements TodoTask { // Add in the body if it exists and indented by two spaces. if (this.body?.content && this.body.content.length > 0) { - for (const bodyLine of this.body?.content.split('\n')) { + for (const bodyLine of this.body?.content.split('\n')) { // eslint-disable-line no-unsafe-optional-chaining if (bodyLine.trim().length > 0) { formattedBody += ' ' + bodyLine + '\n'; } @@ -444,4 +432,12 @@ export class ObsidianTodoTask implements TodoTask { public get hasBlockLink(): boolean { return this.blockLink !== undefined && this.blockLink.length > 0; } + + /** + * Check if the task has an id for the remote task. + * @returns True if the task has a id set, false otherwise. + */ + public get hasId(): boolean { + return this.id !== undefined && this.id.length > 0; + } } From 0731ce3f8619714018bc5092db6dae2729fee1a3 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 12:41:25 -0800 Subject: [PATCH 18/34] feat: added featch to pull updates from remote to dos based on the existing block list lookups --- src/api/microsoftClientProvider.ts | 38 ++++++++++++++++--- src/api/todoApi.ts | 26 +++++++++---- src/command/msTodoCommand.ts | 60 ++++++++++++++++++++++++++++++ src/lib/locale/en.json | 5 ++- src/main.ts | 20 +++++++++- src/model/ObsidianTodoTask.ts | 30 +++++++++++++++ 6 files changed, 164 insertions(+), 15 deletions(-) diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index 0381949..1a6dc08 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -1,10 +1,27 @@ import type * as msalCommon from '@azure/msal-common'; import * as msal from '@azure/msal-node'; -import {Client} from '@microsoft/microsoft-graph-client'; +import {type AuthenticationProvider, Client, type ClientOptions} from '@microsoft/microsoft-graph-client'; +import {AuthCodeMSALBrowserAuthenticationProvider, type AuthCodeMSALBrowserAuthenticationProviderOptions} from '@microsoft/microsoft-graph-client/authProviders/authCodeMsalBrowser'; import {type App, type DataAdapter, Notice} from 'obsidian'; import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; import {t} from 'src/lib/lang'; +class MsalNodeAuthenticationProvider implements AuthenticationProvider { + /** + * + */ + constructor(private readonly clientProvider: MicrosoftClientProvider) {} + + /** + * This method will get called before every request to the msgraph server + * This should return a Promise that resolves to an accessToken (in case of success) or rejects with error (in case of failure) + * Basically this method will contain the implementation for getting and refreshing accessTokens + */ + public async getAccessToken(): Promise { + return this.clientProvider.getAccessToken(); + } +} + export class MicrosoftClientProvider { private _clientId: string; private _authority: string; @@ -30,6 +47,7 @@ export class MicrosoftClientProvider { private readonly adapter: DataAdapter; private readonly app: App; private readonly cachePath: string; + private accounts: msal.AccountInfo[] = []; constructor(app: App) { this.adapter = app.vault.adapter; @@ -52,6 +70,16 @@ export class MicrosoftClientProvider { }); } + public async getClientWithMiddleware() { + const clientOptions: ClientOptions = { + authProvider: new MsalNodeAuthenticationProvider(this), + }; + + const client = Client.initWithMiddleware(clientOptions); + + return client; + } + public createPublicClientApplication() { const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { if (await this.adapter.exists(this.cachePath)) { @@ -81,18 +109,18 @@ export class MicrosoftClientProvider { this.pca = new msal.PublicClientApplication(config); } - private async getAccessToken() { + public async getAccessToken() { const msalCacheManager = this.pca.getTokenCache(); if (await this.adapter.exists(this.cachePath)) { msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); } - const accounts = await msalCacheManager.getAllAccounts(); - if (accounts.length === 0) { + this.accounts = await msalCacheManager.getAllAccounts(); + if (this.accounts.length === 0) { return this.authByDevice(); } - return this.authByCache(accounts[0]); + return this.authByCache(this.accounts[0]); } private async authByDevice(): Promise { diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 13aab7a..4f014f6 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,4 +1,4 @@ -import {type Client} from '@microsoft/microsoft-graph-client'; +import {RetryHandlerOptions, type Client} from '@microsoft/microsoft-graph-client'; import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; import {t} from '../lib/lang.js'; import {logging} from '../lib/logging.js'; @@ -8,13 +8,22 @@ export class TodoApi { private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); private client: Client; + private readonly enableRetryOptions = false; constructor(clientProvider: MicrosoftClientProvider) { - clientProvider.getClient().then(client => { - this.client = client; - }).catch(() => { - throw new Error(t('Notice_UnableToAcquireClient')); - }); + if (this.enableRetryOptions) { + clientProvider.getClientWithMiddleware().then(client => { + this.client = client; + }).catch(() => { + throw new Error(t('Notice_UnableToAcquireClient')); + }); + } else { + clientProvider.getClient().then(client => { + this.client = client; + }).catch(() => { + throw new Error(t('Notice_UnableToAcquireClient')); + }); + } } /** @@ -143,7 +152,10 @@ export class TodoApi { */ async getTask(listId: string, taskId: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - return (await this.client.api(endpoint).get()) as TodoTask; + return (await this.client + .api(endpoint) + .middlewareOptions([new RetryHandlerOptions(3, 3)]) + .get()) as TodoTask; } /** diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 3702993..106e594 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -151,6 +151,66 @@ export async function postTask( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } +export async function getTask( + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, +) { + const logger = logging.getLogger('mstodo-sync.command.get'); + + if (!listId) { + const notice = new Notice(t('CommandNotice_SetListName')); + return; + } + + const activeFile = plugin.app.workspace.getActiveFile(); + if (activeFile === null) { + return; + } + + const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); + + const source = await plugin.app.vault.read(activeFile); + const {lines} = await getCurrentLinesFromEditor(editor); + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + // If the line is not in the selection, return the line as is. + if (!lines.includes(index)) { + return line; + } + + // Create the to do task from the line that is in the selection. + const todo = new ObsidianTodoTask(plugin.settingsManager, line, fileName ?? ''); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + // As a user can add a block link, not all tasks will be able to + // lookup a id from the internal cache. + if (todo.hasBlockLink && todo.hasId) { + logger.debug(`Updating Task: ${todo.title}`); + + const returnedTask = await todoApi.getTask(listId, todo.id); + + if (returnedTask) { + todo.updateFromTodoTask(returnedTask); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } + + return todo.getMarkdownTask(true); + } + + return line; + }), + ); + + await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); +} + // Experimental // Should handle the following cases: // - [ ] Task diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index e7ffe02..bc3b3f8 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -19,8 +19,9 @@ "Complete": "Complete", "Delete": "Delete", "EditorMenu_OpenToDo": "Open To Do", - "EditorMenu_SyncToTodo": "Sync to Microsoft To Do", - "EditorMenu_SyncToTodoAndReplace": "Sync to Microsoft To Do and update", + "EditorMenu_SyncToTodo": "-> Push to Microsoft To Do", + "EditorMenu_SyncToTodoAndReplace": "-> Push to Microsoft To Do and update", + "EditorMenu_FetchFromRemote": "<- Fetch updates from Microsoft To Do", "Enter": "Enter", "Friday": "Friday", "Language": "English", diff --git a/src/main.ts b/src/main.ts index 87fe025..8ff7ffe 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { import {TodoApi} from './api/todoApi.js'; import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; import { - createTodayTasks, getTaskIdFromLine, postTask, postTaskAndChildren, + createTodayTasks, getTask, getTaskIdFromLine, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import {t} from './lib/lang.js'; import {log, logging} from './lib/logging.js'; @@ -164,6 +164,24 @@ export default class MsTodoSync extends Plugin { }), ); + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle(t('EditorMenu_FetchFromRemote')).onClick( + async () => { + await getTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }, + ); + }); + }), + ); + this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 57d269c..292d30f 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -239,6 +239,36 @@ export class ObsidianTodoTask implements TodoTask { return toDo; } + /** + * Get the task as a TodoTask object. + * @param withChecklist - Whether to include checklist items in the returned task. + * @returns The task as a TodoTask object. + */ + public updateFromTodoTask(remoteTask: TodoTask) { + this.title = remoteTask.title; + + if (remoteTask.body?.content && remoteTask.body.content.length > 0) { + this.body = remoteTask.body; + } + + if (remoteTask.status && remoteTask.status.length > 0) { + this.status = remoteTask.status; + } + + if (remoteTask.importance && remoteTask.importance.length > 0) { + this.importance = remoteTask.importance; + } + + if (remoteTask.linkedResources && remoteTask.linkedResources.length > 0) { + this.linkedResources = remoteTask.linkedResources; + } + + // Need to determine if we want to update the checklist items + // if (withChecklist && remoteTask.checklistItems && remoteTask.checklistItems.length > 0) { + // this.checklistItems = remoteTask.checklistItems; + // } + } + /** * Set the body content of the task. * @param body - The body content to set. From 239b421da7f9be491d80fc2014970ccfc79e5c02 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 13:03:54 -0800 Subject: [PATCH 19/34] feat: added hacking feature while I play with new capabilities, hidden from users --- src/api/microsoftClientProvider.ts | 1 - src/api/todoApi.ts | 8 ++++++++ src/command/msTodoCommand.ts | 25 ++++++++++++++++++++++++- src/gui/msTodoSyncSettingTab.ts | 2 ++ src/main.ts | 22 +++++++++++++++++++++- 5 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index 1a6dc08..dcb80f2 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -1,7 +1,6 @@ import type * as msalCommon from '@azure/msal-common'; import * as msal from '@azure/msal-node'; import {type AuthenticationProvider, Client, type ClientOptions} from '@microsoft/microsoft-graph-client'; -import {AuthCodeMSALBrowserAuthenticationProvider, type AuthCodeMSALBrowserAuthenticationProviderOptions} from '@microsoft/microsoft-graph-client/authProviders/authCodeMsalBrowser'; import {type App, type DataAdapter, Notice} from 'obsidian'; import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; import {t} from 'src/lib/lang'; diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 4f014f6..10acfdf 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -158,6 +158,14 @@ export class TodoApi { .get()) as TodoTask; } + async getTasksDelta(listId: string): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/delta`; + return (await this.client + .api(endpoint) + .middlewareOptions([new RetryHandlerOptions(3, 3)]) + .get()) as TodoTask; + } + /** * Creates a new task in the specified To-Do list. * diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 106e594..dae1dc4 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,5 +1,7 @@ /* eslint-disable max-params */ -import {type Editor, type EditorPosition, Notice} from 'obsidian'; +import { + type DataAdapter, type Editor, type EditorPosition, Notice, +} from 'obsidian'; import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask.js'; import type MsTodoSync from '../main.js'; import {type TodoApi} from '../api/todoApi.js'; @@ -211,6 +213,27 @@ export async function getTask( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } +export async function getTaskDelta( + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + plugin: MsTodoSync, +) { + const logger = logging.getLogger('mstodo-sync.command.delta'); + + if (!listId) { + const notice = new Notice(t('CommandNotice_SetListName')); + return; + } + + const cachePath = `${this.app.vault.configDir}/tasks-delta.json`; + const adapter: DataAdapter = this.app.vault.adapter; + const returnedTask = await todoApi.getTasksDelta(listId); + + await adapter.write(cachePath, JSON.stringify(returnedTask)); +} + // Experimental // Should handle the following cases: // - [ ] Task diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 1b88064..8b53499 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -52,6 +52,7 @@ export interface IMsTodoSyncSettings { // Private configuration updated by the plugin and not user. taskIdLookup: Record; taskIdIndex: number; + hackingEnabled: boolean; } export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { @@ -93,6 +94,7 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { taskIdIndex: 0, microsoft_AuthenticationClientId: '', microsoft_AuthenticationAuthority: '', + hackingEnabled: false, }; export class MsTodoSyncSettingTab extends PluginSettingTab { diff --git a/src/main.ts b/src/main.ts index 8ff7ffe..78e8179 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,7 @@ import { import {TodoApi} from './api/todoApi.js'; import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; import { - createTodayTasks, getTask, getTaskIdFromLine, postTask, postTaskAndChildren, + createTodayTasks, getTask, getTaskDelta, getTaskIdFromLine, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import {t} from './lib/lang.js'; import {log, logging} from './lib/logging.js'; @@ -182,6 +182,26 @@ export default class MsTodoSync extends Plugin { }), ); + if (this.settings.hackingEnabled) { + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('hacking').onClick( + async () => { + await getTaskDelta( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }, + ); + }); + }), + ); + } + this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { From ca7716abb6f146453141806d073ff21e410272fe Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 30 Dec 2024 17:04:48 -0800 Subject: [PATCH 20/34] feat: enabled use of delta sync for updates to reduce calls and enable better sync scenarios --- src/api/todoApi.ts | 60 ++++++++++++++++++-- src/command/msTodoCommand.ts | 100 +++++++++++++++++++++++++++++++--- src/main.ts | 2 - src/model/ObsidianTodoTask.ts | 5 +- 4 files changed, 150 insertions(+), 17 deletions(-) diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 10acfdf..dad2fcf 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,9 +1,16 @@ -import {RetryHandlerOptions, type Client} from '@microsoft/microsoft-graph-client'; +import {type PageCollection, RetryHandlerOptions, type Client} from '@microsoft/microsoft-graph-client'; import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; import {t} from '../lib/lang.js'; import {logging} from '../lib/logging.js'; import {type MicrosoftClientProvider} from './microsoftClientProvider.js'; +export class TasksDeltaCollection { + /** + * + */ + constructor(public allTasks: TodoTask[], public deltaLink: string) {} +} + export class TodoApi { private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); @@ -158,12 +165,40 @@ export class TodoApi { .get()) as TodoTask; } - async getTasksDelta(listId: string): Promise { - const endpoint = `/me/todo/lists/${listId}/tasks/delta`; - return (await this.client + async getTasksDelta(listId: string, deltaLink: string): Promise { + const endpoint = deltaLink === '' ? `/me/todo/lists/${listId}/tasks/delta` : deltaLink; + const allTasks: TodoTask[] = []; + + let response: PageCollection = await this.client .api(endpoint) .middlewareOptions([new RetryHandlerOptions(3, 3)]) - .get()) as TodoTask; + .get() as PageCollection; + + while (response.value.length > 0) { + for (const task of response.value as TodoTask[]) { + allTasks.push(task); + } + + if (response['@odata.nextLink']) { + response = await this.client.api(response['@odata.nextLink']).get(); + } else { + break; + } + } + + if (response['@odata.deltaLink']) { + deltaLink = response['@odata.deltaLink']; + } + + const tasksDeltaCollection = new TasksDeltaCollection(allTasks, deltaLink); + + return tasksDeltaCollection; + + // Old Version + // return (await this.client + // .api(endpoint) + // .middlewareOptions([new RetryHandlerOptions(3, 3)]) + // .get()) as TodoTask; } /** @@ -189,6 +224,21 @@ export class TodoApi { */ async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + + if (toDo.linkedResources) { + const linkedResource = toDo.linkedResources.find(resource => resource.applicationName === 'Obsidian Microsoft To Do Sync'); + if (linkedResource) { + const updatedLinkedResource = { + '@odata.type': '#microsoft.graph.linkedResource', + webUrl: linkedResource.webUrl, + applicationName: 'Obsidian Microsoft To Do Sync', + externalId: this.blockLink, + }; + const linkedResourcesEndpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResource.id}`; + const patchedLinkedResource = this.client.api(linkedResourcesEndpoint).update(updatedLinkedResource); + } + } + toDo.linkedResources = undefined; return this.client.api(endpoint).patch(toDo); } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index dae1dc4..8f91639 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -3,8 +3,9 @@ import { type DataAdapter, type Editor, type EditorPosition, Notice, } from 'obsidian'; import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask.js'; +import {type TodoTask} from '@microsoft/microsoft-graph-types'; import type MsTodoSync from '../main.js'; -import {type TodoApi} from '../api/todoApi.js'; +import {TasksDeltaCollection, type TodoApi} from '../api/todoApi.js'; import {type IMsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; import {t} from '../lib/lang.js'; import {log, logging} from '../lib/logging.js'; @@ -109,6 +110,9 @@ export async function postTask( const source = await plugin.app.vault.read(activeFile); const {lines} = await getCurrentLinesFromEditor(editor); + // Single call to update the cache using the delta link. + await getTaskDelta(todoApi, listId, plugin); + const split = source.split('\n'); const modifiedPage = await Promise.all( split.map(async (line: string, index: number) => { @@ -126,6 +130,18 @@ export async function postTask( // lookup a id from the internal cache. if (todo.hasBlockLink && todo.hasId) { logger.debug(`Updating Task: ${todo.title}`); + const cachedTasksDelta = await getDeltaCache(plugin); + const cachedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + + if (cachedTask) { + const linkedResource = cachedTask.linkedResources?.find(resource => resource.applicationName === 'Obsidian Microsoft To Do Sync'); + if (linkedResource) { + linkedResource.externalId = todo.blockLink; + linkedResource.displayName = `Tracking Block Link: ${todo.blockLink}`; + } + } + + todo.linkedResources = cachedTask?.linkedResources; const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); @@ -177,6 +193,9 @@ export async function getTask( const source = await plugin.app.vault.read(activeFile); const {lines} = await getCurrentLinesFromEditor(editor); + // Single call to update the cache using the delta link. + await getTaskDelta(todoApi, listId, plugin); + const split = source.split('\n'); const modifiedPage = await Promise.all( split.map(async (line: string, index: number) => { @@ -195,7 +214,9 @@ export async function getTask( if (todo.hasBlockLink && todo.hasId) { logger.debug(`Updating Task: ${todo.title}`); - const returnedTask = await todoApi.getTask(listId, todo.id); + // Load from the delta cache file and pull the task from the cache. + const cachedTasksDelta = await getDeltaCache(plugin); + const returnedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); if (returnedTask) { todo.updateFromTodoTask(returnedTask); @@ -213,11 +234,21 @@ export async function getTask( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } +async function getDeltaCache(plugin: MsTodoSync) { + const cachePath = `${plugin.app.vault.configDir}/mstd-tasks-delta.json`; + const adapter: DataAdapter = plugin.app.vault.adapter; + let cachedTasksDelta: TasksDeltaCollection | undefined; + + if (await adapter.exists(cachePath)) { + cachedTasksDelta = JSON.parse(await adapter.read(cachePath)) as TasksDeltaCollection; + } + + return cachedTasksDelta; +} + export async function getTaskDelta( todoApi: TodoApi, listId: string | undefined, - editor: Editor, - fileName: string | undefined, plugin: MsTodoSync, ) { const logger = logging.getLogger('mstodo-sync.command.delta'); @@ -227,11 +258,64 @@ export async function getTaskDelta( return; } - const cachePath = `${this.app.vault.configDir}/tasks-delta.json`; - const adapter: DataAdapter = this.app.vault.adapter; - const returnedTask = await todoApi.getTasksDelta(listId); + const cachePath = `${plugin.app.vault.configDir}/mstd-tasks-delta.json`; + const adapter: DataAdapter = plugin.app.vault.adapter; + let deltaLink = ''; + let cachedTasksDelta = await getDeltaCache(plugin); + + if (cachedTasksDelta) { + deltaLink = cachedTasksDelta.deltaLink; + } else { + cachedTasksDelta = new TasksDeltaCollection([], ''); + } + + const returnedTask = await todoApi.getTasksDelta(listId, deltaLink); + logger.info('deltaLink', deltaLink); + logger.info('ReturnedDelta', returnedTask); + + if (cachedTasksDelta) { + logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); + logger.info('returnedTask.allTasks', returnedTask.allTasks.length); + + cachedTasksDelta.allTasks = mergeCollections(cachedTasksDelta.allTasks, returnedTask.allTasks); + logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); + + cachedTasksDelta.deltaLink = returnedTask.deltaLink; + } else { + logger.info('First run, loading delta cache'); + + cachedTasksDelta = returnedTask; + } + + await adapter.write(cachePath, JSON.stringify(cachedTasksDelta)); +} + +// Function to merge collections +function mergeCollections(col1: TodoTask[], col2: TodoTask[]): TodoTask[] { + const map = new Map(); + + // Helper function to add items to the map + function addToMap(item: TodoTask) { + if (item.id && item.lastModifiedDateTime) { + const existingItem = map.get(item.id); + // If there is no last modified then just use the current item. + if (!existingItem || new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0)) { + map.set(item.id, item); + } + } + } + + // Add items from both collections to the map + for (const item of col1) { + addToMap(item); + } + + for (const item of col2) { + addToMap(item); + } - await adapter.write(cachePath, JSON.stringify(returnedTask)); + // Convert map values back to an array + return Array.from(map.values()); } // Experimental diff --git a/src/main.ts b/src/main.ts index 78e8179..c15d95d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -191,8 +191,6 @@ export default class MsTodoSync extends Plugin { await getTaskDelta( this.todoApi, this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, this, ); }, diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 292d30f..57ab4d8 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -177,8 +177,9 @@ export class ObsidianTodoTask implements TodoTask { this.linkedResources.push({ webUrl: `obsidian://advanced-uri?filepath=${fileName}`, - applicationName: 'Obsidian', - displayName: 'fileName', + applicationName: 'Obsidian Microsoft To Do Sync', + externalId: this.blockLink, + displayName: `Tracking Block Link: ${this.blockLink}`, }); this.logger.debug(`Created: '${this.title}'`); From 1421ba1d7a6f5873b69377d67b9e9f77231cd749 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 2 Jan 2025 16:28:52 -0800 Subject: [PATCH 21/34] feat: added sync and clean for local id cache and added better redirect --- redirectpage.html | 49 ++++++++++ src/api/todoApi.ts | 17 +++- src/command/msTodoCommand.ts | 174 +++++++++++++++++++++++++++++++++- src/main.ts | 70 +++++++++++++- src/model/ObsidianTodoTask.ts | 9 +- src/typings/obsidian-ex.d.ts | 32 +++++++ tsconfig.json | 3 +- 7 files changed, 346 insertions(+), 8 deletions(-) create mode 100644 redirectpage.html create mode 100644 src/typings/obsidian-ex.d.ts diff --git a/redirectpage.html b/redirectpage.html new file mode 100644 index 0000000..f98388c --- /dev/null +++ b/redirectpage.html @@ -0,0 +1,49 @@ + + + + ToDoObsidianRedirect + + + + + + + + diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index dad2fcf..1465be4 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -222,7 +222,7 @@ export class TodoApi { * @param toDo - The updated task details. * @returns A promise that resolves to the updated task. */ - async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { + async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask, blockId: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; if (toDo.linkedResources) { @@ -232,7 +232,7 @@ export class TodoApi { '@odata.type': '#microsoft.graph.linkedResource', webUrl: linkedResource.webUrl, applicationName: 'Obsidian Microsoft To Do Sync', - externalId: this.blockLink, + externalId: blockId, }; const linkedResourcesEndpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResource.id}`; const patchedLinkedResource = this.client.api(linkedResourcesEndpoint).update(updatedLinkedResource); @@ -242,4 +242,17 @@ export class TodoApi { toDo.linkedResources = undefined; return this.client.api(endpoint).patch(toDo); } + + async createLinkedResource(listId: string | undefined, taskId: string, blockId: string, fileName: string): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources`; + const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(fileName)}&block=${blockId}`; + + const updatedLinkedResource = { + webUrl: redirectUrl, + applicationName: 'Obsidian Microsoft To Do Sync', + externalId: blockId, + displayName: `Tracking Block Link: ${blockId}`, + }; + return this.client.api(endpoint).post(updatedLinkedResource); + } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 8f91639..e4786b0 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,9 +1,11 @@ /* eslint-disable max-params */ import { - type DataAdapter, type Editor, type EditorPosition, Notice, + type BlockCache, + type DataAdapter, type Editor, type EditorPosition, MarkdownView, Notice, } from 'obsidian'; import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask.js'; import {type TodoTask} from '@microsoft/microsoft-graph-types'; +import {type SettingsManager} from 'src/utils/settingsManager.js'; import type MsTodoSync from '../main.js'; import {TasksDeltaCollection, type TodoApi} from '../api/todoApi.js'; import {type IMsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; @@ -73,6 +75,66 @@ export async function getCurrentLinesFromEditor(editor: Editor): Promise = populateBlockCache(plugin); + + // Iterate over all the internal cached task ids in settings. If the block is not found in the metadata cache + // we will log it. The cache is a metadata hash and block id as block ids can be reused across pages. + for (const blockId in plugin.settings.taskIdLookup) { + if (Object.hasOwn(plugin.settings.taskIdLookup, blockId)) { + // Check if the block is in the metadata cache. + let found = false; + let block; + for (const key in blockCache) { + if (key.includes(blockId.toLowerCase())) { + found = true; + block = blockCache[key]; + } + } + + if (found) { + logger.info(`Block found in metadata cache: ${blockId}`, block); + } else { + logger.info(`Block not found in metadata cache: ${blockId}`); + // Clean up the block id from the settings. + delete plugin.settings.taskIdLookup[blockId]; // eslint-disable-line @typescript-eslint/no-dynamic-delete + await plugin.settingsManager.saveSettings(); // eslint-disable-line no-await-in-loop + } + } + } + + logger.info('blockCache', blockCache); +} + +/** + * This will find all block references across all files. + * + * @param {MsTodoSync} plugin + * @return {*} {Record} + */ +function populateBlockCache(plugin: MsTodoSync): Record { + const blockCache: Record = {}; + const internalMetadataCache = plugin.app.metadataCache.metadataCache; + for (const cacheKey in internalMetadataCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey) && internalMetadataCache[cacheKey].blocks) { + const blocksCache = internalMetadataCache[cacheKey].blocks; + for (const blockKey in blocksCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey)) { + const block = blocksCache[blockKey]; + blockCache[`${cacheKey}-${blockKey}`] = block; + } + } + } + } + + return blockCache; +} + /** * Posts tasks to Microsoft To Do from the selected lines in the editor. * @@ -136,14 +198,18 @@ export async function postTask( if (cachedTask) { const linkedResource = cachedTask.linkedResources?.find(resource => resource.applicationName === 'Obsidian Microsoft To Do Sync'); if (linkedResource) { + const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(todo.fileName)}&block=${todo.blockLink ?? ''}`; + linkedResource.webUrl = redirectUrl; linkedResource.externalId = todo.blockLink; linkedResource.displayName = `Tracking Block Link: ${todo.blockLink}`; + } else { + await todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.fileName); } } todo.linkedResources = cachedTask?.linkedResources; - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask(), todo.blockLink ?? ''); logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); logger.debug(`updated: ${returnedTask.id}`); } else { @@ -250,6 +316,7 @@ export async function getTaskDelta( todoApi: TodoApi, listId: string | undefined, plugin: MsTodoSync, + reset = false, ) { const logger = logging.getLogger('mstodo-sync.command.delta'); @@ -260,6 +327,10 @@ export async function getTaskDelta( const cachePath = `${plugin.app.vault.configDir}/mstd-tasks-delta.json`; const adapter: DataAdapter = plugin.app.vault.adapter; + if (reset) { + await adapter.remove(cachePath); + } + let deltaLink = ''; let cachedTasksDelta = await getDeltaCache(plugin); @@ -399,7 +470,7 @@ export async function postTaskAndChildren( // Const currentTaskState = await todoApi.getTask(listId, todo.id); let returnedTask; if (push) { - returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask(), todo.blockLink ?? ''); // Push the checklist items... todo.checklistItems = returnedTask.checklistItems; todo.status = returnedTask.status; @@ -446,6 +517,103 @@ function getLineEndPos(line: number, editor: Editor): EditorPosition { }; } +export async function getAllTasksInList( + todoApi: TodoApi, + listId: string | undefined, + editor: Editor, + plugin: MsTodoSync, + withBody: boolean, +) { + const logger = logging.getLogger('mstodo-sync.command.get'); + const now = globalThis.moment(); + const settings = plugin.settingsManager.settings; + + if (!listId) { + const notice = new Notice(t('CommandNotice_SetListName')); + return; + } + + // Single call to update the cache using the delta link. + await getTaskDelta(todoApi, listId, plugin); + const cachedTasksDelta = await getDeltaCache(plugin); + + cachedTasksDelta?.allTasks.sort((a, b) => (a.status === 'completed' ? 1 : -1)); + + const lines = cachedTasksDelta?.allTasks?.filter(task => task.status !== 'completed') + .map(task => { + const formattedCreateDate = globalThis + .moment(task.createdDateTime) + .format(settings.displayOptions_DateFormat); + const done = task.status === 'completed' ? 'x' : ' '; + const createDate + = formattedCreateDate === now.format(settings.displayOptions_DateFormat) + ? '' + : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; + + let blockId = ''; + for (const key in settings.taskIdLookup) { + if (Object.hasOwn(plugin.settings.taskIdLookup, key) && settings.taskIdLookup[key] === task.id) { + blockId = `^${key}`; + } + } + + if (blockId === '') { + const newId = cacheTaskId(task.id ?? '', plugin.settingsManager); + blockId = `^${newId}`; + } + + if (task.body?.content && withBody) { + // If the body has multiple lines then indent slightly on a new line. + const bodyLines = task.body.content.split('\r\n'); + const newBody = bodyLines.map((line, index) => ` ${stripHtml(line).trimEnd()}`); + return `- [${done}] ${task.title} ${createDate} ${blockId}\n${newBody.join('\n')}`.trimEnd(); + } + + return `- [${done}] ${task.title} ${createDate} ${blockId}`.trimEnd(); + }); + + const allTasks = lines?.join('\n'); + + if (editor) { + editor.replaceSelection(allTasks ?? ''); + const view = plugin.app.workspace.getActiveViewOfType(MarkdownView); + view?.leaf.view.tree.setCollapseAll(true); + + // GetActiveViewOfType will return null if the active view is null, or if it's not a MarkdownView. + if (view?.tree) { + view.tree.setCollapseAll(true); + // ... + } + } +} + +/** + * Cache the ID internally and generate block link. + * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask + */ +async function cacheTaskId(id: string, settingsManager: SettingsManager): Promise { + settingsManager.settings.taskIdIndex += 1; + + const index = `MSTD${Math.random().toString(20).slice(2, 6)}${settingsManager.settings.taskIdIndex + .toString() + .padStart(5, '0')}`; + + settingsManager.settings.taskIdLookup[index] = id ?? ''; + + settingsManager.saveSettings().catch(error => { + console.error('Error saving settings', error); + }); + + return index; +} + +function stripHtml(html: string): string { + return html.replaceAll(/<[^>]*>/g, ''); +} + export async function createTodayTasks(todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { const notice = new Notice('获取微软待办中', 3000); const now = globalThis.moment(); diff --git a/src/main.ts b/src/main.ts index c15d95d..338cf6e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,8 @@ import { import {TodoApi} from './api/todoApi.js'; import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; import { - createTodayTasks, getTask, getTaskDelta, getTaskIdFromLine, postTask, postTaskAndChildren, + cleanupCachedTaskIds, + createTodayTasks, getAllTasksInList, getTask, getTaskDelta, getTaskIdFromLine, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import {t} from './lib/lang.js'; import {log, logging} from './lib/logging.js'; @@ -198,6 +199,73 @@ export default class MsTodoSync extends Plugin { }); }), ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Reset Task Cache').onClick( + async () => { + await getTaskDelta( + this.todoApi, + this.settings.todoListSync?.listId, + this, + true, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Cleanup Local Task Lookup Table').onClick( + async () => { + await cleanupCachedTaskIds( + this, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Insert all tasks with body').onClick( + async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + true, + ); + }, + ); + }); + }), + ); + + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addItem(item => { + item.setTitle('Insert all tasks').onClick( + async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + false, + ); + }, + ); + }); + }), + ); } this.registerEvent( diff --git a/src/model/ObsidianTodoTask.ts b/src/model/ObsidianTodoTask.ts index 57ab4d8..73fddb1 100644 --- a/src/model/ObsidianTodoTask.ts +++ b/src/model/ObsidianTodoTask.ts @@ -161,6 +161,12 @@ export class ObsidianTodoTask implements TodoTask { // This will strip out the checkbox if in title. this.checkForStatus(line); + // - [ ] Adding in updated linked resources updated from list dump 🔎[[2024-12-30]] 🔎[[2024-12-30]] ^MSTDa8de00053 + // This will strip out the created date if in title. + if (this.title.includes(settingsManager.settings.displayOptions_TaskCreatedPrefix)) { + this.title = this.title.replaceAll(/🔎\[\[.*]]/g, '').replaceAll(/🔎\d{4}-\d{2}-\d{2}/g, ''); + } + this.checkForImportance(line); this.title = this.title @@ -175,8 +181,9 @@ export class ObsidianTodoTask implements TodoTask { this.linkedResources ||= []; + const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(fileName)}&block=${this.blockLink}`; this.linkedResources.push({ - webUrl: `obsidian://advanced-uri?filepath=${fileName}`, + webUrl: redirectUrl, applicationName: 'Obsidian Microsoft To Do Sync', externalId: this.blockLink, displayName: `Tracking Block Link: ${this.blockLink}`, diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts new file mode 100644 index 0000000..8710b0d --- /dev/null +++ b/src/typings/obsidian-ex.d.ts @@ -0,0 +1,32 @@ +/* eslint-disable unicorn/filename-case */ + +/* eslint-disable @typescript-eslint/naming-convention */ + +import _ from 'obsidian'; + +declare module 'obsidian' { + interface MetadataCache { + metadataCache: Record; + } + + interface App { + appId: string; + plugins: { + enabledPlugins: Set; + }; + } + + interface View { + tree: { + toggleCollapseAll: () => void; + setCollapseAll: (collapse: boolean) => void; + isAllCollapsed: boolean; + }; + toggleCollapseAll: () => void; + setCollapseAll: (collapse: boolean) => void; + isAllCollapsed: boolean; + collapseOrExpandAllEl: HTMLDivElement; + } + +} + diff --git a/tsconfig.json b/tsconfig.json index 534d29a..76bde03 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,7 +18,8 @@ "ES5", "ES6", "ES7", - "ES2021" + "ES2021", + "ES2022" ] }, "include": [ From a0b4e29010642b460a2a1da7cbadfdc9f5c2e6e9 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 3 Jan 2025 09:24:59 -0800 Subject: [PATCH 22/34] refactor: fix casing on a file --- src/command/msTodoCommand.ts | 2 +- src/model/{ObsidianTodoTask.ts => obsidianTodoTask.ts} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/model/{ObsidianTodoTask.ts => obsidianTodoTask.ts} (100%) diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index e4786b0..2348751 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -3,7 +3,7 @@ import { type BlockCache, type DataAdapter, type Editor, type EditorPosition, MarkdownView, Notice, } from 'obsidian'; -import {ObsidianTodoTask} from 'src/model/ObsidianTodoTask.js'; +import {ObsidianTodoTask} from 'src/model/obsidianTodoTask.js'; import {type TodoTask} from '@microsoft/microsoft-graph-types'; import {type SettingsManager} from 'src/utils/settingsManager.js'; import type MsTodoSync from '../main.js'; diff --git a/src/model/ObsidianTodoTask.ts b/src/model/obsidianTodoTask.ts similarity index 100% rename from src/model/ObsidianTodoTask.ts rename to src/model/obsidianTodoTask.ts From 15be62f9da1ba58490a3f99411cfb9840a0ab2e3 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 3 Jan 2025 09:34:31 -0800 Subject: [PATCH 23/34] build: switch to @ophidian/build and library upgrades --- dist/manifest.json | 10 + styles.css => dist/styles.css | 0 esbuild.config.mjs | 62 +- ophidian.config.mjs | 5 + package.json | 15 +- pnpm-lock.yaml | 1297 +++++++++++++++++++++------------ 6 files changed, 887 insertions(+), 502 deletions(-) create mode 100644 dist/manifest.json rename styles.css => dist/styles.css (100%) create mode 100644 ophidian.config.mjs diff --git a/dist/manifest.json b/dist/manifest.json new file mode 100644 index 0000000..cbc0000 --- /dev/null +++ b/dist/manifest.json @@ -0,0 +1,10 @@ +{ + "id": "obsidian-mstodo-sync", + "name": "Microsoft To Do Sync", + "version": "1.0.1", + "minAppVersion": "0.15.0", + "description": "一款同步微软Todo的obsidian插件 | An obsidian plugin that syncs with Microsoft Todo", + "author": "Lumos", + "authorUrl": "https://obsidian.md", + "isDesktopOnly": false +} \ No newline at end of file diff --git a/styles.css b/dist/styles.css similarity index 100% rename from styles.css rename to dist/styles.css diff --git a/esbuild.config.mjs b/esbuild.config.mjs index 7b8d0dd..8806d54 100644 --- a/esbuild.config.mjs +++ b/esbuild.config.mjs @@ -11,34 +11,34 @@ if you want to view the source, please visit the github repository of this plugi const production = process.argv[2] === 'production'; esbuild - .build({ - banner: { - js: banner, - }, - entryPoints: ['src/main.ts'], - bundle: true, - external: [ - 'obsidian', - 'electron', - '@codemirror/autocomplete', - '@codemirror/collab', - '@codemirror/commands', - '@codemirror/language', - '@codemirror/lint', - '@codemirror/search', - '@codemirror/state', - '@codemirror/view', - '@lezer/common', - '@lezer/highlight', - '@lezer/lr', - ...builtins, - ], - format: 'cjs', - watch: !production, - target: 'es2018', - logLevel: 'info', - sourcemap: production ? false : 'inline', - treeShaking: true, - outfile: 'main.js', - }) - .catch(() => process.exit(1)); + .build({ + banner: { + js: banner, + }, + entryPoints: ['src/main.ts'], + bundle: true, + external: [ + 'obsidian', + 'electron', + '@codemirror/autocomplete', + '@codemirror/collab', + '@codemirror/commands', + '@codemirror/language', + '@codemirror/lint', + '@codemirror/search', + '@codemirror/state', + '@codemirror/view', + '@lezer/common', + '@lezer/highlight', + '@lezer/lr', + ...builtins, + ], + format: 'cjs', + watch: !production, + target: 'es2018', + logLevel: 'info', + sourcemap: production ? false : 'inline', + treeShaking: true, + outfile: 'main.js', + }) + .catch(() => process.exit(1)); diff --git a/ophidian.config.mjs b/ophidian.config.mjs new file mode 100644 index 0000000..eda8a4b --- /dev/null +++ b/ophidian.config.mjs @@ -0,0 +1,5 @@ +import Builder from '@ophidian/build'; + +new Builder('src/main.ts') // <-- the path of your main module + .withInstall() // Optional: publish to OBSIDIAN_TEST_VAULT on build + .build(); diff --git a/package.json b/package.json index 1aca97f..c38e5fb 100644 --- a/package.json +++ b/package.json @@ -5,25 +5,28 @@ "main": "main.js", "scripts": { "preinstall": "npx only-allow pnpm", - "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "dev": "node esbuild.config.mjs", + "buildo": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "devo": "node esbuild.config.mjs", "version": "node version-bump.mjs && git add manifest.json versions.json", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix", "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", - "test": "xo" + "test": "xo", + "dev": "node ophidian.config.mjs dev", + "build": "node ophidian.config.mjs production" }, "keywords": [], "author": "", "license": "MIT", "devDependencies": { + "@ophidian/build": "^1", "@types/node": "^16.18.122", "@types/node-fetch": "^2.6.12", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^8.19.0", + "@typescript-eslint/parser": "^8.19.0", "builtin-modules": "3.3.0", "esbuild": "^0.14.54", - "eslint": "^7.32.0", + "eslint": "^9.17.0", "eslint-config-prettier": "^8.10.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-loops": "^0.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e949b4a..f9d3f74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,6 +27,9 @@ importers: specifier: ^2.7.0 version: 2.7.0 devDependencies: + '@ophidian/build': + specifier: ^1 + version: 1.2.1 '@types/node': specifier: ^16.18.122 version: 16.18.122 @@ -34,11 +37,11 @@ importers: specifier: ^2.6.12 version: 2.6.12 '@typescript-eslint/eslint-plugin': - specifier: ^5.62.0 - version: 5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5) + specifier: ^8.19.0 + version: 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0)(typescript@4.9.5) '@typescript-eslint/parser': - specifier: ^5.62.0 - version: 5.62.0(eslint@7.32.0)(typescript@4.9.5) + specifier: ^8.19.0 + version: 8.19.0(eslint@9.17.0)(typescript@4.9.5) builtin-modules: specifier: 3.3.0 version: 3.3.0 @@ -46,20 +49,20 @@ importers: specifier: ^0.14.54 version: 0.14.54 eslint: - specifier: ^7.32.0 - version: 7.32.0 + specifier: ^9.17.0 + version: 9.17.0 eslint-config-prettier: specifier: ^8.10.0 - version: 8.10.0(eslint@7.32.0) + version: 8.10.0(eslint@9.17.0) eslint-plugin-import: specifier: ^2.31.0 - version: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0) + version: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0) eslint-plugin-no-loops: specifier: ^0.3.0 - version: 0.3.0(eslint@7.32.0) + version: 0.3.0(eslint@9.17.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8) + version: 4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8) obsidian: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) @@ -86,9 +89,6 @@ packages: resolution: {integrity: sha512-An7l1hEr0w1HMMh1LU+rtDtqL7/jw74ORlc9Wnh06v7TU/xpG39/Zdr1ZJu3QpjUfKJ+E0/OXMW8DRSWTlh7qQ==} engines: {node: '>=16'} - '@babel/code-frame@7.12.11': - resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} - '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -97,10 +97,6 @@ packages: resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} - '@babel/highlight@7.25.9': - resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} - engines: {node: '>=6.9.0'} - '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} @@ -111,12 +107,144 @@ packages: '@codemirror/view@6.4.1': resolution: {integrity: sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==} + '@esbuild/android-arm64@0.17.6': + resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.6': + resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.6': + resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.6': + resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.6': + resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.6': + resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.6': + resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.6': + resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.6': + resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.6': + resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.14.54': resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==} engines: {node: '>=12'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.17.6': + resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.6': + resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.6': + resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.6': + resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.6': + resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.6': + resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.17.6': + resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.17.6': + resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.17.6': + resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.6': + resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.6': + resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.6': + resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -127,9 +255,13 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/eslintrc@0.4.3': - resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} - engines: {node: ^10.12.0 || >=12.0.0} + '@eslint/config-array@0.19.1': + resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.9.1': + resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@2.1.4': resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} @@ -143,28 +275,47 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@9.17.0': + resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/object-schema@2.1.5': + resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.2.4': + resolution: {integrity: sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead - '@humanwhocodes/config-array@0.5.0': - resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@1.2.1': - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/object-schema@2.0.3': resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@humanwhocodes/retry@0.3.1': + resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} + engines: {node: '>=18.18'} + + '@humanwhocodes/retry@0.4.1': + resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + engines: {node: '>=18.18'} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -219,6 +370,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@ophidian/build@1.2.1': + resolution: {integrity: sha512-ulefYLGwlWmsP5WgkOunujhU57dB5slENQ7VvwFh0h0Yk6id4Osg3jN0yONtB9gF6awfjzfK4OxzfOhmuzWx7g==} + '@pkgr/core@0.1.1': resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} @@ -264,26 +418,15 @@ packages: '@types/node@16.18.122': resolution: {integrity: sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg==} + '@types/node@16.18.123': + resolution: {integrity: sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - '@types/tern@0.23.9': resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} - '@typescript-eslint/eslint-plugin@5.62.0': - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/eslint-plugin@7.18.0': resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} engines: {node: ^18.18.0 || >=20.0.0} @@ -295,15 +438,13 @@ packages: typescript: optional: true - '@typescript-eslint/parser@5.62.0': - resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/eslint-plugin@8.19.0': + resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/parser@7.18.0': resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} @@ -315,23 +456,20 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@5.62.0': - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/parser@8.19.0': + resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/scope-manager@7.18.0': resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/type-utils@5.62.0': - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/scope-manager@8.19.0': + resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@7.18.0': resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} @@ -343,22 +481,20 @@ packages: typescript: optional: true - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/type-utils@8.19.0': + resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/types@7.18.0': resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@typescript-eslint/types@8.19.0': + resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@7.18.0': resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} @@ -369,11 +505,11 @@ packages: typescript: optional: true - '@typescript-eslint/utils@5.62.0': - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/typescript-estree@8.19.0': + resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/utils@7.18.0': resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} @@ -381,14 +517,21 @@ packages: peerDependencies: eslint: ^8.56.0 - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@typescript-eslint/utils@8.19.0': + resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' '@typescript-eslint/visitor-keys@7.18.0': resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.19.0': + resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@ungap/structured-clone@1.2.1': resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} @@ -448,11 +591,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -482,10 +620,6 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - ansi-escapes@6.2.1: resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} engines: {node: '>=14.16'} @@ -498,16 +632,13 @@ packages: resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -520,10 +651,18 @@ packages: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} + array-union@1.0.2: + resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} + engines: {node: '>=0.10.0'} + array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + array-uniq@1.0.3: + resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} + engines: {node: '>=0.10.0'} + array.prototype.findlastindex@1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} @@ -540,14 +679,14 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + arrify@3.0.0: resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} engines: {node: '>=12'} - astral-regex@2.0.0: - resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} - engines: {node: '>=8'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -558,6 +697,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -606,10 +749,6 @@ packages: caniuse-lite@1.0.30001690: resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -618,6 +757,10 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} @@ -630,16 +773,10 @@ packages: resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} engines: {node: '>=4'} - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -659,9 +796,17 @@ packages: confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + copy-newer@2.1.2: + resolution: {integrity: sha512-IDhyNGNvbSqwjQXjZ3tAzZNXRw0UmXa+TmTQmMJziikQ+sdsV9EkI6B2WZX1u9m3TKHayBCc2pGqXU/KlBqJdg==} + engines: {node: '>=4'} + hasBin: true + core-js-compat@3.39.0: resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cosmiconfig@9.0.0: resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} @@ -675,6 +820,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -756,9 +905,6 @@ packages: emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - enhance-visitors@1.0.0: resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} engines: {node: '>=4.0.0'} @@ -771,10 +917,6 @@ packages: resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} - enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - env-editor@1.1.0: resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -912,6 +1054,16 @@ packages: cpu: [x64] os: [openbsd] + esbuild-plugin-copy@2.1.1: + resolution: {integrity: sha512-Bk66jpevTcV8KMFzZI1P7MZKZ+uDcrZm2G2egZ2jNIvVnivDpodZI+/KnpL3Jnap0PBdIHU7HwFGB8r+vV5CVw==} + peerDependencies: + esbuild: '>= 0.14.0' + + esbuild-plugin-sass@1.0.1: + resolution: {integrity: sha512-YFxjzD9Z1vz92QCJcAmCO15WVCUiOobw9ypdVeMsW+xa6S+zqryLUIh8d3fe/UkRHRO5PODZz/3xDAQuEXZwmQ==} + peerDependencies: + esbuild: '>=0.11.14' + esbuild-sunos-64@0.14.54: resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==} engines: {node: '>=12'} @@ -941,6 +1093,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.17.6: + resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} + engines: {node: '>=12'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -1112,9 +1269,9 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-utils@2.1.0: - resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} - engines: {node: '>=6'} + eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-utils@3.0.0: resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} @@ -1122,10 +1279,6 @@ packages: peerDependencies: eslint: '>=5' - eslint-visitor-keys@1.3.0: - resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} - engines: {node: '>=4'} - eslint-visitor-keys@2.1.0: resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} engines: {node: '>=10'} @@ -1138,18 +1291,22 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@7.32.0: - resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==} - engines: {node: ^10.12.0 || >=12.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + eslint@9.17.0: + resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + esm-utils@4.3.0: resolution: {integrity: sha512-KupZztbWAnuksy1TYPjTkePxVlMWzmXdmB72z1WvUadtUiFv6x+0PKjYfyy1io9gdvU1A6QIcu055NRrJu1TEA==} @@ -1157,19 +1314,10 @@ packages: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@7.3.1: - resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==} - engines: {node: ^10.12.0 || >=12.0.0} - espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - espurify@2.1.1: resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} @@ -1234,6 +1382,10 @@ packages: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1265,6 +1417,10 @@ packages: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -1275,9 +1431,26 @@ packages: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} + fs-extra@10.0.0: + resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==} + engines: {node: '>=12'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-write-stream-atomic@1.0.10: + resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==} + deprecated: This package is no longer supported. + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1285,9 +1458,6 @@ packages: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -1329,6 +1499,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@6.0.4: + resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} + deprecated: Glob versions prior to v9 are no longer supported + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -1357,6 +1531,10 @@ packages: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} + globby@4.1.0: + resolution: {integrity: sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==} + engines: {node: '>=0.10.0'} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -1371,10 +1549,6 @@ packages: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} @@ -1405,14 +1579,16 @@ packages: resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} engines: {node: '>=18.18.0'} - ignore@4.0.6: - resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} - engines: {node: '>= 4'} + iferr@0.1.5: + resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -1470,6 +1646,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.1: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} @@ -1507,10 +1687,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} @@ -1624,6 +1800,9 @@ packages: resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} engines: {node: '>=16'} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isarray@2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} @@ -1641,10 +1820,6 @@ packages: resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} engines: {node: '>=0.10.0'} - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true @@ -1677,6 +1852,9 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonwebtoken@9.0.2: resolution: {integrity: sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==} engines: {node: '>=12', npm: '>=6'} @@ -1744,9 +1922,6 @@ packages: lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash.truncate@4.4.2: - resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} - lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -1762,6 +1937,9 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + memory-fs@0.2.0: resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} @@ -1805,15 +1983,19 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + monkey-around@2.3.0: + resolution: {integrity: sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - natural-compare-lite@1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -1835,6 +2017,10 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -1843,6 +2029,10 @@ packages: resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} engines: {node: '>=0.10.0'} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.3: resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} engines: {node: '>= 0.4'} @@ -1970,6 +2160,18 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pinkie-promise@2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + + pinkie@2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} @@ -2012,9 +2214,8 @@ packages: resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} engines: {node: '>=18'} - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} proto-props@2.0.0: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} @@ -2038,6 +2239,13 @@ packages: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + reflect.getprototypeof@1.0.9: resolution: {integrity: sha512-r0Ay04Snci87djAsI4U+WNRcSw5S4pOH7qFjd/veA5gC7TbqESR3tcj28ia95L/fYUDw11JKP7uqUKUAfVvV5Q==} engines: {node: '>= 0.4'} @@ -2053,10 +2261,6 @@ packages: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regexpp@3.2.0: - resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} - engines: {node: '>=8'} - regjsparser@0.10.0: resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} hasBin: true @@ -2105,6 +2309,9 @@ packages: resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} engines: {node: '>=0.4'} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -2116,6 +2323,11 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + sass@1.47.0: + resolution: {integrity: sha512-GtXwvwgD7/6MLUZPnlA5/8cdRgC9SzT5kAnnJMRmEZQFRE3J56Foswig4NyyyQGsnmNvg6EUM/FP0Pe9Y2zywQ==} + engines: {node: '>=8.9.0'} + hasBin: true + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -2184,9 +2396,9 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - slice-ansi@4.0.0: - resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} - engines: {node: '>=10'} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -2207,13 +2419,6 @@ packages: spdx-license-ids@3.0.20: resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - string-width@7.2.0: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} @@ -2230,6 +2435,9 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -2257,10 +2465,6 @@ packages: style-mod@4.1.2: resolution: {integrity: sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==} - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -2281,10 +2485,6 @@ packages: resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} engines: {node: ^14.18.0 || >=16.0.0} - table@6.9.0: - resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} - engines: {node: '>=10.0.0'} - tapable@0.1.10: resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} engines: {node: '>=0.6'} @@ -2317,6 +2517,10 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + tmp@0.2.1: + resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} + engines: {node: '>=8.17.0'} + to-absolute-glob@3.0.0: resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} engines: {node: '>=0.10.0'} @@ -2337,18 +2541,9 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2411,6 +2606,10 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + update-browserslist-db@1.1.1: resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} hasBin: true @@ -2423,13 +2622,13 @@ packages: url-or-path@2.3.2: resolution: {integrity: sha512-DOI9KXk0bc/JOmFQHbn25knW2GX/ym7+egKFEFApG3VdDzRlLBMCIrMnruq4AZUGop1W0aiYQ5Vry6clzhxcOQ==} + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - v8-compile-cache@2.4.0: - resolution: {integrity: sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -2520,10 +2719,6 @@ snapshots: jsonwebtoken: 9.0.2 uuid: 8.3.2 - '@babel/code-frame@7.12.11': - dependencies: - '@babel/highlight': 7.25.9 - '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -2532,13 +2727,6 @@ snapshots: '@babel/helper-validator-identifier@7.25.9': {} - '@babel/highlight@7.25.9': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.1.1 - '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 @@ -2551,35 +2739,99 @@ snapshots: style-mod: 4.1.2 w3c-keyname: 2.2.8 + '@esbuild/android-arm64@0.17.6': + optional: true + + '@esbuild/android-arm@0.17.6': + optional: true + + '@esbuild/android-x64@0.17.6': + optional: true + + '@esbuild/darwin-arm64@0.17.6': + optional: true + + '@esbuild/darwin-x64@0.17.6': + optional: true + + '@esbuild/freebsd-arm64@0.17.6': + optional: true + + '@esbuild/freebsd-x64@0.17.6': + optional: true + + '@esbuild/linux-arm64@0.17.6': + optional: true + + '@esbuild/linux-arm@0.17.6': + optional: true + + '@esbuild/linux-ia32@0.17.6': + optional: true + '@esbuild/linux-loong64@0.14.54': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@7.32.0)': - dependencies: - eslint: 7.32.0 - eslint-visitor-keys: 3.4.3 + '@esbuild/linux-loong64@0.17.6': + optional: true + + '@esbuild/linux-mips64el@0.17.6': + optional: true + + '@esbuild/linux-ppc64@0.17.6': + optional: true + + '@esbuild/linux-riscv64@0.17.6': + optional: true + + '@esbuild/linux-s390x@0.17.6': + optional: true + + '@esbuild/linux-x64@0.17.6': + optional: true + + '@esbuild/netbsd-x64@0.17.6': + optional: true + + '@esbuild/openbsd-x64@0.17.6': + optional: true + + '@esbuild/sunos-x64@0.17.6': + optional: true + + '@esbuild/win32-arm64@0.17.6': + optional: true + + '@esbuild/win32-ia32@0.17.6': + optional: true + + '@esbuild/win32-x64@0.17.6': + optional: true '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': + dependencies: + eslint: 9.17.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} - '@eslint/eslintrc@0.4.3': + '@eslint/config-array@0.19.1': dependencies: - ajv: 6.12.6 + '@eslint/object-schema': 2.1.5 debug: 4.4.0 - espree: 7.3.1 - globals: 13.24.0 - ignore: 4.0.6 - import-fresh: 3.3.0 - js-yaml: 3.14.1 minimatch: 3.1.2 - strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + '@eslint/core@0.9.1': + dependencies: + '@types/json-schema': 7.0.15 + '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 @@ -2610,17 +2862,24 @@ snapshots: '@eslint/js@8.57.1': {} - '@humanwhocodes/config-array@0.13.0': + '@eslint/js@9.17.0': {} + + '@eslint/object-schema@2.1.5': {} + + '@eslint/plugin-kit@0.2.4': dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + levn: 0.4.1 + + '@humanfs/core@0.19.1': {} - '@humanwhocodes/config-array@0.5.0': + '@humanfs/node@0.16.6': dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: @@ -2628,10 +2887,12 @@ snapshots: '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@1.2.1': {} - '@humanwhocodes/object-schema@2.0.3': {} + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.1': {} + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -2673,6 +2934,17 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.18.0 + '@ophidian/build@1.2.1': + dependencies: + builtin-modules: 3.3.0 + copy-newer: 2.1.2 + esbuild: 0.17.6 + esbuild-plugin-copy: 2.1.1(esbuild@0.17.6) + esbuild-plugin-sass: 1.0.1(esbuild@0.17.6) + fs-extra: 10.1.0 + monkey-around: 2.3.0 + sass: 1.47.0 + '@pkgr/core@0.1.1': {} '@rtsao/scc@1.1.0': {} @@ -2715,33 +2987,14 @@ snapshots: '@types/node@16.18.122': {} - '@types/normalize-package-data@2.4.4': {} + '@types/node@16.18.123': {} - '@types/semver@7.5.8': {} + '@types/normalize-package-data@2.4.4': {} '@types/tern@0.23.9': dependencies: '@types/estree': 1.0.6 - '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0)(typescript@4.9.5)': - dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - debug: 4.4.0 - eslint: 7.32.0 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 @@ -2760,14 +3013,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.4.0 - eslint: 7.32.0 - optionalDependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/type-utils': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.19.0 + eslint: 9.17.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color @@ -2785,27 +3043,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@5.62.0': + '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@4.9.5) + '@typescript-eslint/visitor-keys': 8.19.0 + debug: 4.4.0 + eslint: 9.17.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color '@typescript-eslint/scope-manager@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/type-utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': + '@typescript-eslint/scope-manager@8.19.0': dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - '@typescript-eslint/utils': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - debug: 4.4.0 - eslint: 7.32.0 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: @@ -2819,24 +3077,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@5.62.0': {} - - '@typescript-eslint/types@7.18.0': {} - - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@4.9.5) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@4.9.5) debug: 4.4.0 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: + eslint: 9.17.0 + ts-api-utils: 1.4.3(typescript@4.9.5) typescript: 4.9.5 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@7.18.0': {} + + '@typescript-eslint/types@8.19.0': {} + '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': dependencies: '@typescript-eslint/types': 7.18.0 @@ -2852,20 +3107,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@5.62.0(eslint@7.32.0)(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.19.0(typescript@4.9.5)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@7.32.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - eslint: 7.32.0 - eslint-scope: 5.1.1 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/visitor-keys': 8.19.0 + debug: 4.4.0 + fast-glob: 3.3.2 + is-glob: 4.0.3 + minimatch: 9.0.5 semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@4.9.5) + typescript: 4.9.5 transitivePeerDependencies: - supports-color - - typescript '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': dependencies: @@ -2878,16 +3132,27 @@ snapshots: - supports-color - typescript - '@typescript-eslint/visitor-keys@5.62.0': + '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) + '@typescript-eslint/scope-manager': 8.19.0 + '@typescript-eslint/types': 8.19.0 + '@typescript-eslint/typescript-estree': 8.19.0(typescript@4.9.5) + eslint: 9.17.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@7.18.0': dependencies: '@typescript-eslint/types': 7.18.0 eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.19.0': + dependencies: + '@typescript-eslint/types': 8.19.0 + eslint-visitor-keys: 4.2.0 + '@ungap/structured-clone@1.2.1': {} '@webassemblyjs/ast@1.14.1': @@ -2970,16 +3235,10 @@ snapshots: '@xtuc/long@4.2.2': {} - acorn-jsx@5.3.2(acorn@7.4.1): - dependencies: - acorn: 7.4.1 - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 - acorn@7.4.1: {} - acorn@8.14.0: {} ajv-formats@2.1.1(ajv@8.17.1): @@ -3009,25 +3268,20 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ansi-colors@4.1.3: {} - ansi-escapes@6.2.1: {} ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - argparse@1.0.10: + anymatch@3.1.3: dependencies: - sprintf-js: 1.0.3 + normalize-path: 3.0.0 + picomatch: 2.3.1 argparse@2.0.1: {} @@ -3045,8 +3299,14 @@ snapshots: get-intrinsic: 1.2.6 is-string: 1.1.1 + array-union@1.0.2: + dependencies: + array-uniq: 1.0.3 + array-union@2.1.0: {} + array-uniq@1.0.3: {} + array.prototype.findlastindex@1.2.5: dependencies: call-bind: 1.0.8 @@ -3080,9 +3340,9 @@ snapshots: get-intrinsic: 1.2.6 is-array-buffer: 3.0.5 - arrify@3.0.0: {} + arrify@1.0.1: {} - astral-regex@2.0.0: {} + arrify@3.0.0: {} asynckit@0.4.0: {} @@ -3092,6 +3352,8 @@ snapshots: balanced-match@1.0.2: {} + binary-extensions@2.3.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -3143,12 +3405,6 @@ snapshots: caniuse-lite@1.0.30001690: {} - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -3156,6 +3412,18 @@ snapshots: chalk@5.4.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chrome-trace-event@1.0.4: {} ci-info@4.1.0: {} @@ -3164,16 +3432,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} - color-name@1.1.4: {} combined-stream@1.0.8: @@ -3188,10 +3450,21 @@ snapshots: confusing-browser-globals@1.0.11: {} + copy-newer@2.1.2: + dependencies: + fs-write-stream-atomic: 1.0.10 + globby: 4.1.0 + graceful-fs: 4.2.11 + minimist: 1.2.8 + mkdirp: 0.5.6 + pify: 2.3.0 + core-js-compat@3.39.0: dependencies: browserslist: 4.24.3 + core-util-is@1.0.3: {} + cosmiconfig@9.0.0(typescript@5.7.2): dependencies: env-paths: 2.2.1 @@ -3207,6 +3480,11 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 @@ -3284,8 +3562,6 @@ snapshots: emoji-regex@10.4.0: {} - emoji-regex@8.0.0: {} - enhance-visitors@1.0.0: dependencies: lodash: 4.17.21 @@ -3301,11 +3577,6 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.2.1 - enquirer@2.4.1: - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - env-editor@1.1.0: {} env-paths@2.2.1: {} @@ -3440,6 +3711,22 @@ snapshots: esbuild-openbsd-64@0.14.54: optional: true + esbuild-plugin-copy@2.1.1(esbuild@0.17.6): + dependencies: + chalk: 4.1.2 + chokidar: 3.6.0 + esbuild: 0.17.6 + fs-extra: 10.1.0 + globby: 11.1.0 + + esbuild-plugin-sass@1.0.1(esbuild@0.17.6): + dependencies: + css-tree: 1.1.3 + esbuild: 0.17.6 + fs-extra: 10.0.0 + sass: 1.47.0 + tmp: 0.2.1 + esbuild-sunos-64@0.14.54: optional: true @@ -3476,6 +3763,31 @@ snapshots: esbuild-windows-64: 0.14.54 esbuild-windows-arm64: 0.14.54 + esbuild@0.17.6: + optionalDependencies: + '@esbuild/android-arm': 0.17.6 + '@esbuild/android-arm64': 0.17.6 + '@esbuild/android-x64': 0.17.6 + '@esbuild/darwin-arm64': 0.17.6 + '@esbuild/darwin-x64': 0.17.6 + '@esbuild/freebsd-arm64': 0.17.6 + '@esbuild/freebsd-x64': 0.17.6 + '@esbuild/linux-arm': 0.17.6 + '@esbuild/linux-arm64': 0.17.6 + '@esbuild/linux-ia32': 0.17.6 + '@esbuild/linux-loong64': 0.17.6 + '@esbuild/linux-mips64el': 0.17.6 + '@esbuild/linux-ppc64': 0.17.6 + '@esbuild/linux-riscv64': 0.17.6 + '@esbuild/linux-s390x': 0.17.6 + '@esbuild/linux-x64': 0.17.6 + '@esbuild/netbsd-x64': 0.17.6 + '@esbuild/openbsd-x64': 0.17.6 + '@esbuild/sunos-x64': 0.17.6 + '@esbuild/win32-arm64': 0.17.6 + '@esbuild/win32-ia32': 0.17.6 + '@esbuild/win32-x64': 0.17.6 + escalade@3.2.0: {} escape-string-regexp@1.0.5: {} @@ -3487,9 +3799,9 @@ snapshots: eslint: 8.57.1 semver: 7.6.3 - eslint-config-prettier@8.10.0(eslint@7.32.0): + eslint-config-prettier@8.10.0(eslint@9.17.0): dependencies: - eslint: 7.32.0 + eslint: 9.17.0 eslint-config-prettier@9.1.0(eslint@8.57.1): dependencies: @@ -3526,11 +3838,11 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)): + eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)): dependencies: debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0) find-root: 1.1.0 hasown: 2.0.2 interpret: 1.4.0 @@ -3543,24 +3855,24 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) - eslint: 7.32.0 + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)) transitivePeerDependencies: - supports-color @@ -3589,7 +3901,7 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3598,9 +3910,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 7.32.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@7.32.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3612,13 +3924,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 5.62.0(eslint@7.32.0)(typescript@4.9.5) + '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -3627,9 +3939,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.17.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -3641,7 +3953,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -3659,9 +3971,9 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-no-loops@0.3.0(eslint@7.32.0): + eslint-plugin-no-loops@0.3.0(eslint@9.17.0): dependencies: - eslint: 7.32.0 + eslint: 9.17.0 eslint-plugin-no-use-extend-native@0.5.0: dependencies: @@ -3670,13 +3982,13 @@ snapshots: is-obj-prop: 1.0.0 is-proto-prop: 2.0.0 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@7.32.0))(eslint@7.32.0)(prettier@2.8.8): + eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8): dependencies: - eslint: 7.32.0 + eslint: 9.17.0 prettier: 2.8.8 prettier-linter-helpers: 1.0.0 optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@7.32.0) + eslint-config-prettier: 8.10.0(eslint@9.17.0) eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): dependencies: @@ -3724,108 +4036,101 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@2.1.0: + eslint-scope@8.2.0: dependencies: - eslint-visitor-keys: 1.3.0 + esrecurse: 4.3.0 + estraverse: 5.3.0 eslint-utils@3.0.0(eslint@8.57.1): dependencies: eslint: 8.57.1 eslint-visitor-keys: 2.1.0 - eslint-visitor-keys@1.3.0: {} - eslint-visitor-keys@2.1.0: {} eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} - eslint@7.32.0: + eslint@8.57.1: dependencies: - '@babel/code-frame': 7.12.11 - '@eslint/eslintrc': 0.4.3 - '@humanwhocodes/config-array': 0.5.0 + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0 doctrine: 3.0.0 - enquirer: 2.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - eslint-visitor-keys: 2.1.0 - espree: 7.3.1 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 - functional-red-black-tree: 1.0.1 - glob-parent: 5.1.2 + find-up: 5.0.0 + glob-parent: 6.0.2 globals: 13.24.0 - ignore: 4.0.6 - import-fresh: 3.3.0 + graphemer: 1.4.0 + ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - js-yaml: 3.14.1 + 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.4 - progress: 2.0.3 - regexpp: 3.2.0 - semver: 7.6.3 strip-ansi: 6.0.1 - strip-json-comments: 3.1.1 - table: 6.9.0 text-table: 0.2.0 - v8-compile-cache: 2.4.0 transitivePeerDependencies: - supports-color - eslint@8.57.1: + eslint@9.17.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 + '@eslint/config-array': 0.19.1 + '@eslint/core': 0.9.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.17.0 + '@eslint/plugin-kit': 0.2.4 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.1 + '@humanwhocodes/retry': 0.4.1 + '@types/estree': 1.0.6 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.0 - 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 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 ignore: 5.3.2 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.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color @@ -3840,20 +4145,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 - espree@7.3.1: - dependencies: - acorn: 7.4.1 - acorn-jsx: 5.3.2(acorn@7.4.1) - eslint-visitor-keys: 1.3.0 - espree@9.6.1: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 - esprima@4.0.1: {} - espurify@2.1.1: {} esquery@1.6.0: @@ -3919,6 +4216,10 @@ snapshots: dependencies: flat-cache: 3.2.0 + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -3953,6 +4254,11 @@ snapshots: keyv: 4.5.4 rimraf: 3.0.2 + flat-cache@4.0.1: + dependencies: + flatted: 3.3.2 + keyv: 4.5.4 + flatted@3.3.2: {} for-each@0.3.3: @@ -3965,8 +4271,30 @@ snapshots: combined-stream: 1.0.8 mime-types: 2.1.35 + fs-extra@10.0.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-write-stream-atomic@1.0.10: + dependencies: + graceful-fs: 4.2.11 + iferr: 0.1.5 + imurmurhash: 0.1.4 + readable-stream: 2.3.8 + fs.realpath@1.0.0: {} + fsevents@2.3.3: + optional: true + function-bind@1.1.2: {} function.prototype.name@1.1.8: @@ -3978,8 +4306,6 @@ snapshots: hasown: 2.0.2 is-callable: 1.2.7 - functional-red-black-tree@1.0.1: {} - functions-have-names@1.2.3: {} get-east-asian-width@1.3.0: {} @@ -4026,6 +4352,14 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@6.0.4: + dependencies: + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -4066,6 +4400,15 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.1.0 + globby@4.1.0: + dependencies: + array-union: 1.0.2 + arrify: 1.0.1 + glob: 6.0.4 + object-assign: 4.1.1 + pify: 2.3.0 + pinkie-promise: 2.0.1 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -4074,8 +4417,6 @@ snapshots: has-bigints@1.1.0: {} - has-flag@3.0.0: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -4100,10 +4441,12 @@ snapshots: human-signals@8.0.0: {} - ignore@4.0.6: {} + iferr@0.1.5: {} ignore@5.3.2: {} + immutable@4.3.7: {} + import-fresh@3.3.0: dependencies: parent-module: 1.0.1 @@ -4155,6 +4498,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.1: dependencies: call-bound: 1.0.3 @@ -4189,8 +4536,6 @@ snapshots: dependencies: call-bound: 1.0.3 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 @@ -4296,13 +4641,15 @@ snapshots: dependencies: is-inside-container: 1.0.0 + isarray@1.0.0: {} + isarray@2.0.5: {} isexe@2.0.0: {} jest-worker@27.5.1: dependencies: - '@types/node': 16.18.122 + '@types/node': 16.18.123 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -4310,11 +4657,6 @@ snapshots: js-types@1.0.0: {} - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - js-yaml@4.1.0: dependencies: argparse: 2.0.1 @@ -4337,6 +4679,12 @@ snapshots: dependencies: minimist: 1.2.8 + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + jsonwebtoken@9.0.2: dependencies: jws: 3.2.2 @@ -4408,8 +4756,6 @@ snapshots: lodash.once@4.1.1: {} - lodash.truncate@4.4.2: {} - lodash@4.17.21: {} log-symbols@6.0.0: @@ -4421,6 +4767,8 @@ snapshots: math-intrinsics@1.1.0: {} + mdn-data@2.0.14: {} + memory-fs@0.2.0: {} meow@13.2.0: {} @@ -4454,11 +4802,15 @@ snapshots: minimist@1.2.8: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + moment@2.29.4: {} - ms@2.1.3: {} + monkey-around@2.3.0: {} - natural-compare-lite@1.4.0: {} + ms@2.1.3: {} natural-compare@1.4.0: {} @@ -4477,6 +4829,8 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -4484,6 +4838,8 @@ snapshots: obj-props@1.4.0: {} + object-assign@4.1.1: {} + object-inspect@1.13.3: {} object-keys@1.1.1: {} @@ -4616,6 +4972,14 @@ snapshots: picomatch@2.3.1: {} + pify@2.3.0: {} + + pinkie-promise@2.0.1: + dependencies: + pinkie: 2.0.4 + + pinkie@2.0.4: {} + pkg-dir@5.0.0: dependencies: find-up: 5.0.0 @@ -4646,7 +5010,7 @@ snapshots: dependencies: parse-ms: 4.0.0 - progress@2.0.3: {} + process-nextick-args@2.0.1: {} proto-props@2.0.0: {} @@ -4671,6 +5035,20 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + reflect.getprototypeof@1.0.9: dependencies: call-bind: 1.0.8 @@ -4693,8 +5071,6 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regexpp@3.2.0: {} - regjsparser@0.10.0: dependencies: jsesc: 0.5.0 @@ -4739,6 +5115,8 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: {} safe-push-apply@1.0.0: @@ -4752,6 +5130,12 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + sass@1.47.0: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.7 + source-map-js: 1.2.1 + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -4831,11 +5215,7 @@ snapshots: slash@5.1.0: {} - slice-ansi@4.0.0: - dependencies: - ansi-styles: 4.3.0 - astral-regex: 2.0.0 - is-fullwidth-code-point: 3.0.0 + source-map-js@1.2.1: {} source-map-support@0.5.21: dependencies: @@ -4858,14 +5238,6 @@ snapshots: spdx-license-ids@3.0.20: {} - sprintf-js@1.0.3: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - string-width@7.2.0: dependencies: emoji-regex: 10.4.0 @@ -4895,6 +5267,10 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.0.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 @@ -4915,10 +5291,6 @@ snapshots: style-mod@4.1.2: {} - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -4939,14 +5311,6 @@ snapshots: '@pkgr/core': 0.1.1 tslib: 2.8.1 - table@6.9.0: - dependencies: - ajv: 8.17.1 - lodash.truncate: 4.4.2 - slice-ansi: 4.0.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - tapable@0.1.10: {} tapable@2.2.1: {} @@ -4971,6 +5335,10 @@ snapshots: text-table@0.2.0: {} + tmp@0.2.1: + dependencies: + rimraf: 3.0.2 + to-absolute-glob@3.0.0: dependencies: is-absolute: 1.0.0 @@ -4982,6 +5350,10 @@ snapshots: tr46@0.0.3: {} + ts-api-utils@1.4.3(typescript@4.9.5): + dependencies: + typescript: 4.9.5 + ts-api-utils@1.4.3(typescript@5.7.2): dependencies: typescript: 5.7.2 @@ -4993,15 +5365,8 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - tslib@2.8.1: {} - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5064,6 +5429,8 @@ snapshots: unicorn-magic@0.3.0: {} + universalify@2.0.1: {} + update-browserslist-db@1.1.1(browserslist@4.24.3): dependencies: browserslist: 4.24.3 @@ -5076,9 +5443,9 @@ snapshots: url-or-path@2.3.2: {} - uuid@8.3.2: {} + util-deprecate@1.0.2: {} - v8-compile-cache@2.4.0: {} + uuid@8.3.2: {} validate-npm-package-license@3.0.4: dependencies: @@ -5192,10 +5559,10 @@ snapshots: eslint-config-xo: 0.45.0(eslint@8.57.1) eslint-config-xo-typescript: 5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) eslint-formatter-pretty: 6.0.1 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)) + eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)) eslint-plugin-ava: 14.0.0(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@7.32.0)(typescript@4.9.5))(eslint@7.32.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) eslint-plugin-n: 17.15.1(eslint@8.57.1) eslint-plugin-no-use-extend-native: 0.5.0 eslint-plugin-prettier: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) From 3da8cc4f315017ff6a79b5eabb8ca08c0530eb53 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 3 Jan 2025 09:35:17 -0800 Subject: [PATCH 24/34] chore: remove old build and dev commands --- package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/package.json b/package.json index c38e5fb..f6b550e 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,6 @@ "main": "main.js", "scripts": { "preinstall": "npx only-allow pnpm", - "buildo": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", - "devo": "node esbuild.config.mjs", "version": "node version-bump.mjs && git add manifest.json versions.json", "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix", From e8239da372d67affac3872e44c88d306e69ad77e Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 3 Jan 2025 11:25:10 -0800 Subject: [PATCH 25/34] test: added lang tests and formatting cleanup --- .github/workflows/release-v2.yml | 17 + esbuild.config.mjs | 44 - eslint.config.mjs | 12 + jest-setup.js | 28 + jest.config.js | 11 + package.json | 8 +- pnpm-lock.yaml | 3765 ++++++++++++++-------------- src/api/microsoftClientProvider.ts | 44 +- src/api/todoApi.ts | 34 +- src/command/msTodoCommand.ts | 76 +- src/gui/microsoftAuthModal.ts | 22 +- src/gui/msTodoSyncSettingTab.ts | 50 +- src/lib/lang.test.ts | 46 + src/lib/lang.ts | 38 +- src/lib/logging.ts | 67 +- src/main.ts | 32 +- src/model/obsidianTodoTask.ts | 97 +- src/typings/obsidian-ex.d.ts | 4 - src/utils/formatter.ts | 2 +- src/utils/settingsManager.ts | 14 +- tempCodeRunnerFile.ts | 14 - 21 files changed, 2236 insertions(+), 2189 deletions(-) create mode 100644 .github/workflows/release-v2.yml delete mode 100644 esbuild.config.mjs create mode 100644 eslint.config.mjs create mode 100644 jest-setup.js create mode 100644 jest.config.js create mode 100644 src/lib/lang.test.ts delete mode 100644 tempCodeRunnerFile.ts diff --git a/.github/workflows/release-v2.yml b/.github/workflows/release-v2.yml new file mode 100644 index 0000000..57bca07 --- /dev/null +++ b/.github/workflows/release-v2.yml @@ -0,0 +1,17 @@ +name: Release Obsidian Plugin +on: + push: + # Sequence of patterns matched against refs/tags + tags: + - "*" # Push events to matching any tag format, i.e. 1.0, 20.15.10 +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 # otherwise, you will failed to push refs to dest repo + - uses: ophidian-lib/build@v1 + with: + token: ${{ secrets.GITHUB_TOKEN }} + release-notes: ${{ github.event.commits[0].message }} diff --git a/esbuild.config.mjs b/esbuild.config.mjs deleted file mode 100644 index 8806d54..0000000 --- a/esbuild.config.mjs +++ /dev/null @@ -1,44 +0,0 @@ -import process from 'node:process'; -import esbuild from 'esbuild'; -import builtins from 'builtin-modules'; - -const banner = `/* -THIS IS A GENERATED/BUNDLED FILE BY ESBUILD -if you want to view the source, please visit the github repository of this plugin -*/ -`; - -const production = process.argv[2] === 'production'; - -esbuild - .build({ - banner: { - js: banner, - }, - entryPoints: ['src/main.ts'], - bundle: true, - external: [ - 'obsidian', - 'electron', - '@codemirror/autocomplete', - '@codemirror/collab', - '@codemirror/commands', - '@codemirror/language', - '@codemirror/lint', - '@codemirror/search', - '@codemirror/state', - '@codemirror/view', - '@lezer/common', - '@lezer/highlight', - '@lezer/lr', - ...builtins, - ], - format: 'cjs', - watch: !production, - target: 'es2018', - logLevel: 'info', - sourcemap: production ? false : 'inline', - treeShaking: true, - outfile: 'main.js', - }) - .catch(() => process.exit(1)); diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..e64ccc5 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,12 @@ +import globals from "globals"; +import pluginJs from "@eslint/js"; +import tseslint from "typescript-eslint"; + + +/** @type {import('eslint').Linter.Config[]} */ +export default [ + {files: ["**/*.{js,mjs,cjs,ts}"]}, + {languageOptions: { globals: globals.browser }}, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, +]; \ No newline at end of file diff --git a/jest-setup.js b/jest-setup.js new file mode 100644 index 0000000..591ddcc --- /dev/null +++ b/jest-setup.js @@ -0,0 +1,28 @@ +// require('react-native-reanimated').setUpTests(); + +// FIX: ReferenceError: self is not defined +globalThis.self = globalThis.self || globalThis; + +class LocalStorageMock { + constructor() { + this.store = {}; + } + + clear() { + this.store = {}; + } + + getItem(key) { + return this.store[key] || null; + } + + setItem(key, value) { + this.store[key] = String(value); + } + + removeItem(key) { + delete this.store[key]; + } +} + +globalThis.localStorage = new LocalStorageMock(); diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 0000000..c76e050 --- /dev/null +++ b/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + testEnvironment: 'node', + testMatch: ['**/src/**/*.test.js', '**/src/**/*.test.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + }, + setupFilesAfterEnv: [ + './jest-setup.js', + ], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], +}; diff --git a/package.json b/package.json index f6b550e..2de0db4 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "lint": "eslint ./src --ext .ts", "lint:fix": "eslint ./src --ext .ts --fix", "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", - "test": "xo", "dev": "node ophidian.config.mjs dev", "build": "node ophidian.config.mjs production" }, @@ -17,7 +16,9 @@ "author": "", "license": "MIT", "devDependencies": { + "@eslint/js": "^9.17.0", "@ophidian/build": "^1", + "@types/jest": "^29.5.14", "@types/node": "^16.18.122", "@types/node-fetch": "^2.6.12", "@typescript-eslint/eslint-plugin": "^8.19.0", @@ -29,11 +30,14 @@ "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-loops": "^0.3.0", "eslint-plugin-prettier": "^4.2.1", + "globals": "^15.14.0", + "jest": "^29.7.0", "obsidian": "latest", "prettier": "^2.8.8", + "ts-jest": "^29.2.5", "tslib": "^2.8.1", "typescript": "^4.9.5", - "xo": "^0.60.0" + "typescript-eslint": "^8.19.0" }, "dependencies": { "@azure/msal-common": "^14.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f9d3f74..e59a3ee 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,9 +27,15 @@ importers: specifier: ^2.7.0 version: 2.7.0 devDependencies: + '@eslint/js': + specifier: ^9.17.0 + version: 9.17.0 '@ophidian/build': specifier: ^1 version: 1.2.1 + '@types/jest': + specifier: ^29.5.14 + version: 29.5.14 '@types/node': specifier: ^16.18.122 version: 16.18.122 @@ -63,24 +69,37 @@ importers: eslint-plugin-prettier: specifier: ^4.2.1 version: 4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8) + globals: + specifier: ^15.14.0 + version: 15.14.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@16.18.122) obsidian: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) prettier: specifier: ^2.8.8 version: 2.8.8 + ts-jest: + specifier: ^29.2.5 + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122))(typescript@4.9.5) tslib: specifier: ^2.8.1 version: 2.8.1 typescript: specifier: ^4.9.5 version: 4.9.5 - xo: - specifier: ^0.60.0 - version: 0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.54)) + typescript-eslint: + specifier: ^8.19.0 + version: 8.19.0(eslint@9.17.0)(typescript@4.9.5) packages: + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + '@azure/msal-common@14.16.0': resolution: {integrity: sha512-1KOZj9IpcDSwpNiQNjt0jDYZpQvNZay7QAEi/5DLubay40iGYtLzya/jbjRPLyOTZhEKyL1MzPuw2HqBCjceYA==} engines: {node: '>=0.8.0'} @@ -93,14 +112,167 @@ packages: resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} + '@babel/compat-data@7.26.3': + resolution: {integrity: sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.3': + resolution: {integrity: sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-plugin-utils@7.25.9': + resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.3': + resolution: {integrity: sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-static-block@7.14.5': + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.26.0': + resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.25.9': + resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-private-property-in-object@7.14.5': + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.25.9': + resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime@7.26.0': resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.26.4': + resolution: {integrity: sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.3': + resolution: {integrity: sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + '@codemirror/state@6.1.2': resolution: {integrity: sha512-Mxff85Hp5va+zuj+H748KbubXjrinX/k28lj43H14T2D0+4kuvEFIEIO7hCEcvBT8ubZyIelt9yGOjj2MWOEQA==} @@ -263,18 +435,10 @@ packages: resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/eslintrc@3.2.0': resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - '@eslint/js@9.17.0': resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -295,19 +459,10 @@ packages: resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} engines: {node: '>=18.18.0'} - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - '@humanwhocodes/retry@0.3.1': resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} @@ -316,6 +471,80 @@ packages: resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} engines: {node: '>=18.18'} + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + '@jridgewell/gen-mapping@0.3.8': resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} @@ -328,9 +557,6 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} - '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} @@ -373,39 +599,51 @@ packages: '@ophidian/build@1.2.1': resolution: {integrity: sha512-ulefYLGwlWmsP5WgkOunujhU57dB5slENQ7VvwFh0h0Yk6id4Osg3jN0yONtB9gF6awfjzfK4OxzfOhmuzWx7g==} - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/merge-streams@2.3.0': - resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} - engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@types/codemirror@5.60.8': - resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/eslint@8.56.12': - resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} + '@types/babel__traverse@7.20.6': + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/codemirror@5.60.8': + resolution: {integrity: sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.14': + resolution: {integrity: sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -418,25 +656,17 @@ packages: '@types/node@16.18.122': resolution: {integrity: sha512-rF6rUBS80n4oK16EW8nE75U+9fw0SSUgoPtWSvHhPXdT7itbvmS7UjB/jyM8i3AkvI6yeSM5qCwo+xN0npGDHg==} - '@types/node@16.18.123': - resolution: {integrity: sha512-/n7I6V/4agSpJtFDKKFEa763Hc1z3hmvchobHS1TisCOTKD5nxq8NJ2iK7SRIMYL276Q9mgWOx2AWp5n2XI6eA==} - - '@types/normalize-package-data@2.4.4': - resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/tern@0.23.9': resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==} - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.33': + resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==} '@typescript-eslint/eslint-plugin@8.19.0': resolution: {integrity: sha512-NggSaEZCdSrFddbctrVjkVZvFC6KGfKfNK0CU7mNK/iKHGKbzT4Wmgm08dKpcZECBu9f5FypndoMyRHkdqfT1Q==} @@ -446,16 +676,6 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/parser@8.19.0': resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -463,24 +683,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/scope-manager@8.19.0': resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/type-utils@8.19.0': resolution: {integrity: sha512-TZs0I0OSbd5Aza4qAMpp1cdCYVnER94IziudE3JU328YUHgWu9gwiwhag+fuLeJ2LkWLXI+F/182TbG+JaBdTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -488,35 +694,16 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/types@8.19.0': resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - '@typescript-eslint/typescript-estree@8.19.0': resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - '@typescript-eslint/utils@8.19.0': resolution: {integrity: sha512-PTBG+0oEMPH9jCZlfg07LCB2nYI0I317yyvXGfxnvGvw4SHIOuRnQ3kadyyXY6tGdChusIHIbM5zfIbp4M6tCg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -524,68 +711,10 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} - '@typescript-eslint/visitor-keys@8.19.0': resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@ungap/structured-clone@1.2.1': - resolution: {integrity: sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==} - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -596,50 +725,32 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - - ansi-escapes@6.2.1: - resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} - engines: {node: '>=14.16'} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -683,9 +794,8 @@ packages: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} - arrify@3.0.0: - resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} - engines: {node: '>=12'} + async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -694,6 +804,31 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.1.0: + resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -716,6 +851,13 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -726,10 +868,6 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -746,6 +884,14 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + caniuse-lite@1.0.30001690: resolution: {integrity: sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==} @@ -753,25 +899,31 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chalk@5.4.1: - resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - ci-info@4.1.0: - resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==} + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - clean-regexp@1.0.0: - resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} - engines: {node: '>=4'} + cjs-module-lexer@1.4.1: + resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -784,37 +936,24 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confusing-browser-globals@1.0.11: - resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} copy-newer@2.1.2: resolution: {integrity: sha512-IDhyNGNvbSqwjQXjZ3tAzZNXRw0UmXa+TmTQmMJziikQ+sdsV9EkI6B2WZX1u9m3TKHayBCc2pGqXU/KlBqJdg==} engines: {node: '>=4'} hasBin: true - core-js-compat@3.39.0: - resolution: {integrity: sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==} - core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} @@ -853,25 +992,25 @@ packages: supports-color: optional: true + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - default-browser-id@5.0.0: - resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} - engines: {node: '>=18'} - - default-browser@5.2.1: - resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} - engines: {node: '>=18'} + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -880,6 +1019,14 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -888,10 +1035,6 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -899,31 +1042,20 @@ packages: ecdsa-sig-formatter@1.0.11: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + electron-to-chromium@1.5.76: resolution: {integrity: sha512-CjVQyG7n7Sr+eBXE86HIulnL5N8xZY1sgmOPGuq/F0Rr0FJq63lg0kEtOIDfZBk44FnDLf6FUJ+dsJcuiUDdDQ==} - emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} - - enhance-visitors@1.0.0: - resolution: {integrity: sha512-+29eJLiUixTEDRaZ35Vu8jP3gPLNcQQkQkOQjLp2X+6cZGGPDD/uasbFzvLsJKnGZnvmyZ0srxudwOtskHeIDA==} - engines: {node: '>=4.0.0'} - - enhanced-resolve@0.9.1: - resolution: {integrity: sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==} - engines: {node: '>=0.6'} - - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} - engines: {node: '>=10.13.0'} - - env-editor@1.1.0: - resolution: {integrity: sha512-7AXskzN6T7Q9TFcKAGJprUbpQa4i1VsAetO9rdBqbGMGlragTziBgWt4pVYJMBWHQlLoX0buy6WFikzPH4Qjpw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} @@ -940,9 +1072,6 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-module-lexer@1.6.0: - resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - es-object-atoms@1.0.0: resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} engines: {node: '>= 0.4'} @@ -1102,64 +1231,26 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eslint-compat-utils@0.5.1: - resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} - engines: {node: '>=12'} - peerDependencies: - eslint: '>=6.0.0' - eslint-config-prettier@8.10.0: resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} - hasBin: true - peerDependencies: - eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - eslint-config-xo-typescript@5.0.0: - resolution: {integrity: sha512-ukAYCKf3p039pRai7hb6xaomZzsKlCjV5qx3NbYe27UC7Nz75If1HcpQL5sNW2b5aH8+Axb6dIIv28+bVtwlVQ==} - engines: {node: '>=18'} - peerDependencies: - '@typescript-eslint/eslint-plugin': '>=7.16.0' - '@typescript-eslint/parser': '>=7.16.0' - eslint: '>=8.56.0' - typescript: '>=5.0.0' - - eslint-config-xo@0.45.0: - resolution: {integrity: sha512-T30F2S2HKKmr/RoHopKE7wMUMWrsLMab1qFl2WyFJjETbD+l7p4hSQWpTVGW7TEbSKG1QBekwf6Jn9ZDPA6thA==} - engines: {node: '>=18'} - peerDependencies: - eslint: '>=8.56.0' - - eslint-formatter-pretty@6.0.1: - resolution: {integrity: sha512-znAUcXmBthdIUmlnRkPSxz3zSJHFUhfHF/nJPcCMVKg/mOa4yUie2Olqg1Ghbi5JJRBZVU3rIgzWSObvIspxMA==} - engines: {node: '>=18'} - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-webpack@0.13.10: - resolution: {integrity: sha512-ciVTEg7sA56wRMR772PyjcBRmyBMLS46xgzQZqt6cWBEKc7cK65ZSSLCTLVRu2gGtKyXUb5stwf4xxLBfERLFA==} - engines: {node: '>= 6'} - peerDependencies: - eslint-plugin-import: '>=1.4.0' - webpack: '>=1.11.0' - - eslint-module-utils@2.12.0: - resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} - engines: {node: '>=4'} + eslint-module-utils@2.12.0: + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} peerDependencies: '@typescript-eslint/parser': '*' eslint: '*' @@ -1178,24 +1269,6 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-ava@14.0.0: - resolution: {integrity: sha512-XmKT6hppaipwwnLVwwvQliSU6AF1QMHiNoLD5JQfzhUhf0jY7CO0O624fQrE+Y/fTb9vbW8r77nKf7M/oHulxw==} - engines: {node: '>=14.17 <15 || >=16.4'} - peerDependencies: - eslint: '>=8.26.0' - - eslint-plugin-es-x@7.8.0: - resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '>=8' - - eslint-plugin-eslint-comments@3.2.0: - resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} - engines: {node: '>=6.5.0'} - peerDependencies: - eslint: '>=4.19.1' - eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -1206,21 +1279,11 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-n@17.15.1: - resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: '>=8.23.0' - eslint-plugin-no-loops@0.3.0: resolution: {integrity: sha512-qI0oMgD0mA2Kpad2P/WncEqeVzvJKpHs/6+PA1SW4E6gXSXRmeV2cPv6+fnEgFwC7i+QtFRay2jUQ8DCH02nZg==} peerDependencies: eslint: '>=2.0.0' - eslint-plugin-no-use-extend-native@0.5.0: - resolution: {integrity: sha512-dBNjs8hor8rJgeXLH4HTut5eD3RGWf9JUsadIfuL7UosVQ/dnvOKwxEcRrXrFxrMZ8llUVWT+hOimxJABsAUzQ==} - engines: {node: '>=6.0.0'} - eslint-plugin-prettier@4.2.1: resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} @@ -1232,57 +1295,10 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-prettier@5.2.1: - resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '*' - prettier: '>=3.0.0' - peerDependenciesMeta: - '@types/eslint': - optional: true - eslint-config-prettier: - optional: true - - eslint-plugin-promise@6.6.0: - resolution: {integrity: sha512-57Zzfw8G6+Gq7axm2Pdo3gW/Rx3h9Yywgn61uE/3elTCOePEHVrn2i5CdfBwA1BLK0Q0WqctICIUSqXZW/VprQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-unicorn@56.0.1: - resolution: {integrity: sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==} - engines: {node: '>=18.18'} - peerDependencies: - eslint: '>=8.56.0' - - eslint-rule-docs@1.1.235: - resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==} - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.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} - eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-utils@3.0.0: - resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} - engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} - peerDependencies: - eslint: '>=5' - - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} - 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} @@ -1291,12 +1307,6 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. - hasBin: true - eslint@9.17.0: resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1307,19 +1317,14 @@ packages: jiti: optional: true - esm-utils@4.3.0: - resolution: {integrity: sha512-KupZztbWAnuksy1TYPjTkePxVlMWzmXdmB72z1WvUadtUiFv6x+0PKjYfyy1io9gdvU1A6QIcu055NRrJu1TEA==} - espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - espurify@2.1.1: - resolution: {integrity: sha512-zttWvnkhcDyGOhSH4vO2qCBILpdCMv/MX8lp4cqgRkQoDRGK2oZxi2GfWhlP2dIXmk7BaKeOTuzbHhyC68o8XQ==} + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true esquery@1.6.0: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} @@ -1329,10 +1334,6 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -1344,13 +1345,17 @@ packages: eventemitter2@6.4.9: resolution: {integrity: sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==} - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} - execa@9.5.2: - resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} - engines: {node: ^18.19.0 || >=20.5.0} + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -1368,39 +1373,23 @@ packages: fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.0.3: - resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==} - fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} + filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} - find-cache-dir@5.0.0: - resolution: {integrity: sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig==} - engines: {node: '>=16'} - - find-root@1.1.0: - resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} - - find-up-simple@1.0.0: - resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} - engines: {node: '>=18'} - find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -1409,14 +1398,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -1461,33 +1442,30 @@ packages: functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} get-intrinsic@1.2.6: resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==} engines: {node: '>= 0.4'} - get-set-props@0.1.0: - resolution: {integrity: sha512-7oKuKzAGKj0ag+eWZwcGw2fjiZ78tXnXQoBgY0aU7ZOxTu4bB7hSuQSDgtKy978EDH062P5FmD2EWiDpQS9K9Q==} - engines: {node: '>=0.10.0'} - - get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -1496,9 +1474,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@6.0.4: resolution: {integrity: sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==} deprecated: Glob versions prior to v9 are no longer supported @@ -1507,9 +1482,9 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} @@ -1527,10 +1502,6 @@ packages: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globby@14.0.2: - resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} - engines: {node: '>=18'} - globby@4.1.0: resolution: {integrity: sha512-JPDtMSr0bt25W64q792rvlrSwIaZwqUAhqdYKSr57Wh/xBcQ5JDWLM85ndn+Q1WdBQXLb9YGCl0QN/T0HpqU0A==} engines: {node: '>=0.10.0'} @@ -1572,12 +1543,12 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - human-signals@8.0.0: - resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} - engines: {node: '>=18.18.0'} + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} iferr@0.1.5: resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} @@ -1593,21 +1564,15 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - - import-modules@2.1.0: - resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==} + import-local@3.2.0: + resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} + hasBin: true imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1619,18 +1584,6 @@ packages: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} - interpret@1.4.0: - resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} - engines: {node: '>= 0.10'} - - irregular-plurals@3.5.0: - resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==} - engines: {node: '>=8'} - - is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - is-array-buffer@3.0.5: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} @@ -1654,10 +1607,6 @@ packages: resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==} engines: {node: '>= 0.4'} - is-builtin-module@3.2.1: - resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} - engines: {node: '>=6'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -1674,11 +1623,6 @@ packages: resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} engines: {node: '>= 0.4'} - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1687,33 +1631,26 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + is-generator-function@1.0.10: resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} engines: {node: '>= 0.4'} - is-get-set-prop@1.0.0: - resolution: {integrity: sha512-DvAYZ1ZgGUz4lzxKMPYlt08qAUqyG9ckSg2pIjfvcQ7+pkVNUHk8yVLXOnCLe5WKXhLop8oorWFBJHpwWQpszQ==} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - - is-js-type@2.0.0: - resolution: {integrity: sha512-Aj13l47+uyTjlQNHtXBV8Cji3jb037vxwMWCgopRR8h6xocgBGW3qG8qGlIOEmbXQtkKShKuBM9e8AA1OeQ+xw==} - is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} - is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - is-number-object@1.1.1: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} @@ -1722,28 +1659,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-obj-prop@1.0.0: - resolution: {integrity: sha512-5Idb61slRlJlsAzi0Wsfwbp+zZY+9LXKUAZpvT/1ySw+NxKLRWfa0Bzj+wXI3fX5O9hiddm5c3DAaRSNP/yl2w==} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-proto-prop@2.0.0: - resolution: {integrity: sha512-jl3NbQ/fGLv5Jhan4uX+Ge9ohnemqyblWVVCpAvtTQzNFvV2xhJq+esnkIbYQ9F1nITXoLfDDQLp7LBw/zzncg==} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} - is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -1752,9 +1671,9 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} @@ -1768,18 +1687,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - - is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -1792,14 +1699,6 @@ packages: resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} engines: {node: '>= 0.4'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -1809,25 +1708,175 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.3: + resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-types@1.0.0: - resolution: {integrity: sha512-bfwqBW9cC/Lp7xcRpug7YrXm0IVw+T9e3g4mCYnv0Pjr3zIzU9PCQElYU9oSGAWzXlbdl9X5SAMPejO9sxkeUw==} - engines: {node: '>=0.10.0'} + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -1842,9 +1891,6 @@ packages: json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -1852,6 +1898,11 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -1868,21 +1919,21 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - line-column-path@3.0.0: - resolution: {integrity: sha512-Atocnm7Wr9nuvAn97yEPQa3pcQI5eLQGBz+m6iTb+CVw+IOzYB9MrYK7jI7BfC9ISnT4Fu0eiwhAScV//rp4Hw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -1891,13 +1942,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -1916,22 +1960,27 @@ packages: lodash.isstring@4.0.1: resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} lodash.once@4.1.1: resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} - lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} @@ -1940,13 +1989,6 @@ packages: mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} - memory-fs@0.2.0: - resolution: {integrity: sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==} - - meow@13.2.0: - resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} - engines: {node: '>=18'} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -1954,9 +1996,6 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - micro-spelling-correcter@1.1.1: - resolution: {integrity: sha512-lkJ3Rj/mtjlRcHk6YyCbvZhyWTOzdBvTHsxMmZSk5jxN1YyVSQ+JETAom55mdzfcyDrY/49Z7UCW760BK30crg==} - micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -1969,13 +2008,17 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} - min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -1999,9 +2042,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -2011,23 +2051,19 @@ packages: encoding: optional: true + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@6.0.0: - resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} - engines: {node: '>=18'} - - obj-props@1.4.0: - resolution: {integrity: sha512-p7p/7ltzPDiBs6DqxOrIbtRdwxxVRBj5ROukeNb9RgA+fawhrz5n2hpNz8DDmYR//tviJSj7nUnlppGmONkjiQ==} - engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} @@ -2066,13 +2102,9 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - open-editor@5.1.0: - resolution: {integrity: sha512-KkNqM6FdoegD6WhY2YXmWcovOux45NV+zBped2+G3+V74zkDPkIl4cqh6hte2zNDojtwO2nBOV8U+sgziWfPrg==} - engines: {node: '>=18'} - - open@10.1.0: - resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} - engines: {node: '>=18'} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} @@ -2090,10 +2122,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -2102,10 +2130,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -2118,18 +2142,10 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -2138,10 +2154,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2149,10 +2161,6 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - path-type@5.0.0: - resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} - engines: {node: '>=12'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2172,21 +2180,13 @@ packages: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} - pkg-dir@5.0.0: - resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} - engines: {node: '>=10'} - - pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - - plur@5.1.0: - resolution: {integrity: sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} - pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} possible-typed-array-names@1.0.0: resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} @@ -2205,39 +2205,29 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} - engines: {node: '>=14'} - hasBin: true - - pretty-ms@9.2.0: - resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} - engines: {node: '>=18'} + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - proto-props@2.0.0: - resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} - engines: {node: '>=4'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} - - read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -2253,22 +2243,18 @@ packages: regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - regexp-tree@0.1.27: - resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} - hasBin: true - regexp.prototype.flags@1.5.3: resolution: {integrity: sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==} engines: {node: '>= 0.4'} - regjsparser@0.10.0: - resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} - hasBin: true - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -2277,18 +2263,15 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} + engines: {node: '>=10'} resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} hasBin: true - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -2298,10 +2281,6 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true - run-applescript@7.0.0: - resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} - engines: {node: '>=18'} - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -2328,18 +2307,6 @@ packages: engines: {node: '>=8.9.0'} hasBin: true - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.3.0: - resolution: {integrity: sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==} - engines: {node: '>= 10.13.0'} - - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true @@ -2349,9 +2316,6 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -2384,44 +2348,41 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} - slash@5.1.0: - resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} - engines: {node: '>=14.16'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} @@ -2442,22 +2403,18 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - - strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} engines: {node: '>=8'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -2473,57 +2430,20 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - supports-hyperlinks@3.1.0: - resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} - engines: {node: '>=14.18'} - supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - synckit@0.9.2: - resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} - engines: {node: ^14.18.0 || >=16.0.0} - - tapable@0.1.10: - resolution: {integrity: sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==} - engines: {node: '>=0.6'} - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - terser-webpack-plugin@5.3.11: - resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.37.0: - resolution: {integrity: sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==} - engines: {node: '>=10'} - hasBin: true - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} tmp@0.2.1: resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} engines: {node: '>=8.17.0'} - to-absolute-glob@3.0.0: - resolution: {integrity: sha512-loO/XEWTRqpfcpI7+Jr2RR2Umaaozx1t6OSVWtMi0oy5F/Fxg3IC+D/TToDnxyAGs7uZBGT/6XmyDUxgsObJXA==} - engines: {node: '>=0.10.0'} + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} @@ -2538,6 +2458,30 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-jest@29.2.5: + resolution: {integrity: sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2548,21 +2492,13 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} - - type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} @@ -2580,32 +2516,22 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typescript-eslint@8.19.0: + resolution: {integrity: sha512-Ni8sUkVWYK4KAcTtPjQ/UTiRk6jcsuDhPpxULapUDi8A/l8TSBk+t1GtJA1RsCzIJg0q6+J7bf35AwQigENWRQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.8.0' + typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - typescript@5.7.2: - resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} - engines: {node: '>=14.17'} - hasBin: true - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - - unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} - - unicorn-magic@0.3.0: - resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} - engines: {node: '>=18'} - universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -2619,9 +2545,6 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - url-or-path@2.3.2: - resolution: {integrity: sha512-DOI9KXk0bc/JOmFQHbn25knW2GX/ym7+egKFEFApG3VdDzRlLBMCIrMnruq4AZUGop1W0aiYQ5Vry6clzhxcOQ==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2629,33 +2552,19 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + v8-to-istanbul@9.3.0: + resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} + engines: {node: '>=10.12.0'} w3c-keyname@2.2.8: resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack@5.97.1: - resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -2684,33 +2593,43 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - xo@0.60.0: - resolution: {integrity: sha512-Il6Ap/bkYQm2CvocfiNY8yR52OospMdlxwbT2V/8KBRRCc+JKI1ARyFJpemuze9ZHBy/AAaDurjqWNj0C2DCYQ==} - engines: {node: '>=18.18'} - hasBin: true - peerDependencies: - webpack: '>=1.11.0' - peerDependenciesMeta: - webpack: - optional: true + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yocto-queue@1.1.1: - resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} - engines: {node: '>=12.20'} + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} - engines: {node: '>=18'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} snapshots: + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + '@azure/msal-common@14.16.0': {} '@azure/msal-node@2.16.2': @@ -2725,12 +2644,191 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 + '@babel/compat-data@7.26.3': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + convert-source-map: 2.0.0 + debug: 4.4.0 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.3': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.1.0 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.3 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.3 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.26.4 + '@babel/types': 7.26.3 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.26.4 + transitivePeerDependencies: + - supports-color + + '@babel/helper-plugin-utils@7.25.9': {} + + '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + + '@babel/parser@7.26.3': + dependencies: + '@babel/types': 7.26.3 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.25.9 + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + + '@babel/traverse@7.26.4': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.3 + '@babel/parser': 7.26.3 + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.3': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@bcoe/v8-coverage@0.2.3': {} + '@codemirror/state@6.1.2': {} '@codemirror/view@6.4.1': @@ -2808,11 +2906,6 @@ snapshots: '@esbuild/win32-x64@0.17.6': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.4.1(eslint@9.17.0)': dependencies: eslint: 9.17.0 @@ -2832,20 +2925,6 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.4.0 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 @@ -2860,8 +2939,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} - '@eslint/js@9.17.0': {} '@eslint/object-schema@2.1.5': {} @@ -2877,66 +2954,223 @@ snapshots: '@humanfs/core': 0.19.1 '@humanwhocodes/retry': 0.3.1 - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - '@humanwhocodes/module-importer@1.0.1': {} - '@humanwhocodes/object-schema@2.0.3': {} - '@humanwhocodes/retry@0.3.1': {} '@humanwhocodes/retry@0.4.1': {} - '@jridgewell/gen-mapping@0.3.8': + '@istanbuljs/load-nyc-config@1.1.0': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 - '@jridgewell/set-array@1.2.1': {} + '@istanbuljs/schema@0.1.3': {} - '@jridgewell/source-map@0.3.6': + '@jest/console@29.7.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 - '@jridgewell/trace-mapping@0.3.25': + '@jest/core@29.7.0': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@16.18.122) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node - '@microsoft/microsoft-graph-client@3.0.7': + '@jest/environment@29.7.0': dependencies: - '@babel/runtime': 7.26.0 - tslib: 2.8.1 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + jest-mock: 29.7.0 - '@microsoft/microsoft-graph-types@2.40.0': {} + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 - '@nodelib/fs.scandir@2.1.5': + '@jest/expect@29.7.0': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color - '@nodelib/fs.stat@2.0.5': {} + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 16.18.122 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 - '@nodelib/fs.walk@1.2.8': + '@jest/globals@29.7.0': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.18.0 + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color - '@ophidian/build@1.2.1': + '@jest/reporters@29.7.0': dependencies: - builtin-modules: 3.3.0 + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 16.18.122 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.3.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.26.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.8 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 16.18.122 + '@types/yargs': 17.0.33 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@microsoft/microsoft-graph-client@3.0.7': + dependencies: + '@babel/runtime': 7.26.0 + tslib: 2.8.1 + + '@microsoft/microsoft-graph-types@2.40.0': {} + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.18.0 + + '@ophidian/build@1.2.1': + dependencies: + builtin-modules: 3.3.0 copy-newer: 2.1.2 esbuild: 0.17.6 esbuild-plugin-copy: 2.1.1(esbuild@0.17.6) @@ -2945,36 +3179,63 @@ snapshots: monkey-around: 2.3.0 sass: 1.47.0 - '@pkgr/core@0.1.1': {} - '@rtsao/scc@1.1.0': {} - '@sec-ant/readable-stream@0.4.1': {} + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.26.3 - '@sindresorhus/merge-streams@2.3.0': {} + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.26.3 + '@babel/types': 7.26.3 - '@sindresorhus/merge-streams@4.0.0': {} + '@types/babel__traverse@7.20.6': + dependencies: + '@babel/types': 7.26.3 '@types/codemirror@5.60.8': dependencies: '@types/tern': 0.23.9 - '@types/eslint-scope@3.7.7': + '@types/estree@1.0.6': {} + + '@types/graceful-fs@4.1.9': dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.6 + '@types/node': 16.18.122 + + '@types/istanbul-lib-coverage@2.0.6': {} - '@types/eslint@8.56.12': + '@types/istanbul-lib-report@3.0.3': dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 + '@types/istanbul-lib-coverage': 2.0.6 - '@types/eslint@9.6.1': + '@types/istanbul-reports@3.0.4': dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 + '@types/istanbul-lib-report': 3.0.3 - '@types/estree@1.0.6': {} + '@types/jest@29.5.14': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 '@types/json-schema@7.0.15': {} @@ -2987,31 +3248,17 @@ snapshots: '@types/node@16.18.122': {} - '@types/node@16.18.123': {} - - '@types/normalize-package-data@2.4.4': {} + '@types/stack-utils@2.0.3': {} '@types/tern@0.23.9': dependencies: '@types/estree': 1.0.6 - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2)': + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.33': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color + '@types/yargs-parser': 21.0.3 '@typescript-eslint/eslint-plugin@8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0)(typescript@4.9.5)': dependencies: @@ -3030,19 +3277,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2)': - dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/scope-manager': 8.19.0 @@ -3055,28 +3289,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - '@typescript-eslint/scope-manager@8.19.0': dependencies: '@typescript-eslint/types': 8.19.0 '@typescript-eslint/visitor-keys': 8.19.0 - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': - dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - debug: 4.4.0 - eslint: 8.57.1 - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/type-utils@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: '@typescript-eslint/typescript-estree': 8.19.0(typescript@4.9.5) @@ -3088,25 +3305,8 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@7.18.0': {} - '@typescript-eslint/types@8.19.0': {} - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.2)': - dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.4.0 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.4.3(typescript@5.7.2) - optionalDependencies: - typescript: 5.7.2 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/typescript-estree@8.19.0(typescript@4.9.5)': dependencies: '@typescript-eslint/types': 8.19.0 @@ -3121,17 +3321,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.7.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - '@typescript-eslint/utils@8.19.0(eslint@9.17.0)(typescript@4.9.5)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) @@ -3143,117 +3332,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@7.18.0': - dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@8.19.0': dependencies: '@typescript-eslint/types': 8.19.0 eslint-visitor-keys: 4.2.0 - '@ungap/structured-clone@1.2.1': {} - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 acorn@8.14.0: {} - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -3261,28 +3350,27 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.17.1: + ansi-escapes@4.3.2: dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.0.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - ansi-escapes@6.2.1: {} + type-fest: 0.21.3 ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@5.2.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + argparse@2.0.1: {} array-buffer-byte-length@1.0.2: @@ -3342,7 +3430,7 @@ snapshots: arrify@1.0.1: {} - arrify@3.0.0: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -3350,6 +3438,61 @@ snapshots: dependencies: possible-typed-array-names: 1.0.0 + babel-jest@29.7.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.26.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.25.9 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.3 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + + babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0) + + babel-preset-jest@29.6.3(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + balanced-match@1.0.2: {} binary-extensions@2.3.0: {} @@ -3374,16 +3517,20 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.1(browserslist@4.24.3) + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + buffer-equal-constant-time@1.0.1: {} buffer-from@1.1.2: {} builtin-modules@3.3.0: {} - bundle-name@4.1.0: - dependencies: - run-applescript: 7.0.0 - call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -3403,6 +3550,10 @@ snapshots: callsites@3.1.0: {} + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + caniuse-lite@1.0.30001690: {} chalk@4.1.2: @@ -3410,7 +3561,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chalk@5.4.1: {} + char-regex@1.0.2: {} chokidar@3.6.0: dependencies: @@ -3424,13 +3575,19 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chrome-trace-event@1.0.4: {} + ci-info@3.9.0: {} - ci-info@4.1.0: {} + cjs-module-lexer@1.4.1: {} - clean-regexp@1.0.0: + cliui@8.0.1: dependencies: - escape-string-regexp: 1.0.5 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} color-convert@2.0.1: dependencies: @@ -3442,13 +3599,9 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@2.20.3: {} - - common-path-prefix@3.0.0: {} - concat-map@0.0.1: {} - confusing-browser-globals@1.0.11: {} + convert-source-map@2.0.0: {} copy-newer@2.1.2: dependencies: @@ -3459,20 +3612,22 @@ snapshots: mkdirp: 0.5.6 pify: 2.3.0 - core-js-compat@3.39.0: - dependencies: - browserslist: 4.24.3 - core-util-is@1.0.3: {} - cosmiconfig@9.0.0(typescript@5.7.2): + create-jest@29.7.0(@types/node@16.18.122): dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.7.2 + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@16.18.122) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node cross-spawn@7.0.6: dependencies: @@ -3511,14 +3666,11 @@ snapshots: dependencies: ms: 2.1.3 - deep-is@0.1.4: {} + dedent@1.5.3: {} - default-browser-id@5.0.0: {} + deep-is@0.1.4: {} - default-browser@5.2.1: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.0 + deepmerge@4.3.1: {} define-data-property@1.1.4: dependencies: @@ -3526,8 +3678,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - define-lazy-prop@3.0.0: {} - define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -3536,6 +3686,10 @@ snapshots: delayed-stream@1.0.0: {} + detect-newline@3.1.0: {} + + diff-sequences@29.6.3: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -3544,10 +3698,6 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -3558,28 +3708,15 @@ snapshots: dependencies: safe-buffer: 5.2.1 - electron-to-chromium@1.5.76: {} - - emoji-regex@10.4.0: {} - - enhance-visitors@1.0.0: - dependencies: - lodash: 4.17.21 - - enhanced-resolve@0.9.1: + ejs@3.1.10: dependencies: - graceful-fs: 4.2.11 - memory-fs: 0.2.0 - tapable: 0.1.10 + jake: 10.9.2 - enhanced-resolve@5.18.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 + electron-to-chromium@1.5.76: {} - env-editor@1.1.0: {} + emittery@0.13.1: {} - env-paths@2.2.1: {} + emoji-regex@8.0.0: {} error-ex@1.3.2: dependencies: @@ -3641,8 +3778,6 @@ snapshots: es-errors@1.3.0: {} - es-module-lexer@1.6.0: {} - es-object-atoms@1.0.0: dependencies: es-errors: 1.3.0 @@ -3790,46 +3925,14 @@ snapshots: escalade@3.2.0: {} - escape-string-regexp@1.0.5: {} + escape-string-regexp@2.0.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - semver: 7.6.3 - eslint-config-prettier@8.10.0(eslint@9.17.0): dependencies: eslint: 9.17.0 - eslint-config-prettier@9.1.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-config-xo-typescript@5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2): - dependencies: - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 - typescript: 5.7.2 - - eslint-config-xo@0.45.0(eslint@8.57.1): - dependencies: - confusing-browser-globals: 1.0.11 - eslint: 8.57.1 - - eslint-formatter-pretty@6.0.1: - dependencies: - '@types/eslint': 8.56.12 - ansi-escapes: 6.2.1 - chalk: 5.4.1 - eslint-rule-docs: 1.1.235 - log-symbols: 6.0.0 - plur: 5.1.0 - string-width: 7.2.0 - supports-hyperlinks: 3.1.0 - eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -3838,98 +3941,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): dependencies: debug: 3.2.7 - enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0) - find-root: 1.1.0 - hasown: 2.0.2 - interpret: 1.4.0 - is-core-module: 2.16.1 - is-regex: 1.2.1 - lodash: 4.17.21 - resolve: 2.0.0-next.5 - semver: 5.7.2 - webpack: 5.97.1(esbuild@0.14.54) + optionalDependencies: + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + eslint: 9.17.0 + eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)) - transitivePeerDependencies: - - supports-color - - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint-import-resolver-node@0.3.9)(eslint@9.17.0): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) - eslint: 9.17.0 - eslint-import-resolver-node: 0.3.9 - transitivePeerDependencies: - - supports-color - - eslint-plugin-ava@14.0.0(eslint@8.57.1): - dependencies: - enhance-visitors: 1.0.0 - eslint: 8.57.1 - eslint-utils: 3.0.0(eslint@8.57.1) - espree: 9.6.1 - espurify: 2.1.1 - import-modules: 2.1.0 - micro-spelling-correcter: 1.1.1 - pkg-dir: 5.0.0 - resolve-from: 5.0.0 - - eslint-plugin-es-x@7.8.0(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - eslint: 8.57.1 - eslint-compat-utils: 0.5.1(eslint@8.57.1) - - eslint-plugin-eslint-comments@3.2.0(eslint@8.57.1): - dependencies: - escape-string-regexp: 1.0.5 - eslint: 8.57.1 - ignore: 5.3.2 - - eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0): dependencies: '@rtsao/scc': 1.1.0 @@ -3959,29 +3980,10 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-n@17.15.1(eslint@8.57.1): - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - enhanced-resolve: 5.18.0 - eslint: 8.57.1 - eslint-plugin-es-x: 7.8.0(eslint@8.57.1) - get-tsconfig: 4.8.1 - globals: 15.14.0 - ignore: 5.3.2 - minimatch: 9.0.5 - semver: 7.6.3 - eslint-plugin-no-loops@0.3.0(eslint@9.17.0): dependencies: eslint: 9.17.0 - eslint-plugin-no-use-extend-native@0.5.0: - dependencies: - is-get-set-prop: 1.0.0 - is-js-type: 2.0.0 - is-obj-prop: 1.0.0 - is-proto-prop: 2.0.0 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8): dependencies: eslint: 9.17.0 @@ -3990,111 +3992,15 @@ snapshots: optionalDependencies: eslint-config-prettier: 8.10.0(eslint@9.17.0) - eslint-plugin-prettier@5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2): - dependencies: - eslint: 8.57.1 - prettier: 3.4.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.9.2 - optionalDependencies: - '@types/eslint': 9.6.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - - eslint-plugin-promise@6.6.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-unicorn@56.0.1(eslint@8.57.1): - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - ci-info: 4.1.0 - clean-regexp: 1.0.0 - core-js-compat: 3.39.0 - eslint: 8.57.1 - esquery: 1.6.0 - globals: 15.14.0 - indent-string: 4.0.0 - is-builtin-module: 3.2.1 - jsesc: 3.1.0 - pluralize: 8.0.0 - read-pkg-up: 7.0.1 - regexp-tree: 0.1.27 - regjsparser: 0.10.0 - semver: 7.6.3 - strip-indent: 3.0.0 - - eslint-rule-docs@1.1.235: {} - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-utils@3.0.0(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 2.1.0 - - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} eslint-visitor-keys@4.2.0: {} - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) - '@eslint-community/regexpp': 4.12.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.1 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.0 - 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.6.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.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - 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.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - eslint@9.17.0: dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.17.0) @@ -4134,24 +4040,13 @@ snapshots: transitivePeerDependencies: - supports-color - esm-utils@4.3.0: - dependencies: - import-meta-resolve: 4.1.0 - url-or-path: 2.3.2 - espree@10.3.0: dependencies: acorn: 8.14.0 acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 4.2.0 - espree@9.6.1: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - eslint-visitor-keys: 3.4.3 - - espurify@2.1.1: {} + esprima@4.0.1: {} esquery@1.6.0: dependencies: @@ -4161,30 +4056,33 @@ snapshots: dependencies: estraverse: 5.3.0 - estraverse@4.3.0: {} - estraverse@5.3.0: {} esutils@2.0.3: {} eventemitter2@6.4.9: {} - events@3.3.0: {} - - execa@9.5.2: + execa@5.1.1: dependencies: - '@sindresorhus/merge-streams': 4.0.0 cross-spawn: 7.0.6 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 8.0.0 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 6.0.0 - pretty-ms: 9.2.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + exit@0.1.2: {} + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 fast-deep-equal@3.1.3: {} @@ -4202,36 +4100,25 @@ snapshots: fast-levenshtein@2.0.6: {} - fast-uri@3.0.3: {} - fastq@1.18.0: dependencies: reusify: 1.0.4 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - - file-entry-cache@6.0.1: + fb-watchman@2.0.2: dependencies: - flat-cache: 3.2.0 + bser: 2.1.1 file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 - fill-range@7.1.1: + filelist@1.0.4: dependencies: - to-regex-range: 5.0.1 + minimatch: 5.1.6 - find-cache-dir@5.0.0: + fill-range@7.1.1: dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - - find-root@1.1.0: {} - - find-up-simple@1.0.0: {} + to-regex-range: 5.0.1 find-up@4.1.0: dependencies: @@ -4243,17 +4130,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.2 - keyv: 4.5.4 - rimraf: 3.0.2 - flat-cache@4.0.1: dependencies: flatted: 3.3.2 @@ -4308,7 +4184,9 @@ snapshots: functions-have-names@1.2.3: {} - get-east-asian-width@1.3.0: {} + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} get-intrinsic@1.2.6: dependencies: @@ -4323,14 +4201,9 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 - get-set-props@0.1.0: {} + get-package-type@0.1.0: {} - get-stdin@9.0.0: {} - - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 + get-stream@6.0.1: {} get-symbol-description@1.1.0: dependencies: @@ -4338,10 +4211,6 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.2.6 - get-tsconfig@4.8.1: - dependencies: - resolve-pkg-maps: 1.0.0 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -4350,8 +4219,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-to-regexp@0.4.1: {} - glob@6.0.4: dependencies: inflight: 1.0.6 @@ -4369,9 +4236,7 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - globals@13.24.0: - dependencies: - type-fest: 0.20.2 + globals@11.12.0: {} globals@14.0.0: {} @@ -4391,15 +4256,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globby@14.0.2: - dependencies: - '@sindresorhus/merge-streams': 2.3.0 - fast-glob: 3.3.2 - ignore: 5.3.2 - path-type: 5.0.0 - slash: 5.1.0 - unicorn-magic: 0.1.0 - globby@4.1.0: dependencies: array-union: 1.0.2 @@ -4437,9 +4293,9 @@ snapshots: dependencies: function-bind: 1.1.2 - hosted-git-info@2.8.9: {} + html-escaper@2.0.2: {} - human-signals@8.0.0: {} + human-signals@2.1.0: {} iferr@0.1.5: {} @@ -4452,14 +4308,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - - import-modules@2.1.0: {} + import-local@3.2.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 imurmurhash@0.1.4: {} - indent-string@4.0.0: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -4473,15 +4328,6 @@ snapshots: hasown: 2.0.2 side-channel: 1.1.0 - interpret@1.4.0: {} - - irregular-plurals@3.5.0: {} - - is-absolute@1.0.0: - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - is-array-buffer@3.0.5: dependencies: call-bind: 1.0.8 @@ -4507,10 +4353,6 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-builtin-module@3.2.1: - dependencies: - builtin-modules: 3.3.0 - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -4528,141 +4370,447 @@ snapshots: call-bound: 1.0.3 has-tostringtag: 1.0.2 - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.3 + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + is-generator-function@1.0.10: dependencies: has-tostringtag: 1.0.2 - is-get-set-prop@1.0.0: + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-map@2.0.3: {} + + is-number-object@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-regex@1.2.1: + dependencies: + call-bound: 1.0.3 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.4: + dependencies: + call-bound: 1.0.3 + + is-stream@2.0.1: {} + + is-string@1.1.1: + dependencies: + call-bound: 1.0.3 + has-tostringtag: 1.0.2 + + is-symbol@1.1.1: + dependencies: + call-bound: 1.0.3 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 + + is-typed-array@1.1.15: + dependencies: + which-typed-array: 1.1.18 + + is-weakmap@2.0.2: {} + + is-weakref@1.1.0: + dependencies: + call-bound: 1.0.3 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.3 + get-intrinsic: 1.2.6 + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isexe@2.0.0: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.3: + dependencies: + '@babel/core': 7.26.0 + '@babel/parser': 7.26.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.4.0 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + jake@10.9.2: + dependencies: + async: 3.2.6 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@16.18.122): + dependencies: + '@jest/core': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@16.18.122) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@16.18.122) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@16.18.122): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 16.18.122 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: dependencies: - get-set-props: 0.1.0 - lowercase-keys: 1.0.1 + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - is-glob@4.0.3: + jest-docblock@29.7.0: dependencies: - is-extglob: 2.1.1 + detect-newline: 3.1.0 - is-inside-container@1.0.0: + jest-each@29.7.0: dependencies: - is-docker: 3.0.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 - is-js-type@2.0.0: + jest-environment-node@29.7.0: dependencies: - js-types: 1.0.0 - - is-map@2.0.3: {} + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + jest-mock: 29.7.0 + jest-util: 29.7.0 - is-negated-glob@1.0.0: {} + jest-get-type@29.6.3: {} - is-number-object@1.1.1: + jest-haste-map@29.7.0: dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 16.18.122 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.8 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 - is-obj-prop@1.0.0: + jest-leak-detector@29.7.0: dependencies: - lowercase-keys: 1.0.1 - obj-props: 1.4.0 - - is-path-inside@3.0.3: {} + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - is-plain-obj@4.1.0: {} - - is-proto-prop@2.0.0: + jest-matcher-utils@29.7.0: dependencies: - lowercase-keys: 1.0.1 - proto-props: 2.0.0 + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 - is-regex@1.2.1: + jest-message-util@29.7.0: dependencies: - call-bound: 1.0.3 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 + '@babel/code-frame': 7.26.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 - is-relative@1.0.0: + jest-mock@29.7.0: dependencies: - is-unc-path: 1.0.0 - - is-set@2.0.3: {} + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + jest-util: 29.7.0 - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.3 + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 - is-stream@4.0.1: {} + jest-regex-util@29.6.3: {} - is-string@1.1.1: + jest-resolve-dependencies@29.7.0: dependencies: - call-bound: 1.0.3 - has-tostringtag: 1.0.2 + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color - is-symbol@1.1.1: + jest-resolve@29.7.0: dependencies: - call-bound: 1.0.3 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.10 + resolve.exports: 2.0.3 + slash: 3.0.0 - is-typed-array@1.1.15: + jest-runner@29.7.0: dependencies: - which-typed-array: 1.1.18 + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color - is-unc-path@1.0.0: + jest-runtime@29.7.0: dependencies: - unc-path-regex: 0.1.2 - - is-unicode-supported@1.3.0: {} - - is-unicode-supported@2.1.0: {} + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + chalk: 4.1.2 + cjs-module-lexer: 1.4.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color - is-weakmap@2.0.2: {} + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.3 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.3 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color - is-weakref@1.1.0: + jest-util@29.7.0: dependencies: - call-bound: 1.0.3 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 - is-weakset@2.0.4: + jest-validate@29.7.0: dependencies: - call-bound: 1.0.3 - get-intrinsic: 1.2.6 - - is-windows@1.0.2: {} + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 - is-wsl@3.1.0: + jest-watcher@29.7.0: dependencies: - is-inside-container: 1.0.0 - - isarray@1.0.0: {} - - isarray@2.0.5: {} - - isexe@2.0.0: {} + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 16.18.122 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 - jest-worker@27.5.1: + jest-worker@29.7.0: dependencies: - '@types/node': 16.18.123 + '@types/node': 16.18.122 + jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 + jest@29.7.0(@types/node@16.18.122): + dependencies: + '@jest/core': 29.7.0 + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@16.18.122) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + js-tokens@4.0.0: {} - js-types@1.0.0: {} + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 js-yaml@4.1.0: dependencies: argparse: 2.0.1 - jsesc@0.5.0: {} - jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -4671,14 +4819,14 @@ snapshots: json-schema-traverse@0.4.1: {} - json-schema-traverse@1.0.0: {} - json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: dependencies: minimist: 1.2.8 + json5@2.2.3: {} + jsonfile@6.1.0: dependencies: universalify: 2.0.1 @@ -4713,19 +4861,17 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + + leven@3.1.0: {} + levn@0.4.1: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 - line-column-path@3.0.0: - dependencies: - type-fest: 2.19.0 - lines-and-columns@1.2.4: {} - loader-runner@4.3.0: {} - locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -4734,12 +4880,6 @@ snapshots: dependencies: p-locate: 5.0.0 - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash-es@4.17.21: {} - lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -4752,33 +4892,34 @@ snapshots: lodash.isstring@4.0.1: {} + lodash.memoize@4.1.2: {} + lodash.merge@4.6.2: {} lodash.once@4.1.1: {} - lodash@4.17.21: {} + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 - log-symbols@6.0.0: + make-dir@4.0.0: dependencies: - chalk: 5.4.1 - is-unicode-supported: 1.3.0 + semver: 7.6.3 + + make-error@1.3.6: {} - lowercase-keys@1.0.1: {} + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 math-intrinsics@1.1.0: {} mdn-data@2.0.14: {} - memory-fs@0.2.0: {} - - meow@13.2.0: {} - merge-stream@2.0.0: {} merge2@1.4.1: {} - micro-spelling-correcter@1.1.1: {} - micromatch@4.0.8: dependencies: braces: 3.0.3 @@ -4790,12 +4931,16 @@ snapshots: dependencies: mime-db: 1.52.0 - min-indent@1.0.1: {} + mimic-fn@2.1.0: {} minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 + minimatch@5.1.6: + dependencies: + brace-expansion: 2.0.1 + minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -4814,29 +4959,19 @@ snapshots: natural-compare@1.4.0: {} - neo-async@2.6.2: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-releases@2.0.19: {} + node-int64@0.4.0: {} - normalize-package-data@2.5.0: - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.10 - semver: 5.7.2 - validate-npm-package-license: 3.0.4 + node-releases@2.0.19: {} normalize-path@3.0.0: {} - npm-run-path@6.0.0: + npm-run-path@4.0.1: dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - - obj-props@1.4.0: {} + path-key: 3.1.1 object-assign@4.1.1: {} @@ -4884,19 +5019,9 @@ snapshots: dependencies: wrappy: 1.0.2 - open-editor@5.1.0: - dependencies: - env-editor: 1.1.0 - execa: 9.5.2 - line-column-path: 3.0.0 - open: 10.1.0 - - open@10.1.0: + onetime@5.1.2: dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 + mimic-fn: 2.1.0 optionator@0.9.4: dependencies: @@ -4921,10 +5046,6 @@ snapshots: dependencies: yocto-queue: 0.1.0 - p-limit@4.0.0: - dependencies: - yocto-queue: 1.1.1 - p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -4933,10 +5054,6 @@ snapshots: dependencies: p-limit: 3.1.0 - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - p-try@2.2.0: {} parent-module@1.0.1: @@ -4950,24 +5067,16 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-ms@4.0.0: {} - path-exists@4.0.0: {} - path-exists@5.0.0: {} - path-is-absolute@1.0.1: {} path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-type@4.0.0: {} - path-type@5.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -4980,19 +5089,11 @@ snapshots: pinkie@2.0.4: {} - pkg-dir@5.0.0: - dependencies: - find-up: 5.0.0 - - pkg-dir@7.0.0: - dependencies: - find-up: 6.3.0 + pirates@4.0.6: {} - plur@5.1.0: + pkg-dir@4.2.0: dependencies: - irregular-plurals: 3.5.0 - - pluralize@8.0.0: {} + find-up: 4.1.0 possible-typed-array-names@1.0.0: {} @@ -5004,36 +5105,26 @@ snapshots: prettier@2.8.8: {} - prettier@3.4.2: {} - - pretty-ms@9.2.0: + pretty-format@29.7.0: dependencies: - parse-ms: 4.0.0 + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 process-nextick-args@2.0.1: {} - proto-props@2.0.0: {} + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 punycode@2.3.1: {} - queue-microtask@1.2.3: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 + pure-rand@6.1.0: {} - read-pkg-up@7.0.1: - dependencies: - find-up: 4.1.0 - read-pkg: 5.2.0 - type-fest: 0.8.1 + queue-microtask@1.2.3: {} - read-pkg@5.2.0: - dependencies: - '@types/normalize-package-data': 2.4.4 - normalize-package-data: 2.5.0 - parse-json: 5.2.0 - type-fest: 0.6.0 + react-is@18.3.1: {} readable-stream@2.3.8: dependencies: @@ -5062,8 +5153,6 @@ snapshots: regenerator-runtime@0.14.1: {} - regexp-tree@0.1.27: {} - regexp.prototype.flags@1.5.3: dependencies: call-bind: 1.0.8 @@ -5071,17 +5160,17 @@ snapshots: es-errors: 1.3.0 set-function-name: 2.0.2 - regjsparser@0.10.0: - dependencies: - jsesc: 0.5.0 + require-directory@2.1.1: {} - require-from-string@2.0.2: {} + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-pkg-maps@1.0.0: {} + resolve.exports@2.0.3: {} resolve@1.22.10: dependencies: @@ -5089,20 +5178,12 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - reusify@1.0.4: {} rimraf@3.0.2: dependencies: glob: 7.2.3 - run-applescript@7.0.0: {} - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -5136,29 +5217,10 @@ snapshots: immutable: 4.3.7 source-map-js: 1.2.1 - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) - - semver@5.7.2: {} - semver@6.3.1: {} semver@7.6.3: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -5209,40 +5271,37 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} + signal-exit@3.0.7: {} - slash@3.0.0: {} + sisteransi@1.0.5: {} - slash@5.1.0: {} + slash@3.0.0: {} source-map-js@1.2.1: {} - source-map-support@0.5.21: + source-map-support@0.5.13: dependencies: buffer-from: 1.1.2 source-map: 0.6.1 source-map@0.6.1: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 - - spdx-exceptions@2.5.0: {} + sprintf-js@1.0.3: {} - spdx-expression-parse@3.0.1: + stack-utils@2.0.6: dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + escape-string-regexp: 2.0.0 - spdx-license-ids@3.0.20: {} + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 - string-width@7.2.0: + string-width@4.2.3: dependencies: - emoji-regex: 10.4.0 - get-east-asian-width: 1.3.0 - strip-ansi: 7.1.0 + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 string.prototype.trim@1.2.10: dependencies: @@ -5275,17 +5334,11 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-bom@3.0.0: {} - strip-final-newline@4.0.0: {} + strip-bom@4.0.0: {} - strip-indent@3.0.0: - dependencies: - min-indent: 1.0.1 + strip-final-newline@2.0.0: {} strip-json-comments@3.1.1: {} @@ -5299,50 +5352,19 @@ snapshots: dependencies: has-flag: 4.0.0 - supports-hyperlinks@3.1.0: - dependencies: - has-flag: 4.0.0 - supports-color: 7.2.0 - supports-preserve-symlinks-flag@1.0.0: {} - synckit@0.9.2: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.8.1 - - tapable@0.1.10: {} - - tapable@2.2.1: {} - - terser-webpack-plugin@5.3.11(esbuild@0.14.54)(webpack@5.97.1(esbuild@0.14.54)): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 4.3.0 - serialize-javascript: 6.0.2 - terser: 5.37.0 - webpack: 5.97.1(esbuild@0.14.54) - optionalDependencies: - esbuild: 0.14.54 - - terser@5.37.0: + test-exclude@6.0.0: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - text-table@0.2.0: {} + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 tmp@0.2.1: dependencies: rimraf: 3.0.2 - to-absolute-glob@3.0.0: - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 + tmpl@1.0.5: {} to-regex-range@5.0.1: dependencies: @@ -5354,9 +5376,25 @@ snapshots: dependencies: typescript: 4.9.5 - ts-api-utils@1.4.3(typescript@5.7.2): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122))(typescript@4.9.5): dependencies: - typescript: 5.7.2 + bs-logger: 0.2.6 + ejs: 3.1.10 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@16.18.122) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.3 + typescript: 4.9.5 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.26.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + esbuild: 0.14.54 tsconfig-paths@3.15.0: dependencies: @@ -5371,13 +5409,9 @@ snapshots: dependencies: prelude-ls: 1.2.1 - type-fest@0.20.2: {} - - type-fest@0.6.0: {} + type-detect@4.0.8: {} - type-fest@0.8.1: {} - - type-fest@2.19.0: {} + type-fest@0.21.3: {} typed-array-buffer@1.0.3: dependencies: @@ -5412,9 +5446,17 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.9 - typescript@4.9.5: {} + typescript-eslint@8.19.0(eslint@9.17.0)(typescript@4.9.5): + dependencies: + '@typescript-eslint/eslint-plugin': 8.19.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0)(typescript@4.9.5) + '@typescript-eslint/parser': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + '@typescript-eslint/utils': 8.19.0(eslint@9.17.0)(typescript@4.9.5) + eslint: 9.17.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color - typescript@5.7.2: {} + typescript@4.9.5: {} unbox-primitive@1.1.0: dependencies: @@ -5423,12 +5465,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unc-path-regex@0.1.2: {} - - unicorn-magic@0.1.0: {} - - unicorn-magic@0.3.0: {} - universalify@2.0.1: {} update-browserslist-db@1.1.1(browserslist@4.24.3): @@ -5441,58 +5477,24 @@ snapshots: dependencies: punycode: 2.3.1 - url-or-path@2.3.2: {} - util-deprecate@1.0.2: {} uuid@8.3.2: {} - validate-npm-package-license@3.0.4: + v8-to-istanbul@9.3.0: dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 w3c-keyname@2.2.8: {} - watchpack@2.4.2: + walker@1.0.8: dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + makeerror: 1.0.12 webidl-conversions@3.0.1: {} - webpack-sources@3.2.3: {} - - webpack@5.97.1(esbuild@0.14.54): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.0 - browserslist: 4.24.3 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.6.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.11(esbuild@0.14.54)(webpack@5.97.1(esbuild@0.14.54)) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -5544,56 +5546,33 @@ snapshots: word-wrap@1.2.5: {} + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrappy@1.0.2: {} - xo@0.60.0(@types/eslint@9.6.1)(webpack@5.97.1(esbuild@0.14.54)): + write-file-atomic@4.0.2: dependencies: - '@eslint/eslintrc': 3.2.0 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.7.2) - arrify: 3.0.0 - cosmiconfig: 9.0.0(typescript@5.7.2) - define-lazy-prop: 3.0.0 - eslint: 8.57.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-config-xo: 0.45.0(eslint@8.57.1) - eslint-config-xo-typescript: 5.0.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2))(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint@8.57.1)(typescript@5.7.2) - eslint-formatter-pretty: 6.0.1 - eslint-import-resolver-webpack: 0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)) - eslint-plugin-ava: 14.0.0(eslint@8.57.1) - eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.7.2))(eslint-import-resolver-webpack@0.13.10(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.19.0(eslint@9.17.0)(typescript@4.9.5))(eslint@9.17.0))(webpack@5.97.1(esbuild@0.14.54)))(eslint@8.57.1) - eslint-plugin-n: 17.15.1(eslint@8.57.1) - eslint-plugin-no-use-extend-native: 0.5.0 - eslint-plugin-prettier: 5.2.1(@types/eslint@9.6.1)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.4.2) - eslint-plugin-promise: 6.6.0(eslint@8.57.1) - eslint-plugin-unicorn: 56.0.1(eslint@8.57.1) - esm-utils: 4.3.0 - find-cache-dir: 5.0.0 - find-up-simple: 1.0.0 - get-stdin: 9.0.0 - get-tsconfig: 4.8.1 - globby: 14.0.2 imurmurhash: 0.1.4 - json-stable-stringify-without-jsonify: 1.0.1 - lodash-es: 4.17.21 - meow: 13.2.0 - micromatch: 4.0.8 - open-editor: 5.1.0 - prettier: 3.4.2 - semver: 7.6.3 - slash: 5.1.0 - to-absolute-glob: 3.0.0 - typescript: 5.7.2 - optionalDependencies: - webpack: 5.97.1(esbuild@0.14.54) - transitivePeerDependencies: - - '@types/eslint' - - eslint-import-resolver-typescript - - supports-color + signal-exit: 3.0.7 - yocto-queue@0.1.0: {} + y18n@5.0.8: {} + + yallist@3.1.1: {} - yocto-queue@1.1.1: {} + yargs-parser@21.1.1: {} - yoctocolors@2.1.1: {} + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yocto-queue@0.1.0: {} diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index dcb80f2..666036f 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -1,22 +1,22 @@ import type * as msalCommon from '@azure/msal-common'; import * as msal from '@azure/msal-node'; -import {type AuthenticationProvider, Client, type ClientOptions} from '@microsoft/microsoft-graph-client'; -import {type App, type DataAdapter, Notice} from 'obsidian'; -import {MicrosoftAuthModal} from 'src/gui/microsoftAuthModal'; -import {t} from 'src/lib/lang'; +import { type AuthenticationProvider, Client, type ClientOptions } from '@microsoft/microsoft-graph-client'; +import { type App, type DataAdapter, Notice } from 'obsidian'; +import { MicrosoftAuthModal } from 'src/gui/microsoftAuthModal'; +import { t } from 'src/lib/lang'; class MsalNodeAuthenticationProvider implements AuthenticationProvider { /** * */ - constructor(private readonly clientProvider: MicrosoftClientProvider) {} + constructor (private readonly clientProvider: MicrosoftClientProvider) { } /** - * This method will get called before every request to the msgraph server - * This should return a Promise that resolves to an accessToken (in case of success) or rejects with error (in case of failure) - * Basically this method will contain the implementation for getting and refreshing accessTokens - */ - public async getAccessToken(): Promise { + * This method will get called before every request to the msgraph server + * This should return a Promise that resolves to an accessToken (in case of success) or rejects with error (in case of failure) + * Basically this method will contain the implementation for getting and refreshing accessTokens + */ + public async getAccessToken (): Promise { return this.clientProvider.getAccessToken(); } } @@ -25,19 +25,19 @@ export class MicrosoftClientProvider { private _clientId: string; private _authority: string; - public get clientId() { + public get clientId () { return this._clientId; } - public set clientId(value: string) { + public set clientId (value: string) { this._clientId = value; } - public get authority() { + public get authority () { return this._authority; } - public set authority(value: string) { + public set authority (value: string) { this._authority = value; } @@ -48,7 +48,7 @@ export class MicrosoftClientProvider { private readonly cachePath: string; private accounts: msal.AccountInfo[] = []; - constructor(app: App) { + constructor (app: App) { this.adapter = app.vault.adapter; this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; this.app = app; @@ -57,7 +57,7 @@ export class MicrosoftClientProvider { this._authority = 'https://login.microsoftonline.com/consumers'; } - public async getClient() { + public async getClient () { const authProvider = async (callback: (argument0: string, argument1: string) => void) => { const accessToken = await this.getAccessToken(); const error = ' '; @@ -69,7 +69,7 @@ export class MicrosoftClientProvider { }); } - public async getClientWithMiddleware() { + public async getClientWithMiddleware () { const clientOptions: ClientOptions = { authProvider: new MsalNodeAuthenticationProvider(this), }; @@ -79,7 +79,7 @@ export class MicrosoftClientProvider { return client; } - public createPublicClientApplication() { + public createPublicClientApplication () { const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { if (await this.adapter.exists(this.cachePath)) { cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); @@ -108,7 +108,7 @@ export class MicrosoftClientProvider { this.pca = new msal.PublicClientApplication(config); } - public async getAccessToken() { + public async getAccessToken () { const msalCacheManager = this.pca.getTokenCache(); if (await this.adapter.exists(this.cachePath)) { msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); @@ -122,10 +122,10 @@ export class MicrosoftClientProvider { return this.authByCache(this.accounts[0]); } - private async authByDevice(): Promise { + private async authByDevice (): Promise { const app = this.app; const deviceCodeRequest = { - async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { + async deviceCodeCallback (response: msalCommon.DeviceCodeResponse) { const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); await navigator.clipboard.writeText(response.userCode); new MicrosoftAuthModal(app, response.userCode, response.verificationUri).open(); @@ -136,7 +136,7 @@ export class MicrosoftClientProvider { return this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then(request => request === null ? 'error' : request.accessToken); } - private async authByCache(account: msal.AccountInfo): Promise { + private async authByCache (account: msal.AccountInfo): Promise { const silentRequest = { account, scopes: this.scopes, diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 1465be4..ecce7ea 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,14 +1,14 @@ -import {type PageCollection, RetryHandlerOptions, type Client} from '@microsoft/microsoft-graph-client'; -import {type TodoTask, type TodoTaskList} from '@microsoft/microsoft-graph-types'; -import {t} from '../lib/lang.js'; -import {logging} from '../lib/logging.js'; -import {type MicrosoftClientProvider} from './microsoftClientProvider.js'; +import { type PageCollection, RetryHandlerOptions, type Client } from '@microsoft/microsoft-graph-client'; +import { type TodoTask, type TodoTaskList } from '@microsoft/microsoft-graph-types'; +import { t } from '../lib/lang.js'; +import { logging } from '../lib/logging.js'; +import { type MicrosoftClientProvider } from './microsoftClientProvider.js'; export class TasksDeltaCollection { /** * */ - constructor(public allTasks: TodoTask[], public deltaLink: string) {} + constructor (public allTasks: TodoTask[], public deltaLink: string) { } } export class TodoApi { @@ -17,7 +17,7 @@ export class TodoApi { private client: Client; private readonly enableRetryOptions = false; - constructor(clientProvider: MicrosoftClientProvider) { + constructor (clientProvider: MicrosoftClientProvider) { if (this.enableRetryOptions) { clientProvider.getClientWithMiddleware().then(client => { this.client = client; @@ -39,7 +39,7 @@ export class TodoApi { * @param searchPattern - An optional search pattern to filter tasks within the lists. * @returns A promise that resolves to an array of `TodoTaskList` objects, each containing their respective tasks, or `undefined` if no lists are found. */ - async getLists(searchPattern?: string): Promise { + async getLists (searchPattern?: string): Promise { const endpoint = '/me/todo/lists'; const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; return Promise.all( @@ -72,7 +72,7 @@ export class TodoApi { * * @throws Will throw an error if the API request fails. */ - async getListIdByName(listName: string | undefined): Promise { + async getListIdByName (listName: string | undefined): Promise { if (!listName) { return; } @@ -94,7 +94,7 @@ export class TodoApi { * @param listId - The ID of the TodoTaskList to retrieve. If undefined, the function returns undefined. * @returns A promise that resolves to the TodoTaskList if found, or undefined if the listId is not provided. */ - async getList(listId: string | undefined): Promise { + async getList (listId: string | undefined): Promise { if (!listId) { return; } @@ -109,7 +109,7 @@ export class TodoApi { * @param displayName - The name to be displayed for the new task list. If undefined, the task list will not be created. * @returns A promise that resolves to the created TodoTaskList object, or undefined if the display name is not provided. */ - async createTaskList(displayName: string | undefined): Promise { + async createTaskList (displayName: string | undefined): Promise { if (!displayName) { return; } @@ -126,7 +126,7 @@ export class TodoApi { * @param searchText - Optional search text to filter the tasks. If not provided, the function will return immediately. * @returns A promise that resolves to an array of `TodoTask` objects, or undefined if the listId or searchText is not provided, or if an error occurs. */ - async getListTasks(listId: string | undefined, searchText?: string): Promise { + async getListTasks (listId: string | undefined, searchText?: string): Promise { if (!listId) { return; } @@ -157,7 +157,7 @@ export class TodoApi { * @param taskId - The ID of the task to retrieve. * @returns A promise that resolves to the `TodoTask` object if found, or `undefined` if not found. */ - async getTask(listId: string, taskId: string): Promise { + async getTask (listId: string, taskId: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; return (await this.client .api(endpoint) @@ -165,7 +165,7 @@ export class TodoApi { .get()) as TodoTask; } - async getTasksDelta(listId: string, deltaLink: string): Promise { + async getTasksDelta (listId: string, deltaLink: string): Promise { const endpoint = deltaLink === '' ? `/me/todo/lists/${listId}/tasks/delta` : deltaLink; const allTasks: TodoTask[] = []; @@ -208,7 +208,7 @@ export class TodoApi { * @param toDo - The task details to be created. * @returns A promise that resolves to the created TodoTask. */ - async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { + async createTaskFromToDo (listId: string | undefined, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks`; this.logger.debug('Creating task from endpoint', endpoint); return this.client.api(endpoint).post(toDo); @@ -222,7 +222,7 @@ export class TodoApi { * @param toDo - The updated task details. * @returns A promise that resolves to the updated task. */ - async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask, blockId: string): Promise { + async updateTaskFromToDo (listId: string | undefined, taskId: string, toDo: TodoTask, blockId: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; if (toDo.linkedResources) { @@ -243,7 +243,7 @@ export class TodoApi { return this.client.api(endpoint).patch(toDo); } - async createLinkedResource(listId: string | undefined, taskId: string, blockId: string, fileName: string): Promise { + async createLinkedResource (listId: string | undefined, taskId: string, blockId: string, fileName: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources`; const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(fileName)}&block=${blockId}`; diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 2348751..8c8e0ee 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -3,16 +3,16 @@ import { type BlockCache, type DataAdapter, type Editor, type EditorPosition, MarkdownView, Notice, } from 'obsidian'; -import {ObsidianTodoTask} from 'src/model/obsidianTodoTask.js'; -import {type TodoTask} from '@microsoft/microsoft-graph-types'; -import {type SettingsManager} from 'src/utils/settingsManager.js'; +import { ObsidianTodoTask } from 'src/model/obsidianTodoTask.js'; +import { type TodoTask } from '@microsoft/microsoft-graph-types'; +import { type SettingsManager } from 'src/utils/settingsManager.js'; import type MsTodoSync from '../main.js'; -import {TasksDeltaCollection, type TodoApi} from '../api/todoApi.js'; -import {type IMsTodoSyncSettings} from '../gui/msTodoSyncSettingTab.js'; -import {t} from '../lib/lang.js'; -import {log, logging} from '../lib/logging.js'; +import { TasksDeltaCollection, type TodoApi } from '../api/todoApi.js'; +import { type IMsTodoSyncSettings } from '../gui/msTodoSyncSettingTab.js'; +import { t } from '../lib/lang.js'; +import { log, logging } from '../lib/logging.js'; -export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { +export function getTaskIdFromLine (line: string, plugin: MsTodoSync): string { const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blocklistMatch = regex.exec(line.trim()); if (blocklistMatch) { @@ -40,7 +40,7 @@ interface ISelection { * - `end`: The ending position of the cursor or selection. * - `lines`: An array of line numbers that are currently selected or where the cursor is located. */ -export async function getCurrentLinesFromEditor(editor: Editor): Promise { +export async function getCurrentLinesFromEditor (editor: Editor): Promise { log( 'info', 'Getting current lines from editor', @@ -60,7 +60,7 @@ export async function getCurrentLinesFromEditor(editor: Editor): Promise k + start.line); + lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); } else { start = editor.getCursor(); end = editor.getCursor(); @@ -75,7 +75,7 @@ export async function getCurrentLinesFromEditor(editor: Editor): Promise} */ -function populateBlockCache(plugin: MsTodoSync): Record { +function populateBlockCache (plugin: MsTodoSync): Record { const blockCache: Record = {}; const internalMetadataCache = plugin.app.metadataCache.metadataCache; for (const cacheKey in internalMetadataCache) { @@ -147,7 +147,7 @@ function populateBlockCache(plugin: MsTodoSync): Record { * * @returns A promise that resolves when the tasks have been posted and the file has been modified. */ -export async function postTask( +export async function postTask ( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -170,7 +170,7 @@ export async function postTask( const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); const source = await plugin.app.vault.read(activeFile); - const {lines} = await getCurrentLinesFromEditor(editor); + const { lines } = await getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. await getTaskDelta(todoApi, listId, plugin); @@ -235,7 +235,7 @@ export async function postTask( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } -export async function getTask( +export async function getTask ( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -257,7 +257,7 @@ export async function getTask( const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); const source = await plugin.app.vault.read(activeFile); - const {lines} = await getCurrentLinesFromEditor(editor); + const { lines } = await getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. await getTaskDelta(todoApi, listId, plugin); @@ -300,7 +300,7 @@ export async function getTask( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } -async function getDeltaCache(plugin: MsTodoSync) { +async function getDeltaCache (plugin: MsTodoSync) { const cachePath = `${plugin.app.vault.configDir}/mstd-tasks-delta.json`; const adapter: DataAdapter = plugin.app.vault.adapter; let cachedTasksDelta: TasksDeltaCollection | undefined; @@ -312,7 +312,7 @@ async function getDeltaCache(plugin: MsTodoSync) { return cachedTasksDelta; } -export async function getTaskDelta( +export async function getTaskDelta ( todoApi: TodoApi, listId: string | undefined, plugin: MsTodoSync, @@ -362,11 +362,11 @@ export async function getTaskDelta( } // Function to merge collections -function mergeCollections(col1: TodoTask[], col2: TodoTask[]): TodoTask[] { +function mergeCollections (col1: TodoTask[], col2: TodoTask[]): TodoTask[] { const map = new Map(); // Helper function to add items to the map - function addToMap(item: TodoTask) { + function addToMap (item: TodoTask) { if (item.id && item.lastModifiedDateTime) { const existingItem = map.get(item.id); // If there is no last modified then just use the current item. @@ -404,7 +404,7 @@ function mergeCollections(col1: TodoTask[], col2: TodoTask[]): TodoTask[] { // Lines are processed until the next line is blank or not indented by two spaces. // Also EOF will stop processing. // Allow variable depth or match column of first [ -export async function postTaskAndChildren( +export async function postTaskAndChildren ( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -435,14 +435,14 @@ export async function postTaskAndChildren( // Find the end of section which a blank line or a line that is not indented by two spaces. const endLine = lines.findIndex( - // (line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, + // (line, index) => !/[ ]{2,}- \[(.)\]/.test(line) && !line.startsWith(' ') && index > 0, (line, index) => line.length === 0 && index > 0, ); logger.debug(`endLine: ${endLine}`); // Scan lines below task for sub tasks and body. for (const [index, line] of lines.slice(1, endLine).entries()) { - // Logger.debug(`processing line: ${index} -- ${line}`); + // Logger.debug(`processing line: ${index} -- ${line}`); if (line.startsWith(' - [')) { childTasks.push(line.trim()); @@ -503,21 +503,21 @@ export async function postTaskAndChildren( editor.replaceRange(todo.getMarkdownTask(false), start, end); } -function getLineStartPos(line: number): EditorPosition { +function getLineStartPos (line: number): EditorPosition { return { line, ch: 0, }; } -function getLineEndPos(line: number, editor: Editor): EditorPosition { +function getLineEndPos (line: number, editor: Editor): EditorPosition { return { line, ch: editor.getLine(line).length, }; } -export async function getAllTasksInList( +export async function getAllTasksInList ( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -546,9 +546,9 @@ export async function getAllTasksInList( .format(settings.displayOptions_DateFormat); const done = task.status === 'completed' ? 'x' : ' '; const createDate - = formattedCreateDate === now.format(settings.displayOptions_DateFormat) - ? '' - : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; + = formattedCreateDate === now.format(settings.displayOptions_DateFormat) + ? '' + : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; let blockId = ''; for (const key in settings.taskIdLookup) { @@ -588,13 +588,13 @@ export async function getAllTasksInList( } /** - * Cache the ID internally and generate block link. - * - * @param {string} [id] - * @return {*} {Promise} - * @memberof ObsidianTodoTask - */ -async function cacheTaskId(id: string, settingsManager: SettingsManager): Promise { + * Cache the ID internally and generate block link. + * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask + */ +async function cacheTaskId (id: string, settingsManager: SettingsManager): Promise { settingsManager.settings.taskIdIndex += 1; const index = `MSTD${Math.random().toString(20).slice(2, 6)}${settingsManager.settings.taskIdIndex @@ -610,11 +610,11 @@ async function cacheTaskId(id: string, settingsManager: SettingsManager): Promis return index; } -function stripHtml(html: string): string { +function stripHtml (html: string): string { return html.replaceAll(/<[^>]*>/g, ''); } -export async function createTodayTasks(todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { +export async function createTodayTasks (todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { const notice = new Notice('获取微软待办中', 3000); const now = globalThis.moment(); const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; diff --git a/src/gui/microsoftAuthModal.ts b/src/gui/microsoftAuthModal.ts index 52b3664..a6b9276 100644 --- a/src/gui/microsoftAuthModal.ts +++ b/src/gui/microsoftAuthModal.ts @@ -1,28 +1,28 @@ -import {type App, Modal} from 'obsidian'; -import {t} from '../lib/lang.js'; +import { type App, Modal } from 'obsidian'; +import { t } from '../lib/lang.js'; export class MicrosoftAuthModal extends Modal { - constructor(app: App, private readonly deviceCode: string, private readonly authUrl: string) { + constructor (app: App, private readonly deviceCode: string, private readonly authUrl: string) { super(app); } - onOpen(): void { - const {contentEl} = this; + onOpen (): void { + const { contentEl } = this; contentEl.empty(); contentEl.addClass('auth-modal'); - contentEl.createEl('h2', {text: t('Auth_Heading_VerificationRequiredForFirstUse')}); + contentEl.createEl('h2', { text: t('Auth_Heading_VerificationRequiredForFirstUse') }); // ContentEl.createEl("span",{text:`设备代码 ${this.deviceCode} 已复制到剪贴板`}) - contentEl.createEl('h4', {text: this.deviceCode}); + contentEl.createEl('h4', { text: this.deviceCode }); // ContentEl.createEl("span",{text:`设备代码已复制到剪贴板`}) - contentEl.createEl('div', {text: t('Auth_Text_CodeCopiedClipboard')}); - contentEl.createEl('a', {text: this.authUrl, href: this.authUrl}); + contentEl.createEl('div', { text: t('Auth_Text_CodeCopiedClipboard') }); + contentEl.createEl('a', { text: this.authUrl, href: this.authUrl }); contentEl.createEl('hr'); } - onClose(): void { - const {contentEl} = this; + onClose (): void { + const { contentEl } = this; contentEl.empty(); } } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 8b53499..c447565 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -3,8 +3,8 @@ import { type App, Notice, PluginSettingTab, Setting, } from 'obsidian'; import type MsTodoSync from '../main.js'; -import {t} from '../lib/lang.js'; -import {type ILogOptions} from '../lib/logging.js'; +import { t } from '../lib/lang.js'; +import { type ILogOptions } from '../lib/logging.js'; export interface IMsTodoSyncSettings { todoListSync: { @@ -90,7 +90,7 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { 'mstodo-sync': 'debug', }, }, - taskIdLookup: {'0000ABCD': '0'}, + taskIdLookup: { '0000ABCD': '0' }, taskIdIndex: 0, microsoft_AuthenticationClientId: '', microsoft_AuthenticationAuthority: '', @@ -101,25 +101,25 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { plugin: MsTodoSync; settings: IMsTodoSyncSettings; - constructor(app: App, plugin: MsTodoSync) { + constructor (app: App, plugin: MsTodoSync) { super(app, plugin); this.plugin = plugin; this.settings = plugin.settings; } /** - * Creates a setting entry in the settings form - * for text based properties. If there is a update - * it will save the new value. - * - * @param {HTMLElement} containerEl - * @param {string} title - * @param {string} description - * @param {string} currentValue - * @param {(value: string) => any} changeCallback - * @memberof MsTodoSyncSettingTab - */ - addTextSetting( + * Creates a setting entry in the settings form + * for text based properties. If there is a update + * it will save the new value. + * + * @param {HTMLElement} containerEl + * @param {string} title + * @param {string} description + * @param {string} currentValue + * @param {(value: string) => any} changeCallback + * @memberof MsTodoSyncSettingTab + */ + addTextSetting ( containerElement: HTMLElement, title: string, description: string, @@ -137,8 +137,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { ); } - display(): void { - const {containerEl} = this; + display (): void { + const { containerEl } = this; containerEl.empty(); @@ -154,7 +154,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { .setDesc(t('Settings_Todo_DefaultListNameDescription')) .addText(text => text - // .setPlaceholder('输入Todo列表名称') + // .setPlaceholder('输入Todo列表名称') .setValue(this.settings.todoListSync.listName ?? '') .onChange(async value => { this.settings.todoListSync.listName = value; @@ -279,14 +279,14 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }, ); - containerEl.createEl('h2', {text: t('Settings_JournalFormatting')}); + containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { if (value) { const periodicNotesSettings // eslint-disable-line @typescript-eslint/no-unsafe-assignment = (this.app as any).plugins.plugins['periodic-notes']; if (periodicNotesSettings) { - const {format, folder} = periodicNotesSettings.settings.daily; // eslint-disable-line @typescript-eslint/no-unsafe-assignment + const { format, folder } = periodicNotesSettings.settings.daily; // eslint-disable-line @typescript-eslint/no-unsafe-assignment this.settings.diary = { format, // eslint-disable-line @typescript-eslint/no-unsafe-assignment folder, // eslint-disable-line @typescript-eslint/no-unsafe-assignment @@ -310,16 +310,14 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { const dateFormat = new Setting(containerEl) .setName(t('Settings_JournalFormatting_DateFormat')) .setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' }`, ) .addText(text => text.setValue(this.settings.diary.format).onChange(async value => { this.settings.diary.format = value; dateFormat.setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${ - this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' }`, ); await this.plugin.saveSettings(); @@ -367,7 +365,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { ); } - async hide() { + async hide () { const listName = this.settings.todoListSync.listName; if (this.settings.todoListSync.listId !== undefined || !listName) { diff --git a/src/lib/lang.test.ts b/src/lib/lang.test.ts new file mode 100644 index 0000000..a9b665c --- /dev/null +++ b/src/lib/lang.test.ts @@ -0,0 +1,46 @@ +import { t } from './lang'; + +const mockedLangMap = '{"en": { "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard" }, "zh": { "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板" }}'; + + +describe('t function', () => { + + it('mock should work', () => { + globalThis.localStorage.setItem('language', 'nonexistent_locale'); + const result = globalThis.localStorage.getItem('language'); + expect(result).toBe('nonexistent_locale'); + }); + + it('should return the translated string if it exists in the locale', () => { + globalThis.localStorage.setItem('language', 'en'); + globalThis.localStorage.setItem('mstd_mock_localeMap', mockedLangMap) + const result = t('Notice_DeviceCodeCopiedToClipboard'); + expect(result).toBe('The device code has been copied to the clipboard'); + }); + + it('should return the input string if it does not exist in the locale', () => { + const result = t('nonexistent_key'); + expect(result).toBe('nonexistent_key'); + }); + + it('should log an error if the locale is not found', () => { + globalThis.localStorage.setItem('language', 'nonexistent_locale'); + const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { }); + t('Notice_DeviceCodeCopiedToClipboard'); + expect(consoleErrorSpy).toHaveBeenCalledWith('Error: locale not found', 'nonexistent_locale'); + consoleErrorSpy.mockRestore(); + }); + + it('should default to English if no language is set in localStorage', () => { + globalThis.localStorage.removeItem('language'); + const result = t('Notice_DeviceCodeCopiedToClipboard'); + expect(result).toBe('The device code has been copied to the clipboard'); + }); + + it('should use the correct locale based on the language set in localStorage', () => { + globalThis.localStorage.setItem('language', 'zh'); + const result = t('Notice_DeviceCodeCopiedToClipboard'); + expect(result).toBe('设备代码已复制到剪贴板'); + }); +}); + diff --git a/src/lib/lang.ts b/src/lib/lang.ts index d810481..8f054f5 100644 --- a/src/lib/lang.ts +++ b/src/lib/lang.ts @@ -4,18 +4,36 @@ import zhCN from './locale/zh-cn.json'; export type Translations = Record; const localeMap: Record = { - en, - 'en-GB': en, // Yes I know it's not the same. But it's close enough. - zh: zhCN, + en, + 'en-GB': en, // Yes I know it's not the same. But it's close enough. + zh: zhCN, }; -const lang = globalThis.localStorage.getItem('language'); -const locale = localeMap[lang ?? 'en']; +export function getLocaleMap (): Record { + if (globalThis.localStorage.getItem('mstd_mock_localeMap')) { + const mockLocaleMap = globalThis.localStorage.getItem('mstd_mock_localeMap'); + return mockLocaleMap ? JSON.parse(mockLocaleMap) : localeMap; + } + return localeMap; +} + +function getLanguage (): string | null { + return globalThis.localStorage.getItem('language'); +} + +function getLocale (language: string): Translations { + const localeMap = getLocaleMap(); + return localeMap[language]; +} + +export function t (string_: string): string { + const language = getLanguage(); + const locale = getLocale(language ?? 'en'); + if (!locale) { + console.error('Error: locale not found', language); + } + -export function t(string_: string): string { - if (!locale) { - console.error('Error: locale not found', lang); - } - return locale?.[string_] || string_; + return locale?.[string_] || string_; } diff --git a/src/lib/logging.ts b/src/lib/logging.ts index f3bff20..7d2d891 100644 --- a/src/lib/logging.ts +++ b/src/lib/logging.ts @@ -1,4 +1,4 @@ -import {Platform, type Plugin} from 'obsidian'; +import { Platform, type Plugin } from 'obsidian'; /* * EventEmitter2 is an implementation of the EventEmitter module found in Node.js. * In addition to having a better benchmark performance than EventEmitter and being @@ -8,7 +8,7 @@ import {Platform, type Plugin} from 'obsidian'; * This has been added as EventEmitter in Node.JS is not available in the browser. * https://www.npmjs.com/package/eventemitter2 */ -import {EventEmitter2} from 'eventemitter2'; +import { EventEmitter2 } from 'eventemitter2'; /** * All possible log levels @@ -34,7 +34,7 @@ export interface ILogEntry { module: string; location?: string; message: string; - objects: any; + objects: unknown; } /** @@ -84,7 +84,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public configure(options: ILogOptions): this { + public configure (options: ILogOptions): this { this.options = Object.assign({}, this.options, options); return this; } @@ -96,7 +96,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {Logger} * @memberof LogManager */ - public getLogger(moduleName: string): Logger { + public getLogger (moduleName: string): Logger { let currentMinimumLevel = 'none'; let match = ''; @@ -117,7 +117,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public onLogEntry(listener: (logEntry: ILogEntry) => void): this { + public onLogEntry (listener: (logEntry: ILogEntry) => void): this { this.on('log', listener); return this; } @@ -131,7 +131,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public registerConsoleLogger(): this { + public registerConsoleLogger (): this { if (this.consoleLoggerRegistered) { return this; } @@ -214,7 +214,7 @@ export class Logger { * @param {string} minLevel * @memberof Logger */ - constructor(private readonly logManager: EventEmitter2, private readonly name: string, minLevel: string) { + constructor (private readonly logManager: EventEmitter2, private readonly name: string, minLevel: string) { this.minLevel = this.levelToInt(minLevel); } @@ -223,7 +223,7 @@ export class Logger { * @param logLevel * @param message */ - public log(logLevel: string, message: string, objects?: any): void { + public log (logLevel: string, message: string, objects?: unknown): void { const level = this.levelToInt(logLevel); if (level < this.minLevel) { return; @@ -233,7 +233,7 @@ export class Logger { level: logLevel, module: this.name, message, - objects, // eslint-disable-line @typescript-eslint/no-unsafe-assignment + objects, traceId: undefined, }; @@ -253,23 +253,23 @@ export class Logger { this.logManager.emit('log', logEntry); } - public trace(message: string, objects?: any): void { + public trace (message: string, objects?: unknown): void { this.log('trace', message, objects); } - public debug(message: string, objects?: any): void { + public debug (message: string, objects?: unknown): void { this.log('debug', message, objects); } - public info(message: string, objects?: any): void { + public info (message: string, objects?: unknown): void { this.log('info', message, objects); } - public warn(message: string, objects?: any): void { + public warn (message: string, objects?: unknown): void { this.log('warn', message, objects); } - public error(message: string, objects?: any): void { + public error (message: string, objects?: unknown): void { this.log('error', message, objects); } @@ -278,7 +278,7 @@ export class Logger { * @param logLevel * @param message */ - public logWithId(logLevel: string, traceId: string, message: string, objects?: any): void { + public logWithId (logLevel: string, traceId: string, message: string, objects?: unknown): void { const level = this.levelToInt(logLevel); if (level < this.minLevel) { return; @@ -288,30 +288,30 @@ export class Logger { level: logLevel, module: this.name, message, - objects, // eslint-disable-line @typescript-eslint/no-unsafe-assignment + objects, traceId, }; this.logManager.emit('log', logEntry); } - public traceWithId(traceId: string, message: string, objects?: any): void { + public traceWithId (traceId: string, message: string, objects?: unknown): void { this.logWithId('trace', traceId, message, objects); } - public debugWithId(traceId: string, message: string, objects?: any): void { + public debugWithId (traceId: string, message: string, objects?: unknown): void { this.logWithId('debug', traceId, message, objects); } - public infoWithId(traceId: string, message: string, objects?: any): void { + public infoWithId (traceId: string, message: string, objects?: unknown): void { this.logWithId('info', traceId, message, objects); } - public warnWithId(traceId: string, message: string, objects?: any): void { + public warnWithId (traceId: string, message: string, objects?: unknown): void { this.logWithId('warn', traceId, message, objects); } - public errorWithId(traceId: string, message: string, objects?: any): void { + public errorWithId (traceId: string, message: string, objects?: unknown): void { this.logWithId('error', traceId, message, objects); } @@ -320,7 +320,7 @@ export class Logger { * * @param minLevel */ - private levelToInt(minLevel: string): number { + private levelToInt (minLevel: string): number { if (minLevel.toLowerCase() in this.levels) { return this.levels[minLevel.toLowerCase()]; } @@ -329,23 +329,22 @@ export class Logger { } } -export function logCallDetails() { - return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) { - const originalMethod = descriptor.value; // eslint-disable-line @typescript-eslint/no-unsafe-assignment +export function logCallDetails () { + return function (target: unknown, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; const logger = logging.getLogger('mstodo-sync'); - descriptor.value = async function (...arguments_: any[]) { + descriptor.value = async function (...arguments_: unknown[]) { const startTime = new Date(Date.now()); - const result = await originalMethod.apply(this, arguments_); // eslint-disable-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call + const result = await originalMethod.apply(this, arguments_); const endTime = new Date(Date.now()); const elapsed = endTime.getTime() - startTime.getTime(); logger.debug( - `${typeof target}:${propertyKey} called with ${ - arguments_.length + `${typeof target}:${propertyKey} called with ${arguments_.length } arguments. Took: ${elapsed}ms ${JSON.stringify(arguments_)}`, ); - return result; // eslint-disable-line @typescript-eslint/no-unsafe-return + return result; }; return descriptor; @@ -359,7 +358,7 @@ export function logCallDetails() { * @param {TLogLevelName} logLevel * @param {string} message */ -export function log(logLevel: TLogLevelName, message: string, objects?: any) { +export function log (logLevel: TLogLevelName, message: string, objects?: unknown) { const logger = logging.getLogger('mstodo-sync'); switch (logLevel) { @@ -399,7 +398,7 @@ export function log(logLevel: TLogLevelName, message: string, objects?: any) { * @param {Plugin} plugin * @return {*} */ -export function monkeyPatchConsole(plugin: Plugin) { +export function monkeyPatchConsole (plugin: Plugin) { if (!Platform.isMobile) { return; } @@ -414,7 +413,7 @@ export function monkeyPatchConsole(plugin: Plugin) { logs.push(String(message)); } - plugin.app.vault.adapter.write(logFile, logs.join(' ')); // eslint-disable-line @typescript-eslint/no-floating-promises + plugin.app.vault.adapter.write(logFile, logs.join(' ')); }; console.debug = logMessages('debug'); diff --git a/src/main.ts b/src/main.ts index 338cf6e..b8f98df 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,16 +1,16 @@ import { type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Notice, Platform, Plugin, } from 'obsidian'; -import {TodoApi} from './api/todoApi.js'; -import {DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings} from './gui/msTodoSyncSettingTab.js'; +import { TodoApi } from './api/todoApi.js'; +import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings } from './gui/msTodoSyncSettingTab.js'; import { cleanupCachedTaskIds, createTodayTasks, getAllTasksInList, getTask, getTaskDelta, getTaskIdFromLine, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; -import {t} from './lib/lang.js'; -import {log, logging} from './lib/logging.js'; -import {SettingsManager} from './utils/settingsManager.js'; -import {MicrosoftClientProvider} from './api/microsoftClientProvider.js'; +import { t } from './lib/lang.js'; +import { log, logging } from './lib/logging.js'; +import { SettingsManager } from './utils/settingsManager.js'; +import { MicrosoftClientProvider } from './api/microsoftClientProvider.js'; export default class MsTodoSync extends Plugin { settings: IMsTodoSyncSettings; @@ -19,11 +19,11 @@ export default class MsTodoSync extends Plugin { public microsoftClientProvider: MicrosoftClientProvider; // Pulls the meta data for the a page to help with list processing. - getPageMetadata(path: string): CachedMetadata | undefined { + getPageMetadata (path: string): CachedMetadata | undefined { return this.app.metadataCache.getCache(path) ?? undefined; } - async onload() { + async onload () { logging.registerConsoleLogger(); log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); @@ -60,15 +60,15 @@ export default class MsTodoSync extends Plugin { this.settingsManager = new SettingsManager(this); } - async onunload() { + async onunload () { log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); } - async loadSettings() { + async loadSettings () { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); // eslint-disable-line @typescript-eslint/no-unsafe-assignment } - async saveSettings() { + async saveSettings () { await this.saveData(this.settings); } @@ -86,7 +86,7 @@ export default class MsTodoSync extends Plugin { * * @private */ - private registerCommands() { + private registerCommands () { this.addCommand({ id: 'only-create-task', name: t('CommandName_PushToMsTodo'), @@ -138,7 +138,7 @@ export default class MsTodoSync extends Plugin { * * @private */ - private registerMenuEditorOptions() { + private registerMenuEditorOptions () { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { @@ -323,7 +323,7 @@ export default class MsTodoSync extends Plugin { * * @param editor - The editor instance where the cursor is located. */ - private viewTaskInTodo(editor: Editor) { + private viewTaskInTodo (editor: Editor) { const cursorLocation = editor.getCursor(); const line = editor.getLine(cursorLocation.line); const taskId = getTaskIdFromLine(line, this); @@ -346,7 +346,7 @@ export default class MsTodoSync extends Plugin { * @param editor - The editor instance containing the task to be posted. * @returns A promise that resolves when the task has been posted and the page updated. */ - private async pushTaskToMsTodoAndUpdatePage(editor: Editor) { + private async pushTaskToMsTodoAndUpdatePage (editor: Editor) { await postTask( this.todoApi, this.settings.todoListSync?.listId, @@ -363,7 +363,7 @@ export default class MsTodoSync extends Plugin { * @param editor - The editor instance containing the task to be pushed. * @returns A promise that resolves when the task has been successfully pushed. */ - private async pushTaskToMsTodo(editor: Editor) { + private async pushTaskToMsTodo (editor: Editor) { await postTask( this.todoApi, this.settings.todoListSync?.listId, diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index 73fddb1..e01f338 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -1,4 +1,3 @@ -/* eslint-disable unicorn/filename-case */ import { type AttachmentBase, type AttachmentSession, @@ -13,10 +12,10 @@ import { type TaskStatus, type TodoTask, } from '@microsoft/microsoft-graph-types'; -import {type ISettingsManager} from 'src/utils/settingsManager.js'; -import {t} from '../lib/lang.js'; -import {logging} from '../lib/logging.js'; -import {IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX} from '../constants.js'; +import { type ISettingsManager } from 'src/utils/settingsManager.js'; +import { t } from '../lib/lang.js'; +import { logging } from '../lib/logging.js'; +import { IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; /** * Represents a task in Obsidian that can be synchronized with Microsoft To Do. @@ -28,25 +27,25 @@ export class ObsidianTodoTask implements TodoTask { // The task body that typically contains information about the task. public body?: NullableOption; /** - * The date and time when the task body was last modified. By default, it is in UTC. You can provide a custom time zone in - * the request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan - * 1, 2020 would look like this: '2020-01-01T00:00:00Z'. - */ + * The date and time when the task body was last modified. By default, it is in UTC. You can provide a custom time zone in + * the request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan + * 1, 2020 would look like this: '2020-01-01T00:00:00Z'. + */ public bodyLastModifiedDateTime?: string; /** - * The categories associated with the task. Each category corresponds to the displayName property of an outlookCategory - * that the user has defined. - */ + * The categories associated with the task. Each category corresponds to the displayName property of an outlookCategory + * that the user has defined. + */ public categories?: NullableOption; /** * The date and time in the specified time zone that the task was finished. */ public completedDateTime?: NullableOption; /** - * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the - * request header. The property value uses ISO 8601 format. For example, midnight UTC on Jan 1, 2020 would look like this: - * '2020-01-01T00:00:00Z'. - */ + * The date and time when the task was created. By default, it is in UTC. You can provide a custom time zone in the + * request header. The property value uses ISO 8601 format. For example, midnight UTC on Jan 1, 2020 would look like this: + * '2020-01-01T00:00:00Z'. + */ public createdDateTime?: string; // The date and time in the specified time zone that the task is to be finished. @@ -71,10 +70,10 @@ export class ObsidianTodoTask implements TodoTask { public isReminderOn?: boolean; /** - * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the - * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, - * 2020 would look like this: '2020-01-01T00:00:00Z'. - */ + * The date and time when the task was last modified. By default, it is in UTC. You can provide a custom time zone in the + * request header. The property value uses ISO 8601 format and is always in UTC time. For example, midnight UTC on Jan 1, + * 2020 would look like this: '2020-01-01T00:00:00Z'. + */ public lastModifiedDateTime?: string; /** @@ -93,9 +92,9 @@ export class ObsidianTodoTask implements TodoTask { public startDateTime?: NullableOption; /** - * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, - * deferred. - */ + * Indicates the state or progress of the task. Possible values are: notStarted, inProgress, completed, waitingOnOthers, + * deferred. + */ public status?: TaskStatus; /** * A brief description of the task. @@ -148,7 +147,7 @@ export class ObsidianTodoTask implements TodoTask { * @param line - The line of text representing the task. * @param fileName - The name of the file where the task is located. */ - constructor(private readonly settingsManager: ISettingsManager, line: string, public fileName: string) { + constructor (private readonly settingsManager: ISettingsManager, line: string, public fileName: string) { this.originalTitle = line; this.logger.debug(`Creating: '${this.originalTitle}'`); @@ -193,13 +192,13 @@ export class ObsidianTodoTask implements TodoTask { } /** - * Cache the ID internally and generate block link. - * - * @param {string} [id] - * @return {*} {Promise} - * @memberof ObsidianTodoTask - */ - public async cacheTaskId(id: string): Promise { + * Cache the ID internally and generate block link. + * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask + */ + public async cacheTaskId (id: string): Promise { this.settingsManager.settings.taskIdIndex += 1; const index = `MSTD${Math.random().toString(20).slice(2, 6)}${this.settingsManager.settings.taskIdIndex @@ -219,7 +218,7 @@ export class ObsidianTodoTask implements TodoTask { * @param withChecklist - Whether to include checklist items in the returned task. * @returns The task as a TodoTask object. */ - public getTodoTask(withChecklist = false): TodoTask { + public getTodoTask (withChecklist = false): TodoTask { const toDo: TodoTask = { title: this.title, }; @@ -252,7 +251,7 @@ export class ObsidianTodoTask implements TodoTask { * @param withChecklist - Whether to include checklist items in the returned task. * @returns The task as a TodoTask object. */ - public updateFromTodoTask(remoteTask: TodoTask) { + public updateFromTodoTask (remoteTask: TodoTask) { this.title = remoteTask.title; if (remoteTask.body?.content && remoteTask.body.content.length > 0) { @@ -281,7 +280,7 @@ export class ObsidianTodoTask implements TodoTask { * Set the body content of the task. * @param body - The body content to set. */ - public setBody(body: string) { + public setBody (body: string) { this.body = { content: body, contentType: 'text', @@ -292,7 +291,7 @@ export class ObsidianTodoTask implements TodoTask { * Add a checklist item to the task. * @param item - The checklist item to add. */ - public addChecklistItem(item: string) { + public addChecklistItem (item: string) { this.checklistItems ||= []; this.checklistItems.push({ @@ -304,12 +303,12 @@ export class ObsidianTodoTask implements TodoTask { } /** - * Return the task as a well formed markdown task. - * - * @return {*} {string} - * @memberof ObsidianTodoTask - */ - public getMarkdownTask(singleLine: boolean): string { + * Return the task as a well formed markdown task. + * + * @return {*} {string} + * @memberof ObsidianTodoTask + */ + public getMarkdownTask (singleLine: boolean): string { let output: string; // Format and display the task which is the first line. @@ -359,7 +358,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for a status indicator and update the status accordingly. * @param line - The line of text representing the task. */ - private checkForStatus(line: string) { + private checkForStatus (line: string) { const regex = /\[(.)]/; const m = regex.exec(line); @@ -375,7 +374,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for an importance indicator and update the importance accordingly. * @param line - The line of text representing the task. */ - private checkForImportance(line: string) { + private checkForImportance (line: string) { this.importance = 'normal'; if (line.includes(this.settingsManager.settings.displayOptions_TaskImportance_Low)) { @@ -391,7 +390,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the priority indicator based on the task's importance. * @returns The priority indicator as a string. */ - private getPriorityIndicator(): string { + private getPriorityIndicator (): string { switch (this.importance) { case 'normal': { return this.settingsManager.settings.displayOptions_TaskImportance_Normal; @@ -415,7 +414,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the status indicator based on the task's status. * @returns The status indicator as a string. */ - private getStatusIndicator(): string { + private getStatusIndicator (): string { switch (this.status) { case 'notStarted': { return this.settingsManager.settings.displayOptions_TaskStatus_NotStarted; @@ -439,7 +438,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for a block link and update the block link and ID accordingly. * @param line - The line of text representing the task. */ - private checkForBlockLink(line: string) { + private checkForBlockLink (line: string) { const blockLinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blockLinkMatch = blockLinkRegex.exec(line); if (blockLinkMatch) { @@ -459,7 +458,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the clean title of the task, without any block links or status indicators. * @returns The clean title as a string. */ - public get cleanTitle(): string { + public get cleanTitle (): string { return ''; } @@ -467,7 +466,7 @@ export class ObsidianTodoTask implements TodoTask { * Check if the task has a block link. * @returns True if the task has a block link, false otherwise. */ - public get hasBlockLink(): boolean { + public get hasBlockLink (): boolean { return this.blockLink !== undefined && this.blockLink.length > 0; } @@ -475,7 +474,7 @@ export class ObsidianTodoTask implements TodoTask { * Check if the task has an id for the remote task. * @returns True if the task has a id set, false otherwise. */ - public get hasId(): boolean { + public get hasId (): boolean { return this.id !== undefined && this.id.length > 0; } } diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index 8710b0d..fb25357 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -1,7 +1,3 @@ -/* eslint-disable unicorn/filename-case */ - -/* eslint-disable @typescript-eslint/naming-convention */ - import _ from 'obsidian'; declare module 'obsidian' { diff --git a/src/utils/formatter.ts b/src/utils/formatter.ts index 03042aa..491f515 100644 --- a/src/utils/formatter.ts +++ b/src/utils/formatter.ts @@ -1,4 +1,4 @@ -import {TASK_REGEX} from 'src/constants'; +import { TASK_REGEX } from 'src/constants'; import type MsTodoSync from '../main.js'; export const formatTask = (plugin: MsTodoSync, line: string) => { diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts index 858bfcb..2033bf1 100644 --- a/src/utils/settingsManager.ts +++ b/src/utils/settingsManager.ts @@ -1,24 +1,22 @@ -// Src/utils/settingsManager.ts - -import {type IMsTodoSyncSettings} from 'src/gui/msTodoSyncSettingTab'; +import { type IMsTodoSyncSettings } from 'src/gui/msTodoSyncSettingTab'; import type MsTodoSync from 'src/main'; interface ISettingsManager { settings: IMsTodoSyncSettings; - saveSettings(): void; + saveSettings (): void; } class SettingsManager implements ISettingsManager { - constructor(private readonly plugin: MsTodoSync) {} + constructor (private readonly plugin: MsTodoSync) { } - public get settings() { + public get settings () { return this.plugin.settings; } - async saveSettings(): Promise { + async saveSettings (): Promise { // Implementation to save settings await this.plugin.saveData(this.plugin.settings); } } -export {type ISettingsManager, SettingsManager}; +export { type ISettingsManager, SettingsManager }; diff --git a/tempCodeRunnerFile.ts b/tempCodeRunnerFile.ts deleted file mode 100644 index dc23bfd..0000000 --- a/tempCodeRunnerFile.ts +++ /dev/null @@ -1,14 +0,0 @@ -// This does not exist and breaks the build if left in the repo. COmmenting out and adding a dummy export to keep the build from breaking. -// import { ClientProvider } from './utils/microsoftClientProvider'; - -// const cp = new ClientProvider(); -// cp.getClient().then(async (client) => { -// const user = await client -// .api( -// '/me/todo/lists/AQMkADAwATM3ZmYAZS0wZDFlLWQzYWQtMDACLTAwCgAuAAADNRwkZ96KDUyv_fUjtGWdTQEAxeQdgc-Ink6_okIsSFGrPAABkG-71wAAAA==/tasks', -// ) -// .select('id') -// .get(); -// console.log(user?.value); -// }); -export {}; From 8434b6ceeff1447cec03465582fac2ae292f60b3 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 3 Jan 2025 13:32:51 -0800 Subject: [PATCH 26/34] feat: added support for due date setting and updating --- src/api/todoApi.ts | 55 ++++++------ src/command/msTodoCommand.ts | 41 ++++----- src/constants.ts | 2 + src/gui/msTodoSyncSettingTab.ts | 147 +++++++++++++++++++------------- src/lib/locale/en.json | 12 ++- src/lib/userNotice.ts | 44 ++++++++++ src/main.ts | 127 +++++++++++---------------- src/model/obsidianTodoTask.ts | 59 +++++++++++-- src/typings/obsidian-ex.d.ts | 15 ++++ src/utils/settingsManager.ts | 5 ++ 10 files changed, 313 insertions(+), 194 deletions(-) create mode 100644 src/lib/userNotice.ts diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index ecce7ea..7a60325 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -141,6 +141,7 @@ export class TodoApi { .filter(searchText) .get() .catch(error => { + this.logger.error('Failed to get tasks for list', error); throw new Error(t('Notice_UnableToAcquireTaskFromConfiguredList')); }); if (!res) { @@ -165,6 +166,18 @@ export class TodoApi { .get()) as TodoTask; } + /** + * Retrieves the delta of tasks for a specified list. + * + * @param listId - The ID of the task list. + * @param deltaLink - The delta link to use for fetching changes. If empty, fetches all tasks. + * @returns A promise that resolves to a `TasksDeltaCollection` containing the tasks and the new delta link. + * + * @remarks + * This method uses the Microsoft Graph API to fetch tasks and their changes. It handles pagination and retries. + * + * @throws Will throw an error if the API request fails. + */ async getTasksDelta (listId: string, deltaLink: string): Promise { const endpoint = deltaLink === '' ? `/me/todo/lists/${listId}/tasks/delta` : deltaLink; const allTasks: TodoTask[] = []; @@ -193,12 +206,6 @@ export class TodoApi { const tasksDeltaCollection = new TasksDeltaCollection(allTasks, deltaLink); return tasksDeltaCollection; - - // Old Version - // return (await this.client - // .api(endpoint) - // .middlewareOptions([new RetryHandlerOptions(3, 3)]) - // .get()) as TodoTask; } /** @@ -211,7 +218,8 @@ export class TodoApi { async createTaskFromToDo (listId: string | undefined, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks`; this.logger.debug('Creating task from endpoint', endpoint); - return this.client.api(endpoint).post(toDo); + const createdToDo = await this.client.api(endpoint).post(toDo); + return createdToDo; } /** @@ -222,37 +230,34 @@ export class TodoApi { * @param toDo - The updated task details. * @returns A promise that resolves to the updated task. */ - async updateTaskFromToDo (listId: string | undefined, taskId: string, toDo: TodoTask, blockId: string): Promise { + async updateTaskFromToDo (listId: string | undefined, taskId: string, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - if (toDo.linkedResources) { - const linkedResource = toDo.linkedResources.find(resource => resource.applicationName === 'Obsidian Microsoft To Do Sync'); - if (linkedResource) { - const updatedLinkedResource = { - '@odata.type': '#microsoft.graph.linkedResource', - webUrl: linkedResource.webUrl, - applicationName: 'Obsidian Microsoft To Do Sync', - externalId: blockId, - }; - const linkedResourcesEndpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResource.id}`; - const patchedLinkedResource = this.client.api(linkedResourcesEndpoint).update(updatedLinkedResource); - } - } - toDo.linkedResources = undefined; return this.client.api(endpoint).patch(toDo); } - async createLinkedResource (listId: string | undefined, taskId: string, blockId: string, fileName: string): Promise { + async createLinkedResource (listId: string | undefined, taskId: string, blockId: string, webUrl: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources`; - const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(fileName)}&block=${blockId}`; const updatedLinkedResource = { - webUrl: redirectUrl, + webUrl: webUrl, applicationName: 'Obsidian Microsoft To Do Sync', externalId: blockId, displayName: `Tracking Block Link: ${blockId}`, }; return this.client.api(endpoint).post(updatedLinkedResource); } + + async updateLinkedResource (listId: string | undefined, taskId: string, linkedResourceId: string, blockId: string, webUrl: string): Promise { + const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResourceId}`; + + const updatedLinkedResource = { + webUrl: webUrl, + applicationName: 'Obsidian Microsoft To Do Sync', + externalId: blockId, + displayName: `Tracking Block Link: ${blockId}`, + }; + return this.client.api(endpoint).update(updatedLinkedResource); + } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 8c8e0ee..9bdfdb3 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,7 +1,7 @@ /* eslint-disable max-params */ import { type BlockCache, - type DataAdapter, type Editor, type EditorPosition, MarkdownView, Notice, + type DataAdapter, type Editor, type EditorPosition, MarkdownView, } from 'obsidian'; import { ObsidianTodoTask } from 'src/model/obsidianTodoTask.js'; import { type TodoTask } from '@microsoft/microsoft-graph-types'; @@ -11,6 +11,9 @@ import { TasksDeltaCollection, type TodoApi } from '../api/todoApi.js'; import { type IMsTodoSyncSettings } from '../gui/msTodoSyncSettingTab.js'; import { t } from '../lib/lang.js'; import { log, logging } from '../lib/logging.js'; +import { UserNotice } from 'src/lib/userNotice.js'; + +const userNotice = new UserNotice(); export function getTaskIdFromLine (line: string, plugin: MsTodoSync): string { const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; @@ -158,7 +161,7 @@ export async function postTask ( const logger = logging.getLogger('mstodo-sync.command.post'); if (!listId) { - const notice = new Notice(t('CommandNotice_SetListName')); + userNotice.showMessage(t('CommandNotice_SetListName')); return; } @@ -167,7 +170,7 @@ export async function postTask ( return; } - const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); + userNotice.showMessage(t('CommandNotice_CreatingToDo'), 3000); const source = await plugin.app.vault.read(activeFile); const { lines } = await getCurrentLinesFromEditor(editor); @@ -192,24 +195,22 @@ export async function postTask ( // lookup a id from the internal cache. if (todo.hasBlockLink && todo.hasId) { logger.debug(`Updating Task: ${todo.title}`); + + // Check for linked resource and update if there otherwise create. const cachedTasksDelta = await getDeltaCache(plugin); const cachedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); - if (cachedTask) { - const linkedResource = cachedTask.linkedResources?.find(resource => resource.applicationName === 'Obsidian Microsoft To Do Sync'); - if (linkedResource) { - const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(todo.fileName)}&block=${todo.blockLink ?? ''}`; - linkedResource.webUrl = redirectUrl; - linkedResource.externalId = todo.blockLink; - linkedResource.displayName = `Tracking Block Link: ${todo.blockLink}`; + const linkedResource = cachedTask.linkedResources?.first(); + if (linkedResource && linkedResource.id) { + await todoApi.updateLinkedResource(listId, todo.id, linkedResource.id, todo.blockLink ?? '', todo.getRedirectUrl()); } else { - await todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.fileName); + await todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.getRedirectUrl()); } } todo.linkedResources = cachedTask?.linkedResources; - const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask(), todo.blockLink ?? ''); + const returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); logger.debug(`updated: ${returnedTask.id}`); } else { @@ -245,7 +246,7 @@ export async function getTask ( const logger = logging.getLogger('mstodo-sync.command.get'); if (!listId) { - const notice = new Notice(t('CommandNotice_SetListName')); + userNotice.showMessage(t('CommandNotice_SetListName')); return; } @@ -254,7 +255,7 @@ export async function getTask ( return; } - const notice = new Notice(t('CommandNotice_UpdatingToDo'), 3000); + userNotice.showMessage(t('CommandNotice_GettingToDo'), 3000); const source = await plugin.app.vault.read(activeFile); const { lines } = await getCurrentLinesFromEditor(editor); @@ -321,7 +322,7 @@ export async function getTaskDelta ( const logger = logging.getLogger('mstodo-sync.command.delta'); if (!listId) { - const notice = new Notice(t('CommandNotice_SetListName')); + userNotice.showMessage(t('CommandNotice_SetListName')); return; } @@ -415,11 +416,11 @@ export async function postTaskAndChildren ( const logger = logging.getLogger('mstodo-sync.command.post'); if (!listId) { - const notice = new Notice(t('CommandNotice_SetListName')); + userNotice.showMessage(t('CommandNotice_SetListName')); return; } - const notice = new Notice(t('CommandNotice_CreatingToDo'), 3000); + userNotice.showMessage(t('CommandNotice_CreatingToDo'), 3000); const cursorLocation = editor.getCursor(); const topLevelTask = editor.getLine(cursorLocation.line); @@ -529,7 +530,7 @@ export async function getAllTasksInList ( const settings = plugin.settingsManager.settings; if (!listId) { - const notice = new Notice(t('CommandNotice_SetListName')); + userNotice.showMessage(t('CommandNotice_SetListName')); return; } @@ -615,12 +616,12 @@ function stripHtml (html: string): string { } export async function createTodayTasks (todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { - const notice = new Notice('获取微软待办中', 3000); + userNotice.showMessage('Getting Microsoft To Do tasks for today', 3000); const now = globalThis.moment(); const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; const taskLists = await todoApi.getLists(pattern); if (!taskLists || taskLists.length === 0) { - const notice = new Notice('任务列表为空'); + userNotice.showMessage('Task list is empty'); return; } diff --git a/src/constants.ts b/src/constants.ts index 946967e..3c2407a 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -2,3 +2,5 @@ export const TASK_REGEX = new RegExp(/{{TASK}}/); export const IMPORTANCE_REGEX = new RegExp(/{{IMPORTANCE}}/); export const STATUS_SYMBOL_REGEX = new RegExp(/{{STATUS_SYMBOL}}/); +export const CREATED_REGEX = new RegExp(/{{CREATED_DATE}}/); +export const DUE_REGEX = new RegExp(/{{DUE_DATE}}/); diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index c447565..6841c6f 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,10 +1,10 @@ -/* eslint-disable max-params */ import { - type App, Notice, PluginSettingTab, Setting, + type App, PeriodicNotes, PluginSettingTab, Setting, } from 'obsidian'; import type MsTodoSync from '../main.js'; import { t } from '../lib/lang.js'; import { type ILogOptions } from '../lib/logging.js'; +import { IUserNotice } from 'src/lib/userNotice.js'; export interface IMsTodoSyncSettings { todoListSync: { @@ -53,6 +53,7 @@ export interface IMsTodoSyncSettings { taskIdLookup: Record; taskIdIndex: number; hackingEnabled: boolean; + microsoftToDoApplication_RedirectUriBase: string; } export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { @@ -66,6 +67,7 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { stayWithPN: false, }, displayOptions_DateFormat: 'YYYY-MM-DD', + displayOptions_TimeFormat: 'HH:mm', displayOptions_TaskCreatedPrefix: '🔎', displayOptions_TaskDuePrefix: '📅', @@ -95,16 +97,20 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { microsoft_AuthenticationClientId: '', microsoft_AuthenticationAuthority: '', hackingEnabled: false, + microsoftToDoApplication_RedirectUriBase: 'http://192.168.0.137:8901/redirectpage.html', + }; export class MsTodoSyncSettingTab extends PluginSettingTab { plugin: MsTodoSync; settings: IMsTodoSyncSettings; + userNotice: IUserNotice; - constructor (app: App, plugin: MsTodoSync) { + constructor (app: App, plugin: MsTodoSync, userNotice: IUserNotice) { super(app, plugin); this.plugin = plugin; this.settings = plugin.settings; + this.userNotice = userNotice; } /** @@ -112,11 +118,11 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { * for text based properties. If there is a update * it will save the new value. * - * @param {HTMLElement} containerEl + * @param {HTMLElement} containerElement * @param {string} title * @param {string} description * @param {string} currentValue - * @param {(value: string) => any} changeCallback + * @param {(value: string) => unknown} changeCallback * @memberof MsTodoSyncSettingTab */ addTextSetting ( @@ -124,7 +130,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { title: string, description: string, currentValue: string, - changeCallback: (value: string) => any, + changeCallback: (value: string) => unknown, ): void { new Setting(containerElement) .setName(t(title)) @@ -279,63 +285,63 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }, ); - containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); - new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => - toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { - if (value) { - const periodicNotesSettings // eslint-disable-line @typescript-eslint/no-unsafe-assignment - = (this.app as any).plugins.plugins['periodic-notes']; - if (periodicNotesSettings) { - const { format, folder } = periodicNotesSettings.settings.daily; // eslint-disable-line @typescript-eslint/no-unsafe-assignment - this.settings.diary = { - format, // eslint-disable-line @typescript-eslint/no-unsafe-assignment - folder, // eslint-disable-line @typescript-eslint/no-unsafe-assignment - stayWithPN: true, - }; - console.log('🚀 ~ this.settings.diary', this.settings.diary); - await this.plugin.saveSettings(); - this.display(); + if (this.app.plugins.enabledPlugins.has('periodic-notes')) { + + containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); + new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => + toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { + if (value) { + const periodicNotesSettings = this.app.plugins.plugins['periodic-notes'] as PeriodicNotes; + if (periodicNotesSettings) { + const { format, folder } = periodicNotesSettings.settings.daily; + this.settings.diary = { + format, + folder, + stayWithPN: true, + }; + await this.plugin.saveSettings(); + this.display(); + } else { + this.userNotice.showMessage('Periodic Notes 中未设置'); + this.display(); + } } else { - const periodicNotesNotice = new Notice('Periodic Notes 中未设置'); + this.settings.diary.stayWithPN = false; + await this.plugin.saveSettings(); this.display(); } - } else { - this.settings.diary.stayWithPN = false; - await this.plugin.saveSettings(); - this.display(); - } - }), - ); - - const dateFormat = new Setting(containerEl) - .setName(t('Settings_JournalFormatting_DateFormat')) - .setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' - }`, - ) - .addText(text => - text.setValue(this.settings.diary.format).onChange(async value => { - this.settings.diary.format = value; - dateFormat.setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' - }`, - ); - await this.plugin.saveSettings(); - }), - ) - .setDisabled(this.settings.diary.stayWithPN); - - new Setting(containerEl) - .setName(t('Settings_JournalFormatting_Folder')) - .setDesc(t('Settings_JournalFormatting_FolderDescription')) - .addText(text => - text.setValue(this.settings.diary.folder).onChange(async value => { - this.settings.diary.format = value; - await this.plugin.saveSettings(); }), - ) - .setDisabled(this.settings.diary.stayWithPN); + ); + const dateFormat = new Setting(containerEl) + .setName(t('Settings_JournalFormatting_DateFormat')) + .setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ) + .addText(text => + text.setValue(this.settings.diary.format).onChange(async value => { + this.settings.diary.format = value; + dateFormat.setDesc( + `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + }`, + ); + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + + new Setting(containerEl) + .setName(t('Settings_JournalFormatting_Folder')) + .setDesc(t('Settings_JournalFormatting_FolderDescription')) + .addText(text => + text.setValue(this.settings.diary.folder).onChange(async value => { + this.settings.diary.format = value; + await this.plugin.saveSettings(); + }), + ) + .setDisabled(this.settings.diary.stayWithPN); + } // Authentication Overrides containerEl.createEl('h2', { text: t('Settings_Authentication_Heading'), @@ -363,6 +369,25 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { this.settings.microsoft_AuthenticationClientId = value; }, ); + + // Application Redirect Settings + containerEl.createEl('h2', { + text: t('Settings_NativeApp_Heading'), + }); + containerEl.createEl('p', { + text: t('Settings_NativeApp_Heading_Description'), + }); + + this.addTextSetting( + containerEl, + 'Settings_NativeApp_RedirectUriBase', + 'Settings_NativeApp_RedirectUriBase_Description', + this.settings.microsoftToDoApplication_RedirectUriBase, + async value => { + this.settings.microsoftToDoApplication_RedirectUriBase = value; + }, + ); + } async hide () { @@ -370,7 +395,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { if (this.settings.todoListSync.listId !== undefined || !listName) { if (!listName) { - const noListNotice = new Notice(t('General_NoListNameSet')); + this.userNotice.showMessage('General_NoListNameSet'); } } else { let listId = await this.plugin.todoApi.getListIdByName(listName); @@ -382,10 +407,10 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { listName, listId, }; - const listSetNotice = new Notice(t('General_ListNameSet')); + this.userNotice.showMessage('General_ListNameSet'); await this.plugin.saveSettings(); } else { - const listFiledNotice = new Notice(t('General_FailedToCreateList')); + this.userNotice.showMessage('General_FailedToCreateList'); } } } diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index bc3b3f8..7db8200 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -20,8 +20,8 @@ "Delete": "Delete", "EditorMenu_OpenToDo": "Open To Do", "EditorMenu_SyncToTodo": "-> Push to Microsoft To Do", - "EditorMenu_SyncToTodoAndReplace": "-> Push to Microsoft To Do and update", - "EditorMenu_FetchFromRemote": "<- Fetch updates from Microsoft To Do", + "EditorMenu_SyncToTodoAndReplace": "Sync Task (Push)", + "EditorMenu_FetchFromRemote": "Sync Task (Pull)", "Enter": "Enter", "Friday": "Friday", "Language": "English", @@ -85,5 +85,9 @@ "displayOptions_CreatedInFile": "Created in", "today": "today", "tomorrow": "tomorrow", - "yesterday": "yesterday" -} + "yesterday": "yesterday", + "Settings_NativeApp_Heading": "📱 Native App Settings", + "Settings_NativeApp_Heading_Description": "If you have the Microsoft To Do app installed on your computer, you can open the app directly from Obsidian.", + "Settings_NativeApp_RedirectUriBase": "Redirect URI Base", + "Settings_NativeApp_RedirectUriBase_Description": "The base URI used to generate the advanced URI to open locally. " +} \ No newline at end of file diff --git a/src/lib/userNotice.ts b/src/lib/userNotice.ts new file mode 100644 index 0000000..90ce309 --- /dev/null +++ b/src/lib/userNotice.ts @@ -0,0 +1,44 @@ +import { Notice } from "obsidian"; +import { t } from './lang.js'; +import { logging } from "./logging.js"; + +/** + * Represents an interface for displaying user-facing messages. + * + * @public + */ +export interface IUserNotice { + showMessage (message: string, timeout?: number): void; +} + +/** + * A class providing functionality to show messages to the user. + * + * @public + * + * @remarks + * This class uses Obsidian's Notice component to display a message with a default or user-defined timeout. + */ +export class UserNotice implements IUserNotice { + /** + * Internal default duration (in milliseconds) after which the message disappears if no timeout is specified. + * + * @private + */ + private defaultTimeout: number = 5000; + + private readonly logger = logging.getLogger('mstodo-sync.UserNotice'); + + + /** + * Displays a message to the user in the Obsidian interface for a specified duration. + * + * @param message - The message to be displayed. + * @param timeout - An optional timeout (in milliseconds) for how long the message will be visible. + */ + showMessage (message: string, timeout: number = this.defaultTimeout): void { + const userMessage = new Notice(t(message), timeout); + userMessage.setMessage(message); + this.logger.info(message); + } +} diff --git a/src/main.ts b/src/main.ts index b8f98df..3fd81b1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -11,9 +11,11 @@ import { t } from './lib/lang.js'; import { log, logging } from './lib/logging.js'; import { SettingsManager } from './utils/settingsManager.js'; import { MicrosoftClientProvider } from './api/microsoftClientProvider.js'; +import { IUserNotice, UserNotice } from './lib/userNotice.js'; export default class MsTodoSync extends Plugin { settings: IMsTodoSyncSettings; + userNotice: IUserNotice; public todoApi: TodoApi; public settingsManager: SettingsManager; public microsoftClientProvider: MicrosoftClientProvider; @@ -27,6 +29,7 @@ export default class MsTodoSync extends Plugin { logging.registerConsoleLogger(); log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); + this.userNotice = new UserNotice(); await this.loadSettings(); @@ -34,7 +37,7 @@ export default class MsTodoSync extends Plugin { this.registerCommands(); - this.addSettingTab(new MsTodoSyncSettingTab(this.app, this)); + this.addSettingTab(new MsTodoSyncSettingTab(this.app, this, this.userNotice)); try { this.microsoftClientProvider = new MicrosoftClientProvider(this.app); @@ -141,53 +144,81 @@ export default class MsTodoSync extends Plugin { private registerMenuEditorOptions () { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addSeparator(); + // menu.addItem(item => { + // item.setTitle(t('EditorMenu_SyncToTodo')).onClick( + // async () => { + // await this.pushTaskToMsTodo(editor); + // }, + // ); + // }); + menu.addItem(item => { - item.setTitle(t('EditorMenu_SyncToTodo')).onClick( + item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( async () => { - await this.pushTaskToMsTodo(editor); + await this.pushTaskToMsTodoAndUpdatePage(editor); }, ); }); - }), - ); - // 在右键菜单中注册命令:将选中的文字创建微软待办并替换 - // Register command in the context menu: Create and replace the selected text to Microsoft To-Do - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { - item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( + item.setTitle(t('EditorMenu_FetchFromRemote')).onClick( async () => { - await this.pushTaskToMsTodoAndUpdatePage(editor); + await getTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); }, ); }); - }), - ); + menu.addItem(item => { + item.setTitle('Sync Task with details (Push)').onClick(async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + true, + ); + }); + }); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { - item.setTitle(t('EditorMenu_FetchFromRemote')).onClick( + item.setTitle('Sync Task with details (Pull)').onClick( async () => { - await getTask( + await postTaskAndChildren( this.todoApi, this.settings.todoListSync?.listId, editor, this.app.workspace.getActiveFile()?.path, this, + false, ); }, ); }); + + menu.addItem(item => { + item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { + this.viewTaskInTodo(editor); + }); + }); }), ); if (this.settings.hackingEnabled) { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, view) => { + menu.addSeparator(); menu.addItem(item => { - item.setTitle('hacking').onClick( + item.setTitle('Testing Commands Enabled'); + }); + menu.addItem(item => { + item.setTitle('Update Task Cache').onClick( async () => { await getTaskDelta( this.todoApi, @@ -197,11 +228,7 @@ export default class MsTodoSync extends Plugin { }, ); }); - }), - ); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle('Reset Task Cache').onClick( async () => { @@ -214,11 +241,7 @@ export default class MsTodoSync extends Plugin { }, ); }); - }), - ); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle('Cleanup Local Task Lookup Table').onClick( async () => { @@ -228,11 +251,7 @@ export default class MsTodoSync extends Plugin { }, ); }); - }), - ); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle('Insert all tasks with body').onClick( async () => { @@ -246,11 +265,7 @@ export default class MsTodoSync extends Plugin { }, ); }); - }), - ); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { menu.addItem(item => { item.setTitle('Insert all tasks').onClick( async () => { @@ -268,51 +283,7 @@ export default class MsTodoSync extends Plugin { ); } - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle('Sync Task with details (Push)').onClick(async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); - }); - }); - }), - ); - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle('Sync Task with details (Pull)').onClick( - async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - false, - ); - }, - ); - }); - }), - ); - - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { - menu.addItem(item => { - item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - this.viewTaskInTodo(editor); - }); - }); - }), - ); } /** diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index e01f338..57ed520 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -15,7 +15,7 @@ import { import { type ISettingsManager } from 'src/utils/settingsManager.js'; import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; -import { IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; +import { CREATED_REGEX, DUE_REGEX, IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; /** * Represents a task in Obsidian that can be synchronized with Microsoft To Do. @@ -163,7 +163,24 @@ export class ObsidianTodoTask implements TodoTask { // - [ ] Adding in updated linked resources updated from list dump 🔎[[2024-12-30]] 🔎[[2024-12-30]] ^MSTDa8de00053 // This will strip out the created date if in title. if (this.title.includes(settingsManager.settings.displayOptions_TaskCreatedPrefix)) { - this.title = this.title.replaceAll(/🔎\[\[.*]]/g, '').replaceAll(/🔎\d{4}-\d{2}-\d{2}/g, ''); + this.title = this.title + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix}\\[\\[.*]]`, 'g'), '') + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix}\\d{4}-\\d{2}-\\d{2}`, 'g'), ''); + } + + if (this.title.includes(settingsManager.settings.displayOptions_TaskDuePrefix)) { + const specifiedDueDate = this.title.match(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}(\\d{4}-\\d{2}-\\d{2})`, 'g')); + + if (specifiedDueDate) { + this.dueDateTime = { + dateTime: specifiedDueDate[0].replace(settingsManager.settings.displayOptions_TaskDuePrefix, ''), + timeZone: Intl.DateTimeFormat().resolvedOptions().timeZone, + }; + } + + this.title = this.title + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}\\[\\[.*]]`, 'g'), '') + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}\\d{4}-\\d{2}-\\d{2}`, 'g'), ''); } this.checkForImportance(line); @@ -174,23 +191,27 @@ export class ObsidianTodoTask implements TodoTask { .trim(); this.body = { - content: `${t('displayOptions_CreatedInFile')} [[${this.fileName}]]`, + content: '', contentType: 'text', }; this.linkedResources ||= []; - const redirectUrl = `http://192.168.0.137:8901/redirectpage.html?vault=brainstore&filepath=${encodeURIComponent(fileName)}&block=${this.blockLink}`; this.linkedResources.push({ - webUrl: redirectUrl, + webUrl: this.getRedirectUrl(), applicationName: 'Obsidian Microsoft To Do Sync', externalId: this.blockLink, displayName: `Tracking Block Link: ${this.blockLink}`, }); - this.logger.debug(`Created: '${this.title}'`); + this.logger.info(`Created: '${this.title}'`); } + public getRedirectUrl (): string { + return `${this.settingsManager.settings.microsoftToDoApplication_RedirectUriBase}?vault=${this.settingsManager.vaultName}&block=${this.blockLink}`; + } + + /** * Cache the ID internally and generate block link. * @@ -243,6 +264,10 @@ export class ObsidianTodoTask implements TodoTask { toDo.linkedResources = this.linkedResources; } + if (this.dueDateTime) { + toDo.dueDateTime = this.dueDateTime; + } + return toDo; } @@ -270,6 +295,10 @@ export class ObsidianTodoTask implements TodoTask { this.linkedResources = remoteTask.linkedResources; } + if (this.dueDateTime) { + this.dueDateTime = remoteTask.dueDateTime; + } + // Need to determine if we want to update the checklist items // if (withChecklist && remoteTask.checklistItems && remoteTask.checklistItems.length > 0) { // this.checklistItems = remoteTask.checklistItems; @@ -321,6 +350,24 @@ export class ObsidianTodoTask implements TodoTask { output = output.includes(priorityIndicator) ? output.replace(IMPORTANCE_REGEX, '') : output.replace(IMPORTANCE_REGEX, priorityIndicator); + if (this.dueDateTime?.dateTime) { + const formattedDueDate = globalThis + .moment(this.dueDateTime?.dateTime) + .format(this.settingsManager.settings.displayOptions_DateFormat); + const dueDate = `${this.settingsManager.settings.displayOptions_TaskDuePrefix}${formattedDueDate}`; + output = output.replace(DUE_REGEX, dueDate); + } else { + output = output.replace(DUE_REGEX, ''); + } + + + const formattedCreateDate = globalThis + .moment(this.createdDateTime) + .format(this.settingsManager.settings.displayOptions_DateFormat); + const createDate = `${this.settingsManager.settings.displayOptions_TaskCreatedPrefix}${formattedCreateDate}`; + output = output.replace(CREATED_REGEX, createDate); + + // Append block link at the end if it exists if (this.hasBlockLink && this.blockLink) { output = `${output.trim()} ^${this.blockLink}`; diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index fb25357..a47bad4 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -9,6 +9,21 @@ declare module 'obsidian' { appId: string; plugins: { enabledPlugins: Set; + plugins: { + [pluginId: string]: Plugin | PeriodicNotes; + } + }; + } + + // Extending for known plugin integration so there is type safety. + interface PeriodicNotes { + settings: { + daily: { + enabled: boolean; + folder: string; + format: string; + template: string; + }; }; } diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts index 2033bf1..01a120f 100644 --- a/src/utils/settingsManager.ts +++ b/src/utils/settingsManager.ts @@ -3,6 +3,7 @@ import type MsTodoSync from 'src/main'; interface ISettingsManager { settings: IMsTodoSyncSettings; + vaultName: string; saveSettings (): void; } @@ -13,6 +14,10 @@ class SettingsManager implements ISettingsManager { return this.plugin.settings; } + public get vaultName () { + return this.plugin.app.vault.getName(); + } + async saveSettings (): Promise { // Implementation to save settings await this.plugin.saveData(this.plugin.settings); From 7ab981b5158330c6236a677841756b809996b4e2 Mon Sep 17 00:00:00 2001 From: sytone Date: Mon, 6 Jan 2025 18:07:56 -0800 Subject: [PATCH 27/34] feat: good god, what have I done.... --- eslint.config.mjs | 36 +- package.json | 2 + pnpm-lock.yaml | 17 + src/api/todoApi.ts | 9 +- src/command/msToDoActions.ts | 642 +++++++++++++++++++++++++++++++ src/command/msTodoCommand.ts | 11 +- src/gui/msTodoSyncSettingTab.ts | 15 +- src/lib/ActionQueue.ts | 32 ++ src/lib/CaseInsensitiveRecord.ts | 27 ++ src/lib/locale/en.json | 4 +- src/main.ts | 78 ++-- src/model/obsidianTodoTask.ts | 28 +- src/typings/obsidian-ex.d.ts | 9 + src/utils/settingsManager.ts | 10 + 14 files changed, 843 insertions(+), 77 deletions(-) create mode 100644 src/command/msToDoActions.ts create mode 100644 src/lib/ActionQueue.ts create mode 100644 src/lib/CaseInsensitiveRecord.ts diff --git a/eslint.config.mjs b/eslint.config.mjs index e64ccc5..901ff5a 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,12 +1,30 @@ -import globals from "globals"; -import pluginJs from "@eslint/js"; -import tseslint from "typescript-eslint"; - +import globals from 'globals'; +import pluginJs from '@eslint/js'; +import tseslint from 'typescript-eslint'; +import eslintConfigPrettier from 'eslint-config-prettier'; /** @type {import('eslint').Linter.Config[]} */ export default [ - {files: ["**/*.{js,mjs,cjs,ts}"]}, - {languageOptions: { globals: globals.browser }}, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, -]; \ No newline at end of file + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, + { + rules: { + 'no-unused-vars': 'warn', + 'no-undef': 'warn', + 'no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'after-used', + caughtErrors: 'all', + ignoreRestSiblings: false, + reportUsedIgnorePattern: false, + argsIgnorePattern: '^_', + }, + ], + }, + }, +]; diff --git a/package.json b/package.json index 2de0db4..177996d 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@eslint/js": "^9.17.0", "@ophidian/build": "^1", "@types/jest": "^29.5.14", + "@types/luxon": "^3.4.2", "@types/node": "^16.18.122", "@types/node-fetch": "^2.6.12", "@typescript-eslint/eslint-plugin": "^8.19.0", @@ -32,6 +33,7 @@ "eslint-plugin-prettier": "^4.2.1", "globals": "^15.14.0", "jest": "^29.7.0", + "luxon": "^3.5.0", "obsidian": "latest", "prettier": "^2.8.8", "ts-jest": "^29.2.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e59a3ee..c11fba1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,6 +36,9 @@ importers: '@types/jest': specifier: ^29.5.14 version: 29.5.14 + '@types/luxon': + specifier: ^3.4.2 + version: 3.4.2 '@types/node': specifier: ^16.18.122 version: 16.18.122 @@ -75,6 +78,9 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@16.18.122) + luxon: + specifier: ^3.5.0 + version: 3.5.0 obsidian: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) @@ -650,6 +656,9 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/luxon@3.4.2': + resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + '@types/node-fetch@2.6.12': resolution: {integrity: sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA==} @@ -1972,6 +1981,10 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + luxon@3.5.0: + resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} + engines: {node: '>=12'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -3241,6 +3254,8 @@ snapshots: '@types/json5@0.0.29': {} + '@types/luxon@3.4.2': {} + '@types/node-fetch@2.6.12': dependencies: '@types/node': 16.18.122 @@ -4902,6 +4917,8 @@ snapshots: dependencies: yallist: 3.1.1 + luxon@3.5.0: {} + make-dir@4.0.0: dependencies: semver: 7.6.3 diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 7a60325..5d67848 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,4 +1,4 @@ -import { type PageCollection, RetryHandlerOptions, type Client } from '@microsoft/microsoft-graph-client'; +import { type PageCollection, RetryHandlerOptions, type Client, BatchRequestStep } from '@microsoft/microsoft-graph-client'; import { type TodoTask, type TodoTaskList } from '@microsoft/microsoft-graph-types'; import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; @@ -233,6 +233,7 @@ export class TodoApi { async updateTaskFromToDo (listId: string | undefined, taskId: string, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; + toDo.linkedResources = undefined; return this.client.api(endpoint).patch(toDo); } @@ -258,6 +259,10 @@ export class TodoApi { externalId: blockId, displayName: `Tracking Block Link: ${blockId}`, }; - return this.client.api(endpoint).update(updatedLinkedResource); + + const response = await this.client.api(endpoint).update(updatedLinkedResource); + return response; } } + + diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts new file mode 100644 index 0000000..abcaef2 --- /dev/null +++ b/src/command/msToDoActions.ts @@ -0,0 +1,642 @@ +import { type BlockCache, type DataAdapter, type Editor, type EditorPosition, Platform } from 'obsidian'; +import { type SettingsManager } from '../utils/settingsManager.js'; +import type MsTodoSync from '../main.js'; +import { type IMsTodoSyncSettings } from '../gui/msTodoSyncSettingTab.js'; +import { UserNotice } from '../lib/userNotice.js'; +import { logging } from '../lib/logging.js'; +import { TodoTask } from '@microsoft/microsoft-graph-types'; +import { TasksDeltaCollection, TodoApi } from '../api/todoApi.js'; +import { t } from '../lib/lang.js'; +import { ObsidianTodoTask } from '../model/obsidianTodoTask.js'; +import { DateTime } from 'luxon'; +import { type PageCollection, RetryHandlerOptions, type Client, BatchRequestStep } from '@microsoft/microsoft-graph-client'; +import { ActionQueue } from 'src/lib/ActionQueue.js'; + + +interface ISelection { + start: EditorPosition; + end?: EditorPosition; + lines: number[]; +} + +export class MsTodoActions { + private userNotice = new UserNotice(); + private readonly logger = logging.getLogger('mstodo-sync.MsTodoActions'); + private settings: IMsTodoSyncSettings; + private todoApi: TodoApi; + private plugin: MsTodoSync; + + + constructor (plugin: MsTodoSync, private settingsManager: SettingsManager, todoApi: TodoApi) { + this.settings = settingsManager.settings; + this.plugin = plugin; + this.todoApi = todoApi; + } + + /** + * This will get all the task updates from Microsoft To Do, then get all the block references + * that exist in the vault. It will then use the cache to update all the block references. + * To ensure that the sync does not over write the following logic will be used. + * If the modified time on the page is more recent than the remote task then the remote task will be updated. + * If the remote task is more recent than the page then the local task will be updated. + * If the remote task properties and the local task properties are the same then no update will occur. + * If a local task is on one ore more pages then the most recently modified page will be + * classed as the source of truth. + */ + public async syncVault (listId: string | undefined) { + + + // Get all the blocks in the vault. + const blockCache = this.getAllVaultBlocks(); + + this.logger.info(`Blocks found in vault: ${Object.keys(blockCache).length}`) + + // Get the local task that is most recent in the case there are duplicate IDs in the vault. + // The key is in the format of cacheKey-blockId. So need to pull the blockId from the key. + const localTasks: Record = {}; + for (const key in blockCache) { + if (Object.hasOwn(blockCache, key)) { + const internalPageHash = key.split('-')[0]; + const blockId = key.split('-')[1]; + // Get the mtime. + const mtime = blockCache[key].mtime; + // If the localTasks contains the block id as key, check the value + // and update if the mtime is more recent. + if (localTasks[blockId] && localTasks[blockId].mtime < mtime) { + localTasks[blockId] = { mtime, pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block }; + } else { + localTasks[blockId] = { mtime, pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block }; + } + } + } + + this.logger.info(`Local Tasks: ${Object.keys(localTasks).length}`) + + // Get all the tasks from the cache. + await this.getTaskDelta(listId, false); + const cachedTasksDelta = await this.getDeltaCache(); + + // If there are no tasks in the cache then return. + if (!cachedTasksDelta) { + return; + } + + this.logger.info(`Remote Tasks: ${cachedTasksDelta.allTasks.length}`) + this.logger.info(`Lookups in settings: ${Object.keys(this.plugin.settings.taskIdLookup).length}`) + + // Iterate over all the tasks in internal cache and update the block references. + let updatedTasks = 0; + for (const blockId in this.plugin.settings.taskIdLookup) { + const taskId = this.settingsManager.getTaskIdFromBlockId(blockId); + const cachedTask = cachedTasksDelta.allTasks.find(task => task.id === taskId); + const localTask = localTasks[blockId.toLowerCase()]; + if (cachedTask && localTask && cachedTask.lastModifiedDateTime) { + // If the local task is more recent than the remote task then update the remote task. + if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { + + // Update the remote task with the local task. + // Get the string from the page using the start and end provided by the block. + const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; + if (block) { + const adapter: DataAdapter = this.plugin.app.vault.adapter; + const pageContent = await adapter.read(localTask.pagePath) + const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) + + const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); + + const titleMatch = internalTask.title === cachedTask.title; + const statusMatch = internalTask.status === cachedTask.status; + const localDueDate = internalTask.dueDateTime === undefined ? undefined : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { zone: internalTask.dueDateTime?.timeZone ?? 'utc' }) + const remoteDueDate = cachedTask.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); + const importanceMatch = internalTask.importance === cachedTask.importance; + + if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { + this.logger.info(`Local Newer: ${blockId}`, { cachedTask, localTask, taskContent }); + this.logger.info(`Updating Task: ${blockId}`, { titleMatch, statusMatch, dueDateTimeMatch, importanceMatch }); + if (!dueDateTimeMatch) { + this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); + this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); + } + + const returnedTask = await this.todoApi.updateTaskFromToDo(listId, internalTask.id, internalTask.getTodoTask()); + this.logger.info(`Updated Task last mod: ${returnedTask.lastModifiedDateTime}`); + + updatedTasks++; + } + + } else { + this.logger.info(`Block not found in vault: ${blockId}`); + } + } else { + const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; + if (block) { + const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath) + if (vaultFileReference) { + + this.plugin.app.vault.read(vaultFileReference) + const pageContent = await this.plugin.app.vault.read(vaultFileReference) + const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) + + const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); + + const titleMatch = internalTask.title === cachedTask.title; + const statusMatch = internalTask.status === cachedTask.status; + const localDueDate = internalTask.dueDateTime === undefined ? undefined : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { zone: internalTask.dueDateTime?.timeZone ?? 'utc' }) + const remoteDueDate = cachedTask.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); + const importanceMatch = internalTask.importance === cachedTask.importance; + + if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { + this.logger.info(`Remote Newer: ${blockId}`, { cachedTask, localTask, taskContent }); + this.logger.info(`Updating Task: ${blockId}`, { titleMatch, statusMatch, dueDateTimeMatch, importanceMatch }); + if (!dueDateTimeMatch) { + this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); + this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); + } + + internalTask.updateFromTodoTask(cachedTask); + const updatedTask = internalTask.getMarkdownTask(true); + + await this.plugin.app.vault.process(vaultFileReference, (data) => { + const newPageContent = data.substring(0, localTask.block.position.start.offset) + updatedTask + data.substring(localTask.block.position.end.offset); + this.logger.info(`Updating Task ID: ${blockId}`, newPageContent); + return newPageContent; + }); + updatedTasks++; + } + } + + } else { + this.logger.info(`Block not found in vault: ${blockId}`); + } + } + } else { + + this.logger.info(`Task not found in remote cache: ${blockId}`); + + } + + // if (Object.hasOwn(this.plugin.settings.taskIdLookup, blockId)) { + // const taskId = this.plugin.settings.taskIdLookup[blockId]; + // const cachedTask = cachedTasksDelta.allTasks.find(task => task.id === taskId); + // const localTask = localTasks[blockId.toLowerCase()]; + // if (cachedTask && localTask && cachedTask.lastModifiedDateTime) { + // // If the local task is more recent than the remote task then update the remote task. + // if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { + // // Update the remote task with the local task. + // // Get the string from the page using the start and end provided by the block. + // const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; + // if (block) { + // const adapter: DataAdapter = this.plugin.app.vault.adapter; + // const pageContent = await adapter.read(localTask.pagePath) + // const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) + + // this.logger.info(`Updating Task ID: ${cachedTask.id}`); + // this.logger.info(`Updating Task Path: ${localTask.pagePath}`); + // this.logger.info(`Updating Task Local Task On Page: ${taskContent}`); + // this.logger.info(`Updating Task Remote Task: ${cachedTask.title}`); + // this.logger.info(`Updating Task Remote mtime: ${new Date(cachedTask.lastModifiedDateTime)}`); + // this.logger.info(`Updating Task Local mtime: ${new Date(localTask.mtime)}`); + // updatedTasks++; + + // } else { + // this.logger.info(`Block not found in vault: ${blockId}`); + // } + // } else { + // this.logger.info(`Local task is more recent than remote task: ${blockId}`); + // } + // } else { + // this.logger.info(`Task not found in remote cache: ${blockId}`); + // } + // } + } + + this.logger.info(`Updated Tasks: ${updatedTasks}`); + + + } + + /** + * Opens the task in Microsoft To Do based on the cursor location in the editor. + * If the task ID is found in the current line, it will open the task details either + * using the application protocol (if not on mobile and the setting is enabled) or + * via the web URL. + * + * @param editor - The editor instance where the cursor is located. + */ + public viewTaskInTodo (editor: Editor) { + const cursorLocation = editor.getCursor(); + const line = editor.getLine(cursorLocation.line); + const taskId = this.getTaskIdFromLine(line, this.plugin); + if (taskId !== '') { + if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { + window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); + } else { + window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); + } + } + } + + public async cleanupCachedTaskIds () { + // Collect all the blocks and ids from the metadata cache under the app. + const blockCache: Record = this.populateBlockCache(); + + // Iterate over all the internal cached task ids in settings. If the block is not found in the metadata cache + // we will log it. The cache is a metadata hash and block id as block ids can be reused across pages. + for (const blockId in this.settings.taskIdLookup) { + if (Object.hasOwn(this.settings.taskIdLookup, blockId)) { + // Check if the block is in the metadata cache. + let found = false; + let block; + for (const key in blockCache) { + if (key.includes(blockId.toLowerCase())) { + found = true; + block = blockCache[key]; + } + } + + if (found) { + this.logger.info(`Block found in metadata cache: ${blockId}`, block); + } else { + this.logger.info(`Block not found in metadata cache: ${blockId}`); + // Clean up the block id from the settings. + delete this.settings.taskIdLookup[blockId]; // eslint-disable-line @typescript-eslint/no-dynamic-delete + await this.settingsManager.saveSettings(); // eslint-disable-line no-await-in-loop + } + } + } + + this.logger.info('blockCache', blockCache); + } + + /** + * This will find all block references across all files. + * + * @param {MsTodoSync} plugin + * @return {*} {Record} + */ + private populateBlockCache (): Record { + const blockCache: Record = {}; + const internalMetadataCache = this.plugin.app.metadataCache.metadataCache; + for (const cacheKey in internalMetadataCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey) && internalMetadataCache[cacheKey].blocks) { + const blocksCache = internalMetadataCache[cacheKey].blocks; + for (const blockKey in blocksCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey)) { + const block = blocksCache[blockKey]; + blockCache[`${cacheKey}-${blockKey}`] = block; + } + } + } + } + + return blockCache; + } + + private getAllVaultBlocks (): Record { + const blockCache: Record = {}; + const internalMetadataCache = this.plugin.app.metadataCache.metadataCache; + for (const cacheKey in internalMetadataCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey) && internalMetadataCache[cacheKey].blocks) { + const blocksCache = internalMetadataCache[cacheKey].blocks; + const file = this.findBySubProperty(this.plugin.app.metadataCache.fileCache, 'hash', cacheKey); + for (const blockKey in blocksCache) { + if (Object.hasOwn(internalMetadataCache, cacheKey)) { + const block = blocksCache[blockKey.toLowerCase()]; + blockCache[`${cacheKey}-${blockKey.toLowerCase()}`] = { mtime: file?.value.mtime ?? 0, pageHash: cacheKey, pagePath: file?.key ?? '', block }; + } + } + } + } + + return blockCache; + } + + // Function to find the key and value by a sub-property of the value + private findBySubProperty, K extends keyof T[keyof T]> ( + record: T, + subProperty: K, + value: T[keyof T][K] + ): { key: string; value: T[keyof T] } | undefined { + const entry = Object.entries(record).find(([_, v]) => v[subProperty] === value); + return entry ? { key: entry[0], value: entry[1] } : undefined; + } + + /** + * Posts tasks to Microsoft To Do from the selected lines in the editor. + * + * @param todoApi - The TodoApi instance used to interact with Microsoft To Do. + * @param listId - The ID of the list where the tasks will be posted. If undefined, a notice will be shown to set the list name. + * @param editor - The editor instance from which the tasks will be extracted. + * @param fileName - The name of the file being edited. If undefined, an empty string will be used. + * @param plugin - The MsTodoSync plugin instance. + * @param replace - Optional. If true, the original tasks in the editor will be replaced with the new tasks. Defaults to false. + * + * @returns A promise that resolves when the tasks have been posted and the file has been modified. + */ + public async postTask ( + listId: string | undefined, + editor: Editor, + fileName: string | undefined, + replace?: boolean, + ) { + const logger = logging.getLogger('mstodo-sync.command.post'); + + if (!listId) { + this.userNotice.showMessage(t('CommandNotice_SetListName')); + return; + } + + const activeFile = this.plugin.app.workspace.getActiveFile(); + if (activeFile === null) { + return; + } + + this.userNotice.showMessage(t('CommandNotice_CreatingToDo'), 3000); + + + const source = await this.plugin.app.vault.read(activeFile); + const { lines } = await this.getCurrentLinesFromEditor(editor); + + // Single call to update the cache using the delta link. + await this.getTaskDelta(listId); + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + // If the line is not in the selection, return the line as is. + if (!lines.includes(index)) { + return line; + } + + // Create the to do task from the line that is in the selection. + const todo = new ObsidianTodoTask(this.settingsManager, line); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + // As a user can add a block link, not all tasks will be able to + // lookup a id from the internal cache. + if (todo.hasBlockLink && todo.hasId) { + logger.debug(`Updating Task: ${todo.title}`); + + + + // Check for linked resource and update if there otherwise create. + const cachedTasksDelta = await this.getDeltaCache(); + const cachedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + + const titleMatch = todo.title === cachedTask?.title; + const statusMatch = todo.status === cachedTask?.status; + const localDueDate = todo.dueDateTime === undefined ? undefined : DateTime.fromISO(todo.dueDateTime?.dateTime ?? '', { zone: todo.dueDateTime?.timeZone ?? 'utc' }) + const remoteDueDate = cachedTask?.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask?.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); + const importanceMatch = todo.importance === cachedTask?.importance; + + if (cachedTask && (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch)) { + const linkedResource = cachedTask.linkedResources?.first(); + if (linkedResource && linkedResource.id) { + await this.todoApi.updateLinkedResource(listId, todo.id, linkedResource.id, todo.blockLink ?? '', todo.getRedirectUrl()); + } else { + await this.todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.getRedirectUrl()); + } + } + + todo.linkedResources = cachedTask?.linkedResources; + + // Only update if there is a need. + if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { + const returnedTask = await this.todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + logger.debug(`updated: ${returnedTask.id}`); + } + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + } else { + logger.debug(`Creating Task: ${todo.title}`); + logger.debug(`Creating Task: ${listId}`); + + const returnedTask = await this.todoApi.createTaskFromToDo(listId, todo.getTodoTask()); + + todo.status = returnedTask.status; + await todo.cacheTaskId(returnedTask.id ?? ''); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + } + + // If false there will be a orphaned block id for this task. + if (replace) { + return todo.getMarkdownTask(true); + } + + return line; + }), + ); + + await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); + } + + public async getTask ( + listId: string | undefined, + editor: Editor, + ) { + const logger = logging.getLogger('mstodo-sync.command.get'); + + if (!listId) { + this.userNotice.showMessage(t('CommandNotice_SetListName')); + return; + } + + const activeFile = this.plugin.app.workspace.getActiveFile(); + if (activeFile === null) { + return; + } + + this.userNotice.showMessage(t('CommandNotice_GettingToDo'), 3000); + + const source = await this.plugin.app.vault.read(activeFile); + const { lines } = await this.getCurrentLinesFromEditor(editor); + + // Single call to update the cache using the delta link. + await this.getTaskDelta(listId); + + const split = source.split('\n'); + const modifiedPage = await Promise.all( + split.map(async (line: string, index: number) => { + // If the line is not in the selection, return the line as is. + if (!lines.includes(index)) { + return line; + } + + // Create the to do task from the line that is in the selection. + const todo = new ObsidianTodoTask(this.plugin.settingsManager, line); + + // If there is a block link in the line, we will try to find + // the task id from the block link and update the task instead. + // As a user can add a block link, not all tasks will be able to + // lookup a id from the internal cache. + if (todo.hasBlockLink && todo.hasId) { + logger.debug(`Updating Task: ${todo.title}`); + + // Load from the delta cache file and pull the task from the cache. + const cachedTasksDelta = await this.getDeltaCache(); + const returnedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + + if (returnedTask) { + todo.updateFromTodoTask(returnedTask); + logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + logger.debug(`updated: ${returnedTask.id}`); + } + + return todo.getMarkdownTask(true); + } + + return line; + }), + ); + + await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); + } + + + private async getDeltaCache () { + const cachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; + const adapter: DataAdapter = this.plugin.app.vault.adapter; + let cachedTasksDelta: TasksDeltaCollection | undefined; + + if (await adapter.exists(cachePath)) { + cachedTasksDelta = JSON.parse(await adapter.read(cachePath)) as TasksDeltaCollection; + } + + return cachedTasksDelta; + } + + private async getTaskDelta ( + listId: string | undefined, + reset = false, + ) { + const logger = logging.getLogger('mstodo-sync.command.delta'); + + if (!listId) { + this.userNotice.showMessage(t('CommandNotice_SetListName')); + return; + } + + const cachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; + const adapter: DataAdapter = this.plugin.app.vault.adapter; + if (reset) { + await adapter.remove(cachePath); + } + + let deltaLink = ''; + let cachedTasksDelta = await this.getDeltaCache(); + + if (cachedTasksDelta) { + deltaLink = cachedTasksDelta.deltaLink; + } else { + cachedTasksDelta = new TasksDeltaCollection([], ''); + } + + const returnedTask = await this.todoApi.getTasksDelta(listId, deltaLink); + logger.info('deltaLink', deltaLink); + logger.info('ReturnedDelta', returnedTask); + + if (cachedTasksDelta) { + logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); + logger.info('returnedTask.allTasks', returnedTask.allTasks.length); + + cachedTasksDelta.allTasks = this.mergeCollections(cachedTasksDelta.allTasks, returnedTask.allTasks); + logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); + + cachedTasksDelta.deltaLink = returnedTask.deltaLink; + } else { + logger.info('First run, loading delta cache'); + + cachedTasksDelta = returnedTask; + } + + await adapter.write(cachePath, JSON.stringify(cachedTasksDelta)); + } + + // Function to merge collections + private mergeCollections (col1: TodoTask[], col2: TodoTask[]): TodoTask[] { + const map = new Map(); + + // Helper function to add items to the map + function addToMap (item: TodoTask) { + if (item.id && item.lastModifiedDateTime) { + const existingItem = map.get(item.id); + // If there is no last modified then just use the current item. + if (!existingItem || new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0)) { + map.set(item.id, item); + } + } + } + + // Add items from both collections to the map + for (const item of col1) { + addToMap(item); + } + + for (const item of col2) { + addToMap(item); + } + + // Convert map values back to an array + return Array.from(map.values()); + } + + /** + * Retrieves the current lines from the editor based on the cursor position or selection. + * + * @param editor - The editor instance from which to get the current lines. + * @returns A promise that resolves to a Selection object containing: + * - `start`: The starting position of the cursor or selection. + * - `end`: The ending position of the cursor or selection. + * - `lines`: An array of line numbers that are currently selected or where the cursor is located. + */ + private async getCurrentLinesFromEditor (editor: Editor): Promise { + this.logger.info('Getting current lines from editor', { + from: editor.getCursor('from'), + to: editor.getCursor('to'), + anchor: editor.getCursor('anchor'), + head: editor.getCursor('head'), + general: editor.getCursor(), + }); + + // Const activeFile = this.app.workspace.getActiveFile(); + // const source = await this.app.vault.read(activeFile); + + let start: EditorPosition; + let end: EditorPosition; + // Let lines: string[] = []; + let lines: number[] = []; + if (editor.somethingSelected()) { + start = editor.getCursor('from'); + end = editor.getCursor('to'); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); + } else { + start = editor.getCursor(); + end = editor.getCursor(); + // Lines = source.split('\n').slice(start.line, end.line + 1); + lines.push(start.line); + } + + return { + start, + end, + lines, + }; + } + + private getTaskIdFromLine (line: string, plugin: MsTodoSync): string { + const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; + const blocklistMatch = regex.exec(line.trim()); + if (blocklistMatch) { + const blockLink = blocklistMatch[1]; + const taskId = plugin.settings.taskIdLookup[blockLink]; + console.log(taskId); + return taskId; + } + + return ''; + } +} diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 9bdfdb3..d9e7026 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,4 +1,3 @@ -/* eslint-disable max-params */ import { type BlockCache, type DataAdapter, type Editor, type EditorPosition, MarkdownView, @@ -13,6 +12,7 @@ import { t } from '../lib/lang.js'; import { log, logging } from '../lib/logging.js'; import { UserNotice } from 'src/lib/userNotice.js'; + const userNotice = new UserNotice(); export function getTaskIdFromLine (line: string, plugin: MsTodoSync): string { @@ -187,7 +187,7 @@ export async function postTask ( } // Create the to do task from the line that is in the selection. - const todo = new ObsidianTodoTask(plugin.settingsManager, line, fileName ?? ''); + const todo = new ObsidianTodoTask(plugin.settingsManager, line); // If there is a block link in the line, we will try to find // the task id from the block link and update the task instead. @@ -272,7 +272,7 @@ export async function getTask ( } // Create the to do task from the line that is in the selection. - const todo = new ObsidianTodoTask(plugin.settingsManager, line, fileName ?? ''); + const todo = new ObsidianTodoTask(plugin.settingsManager, line); // If there is a block link in the line, we will try to find // the task id from the block link and update the task instead. @@ -457,7 +457,7 @@ export async function postTaskAndChildren ( logger.debug(`body: ${body}`); logger.debug(`childTasks: ${childTasks}`, childTasks); - const todo = new ObsidianTodoTask(plugin.settingsManager, topLevelTask, fileName ?? ''); + const todo = new ObsidianTodoTask(plugin.settingsManager, topLevelTask); todo.setBody(body); for (const childTask of childTasks) { todo.addChecklistItem(childTask); @@ -471,7 +471,7 @@ export async function postTaskAndChildren ( // Const currentTaskState = await todoApi.getTask(listId, todo.id); let returnedTask; if (push) { - returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask(), todo.blockLink ?? ''); + returnedTask = await todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); // Push the checklist items... todo.checklistItems = returnedTask.checklistItems; todo.status = returnedTask.status; @@ -525,7 +525,6 @@ export async function getAllTasksInList ( plugin: MsTodoSync, withBody: boolean, ) { - const logger = logging.getLogger('mstodo-sync.command.get'); const now = globalThis.moment(); const settings = plugin.settingsManager.settings; diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 6841c6f..7afd37e 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -20,6 +20,7 @@ export interface IMsTodoSyncSettings { displayOptions_DateFormat: string; displayOptions_TimeFormat: string; + displayOptions_RegExToRunOnPushAgainstTitle: string; displayOptions_TaskCreatedPrefix: string; displayOptions_TaskDuePrefix: string; displayOptions_TaskStartPrefix: string; @@ -67,8 +68,8 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { stayWithPN: false, }, displayOptions_DateFormat: 'YYYY-MM-DD', - displayOptions_TimeFormat: 'HH:mm', + displayOptions_RegExToRunOnPushAgainstTitle: '', displayOptions_TaskCreatedPrefix: '🔎', displayOptions_TaskDuePrefix: '📅', displayOptions_TaskStartPrefix: '🛫', @@ -130,7 +131,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { title: string, description: string, currentValue: string, - changeCallback: (value: string) => unknown, + changeCallback: (_value: string) => unknown, ): void { new Setting(containerElement) .setName(t(title)) @@ -202,6 +203,16 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { }), ); + this.addTextSetting( + containerEl, + 'Settings_Todo_Display_RegExToRunOnPushAgainstTitle', + 'Settings_Todo_Display_RegExToRunOnPushAgainstTitle_Description', + this.settings.displayOptions_RegExToRunOnPushAgainstTitle, + async value => { + this.settings.displayOptions_RegExToRunOnPushAgainstTitle = value; + }, + ); + new Setting(containerEl) .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) diff --git a/src/lib/ActionQueue.ts b/src/lib/ActionQueue.ts new file mode 100644 index 0000000..2274451 --- /dev/null +++ b/src/lib/ActionQueue.ts @@ -0,0 +1,32 @@ +export class ActionQueue { + private queue: (() => Promise)[] = []; + private delay: number; + private isProcessing: boolean = false; + + constructor (delay: number) { + this.delay = delay; + } + + public addAction (action: () => Promise): void { + this.queue.push(action); + if (!this.isProcessing) { + this.processQueue(); + } + } + + private async processQueue (): Promise { + this.isProcessing = true; + while (this.queue.length > 0) { + const action = this.queue.shift(); + if (action) { + await action(); + await this.sleep(this.delay); + } + } + this.isProcessing = false; + } + + private sleep (ms: number): Promise { + return new Promise(resolve => setTimeout(resolve, ms)); + } +} diff --git a/src/lib/CaseInsensitiveRecord.ts b/src/lib/CaseInsensitiveRecord.ts new file mode 100644 index 0000000..ff42d1d --- /dev/null +++ b/src/lib/CaseInsensitiveRecord.ts @@ -0,0 +1,27 @@ +export class CaseInsensitiveRecord { + private record: Record = {}; + + set (key: string, value: T): void { + this.record[key.toLowerCase()] = value; + } + + get (key: string): T | undefined { + return this.record[key.toLowerCase()]; + } + + has (key: string): boolean { + return key.toLowerCase() in this.record; + } + + delete (key: string): void { + delete this.record[key.toLowerCase()]; + } + + keys (): string[] { + return Object.keys(this.record); + } + + values (): T[] { + return Object.values(this.record); + } +} diff --git a/src/lib/locale/en.json b/src/lib/locale/en.json index 7db8200..953d107 100644 --- a/src/lib/locale/en.json +++ b/src/lib/locale/en.json @@ -71,6 +71,8 @@ "Settings_Todo_Display_TimeFormatDescription": "The format used when adding or rendering a time for a task.", "Settings_Todo_OpenUsingApplicationProtocolDescription": "If this is set to true it will open the todo in the locally installed application, set it to off if you want to open the todo in the browser.", "Settings_Todo_OpenUsingApplicationProtocolTitle": "Open with application protocol?", + "Settings_Todo_Display_RegExToRunOnPushAgainstTitle": "RegEx to run on push to remove items from title", + "Settings_Todo_Display_RegExToRunOnPushAgainstTitle_Description": "When a task is pushed to Microsoft To Do, this regular expression is run against the title to remove any unwanted text.", "Settings_Uptimer": "Uptimer", "Settings_Uptimer_UpTimerEmail": "Uptimer registration email", "Settings_Uptimer_UpTimerPassword": "Uptimer password", @@ -90,4 +92,4 @@ "Settings_NativeApp_Heading_Description": "If you have the Microsoft To Do app installed on your computer, you can open the app directly from Obsidian.", "Settings_NativeApp_RedirectUriBase": "Redirect URI Base", "Settings_NativeApp_RedirectUriBase_Description": "The base URI used to generate the advanced URI to open locally. " -} \ No newline at end of file +} diff --git a/src/main.ts b/src/main.ts index 3fd81b1..8a927d2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,17 +1,18 @@ import { - type CachedMetadata, type Editor, EditorPosition, type MarkdownView, Notice, Platform, Plugin, + type CachedMetadata, type Editor, type MarkdownView, Plugin, } from 'obsidian'; import { TodoApi } from './api/todoApi.js'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings } from './gui/msTodoSyncSettingTab.js'; import { cleanupCachedTaskIds, - createTodayTasks, getAllTasksInList, getTask, getTaskDelta, getTaskIdFromLine, postTask, postTaskAndChildren, + createTodayTasks, getAllTasksInList, getTask, getTaskDelta, postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import { t } from './lib/lang.js'; import { log, logging } from './lib/logging.js'; import { SettingsManager } from './utils/settingsManager.js'; import { MicrosoftClientProvider } from './api/microsoftClientProvider.js'; import { IUserNotice, UserNotice } from './lib/userNotice.js'; +import { MsTodoActions } from './command/msToDoActions.js'; export default class MsTodoSync extends Plugin { settings: IMsTodoSyncSettings; @@ -19,6 +20,7 @@ export default class MsTodoSync extends Plugin { public todoApi: TodoApi; public settingsManager: SettingsManager; public microsoftClientProvider: MicrosoftClientProvider; + public msToDoActions: MsTodoActions; // Pulls the meta data for the a page to help with list processing. getPageMetadata (path: string): CachedMetadata | undefined { @@ -33,12 +35,6 @@ export default class MsTodoSync extends Plugin { await this.loadSettings(); - this.registerMenuEditorOptions(); - - this.registerCommands(); - - this.addSettingTab(new MsTodoSyncSettingTab(this.app, this, this.userNotice)); - try { this.microsoftClientProvider = new MicrosoftClientProvider(this.app); if (this.settings.microsoft_AuthenticationClientId !== '') { @@ -52,15 +48,22 @@ export default class MsTodoSync extends Plugin { this.microsoftClientProvider.createPublicClientApplication(); } catch (error) { if (error instanceof Error) { - const notice = new Notice(error.message); + this.userNotice.showMessage(error.message); log('error', error.message); log('error', error.stack ?? 'No stack trace available'); return; } } + this.registerMenuEditorOptions(); + + this.registerCommands(); + + this.addSettingTab(new MsTodoSyncSettingTab(this.app, this, this.userNotice)); + this.todoApi = new TodoApi(this.microsoftClientProvider); this.settingsManager = new SettingsManager(this); + this.msToDoActions = new MsTodoActions(this, this.settingsManager, this.todoApi); } async onunload () { @@ -68,7 +71,7 @@ export default class MsTodoSync extends Plugin { } async loadSettings () { - this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); // eslint-disable-line @typescript-eslint/no-unsafe-assignment + this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } async saveSettings () { @@ -93,7 +96,7 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'only-create-task', name: t('CommandName_PushToMsTodo'), - editorCallback: async (editor: Editor, view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView) => { await this.pushTaskToMsTodo(editor); }, }); @@ -103,7 +106,7 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'create-task-replace', name: t('CommandName_PushToMsTodoAndReplace'), - editorCallback: async (editor: Editor, view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView) => { await this.pushTaskToMsTodoAndUpdatePage(editor); }, }); @@ -112,15 +115,15 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'open-task-link', name: t('CommandName_OpenToDo'), - editorCallback: async (editor: Editor, view: MarkdownView) => { - this.viewTaskInTodo(editor); + editorCallback: async (editor: Editor, _view: MarkdownView) => { + this.msToDoActions.viewTaskInTodo(editor); }, }); this.addCommand({ id: 'add-microsoft-todo', name: t('CommandName_InsertSummary'), - editorCallback: async (editor: Editor, view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView) => { await createTodayTasks(this.todoApi, this.settings, editor); }, }); @@ -143,7 +146,7 @@ export default class MsTodoSync extends Plugin { */ private registerMenuEditorOptions () { this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { + this.app.workspace.on('editor-menu', (menu, editor, _view) => { menu.addSeparator(); // menu.addItem(item => { // item.setTitle(t('EditorMenu_SyncToTodo')).onClick( @@ -204,7 +207,7 @@ export default class MsTodoSync extends Plugin { menu.addItem(item => { item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - this.viewTaskInTodo(editor); + this.msToDoActions.viewTaskInTodo(editor); }); }); }), @@ -212,7 +215,7 @@ export default class MsTodoSync extends Plugin { if (this.settings.hackingEnabled) { this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, view) => { + this.app.workspace.on('editor-menu', (menu, editor, _view) => { menu.addSeparator(); menu.addItem(item => { item.setTitle('Testing Commands Enabled'); @@ -279,6 +282,16 @@ export default class MsTodoSync extends Plugin { }, ); }); + + menu.addItem(item => { + item.setTitle('Sync Vault').onClick( + async () => { + this.msToDoActions.syncVault( + this.settings.todoListSync?.listId, + ); + }, + ); + }); }), ); } @@ -286,27 +299,6 @@ export default class MsTodoSync extends Plugin { } - /** - * Opens the task in Microsoft To Do based on the cursor location in the editor. - * If the task ID is found in the current line, it will open the task details either - * using the application protocol (if not on mobile and the setting is enabled) or - * via the web URL. - * - * @param editor - The editor instance where the cursor is located. - */ - private viewTaskInTodo (editor: Editor) { - const cursorLocation = editor.getCursor(); - const line = editor.getLine(cursorLocation.line); - const taskId = getTaskIdFromLine(line, this); - if (taskId !== '') { - if (!Platform.isMobile && this.settings.todo_OpenUsingApplicationProtocol) { - window.open(`ms-todo://tasks/id/${taskId}/details`, '_blank'); - } else { - window.open(`https://to-do.live.com/tasks/id/${taskId}/details`, '_blank'); - } - } - } - /** * Pushes a task to Microsoft To-Do and updates the page. * @@ -318,12 +310,10 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been posted and the page updated. */ private async pushTaskToMsTodoAndUpdatePage (editor: Editor) { - await postTask( - this.todoApi, + await this.msToDoActions.postTask( this.settings.todoListSync?.listId, editor, this.app.workspace.getActiveFile()?.path, - this, true, ); } @@ -335,12 +325,10 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been successfully pushed. */ private async pushTaskToMsTodo (editor: Editor) { - await postTask( - this.todoApi, + await this.msToDoActions.postTask( this.settings.todoListSync?.listId, editor, this.app.workspace.getActiveFile()?.path, - this, false, ); } diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index 57ed520..415a557 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -13,7 +13,6 @@ import { type TodoTask, } from '@microsoft/microsoft-graph-types'; import { type ISettingsManager } from 'src/utils/settingsManager.js'; -import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; import { CREATED_REGEX, DUE_REGEX, IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; @@ -147,9 +146,8 @@ export class ObsidianTodoTask implements TodoTask { * @param line - The line of text representing the task. * @param fileName - The name of the file where the task is located. */ - constructor (private readonly settingsManager: ISettingsManager, line: string, public fileName: string) { + constructor (private readonly settingsManager: ISettingsManager, line: string) { this.originalTitle = line; - this.logger.debug(`Creating: '${this.originalTitle}'`); this.title = line.trim(); @@ -164,12 +162,13 @@ export class ObsidianTodoTask implements TodoTask { // This will strip out the created date if in title. if (this.title.includes(settingsManager.settings.displayOptions_TaskCreatedPrefix)) { this.title = this.title - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix}\\[\\[.*]]`, 'g'), '') - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix}\\d{4}-\\d{2}-\\d{2}`, 'g'), ''); + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\[\\[.*]]`, 'g'), '') + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\d{4}-\\d{2}-\\d{2}`, 'g'), '') + .trim(); } if (this.title.includes(settingsManager.settings.displayOptions_TaskDuePrefix)) { - const specifiedDueDate = this.title.match(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}(\\d{4}-\\d{2}-\\d{2})`, 'g')); + const specifiedDueDate = this.title.match(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?(\\d{4}-\\d{2}-\\d{2})`, 'g')); if (specifiedDueDate) { this.dueDateTime = { @@ -179,8 +178,9 @@ export class ObsidianTodoTask implements TodoTask { } this.title = this.title - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}\\[\\[.*]]`, 'g'), '') - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix}\\d{4}-\\d{2}-\\d{2}`, 'g'), ''); + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?\\[\\[.*]]`, 'g'), '') + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?\\d{4}-\\d{2}-\\d{2}`, 'g'), '') + .trim(); } this.checkForImportance(line); @@ -190,6 +190,12 @@ export class ObsidianTodoTask implements TodoTask { .replaceAll(/(- \[([ /x])] )|\*|^> |^#* |- /gm, '') .trim(); + // Remove any items the user does not want pushed to Microsoft To Do + if (settingsManager.settings.displayOptions_RegExToRunOnPushAgainstTitle !== '') { + this.title = this.title + .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_RegExToRunOnPushAgainstTitle}`, 'g'), ''); + } + this.body = { content: '', contentType: 'text', @@ -204,7 +210,7 @@ export class ObsidianTodoTask implements TodoTask { displayName: `Tracking Block Link: ${this.blockLink}`, }); - this.logger.info(`Created: '${this.title}'`); + this.logger.debug(`Created: '${this.title}'`); } public getRedirectUrl (): string { @@ -295,7 +301,7 @@ export class ObsidianTodoTask implements TodoTask { this.linkedResources = remoteTask.linkedResources; } - if (this.dueDateTime) { + if (remoteTask.dueDateTime) { this.dueDateTime = remoteTask.dueDateTime; } @@ -360,14 +366,12 @@ export class ObsidianTodoTask implements TodoTask { output = output.replace(DUE_REGEX, ''); } - const formattedCreateDate = globalThis .moment(this.createdDateTime) .format(this.settingsManager.settings.displayOptions_DateFormat); const createDate = `${this.settingsManager.settings.displayOptions_TaskCreatedPrefix}${formattedCreateDate}`; output = output.replace(CREATED_REGEX, createDate); - // Append block link at the end if it exists if (this.hasBlockLink && this.blockLink) { output = `${output.trim()} ^${this.blockLink}`; diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index a47bad4..66c1b94 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -1,8 +1,17 @@ +/* eslint-disable no-unused-vars */ import _ from 'obsidian'; declare module 'obsidian' { + + interface FileCacheRecord { + mtime: number; + size: number; + hash: string; + } + interface MetadataCache { metadataCache: Record; + fileCache: Record; } interface App { diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts index 01a120f..11c9a4b 100644 --- a/src/utils/settingsManager.ts +++ b/src/utils/settingsManager.ts @@ -18,10 +18,20 @@ class SettingsManager implements ISettingsManager { return this.plugin.app.vault.getName(); } + public getTaskIdFromBlockId (blockId: string): string { + return this.findKeyCaseInsensitive(this.plugin.settings.taskIdLookup, blockId); + } + async saveSettings (): Promise { // Implementation to save settings await this.plugin.saveData(this.plugin.settings); } + + private findKeyCaseInsensitive (obj: Record, key: string): any { + const lowerCaseKey = key.toLowerCase(); + const foundKey = Object.keys(obj).find(k => k.toLowerCase() === lowerCaseKey); + return foundKey ? obj[foundKey] : undefined; + } } export { type ISettingsManager, SettingsManager }; From 163d9aa4c95d412c2ac8e840488870f0e6341988 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 9 Jan 2025 14:03:21 -0800 Subject: [PATCH 28/34] style: cleaning up linting and style --- .prettierrc | 14 +++++------ eslint.config.mjs | 1 - package.json | 14 +++++------ pnpm-lock.yaml | 47 +++++------------------------------- src/api/todoApi.ts | 2 +- src/command/msToDoActions.ts | 6 ++--- src/command/msTodoCommand.ts | 4 +-- tsconfig.json | 32 +++++++++++------------- 8 files changed, 39 insertions(+), 81 deletions(-) diff --git a/.prettierrc b/.prettierrc index 1e44df9..933cede 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,9 +1,9 @@ { - "semi": true, - "trailingComma": "all", - "printWidth": 120, - "tabWidth": 4, - "useTabs": true, - "singleQuote": true, - "bracketSpacing": true + "semi": true, + "trailingComma": "all", + "printWidth": 120, + "tabWidth": 4, + "useTabs": false, + "singleQuote": true, + "bracketSpacing": true } diff --git a/eslint.config.mjs b/eslint.config.mjs index 901ff5a..2d36858 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -12,7 +12,6 @@ export default [ eslintConfigPrettier, { rules: { - 'no-unused-vars': 'warn', 'no-undef': 'warn', 'no-unused-vars': [ 'error', diff --git a/package.json b/package.json index 177996d..e6713bd 100644 --- a/package.json +++ b/package.json @@ -6,8 +6,10 @@ "scripts": { "preinstall": "npx only-allow pnpm", "version": "node version-bump.mjs && git add manifest.json versions.json", - "lint": "eslint ./src --ext .ts", - "lint:fix": "eslint ./src --ext .ts --fix", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "eslint --max-warnings=0 src/** --no-warn-ignored", + "lint:fix": "eslint --max-warnings=0 --fix src/** --no-warn-ignored", "prettier-format": "prettier --config .prettierrc ./src/**/*.ts --write", "dev": "node ophidian.config.mjs dev", "build": "node ophidian.config.mjs production" @@ -30,12 +32,11 @@ "eslint-config-prettier": "^8.10.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-loops": "^0.3.0", - "eslint-plugin-prettier": "^4.2.1", "globals": "^15.14.0", "jest": "^29.7.0", "luxon": "^3.5.0", "obsidian": "latest", - "prettier": "^2.8.8", + "prettier": "^3.4.2", "ts-jest": "^29.2.5", "tslib": "^2.8.1", "typescript": "^4.9.5", @@ -46,8 +47,7 @@ "@azure/msal-node": "^2.16.2", "@microsoft/microsoft-graph-client": "^3.0.7", "@microsoft/microsoft-graph-types": "^2.40.0", - "eventemitter2": "^6.4.9", - "node-fetch": "^2.7.0" + "eventemitter2": "^6.4.9" }, "xo": { "space": 4, @@ -77,4 +77,4 @@ ] } } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c11fba1..d1d71e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -69,9 +69,6 @@ importers: eslint-plugin-no-loops: specifier: ^0.3.0 version: 0.3.0(eslint@9.17.0) - eslint-plugin-prettier: - specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8) globals: specifier: ^15.14.0 version: 15.14.0 @@ -85,8 +82,8 @@ importers: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) prettier: - specifier: ^2.8.8 - version: 2.8.8 + specifier: ^3.4.2 + version: 3.4.2 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122))(typescript@4.9.5) @@ -1293,17 +1290,6 @@ packages: peerDependencies: eslint: '>=2.0.0' - eslint-plugin-prettier@4.2.1: - resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} - engines: {node: '>=12.0.0'} - peerDependencies: - eslint: '>=7.28.0' - eslint-config-prettier: '*' - prettier: '>=2.0.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1369,9 +1355,6 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} - fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2209,13 +2192,9 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} + prettier@3.4.2: + resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + engines: {node: '>=14'} hasBin: true pretty-format@29.7.0: @@ -3999,14 +3978,6 @@ snapshots: dependencies: eslint: 9.17.0 - eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@2.8.8): - dependencies: - eslint: 9.17.0 - prettier: 2.8.8 - prettier-linter-helpers: 1.0.0 - optionalDependencies: - eslint-config-prettier: 8.10.0(eslint@9.17.0) - eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 @@ -4101,8 +4072,6 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-diff@1.3.0: {} - fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5116,11 +5085,7 @@ snapshots: prelude-ls@1.2.1: {} - prettier-linter-helpers@1.0.0: - dependencies: - fast-diff: 1.3.0 - - prettier@2.8.8: {} + prettier@3.4.2: {} pretty-format@29.7.0: dependencies: diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 5d67848..aac0d45 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -78,7 +78,7 @@ export class TodoApi { } const endpoint = '/me/todo/lists'; - const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); // eslint-disable-line @typescript-eslint/no-unsafe-assignment + const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); const resource: TodoTaskList[] = response.value as TodoTaskList[]; if (!resource || resource.length === 0) { return; diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts index abcaef2..2500bd3 100644 --- a/src/command/msToDoActions.ts +++ b/src/command/msToDoActions.ts @@ -9,8 +9,6 @@ import { TasksDeltaCollection, TodoApi } from '../api/todoApi.js'; import { t } from '../lib/lang.js'; import { ObsidianTodoTask } from '../model/obsidianTodoTask.js'; import { DateTime } from 'luxon'; -import { type PageCollection, RetryHandlerOptions, type Client, BatchRequestStep } from '@microsoft/microsoft-graph-client'; -import { ActionQueue } from 'src/lib/ActionQueue.js'; interface ISelection { @@ -261,8 +259,8 @@ export class MsTodoActions { } else { this.logger.info(`Block not found in metadata cache: ${blockId}`); // Clean up the block id from the settings. - delete this.settings.taskIdLookup[blockId]; // eslint-disable-line @typescript-eslint/no-dynamic-delete - await this.settingsManager.saveSettings(); // eslint-disable-line no-await-in-loop + delete this.settings.taskIdLookup[blockId]; + await this.settingsManager.saveSettings(); } } } diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index d9e7026..5398df9 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -105,8 +105,8 @@ export async function cleanupCachedTaskIds ( } else { logger.info(`Block not found in metadata cache: ${blockId}`); // Clean up the block id from the settings. - delete plugin.settings.taskIdLookup[blockId]; // eslint-disable-line @typescript-eslint/no-dynamic-delete - await plugin.settingsManager.saveSettings(); // eslint-disable-line no-await-in-loop + delete plugin.settings.taskIdLookup[blockId]; + await plugin.settingsManager.saveSettings(); } } } diff --git a/tsconfig.json b/tsconfig.json index 76bde03..b74d23e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,32 +1,28 @@ { "compilerOptions": { - "allowSyntheticDefaultImports": true, "baseUrl": ".", - "inlineSourceMap": true, - "inlineSources": true, - "module": "CommonJS", - "target": "ES6", + "module": "ESNext", + "target": "ES2020", "allowJs": true, "noImplicitAny": true, - "moduleResolution": "node", + "strict": true, + "strictNullChecks": true, + "noImplicitReturns": true, + "moduleResolution": "Node", "importHelpers": true, "isolatedModules": true, - "resolveJsonModule": true, - "strictNullChecks": true, + "verbatimModuleSyntax": true, "lib": [ "DOM", - "ES5", - "ES6", - "ES7", - "ES2021", - "ES2022" - ] + "ESNext" + ], + "allowSyntheticDefaultImports": true, + "skipLibCheck": true }, "include": [ - "**/*.ts" + "src/**/*.ts" ], "exclude": [ - "node_modules", - "tests" + "node_modules" ] -} \ No newline at end of file +} From 66de8264b316ec0e00a787a62e3d0f548228ef63 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 9 Jan 2025 14:06:08 -0800 Subject: [PATCH 29/34] style: bulk style cleanup --- .github/workflows/release-v2.yml | 2 +- .prettierignore | 5 + .vscode/settings.json | 7 +- README.md | 2 +- dist/manifest.json | 18 +-- dist/styles.css | 2 +- eslint.config.mjs | 42 +++--- jest-setup.js | 30 ++-- jest.config.js | 16 +-- manifest.json | 18 +-- redirectpage.html | 85 ++++++----- src/api/microsoftClientProvider.ts | 34 ++--- src/api/todoApi.ts | 92 +++++++----- src/command/msToDoActions.ts | 222 ++++++++++++++++++----------- src/command/msTodoCommand.ts | 122 ++++++++-------- src/gui/microsoftAuthModal.ts | 10 +- src/gui/msTodoSyncSettingTab.ts | 81 +++++------ src/lib/ActionQueue.ts | 10 +- src/lib/CaseInsensitiveRecord.ts | 12 +- src/lib/lang.test.ts | 10 +- src/lib/lang.ts | 10 +- src/lib/locale/zh-cn.json | 2 +- src/lib/logging.ts | 69 ++++----- src/lib/userNotice.ts | 9 +- src/main.ts | 191 +++++++++++-------------- src/model/obsidianTodoTask.ts | 75 ++++++---- src/typings/obsidian-ex.d.ts | 5 +- src/utils/settingsManager.ts | 16 +-- tsconfig.json | 13 +- version-bump.mjs | 4 +- versions.json | 6 +- 31 files changed, 645 insertions(+), 575 deletions(-) create mode 100644 .prettierignore diff --git a/.github/workflows/release-v2.yml b/.github/workflows/release-v2.yml index 57bca07..ee65a00 100644 --- a/.github/workflows/release-v2.yml +++ b/.github/workflows/release-v2.yml @@ -3,7 +3,7 @@ on: push: # Sequence of patterns matched against refs/tags tags: - - "*" # Push events to matching any tag format, i.e. 1.0, 20.15.10 + - '*' # Push events to matching any tag format, i.e. 1.0, 20.15.10 jobs: build: runs-on: ubuntu-latest diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..d5cba06 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,5 @@ +node_modules +pnpm-lock.yaml +exampleVault +main.js +LICENSE.txt diff --git a/.vscode/settings.json b/.vscode/settings.json index 6d16992..e2f1d61 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,3 @@ { - "cSpell.words": [ - "msal", - "mstodo" - ] -} \ No newline at end of file + "cSpell.words": ["msal", "mstodo"] +} diff --git a/README.md b/README.md index be33ecd..0f25b53 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@ This plugin allows you to create and synchronize tasks with Microsoft To Do. ### Updating plugin - Plugin can be updated using the command palette by running the command **Check for updates to all beta plugins and UPDATE** -- Optionally, beta plugins can be configured to auto-update when starting Obsidian. This feature can be enabled in the **Obsidian42- BRAT" tab in settings. +- Optionally, beta plugins can be configured to auto-update when starting Obsidian. This feature can be enabled in the \*\*Obsidian42- BRAT" tab in settings. ## Development diff --git a/dist/manifest.json b/dist/manifest.json index cbc0000..7947f18 100644 --- a/dist/manifest.json +++ b/dist/manifest.json @@ -1,10 +1,10 @@ { - "id": "obsidian-mstodo-sync", - "name": "Microsoft To Do Sync", - "version": "1.0.1", - "minAppVersion": "0.15.0", - "description": "一款同步微软Todo的obsidian插件 | An obsidian plugin that syncs with Microsoft Todo", - "author": "Lumos", - "authorUrl": "https://obsidian.md", - "isDesktopOnly": false -} \ No newline at end of file + "id": "obsidian-mstodo-sync", + "name": "Microsoft To Do Sync", + "version": "1.0.1", + "minAppVersion": "0.15.0", + "description": "一款同步微软Todo的obsidian插件 | An obsidian plugin that syncs with Microsoft Todo", + "author": "Lumos", + "authorUrl": "https://obsidian.md", + "isDesktopOnly": false +} diff --git a/dist/styles.css b/dist/styles.css index 0220128..4f27d10 100644 --- a/dist/styles.css +++ b/dist/styles.css @@ -16,4 +16,4 @@ If your plugin does not need CSS, delete this file. justify-content: center; text-align: center; /* opacity: 0; */ -} \ No newline at end of file +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 2d36858..0d09901 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -5,25 +5,25 @@ import eslintConfigPrettier from 'eslint-config-prettier'; /** @type {import('eslint').Linter.Config[]} */ export default [ - { files: ['**/*.{js,mjs,cjs,ts}'] }, - { languageOptions: { globals: globals.browser } }, - pluginJs.configs.recommended, - ...tseslint.configs.recommended, - eslintConfigPrettier, - { - rules: { - 'no-undef': 'warn', - 'no-unused-vars': [ - 'error', - { - vars: 'all', - args: 'after-used', - caughtErrors: 'all', - ignoreRestSiblings: false, - reportUsedIgnorePattern: false, - argsIgnorePattern: '^_', - }, - ], - }, - }, + { files: ['**/*.{js,mjs,cjs,ts}'] }, + { languageOptions: { globals: globals.browser } }, + pluginJs.configs.recommended, + ...tseslint.configs.recommended, + eslintConfigPrettier, + { + rules: { + 'no-undef': 'warn', + 'no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'after-used', + caughtErrors: 'all', + ignoreRestSiblings: false, + reportUsedIgnorePattern: false, + argsIgnorePattern: '^_', + }, + ], + }, + }, ]; diff --git a/jest-setup.js b/jest-setup.js index 591ddcc..a256d9e 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -4,25 +4,25 @@ globalThis.self = globalThis.self || globalThis; class LocalStorageMock { - constructor() { - this.store = {}; - } + constructor() { + this.store = {}; + } - clear() { - this.store = {}; - } + clear() { + this.store = {}; + } - getItem(key) { - return this.store[key] || null; - } + getItem(key) { + return this.store[key] || null; + } - setItem(key, value) { - this.store[key] = String(value); - } + setItem(key, value) { + this.store[key] = String(value); + } - removeItem(key) { - delete this.store[key]; - } + removeItem(key) { + delete this.store[key]; + } } globalThis.localStorage = new LocalStorageMock(); diff --git a/jest.config.js b/jest.config.js index c76e050..877244b 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,11 +1,9 @@ module.exports = { - testEnvironment: 'node', - testMatch: ['**/src/**/*.test.js', '**/src/**/*.test.ts'], - transform: { - '^.+\\.ts$': 'ts-jest', - }, - setupFilesAfterEnv: [ - './jest-setup.js', - ], - moduleFileExtensions: ['ts', 'js', 'json', 'node'], + testEnvironment: 'node', + testMatch: ['**/src/**/*.test.js', '**/src/**/*.test.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + }, + setupFilesAfterEnv: ['./jest-setup.js'], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], }; diff --git a/manifest.json b/manifest.json index cbc0000..7947f18 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { - "id": "obsidian-mstodo-sync", - "name": "Microsoft To Do Sync", - "version": "1.0.1", - "minAppVersion": "0.15.0", - "description": "一款同步微软Todo的obsidian插件 | An obsidian plugin that syncs with Microsoft Todo", - "author": "Lumos", - "authorUrl": "https://obsidian.md", - "isDesktopOnly": false -} \ No newline at end of file + "id": "obsidian-mstodo-sync", + "name": "Microsoft To Do Sync", + "version": "1.0.1", + "minAppVersion": "0.15.0", + "description": "一款同步微软Todo的obsidian插件 | An obsidian plugin that syncs with Microsoft Todo", + "author": "Lumos", + "authorUrl": "https://obsidian.md", + "isDesktopOnly": false +} diff --git a/redirectpage.html b/redirectpage.html index f98388c..eba4f94 100644 --- a/redirectpage.html +++ b/redirectpage.html @@ -1,49 +1,46 @@ - - - ToDoObsidianRedirect - - - - - + // Helper function to parse a query string into an object + function parseQueryString(queryString) { + var params = {}; + if (queryString) { + queryString.split('&').forEach(function (pair) { + var parts = pair.split('='); + var key = decodeURIComponent(parts[0]); + var value = decodeURIComponent(parts[1] || ''); + params[key] = value; + }); + } + return params; + } + redirectTo('obsidian://adv-uri'); + + diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index 666036f..f84386a 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -9,14 +9,14 @@ class MsalNodeAuthenticationProvider implements AuthenticationProvider { /** * */ - constructor (private readonly clientProvider: MicrosoftClientProvider) { } + constructor(private readonly clientProvider: MicrosoftClientProvider) {} /** * This method will get called before every request to the msgraph server * This should return a Promise that resolves to an accessToken (in case of success) or rejects with error (in case of failure) * Basically this method will contain the implementation for getting and refreshing accessTokens */ - public async getAccessToken (): Promise { + public async getAccessToken(): Promise { return this.clientProvider.getAccessToken(); } } @@ -25,19 +25,19 @@ export class MicrosoftClientProvider { private _clientId: string; private _authority: string; - public get clientId () { + public get clientId() { return this._clientId; } - public set clientId (value: string) { + public set clientId(value: string) { this._clientId = value; } - public get authority () { + public get authority() { return this._authority; } - public set authority (value: string) { + public set authority(value: string) { this._authority = value; } @@ -48,7 +48,7 @@ export class MicrosoftClientProvider { private readonly cachePath: string; private accounts: msal.AccountInfo[] = []; - constructor (app: App) { + constructor(app: App) { this.adapter = app.vault.adapter; this.cachePath = `${app.vault.configDir}/Microsoft_cache.json`; this.app = app; @@ -57,7 +57,7 @@ export class MicrosoftClientProvider { this._authority = 'https://login.microsoftonline.com/consumers'; } - public async getClient () { + public async getClient() { const authProvider = async (callback: (argument0: string, argument1: string) => void) => { const accessToken = await this.getAccessToken(); const error = ' '; @@ -69,7 +69,7 @@ export class MicrosoftClientProvider { }); } - public async getClientWithMiddleware () { + public async getClientWithMiddleware() { const clientOptions: ClientOptions = { authProvider: new MsalNodeAuthenticationProvider(this), }; @@ -79,7 +79,7 @@ export class MicrosoftClientProvider { return client; } - public createPublicClientApplication () { + public createPublicClientApplication() { const beforeCacheAccess = async (cacheContext: msalCommon.TokenCacheContext) => { if (await this.adapter.exists(this.cachePath)) { cacheContext.tokenCache.deserialize(await this.adapter.read(this.cachePath)); @@ -108,7 +108,7 @@ export class MicrosoftClientProvider { this.pca = new msal.PublicClientApplication(config); } - public async getAccessToken () { + public async getAccessToken() { const msalCacheManager = this.pca.getTokenCache(); if (await this.adapter.exists(this.cachePath)) { msalCacheManager.deserialize(await this.adapter.read(this.cachePath)); @@ -122,10 +122,10 @@ export class MicrosoftClientProvider { return this.authByCache(this.accounts[0]); } - private async authByDevice (): Promise { + private async authByDevice(): Promise { const app = this.app; const deviceCodeRequest = { - async deviceCodeCallback (response: msalCommon.DeviceCodeResponse) { + async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); await navigator.clipboard.writeText(response.userCode); new MicrosoftAuthModal(app, response.userCode, response.verificationUri).open(); @@ -133,17 +133,19 @@ export class MicrosoftClientProvider { }, scopes: this.scopes, }; - return this.pca.acquireTokenByDeviceCode(deviceCodeRequest).then(request => request === null ? 'error' : request.accessToken); + return this.pca + .acquireTokenByDeviceCode(deviceCodeRequest) + .then((request) => (request === null ? 'error' : request.accessToken)); } - private async authByCache (account: msal.AccountInfo): Promise { + private async authByCache(account: msal.AccountInfo): Promise { const silentRequest = { account, scopes: this.scopes, }; return this.pca .acquireTokenSilent(silentRequest) - .then(request => request === null ? 'error' : request.accessToken) + .then((request) => (request === null ? 'error' : request.accessToken)) .catch(async () => this.authByDevice()); } } diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index aac0d45..d0882d9 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,4 +1,9 @@ -import { type PageCollection, RetryHandlerOptions, type Client, BatchRequestStep } from '@microsoft/microsoft-graph-client'; +import { + type PageCollection, + RetryHandlerOptions, + type Client, + BatchRequestStep, +} from '@microsoft/microsoft-graph-client'; import { type TodoTask, type TodoTaskList } from '@microsoft/microsoft-graph-types'; import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; @@ -8,7 +13,10 @@ export class TasksDeltaCollection { /** * */ - constructor (public allTasks: TodoTask[], public deltaLink: string) { } + constructor( + public allTasks: TodoTask[], + public deltaLink: string, + ) {} } export class TodoApi { @@ -17,19 +25,25 @@ export class TodoApi { private client: Client; private readonly enableRetryOptions = false; - constructor (clientProvider: MicrosoftClientProvider) { + constructor(clientProvider: MicrosoftClientProvider) { if (this.enableRetryOptions) { - clientProvider.getClientWithMiddleware().then(client => { - this.client = client; - }).catch(() => { - throw new Error(t('Notice_UnableToAcquireClient')); - }); + clientProvider + .getClientWithMiddleware() + .then((client) => { + this.client = client; + }) + .catch(() => { + throw new Error(t('Notice_UnableToAcquireClient')); + }); } else { - clientProvider.getClient().then(client => { - this.client = client; - }).catch(() => { - throw new Error(t('Notice_UnableToAcquireClient')); - }); + clientProvider + .getClient() + .then((client) => { + this.client = client; + }) + .catch(() => { + throw new Error(t('Notice_UnableToAcquireClient')); + }); } } @@ -39,11 +53,11 @@ export class TodoApi { * @param searchPattern - An optional search pattern to filter tasks within the lists. * @returns A promise that resolves to an array of `TodoTaskList` objects, each containing their respective tasks, or `undefined` if no lists are found. */ - async getLists (searchPattern?: string): Promise { + async getLists(searchPattern?: string): Promise { const endpoint = '/me/todo/lists'; const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; return Promise.all( - todoLists.map(async taskList => { + todoLists.map(async (taskList) => { try { const containedTasks = await this.getListTasks(taskList.id, searchPattern); return { @@ -72,13 +86,13 @@ export class TodoApi { * * @throws Will throw an error if the API request fails. */ - async getListIdByName (listName: string | undefined): Promise { + async getListIdByName(listName: string | undefined): Promise { if (!listName) { return; } const endpoint = '/me/todo/lists'; - const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); + const response = await this.client.api(endpoint).filter(`contains(displayName,'${listName}')`).get(); const resource: TodoTaskList[] = response.value as TodoTaskList[]; if (!resource || resource.length === 0) { return; @@ -94,7 +108,7 @@ export class TodoApi { * @param listId - The ID of the TodoTaskList to retrieve. If undefined, the function returns undefined. * @returns A promise that resolves to the TodoTaskList if found, or undefined if the listId is not provided. */ - async getList (listId: string | undefined): Promise { + async getList(listId: string | undefined): Promise { if (!listId) { return; } @@ -109,7 +123,7 @@ export class TodoApi { * @param displayName - The name to be displayed for the new task list. If undefined, the task list will not be created. * @returns A promise that resolves to the created TodoTaskList object, or undefined if the display name is not provided. */ - async createTaskList (displayName: string | undefined): Promise { + async createTaskList(displayName: string | undefined): Promise { if (!displayName) { return; } @@ -126,7 +140,7 @@ export class TodoApi { * @param searchText - Optional search text to filter the tasks. If not provided, the function will return immediately. * @returns A promise that resolves to an array of `TodoTask` objects, or undefined if the listId or searchText is not provided, or if an error occurs. */ - async getListTasks (listId: string | undefined, searchText?: string): Promise { + async getListTasks(listId: string | undefined, searchText?: string): Promise { if (!listId) { return; } @@ -140,7 +154,7 @@ export class TodoApi { .api(endpoint) .filter(searchText) .get() - .catch(error => { + .catch((error) => { this.logger.error('Failed to get tasks for list', error); throw new Error(t('Notice_UnableToAcquireTaskFromConfiguredList')); }); @@ -158,7 +172,7 @@ export class TodoApi { * @param taskId - The ID of the task to retrieve. * @returns A promise that resolves to the `TodoTask` object if found, or `undefined` if not found. */ - async getTask (listId: string, taskId: string): Promise { + async getTask(listId: string, taskId: string): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; return (await this.client .api(endpoint) @@ -168,24 +182,24 @@ export class TodoApi { /** * Retrieves the delta of tasks for a specified list. - * + * * @param listId - The ID of the task list. * @param deltaLink - The delta link to use for fetching changes. If empty, fetches all tasks. * @returns A promise that resolves to a `TasksDeltaCollection` containing the tasks and the new delta link. - * + * * @remarks * This method uses the Microsoft Graph API to fetch tasks and their changes. It handles pagination and retries. - * + * * @throws Will throw an error if the API request fails. */ - async getTasksDelta (listId: string, deltaLink: string): Promise { + async getTasksDelta(listId: string, deltaLink: string): Promise { const endpoint = deltaLink === '' ? `/me/todo/lists/${listId}/tasks/delta` : deltaLink; const allTasks: TodoTask[] = []; - let response: PageCollection = await this.client + let response: PageCollection = (await this.client .api(endpoint) .middlewareOptions([new RetryHandlerOptions(3, 3)]) - .get() as PageCollection; + .get()) as PageCollection; while (response.value.length > 0) { for (const task of response.value as TodoTask[]) { @@ -215,7 +229,7 @@ export class TodoApi { * @param toDo - The task details to be created. * @returns A promise that resolves to the created TodoTask. */ - async createTaskFromToDo (listId: string | undefined, toDo: TodoTask): Promise { + async createTaskFromToDo(listId: string | undefined, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks`; this.logger.debug('Creating task from endpoint', endpoint); const createdToDo = await this.client.api(endpoint).post(toDo); @@ -230,15 +244,19 @@ export class TodoApi { * @param toDo - The updated task details. * @returns A promise that resolves to the updated task. */ - async updateTaskFromToDo (listId: string | undefined, taskId: string, toDo: TodoTask): Promise { + async updateTaskFromToDo(listId: string | undefined, taskId: string, toDo: TodoTask): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}`; - toDo.linkedResources = undefined; return this.client.api(endpoint).patch(toDo); } - async createLinkedResource (listId: string | undefined, taskId: string, blockId: string, webUrl: string): Promise { + async createLinkedResource( + listId: string | undefined, + taskId: string, + blockId: string, + webUrl: string, + ): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources`; const updatedLinkedResource = { @@ -250,7 +268,13 @@ export class TodoApi { return this.client.api(endpoint).post(updatedLinkedResource); } - async updateLinkedResource (listId: string | undefined, taskId: string, linkedResourceId: string, blockId: string, webUrl: string): Promise { + async updateLinkedResource( + listId: string | undefined, + taskId: string, + linkedResourceId: string, + blockId: string, + webUrl: string, + ): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResourceId}`; const updatedLinkedResource = { @@ -264,5 +288,3 @@ export class TodoApi { return response; } } - - diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts index 2500bd3..043f1a1 100644 --- a/src/command/msToDoActions.ts +++ b/src/command/msToDoActions.ts @@ -10,7 +10,6 @@ import { t } from '../lib/lang.js'; import { ObsidianTodoTask } from '../model/obsidianTodoTask.js'; import { DateTime } from 'luxon'; - interface ISelection { start: EditorPosition; end?: EditorPosition; @@ -24,8 +23,11 @@ export class MsTodoActions { private todoApi: TodoApi; private plugin: MsTodoSync; - - constructor (plugin: MsTodoSync, private settingsManager: SettingsManager, todoApi: TodoApi) { + constructor( + plugin: MsTodoSync, + private settingsManager: SettingsManager, + todoApi: TodoApi, + ) { this.settings = settingsManager.settings; this.plugin = plugin; this.todoApi = todoApi; @@ -34,24 +36,22 @@ export class MsTodoActions { /** * This will get all the task updates from Microsoft To Do, then get all the block references * that exist in the vault. It will then use the cache to update all the block references. - * To ensure that the sync does not over write the following logic will be used. + * To ensure that the sync does not over write the following logic will be used. * If the modified time on the page is more recent than the remote task then the remote task will be updated. * If the remote task is more recent than the page then the local task will be updated. * If the remote task properties and the local task properties are the same then no update will occur. * If a local task is on one ore more pages then the most recently modified page will be * classed as the source of truth. */ - public async syncVault (listId: string | undefined) { - - - // Get all the blocks in the vault. + public async syncVault(listId: string | undefined) { + // Get all the blocks in the vault. const blockCache = this.getAllVaultBlocks(); - this.logger.info(`Blocks found in vault: ${Object.keys(blockCache).length}`) + this.logger.info(`Blocks found in vault: ${Object.keys(blockCache).length}`); // Get the local task that is most recent in the case there are duplicate IDs in the vault. // The key is in the format of cacheKey-blockId. So need to pull the blockId from the key. - const localTasks: Record = {}; + const localTasks: Record = {}; for (const key in blockCache) { if (Object.hasOwn(blockCache, key)) { const internalPageHash = key.split('-')[0]; @@ -61,14 +61,24 @@ export class MsTodoActions { // If the localTasks contains the block id as key, check the value // and update if the mtime is more recent. if (localTasks[blockId] && localTasks[blockId].mtime < mtime) { - localTasks[blockId] = { mtime, pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block }; + localTasks[blockId] = { + mtime, + pageHash: internalPageHash, + pagePath: blockCache[key].pagePath, + block: blockCache[key].block, + }; } else { - localTasks[blockId] = { mtime, pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block }; + localTasks[blockId] = { + mtime, + pageHash: internalPageHash, + pagePath: blockCache[key].pagePath, + block: blockCache[key].block, + }; } } } - this.logger.info(`Local Tasks: ${Object.keys(localTasks).length}`) + this.logger.info(`Local Tasks: ${Object.keys(localTasks).length}`); // Get all the tasks from the cache. await this.getTaskDelta(listId, false); @@ -79,75 +89,112 @@ export class MsTodoActions { return; } - this.logger.info(`Remote Tasks: ${cachedTasksDelta.allTasks.length}`) - this.logger.info(`Lookups in settings: ${Object.keys(this.plugin.settings.taskIdLookup).length}`) + this.logger.info(`Remote Tasks: ${cachedTasksDelta.allTasks.length}`); + this.logger.info(`Lookups in settings: ${Object.keys(this.plugin.settings.taskIdLookup).length}`); // Iterate over all the tasks in internal cache and update the block references. let updatedTasks = 0; for (const blockId in this.plugin.settings.taskIdLookup) { const taskId = this.settingsManager.getTaskIdFromBlockId(blockId); - const cachedTask = cachedTasksDelta.allTasks.find(task => task.id === taskId); + const cachedTask = cachedTasksDelta.allTasks.find((task) => task.id === taskId); const localTask = localTasks[blockId.toLowerCase()]; if (cachedTask && localTask && cachedTask.lastModifiedDateTime) { // If the local task is more recent than the remote task then update the remote task. if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { - // Update the remote task with the local task. - // Get the string from the page using the start and end provided by the block. + // Get the string from the page using the start and end provided by the block. const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; if (block) { const adapter: DataAdapter = this.plugin.app.vault.adapter; - const pageContent = await adapter.read(localTask.pagePath) - const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) + const pageContent = await adapter.read(localTask.pagePath); + const taskContent = pageContent.slice( + localTask.block.position.start.offset, + localTask.block.position.end.offset, + ); const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); const titleMatch = internalTask.title === cachedTask.title; const statusMatch = internalTask.status === cachedTask.status; - const localDueDate = internalTask.dueDateTime === undefined ? undefined : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { zone: internalTask.dueDateTime?.timeZone ?? 'utc' }) - const remoteDueDate = cachedTask.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const localDueDate = + internalTask.dueDateTime === undefined + ? undefined + : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { + zone: internalTask.dueDateTime?.timeZone ?? 'utc', + }); + const remoteDueDate = + cachedTask.dueDateTime === undefined + ? undefined + : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { + zone: cachedTask.dueDateTime?.timeZone ?? 'utc', + }); const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); const importanceMatch = internalTask.importance === cachedTask.importance; if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { this.logger.info(`Local Newer: ${blockId}`, { cachedTask, localTask, taskContent }); - this.logger.info(`Updating Task: ${blockId}`, { titleMatch, statusMatch, dueDateTimeMatch, importanceMatch }); + this.logger.info(`Updating Task: ${blockId}`, { + titleMatch, + statusMatch, + dueDateTimeMatch, + importanceMatch, + }); if (!dueDateTimeMatch) { this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); } - const returnedTask = await this.todoApi.updateTaskFromToDo(listId, internalTask.id, internalTask.getTodoTask()); + const returnedTask = await this.todoApi.updateTaskFromToDo( + listId, + internalTask.id, + internalTask.getTodoTask(), + ); this.logger.info(`Updated Task last mod: ${returnedTask.lastModifiedDateTime}`); updatedTasks++; } - } else { this.logger.info(`Block not found in vault: ${blockId}`); } } else { const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; if (block) { - const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath) + const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); if (vaultFileReference) { - - this.plugin.app.vault.read(vaultFileReference) - const pageContent = await this.plugin.app.vault.read(vaultFileReference) - const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) + this.plugin.app.vault.read(vaultFileReference); + const pageContent = await this.plugin.app.vault.read(vaultFileReference); + const taskContent = pageContent.slice( + localTask.block.position.start.offset, + localTask.block.position.end.offset, + ); const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); const titleMatch = internalTask.title === cachedTask.title; const statusMatch = internalTask.status === cachedTask.status; - const localDueDate = internalTask.dueDateTime === undefined ? undefined : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { zone: internalTask.dueDateTime?.timeZone ?? 'utc' }) - const remoteDueDate = cachedTask.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const localDueDate = + internalTask.dueDateTime === undefined + ? undefined + : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { + zone: internalTask.dueDateTime?.timeZone ?? 'utc', + }); + const remoteDueDate = + cachedTask.dueDateTime === undefined + ? undefined + : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { + zone: cachedTask.dueDateTime?.timeZone ?? 'utc', + }); const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); const importanceMatch = internalTask.importance === cachedTask.importance; if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { this.logger.info(`Remote Newer: ${blockId}`, { cachedTask, localTask, taskContent }); - this.logger.info(`Updating Task: ${blockId}`, { titleMatch, statusMatch, dueDateTimeMatch, importanceMatch }); + this.logger.info(`Updating Task: ${blockId}`, { + titleMatch, + statusMatch, + dueDateTimeMatch, + importanceMatch, + }); if (!dueDateTimeMatch) { this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); @@ -157,22 +204,22 @@ export class MsTodoActions { const updatedTask = internalTask.getMarkdownTask(true); await this.plugin.app.vault.process(vaultFileReference, (data) => { - const newPageContent = data.substring(0, localTask.block.position.start.offset) + updatedTask + data.substring(localTask.block.position.end.offset); + const newPageContent = + data.substring(0, localTask.block.position.start.offset) + + updatedTask + + data.substring(localTask.block.position.end.offset); this.logger.info(`Updating Task ID: ${blockId}`, newPageContent); return newPageContent; }); updatedTasks++; } } - } else { this.logger.info(`Block not found in vault: ${blockId}`); } } } else { - this.logger.info(`Task not found in remote cache: ${blockId}`); - } // if (Object.hasOwn(this.plugin.settings.taskIdLookup, blockId)) { @@ -183,7 +230,7 @@ export class MsTodoActions { // // If the local task is more recent than the remote task then update the remote task. // if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { // // Update the remote task with the local task. - // // Get the string from the page using the start and end provided by the block. + // // Get the string from the page using the start and end provided by the block. // const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; // if (block) { // const adapter: DataAdapter = this.plugin.app.vault.adapter; @@ -211,8 +258,6 @@ export class MsTodoActions { } this.logger.info(`Updated Tasks: ${updatedTasks}`); - - } /** @@ -223,7 +268,7 @@ export class MsTodoActions { * * @param editor - The editor instance where the cursor is located. */ - public viewTaskInTodo (editor: Editor) { + public viewTaskInTodo(editor: Editor) { const cursorLocation = editor.getCursor(); const line = editor.getLine(cursorLocation.line); const taskId = this.getTaskIdFromLine(line, this.plugin); @@ -236,7 +281,7 @@ export class MsTodoActions { } } - public async cleanupCachedTaskIds () { + public async cleanupCachedTaskIds() { // Collect all the blocks and ids from the metadata cache under the app. const blockCache: Record = this.populateBlockCache(); @@ -259,8 +304,8 @@ export class MsTodoActions { } else { this.logger.info(`Block not found in metadata cache: ${blockId}`); // Clean up the block id from the settings. - delete this.settings.taskIdLookup[blockId]; - await this.settingsManager.saveSettings(); + delete this.settings.taskIdLookup[blockId]; + await this.settingsManager.saveSettings(); } } } @@ -274,7 +319,7 @@ export class MsTodoActions { * @param {MsTodoSync} plugin * @return {*} {Record} */ - private populateBlockCache (): Record { + private populateBlockCache(): Record { const blockCache: Record = {}; const internalMetadataCache = this.plugin.app.metadataCache.metadataCache; for (const cacheKey in internalMetadataCache) { @@ -292,8 +337,11 @@ export class MsTodoActions { return blockCache; } - private getAllVaultBlocks (): Record { - const blockCache: Record = {}; + private getAllVaultBlocks(): Record< + string, + { mtime: number; pageHash: string; pagePath: string; block: BlockCache } + > { + const blockCache: Record = {}; const internalMetadataCache = this.plugin.app.metadataCache.metadataCache; for (const cacheKey in internalMetadataCache) { if (Object.hasOwn(internalMetadataCache, cacheKey) && internalMetadataCache[cacheKey].blocks) { @@ -302,7 +350,12 @@ export class MsTodoActions { for (const blockKey in blocksCache) { if (Object.hasOwn(internalMetadataCache, cacheKey)) { const block = blocksCache[blockKey.toLowerCase()]; - blockCache[`${cacheKey}-${blockKey.toLowerCase()}`] = { mtime: file?.value.mtime ?? 0, pageHash: cacheKey, pagePath: file?.key ?? '', block }; + blockCache[`${cacheKey}-${blockKey.toLowerCase()}`] = { + mtime: file?.value.mtime ?? 0, + pageHash: cacheKey, + pagePath: file?.key ?? '', + block, + }; } } } @@ -312,10 +365,10 @@ export class MsTodoActions { } // Function to find the key and value by a sub-property of the value - private findBySubProperty, K extends keyof T[keyof T]> ( + private findBySubProperty, K extends keyof T[keyof T]>( record: T, subProperty: K, - value: T[keyof T][K] + value: T[keyof T][K], ): { key: string; value: T[keyof T] } | undefined { const entry = Object.entries(record).find(([_, v]) => v[subProperty] === value); return entry ? { key: entry[0], value: entry[1] } : undefined; @@ -333,12 +386,7 @@ export class MsTodoActions { * * @returns A promise that resolves when the tasks have been posted and the file has been modified. */ - public async postTask ( - listId: string | undefined, - editor: Editor, - fileName: string | undefined, - replace?: boolean, - ) { + public async postTask(listId: string | undefined, editor: Editor, fileName: string | undefined, replace?: boolean) { const logger = logging.getLogger('mstodo-sync.command.post'); if (!listId) { @@ -353,7 +401,6 @@ export class MsTodoActions { this.userNotice.showMessage(t('CommandNotice_CreatingToDo'), 3000); - const source = await this.plugin.app.vault.read(activeFile); const { lines } = await this.getCurrentLinesFromEditor(editor); @@ -378,25 +425,44 @@ export class MsTodoActions { if (todo.hasBlockLink && todo.hasId) { logger.debug(`Updating Task: ${todo.title}`); - - // Check for linked resource and update if there otherwise create. const cachedTasksDelta = await this.getDeltaCache(); - const cachedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + const cachedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); const titleMatch = todo.title === cachedTask?.title; const statusMatch = todo.status === cachedTask?.status; - const localDueDate = todo.dueDateTime === undefined ? undefined : DateTime.fromISO(todo.dueDateTime?.dateTime ?? '', { zone: todo.dueDateTime?.timeZone ?? 'utc' }) - const remoteDueDate = cachedTask?.dueDateTime === undefined ? undefined : DateTime.fromISO(cachedTask?.dueDateTime?.dateTime ?? '', { zone: cachedTask.dueDateTime?.timeZone ?? 'utc' }) + const localDueDate = + todo.dueDateTime === undefined + ? undefined + : DateTime.fromISO(todo.dueDateTime?.dateTime ?? '', { + zone: todo.dueDateTime?.timeZone ?? 'utc', + }); + const remoteDueDate = + cachedTask?.dueDateTime === undefined + ? undefined + : DateTime.fromISO(cachedTask?.dueDateTime?.dateTime ?? '', { + zone: cachedTask.dueDateTime?.timeZone ?? 'utc', + }); const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); const importanceMatch = todo.importance === cachedTask?.importance; if (cachedTask && (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch)) { const linkedResource = cachedTask.linkedResources?.first(); if (linkedResource && linkedResource.id) { - await this.todoApi.updateLinkedResource(listId, todo.id, linkedResource.id, todo.blockLink ?? '', todo.getRedirectUrl()); + await this.todoApi.updateLinkedResource( + listId, + todo.id, + linkedResource.id, + todo.blockLink ?? '', + todo.getRedirectUrl(), + ); } else { - await this.todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.getRedirectUrl()); + await this.todoApi.createLinkedResource( + listId, + todo.id, + todo.blockLink ?? '', + todo.getRedirectUrl(), + ); } } @@ -431,10 +497,7 @@ export class MsTodoActions { await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } - public async getTask ( - listId: string | undefined, - editor: Editor, - ) { + public async getTask(listId: string | undefined, editor: Editor) { const logger = logging.getLogger('mstodo-sync.command.get'); if (!listId) { @@ -475,7 +538,7 @@ export class MsTodoActions { // Load from the delta cache file and pull the task from the cache. const cachedTasksDelta = await this.getDeltaCache(); - const returnedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + const returnedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); if (returnedTask) { todo.updateFromTodoTask(returnedTask); @@ -493,8 +556,7 @@ export class MsTodoActions { await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } - - private async getDeltaCache () { + private async getDeltaCache() { const cachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; const adapter: DataAdapter = this.plugin.app.vault.adapter; let cachedTasksDelta: TasksDeltaCollection | undefined; @@ -506,10 +568,7 @@ export class MsTodoActions { return cachedTasksDelta; } - private async getTaskDelta ( - listId: string | undefined, - reset = false, - ) { + private async getTaskDelta(listId: string | undefined, reset = false) { const logger = logging.getLogger('mstodo-sync.command.delta'); if (!listId) { @@ -554,15 +613,18 @@ export class MsTodoActions { } // Function to merge collections - private mergeCollections (col1: TodoTask[], col2: TodoTask[]): TodoTask[] { + private mergeCollections(col1: TodoTask[], col2: TodoTask[]): TodoTask[] { const map = new Map(); // Helper function to add items to the map - function addToMap (item: TodoTask) { + function addToMap(item: TodoTask) { if (item.id && item.lastModifiedDateTime) { const existingItem = map.get(item.id); // If there is no last modified then just use the current item. - if (!existingItem || new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0)) { + if ( + !existingItem || + new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0) + ) { map.set(item.id, item); } } @@ -590,7 +652,7 @@ export class MsTodoActions { * - `end`: The ending position of the cursor or selection. * - `lines`: An array of line numbers that are currently selected or where the cursor is located. */ - private async getCurrentLinesFromEditor (editor: Editor): Promise { + private async getCurrentLinesFromEditor(editor: Editor): Promise { this.logger.info('Getting current lines from editor', { from: editor.getCursor('from'), to: editor.getCursor('to'), @@ -625,7 +687,7 @@ export class MsTodoActions { }; } - private getTaskIdFromLine (line: string, plugin: MsTodoSync): string { + private getTaskIdFromLine(line: string, plugin: MsTodoSync): string { const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blocklistMatch = regex.exec(line.trim()); if (blocklistMatch) { diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 5398df9..663621e 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -1,7 +1,4 @@ -import { - type BlockCache, - type DataAdapter, type Editor, type EditorPosition, MarkdownView, -} from 'obsidian'; +import { type BlockCache, type DataAdapter, type Editor, type EditorPosition, MarkdownView } from 'obsidian'; import { ObsidianTodoTask } from 'src/model/obsidianTodoTask.js'; import { type TodoTask } from '@microsoft/microsoft-graph-types'; import { type SettingsManager } from 'src/utils/settingsManager.js'; @@ -12,10 +9,9 @@ import { t } from '../lib/lang.js'; import { log, logging } from '../lib/logging.js'; import { UserNotice } from 'src/lib/userNotice.js'; - const userNotice = new UserNotice(); -export function getTaskIdFromLine (line: string, plugin: MsTodoSync): string { +export function getTaskIdFromLine(line: string, plugin: MsTodoSync): string { const regex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blocklistMatch = regex.exec(line.trim()); if (blocklistMatch) { @@ -43,14 +39,14 @@ interface ISelection { * - `end`: The ending position of the cursor or selection. * - `lines`: An array of line numbers that are currently selected or where the cursor is located. */ -export async function getCurrentLinesFromEditor (editor: Editor): Promise { - log( - 'info', - 'Getting current lines from editor', - { - from: editor.getCursor('from'), to: editor.getCursor('to'), anchor: editor.getCursor('anchor'), head: editor.getCursor('head'), general: editor.getCursor(), - }, - ); +export async function getCurrentLinesFromEditor(editor: Editor): Promise { + log('info', 'Getting current lines from editor', { + from: editor.getCursor('from'), + to: editor.getCursor('to'), + anchor: editor.getCursor('anchor'), + head: editor.getCursor('head'), + general: editor.getCursor(), + }); // Const activeFile = this.app.workspace.getActiveFile(); // const source = await this.app.vault.read(activeFile); @@ -78,9 +74,7 @@ export async function getCurrentLinesFromEditor (editor: Editor): Promise} */ -function populateBlockCache (plugin: MsTodoSync): Record { +function populateBlockCache(plugin: MsTodoSync): Record { const blockCache: Record = {}; const internalMetadataCache = plugin.app.metadataCache.metadataCache; for (const cacheKey in internalMetadataCache) { @@ -150,7 +144,7 @@ function populateBlockCache (plugin: MsTodoSync): Record { * * @returns A promise that resolves when the tasks have been posted and the file has been modified. */ -export async function postTask ( +export async function postTask( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -198,13 +192,24 @@ export async function postTask ( // Check for linked resource and update if there otherwise create. const cachedTasksDelta = await getDeltaCache(plugin); - const cachedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + const cachedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); if (cachedTask) { const linkedResource = cachedTask.linkedResources?.first(); if (linkedResource && linkedResource.id) { - await todoApi.updateLinkedResource(listId, todo.id, linkedResource.id, todo.blockLink ?? '', todo.getRedirectUrl()); + await todoApi.updateLinkedResource( + listId, + todo.id, + linkedResource.id, + todo.blockLink ?? '', + todo.getRedirectUrl(), + ); } else { - await todoApi.createLinkedResource(listId, todo.id, todo.blockLink ?? '', todo.getRedirectUrl()); + await todoApi.createLinkedResource( + listId, + todo.id, + todo.blockLink ?? '', + todo.getRedirectUrl(), + ); } } @@ -236,7 +241,7 @@ export async function postTask ( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } -export async function getTask ( +export async function getTask( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -283,7 +288,7 @@ export async function getTask ( // Load from the delta cache file and pull the task from the cache. const cachedTasksDelta = await getDeltaCache(plugin); - const returnedTask = cachedTasksDelta?.allTasks.find(task => task.id === todo.id); + const returnedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); if (returnedTask) { todo.updateFromTodoTask(returnedTask); @@ -301,7 +306,7 @@ export async function getTask ( await plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } -async function getDeltaCache (plugin: MsTodoSync) { +async function getDeltaCache(plugin: MsTodoSync) { const cachePath = `${plugin.app.vault.configDir}/mstd-tasks-delta.json`; const adapter: DataAdapter = plugin.app.vault.adapter; let cachedTasksDelta: TasksDeltaCollection | undefined; @@ -313,12 +318,7 @@ async function getDeltaCache (plugin: MsTodoSync) { return cachedTasksDelta; } -export async function getTaskDelta ( - todoApi: TodoApi, - listId: string | undefined, - plugin: MsTodoSync, - reset = false, -) { +export async function getTaskDelta(todoApi: TodoApi, listId: string | undefined, plugin: MsTodoSync, reset = false) { const logger = logging.getLogger('mstodo-sync.command.delta'); if (!listId) { @@ -363,15 +363,18 @@ export async function getTaskDelta ( } // Function to merge collections -function mergeCollections (col1: TodoTask[], col2: TodoTask[]): TodoTask[] { +function mergeCollections(col1: TodoTask[], col2: TodoTask[]): TodoTask[] { const map = new Map(); // Helper function to add items to the map - function addToMap (item: TodoTask) { + function addToMap(item: TodoTask) { if (item.id && item.lastModifiedDateTime) { const existingItem = map.get(item.id); // If there is no last modified then just use the current item. - if (!existingItem || new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0)) { + if ( + !existingItem || + new Date(item.lastModifiedDateTime) > new Date(existingItem.lastModifiedDateTime ?? 0) + ) { map.set(item.id, item); } } @@ -405,7 +408,7 @@ function mergeCollections (col1: TodoTask[], col2: TodoTask[]): TodoTask[] { // Lines are processed until the next line is blank or not indented by two spaces. // Also EOF will stop processing. // Allow variable depth or match column of first [ -export async function postTaskAndChildren ( +export async function postTaskAndChildren( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -504,21 +507,21 @@ export async function postTaskAndChildren ( editor.replaceRange(todo.getMarkdownTask(false), start, end); } -function getLineStartPos (line: number): EditorPosition { +function getLineStartPos(line: number): EditorPosition { return { line, ch: 0, }; } -function getLineEndPos (line: number, editor: Editor): EditorPosition { +function getLineEndPos(line: number, editor: Editor): EditorPosition { return { line, ch: editor.getLine(line).length, }; } -export async function getAllTasksInList ( +export async function getAllTasksInList( todoApi: TodoApi, listId: string | undefined, editor: Editor, @@ -539,14 +542,15 @@ export async function getAllTasksInList ( cachedTasksDelta?.allTasks.sort((a, b) => (a.status === 'completed' ? 1 : -1)); - const lines = cachedTasksDelta?.allTasks?.filter(task => task.status !== 'completed') - .map(task => { + const lines = cachedTasksDelta?.allTasks + ?.filter((task) => task.status !== 'completed') + .map((task) => { const formattedCreateDate = globalThis .moment(task.createdDateTime) .format(settings.displayOptions_DateFormat); const done = task.status === 'completed' ? 'x' : ' '; - const createDate - = formattedCreateDate === now.format(settings.displayOptions_DateFormat) + const createDate = + formattedCreateDate === now.format(settings.displayOptions_DateFormat) ? '' : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; @@ -588,13 +592,13 @@ export async function getAllTasksInList ( } /** - * Cache the ID internally and generate block link. - * - * @param {string} [id] - * @return {*} {Promise} - * @memberof ObsidianTodoTask - */ -async function cacheTaskId (id: string, settingsManager: SettingsManager): Promise { + * Cache the ID internally and generate block link. + * + * @param {string} [id] + * @return {*} {Promise} + * @memberof ObsidianTodoTask + */ +async function cacheTaskId(id: string, settingsManager: SettingsManager): Promise { settingsManager.settings.taskIdIndex += 1; const index = `MSTD${Math.random().toString(20).slice(2, 6)}${settingsManager.settings.taskIdIndex @@ -603,18 +607,18 @@ async function cacheTaskId (id: string, settingsManager: SettingsManager): Promi settingsManager.settings.taskIdLookup[index] = id ?? ''; - settingsManager.saveSettings().catch(error => { + settingsManager.saveSettings().catch((error) => { console.error('Error saving settings', error); }); return index; } -function stripHtml (html: string): string { +function stripHtml(html: string): string { return html.replaceAll(/<[^>]*>/g, ''); } -export async function createTodayTasks (todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { +export async function createTodayTasks(todoApi: TodoApi, settings: IMsTodoSyncSettings, editor?: Editor) { userNotice.showMessage('Getting Microsoft To Do tasks for today', 3000); const now = globalThis.moment(); const pattern = `status ne 'completed' or completedDateTime/dateTime ge '${now.format('yyyy-MM-DD')}'`; @@ -625,19 +629,19 @@ export async function createTodayTasks (todoApi: TodoApi, settings: IMsTodoSyncS } const segments = taskLists - .map(taskList => { + .map((taskList) => { if (!taskList.tasks || taskList.tasks.length === 0) { return; } taskList.tasks.sort((a, b) => (a.status == 'completed' ? 1 : -1)); - const lines = taskList.tasks?.map(task => { + const lines = taskList.tasks?.map((task) => { const formattedCreateDate = globalThis .moment(task.createdDateTime) .format(settings.displayOptions_DateFormat); const done = task.status == 'completed' ? 'x' : ' '; - const createDate - = formattedCreateDate == now.format(settings.displayOptions_DateFormat) + const createDate = + formattedCreateDate == now.format(settings.displayOptions_DateFormat) ? '' : `${settings.displayOptions_TaskCreatedPrefix}[[${formattedCreateDate}]]`; const body = task.body?.content ? `${settings.displayOptions_TaskBodyPrefix}${task.body.content}` : ''; @@ -648,7 +652,7 @@ export async function createTodayTasks (todoApi: TodoApi, settings: IMsTodoSyncS ${lines?.join('\n')} `; }) - .filter(s => s != undefined) + .filter((s) => s != undefined) .join('\n\n'); if (editor) { diff --git a/src/gui/microsoftAuthModal.ts b/src/gui/microsoftAuthModal.ts index a6b9276..ca2f34f 100644 --- a/src/gui/microsoftAuthModal.ts +++ b/src/gui/microsoftAuthModal.ts @@ -2,11 +2,15 @@ import { type App, Modal } from 'obsidian'; import { t } from '../lib/lang.js'; export class MicrosoftAuthModal extends Modal { - constructor (app: App, private readonly deviceCode: string, private readonly authUrl: string) { + constructor( + app: App, + private readonly deviceCode: string, + private readonly authUrl: string, + ) { super(app); } - onOpen (): void { + onOpen(): void { const { contentEl } = this; contentEl.empty(); @@ -21,7 +25,7 @@ export class MicrosoftAuthModal extends Modal { contentEl.createEl('hr'); } - onClose (): void { + onClose(): void { const { contentEl } = this; contentEl.empty(); } diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 7afd37e..85f9412 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,6 +1,4 @@ -import { - type App, PeriodicNotes, PluginSettingTab, Setting, -} from 'obsidian'; +import { type App, PeriodicNotes, PluginSettingTab, Setting } from 'obsidian'; import type MsTodoSync from '../main.js'; import { t } from '../lib/lang.js'; import { type ILogOptions } from '../lib/logging.js'; @@ -99,7 +97,6 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { microsoft_AuthenticationAuthority: '', hackingEnabled: false, microsoftToDoApplication_RedirectUriBase: 'http://192.168.0.137:8901/redirectpage.html', - }; export class MsTodoSyncSettingTab extends PluginSettingTab { @@ -107,7 +104,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { settings: IMsTodoSyncSettings; userNotice: IUserNotice; - constructor (app: App, plugin: MsTodoSync, userNotice: IUserNotice) { + constructor(app: App, plugin: MsTodoSync, userNotice: IUserNotice) { super(app, plugin); this.plugin = plugin; this.settings = plugin.settings; @@ -126,7 +123,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { * @param {(value: string) => unknown} changeCallback * @memberof MsTodoSyncSettingTab */ - addTextSetting ( + addTextSetting( containerElement: HTMLElement, title: string, description: string, @@ -136,15 +133,15 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerElement) .setName(t(title)) .setDesc(t(description)) - .addText(text => - text.setValue(currentValue).onChange(async value => { + .addText((text) => + text.setValue(currentValue).onChange(async (value) => { changeCallback(value); await this.plugin.saveSettings(); }), ); } - display (): void { + display(): void { const { containerEl } = this; containerEl.empty(); @@ -159,11 +156,11 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_DefaultListName')) .setDesc(t('Settings_Todo_DefaultListNameDescription')) - .addText(text => + .addText((text) => text // .setPlaceholder('输入Todo列表名称') .setValue(this.settings.todoListSync.listName ?? '') - .onChange(async value => { + .onChange(async (value) => { this.settings.todoListSync.listName = value; }), ); @@ -171,8 +168,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_OpenUsingApplicationProtocolTitle')) .setDesc(t('Settings_Todo_OpenUsingApplicationProtocolDescription')) - .addToggle(toggle => - toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async value => { + .addToggle((toggle) => + toggle.setValue(this.settings.todo_OpenUsingApplicationProtocol).onChange(async (value) => { this.settings.todo_OpenUsingApplicationProtocol = value; await this.plugin.saveSettings(); }), @@ -186,8 +183,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_Display_DateFormat')) .setDesc(t('Settings_Todo_Display_DateFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async value => { + .addText((text) => + text.setValue(this.settings.displayOptions_DateFormat ?? '').onChange(async (value) => { this.settings.displayOptions_DateFormat = value; await this.plugin.saveSettings(); }), @@ -196,8 +193,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_Display_TimeFormat')) .setDesc(t('Settings_Todo_Display_TimeFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async value => { + .addText((text) => + text.setValue(this.settings.displayOptions_TimeFormat ?? '').onChange(async (value) => { this.settings.displayOptions_TimeFormat = value; await this.plugin.saveSettings(); }), @@ -208,7 +205,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_RegExToRunOnPushAgainstTitle', 'Settings_Todo_Display_RegExToRunOnPushAgainstTitle_Description', this.settings.displayOptions_RegExToRunOnPushAgainstTitle, - async value => { + async (value) => { this.settings.displayOptions_RegExToRunOnPushAgainstTitle = value; }, ); @@ -216,8 +213,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_Display_AddCreatedAtOnReplace')) .setDesc(t('Settings_Todo_Display_AddCreatedAtOnReplaceDescription')) - .addToggle(toggle => - toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async value => { + .addToggle((toggle) => + toggle.setValue(this.settings.displayOptions_ReplaceAddCreatedAt).onChange(async (value) => { this.settings.displayOptions_ReplaceAddCreatedAt = value; await this.plugin.saveSettings(); }), @@ -227,8 +224,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_Todo_Display_ReplacementFormat')) .setDesc(t('Settings_Todo_Display_ReplacementFormatDescription')) - .addText(text => - text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async value => { + .addText((text) => + text.setValue(this.settings.displayOptions_ReplacementFormat).onChange(async (value) => { this.settings.displayOptions_ReplacementFormat = value; await this.plugin.saveSettings(); }), @@ -240,7 +237,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Importance_HighName', 'Settings_Todo_Display_Importance_HighDescription', this.settings.displayOptions_TaskImportance_High, - async value => { + async (value) => { this.settings.displayOptions_TaskImportance_High = value; }, ); @@ -251,7 +248,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Importance_NormalName', 'Settings_Todo_Display_Importance_NormalDescription', this.settings.displayOptions_TaskImportance_Normal, - async value => { + async (value) => { this.settings.displayOptions_TaskImportance_Normal = value; }, ); @@ -262,7 +259,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Importance_LowName', 'Settings_Todo_Display_Importance_LowDescription', this.settings.displayOptions_TaskImportance_Low, - async value => { + async (value) => { this.settings.displayOptions_TaskImportance_Low = value; }, ); @@ -273,7 +270,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Status_NotStartedName', 'Settings_Todo_Display_Status_NotStartedDescription', this.settings.displayOptions_TaskStatus_NotStarted, - async value => { + async (value) => { this.settings.displayOptions_TaskStatus_NotStarted = value; }, ); @@ -282,7 +279,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Status_InProgressName', 'Settings_Todo_Display_Status_InProgressDescription', this.settings.displayOptions_TaskStatus_InProgress, - async value => { + async (value) => { this.settings.displayOptions_TaskStatus_InProgress = value; }, ); @@ -291,16 +288,15 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Todo_Display_Status_CompletedName', 'Settings_Todo_Display_Status_CompletedDescription', this.settings.displayOptions_TaskStatus_Completed, - async value => { + async (value) => { this.settings.displayOptions_TaskStatus_Completed = value; }, ); if (this.app.plugins.enabledPlugins.has('periodic-notes')) { - containerEl.createEl('h2', { text: t('Settings_JournalFormatting') }); - new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle(toggle => - toggle.setValue(this.settings.diary.stayWithPN).onChange(async value => { + new Setting(containerEl).setName(t('Settings_JournalFormatting_PeriodicNotes')).addToggle((toggle) => + toggle.setValue(this.settings.diary.stayWithPN).onChange(async (value) => { if (value) { const periodicNotesSettings = this.app.plugins.plugins['periodic-notes'] as PeriodicNotes; if (periodicNotesSettings) { @@ -327,14 +323,16 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { const dateFormat = new Setting(containerEl) .setName(t('Settings_JournalFormatting_DateFormat')) .setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' }`, ) - .addText(text => - text.setValue(this.settings.diary.format).onChange(async value => { + .addText((text) => + text.setValue(this.settings.diary.format).onChange(async (value) => { this.settings.diary.format = value; dateFormat.setDesc( - `${t('Settings_JournalFormatting_DateFormatDescription')} ${this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' + `${t('Settings_JournalFormatting_DateFormatDescription')} ${ + this.settings.diary.format ? globalThis.moment().format(this.settings.diary.format) : '' }`, ); await this.plugin.saveSettings(); @@ -345,8 +343,8 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { new Setting(containerEl) .setName(t('Settings_JournalFormatting_Folder')) .setDesc(t('Settings_JournalFormatting_FolderDescription')) - .addText(text => - text.setValue(this.settings.diary.folder).onChange(async value => { + .addText((text) => + text.setValue(this.settings.diary.folder).onChange(async (value) => { this.settings.diary.format = value; await this.plugin.saveSettings(); }), @@ -366,7 +364,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Authentication_ClientId', 'Settings_Authentication_ClientId_Description', this.settings.microsoft_AuthenticationClientId, - async value => { + async (value) => { this.settings.microsoft_AuthenticationClientId = value; }, ); @@ -376,7 +374,7 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_Authentication_ClientId', 'Settings_Authentication_ClientId_Description', this.settings.microsoft_AuthenticationClientId, - async value => { + async (value) => { this.settings.microsoft_AuthenticationClientId = value; }, ); @@ -394,14 +392,13 @@ export class MsTodoSyncSettingTab extends PluginSettingTab { 'Settings_NativeApp_RedirectUriBase', 'Settings_NativeApp_RedirectUriBase_Description', this.settings.microsoftToDoApplication_RedirectUriBase, - async value => { + async (value) => { this.settings.microsoftToDoApplication_RedirectUriBase = value; }, ); - } - async hide () { + async hide() { const listName = this.settings.todoListSync.listName; if (this.settings.todoListSync.listId !== undefined || !listName) { diff --git a/src/lib/ActionQueue.ts b/src/lib/ActionQueue.ts index 2274451..908ecab 100644 --- a/src/lib/ActionQueue.ts +++ b/src/lib/ActionQueue.ts @@ -3,18 +3,18 @@ export class ActionQueue { private delay: number; private isProcessing: boolean = false; - constructor (delay: number) { + constructor(delay: number) { this.delay = delay; } - public addAction (action: () => Promise): void { + public addAction(action: () => Promise): void { this.queue.push(action); if (!this.isProcessing) { this.processQueue(); } } - private async processQueue (): Promise { + private async processQueue(): Promise { this.isProcessing = true; while (this.queue.length > 0) { const action = this.queue.shift(); @@ -26,7 +26,7 @@ export class ActionQueue { this.isProcessing = false; } - private sleep (ms: number): Promise { - return new Promise(resolve => setTimeout(resolve, ms)); + private sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); } } diff --git a/src/lib/CaseInsensitiveRecord.ts b/src/lib/CaseInsensitiveRecord.ts index ff42d1d..c483072 100644 --- a/src/lib/CaseInsensitiveRecord.ts +++ b/src/lib/CaseInsensitiveRecord.ts @@ -1,27 +1,27 @@ export class CaseInsensitiveRecord { private record: Record = {}; - set (key: string, value: T): void { + set(key: string, value: T): void { this.record[key.toLowerCase()] = value; } - get (key: string): T | undefined { + get(key: string): T | undefined { return this.record[key.toLowerCase()]; } - has (key: string): boolean { + has(key: string): boolean { return key.toLowerCase() in this.record; } - delete (key: string): void { + delete(key: string): void { delete this.record[key.toLowerCase()]; } - keys (): string[] { + keys(): string[] { return Object.keys(this.record); } - values (): T[] { + values(): T[] { return Object.values(this.record); } } diff --git a/src/lib/lang.test.ts b/src/lib/lang.test.ts index a9b665c..2974191 100644 --- a/src/lib/lang.test.ts +++ b/src/lib/lang.test.ts @@ -1,10 +1,9 @@ import { t } from './lang'; -const mockedLangMap = '{"en": { "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard" }, "zh": { "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板" }}'; - +const mockedLangMap = + '{"en": { "Notice_DeviceCodeCopiedToClipboard": "The device code has been copied to the clipboard" }, "zh": { "Notice_DeviceCodeCopiedToClipboard": "设备代码已复制到剪贴板" }}'; describe('t function', () => { - it('mock should work', () => { globalThis.localStorage.setItem('language', 'nonexistent_locale'); const result = globalThis.localStorage.getItem('language'); @@ -13,7 +12,7 @@ describe('t function', () => { it('should return the translated string if it exists in the locale', () => { globalThis.localStorage.setItem('language', 'en'); - globalThis.localStorage.setItem('mstd_mock_localeMap', mockedLangMap) + globalThis.localStorage.setItem('mstd_mock_localeMap', mockedLangMap); const result = t('Notice_DeviceCodeCopiedToClipboard'); expect(result).toBe('The device code has been copied to the clipboard'); }); @@ -25,7 +24,7 @@ describe('t function', () => { it('should log an error if the locale is not found', () => { globalThis.localStorage.setItem('language', 'nonexistent_locale'); - const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => { }); + const consoleErrorSpy = jest.spyOn(console, 'error').mockImplementation(() => {}); t('Notice_DeviceCodeCopiedToClipboard'); expect(consoleErrorSpy).toHaveBeenCalledWith('Error: locale not found', 'nonexistent_locale'); consoleErrorSpy.mockRestore(); @@ -43,4 +42,3 @@ describe('t function', () => { expect(result).toBe('设备代码已复制到剪贴板'); }); }); - diff --git a/src/lib/lang.ts b/src/lib/lang.ts index 8f054f5..07ba186 100644 --- a/src/lib/lang.ts +++ b/src/lib/lang.ts @@ -9,7 +9,7 @@ const localeMap: Record = { zh: zhCN, }; -export function getLocaleMap (): Record { +export function getLocaleMap(): Record { if (globalThis.localStorage.getItem('mstd_mock_localeMap')) { const mockLocaleMap = globalThis.localStorage.getItem('mstd_mock_localeMap'); return mockLocaleMap ? JSON.parse(mockLocaleMap) : localeMap; @@ -17,23 +17,21 @@ export function getLocaleMap (): Record { return localeMap; } -function getLanguage (): string | null { +function getLanguage(): string | null { return globalThis.localStorage.getItem('language'); } -function getLocale (language: string): Translations { +function getLocale(language: string): Translations { const localeMap = getLocaleMap(); return localeMap[language]; } -export function t (string_: string): string { +export function t(string_: string): string { const language = getLanguage(); const locale = getLocale(language ?? 'en'); if (!locale) { console.error('Error: locale not found', language); } - - return locale?.[string_] || string_; } diff --git a/src/lib/locale/zh-cn.json b/src/lib/locale/zh-cn.json index 8de48d2..3ab449a 100644 --- a/src/lib/locale/zh-cn.json +++ b/src/lib/locale/zh-cn.json @@ -71,4 +71,4 @@ "today": "今天", "tomorrow": "明天", "yesterday": "昨天" -} \ No newline at end of file +} diff --git a/src/lib/logging.ts b/src/lib/logging.ts index 7d2d891..da829be 100644 --- a/src/lib/logging.ts +++ b/src/lib/logging.ts @@ -84,7 +84,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public configure (options: ILogOptions): this { + public configure(options: ILogOptions): this { this.options = Object.assign({}, this.options, options); return this; } @@ -96,7 +96,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {Logger} * @memberof LogManager */ - public getLogger (moduleName: string): Logger { + public getLogger(moduleName: string): Logger { let currentMinimumLevel = 'none'; let match = ''; @@ -117,7 +117,7 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public onLogEntry (listener: (logEntry: ILogEntry) => void): this { + public onLogEntry(listener: (logEntry: ILogEntry) => void): this { this.on('log', listener); return this; } @@ -131,12 +131,12 @@ export class LogManager extends EventEmitter2 { * @return {*} {LogManager} * @memberof LogManager */ - public registerConsoleLogger (): this { + public registerConsoleLogger(): this { if (this.consoleLoggerRegistered) { return this; } - this.onLogEntry(logEntry => { + this.onLogEntry((logEntry) => { // 2024-12-19T22:53:37.000Z - >'2024-12-19 22:53:37' const messageDate = new Date().toISOString().slice(0, 19).replace('T', ' '); @@ -214,7 +214,11 @@ export class Logger { * @param {string} minLevel * @memberof Logger */ - constructor (private readonly logManager: EventEmitter2, private readonly name: string, minLevel: string) { + constructor( + private readonly logManager: EventEmitter2, + private readonly name: string, + minLevel: string, + ) { this.minLevel = this.levelToInt(minLevel); } @@ -223,7 +227,7 @@ export class Logger { * @param logLevel * @param message */ - public log (logLevel: string, message: string, objects?: unknown): void { + public log(logLevel: string, message: string, objects?: unknown): void { const level = this.levelToInt(logLevel); if (level < this.minLevel) { return; @@ -253,23 +257,23 @@ export class Logger { this.logManager.emit('log', logEntry); } - public trace (message: string, objects?: unknown): void { + public trace(message: string, objects?: unknown): void { this.log('trace', message, objects); } - public debug (message: string, objects?: unknown): void { + public debug(message: string, objects?: unknown): void { this.log('debug', message, objects); } - public info (message: string, objects?: unknown): void { + public info(message: string, objects?: unknown): void { this.log('info', message, objects); } - public warn (message: string, objects?: unknown): void { + public warn(message: string, objects?: unknown): void { this.log('warn', message, objects); } - public error (message: string, objects?: unknown): void { + public error(message: string, objects?: unknown): void { this.log('error', message, objects); } @@ -278,7 +282,7 @@ export class Logger { * @param logLevel * @param message */ - public logWithId (logLevel: string, traceId: string, message: string, objects?: unknown): void { + public logWithId(logLevel: string, traceId: string, message: string, objects?: unknown): void { const level = this.levelToInt(logLevel); if (level < this.minLevel) { return; @@ -295,23 +299,23 @@ export class Logger { this.logManager.emit('log', logEntry); } - public traceWithId (traceId: string, message: string, objects?: unknown): void { + public traceWithId(traceId: string, message: string, objects?: unknown): void { this.logWithId('trace', traceId, message, objects); } - public debugWithId (traceId: string, message: string, objects?: unknown): void { + public debugWithId(traceId: string, message: string, objects?: unknown): void { this.logWithId('debug', traceId, message, objects); } - public infoWithId (traceId: string, message: string, objects?: unknown): void { + public infoWithId(traceId: string, message: string, objects?: unknown): void { this.logWithId('info', traceId, message, objects); } - public warnWithId (traceId: string, message: string, objects?: unknown): void { + public warnWithId(traceId: string, message: string, objects?: unknown): void { this.logWithId('warn', traceId, message, objects); } - public errorWithId (traceId: string, message: string, objects?: unknown): void { + public errorWithId(traceId: string, message: string, objects?: unknown): void { this.logWithId('error', traceId, message, objects); } @@ -320,7 +324,7 @@ export class Logger { * * @param minLevel */ - private levelToInt (minLevel: string): number { + private levelToInt(minLevel: string): number { if (minLevel.toLowerCase() in this.levels) { return this.levels[minLevel.toLowerCase()]; } @@ -329,7 +333,7 @@ export class Logger { } } -export function logCallDetails () { +export function logCallDetails() { return function (target: unknown, propertyKey: string, descriptor: PropertyDescriptor) { const originalMethod = descriptor.value; const logger = logging.getLogger('mstodo-sync'); @@ -341,7 +345,8 @@ export function logCallDetails () { const elapsed = endTime.getTime() - startTime.getTime(); logger.debug( - `${typeof target}:${propertyKey} called with ${arguments_.length + `${typeof target}:${propertyKey} called with ${ + arguments_.length } arguments. Took: ${elapsed}ms ${JSON.stringify(arguments_)}`, ); return result; @@ -358,7 +363,7 @@ export function logCallDetails () { * @param {TLogLevelName} logLevel * @param {string} message */ -export function log (logLevel: TLogLevelName, message: string, objects?: unknown) { +export function log(logLevel: TLogLevelName, message: string, objects?: unknown) { const logger = logging.getLogger('mstodo-sync'); switch (logLevel) { @@ -398,23 +403,23 @@ export function log (logLevel: TLogLevelName, message: string, objects?: unknown * @param {Plugin} plugin * @return {*} */ -export function monkeyPatchConsole (plugin: Plugin) { +export function monkeyPatchConsole(plugin: Plugin) { if (!Platform.isMobile) { return; } const logFile = `${plugin.manifest.dir}/mstodo-sync-logs.txt`; const logs: string[] = []; - const logMessages - = (prefix: string) => - (...messages: unknown[]) => { - logs.push(`\n[${prefix}]`); - for (const message of messages) { - logs.push(String(message)); - } + const logMessages = + (prefix: string) => + (...messages: unknown[]) => { + logs.push(`\n[${prefix}]`); + for (const message of messages) { + logs.push(String(message)); + } - plugin.app.vault.adapter.write(logFile, logs.join(' ')); - }; + plugin.app.vault.adapter.write(logFile, logs.join(' ')); + }; console.debug = logMessages('debug'); console.error = logMessages('error'); diff --git a/src/lib/userNotice.ts b/src/lib/userNotice.ts index 90ce309..f706621 100644 --- a/src/lib/userNotice.ts +++ b/src/lib/userNotice.ts @@ -1,6 +1,6 @@ -import { Notice } from "obsidian"; +import { Notice } from 'obsidian'; import { t } from './lang.js'; -import { logging } from "./logging.js"; +import { logging } from './logging.js'; /** * Represents an interface for displaying user-facing messages. @@ -8,7 +8,7 @@ import { logging } from "./logging.js"; * @public */ export interface IUserNotice { - showMessage (message: string, timeout?: number): void; + showMessage(message: string, timeout?: number): void; } /** @@ -29,14 +29,13 @@ export class UserNotice implements IUserNotice { private readonly logger = logging.getLogger('mstodo-sync.UserNotice'); - /** * Displays a message to the user in the Obsidian interface for a specified duration. * * @param message - The message to be displayed. * @param timeout - An optional timeout (in milliseconds) for how long the message will be visible. */ - showMessage (message: string, timeout: number = this.defaultTimeout): void { + showMessage(message: string, timeout: number = this.defaultTimeout): void { const userMessage = new Notice(t(message), timeout); userMessage.setMessage(message); this.logger.info(message); diff --git a/src/main.ts b/src/main.ts index 8a927d2..c862a13 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,11 +1,14 @@ -import { - type CachedMetadata, type Editor, type MarkdownView, Plugin, -} from 'obsidian'; +import { type CachedMetadata, type Editor, type MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi.js'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings } from './gui/msTodoSyncSettingTab.js'; import { cleanupCachedTaskIds, - createTodayTasks, getAllTasksInList, getTask, getTaskDelta, postTask, postTaskAndChildren, + createTodayTasks, + getAllTasksInList, + getTask, + getTaskDelta, + postTask, + postTaskAndChildren, } from './command/msTodoCommand.js'; import { t } from './lib/lang.js'; import { log, logging } from './lib/logging.js'; @@ -23,11 +26,11 @@ export default class MsTodoSync extends Plugin { public msToDoActions: MsTodoActions; // Pulls the meta data for the a page to help with list processing. - getPageMetadata (path: string): CachedMetadata | undefined { + getPageMetadata(path: string): CachedMetadata | undefined { return this.app.metadataCache.getCache(path) ?? undefined; } - async onload () { + async onload() { logging.registerConsoleLogger(); log('info', `loading plugin "${this.manifest.name}" v${this.manifest.version}`); @@ -66,15 +69,15 @@ export default class MsTodoSync extends Plugin { this.msToDoActions = new MsTodoActions(this, this.settingsManager, this.todoApi); } - async onunload () { + async onunload() { log('info', `unloading plugin "${this.manifest.name}" v${this.manifest.version}`); } - async loadSettings () { + async loadSettings() { this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData()); } - async saveSettings () { + async saveSettings() { await this.saveData(this.settings); } @@ -92,7 +95,7 @@ export default class MsTodoSync extends Plugin { * * @private */ - private registerCommands () { + private registerCommands() { this.addCommand({ id: 'only-create-task', name: t('CommandName_PushToMsTodo'), @@ -144,7 +147,7 @@ export default class MsTodoSync extends Plugin { * * @private */ - private registerMenuEditorOptions () { + private registerMenuEditorOptions() { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, _view) => { menu.addSeparator(); @@ -156,28 +159,24 @@ export default class MsTodoSync extends Plugin { // ); // }); - menu.addItem(item => { - item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick( - async () => { - await this.pushTaskToMsTodoAndUpdatePage(editor); - }, - ); + menu.addItem((item) => { + item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick(async () => { + await this.pushTaskToMsTodoAndUpdatePage(editor); + }); }); - menu.addItem(item => { - item.setTitle(t('EditorMenu_FetchFromRemote')).onClick( - async () => { - await getTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ); - }, - ); + menu.addItem((item) => { + item.setTitle(t('EditorMenu_FetchFromRemote')).onClick(async () => { + await getTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); + }); }); - menu.addItem(item => { + menu.addItem((item) => { item.setTitle('Sync Task with details (Push)').onClick(async () => { await postTaskAndChildren( this.todoApi, @@ -190,22 +189,20 @@ export default class MsTodoSync extends Plugin { }); }); - menu.addItem(item => { - item.setTitle('Sync Task with details (Pull)').onClick( - async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - false, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Sync Task with details (Pull)').onClick(async () => { + await postTaskAndChildren( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + false, + ); + }); }); - menu.addItem(item => { + menu.addItem((item) => { item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { this.msToDoActions.viewTaskInTodo(editor); }); @@ -217,86 +214,59 @@ export default class MsTodoSync extends Plugin { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, _view) => { menu.addSeparator(); - menu.addItem(item => { + menu.addItem((item) => { item.setTitle('Testing Commands Enabled'); }); - menu.addItem(item => { - item.setTitle('Update Task Cache').onClick( - async () => { - await getTaskDelta( - this.todoApi, - this.settings.todoListSync?.listId, - this, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Update Task Cache').onClick(async () => { + await getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); + }); }); - menu.addItem(item => { - item.setTitle('Reset Task Cache').onClick( - async () => { - await getTaskDelta( - this.todoApi, - this.settings.todoListSync?.listId, - this, - true, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Reset Task Cache').onClick(async () => { + await getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this, true); + }); }); - menu.addItem(item => { - item.setTitle('Cleanup Local Task Lookup Table').onClick( - async () => { - await cleanupCachedTaskIds( - this, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Cleanup Local Task Lookup Table').onClick(async () => { + await cleanupCachedTaskIds(this); + }); }); - menu.addItem(item => { - item.setTitle('Insert all tasks with body').onClick( - async () => { - await getAllTasksInList( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this, - true, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Insert all tasks with body').onClick(async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + true, + ); + }); }); - menu.addItem(item => { - item.setTitle('Insert all tasks').onClick( - async () => { - await getAllTasksInList( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this, - false, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Insert all tasks').onClick(async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + false, + ); + }); }); - menu.addItem(item => { - item.setTitle('Sync Vault').onClick( - async () => { - this.msToDoActions.syncVault( - this.settings.todoListSync?.listId, - ); - }, - ); + menu.addItem((item) => { + item.setTitle('Sync Vault').onClick(async () => { + this.msToDoActions.syncVault(this.settings.todoListSync?.listId); + }); }); }), ); } - - } /** @@ -309,7 +279,7 @@ export default class MsTodoSync extends Plugin { * @param editor - The editor instance containing the task to be posted. * @returns A promise that resolves when the task has been posted and the page updated. */ - private async pushTaskToMsTodoAndUpdatePage (editor: Editor) { + private async pushTaskToMsTodoAndUpdatePage(editor: Editor) { await this.msToDoActions.postTask( this.settings.todoListSync?.listId, editor, @@ -324,7 +294,7 @@ export default class MsTodoSync extends Plugin { * @param editor - The editor instance containing the task to be pushed. * @returns A promise that resolves when the task has been successfully pushed. */ - private async pushTaskToMsTodo (editor: Editor) { + private async pushTaskToMsTodo(editor: Editor) { await this.msToDoActions.postTask( this.settings.todoListSync?.listId, editor, @@ -333,4 +303,3 @@ export default class MsTodoSync extends Plugin { ); } } - diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index 415a557..cc28eec 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -146,7 +146,10 @@ export class ObsidianTodoTask implements TodoTask { * @param line - The line of text representing the task. * @param fileName - The name of the file where the task is located. */ - constructor (private readonly settingsManager: ISettingsManager, line: string) { + constructor( + private readonly settingsManager: ISettingsManager, + line: string, + ) { this.originalTitle = line; this.title = line.trim(); @@ -162,13 +165,24 @@ export class ObsidianTodoTask implements TodoTask { // This will strip out the created date if in title. if (this.title.includes(settingsManager.settings.displayOptions_TaskCreatedPrefix)) { this.title = this.title - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\[\\[.*]]`, 'g'), '') - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\d{4}-\\d{2}-\\d{2}`, 'g'), '') + .replaceAll( + new RegExp(`${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\[\\[.*]]`, 'g'), + '', + ) + .replaceAll( + new RegExp( + `${settingsManager.settings.displayOptions_TaskCreatedPrefix} ?\\d{4}-\\d{2}-\\d{2}`, + 'g', + ), + '', + ) .trim(); } if (this.title.includes(settingsManager.settings.displayOptions_TaskDuePrefix)) { - const specifiedDueDate = this.title.match(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?(\\d{4}-\\d{2}-\\d{2})`, 'g')); + const specifiedDueDate = this.title.match( + new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?(\\d{4}-\\d{2}-\\d{2})`, 'g'), + ); if (specifiedDueDate) { this.dueDateTime = { @@ -179,7 +193,10 @@ export class ObsidianTodoTask implements TodoTask { this.title = this.title .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?\\[\\[.*]]`, 'g'), '') - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?\\d{4}-\\d{2}-\\d{2}`, 'g'), '') + .replaceAll( + new RegExp(`${settingsManager.settings.displayOptions_TaskDuePrefix} ?\\d{4}-\\d{2}-\\d{2}`, 'g'), + '', + ) .trim(); } @@ -192,8 +209,10 @@ export class ObsidianTodoTask implements TodoTask { // Remove any items the user does not want pushed to Microsoft To Do if (settingsManager.settings.displayOptions_RegExToRunOnPushAgainstTitle !== '') { - this.title = this.title - .replaceAll(new RegExp(`${settingsManager.settings.displayOptions_RegExToRunOnPushAgainstTitle}`, 'g'), ''); + this.title = this.title.replaceAll( + new RegExp(`${settingsManager.settings.displayOptions_RegExToRunOnPushAgainstTitle}`, 'g'), + '', + ); } this.body = { @@ -213,11 +232,10 @@ export class ObsidianTodoTask implements TodoTask { this.logger.debug(`Created: '${this.title}'`); } - public getRedirectUrl (): string { + public getRedirectUrl(): string { return `${this.settingsManager.settings.microsoftToDoApplication_RedirectUriBase}?vault=${this.settingsManager.vaultName}&block=${this.blockLink}`; } - /** * Cache the ID internally and generate block link. * @@ -225,7 +243,7 @@ export class ObsidianTodoTask implements TodoTask { * @return {*} {Promise} * @memberof ObsidianTodoTask */ - public async cacheTaskId (id: string): Promise { + public async cacheTaskId(id: string): Promise { this.settingsManager.settings.taskIdIndex += 1; const index = `MSTD${Math.random().toString(20).slice(2, 6)}${this.settingsManager.settings.taskIdIndex @@ -245,7 +263,7 @@ export class ObsidianTodoTask implements TodoTask { * @param withChecklist - Whether to include checklist items in the returned task. * @returns The task as a TodoTask object. */ - public getTodoTask (withChecklist = false): TodoTask { + public getTodoTask(withChecklist = false): TodoTask { const toDo: TodoTask = { title: this.title, }; @@ -282,7 +300,7 @@ export class ObsidianTodoTask implements TodoTask { * @param withChecklist - Whether to include checklist items in the returned task. * @returns The task as a TodoTask object. */ - public updateFromTodoTask (remoteTask: TodoTask) { + public updateFromTodoTask(remoteTask: TodoTask) { this.title = remoteTask.title; if (remoteTask.body?.content && remoteTask.body.content.length > 0) { @@ -315,7 +333,7 @@ export class ObsidianTodoTask implements TodoTask { * Set the body content of the task. * @param body - The body content to set. */ - public setBody (body: string) { + public setBody(body: string) { this.body = { content: body, contentType: 'text', @@ -326,7 +344,7 @@ export class ObsidianTodoTask implements TodoTask { * Add a checklist item to the task. * @param item - The checklist item to add. */ - public addChecklistItem (item: string) { + public addChecklistItem(item: string) { this.checklistItems ||= []; this.checklistItems.push({ @@ -343,7 +361,7 @@ export class ObsidianTodoTask implements TodoTask { * @return {*} {string} * @memberof ObsidianTodoTask */ - public getMarkdownTask (singleLine: boolean): string { + public getMarkdownTask(singleLine: boolean): string { let output: string; // Format and display the task which is the first line. @@ -354,7 +372,9 @@ export class ObsidianTodoTask implements TodoTask { .replace(TASK_REGEX, this.title?.trim() ?? '') .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); - output = output.includes(priorityIndicator) ? output.replace(IMPORTANCE_REGEX, '') : output.replace(IMPORTANCE_REGEX, priorityIndicator); + output = output.includes(priorityIndicator) + ? output.replace(IMPORTANCE_REGEX, '') + : output.replace(IMPORTANCE_REGEX, priorityIndicator); if (this.dueDateTime?.dateTime) { const formattedDueDate = globalThis @@ -384,7 +404,8 @@ export class ObsidianTodoTask implements TodoTask { // Add in the body if it exists and indented by two spaces. if (this.body?.content && this.body.content.length > 0) { - for (const bodyLine of this.body?.content.split('\n')) { // eslint-disable-line no-unsafe-optional-chaining + for (const bodyLine of this.body?.content.split('\n')) { + // eslint-disable-line no-unsafe-optional-chaining if (bodyLine.trim().length > 0) { formattedBody += ' ' + bodyLine + '\n'; } @@ -394,7 +415,9 @@ export class ObsidianTodoTask implements TodoTask { if (this.checklistItems && this.checklistItems.length > 0) { for (const item of this.checklistItems) { - formattedChecklist += item.isChecked ? ' - [x] ' + item.displayName + '\n' : ' - [ ] ' + item.displayName + '\n'; + formattedChecklist += item.isChecked + ? ' - [x] ' + item.displayName + '\n' + : ' - [ ] ' + item.displayName + '\n'; } } // This.logger.debug(`formattedChecklist: '${formattedChecklist}'`); @@ -409,7 +432,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for a status indicator and update the status accordingly. * @param line - The line of text representing the task. */ - private checkForStatus (line: string) { + private checkForStatus(line: string) { const regex = /\[(.)]/; const m = regex.exec(line); @@ -425,7 +448,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for an importance indicator and update the importance accordingly. * @param line - The line of text representing the task. */ - private checkForImportance (line: string) { + private checkForImportance(line: string) { this.importance = 'normal'; if (line.includes(this.settingsManager.settings.displayOptions_TaskImportance_Low)) { @@ -441,7 +464,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the priority indicator based on the task's importance. * @returns The priority indicator as a string. */ - private getPriorityIndicator (): string { + private getPriorityIndicator(): string { switch (this.importance) { case 'normal': { return this.settingsManager.settings.displayOptions_TaskImportance_Normal; @@ -465,7 +488,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the status indicator based on the task's status. * @returns The status indicator as a string. */ - private getStatusIndicator (): string { + private getStatusIndicator(): string { switch (this.status) { case 'notStarted': { return this.settingsManager.settings.displayOptions_TaskStatus_NotStarted; @@ -489,7 +512,7 @@ export class ObsidianTodoTask implements TodoTask { * Check the task title for a block link and update the block link and ID accordingly. * @param line - The line of text representing the task. */ - private checkForBlockLink (line: string) { + private checkForBlockLink(line: string) { const blockLinkRegex = /\^(?!.*\^)([A-Za-z\d]+)/gm; const blockLinkMatch = blockLinkRegex.exec(line); if (blockLinkMatch) { @@ -509,7 +532,7 @@ export class ObsidianTodoTask implements TodoTask { * Get the clean title of the task, without any block links or status indicators. * @returns The clean title as a string. */ - public get cleanTitle (): string { + public get cleanTitle(): string { return ''; } @@ -517,7 +540,7 @@ export class ObsidianTodoTask implements TodoTask { * Check if the task has a block link. * @returns True if the task has a block link, false otherwise. */ - public get hasBlockLink (): boolean { + public get hasBlockLink(): boolean { return this.blockLink !== undefined && this.blockLink.length > 0; } @@ -525,7 +548,7 @@ export class ObsidianTodoTask implements TodoTask { * Check if the task has an id for the remote task. * @returns True if the task has a id set, false otherwise. */ - public get hasId (): boolean { + public get hasId(): boolean { return this.id !== undefined && this.id.length > 0; } } diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index 66c1b94..0a0a21e 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -2,7 +2,6 @@ import _ from 'obsidian'; declare module 'obsidian' { - interface FileCacheRecord { mtime: number; size: number; @@ -20,7 +19,7 @@ declare module 'obsidian' { enabledPlugins: Set; plugins: { [pluginId: string]: Plugin | PeriodicNotes; - } + }; }; } @@ -47,6 +46,4 @@ declare module 'obsidian' { isAllCollapsed: boolean; collapseOrExpandAllEl: HTMLDivElement; } - } - diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts index 11c9a4b..38c1ef2 100644 --- a/src/utils/settingsManager.ts +++ b/src/utils/settingsManager.ts @@ -4,32 +4,32 @@ import type MsTodoSync from 'src/main'; interface ISettingsManager { settings: IMsTodoSyncSettings; vaultName: string; - saveSettings (): void; + saveSettings(): void; } class SettingsManager implements ISettingsManager { - constructor (private readonly plugin: MsTodoSync) { } + constructor(private readonly plugin: MsTodoSync) {} - public get settings () { + public get settings() { return this.plugin.settings; } - public get vaultName () { + public get vaultName() { return this.plugin.app.vault.getName(); } - public getTaskIdFromBlockId (blockId: string): string { + public getTaskIdFromBlockId(blockId: string): string { return this.findKeyCaseInsensitive(this.plugin.settings.taskIdLookup, blockId); } - async saveSettings (): Promise { + async saveSettings(): Promise { // Implementation to save settings await this.plugin.saveData(this.plugin.settings); } - private findKeyCaseInsensitive (obj: Record, key: string): any { + private findKeyCaseInsensitive(obj: Record, key: string): any { const lowerCaseKey = key.toLowerCase(); - const foundKey = Object.keys(obj).find(k => k.toLowerCase() === lowerCaseKey); + const foundKey = Object.keys(obj).find((k) => k.toLowerCase() === lowerCaseKey); return foundKey ? obj[foundKey] : undefined; } } diff --git a/tsconfig.json b/tsconfig.json index b74d23e..46aa2c8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,17 +12,10 @@ "importHelpers": true, "isolatedModules": true, "verbatimModuleSyntax": true, - "lib": [ - "DOM", - "ESNext" - ], + "lib": ["DOM", "ESNext"], "allowSyntheticDefaultImports": true, "skipLibCheck": true }, - "include": [ - "src/**/*.ts" - ], - "exclude": [ - "node_modules" - ] + "include": ["src/**/*.ts"], + "exclude": ["node_modules"] } diff --git a/version-bump.mjs b/version-bump.mjs index d12d785..0ba74c7 100644 --- a/version-bump.mjs +++ b/version-bump.mjs @@ -1,10 +1,10 @@ -import {readFileSync, writeFileSync} from 'node:fs'; +import { readFileSync, writeFileSync } from 'node:fs'; const targetVersion = process.env.npm_package_version; // Read minAppVersion from manifest.json and bump version to target version const manifest = JSON.parse(readFileSync('manifest.json', 'utf8')); -const {minAppVersion} = manifest; +const { minAppVersion } = manifest; manifest.version = targetVersion; writeFileSync('manifest.json', JSON.stringify(manifest, null, '\t')); diff --git a/versions.json b/versions.json index a6d5a03..ffe7983 100644 --- a/versions.json +++ b/versions.json @@ -1,4 +1,4 @@ { - "1.0.0": "0.15.0", - "1.0.1": "0.15.0" -} \ No newline at end of file + "1.0.0": "0.15.0", + "1.0.1": "0.15.0" +} From 4eb0ce3719de7c78c867042fa49906e349a23279 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 9 Jan 2025 16:41:20 -0800 Subject: [PATCH 30/34] feat: added sync command and fixed more bugs closer to release --- eslint.config.mjs | 17 +- package.json | 1 + pnpm-lock.yaml | 88 +++--- src/api/microsoftClientProvider.ts | 4 +- src/api/todoApi.ts | 13 +- src/command/msToDoActions.ts | 434 ++++++++++++++--------------- src/gui/msTodoSyncSettingTab.ts | 4 +- src/lib/lang.test.ts | 1 + src/main.ts | 54 ++-- src/model/obsidianTodoTask.ts | 35 ++- src/typings/obsidian-ex.d.ts | 2 +- src/utils/settingsManager.ts | 12 +- tsconfig.json | 3 +- 13 files changed, 358 insertions(+), 310 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 0d09901..7f4c956 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,7 +1,7 @@ import globals from 'globals'; import pluginJs from '@eslint/js'; import tseslint from 'typescript-eslint'; -import eslintConfigPrettier from 'eslint-config-prettier'; +import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended'; /** @type {import('eslint').Linter.Config[]} */ export default [ @@ -9,19 +9,20 @@ export default [ { languageOptions: { globals: globals.browser } }, pluginJs.configs.recommended, ...tseslint.configs.recommended, - eslintConfigPrettier, + eslintPluginPrettierRecommended, { rules: { 'no-undef': 'warn', - 'no-unused-vars': [ + '@typescript-eslint/no-unused-vars': [ 'error', { - vars: 'all', - args: 'after-used', - caughtErrors: 'all', - ignoreRestSiblings: false, - reportUsedIgnorePattern: false, + args: 'all', argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true, }, ], }, diff --git a/package.json b/package.json index e6713bd..1161f18 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "eslint-config-prettier": "^8.10.0", "eslint-plugin-import": "^2.31.0", "eslint-plugin-no-loops": "^0.3.0", + "eslint-plugin-prettier": "^5.2.1", "globals": "^15.14.0", "jest": "^29.7.0", "luxon": "^3.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d1d71e8..3b0a341 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,9 +23,6 @@ importers: eventemitter2: specifier: ^6.4.9 version: 6.4.9 - node-fetch: - specifier: ^2.7.0 - version: 2.7.0 devDependencies: '@eslint/js': specifier: ^9.17.0 @@ -69,6 +66,9 @@ importers: eslint-plugin-no-loops: specifier: ^0.3.0 version: 0.3.0(eslint@9.17.0) + eslint-plugin-prettier: + specifier: ^5.2.1 + version: 5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.4.2) globals: specifier: ^15.14.0 version: 15.14.0 @@ -602,6 +602,10 @@ packages: '@ophidian/build@1.2.1': resolution: {integrity: sha512-ulefYLGwlWmsP5WgkOunujhU57dB5slENQ7VvwFh0h0Yk6id4Osg3jN0yONtB9gF6awfjzfK4OxzfOhmuzWx7g==} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -1290,6 +1294,20 @@ packages: peerDependencies: eslint: '>=2.0.0' + eslint-plugin-prettier@5.2.1: + resolution: {integrity: sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-scope@8.2.0: resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1355,6 +1373,9 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-glob@3.3.2: resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} engines: {node: '>=8.6.0'} @@ -2038,15 +2059,6 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - node-int64@0.4.0: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} @@ -2192,6 +2204,10 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + prettier@3.4.2: resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} @@ -2426,6 +2442,10 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + synckit@0.9.2: + resolution: {integrity: sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==} + engines: {node: ^14.18.0 || >=16.0.0} + test-exclude@6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -2441,9 +2461,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - ts-api-utils@1.4.3: resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} engines: {node: '>=16'} @@ -2554,12 +2571,6 @@ packages: walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3171,6 +3182,8 @@ snapshots: monkey-around: 2.3.0 sass: 1.47.0 + '@pkgr/core@0.1.1': {} + '@rtsao/scc@1.1.0': {} '@sinclair/typebox@0.27.8': {} @@ -3978,6 +3991,15 @@ snapshots: dependencies: eslint: 9.17.0 + eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.4.2): + dependencies: + eslint: 9.17.0 + prettier: 3.4.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.9.2 + optionalDependencies: + eslint-config-prettier: 8.10.0(eslint@9.17.0) + eslint-scope@8.2.0: dependencies: esrecurse: 4.3.0 @@ -4072,6 +4094,8 @@ snapshots: fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-glob@3.3.2: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4945,10 +4969,6 @@ snapshots: natural-compare@1.4.0: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-int64@0.4.0: {} node-releases@2.0.19: {} @@ -5085,6 +5105,10 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier@3.4.2: {} pretty-format@29.7.0: @@ -5336,6 +5360,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + synckit@0.9.2: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + test-exclude@6.0.0: dependencies: '@istanbuljs/schema': 0.1.3 @@ -5352,8 +5381,6 @@ snapshots: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - ts-api-utils@1.4.3(typescript@4.9.5): dependencies: typescript: 4.9.5 @@ -5475,13 +5502,6 @@ snapshots: dependencies: makeerror: 1.0.12 - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 diff --git a/src/api/microsoftClientProvider.ts b/src/api/microsoftClientProvider.ts index f84386a..9b5f7de 100644 --- a/src/api/microsoftClientProvider.ts +++ b/src/api/microsoftClientProvider.ts @@ -42,7 +42,7 @@ export class MicrosoftClientProvider { } private readonly scopes: string[] = ['Tasks.ReadWrite', 'openid', 'profile']; - private pca: msal.PublicClientApplication; + private pca!: msal.PublicClientApplication; private readonly adapter: DataAdapter; private readonly app: App; private readonly cachePath: string; @@ -126,7 +126,7 @@ export class MicrosoftClientProvider { const app = this.app; const deviceCodeRequest = { async deviceCodeCallback(response: msalCommon.DeviceCodeResponse) { - const notice = new Notice(t('Notice_DeviceCodeOnClipboard')); + const _notice = new Notice(t('Notice_DeviceCodeOnClipboard')); await navigator.clipboard.writeText(response.userCode); new MicrosoftAuthModal(app, response.userCode, response.verificationUri).open(); console.log(t('Notice_DeviceCodeCopiedToClipboard'), response.userCode); diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index d0882d9..230c758 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -1,9 +1,4 @@ -import { - type PageCollection, - RetryHandlerOptions, - type Client, - BatchRequestStep, -} from '@microsoft/microsoft-graph-client'; +import { type PageCollection, RetryHandlerOptions, type Client } from '@microsoft/microsoft-graph-client'; import { type TodoTask, type TodoTaskList } from '@microsoft/microsoft-graph-types'; import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; @@ -22,7 +17,7 @@ export class TasksDeltaCollection { export class TodoApi { private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); - private client: Client; + private client!: Client; private readonly enableRetryOptions = false; constructor(clientProvider: MicrosoftClientProvider) { @@ -256,7 +251,7 @@ export class TodoApi { taskId: string, blockId: string, webUrl: string, - ): Promise { + ): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources`; const updatedLinkedResource = { @@ -274,7 +269,7 @@ export class TodoApi { linkedResourceId: string, blockId: string, webUrl: string, - ): Promise { + ): Promise { const endpoint = `/me/todo/lists/${listId}/tasks/${taskId}/linkedResources/${linkedResourceId}`; const updatedLinkedResource = { diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts index 043f1a1..9f339c5 100644 --- a/src/command/msToDoActions.ts +++ b/src/command/msToDoActions.ts @@ -4,11 +4,10 @@ import type MsTodoSync from '../main.js'; import { type IMsTodoSyncSettings } from '../gui/msTodoSyncSettingTab.js'; import { UserNotice } from '../lib/userNotice.js'; import { logging } from '../lib/logging.js'; -import { TodoTask } from '@microsoft/microsoft-graph-types'; +import { type TodoTask } from '@microsoft/microsoft-graph-types'; import { TasksDeltaCollection, TodoApi } from '../api/todoApi.js'; import { t } from '../lib/lang.js'; import { ObsidianTodoTask } from '../model/obsidianTodoTask.js'; -import { DateTime } from 'luxon'; interface ISelection { start: EditorPosition; @@ -22,6 +21,7 @@ export class MsTodoActions { private settings: IMsTodoSyncSettings; private todoApi: TodoApi; private plugin: MsTodoSync; + private deltaCachePath: string; constructor( plugin: MsTodoSync, @@ -31,6 +31,7 @@ export class MsTodoActions { this.settings = settingsManager.settings; this.plugin = plugin; this.todoApi = todoApi; + this.deltaCachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; } /** @@ -81,8 +82,7 @@ export class MsTodoActions { this.logger.info(`Local Tasks: ${Object.keys(localTasks).length}`); // Get all the tasks from the cache. - await this.getTaskDelta(listId, false); - const cachedTasksDelta = await this.getDeltaCache(); + const cachedTasksDelta = await this.getTaskDelta(listId, false); // If there are no tasks in the cache then return. if (!cachedTasksDelta) { @@ -95,166 +95,74 @@ export class MsTodoActions { // Iterate over all the tasks in internal cache and update the block references. let updatedTasks = 0; for (const blockId in this.plugin.settings.taskIdLookup) { + // For each of the cached block items get the taskId which is used int he remote + // system. Then get the remote task from the cached list and finally the local task + // from the vault that was collected above. const taskId = this.settingsManager.getTaskIdFromBlockId(blockId); const cachedTask = cachedTasksDelta.allTasks.find((task) => task.id === taskId); const localTask = localTasks[blockId.toLowerCase()]; - if (cachedTask && localTask && cachedTask.lastModifiedDateTime) { - // If the local task is more recent than the remote task then update the remote task. - if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { - // Update the remote task with the local task. - // Get the string from the page using the start and end provided by the block. - const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; - if (block) { - const adapter: DataAdapter = this.plugin.app.vault.adapter; - const pageContent = await adapter.read(localTask.pagePath); - const taskContent = pageContent.slice( - localTask.block.position.start.offset, - localTask.block.position.end.offset, - ); - - const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); - - const titleMatch = internalTask.title === cachedTask.title; - const statusMatch = internalTask.status === cachedTask.status; - const localDueDate = - internalTask.dueDateTime === undefined - ? undefined - : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { - zone: internalTask.dueDateTime?.timeZone ?? 'utc', - }); - const remoteDueDate = - cachedTask.dueDateTime === undefined - ? undefined - : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { - zone: cachedTask.dueDateTime?.timeZone ?? 'utc', - }); - const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); - const importanceMatch = internalTask.importance === cachedTask.importance; - - if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { - this.logger.info(`Local Newer: ${blockId}`, { cachedTask, localTask, taskContent }); - this.logger.info(`Updating Task: ${blockId}`, { - titleMatch, - statusMatch, - dueDateTimeMatch, - importanceMatch, - }); - if (!dueDateTimeMatch) { - this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); - this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); - } - - const returnedTask = await this.todoApi.updateTaskFromToDo( - listId, - internalTask.id, - internalTask.getTodoTask(), - ); - this.logger.info(`Updated Task last mod: ${returnedTask.lastModifiedDateTime}`); + if (!localTask) { + this.logger.info(`Block not found in local tasks: ${blockId}`); + continue; + } - updatedTasks++; - } - } else { - this.logger.info(`Block not found in vault: ${blockId}`); - } - } else { - const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; - if (block) { - const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); - if (vaultFileReference) { - this.plugin.app.vault.read(vaultFileReference); - const pageContent = await this.plugin.app.vault.read(vaultFileReference); - const taskContent = pageContent.slice( - localTask.block.position.start.offset, - localTask.block.position.end.offset, - ); + const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; + const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); - const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); - - const titleMatch = internalTask.title === cachedTask.title; - const statusMatch = internalTask.status === cachedTask.status; - const localDueDate = - internalTask.dueDateTime === undefined - ? undefined - : DateTime.fromISO(internalTask.dueDateTime?.dateTime ?? '', { - zone: internalTask.dueDateTime?.timeZone ?? 'utc', - }); - const remoteDueDate = - cachedTask.dueDateTime === undefined - ? undefined - : DateTime.fromISO(cachedTask.dueDateTime?.dateTime ?? '', { - zone: cachedTask.dueDateTime?.timeZone ?? 'utc', - }); - const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); - const importanceMatch = internalTask.importance === cachedTask.importance; - - if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { - this.logger.info(`Remote Newer: ${blockId}`, { cachedTask, localTask, taskContent }); - this.logger.info(`Updating Task: ${blockId}`, { - titleMatch, - statusMatch, - dueDateTimeMatch, - importanceMatch, - }); - if (!dueDateTimeMatch) { - this.logger.info(`Local Due Date: ${localDueDate?.toISODate()}`); - this.logger.info(`Remote Due Date: ${remoteDueDate?.toISODate()}`); - } - - internalTask.updateFromTodoTask(cachedTask); - const updatedTask = internalTask.getMarkdownTask(true); - - await this.plugin.app.vault.process(vaultFileReference, (data) => { - const newPageContent = - data.substring(0, localTask.block.position.start.offset) + - updatedTask + - data.substring(localTask.block.position.end.offset); - this.logger.info(`Updating Task ID: ${blockId}`, newPageContent); - return newPageContent; - }); - updatedTasks++; - } - } - } else { - this.logger.info(`Block not found in vault: ${blockId}`); - } - } - } else { - this.logger.info(`Task not found in remote cache: ${blockId}`); + if (!block || !cachedTask || !localTask || !cachedTask.lastModifiedDateTime || !vaultFileReference) { + this.logger.info(`Issue with finding local or remote task for: ${blockId}`); + continue; } - // if (Object.hasOwn(this.plugin.settings.taskIdLookup, blockId)) { - // const taskId = this.plugin.settings.taskIdLookup[blockId]; - // const cachedTask = cachedTasksDelta.allTasks.find(task => task.id === taskId); - // const localTask = localTasks[blockId.toLowerCase()]; - // if (cachedTask && localTask && cachedTask.lastModifiedDateTime) { - // // If the local task is more recent than the remote task then update the remote task. - // if (new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime)) { - // // Update the remote task with the local task. - // // Get the string from the page using the start and end provided by the block. - // const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; - // if (block) { - // const adapter: DataAdapter = this.plugin.app.vault.adapter; - // const pageContent = await adapter.read(localTask.pagePath) - // const taskContent = pageContent.slice(localTask.block.position.start.offset, localTask.block.position.end.offset) - - // this.logger.info(`Updating Task ID: ${cachedTask.id}`); - // this.logger.info(`Updating Task Path: ${localTask.pagePath}`); - // this.logger.info(`Updating Task Local Task On Page: ${taskContent}`); - // this.logger.info(`Updating Task Remote Task: ${cachedTask.title}`); - // this.logger.info(`Updating Task Remote mtime: ${new Date(cachedTask.lastModifiedDateTime)}`); - // this.logger.info(`Updating Task Local mtime: ${new Date(localTask.mtime)}`); - // updatedTasks++; - - // } else { - // this.logger.info(`Block not found in vault: ${blockId}`); - // } - // } else { - // this.logger.info(`Local task is more recent than remote task: ${blockId}`); - // } - // } else { - // this.logger.info(`Task not found in remote cache: ${blockId}`); - // } - // } + const localTaskNewer = new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime); + + // Get the string from the page using the start and end provided by the block. + const pageContent = await this.plugin.app.vault.read(vaultFileReference); + const taskContent = pageContent.slice( + localTask.block.position.start.offset, + localTask.block.position.end.offset, + ); + const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); + internalTask.id = taskId; + + // If all the properties match then no update will occur. + if (internalTask.equals(cachedTask)) { + continue; + } + + // Now we need to check the following: + // If the local task is more recent than the remote task then update the remote task. + // If the remote task is more recent than the local task then update the local task. + // If the remote task properties and the local task properties are the same then no update will occur. + if (localTaskNewer) { + // Update the remote task with the local task. + this.logger.info(`Local Newer: ${blockId}`, { internalTask, cachedTask, localTask, taskContent }); + + // Push local update to remote API. + const returnedTask = await this.todoApi.updateTaskFromToDo( + listId, + internalTask.id, + internalTask.getTodoTask(), + ); + this.logger.debug(`Updated Task last mod: ${returnedTask.lastModifiedDateTime}`); + + updatedTasks++; + } else { + // Remote version is newer, need to update vault. + this.logger.info(`Remote Newer: ${blockId}`, { internalTask, cachedTask, localTask, taskContent }); + + // Update local task and get new markdown to update page. + internalTask.updateFromTodoTask(cachedTask); + const updatedTask = internalTask.getMarkdownTask(true); + + await this.plugin.app.vault.process(vaultFileReference, (data) => { + const newPageContent = data.replace(taskContent, updatedTask); + + this.logger.debug(`Updating Task ID: ${blockId}`, newPageContent); + return newPageContent; + }); + updatedTasks++; + } } this.logger.info(`Updated Tasks: ${updatedTasks}`); @@ -281,7 +189,20 @@ export class MsTodoActions { } } - public async cleanupCachedTaskIds() { + /** + * Cleans up cached task IDs by comparing them with the current metadata cache. + * + * This method performs the following steps: + * 1. Collects all blocks and their IDs from the metadata cache. + * 2. Iterates over all cached task IDs in the settings. + * 3. Checks if each cached task ID exists in the metadata cache. + * 4. Logs whether each task ID was found or not. + * 5. Removes task IDs from the settings if they are not found in the metadata cache. + * 6. Saves the updated settings if any task IDs were removed. + * + * @returns {Promise} A promise that resolves when the cleanup process is complete. + */ + public async cleanupCachedTaskIds(): Promise { // Collect all the blocks and ids from the metadata cache under the app. const blockCache: Record = this.populateBlockCache(); @@ -337,6 +258,16 @@ export class MsTodoActions { return blockCache; } + /** + * Retrieves all blocks from the vault and returns them in a record format. + * + * @returns {Record} + * A record where each key is a combination of the page hash and block key, and the value is an object containing: + * - `mtime`: The modification time of the file. + * - `pageHash`: The hash of the page. + * - `pagePath`: The path of the page. + * - `block`: The block cache. + */ private getAllVaultBlocks(): Record< string, { mtime: number; pageHash: string; pagePath: string; block: BlockCache } @@ -364,16 +295,68 @@ export class MsTodoActions { return blockCache; } - // Function to find the key and value by a sub-property of the value + /** + * Finds an entry in a record by a specified sub-property and its value. + * + * @template T - The type of the record. + * @template K - The type of the sub-property key. + * @param {T} record - The record to search within. + * @param {K} subProperty - The sub-property key to search by. + * @param {T[keyof T][K]} value - The value of the sub-property to match. + * @returns {{ key: string; value: T[keyof T] } | undefined} - The found entry as an object containing the key and value, or undefined if not found. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any private findBySubProperty, K extends keyof T[keyof T]>( record: T, subProperty: K, - value: T[keyof T][K], + subPropertyValue: T[keyof T][K], ): { key: string; value: T[keyof T] } | undefined { - const entry = Object.entries(record).find(([_, v]) => v[subProperty] === value); + const entry = Object.entries(record).find(([_, value]) => value[subProperty] === subPropertyValue); return entry ? { key: entry[0], value: entry[1] } : undefined; } + public async addMissingTasksToVault(listId: string | undefined, editor?: Editor) { + if (!listId) { + this.userNotice.showMessage(t('CommandNotice_SetListName')); + return; + } + const activeFile = this.plugin.app.workspace.getActiveFile(); + if (activeFile === null) { + return; + } + + this.userNotice.showMessage(t('CommandNotice_AddingMissingTasks'), 3000); + const cachedTasksDelta = await this.getTaskDelta(listId); + + // For each task in the cache, check if it exists in the vault. + // If it does not, create a new block in the vault. + let createdTasks = 0; + let addedTasks = ''; + for (const task of cachedTasksDelta?.allTasks ?? []) { + if (task.status === 'completed') { + continue; + } + // Check if the task ID exists in the block cache. + const blockId = task.id ? this.settingsManager.hasTaskId(task.id) : false; + if (blockId) { + this.logger.debug(`Task already tracked in vault.`, task.title); + continue; + } + this.logger.debug(`Block not found in vault: ${task.id}`, task.title); + + // Create a new block in the vault. + const newTask = new ObsidianTodoTask(this.settingsManager, ''); + newTask.updateFromTodoTask(task); + newTask.cacheTaskId(task.id ?? ''); + addedTasks += `${newTask.getMarkdownTask(true)}\n`; + this.logger.info(`Adding Task: ${newTask.getMarkdownTask(true)}`, newTask); + } + if (editor) { + editor.replaceSelection(addedTasks); + } + this.logger.info(`Created Tasks: ${createdTasks}`); + } + /** * Posts tasks to Microsoft To Do from the selected lines in the editor. * @@ -386,9 +369,7 @@ export class MsTodoActions { * * @returns A promise that resolves when the tasks have been posted and the file has been modified. */ - public async postTask(listId: string | undefined, editor: Editor, fileName: string | undefined, replace?: boolean) { - const logger = logging.getLogger('mstodo-sync.command.post'); - + public async postTask(listId: string | undefined, editor: Editor, replace?: boolean) { if (!listId) { this.userNotice.showMessage(t('CommandNotice_SetListName')); return; @@ -405,8 +386,9 @@ export class MsTodoActions { const { lines } = await this.getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. - await this.getTaskDelta(listId); + const cachedTasksDelta = await this.getTaskDelta(listId); + // Get all the lines the user has selected. const split = source.split('\n'); const modifiedPage = await Promise.all( split.map(async (line: string, index: number) => { @@ -423,30 +405,10 @@ export class MsTodoActions { // As a user can add a block link, not all tasks will be able to // lookup a id from the internal cache. if (todo.hasBlockLink && todo.hasId) { - logger.debug(`Updating Task: ${todo.title}`); - // Check for linked resource and update if there otherwise create. - const cachedTasksDelta = await this.getDeltaCache(); const cachedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); - const titleMatch = todo.title === cachedTask?.title; - const statusMatch = todo.status === cachedTask?.status; - const localDueDate = - todo.dueDateTime === undefined - ? undefined - : DateTime.fromISO(todo.dueDateTime?.dateTime ?? '', { - zone: todo.dueDateTime?.timeZone ?? 'utc', - }); - const remoteDueDate = - cachedTask?.dueDateTime === undefined - ? undefined - : DateTime.fromISO(cachedTask?.dueDateTime?.dateTime ?? '', { - zone: cachedTask.dueDateTime?.timeZone ?? 'utc', - }); - const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); - const importanceMatch = todo.importance === cachedTask?.importance; - - if (cachedTask && (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch)) { + if (cachedTask && !todo.equals(cachedTask)) { const linkedResource = cachedTask.linkedResources?.first(); if (linkedResource && linkedResource.id) { await this.todoApi.updateLinkedResource( @@ -469,20 +431,22 @@ export class MsTodoActions { todo.linkedResources = cachedTask?.linkedResources; // Only update if there is a need. - if (!titleMatch || !statusMatch || !dueDateTimeMatch || !importanceMatch) { + if (cachedTask && !todo.equals(cachedTask)) { + this.logger.info(`Updating Task: ${todo.title}`, todo.getTodoTask()); + const returnedTask = await this.todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); - logger.debug(`updated: ${returnedTask.id}`); + this.logger.debug(`updated: ${returnedTask.id}`); } - logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + this.logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); } else { - logger.debug(`Creating Task: ${todo.title}`); - logger.debug(`Creating Task: ${listId}`); + this.logger.info(`Creating Task: ${todo.title}`); + this.logger.debug(`Creating Task: ${listId}`); const returnedTask = await this.todoApi.createTaskFromToDo(listId, todo.getTodoTask()); todo.status = returnedTask.status; await todo.cacheTaskId(returnedTask.id ?? ''); - logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); + this.logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`, todo); } // If false there will be a orphaned block id for this task. @@ -494,12 +458,11 @@ export class MsTodoActions { }), ); + // Update the entire page. await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } public async getTask(listId: string | undefined, editor: Editor) { - const logger = logging.getLogger('mstodo-sync.command.get'); - if (!listId) { this.userNotice.showMessage(t('CommandNotice_SetListName')); return; @@ -516,7 +479,7 @@ export class MsTodoActions { const { lines } = await this.getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. - await this.getTaskDelta(listId); + const cachedTasksDelta = await this.getTaskDelta(listId); const split = source.split('\n'); const modifiedPage = await Promise.all( @@ -534,19 +497,18 @@ export class MsTodoActions { // As a user can add a block link, not all tasks will be able to // lookup a id from the internal cache. if (todo.hasBlockLink && todo.hasId) { - logger.debug(`Updating Task: ${todo.title}`); + this.logger.debug(`Updating Task: ${todo.title}`); // Load from the delta cache file and pull the task from the cache. - const cachedTasksDelta = await this.getDeltaCache(); const returnedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); - if (returnedTask) { + // Update if there is only a difference. + if (returnedTask && !todo.equals(returnedTask)) { todo.updateFromTodoTask(returnedTask); - logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); - logger.debug(`updated: ${returnedTask.id}`); + this.logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); + this.logger.debug(`updated: ${returnedTask.id}`); + return todo.getMarkdownTask(true); } - - return todo.getMarkdownTask(true); } return line; @@ -556,30 +518,56 @@ export class MsTodoActions { await this.plugin.app.vault.modify(activeFile, modifiedPage.join('\n')); } - private async getDeltaCache() { - const cachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; + /** + * Retrieves the cached tasks delta from the specified file path. + * + * This method checks if the delta cache file exists in the vault adapter. + * If the file exists, it reads and parses the JSON content into a `TasksDeltaCollection` object. + * If the file does not exist, it returns `undefined`. + * + * @returns {Promise} A promise that resolves to the cached tasks delta or `undefined` if the cache file does not exist. + */ + private async getDeltaCache(): Promise { const adapter: DataAdapter = this.plugin.app.vault.adapter; let cachedTasksDelta: TasksDeltaCollection | undefined; - if (await adapter.exists(cachePath)) { - cachedTasksDelta = JSON.parse(await adapter.read(cachePath)) as TasksDeltaCollection; + if (await adapter.exists(this.deltaCachePath)) { + cachedTasksDelta = JSON.parse(await adapter.read(this.deltaCachePath)) as TasksDeltaCollection; } return cachedTasksDelta; } - private async getTaskDelta(listId: string | undefined, reset = false) { - const logger = logging.getLogger('mstodo-sync.command.delta'); + private async resetDeltaCache() { + const adapter: DataAdapter = this.plugin.app.vault.adapter; + await adapter.remove(this.deltaCachePath); + } + private async setDeltaCache(cachedTasksDelta: TasksDeltaCollection) { + const adapter: DataAdapter = this.plugin.app.vault.adapter; + await adapter.write(this.deltaCachePath, JSON.stringify(cachedTasksDelta)); + } + + /** + * Retrieves the delta of tasks for a given list. If a list ID is not provided, + * a user notice is shown. Optionally, the delta cache can be reset. + * + * @param {string | undefined} listId - The ID of the task list to retrieve the delta for. + * @param {boolean} [reset=false] - Whether to reset the delta cache. + * @returns {Promise} - A promise that resolves to the updated tasks delta collection. + * + * @throws {Error} - Throws an error if the task retrieval fails. + */ + private async getTaskDelta( + listId: string | undefined, + reset: boolean = false, + ): Promise { if (!listId) { this.userNotice.showMessage(t('CommandNotice_SetListName')); return; } - - const cachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; - const adapter: DataAdapter = this.plugin.app.vault.adapter; if (reset) { - await adapter.remove(cachePath); + this.resetDeltaCache(); } let deltaLink = ''; @@ -592,24 +580,24 @@ export class MsTodoActions { } const returnedTask = await this.todoApi.getTasksDelta(listId, deltaLink); - logger.info('deltaLink', deltaLink); - logger.info('ReturnedDelta', returnedTask); - if (cachedTasksDelta) { - logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); - logger.info('returnedTask.allTasks', returnedTask.allTasks.length); + this.logger.info('Cache Details', { + currentCacheCount: cachedTasksDelta.allTasks.length, + returnedCount: returnedTask.allTasks.length, + }); cachedTasksDelta.allTasks = this.mergeCollections(cachedTasksDelta.allTasks, returnedTask.allTasks); - logger.info('cachedTasksDelta.allTasks', cachedTasksDelta.allTasks.length); - + this.logger.info('Cache Details', { currentCacheCount: cachedTasksDelta.allTasks.length }); cachedTasksDelta.deltaLink = returnedTask.deltaLink; } else { - logger.info('First run, loading delta cache'); + this.logger.info('First run, loading delta cache'); cachedTasksDelta = returnedTask; } - await adapter.write(cachePath, JSON.stringify(cachedTasksDelta)); + await this.setDeltaCache(cachedTasksDelta); + + return cachedTasksDelta; } // Function to merge collections @@ -653,7 +641,7 @@ export class MsTodoActions { * - `lines`: An array of line numbers that are currently selected or where the cursor is located. */ private async getCurrentLinesFromEditor(editor: Editor): Promise { - this.logger.info('Getting current lines from editor', { + this.logger.debug('Getting current lines from editor', { from: editor.getCursor('from'), to: editor.getCursor('to'), anchor: editor.getCursor('anchor'), @@ -672,7 +660,7 @@ export class MsTodoActions { start = editor.getCursor('from'); end = editor.getCursor('to'); // Lines = source.split('\n').slice(start.line, end.line + 1); - lines = Array.from({ length: end.line + 1 - start.line }, (v, k) => k + start.line); + lines = Array.from({ length: end.line + 1 - start.line }, (_v, k) => k + start.line); } else { start = editor.getCursor(); end = editor.getCursor(); diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index 85f9412..e32fada 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,8 +1,8 @@ -import { type App, PeriodicNotes, PluginSettingTab, Setting } from 'obsidian'; +import { type App, type PeriodicNotes, PluginSettingTab, Setting } from 'obsidian'; import type MsTodoSync from '../main.js'; import { t } from '../lib/lang.js'; import { type ILogOptions } from '../lib/logging.js'; -import { IUserNotice } from 'src/lib/userNotice.js'; +import type { IUserNotice } from 'src/lib/userNotice.js'; export interface IMsTodoSyncSettings { todoListSync: { diff --git a/src/lib/lang.test.ts b/src/lib/lang.test.ts index 2974191..60e56a6 100644 --- a/src/lib/lang.test.ts +++ b/src/lib/lang.test.ts @@ -1,3 +1,4 @@ +/* eslint-disable no-undef */ import { t } from './lang'; const mockedLangMap = diff --git a/src/main.ts b/src/main.ts index c862a13..ebb951d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,4 @@ -import { type CachedMetadata, type Editor, type MarkdownView, Plugin } from 'obsidian'; +import { type CachedMetadata, type Editor, type MarkdownFileInfo, type MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi.js'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings } from './gui/msTodoSyncSettingTab.js'; import { @@ -7,23 +7,22 @@ import { getAllTasksInList, getTask, getTaskDelta, - postTask, postTaskAndChildren, } from './command/msTodoCommand.js'; import { t } from './lib/lang.js'; import { log, logging } from './lib/logging.js'; import { SettingsManager } from './utils/settingsManager.js'; import { MicrosoftClientProvider } from './api/microsoftClientProvider.js'; -import { IUserNotice, UserNotice } from './lib/userNotice.js'; +import { type IUserNotice, UserNotice } from './lib/userNotice.js'; import { MsTodoActions } from './command/msToDoActions.js'; export default class MsTodoSync extends Plugin { - settings: IMsTodoSyncSettings; - userNotice: IUserNotice; - public todoApi: TodoApi; - public settingsManager: SettingsManager; - public microsoftClientProvider: MicrosoftClientProvider; - public msToDoActions: MsTodoActions; + settings!: IMsTodoSyncSettings; + userNotice!: IUserNotice; + public todoApi!: TodoApi; + public settingsManager!: SettingsManager; + public microsoftClientProvider!: MicrosoftClientProvider; + public msToDoActions!: MsTodoActions; // Pulls the meta data for the a page to help with list processing. getPageMetadata(path: string): CachedMetadata | undefined { @@ -99,7 +98,7 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'only-create-task', name: t('CommandName_PushToMsTodo'), - editorCallback: async (editor: Editor, _view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView | MarkdownFileInfo) => { await this.pushTaskToMsTodo(editor); }, }); @@ -109,7 +108,7 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'create-task-replace', name: t('CommandName_PushToMsTodoAndReplace'), - editorCallback: async (editor: Editor, _view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView | MarkdownFileInfo) => { await this.pushTaskToMsTodoAndUpdatePage(editor); }, }); @@ -118,7 +117,7 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'open-task-link', name: t('CommandName_OpenToDo'), - editorCallback: async (editor: Editor, _view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView | MarkdownFileInfo) => { this.msToDoActions.viewTaskInTodo(editor); }, }); @@ -126,10 +125,20 @@ export default class MsTodoSync extends Plugin { this.addCommand({ id: 'add-microsoft-todo', name: t('CommandName_InsertSummary'), - editorCallback: async (editor: Editor, _view: MarkdownView) => { + editorCallback: async (editor: Editor, _view: MarkdownView | MarkdownFileInfo) => { await createTodayTasks(this.todoApi, this.settings, editor); }, }); + + if (this.settings.hackingEnabled) { + this.addCommand({ + id: 'sync-vault', + name: 'Sync Vault', + callback: async () => { + this.msToDoActions.syncVault(this.settings.todoListSync?.listId); + }, + }); + } } /** @@ -264,6 +273,11 @@ export default class MsTodoSync extends Plugin { this.msToDoActions.syncVault(this.settings.todoListSync?.listId); }); }); + menu.addItem((item) => { + item.setTitle('Add Missing Tasks').onClick(async () => { + this.msToDoActions.addMissingTasksToVault(this.settings.todoListSync?.listId, editor); + }); + }); }), ); } @@ -280,12 +294,7 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been posted and the page updated. */ private async pushTaskToMsTodoAndUpdatePage(editor: Editor) { - await this.msToDoActions.postTask( - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - true, - ); + await this.msToDoActions.postTask(this.settings.todoListSync?.listId, editor, true); } /** @@ -295,11 +304,6 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been successfully pushed. */ private async pushTaskToMsTodo(editor: Editor) { - await this.msToDoActions.postTask( - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - false, - ); + await this.msToDoActions.postTask(this.settings.todoListSync?.listId, editor, false); } } diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index cc28eec..5afed33 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -15,13 +15,14 @@ import { import { type ISettingsManager } from 'src/utils/settingsManager.js'; import { logging } from '../lib/logging.js'; import { CREATED_REGEX, DUE_REGEX, IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; +import { DateTime } from 'luxon'; /** * Represents a task in Obsidian that can be synchronized with Microsoft To Do. * Implements the TodoTask interface. */ export class ObsidianTodoTask implements TodoTask { - id: string; + id!: string; // The task body that typically contains information about the task. public body?: NullableOption; @@ -258,6 +259,32 @@ export class ObsidianTodoTask implements TodoTask { this.settingsManager.saveSettings(); } + public equals(todoTask: TodoTask): boolean { + const titleMatch = this.title === todoTask.title; + const statusMatch = this.status === todoTask.status; + const localDueDate = + this.dueDateTime === undefined + ? undefined + : DateTime.fromISO(this.dueDateTime?.dateTime ?? '', { + zone: this.dueDateTime?.timeZone ?? 'utc', + }); + const remoteDueDate = + todoTask.dueDateTime === undefined + ? undefined + : DateTime.fromISO(todoTask.dueDateTime?.dateTime ?? '', { + zone: todoTask.dueDateTime?.timeZone ?? 'utc', + }); + const dueDateTimeMatch = localDueDate?.toISODate() === remoteDueDate?.toISODate(); + const importanceMatch = this.importance === todoTask.importance; + + // If all the properties match then no update will occur. + if (titleMatch && statusMatch && dueDateTimeMatch && importanceMatch) { + return true; + } + + return false; + } + /** * Get the task as a TodoTask object. * @param withChecklist - Whether to include checklist items in the returned task. @@ -290,6 +317,8 @@ export class ObsidianTodoTask implements TodoTask { if (this.dueDateTime) { toDo.dueDateTime = this.dueDateTime; + } else { + toDo.dueDateTime = null; } return toDo; @@ -404,8 +433,8 @@ export class ObsidianTodoTask implements TodoTask { // Add in the body if it exists and indented by two spaces. if (this.body?.content && this.body.content.length > 0) { - for (const bodyLine of this.body?.content.split('\n')) { - // eslint-disable-line no-unsafe-optional-chaining + const bodyLines = this.body.content.split('\n'); + for (const bodyLine of bodyLines) { if (bodyLine.trim().length > 0) { formattedBody += ' ' + bodyLine + '\n'; } diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index 0a0a21e..8c47121 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-unused-vars */ import _ from 'obsidian'; declare module 'obsidian' { @@ -9,6 +8,7 @@ declare module 'obsidian' { } interface MetadataCache { + // eslint-disable-next-line no-undef metadataCache: Record; fileCache: Record; } diff --git a/src/utils/settingsManager.ts b/src/utils/settingsManager.ts index 38c1ef2..07867ba 100644 --- a/src/utils/settingsManager.ts +++ b/src/utils/settingsManager.ts @@ -19,7 +19,15 @@ class SettingsManager implements ISettingsManager { } public getTaskIdFromBlockId(blockId: string): string { - return this.findKeyCaseInsensitive(this.plugin.settings.taskIdLookup, blockId); + return this.findKeyCaseInsensitive(this.plugin.settings.taskIdLookup, blockId) as string; + } + + public hasTaskId(taskId: string): boolean { + for (const key in this.plugin.settings.taskIdLookup) { + if (this.plugin.settings.taskIdLookup[key] === taskId) { + return true; + } + } } async saveSettings(): Promise { @@ -27,7 +35,7 @@ class SettingsManager implements ISettingsManager { await this.plugin.saveData(this.plugin.settings); } - private findKeyCaseInsensitive(obj: Record, key: string): any { + private findKeyCaseInsensitive(obj: Record, key: string): unknown { const lowerCaseKey = key.toLowerCase(); const foundKey = Object.keys(obj).find((k) => k.toLowerCase() === lowerCaseKey); return foundKey ? obj[foundKey] : undefined; diff --git a/tsconfig.json b/tsconfig.json index 46aa2c8..00f7fe5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,8 @@ "verbatimModuleSyntax": true, "lib": ["DOM", "ESNext"], "allowSyntheticDefaultImports": true, - "skipLibCheck": true + "skipLibCheck": true, + "resolveJsonModule": true }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] From 11486890c6d8491b88f54f6f2b4ac37fa0c71665 Mon Sep 17 00:00:00 2001 From: sytone Date: Fri, 10 Jan 2025 17:16:22 -0800 Subject: [PATCH 31/34] feat: moved to handle all list in todo and added list indicator --- jest-setup.js | 3 + jest.config.js | 9 - jest.config.ts | 22 ++ package.json | 4 +- pnpm-lock.yaml | 147 ++++++++++-- src/__mocks__/obsidian.ts | 30 +++ src/api/todoApi.ts | 56 +++-- src/command/msToDoActions.ts | 350 +++++++++++++++++++++-------- src/constants.ts | 1 + src/gui/msTodoSyncSettingTab.ts | 18 +- src/main.ts | 14 +- src/model/obsidianTodoTask.test.ts | 278 +++++++++++++++++++++++ src/model/obsidianTodoTask.ts | 70 +++++- tsconfig.json | 7 +- 14 files changed, 850 insertions(+), 159 deletions(-) delete mode 100644 jest.config.js create mode 100644 jest.config.ts create mode 100644 src/__mocks__/obsidian.ts create mode 100644 src/model/obsidianTodoTask.test.ts diff --git a/jest-setup.js b/jest-setup.js index a256d9e..8b6027e 100644 --- a/jest-setup.js +++ b/jest-setup.js @@ -26,3 +26,6 @@ class LocalStorageMock { } globalThis.localStorage = new LocalStorageMock(); + +// eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef +globalThis.moment = require('moment'); diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 877244b..0000000 --- a/jest.config.js +++ /dev/null @@ -1,9 +0,0 @@ -module.exports = { - testEnvironment: 'node', - testMatch: ['**/src/**/*.test.js', '**/src/**/*.test.ts'], - transform: { - '^.+\\.ts$': 'ts-jest', - }, - setupFilesAfterEnv: ['./jest-setup.js'], - moduleFileExtensions: ['ts', 'js', 'json', 'node'], -}; diff --git a/jest.config.ts b/jest.config.ts new file mode 100644 index 0000000..d6fb556 --- /dev/null +++ b/jest.config.ts @@ -0,0 +1,22 @@ +// jest.config.ts +import { pathsToModuleNameMapper } from 'ts-jest'; +// In the following statement, replace `./tsconfig` with the path to your `tsconfig` file +// which contains the path mapping (ie the `compilerOptions.paths` option): +import { compilerOptions } from './tsconfig.json'; +import type { JestConfigWithTsJest } from 'ts-jest'; + +const jestConfig: JestConfigWithTsJest = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/src/**/*.test.js', '**/src/**/*.test.ts'], + transform: { + '^.+\\.ts$': 'ts-jest', + }, + setupFilesAfterEnv: ['./jest-setup.js'], + moduleFileExtensions: ['ts', 'js', 'json', 'node'], + roots: [''], + modulePaths: [compilerOptions.baseUrl, '/node_modules'], // <-- This will be set to 'baseUrl' value + moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths /*, { prefix: '/' } */), +}; + +export default jestConfig; diff --git a/package.json b/package.json index 1161f18..7980d17 100644 --- a/package.json +++ b/package.json @@ -36,9 +36,11 @@ "globals": "^15.14.0", "jest": "^29.7.0", "luxon": "^3.5.0", + "moment": "^2.30.1", "obsidian": "latest", "prettier": "^3.4.2", "ts-jest": "^29.2.5", + "ts-node": "^10.9.2", "tslib": "^2.8.1", "typescript": "^4.9.5", "typescript-eslint": "^8.19.0" @@ -78,4 +80,4 @@ ] } } -} +} \ No newline at end of file diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3b0a341..95eadcd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,10 +74,13 @@ importers: version: 15.14.0 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@16.18.122) + version: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) luxon: specifier: ^3.5.0 version: 3.5.0 + moment: + specifier: ^2.30.1 + version: 2.30.1 obsidian: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) @@ -86,7 +89,10 @@ importers: version: 3.4.2 ts-jest: specifier: ^29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122))(typescript@4.9.5) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)))(typescript@4.9.5) + ts-node: + specifier: ^10.9.2 + version: 10.9.2(@types/node@16.18.122)(typescript@4.9.5) tslib: specifier: ^2.8.1 version: 2.8.1 @@ -282,6 +288,10 @@ packages: '@codemirror/view@6.4.1': resolution: {integrity: sha512-QdBpD6E5HYx6YFXXhqwrRyQ83w7CxWZnchM4QpWBVkkmV7/oJT8N+yz2KAi2iRaLObc/aOf7C2RCQTO2yswF8A==} + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + '@esbuild/android-arm64@0.17.6': resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} engines: {node: '>=12'} @@ -566,6 +576,9 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@microsoft/microsoft-graph-client@3.0.7': resolution: {integrity: sha512-/AazAV/F+HK4LIywF9C+NYHcJo038zEnWkteilcxC1FM/uK/4NVGDKGrxx7nNq1ybspAroRKT4I1FHfxQzxkUw==} engines: {node: '>=12.0.0'} @@ -618,6 +631,18 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} @@ -730,6 +755,10 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-walk@8.3.4: + resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} + engines: {node: '>=0.4.0'} + acorn@8.14.0: resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} @@ -758,6 +787,9 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -965,6 +997,9 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -1037,6 +1072,10 @@ packages: resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -2050,6 +2089,9 @@ packages: moment@2.29.4: resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + moment@2.30.1: + resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} + monkey-around@2.3.0: resolution: {integrity: sha512-QWcCUWjqE/MCk9cXlSKZ1Qc486LD439xw/Ak8Nt6l2PuL9+yrc9TJakt7OHDuOqPRYY4nTWBAEFKn32PE/SfXA==} @@ -2491,6 +2533,20 @@ packages: esbuild: optional: true + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -2561,6 +2617,9 @@ packages: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + v8-to-istanbul@9.3.0: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} @@ -2622,6 +2681,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} @@ -2840,6 +2903,10 @@ snapshots: style-mod: 4.1.2 w3c-keyname: 2.2.8 + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + '@esbuild/android-arm64@0.17.6': optional: true @@ -2982,7 +3049,7 @@ snapshots: jest-util: 29.7.0 slash: 3.0.0 - '@jest/core@29.7.0': + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5))': dependencies: '@jest/console': 29.7.0 '@jest/reporters': 29.7.0 @@ -2996,7 +3063,7 @@ snapshots: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@16.18.122) + jest-config: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -3152,6 +3219,11 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + '@microsoft/microsoft-graph-client@3.0.7': dependencies: '@babel/runtime': 7.26.0 @@ -3196,6 +3268,14 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@tsconfig/node10@1.0.11': {} + + '@tsconfig/node12@1.0.11': {} + + '@tsconfig/node14@1.0.3': {} + + '@tsconfig/node16@1.0.4': {} + '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.26.3 @@ -3348,6 +3428,10 @@ snapshots: dependencies: acorn: 8.14.0 + acorn-walk@8.3.4: + dependencies: + acorn: 8.14.0 + acorn@8.14.0: {} ajv@6.12.6: @@ -3374,6 +3458,8 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + arg@4.1.3: {} + argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -3621,13 +3707,13 @@ snapshots: core-util-is@1.0.3: {} - create-jest@29.7.0(@types/node@16.18.122): + create-jest@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@16.18.122) + jest-config: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3636,6 +3722,8 @@ snapshots: - supports-color - ts-node + create-require@1.1.1: {} + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -3697,6 +3785,8 @@ snapshots: diff-sequences@29.6.3: {} + diff@4.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4532,16 +4622,16 @@ snapshots: - babel-plugin-macros - supports-color - jest-cli@29.7.0(@types/node@16.18.122): + jest-cli@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@16.18.122) + create-jest: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@16.18.122) + jest-config: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -4551,7 +4641,7 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@16.18.122): + jest-config@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)): dependencies: '@babel/core': 7.26.0 '@jest/test-sequencer': 29.7.0 @@ -4577,6 +4667,7 @@ snapshots: strip-json-comments: 3.1.1 optionalDependencies: '@types/node': 16.18.122 + ts-node: 10.9.2(@types/node@16.18.122)(typescript@4.9.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4796,12 +4887,12 @@ snapshots: merge-stream: 2.0.0 supports-color: 8.1.1 - jest@29.7.0(@types/node@16.18.122): + jest@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)): dependencies: - '@jest/core': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@16.18.122) + jest-cli: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -4963,6 +5054,8 @@ snapshots: moment@2.29.4: {} + moment@2.30.1: {} + monkey-around@2.3.0: {} ms@2.1.3: {} @@ -5385,12 +5478,12 @@ snapshots: dependencies: typescript: 4.9.5 - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122))(typescript@4.9.5): + ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@16.18.122) + jest: 29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -5405,6 +5498,24 @@ snapshots: babel-jest: 29.7.0(@babel/core@7.26.0) esbuild: 0.14.54 + ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.122 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -5490,6 +5601,8 @@ snapshots: uuid@8.3.2: {} + v8-compile-cache-lib@3.0.1: {} + v8-to-istanbul@9.3.0: dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -5577,4 +5690,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + yn@3.1.1: {} + yocto-queue@0.1.0: {} diff --git a/src/__mocks__/obsidian.ts b/src/__mocks__/obsidian.ts new file mode 100644 index 0000000..eddeed1 --- /dev/null +++ b/src/__mocks__/obsidian.ts @@ -0,0 +1,30 @@ +export const mockObsidianApp = { + // Mock implementation of the App API + app: { + platform: () => 'desktop', + plugins: { + getPlugins: () => [], + isEnabled: () => true, + }, + }, + + // Mock implementation of the Workspace API + workspace: { + onLayoutReady: (callback: () => void) => { + setTimeout(callback, 0); + }, + getLeavesOfType: () => [], + getConfig: () => ({}), + }, + + // Mock implementation of the MarkdownView API + markdownView: { + getMode: () => 'source', + getMarkdown: () => '', + }, +}; + +// Mock implementation of the Obsidian global object +export const obsidian = { + ...mockObsidianApp, +}; diff --git a/src/api/todoApi.ts b/src/api/todoApi.ts index 230c758..a35c7ae 100644 --- a/src/api/todoApi.ts +++ b/src/api/todoApi.ts @@ -4,6 +4,7 @@ import { t } from '../lib/lang.js'; import { logging } from '../lib/logging.js'; import { type MicrosoftClientProvider } from './microsoftClientProvider.js'; +// This contains all the tasks for a specific list. export class TasksDeltaCollection { /** * @@ -11,9 +12,18 @@ export class TasksDeltaCollection { constructor( public allTasks: TodoTask[], public deltaLink: string, + public listId: string, + public name: string, ) {} } +export class ListsDeltaCollection { + /** + * + */ + constructor(public allLists: TasksDeltaCollection[]) {} +} + export class TodoApi { private readonly logger = logging.getLogger('mstodo-sync.TodoApi'); @@ -48,29 +58,31 @@ export class TodoApi { * @param searchPattern - An optional search pattern to filter tasks within the lists. * @returns A promise that resolves to an array of `TodoTaskList` objects, each containing their respective tasks, or `undefined` if no lists are found. */ - async getLists(searchPattern?: string): Promise { + async getLists(): Promise { const endpoint = '/me/todo/lists'; const todoLists = (await this.client.api(endpoint).get()).value as TodoTaskList[]; - return Promise.all( - todoLists.map(async (taskList) => { - try { - const containedTasks = await this.getListTasks(taskList.id, searchPattern); - return { - ...taskList, - tasks: containedTasks, - }; - } catch (error) { - this.logger.error('Failed to get tasks for list', taskList.displayName); - if (error instanceof Error) { - this.logger.error(error.message); - this.logger.error(error.stack ?? 'No stack trace available'); - throw new Error(error.message); - } - - throw new Error('Unknown issue getting Lists'); - } - }), - ); + + return todoLists; + // return Promise.all( + // todoLists.map(async (taskList) => { + // try { + // const containedTasks = await this.getListTasks(taskList.id, searchPattern); + // return { + // ...taskList, + // tasks: containedTasks, + // }; + // } catch (error) { + // this.logger.error('Failed to get tasks for list', taskList.displayName); + // if (error instanceof Error) { + // this.logger.error(error.message); + // this.logger.error(error.stack ?? 'No stack trace available'); + // throw new Error(error.message); + // } + + // throw new Error('Unknown issue getting Lists'); + // } + // }), + // ); } /** @@ -212,7 +224,7 @@ export class TodoApi { deltaLink = response['@odata.deltaLink']; } - const tasksDeltaCollection = new TasksDeltaCollection(allTasks, deltaLink); + const tasksDeltaCollection = new TasksDeltaCollection(allTasks, deltaLink, listId, ''); return tasksDeltaCollection; } diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts index 9f339c5..cb47265 100644 --- a/src/command/msToDoActions.ts +++ b/src/command/msToDoActions.ts @@ -5,7 +5,7 @@ import { type IMsTodoSyncSettings } from '../gui/msTodoSyncSettingTab.js'; import { UserNotice } from '../lib/userNotice.js'; import { logging } from '../lib/logging.js'; import { type TodoTask } from '@microsoft/microsoft-graph-types'; -import { TasksDeltaCollection, TodoApi } from '../api/todoApi.js'; +import { ListsDeltaCollection, TasksDeltaCollection, TodoApi } from '../api/todoApi.js'; import { t } from '../lib/lang.js'; import { ObsidianTodoTask } from '../model/obsidianTodoTask.js'; @@ -31,7 +31,8 @@ export class MsTodoActions { this.settings = settingsManager.settings; this.plugin = plugin; this.todoApi = todoApi; - this.deltaCachePath = `${this.plugin.app.vault.configDir}/mstd-tasks-delta.json`; + const pluginPath = this.plugin.manifest.dir; + this.deltaCachePath = `${pluginPath}/mstd-tasks-delta.json`; } /** @@ -44,7 +45,8 @@ export class MsTodoActions { * If a local task is on one ore more pages then the most recently modified page will be * classed as the source of truth. */ - public async syncVault(listId: string | undefined) { + public async syncVault() { + this.userNotice.showMessage(t('CommandNotice_SyncingVault'), 3000); // Get all the blocks in the vault. const blockCache = this.getAllVaultBlocks(); @@ -52,13 +54,36 @@ export class MsTodoActions { // Get the local task that is most recent in the case there are duplicate IDs in the vault. // The key is in the format of cacheKey-blockId. So need to pull the blockId from the key. - const localTasks: Record = {}; + const pageContentCache: Record = {}; + + const localTasks: Record< + string, + { mtime: number; pageHash: string; pagePath: string; block: BlockCache; taskLine: string } + > = {}; for (const key in blockCache) { if (Object.hasOwn(blockCache, key)) { const internalPageHash = key.split('-')[0]; const blockId = key.split('-')[1]; // Get the mtime. const mtime = blockCache[key].mtime; + const pagePath = blockCache[key].pagePath; + let taskContent = ''; + if (!pageContentCache[pagePath]) { + this.logger.info(`Reading Page: ${pagePath}`); + const fileReference = this.plugin.app.vault.getFileByPath(pagePath); + if (fileReference) { + pageContentCache[pagePath] = await this.plugin.app.vault.read(fileReference); + } + } + if (pageContentCache[pagePath]) { + taskContent = pageContentCache[pagePath].slice( + blockCache[key].block.position.start.offset, + blockCache[key].block.position.end.offset, + ); + } else { + this.logger.info(`Page content not found: ${pagePath}`, { blockId, internalPageHash }); + } + // If the localTasks contains the block id as key, check the value // and update if the mtime is more recent. if (localTasks[blockId] && localTasks[blockId].mtime < mtime) { @@ -67,6 +92,7 @@ export class MsTodoActions { pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block, + taskLine: taskContent, }; } else { localTasks[blockId] = { @@ -74,6 +100,7 @@ export class MsTodoActions { pageHash: internalPageHash, pagePath: blockCache[key].pagePath, block: blockCache[key].block, + taskLine: taskContent, }; } } @@ -82,14 +109,17 @@ export class MsTodoActions { this.logger.info(`Local Tasks: ${Object.keys(localTasks).length}`); // Get all the tasks from the cache. - const cachedTasksDelta = await this.getTaskDelta(listId, false); + const cachedTasksDelta = await this.getTaskDelta(); // If there are no tasks in the cache then return. if (!cachedTasksDelta) { return; } - this.logger.info(`Remote Tasks: ${cachedTasksDelta.allTasks.length}`); + // Get sum of all tasks in all lists. + const countOfAllTasks = cachedTasksDelta.allLists.reduce((acc, list) => acc + list.allTasks.length, 0); + + this.logger.info(`Remote Tasks: ${countOfAllTasks}`); this.logger.info(`Lookups in settings: ${Object.keys(this.plugin.settings.taskIdLookup).length}`); // Iterate over all the tasks in internal cache and update the block references. @@ -98,8 +128,17 @@ export class MsTodoActions { // For each of the cached block items get the taskId which is used int he remote // system. Then get the remote task from the cached list and finally the local task // from the vault that was collected above. + const taskId = this.settingsManager.getTaskIdFromBlockId(blockId); - const cachedTask = cachedTasksDelta.allTasks.find((task) => task.id === taskId); + + // Check if the task exists in the remote cache + const { list, task: cachedTask } = await this.getListAndTaskFromTaskId(taskId, true); + + if (!list || !cachedTask) { + this.logger.info(`Task not found in remote cache: ${taskId}`); + continue; + } + const localTask = localTasks[blockId.toLowerCase()]; if (!localTask) { this.logger.info(`Block not found in local tasks: ${blockId}`); @@ -107,21 +146,31 @@ export class MsTodoActions { } const block = blockCache[`${localTasks[blockId.toLowerCase()].pageHash}-${blockId.toLowerCase()}`]; - const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); + //const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); - if (!block || !cachedTask || !localTask || !cachedTask.lastModifiedDateTime || !vaultFileReference) { - this.logger.info(`Issue with finding local or remote task for: ${blockId}`); + if (!block || !cachedTask || !localTask || !cachedTask.lastModifiedDateTime || !localTask.taskLine) { + if (!block) { + this.logger.info(`Issue with finding block in vault for: ${blockId}`); + } + if (!cachedTask) { + this.logger.info(`Issue with finding remote task for: ${blockId}`); + } + if (!localTask) { + this.logger.info(`Issue with finding local task for: ${blockId}`); + } + if (!cachedTask.lastModifiedDateTime) { + this.logger.info(`Issue with finding remote task lastModifiedDateTime for: ${blockId}`); + } + if (!localTask.taskLine) { + this.logger.info(`Issue with finding local task taskLine for: ${blockId}`, localTask); + } continue; } const localTaskNewer = new Date(cachedTask.lastModifiedDateTime) < new Date(localTask.mtime); // Get the string from the page using the start and end provided by the block. - const pageContent = await this.plugin.app.vault.read(vaultFileReference); - const taskContent = pageContent.slice( - localTask.block.position.start.offset, - localTask.block.position.end.offset, - ); + const taskContent = localTask.taskLine; const internalTask = new ObsidianTodoTask(this.settingsManager, taskContent); internalTask.id = taskId; @@ -130,6 +179,8 @@ export class MsTodoActions { continue; } + this.logger.info('Checking Sync Direction', { blockId }); + // Now we need to check the following: // If the local task is more recent than the remote task then update the remote task. // If the remote task is more recent than the local task then update the local task. @@ -140,7 +191,7 @@ export class MsTodoActions { // Push local update to remote API. const returnedTask = await this.todoApi.updateTaskFromToDo( - listId, + list.listId, internalTask.id, internalTask.getTodoTask(), ); @@ -155,17 +206,49 @@ export class MsTodoActions { internalTask.updateFromTodoTask(cachedTask); const updatedTask = internalTask.getMarkdownTask(true); - await this.plugin.app.vault.process(vaultFileReference, (data) => { - const newPageContent = data.replace(taskContent, updatedTask); + const vaultFileReference = this.plugin.app.vault.getFileByPath(localTask.pagePath); + if (vaultFileReference) { + await this.plugin.app.vault.process(vaultFileReference, (data) => { + const newPageContent = data.replace(taskContent, updatedTask); - this.logger.debug(`Updating Task ID: ${blockId}`, newPageContent); - return newPageContent; - }); - updatedTasks++; + this.logger.debug(`Updating Task ID: ${blockId}`, newPageContent); + return newPageContent; + }); + updatedTasks++; + } } } this.logger.info(`Updated Tasks: ${updatedTasks}`); + this.userNotice.showMessage(t('CommandNotice_SyncComplete'), 3000); + } + + /** + * Retrieves a specific task and its corresponding list from the cache based on the provided task ID. + * + * @param taskId - The ID of the task to retrieve. + * @returns A promise that resolves to an object containing the list and task. + * If the task is not found, both properties will be `undefined`. + */ + private async getListAndTaskFromTaskId( + taskId: string, + skipRemoteCheck = false, + ): Promise<{ list: TasksDeltaCollection | undefined; task: TodoTask | undefined }> { + // Get all the tasks from the cache. + const cachedTasksDelta = await this.getTaskDelta(false, skipRemoteCheck); + + // If there are no tasks in the cache then return. + if (!cachedTasksDelta) { + return { list: undefined, task: undefined }; + } + for (const list of cachedTasksDelta.allLists) { + const task = list.allTasks.find((t) => t.id === taskId); + if (task) { + return { list, task }; + } + } + + return { list: undefined, task: undefined }; } /** @@ -278,6 +361,7 @@ export class MsTodoActions { if (Object.hasOwn(internalMetadataCache, cacheKey) && internalMetadataCache[cacheKey].blocks) { const blocksCache = internalMetadataCache[cacheKey].blocks; const file = this.findBySubProperty(this.plugin.app.metadataCache.fileCache, 'hash', cacheKey); + // this.logger.info(`getAllVaultBlocks - File:`, file); for (const blockKey in blocksCache) { if (Object.hasOwn(internalMetadataCache, cacheKey)) { const block = blocksCache[blockKey.toLowerCase()]; @@ -315,43 +399,59 @@ export class MsTodoActions { return entry ? { key: entry[0], value: entry[1] } : undefined; } - public async addMissingTasksToVault(listId: string | undefined, editor?: Editor) { - if (!listId) { - this.userNotice.showMessage(t('CommandNotice_SetListName')); - return; - } + public async resetTasksCache() { + this.logger.debug('Resetting Delta Cache'); + + await this.getTaskDelta(true); + } + + public async addMissingTasksToVault(editor?: Editor) { const activeFile = this.plugin.app.workspace.getActiveFile(); if (activeFile === null) { return; } this.userNotice.showMessage(t('CommandNotice_AddingMissingTasks'), 3000); - const cachedTasksDelta = await this.getTaskDelta(listId); + const cachedTasksDelta = await this.getTaskDelta(); + + // cachedTasksDelta?.allLists.forEach((list) => { + // this.logger.info(`List: ${list.name}`); + // list.allTasks.forEach((task) => { + // this.logger.info(`Task: ${task.title}`, task); + // }); + // }); // For each task in the cache, check if it exists in the vault. // If it does not, create a new block in the vault. let createdTasks = 0; let addedTasks = ''; - for (const task of cachedTasksDelta?.allTasks ?? []) { - if (task.status === 'completed') { - continue; - } - // Check if the task ID exists in the block cache. - const blockId = task.id ? this.settingsManager.hasTaskId(task.id) : false; - if (blockId) { - this.logger.debug(`Task already tracked in vault.`, task.title); - continue; + for (const list of cachedTasksDelta?.allLists ?? []) { + for (const task of list?.allTasks ?? []) { + if (task.status === 'completed') { + continue; + } + // Check if the task ID exists in the block cache. + const blockId = task.id ? this.settingsManager.hasTaskId(task.id) : false; + if (blockId) { + this.logger.debug(`Task already tracked in vault.`, task.title); + continue; + } + this.logger.debug(`Block not found in vault: ${task.id}`, task.title); + + // Create a new block in the vault. + const newTask = new ObsidianTodoTask(this.settingsManager, ''); + newTask.listId = list.listId; + newTask.listName = list.name; + newTask.updateFromTodoTask(task); + newTask.cacheTaskId(task.id ?? ''); + addedTasks += `${newTask.getMarkdownTask(true)}\n`; + this.logger.info(`Adding Task: ${newTask.getMarkdownTask(true)}`, newTask); + createdTasks++; } - this.logger.debug(`Block not found in vault: ${task.id}`, task.title); - - // Create a new block in the vault. - const newTask = new ObsidianTodoTask(this.settingsManager, ''); - newTask.updateFromTodoTask(task); - newTask.cacheTaskId(task.id ?? ''); - addedTasks += `${newTask.getMarkdownTask(true)}\n`; - this.logger.info(`Adding Task: ${newTask.getMarkdownTask(true)}`, newTask); } if (editor) { + this.logger.info(`Page Updates: ${createdTasks}`, addedTasks); + editor.replaceSelection(addedTasks); } this.logger.info(`Created Tasks: ${createdTasks}`); @@ -369,12 +469,7 @@ export class MsTodoActions { * * @returns A promise that resolves when the tasks have been posted and the file has been modified. */ - public async postTask(listId: string | undefined, editor: Editor, replace?: boolean) { - if (!listId) { - this.userNotice.showMessage(t('CommandNotice_SetListName')); - return; - } - + public async postTask(editor: Editor, replace?: boolean) { const activeFile = this.plugin.app.workspace.getActiveFile(); if (activeFile === null) { return; @@ -386,7 +481,15 @@ export class MsTodoActions { const { lines } = await this.getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. - const cachedTasksDelta = await this.getTaskDelta(listId); + const cachedTasksDelta = await this.getTaskDelta(); + // If there are no tasks in the cache then return. + if (!cachedTasksDelta) { + return; + } + + // Get sum of all tasks in all lists. + const countOfAllTasks = cachedTasksDelta.allLists.reduce((acc, list) => acc + list.allTasks.length, 0); + this.logger.info(`Remote Tasks: ${countOfAllTasks}`); // Get all the lines the user has selected. const split = source.split('\n'); @@ -406,13 +509,13 @@ export class MsTodoActions { // lookup a id from the internal cache. if (todo.hasBlockLink && todo.hasId) { // Check for linked resource and update if there otherwise create. - const cachedTask = cachedTasksDelta?.allTasks.find((task) => task.id === todo.id); + const { list, task: cachedTask } = await this.getListAndTaskFromTaskId(todo.id); if (cachedTask && !todo.equals(cachedTask)) { const linkedResource = cachedTask.linkedResources?.first(); if (linkedResource && linkedResource.id) { await this.todoApi.updateLinkedResource( - listId, + list?.listId ?? '', todo.id, linkedResource.id, todo.blockLink ?? '', @@ -420,7 +523,7 @@ export class MsTodoActions { ); } else { await this.todoApi.createLinkedResource( - listId, + list?.listId ?? '', todo.id, todo.blockLink ?? '', todo.getRedirectUrl(), @@ -434,12 +537,40 @@ export class MsTodoActions { if (cachedTask && !todo.equals(cachedTask)) { this.logger.info(`Updating Task: ${todo.title}`, todo.getTodoTask()); - const returnedTask = await this.todoApi.updateTaskFromToDo(listId, todo.id, todo.getTodoTask()); + const returnedTask = await this.todoApi.updateTaskFromToDo( + list?.listId ?? '', + todo.id, + todo.getTodoTask(), + ); this.logger.debug(`updated: ${returnedTask.id}`); } this.logger.debug(`blockLink: ${todo.blockLink}, taskId: ${todo.id}`); } else { this.logger.info(`Creating Task: ${todo.title}`); + // Check for a list id in the settings. + let listId = this.settingsManager.settings.todoListSync.listId; + if (todo.listName) { + // Lookup the list id from the cache using the list name. + const list = cachedTasksDelta.allLists.find((l) => l.name === todo.listName); + listId = list?.listId; + if (!listId) { + if (this.settingsManager.settings.todo_CreateToDoListIfMissing) { + // Make the list. + const newTaskList = await this.todoApi.createTaskList(todo.listName); + this.logger.info(`Creating List: ${todo.listName}`, newTaskList); + if (!newTaskList) { + this.userNotice.showMessage(t('Error_UnableToCreateList')); + return; + } + todo.listId = newTaskList.id ?? ''; + listId = todo.listId; + } else { + this.userNotice.showMessage(t('Error_UnableToDetermineListId')); + return; + } + } + } + this.logger.debug(`Creating Task: ${listId}`); const returnedTask = await this.todoApi.createTaskFromToDo(listId, todo.getTodoTask()); @@ -525,77 +656,116 @@ export class MsTodoActions { * If the file exists, it reads and parses the JSON content into a `TasksDeltaCollection` object. * If the file does not exist, it returns `undefined`. * - * @returns {Promise} A promise that resolves to the cached tasks delta or `undefined` if the cache file does not exist. + * @returns {Promise} A promise that resolves to the cached tasks delta or `undefined` if the cache file does not exist. */ - private async getDeltaCache(): Promise { + private async getDeltaCache(): Promise { const adapter: DataAdapter = this.plugin.app.vault.adapter; - let cachedTasksDelta: TasksDeltaCollection | undefined; + let cachedTasksDelta: ListsDeltaCollection | undefined; if (await adapter.exists(this.deltaCachePath)) { - cachedTasksDelta = JSON.parse(await adapter.read(this.deltaCachePath)) as TasksDeltaCollection; + cachedTasksDelta = JSON.parse(await adapter.read(this.deltaCachePath)) as ListsDeltaCollection; } return cachedTasksDelta; } + /** + * Resets the delta cache by removing the cache file if it exists. + * + * This method checks if the delta cache file exists in the vault adapter. + * If the file exists, it removes the file to reset the cache. + * + * @returns {Promise} A promise that resolves when the cache file is removed. + */ private async resetDeltaCache() { const adapter: DataAdapter = this.plugin.app.vault.adapter; - await adapter.remove(this.deltaCachePath); + if (await adapter.exists(this.deltaCachePath)) { + await adapter.remove(this.deltaCachePath); + } } - private async setDeltaCache(cachedTasksDelta: TasksDeltaCollection) { + /** + * Asynchronously writes the provided delta of cached tasks to the specified cache path. + * + * @param cachedTasksDelta - The collection of task deltas to be cached. + * @returns A promise that resolves when the cache has been successfully written. + */ + private async setDeltaCache(cachedTasksDelta: ListsDeltaCollection) { const adapter: DataAdapter = this.plugin.app.vault.adapter; await adapter.write(this.deltaCachePath, JSON.stringify(cachedTasksDelta)); } /** - * Retrieves the delta of tasks for a given list. If a list ID is not provided, - * a user notice is shown. Optionally, the delta cache can be reset. + * Retrieves the delta of tasks for all lists. Optionally, the delta cache can be reset. * * @param {string | undefined} listId - The ID of the task list to retrieve the delta for. * @param {boolean} [reset=false] - Whether to reset the delta cache. - * @returns {Promise} - A promise that resolves to the updated tasks delta collection. + * @returns {Promise} - A promise that resolves to the updated tasks delta collection. * * @throws {Error} - Throws an error if the task retrieval fails. */ private async getTaskDelta( - listId: string | undefined, reset: boolean = false, - ): Promise { - if (!listId) { - this.userNotice.showMessage(t('CommandNotice_SetListName')); - return; - } + skipRemoteCheck: boolean = false, + ): Promise { + this.logger.debug('getTaskDelta', { reset, skipRemoteCheck }); + if (reset) { - this.resetDeltaCache(); + this.logger.info('Resetting Delta Cache'); + await this.resetDeltaCache(); } - let deltaLink = ''; let cachedTasksDelta = await this.getDeltaCache(); - if (cachedTasksDelta) { - deltaLink = cachedTasksDelta.deltaLink; - } else { - cachedTasksDelta = new TasksDeltaCollection([], ''); + if (!cachedTasksDelta) { + cachedTasksDelta = new ListsDeltaCollection([]); + + const allToDoLists = await this.todoApi.getLists(); + if (!allToDoLists) { + return; + } + + for (const list of allToDoLists) { + if (list.id && list.displayName) { + cachedTasksDelta.allLists.push(new TasksDeltaCollection([], '', list.id, list.displayName)); + } + } } - const returnedTask = await this.todoApi.getTasksDelta(listId, deltaLink); - if (cachedTasksDelta) { - this.logger.info('Cache Details', { - currentCacheCount: cachedTasksDelta.allTasks.length, - returnedCount: returnedTask.allTasks.length, - }); + // At this point we have a new empty cache or a cache with lists. For + // each list we will get the delta and merge the results. - cachedTasksDelta.allTasks = this.mergeCollections(cachedTasksDelta.allTasks, returnedTask.allTasks); - this.logger.info('Cache Details', { currentCacheCount: cachedTasksDelta.allTasks.length }); - cachedTasksDelta.deltaLink = returnedTask.deltaLink; - } else { - this.logger.info('First run, loading delta cache'); + for (const list of cachedTasksDelta.allLists) { + const deltaLink = list.deltaLink == '' ? '' : list.deltaLink; - cachedTasksDelta = returnedTask; + let returnedTask = new TasksDeltaCollection([], '', list.listId, list.name); + if (!skipRemoteCheck) { + returnedTask = await this.todoApi.getTasksDelta(list.listId, deltaLink); + } + + if (list.allTasks.length > 0) { + this.logger.debug('Cache Details', { + currentCacheCount: list.allTasks.length, + returnedCount: returnedTask.allTasks.length, + }); + + list.allTasks = this.mergeCollections(list.allTasks, returnedTask.allTasks); + this.logger.debug('Cache Details', { currentCacheCount: list.allTasks.length }); + list.deltaLink = returnedTask.deltaLink; + } else { + this.logger.info('First run or there was a reset, loading delta cache'); + list.allTasks = returnedTask.allTasks; + list.deltaLink = returnedTask.deltaLink; + } } - await this.setDeltaCache(cachedTasksDelta); + if (!skipRemoteCheck) { + // Save the updated cache. + const countOfAllTasks = cachedTasksDelta.allLists.reduce((acc, list) => acc + list.allTasks.length, 0); + + this.logger.info(`Saving Delta Cache storing ${countOfAllTasks} tasks`); + await this.setDeltaCache(cachedTasksDelta); + } return cachedTasksDelta; } diff --git a/src/constants.ts b/src/constants.ts index 3c2407a..504ec5e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -4,3 +4,4 @@ export const IMPORTANCE_REGEX = new RegExp(/{{IMPORTANCE}}/); export const STATUS_SYMBOL_REGEX = new RegExp(/{{STATUS_SYMBOL}}/); export const CREATED_REGEX = new RegExp(/{{CREATED_DATE}}/); export const DUE_REGEX = new RegExp(/{{DUE_DATE}}/); +export const TASK_LIST_NAME_REGEX = new RegExp(/{{TASK_LIST_NAME}}/); diff --git a/src/gui/msTodoSyncSettingTab.ts b/src/gui/msTodoSyncSettingTab.ts index e32fada..b1f9398 100644 --- a/src/gui/msTodoSyncSettingTab.ts +++ b/src/gui/msTodoSyncSettingTab.ts @@ -1,7 +1,7 @@ import { type App, type PeriodicNotes, PluginSettingTab, Setting } from 'obsidian'; -import type MsTodoSync from '../main.js'; -import { t } from '../lib/lang.js'; -import { type ILogOptions } from '../lib/logging.js'; +import type MsTodoSync from 'src/main.js'; +import { t } from 'src/lib/lang.js'; +import { type ILogOptions } from 'src/lib/logging.js'; import type { IUserNotice } from 'src/lib/userNotice.js'; export interface IMsTodoSyncSettings { @@ -10,6 +10,8 @@ export interface IMsTodoSyncSettings { listId: string | undefined; }; + todo_CreateToDoListIfMissing: boolean; + diary: { folder: string; format: string; @@ -39,6 +41,9 @@ export interface IMsTodoSyncSettings { displayOptions_TaskStatus_InProgress: string; displayOptions_TaskStatus_Completed: string; + displayOptions_ListIndicator: string; + displayOptions_ListIndicator_UseSingleQuotes: boolean; + // Microsoft To Do open handler. todo_OpenUsingApplicationProtocol: boolean; @@ -60,6 +65,7 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { listName: undefined, listId: undefined, }, + todo_CreateToDoListIfMissing: true, diary: { folder: '', format: '', @@ -73,7 +79,8 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { displayOptions_TaskStartPrefix: '🛫', displayOptions_TaskBodyPrefix: '💡', displayOptions_ReplaceAddCreatedAt: false, - displayOptions_ReplacementFormat: '- [{{STATUS_SYMBOL}}] {{TASK}} {{IMPORTANCE}}', + displayOptions_ReplacementFormat: + '- [{{STATUS_SYMBOL}}] {{TASK}}{{IMPORTANCE}}{{TASK_LIST_NAME}}{{DUE_DATE}}{{CREATED_DATE}}', displayOptions_TaskImportance_Low: '🔽', displayOptions_TaskImportance_Normal: '🔼', @@ -83,6 +90,9 @@ export const DEFAULT_SETTINGS: IMsTodoSyncSettings = { displayOptions_TaskStatus_InProgress: '/', displayOptions_TaskStatus_Completed: 'x', + displayOptions_ListIndicator: '+', + displayOptions_ListIndicator_UseSingleQuotes: false, + todo_OpenUsingApplicationProtocol: true, loggingOptions: { diff --git a/src/main.ts b/src/main.ts index ebb951d..ee9a518 100644 --- a/src/main.ts +++ b/src/main.ts @@ -228,19 +228,19 @@ export default class MsTodoSync extends Plugin { }); menu.addItem((item) => { item.setTitle('Update Task Cache').onClick(async () => { - await getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); + //await this.msToDoActions.getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); }); }); menu.addItem((item) => { item.setTitle('Reset Task Cache').onClick(async () => { - await getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this, true); + await this.msToDoActions.resetTasksCache(); }); }); menu.addItem((item) => { item.setTitle('Cleanup Local Task Lookup Table').onClick(async () => { - await cleanupCachedTaskIds(this); + await this.msToDoActions.cleanupCachedTaskIds(); }); }); @@ -270,12 +270,12 @@ export default class MsTodoSync extends Plugin { menu.addItem((item) => { item.setTitle('Sync Vault').onClick(async () => { - this.msToDoActions.syncVault(this.settings.todoListSync?.listId); + this.msToDoActions.syncVault(); }); }); menu.addItem((item) => { item.setTitle('Add Missing Tasks').onClick(async () => { - this.msToDoActions.addMissingTasksToVault(this.settings.todoListSync?.listId, editor); + this.msToDoActions.addMissingTasksToVault(editor); }); }); }), @@ -294,7 +294,7 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been posted and the page updated. */ private async pushTaskToMsTodoAndUpdatePage(editor: Editor) { - await this.msToDoActions.postTask(this.settings.todoListSync?.listId, editor, true); + await this.msToDoActions.postTask(editor, true); } /** @@ -304,6 +304,6 @@ export default class MsTodoSync extends Plugin { * @returns A promise that resolves when the task has been successfully pushed. */ private async pushTaskToMsTodo(editor: Editor) { - await this.msToDoActions.postTask(this.settings.todoListSync?.listId, editor, false); + await this.msToDoActions.postTask(editor, false); } } diff --git a/src/model/obsidianTodoTask.test.ts b/src/model/obsidianTodoTask.test.ts new file mode 100644 index 0000000..81157a5 --- /dev/null +++ b/src/model/obsidianTodoTask.test.ts @@ -0,0 +1,278 @@ +/* eslint-disable no-undef */ +import { ObsidianTodoTask } from './obsidianTodoTask'; +import { type ISettingsManager } from 'src/utils/settingsManager'; +import { + TodoTask, + NullableOption, + ItemBody, + DateTimeTimeZone, + Importance, + TaskStatus, +} from '@microsoft/microsoft-graph-types'; +import { DateTime } from 'luxon'; + +describe('ObsidianTodoTask', () => { + let settingsManager: ISettingsManager; + + beforeEach(() => { + settingsManager = { + settings: { + displayOptions_TaskCreatedPrefix: '🔎', + displayOptions_TaskDuePrefix: '📅', + displayOptions_TaskImportance_Low: '🔽', + displayOptions_TaskImportance_Normal: '🔼', + displayOptions_TaskImportance_High: '⏫', + displayOptions_TaskStatus_NotStarted: ' ', + displayOptions_TaskStatus_InProgress: '/', + displayOptions_TaskStatus_Completed: 'x', + displayOptions_ReplacementFormat: + '- [{{STATUS_SYMBOL}}] {{TASK}}{{IMPORTANCE}}{{TASK_LIST_NAME}}{{DUE_DATE}}{{CREATED_DATE}}', + displayOptions_ListIndicator: '+', + displayOptions_RegExToRunOnPushAgainstTitle: '', + microsoftToDoApplication_RedirectUriBase: 'https://todo.microsoft.com', + taskIdIndex: 0, + taskIdLookup: {}, + todoListSync: { + listName: 'ToDo', + listId: undefined, + }, + diary: { + folder: '', + format: '', + stayWithPN: false, + }, + displayOptions_DateFormat: 'YYYY-MM-DD', + displayOptions_TimeFormat: 'HH:mm', + displayOptions_TaskStartPrefix: '🛫', + displayOptions_TaskBodyPrefix: '💡', + displayOptions_ReplaceAddCreatedAt: false, + todo_OpenUsingApplicationProtocol: false, + microsoft_AuthenticationClientId: '', + microsoft_AuthenticationAuthority: '', + loggingOptions: { + minLevels: { + '': 'debug', + 'mstodo-sync': 'debug', + }, + }, + hackingEnabled: false, + displayOptions_ListIndicator_UseSingleQuotes: false, + }, + vaultName: 'test-vault', + saveSettings: jest.fn(), + }; + }); + + it('should create an instance of ObsidianTodoTask', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task).toBeInstanceOf(ObsidianTodoTask); + expect(task.title).toBe('Test task'); + }); + + it('should strip out block link from title', () => { + const line = '- [ ] Test task ^blockLink'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.title).toBe('Test task'); + expect(task.blockLink).toBe('blockLink'); + }); + + it('should strip out status from title', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.title).toBe('Test task'); + expect(task.status).toBe('notStarted'); + }); + + it('should strip out created date from title', () => { + const line = '- [ ] Test task 🔎2020-01-01'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.title).toBe('Test task'); + }); + + it('should strip out due date from title and set dueDateTime', () => { + const line = '- [ ] Test task 📅2020-01-01'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.title).toBe('Test task'); + expect(task.dueDateTime?.dateTime).toBe('2020-01-01'); + }); + + it('should set importance based on title', () => { + const line = '- [ ] Test task ⏫'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.importance).toBe('high'); + }); + + it('should cache task ID and generate block link', async () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + await task.cacheTaskId('12345'); + expect(task.id).toBe('12345'); + expect(task.blockLink).toMatch(/^MSTD/); + expect(settingsManager.saveSettings).toHaveBeenCalled(); + }); + + it('should check equality of tasks', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + const todoTask: TodoTask = { + title: 'Test task', + status: 'notStarted', + dueDateTime: { + dateTime: '2020-01-01', + timeZone: 'UTC', + }, + importance: 'normal', + }; + task.dueDateTime = { + dateTime: '2020-01-01', + timeZone: 'UTC', + }; + expect(task.equals(todoTask)).toBe(true); + }); + + it('should get TodoTask object', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + const todoTask = task.getTodoTask(); + expect(todoTask.title).toBe('Test task'); + }); + + it('should update from TodoTask object', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + const remoteTask: TodoTask = { + title: 'Updated task', + body: { + content: 'Updated content', + contentType: 'text', + }, + status: 'inProgress', + importance: 'high', + linkedResources: [], + dueDateTime: { + dateTime: '2020-01-01', + timeZone: 'UTC', + }, + }; + task.updateFromTodoTask(remoteTask); + expect(task.title).toBe('Updated task'); + expect(task.body?.content).toBe('Updated content'); + expect(task.status).toBe('inProgress'); + expect(task.importance).toBe('high'); + expect(task.dueDateTime?.dateTime).toBe('2020-01-01'); + }); + + it('should set body content', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + task.setBody('New body content'); + expect(task.body?.content).toBe('New body content'); + }); + + it('should add checklist item', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + task.addChecklistItem('New checklist item'); + expect(task.checklistItems?.length).toBe(1); + expect(task.checklistItems?.[0].displayName).toBe('New checklist item'); + }); + + it('should return markdown task', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + const markdownTask = task.getMarkdownTask(true); + expect(markdownTask).toBe('- [ ] Test task 🔎2025-01-10'); + }); + + const dataSet = [ + { + taskLine: '- [ ] Test task +"Test list" 🔎2025-01-10', + listName: 'Test list', + renderedLine: '- [ ] Test task +"Test list" 🔎2025-01-10', + }, + { + taskLine: "- [ ] Test task +'Test list' 🔎2025-01-10", + listName: 'Test list', + renderedLine: '- [ ] Test task +"Test list" 🔎2025-01-10', + }, + { + taskLine: "- [ ] Test task +'Testlist' 🔎2025-01-10", + listName: 'Testlist', + renderedLine: '- [ ] Test task +Testlist 🔎2025-01-10', + }, + { + taskLine: '- [ ] Test task +🔧MyList 🔎2025-01-10', + listName: '🔧MyList', + renderedLine: '- [ ] Test task +🔧MyList 🔎2025-01-10', + }, + { + taskLine: "- [ ] Test task +'🔧 MyList' 🔎2025-01-10", + listName: '🔧 MyList', + renderedLine: '- [ ] Test task +"🔧 MyList" 🔎2025-01-10', + }, + ]; + + it.each(dataSet)( + 'should return markdown task with list indicator ($taskLine, $listName, $renderedLine)', + ({ taskLine, listName, renderedLine }) => { + const task = new ObsidianTodoTask(settingsManager, taskLine); + task.listId = '12345'; + const markdownTask = task.getMarkdownTask(true); + expect(task.listName).toBe(listName); + expect(markdownTask).toContain('Test task'); + expect(markdownTask).toBe(`${renderedLine}`); + }, + ); + + it('should set list name to default value', () => { + const line = '- [ ] Test task'; + const task = new ObsidianTodoTask(settingsManager, line); + expect(task.listName).toBe('ToDo'); + const markdownTask = task.getMarkdownTask(true); + expect(markdownTask).toContain('+ToDo'); + }); + + it('should return markdown task with list indicator', () => { + const line = '- [ ] Test task +"Test list"'; + const task = new ObsidianTodoTask(settingsManager, line); + task.listId = '12345'; + const markdownTask = task.getMarkdownTask(true); + expect(task.listName).toBe('Test list'); + expect(markdownTask).toContain('Test task'); + expect(markdownTask).toContain('+"Test list"'); + }); + + it('should return markdown task with list indicator using single quotes', () => { + const line = '- [ ] Test task +"Test list"'; + settingsManager.settings.displayOptions_ListIndicator_UseSingleQuotes = true; + const task = new ObsidianTodoTask(settingsManager, line); + task.listId = '12345'; + const markdownTask = task.getMarkdownTask(true); + expect(task.listName).toBe('Test list'); + expect(markdownTask).toContain('Test task'); + expect(markdownTask).toContain("+'Test list'"); + }); + + it('should return markdown task with list indicator unquoted from quoted word', () => { + const line = '- [ ] Test task +"testListName"'; + settingsManager.settings.displayOptions_ListIndicator_UseSingleQuotes = true; + const task = new ObsidianTodoTask(settingsManager, line); + task.listId = '12345'; + const markdownTask = task.getMarkdownTask(true); + expect(task.listName).toBe('testListName'); + expect(markdownTask).toContain('Test task'); + expect(markdownTask).toContain('+testListName'); + }); + + it('should return markdown task with list indicator unquoted from unquoted word', () => { + const line = '- [ ] Test task +testListName'; + settingsManager.settings.displayOptions_ListIndicator_UseSingleQuotes = true; + const task = new ObsidianTodoTask(settingsManager, line); + task.listId = '12345'; + const markdownTask = task.getMarkdownTask(true); + expect(task.listName).toBe('testListName'); + expect(markdownTask).toContain('Test task'); + expect(markdownTask).toContain('+testListName'); + }); +}); diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index 5afed33..aee8055 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -12,9 +12,16 @@ import { type TaskStatus, type TodoTask, } from '@microsoft/microsoft-graph-types'; -import { type ISettingsManager } from 'src/utils/settingsManager.js'; -import { logging } from '../lib/logging.js'; -import { CREATED_REGEX, DUE_REGEX, IMPORTANCE_REGEX, STATUS_SYMBOL_REGEX, TASK_REGEX } from '../constants.js'; +import { type ISettingsManager } from 'src/utils/settingsManager'; +import { logging } from 'src/lib/logging'; +import { + CREATED_REGEX, + DUE_REGEX, + IMPORTANCE_REGEX, + STATUS_SYMBOL_REGEX, + TASK_LIST_NAME_REGEX, + TASK_REGEX, +} from 'src/constants'; import { DateTime } from 'luxon'; /** @@ -141,6 +148,9 @@ export class ObsidianTodoTask implements TodoTask { */ private readonly originalTitle: string; + public listId?: string; + public listName?: string; + /** * Creates an instance of ObsidianTodoTask. * @param settingsManager - The settings manager instance. @@ -162,6 +172,12 @@ export class ObsidianTodoTask implements TodoTask { // This will strip out the checkbox if in title. this.checkForStatus(line); + this.checkForListName(line); + + if (this.listName === undefined) { + this.listName = this.settingsManager.settings.todoListSync.listName; + } + // - [ ] Adding in updated linked resources updated from list dump 🔎[[2024-12-30]] 🔎[[2024-12-30]] ^MSTDa8de00053 // This will strip out the created date if in title. if (this.title.includes(settingsManager.settings.displayOptions_TaskCreatedPrefix)) { @@ -398,19 +414,19 @@ export class ObsidianTodoTask implements TodoTask { const priorityIndicator = this.importance === 'normal' ? '' : this.getPriorityIndicator(); output = format - .replace(TASK_REGEX, this.title?.trim() ?? '') + .replace(TASK_REGEX, `${this.title?.trim() ?? ''} `) .replace(STATUS_SYMBOL_REGEX, this.getStatusIndicator()); output = output.includes(priorityIndicator) ? output.replace(IMPORTANCE_REGEX, '') - : output.replace(IMPORTANCE_REGEX, priorityIndicator); + : output.replace(IMPORTANCE_REGEX, `${priorityIndicator} `); if (this.dueDateTime?.dateTime) { const formattedDueDate = globalThis .moment(this.dueDateTime?.dateTime) .format(this.settingsManager.settings.displayOptions_DateFormat); const dueDate = `${this.settingsManager.settings.displayOptions_TaskDuePrefix}${formattedDueDate}`; - output = output.replace(DUE_REGEX, dueDate); + output = output.replace(DUE_REGEX, `${dueDate} `); } else { output = output.replace(DUE_REGEX, ''); } @@ -419,7 +435,19 @@ export class ObsidianTodoTask implements TodoTask { .moment(this.createdDateTime) .format(this.settingsManager.settings.displayOptions_DateFormat); const createDate = `${this.settingsManager.settings.displayOptions_TaskCreatedPrefix}${formattedCreateDate}`; - output = output.replace(CREATED_REGEX, createDate); + output = output.replace(CREATED_REGEX, `${createDate} `); + + if (this.listName) { + const listNameHasSpace = this.listName.includes(' '); + const formattedListName = listNameHasSpace + ? this.settingsManager.settings.displayOptions_ListIndicator_UseSingleQuotes + ? `${this.settingsManager.settings.displayOptions_ListIndicator}'${this.listName}'` + : `${this.settingsManager.settings.displayOptions_ListIndicator}"${this.listName}"` + : `${this.settingsManager.settings.displayOptions_ListIndicator}${this.listName}`; + output = output.replace(TASK_LIST_NAME_REGEX, `${formattedListName} `); + } else { + output = output.replace(TASK_LIST_NAME_REGEX, ''); + } // Append block link at the end if it exists if (this.hasBlockLink && this.blockLink) { @@ -473,6 +501,32 @@ export class ObsidianTodoTask implements TodoTask { } } + private escapeRegExp(incomingRegexString: string) { + return incomingRegexString.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string + } + + private checkForListName(line: string) { + const listIndicator = this.settingsManager.settings.displayOptions_ListIndicator; + const quotedListNameRegex = new RegExp(` ${this.escapeRegExp(listIndicator)}\\s*(['"]([^'"]*)['"])`, 'm'); + const listNameMatch = quotedListNameRegex.exec(line); + if (listNameMatch) { + this.listName = listNameMatch[2]; + this.title = this.title?.replace(quotedListNameRegex, '').trim(); + + return; + } + + const unquotedListNameRegex = new RegExp(` ${this.escapeRegExp(listIndicator)}\\s*(([^\\s]*))`, 'm'); + + const listNameMatch2 = unquotedListNameRegex.exec(line); + if (listNameMatch2) { + this.listName = listNameMatch2[2]; + this.title = this.title?.replace(unquotedListNameRegex, '').trim(); + + return; + } + } + /** * Check the task title for an importance indicator and update the importance accordingly. * @param line - The line of text representing the task. @@ -532,7 +586,7 @@ export class ObsidianTodoTask implements TodoTask { } default: { - return ' '; + return ''; } } } diff --git a/tsconfig.json b/tsconfig.json index 00f7fe5..92883eb 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,11 +11,14 @@ "moduleResolution": "Node", "importHelpers": true, "isolatedModules": true, - "verbatimModuleSyntax": true, "lib": ["DOM", "ESNext"], "allowSyntheticDefaultImports": true, "skipLibCheck": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "paths": { + "src/*": ["src/*"], + "^obsidian$": ["/src/__mocks__/obsidian.ts"] + } }, "include": ["src/**/*.ts"], "exclude": ["node_modules"] From 416eecf55d8aee748ef756ed5f5aac8802e1d1c3 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 13 Feb 2025 09:19:38 -0800 Subject: [PATCH 32/34] refactor: moved menus and cleaned up logging --- src/command/msToDoActions.ts | 22 ++-- src/main.ts | 194 +++++++++++++++++++--------------- src/model/obsidianTodoTask.ts | 2 +- src/typings/obsidian-ex.d.ts | 14 +++ 4 files changed, 133 insertions(+), 99 deletions(-) diff --git a/src/command/msToDoActions.ts b/src/command/msToDoActions.ts index cb47265..998ea94 100644 --- a/src/command/msToDoActions.ts +++ b/src/command/msToDoActions.ts @@ -131,15 +131,15 @@ export class MsTodoActions { const taskId = this.settingsManager.getTaskIdFromBlockId(blockId); - // Check if the task exists in the remote cache + // Check if the task exists in the remote or local cache const { list, task: cachedTask } = await this.getListAndTaskFromTaskId(taskId, true); + const localTask = localTasks[blockId.toLowerCase()]; if (!list || !cachedTask) { - this.logger.info(`Task not found in remote cache: ${taskId}`); + this.logger.info(`Task not found in remote cache: ${blockId} - ${taskId}`); continue; } - const localTask = localTasks[blockId.toLowerCase()]; if (!localTask) { this.logger.info(`Block not found in local tasks: ${blockId}`); continue; @@ -433,7 +433,7 @@ export class MsTodoActions { // Check if the task ID exists in the block cache. const blockId = task.id ? this.settingsManager.hasTaskId(task.id) : false; if (blockId) { - this.logger.debug(`Task already tracked in vault.`, task.title); + this.logger.debug(`Task already tracked in vault: ${list.name} - `, task.title); continue; } this.logger.debug(`Block not found in vault: ${task.id}`, task.title); @@ -610,7 +610,7 @@ export class MsTodoActions { const { lines } = await this.getCurrentLinesFromEditor(editor); // Single call to update the cache using the delta link. - const cachedTasksDelta = await this.getTaskDelta(listId); + const cachedTasksDelta = await this.getTaskDelta(); const split = source.split('\n'); const modifiedPage = await Promise.all( @@ -708,7 +708,7 @@ export class MsTodoActions { reset: boolean = false, skipRemoteCheck: boolean = false, ): Promise { - this.logger.debug('getTaskDelta', { reset, skipRemoteCheck }); + // this.logger.debug('getTaskDelta', { reset, skipRemoteCheck }); if (reset) { this.logger.info('Resetting Delta Cache'); @@ -744,13 +744,13 @@ export class MsTodoActions { } if (list.allTasks.length > 0) { - this.logger.debug('Cache Details', { - currentCacheCount: list.allTasks.length, - returnedCount: returnedTask.allTasks.length, - }); + // this.logger.debug('Cache Details', { + // currentCacheCount: list.allTasks.length, + // returnedCount: returnedTask.allTasks.length, + // }); list.allTasks = this.mergeCollections(list.allTasks, returnedTask.allTasks); - this.logger.debug('Cache Details', { currentCacheCount: list.allTasks.length }); + // this.logger.debug('Cache Details', { currentCacheCount: list.allTasks.length }); list.deltaLink = returnedTask.deltaLink; } else { this.logger.info('First run or there was a reset, loading delta cache'); diff --git a/src/main.ts b/src/main.ts index ee9a518..be70321 100644 --- a/src/main.ts +++ b/src/main.ts @@ -167,117 +167,137 @@ export default class MsTodoSync extends Plugin { // }, // ); // }); - - menu.addItem((item) => { - item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick(async () => { - await this.pushTaskToMsTodoAndUpdatePage(editor); - }); - }); - - menu.addItem((item) => { - item.setTitle(t('EditorMenu_FetchFromRemote')).onClick(async () => { - await getTask( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - ); - }); - }); - menu.addItem((item) => { - item.setTitle('Sync Task with details (Push)').onClick(async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - true, - ); - }); - }); - - menu.addItem((item) => { - item.setTitle('Sync Task with details (Pull)').onClick(async () => { - await postTaskAndChildren( - this.todoApi, - this.settings.todoListSync?.listId, - editor, - this.app.workspace.getActiveFile()?.path, - this, - false, - ); - }); - }); - - menu.addItem((item) => { - item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { - this.msToDoActions.viewTaskInTodo(editor); - }); - }); - }), - ); - - if (this.settings.hackingEnabled) { - this.registerEvent( - this.app.workspace.on('editor-menu', (menu, editor, _view) => { - menu.addSeparator(); - menu.addItem((item) => { - item.setTitle('Testing Commands Enabled'); - }); - menu.addItem((item) => { - item.setTitle('Update Task Cache').onClick(async () => { - //await this.msToDoActions.getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); + menu.addItem(microsoftToDoItem => { + microsoftToDoItem.setTitle('Microsoft To-Do'); + microsoftToDoItem.setIcon('check-check'); + + const microsoftToDoSubmenu = microsoftToDoItem.setSubmenu(); + microsoftToDoSubmenu.addItem((item) => { + item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick(async () => { + await this.pushTaskToMsTodoAndUpdatePage(editor); }); }); - - menu.addItem((item) => { - item.setTitle('Reset Task Cache').onClick(async () => { - await this.msToDoActions.resetTasksCache(); - }); - }); - - menu.addItem((item) => { - item.setTitle('Cleanup Local Task Lookup Table').onClick(async () => { - await this.msToDoActions.cleanupCachedTaskIds(); + microsoftToDoSubmenu.addItem((item) => { + item.setTitle(t('EditorMenu_FetchFromRemote')).onClick(async () => { + await getTask( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this.app.workspace.getActiveFile()?.path, + this, + ); }); }); - - menu.addItem((item) => { - item.setTitle('Insert all tasks with body').onClick(async () => { - await getAllTasksInList( + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Sync Task with details (Push)').onClick(async () => { + await postTaskAndChildren( this.todoApi, this.settings.todoListSync?.listId, editor, + this.app.workspace.getActiveFile()?.path, this, true, ); }); }); - - menu.addItem((item) => { - item.setTitle('Insert all tasks').onClick(async () => { - await getAllTasksInList( + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Sync Task with details (Pull)').onClick(async () => { + await postTaskAndChildren( this.todoApi, this.settings.todoListSync?.listId, editor, + this.app.workspace.getActiveFile()?.path, this, false, ); }); }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { + this.msToDoActions.viewTaskInTodo(editor); + }); + }); + + }); + + + }), + ); + + if (this.settings.hackingEnabled) { + this.registerEvent( + this.app.workspace.on('editor-menu', (menu, editor, _view) => { - menu.addItem((item) => { - item.setTitle('Sync Vault').onClick(async () => { - this.msToDoActions.syncVault(); + menu.addItem(microsoftToDoItem => { + microsoftToDoItem.setTitle('Microsoft To-Do - Hacking'); + microsoftToDoItem.setIcon('skull'); + + const microsoftToDoSubmenu = microsoftToDoItem.setSubmenu(); + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Testing Commands Enabled'); }); - }); - menu.addItem((item) => { - item.setTitle('Add Missing Tasks').onClick(async () => { - this.msToDoActions.addMissingTasksToVault(editor); + microsoftToDoSubmenu.addSeparator(); + + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Sync Vault').onClick(async () => { + this.msToDoActions.syncVault(); + }); + }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Update Task Cache').onClick(async () => { + //await this.msToDoActions.getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); + }); + }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Reset Task Cache').onClick(async () => { + await this.msToDoActions.resetTasksCache(); + }); + }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Cleanup Local Task Lookup Table').onClick(async () => { + await this.msToDoActions.cleanupCachedTaskIds(); + }); + }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Insert all tasks with body').onClick(async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + true, + ); + }); + }); + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Insert all tasks').onClick(async () => { + await getAllTasksInList( + this.todoApi, + this.settings.todoListSync?.listId, + editor, + this, + false, + ); + }); + }); + + + microsoftToDoSubmenu.addItem((item) => { + item.setTitle('Add Missing Tasks').onClick(async () => { + this.msToDoActions.addMissingTasksToVault(editor); + }); }); }); + + }), ); } diff --git a/src/model/obsidianTodoTask.ts b/src/model/obsidianTodoTask.ts index aee8055..734c300 100644 --- a/src/model/obsidianTodoTask.ts +++ b/src/model/obsidianTodoTask.ts @@ -246,7 +246,7 @@ export class ObsidianTodoTask implements TodoTask { displayName: `Tracking Block Link: ${this.blockLink}`, }); - this.logger.debug(`Created: '${this.title}'`); + // this.logger.debug(`Created: '${this.title}'`); } public getRedirectUrl(): string { diff --git a/src/typings/obsidian-ex.d.ts b/src/typings/obsidian-ex.d.ts index 8c47121..7235941 100644 --- a/src/typings/obsidian-ex.d.ts +++ b/src/typings/obsidian-ex.d.ts @@ -46,4 +46,18 @@ declare module 'obsidian' { isAllCollapsed: boolean; collapseOrExpandAllEl: HTMLDivElement; } + + interface Menu { + dom: HTMLElement; + items: MenuItem[]; + onMouseOver: (evt: MouseEvent) => void; + } + + interface MenuItem { + callback: () => void; + dom: HTMLElement; + setSubmenu: () => Menu; + disabled: boolean; + setWarning: (warning: boolean) => void; + } } From e4f416451744ce8545b10506ede85f6dc09d35f7 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 13 Feb 2025 09:20:36 -0800 Subject: [PATCH 33/34] style: style cleanup --- src/main.ts | 30 +++++++++++------------------- 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/main.ts b/src/main.ts index be70321..2d5e827 100644 --- a/src/main.ts +++ b/src/main.ts @@ -167,10 +167,10 @@ export default class MsTodoSync extends Plugin { // }, // ); // }); - menu.addItem(microsoftToDoItem => { + menu.addItem((microsoftToDoItem) => { microsoftToDoItem.setTitle('Microsoft To-Do'); microsoftToDoItem.setIcon('check-check'); - + const microsoftToDoSubmenu = microsoftToDoItem.setSubmenu(); microsoftToDoSubmenu.addItem((item) => { item.setTitle(t('EditorMenu_SyncToTodoAndReplace')).onClick(async () => { @@ -200,7 +200,7 @@ export default class MsTodoSync extends Plugin { ); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle('Sync Task with details (Pull)').onClick(async () => { await postTaskAndChildren( @@ -213,34 +213,29 @@ export default class MsTodoSync extends Plugin { ); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle(t('EditorMenu_OpenToDo')).onClick(async () => { this.msToDoActions.viewTaskInTodo(editor); }); - }); - + }); }); - - }), ); if (this.settings.hackingEnabled) { this.registerEvent( this.app.workspace.on('editor-menu', (menu, editor, _view) => { - - menu.addItem(microsoftToDoItem => { + menu.addItem((microsoftToDoItem) => { microsoftToDoItem.setTitle('Microsoft To-Do - Hacking'); microsoftToDoItem.setIcon('skull'); - + const microsoftToDoSubmenu = microsoftToDoItem.setSubmenu(); microsoftToDoSubmenu.addItem((item) => { item.setTitle('Testing Commands Enabled'); }); microsoftToDoSubmenu.addSeparator(); - microsoftToDoSubmenu.addItem((item) => { item.setTitle('Sync Vault').onClick(async () => { this.msToDoActions.syncVault(); @@ -252,19 +247,19 @@ export default class MsTodoSync extends Plugin { //await this.msToDoActions.getTaskDelta(this.todoApi, this.settings.todoListSync?.listId, this); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle('Reset Task Cache').onClick(async () => { await this.msToDoActions.resetTasksCache(); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle('Cleanup Local Task Lookup Table').onClick(async () => { await this.msToDoActions.cleanupCachedTaskIds(); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle('Insert all tasks with body').onClick(async () => { await getAllTasksInList( @@ -276,7 +271,7 @@ export default class MsTodoSync extends Plugin { ); }); }); - + microsoftToDoSubmenu.addItem((item) => { item.setTitle('Insert all tasks').onClick(async () => { await getAllTasksInList( @@ -288,7 +283,6 @@ export default class MsTodoSync extends Plugin { ); }); }); - microsoftToDoSubmenu.addItem((item) => { item.setTitle('Add Missing Tasks').onClick(async () => { @@ -296,8 +290,6 @@ export default class MsTodoSync extends Plugin { }); }); }); - - }), ); } From aeb552ea958ff9a16b904d012f043c91ff9d6f54 Mon Sep 17 00:00:00 2001 From: sytone Date: Thu, 13 Feb 2025 09:42:24 -0800 Subject: [PATCH 34/34] style: cleanup --- .prettierrc => .prettierrc.json | 0 package.json | 32 ++---------------------------- pnpm-lock.yaml | 16 +++++++-------- src/command/msTodoCommand.ts | 2 +- src/main.ts | 11 ++-------- src/model/obsidianTodoTask.test.ts | 11 ++-------- 6 files changed, 15 insertions(+), 57 deletions(-) rename .prettierrc => .prettierrc.json (100%) diff --git a/.prettierrc b/.prettierrc.json similarity index 100% rename from .prettierrc rename to .prettierrc.json diff --git a/package.json b/package.json index 7980d17..0a74cb5 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,7 @@ "luxon": "^3.5.0", "moment": "^2.30.1", "obsidian": "latest", - "prettier": "^3.4.2", + "prettier": "3.5.1", "ts-jest": "^29.2.5", "ts-node": "^10.9.2", "tslib": "^2.8.1", @@ -51,33 +51,5 @@ "@microsoft/microsoft-graph-client": "^3.0.7", "@microsoft/microsoft-graph-types": "^2.40.0", "eventemitter2": "^6.4.9" - }, - "xo": { - "space": 4, - "rules": { - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "interface", - "format": [ - "PascalCase" - ], - "custom": { - "regex": "^I[A-Z]", - "match": true - } - } - ], - "@typescript-eslint/consistent-type-definitions": [ - "error", - "interface" - ], - "unicorn/filename-case": [ - "error", - { - "case": "camelCase" - } - ] - } } -} \ No newline at end of file +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 95eadcd..9bca53a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -68,7 +68,7 @@ importers: version: 0.3.0(eslint@9.17.0) eslint-plugin-prettier: specifier: ^5.2.1 - version: 5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.4.2) + version: 5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.5.1) globals: specifier: ^15.14.0 version: 15.14.0 @@ -85,8 +85,8 @@ importers: specifier: latest version: 1.7.2(@codemirror/state@6.1.2)(@codemirror/view@6.4.1) prettier: - specifier: ^3.4.2 - version: 3.4.2 + specifier: 3.5.1 + version: 3.5.1 ts-jest: specifier: ^29.2.5 version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.14.54)(jest@29.7.0(@types/node@16.18.122)(ts-node@10.9.2(@types/node@16.18.122)(typescript@4.9.5)))(typescript@4.9.5) @@ -2250,8 +2250,8 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.1: + resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} engines: {node: '>=14'} hasBin: true @@ -4081,10 +4081,10 @@ snapshots: dependencies: eslint: 9.17.0 - eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.4.2): + eslint-plugin-prettier@5.2.1(eslint-config-prettier@8.10.0(eslint@9.17.0))(eslint@9.17.0)(prettier@3.5.1): dependencies: eslint: 9.17.0 - prettier: 3.4.2 + prettier: 3.5.1 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: @@ -5202,7 +5202,7 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier@3.4.2: {} + prettier@3.5.1: {} pretty-format@29.7.0: dependencies: diff --git a/src/command/msTodoCommand.ts b/src/command/msTodoCommand.ts index 663621e..b5fb1ba 100644 --- a/src/command/msTodoCommand.ts +++ b/src/command/msTodoCommand.ts @@ -338,7 +338,7 @@ export async function getTaskDelta(todoApi: TodoApi, listId: string | undefined, if (cachedTasksDelta) { deltaLink = cachedTasksDelta.deltaLink; } else { - cachedTasksDelta = new TasksDeltaCollection([], ''); + cachedTasksDelta = new TasksDeltaCollection([], '' ,'', ''); } const returnedTask = await todoApi.getTasksDelta(listId, deltaLink); diff --git a/src/main.ts b/src/main.ts index 2d5e827..7e1a701 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,14 +1,7 @@ import { type CachedMetadata, type Editor, type MarkdownFileInfo, type MarkdownView, Plugin } from 'obsidian'; import { TodoApi } from './api/todoApi.js'; import { DEFAULT_SETTINGS, MsTodoSyncSettingTab, type IMsTodoSyncSettings } from './gui/msTodoSyncSettingTab.js'; -import { - cleanupCachedTaskIds, - createTodayTasks, - getAllTasksInList, - getTask, - getTaskDelta, - postTaskAndChildren, -} from './command/msTodoCommand.js'; +import { createTodayTasks, getAllTasksInList, getTask, postTaskAndChildren } from './command/msTodoCommand.js'; import { t } from './lib/lang.js'; import { log, logging } from './lib/logging.js'; import { SettingsManager } from './utils/settingsManager.js'; @@ -135,7 +128,7 @@ export default class MsTodoSync extends Plugin { id: 'sync-vault', name: 'Sync Vault', callback: async () => { - this.msToDoActions.syncVault(this.settings.todoListSync?.listId); + this.msToDoActions.syncVault(); }, }); } diff --git a/src/model/obsidianTodoTask.test.ts b/src/model/obsidianTodoTask.test.ts index 81157a5..1ef366a 100644 --- a/src/model/obsidianTodoTask.test.ts +++ b/src/model/obsidianTodoTask.test.ts @@ -1,15 +1,7 @@ /* eslint-disable no-undef */ import { ObsidianTodoTask } from './obsidianTodoTask'; import { type ISettingsManager } from 'src/utils/settingsManager'; -import { - TodoTask, - NullableOption, - ItemBody, - DateTimeTimeZone, - Importance, - TaskStatus, -} from '@microsoft/microsoft-graph-types'; -import { DateTime } from 'luxon'; +import { TodoTask } from '@microsoft/microsoft-graph-types'; describe('ObsidianTodoTask', () => { let settingsManager: ISettingsManager; @@ -57,6 +49,7 @@ describe('ObsidianTodoTask', () => { }, hackingEnabled: false, displayOptions_ListIndicator_UseSingleQuotes: false, + todo_CreateToDoListIfMissing: false, }, vaultName: 'test-vault', saveSettings: jest.fn(),