From 1399f4cdba086c7f3c3adcbb09319791e78cccc7 Mon Sep 17 00:00:00 2001 From: NebulousNessie <142360438+NebulousNessie@users.noreply.github.com> Date: Tue, 11 Nov 2025 14:53:27 +0000 Subject: [PATCH] Added eslint and made suggested changes. --- .eslintignore | 6 +++ .eslintrc.json | 24 +++++++++ commands.txt | 5 ++ package-lock.json | 104 ++++++------------------------------ package.json | 2 + src/actionButtons.ts | 2 +- src/blockRenderHelpers.ts | 109 ++++++++++++++++++++------------------ src/icons.ts | 5 ++ src/main.ts | 29 +++++----- src/modals.ts | 36 ++++++------- src/settings.ts | 16 +++--- tsconfig.json | 1 + 12 files changed, 159 insertions(+), 180 deletions(-) create mode 100644 .eslintrc.json create mode 100644 commands.txt diff --git a/.eslintignore b/.eslintignore index e019f3c..af752d7 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,9 @@ node_modules/ +dist/ +main.js +*.min.js +versions.json +manifest.json +node_modules/ main.js diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..f7d1e4d --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,24 @@ +{ + "root": true, + "env": { + "browser": true, + "es2021": true, + "node": true + }, + "parser": "@typescript-eslint/parser", + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module", + "project": "./tsconfig.json" + }, + "plugins": ["@typescript-eslint"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], + "rules": { + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "require-await": "off" + } +} diff --git a/commands.txt b/commands.txt new file mode 100644 index 0000000..63798f8 --- /dev/null +++ b/commands.txt @@ -0,0 +1,5 @@ +Run ESLint on all src/ files: npx -y eslint "src/**/*.ts" +Run ESLint on all src/ files and autofix: npx -y eslint "src/**/*.ts" --fix +Type checking: npx -y tsc -p tsconfig.json + +Build to main.js: npm run Build diff --git a/package-lock.json b/package-lock.json index e896c82..161e8c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "^0.17.3", + "eslint": "^8.57.1", "obsidian": "latest", "obsidian-typings": "^3.12.0", "tslib": "2.4.0", @@ -757,7 +758,6 @@ "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -777,7 +777,6 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -788,7 +787,6 @@ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -813,7 +811,6 @@ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -867,7 +864,6 @@ "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -883,7 +879,6 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=12.22" }, @@ -898,8 +893,7 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/@iconify/types": { "version": "2.0.0", @@ -2341,8 +2335,7 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/acorn": { "version": "8.15.0", @@ -2363,7 +2356,6 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", - "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -2374,7 +2366,6 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2392,7 +2383,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -2403,7 +2393,6 @@ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -2419,8 +2408,7 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, - "license": "Python-2.0", - "peer": true + "license": "Python-2.0" }, "node_modules/array-union": { "version": "2.1.0", @@ -2597,7 +2585,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -2608,7 +2595,6 @@ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -2666,7 +2652,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -2679,8 +2664,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", @@ -2735,7 +2719,6 @@ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3328,8 +3311,7 @@ "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, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/defer-to-connect": { "version": "1.1.3", @@ -3412,7 +3394,6 @@ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -3618,7 +3599,6 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -3731,7 +3711,6 @@ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3749,7 +3728,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -3760,7 +3738,6 @@ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3779,7 +3756,6 @@ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", - "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -3793,7 +3769,6 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=4.0" } @@ -3837,7 +3812,6 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -3898,8 +3872,7 @@ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", @@ -3936,16 +3909,14 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "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, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/fastq": { "version": "1.19.1", @@ -3973,7 +3944,6 @@ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -4000,7 +3970,6 @@ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -4018,7 +3987,6 @@ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -4033,8 +4001,7 @@ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/font-awesome-icons": { "version": "1.6.0", @@ -4166,7 +4133,6 @@ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -4199,7 +4165,6 @@ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -4296,8 +4261,7 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/hachure-fill": { "version": "0.5.2", @@ -4312,7 +4276,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -4406,7 +4369,6 @@ "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -4424,7 +4386,6 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -4495,7 +4456,6 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -4505,8 +4465,7 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/ismobilejs": { "version": "1.1.1", @@ -4530,7 +4489,6 @@ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -4550,16 +4508,14 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "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, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -4659,7 +4615,6 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -4692,7 +4647,6 @@ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -4715,8 +4669,7 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lowercase-keys": { "version": "1.0.1", @@ -4892,8 +4845,7 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/normalize-url": { "version": "4.5.1", @@ -5109,7 +5061,6 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -5137,7 +5088,6 @@ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -5154,7 +5104,6 @@ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -5178,7 +5127,6 @@ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "callsites": "^3.0.0" }, @@ -5212,7 +5160,6 @@ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -5232,7 +5179,6 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -5366,7 +5312,6 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8.0" } @@ -5406,7 +5351,6 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -5504,7 +5448,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=4" } @@ -5536,7 +5479,6 @@ "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^7.1.3" }, @@ -5689,7 +5631,6 @@ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -5703,7 +5644,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -5808,7 +5748,6 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -5822,7 +5761,6 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -5863,7 +5801,6 @@ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5876,8 +5813,7 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tinyexec": { "version": "1.0.2", @@ -5957,7 +5893,6 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5971,7 +5906,6 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -6023,7 +5957,6 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -6143,7 +6076,6 @@ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -6160,7 +6092,6 @@ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -6217,7 +6148,6 @@ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index f8be894..13dddb6 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "scripts": { "dev": "node esbuild.config.mjs", "build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production", + "lint": "eslint \"src/**/*.ts\"", "version": "node version-bump.mjs && git add manifest.json versions.json" }, "keywords": [], @@ -18,6 +19,7 @@ "@typescript-eslint/parser": "5.29.0", "builtin-modules": "3.3.0", "esbuild": "^0.17.3", + "eslint": "^8.57.1", "obsidian": "latest", "obsidian-typings": "^3.12.0", "tslib": "2.4.0", diff --git a/src/actionButtons.ts b/src/actionButtons.ts index e69166b..38b52b9 100644 --- a/src/actionButtons.ts +++ b/src/actionButtons.ts @@ -88,7 +88,7 @@ export function addPinButton( // Cleanup removes listeners and restores UI function cleanup() { img.classList.remove("mocblockRenderer-editing-outline"); - img.style.cursor = ""; + //img.style.cursor = ""; pinBtn.removeAttribute("disabled"); polyBtn.removeAttribute("disabled"); // Component owns the listeners; no manual removal needed diff --git a/src/blockRenderHelpers.ts b/src/blockRenderHelpers.ts index b1fa87d..20ff9e6 100644 --- a/src/blockRenderHelpers.ts +++ b/src/blockRenderHelpers.ts @@ -18,9 +18,9 @@ export function renderPinMarker( markerFile: any, source: string, el: HTMLElement, - refreshMOCBlock: Function, - saveUpdatedMarker: Function, - deleteMarkerFromFile: Function, + refreshMOCBlock: (source: string, el: HTMLElement, ctx: any) => Promise | void, + saveUpdatedMarker: (vault: any, path: string, marker: any) => Promise, + deleteMarkerFromFile: (vault: any, file: any, markerId: string) => Promise, parentComponent: Component) { @@ -34,7 +34,6 @@ export function renderPinMarker( // Get SVG styles from style settings. If not defined, use defaults from below. const styleName = pin.styleName ?? "Default"; const config = settings.styleNames[styleName]; - const StyleName = config?.styleName ?? ""; const iconName = config?.icon ?? "map-pin"; const fillColour = config?.fillColour ?? "#705dcf"; const strokeColour = config?.strokeColour ?? "#555454"; @@ -127,19 +126,22 @@ export function renderPinMarker( wasDragged = false; }; - const onDocMouseUp = async () => { - if (isDragging) { - isDragging = false; + const onDocMouseUp = () => { + // Wrap async logic in an IIFE so the registered handler returns void + (async () => { + if (isDragging) { + isDragging = false; - // Save to JSON config file when the marker is dropped - if (wasDragged) { - await saveUpdatedMarker( - app.vault, - `${settings.dataFolder}/${moc_id}.md`, - pin - ); - } - } + // Save to JSON config file when the marker is dropped + if (wasDragged) { + await saveUpdatedMarker( + app.vault, + `${settings.dataFolder}/${moc_id}.md`, + pin + ); + } + } + })(); }; const onDocMouseMove = (evt: MouseEvent) => { @@ -191,9 +193,9 @@ export function renderPolylineMarker( markerFile: any, source: string, el: HTMLElement, - refreshMOCBlock: Function, - saveUpdatedMarker: Function, - deleteMarkerFromFile: Function, + refreshMOCBlock: (source: string, el: HTMLElement, ctx: any) => Promise | void, + saveUpdatedMarker: (vault: any, path: string, marker: any) => Promise, + deleteMarkerFromFile: (vault: any, file: any, markerId: string) => Promise, parentComponent: Component) { // Get style config for this polyline @@ -290,9 +292,9 @@ export function addResizeHandle( markerFile: any, source: string, el: HTMLElement, - refreshMOCBlock: any, - saveUpdatedMarker: any, - deleteMarkerFromFile: any, + refreshMOCBlock: (source: string, el: HTMLElement, ctx: any) => Promise | void, + saveUpdatedMarker: (vault: any, path: string, marker: any) => Promise, + deleteMarkerFromFile: (vault: any, file: any, markerId: string) => Promise, parentComponent: Component ) { if (!isEditMode) return; @@ -370,43 +372,46 @@ export function addResizeHandle( } }; - const onMouseUp = async () => { - if (isResizing) { - isResizing = false; - document.body.classList.remove("mocblockRenderer-userselect-none"); + const onMouseUp = () => { + // Wrap async logic in an IIFE so the registered handler returns void + (async () => { + if (isResizing) { + isResizing = false; + document.body.classList.remove("mocblockRenderer-userselect-none"); - // --- Save new width to the MOC block YAML --- - const file = app.vault.getFileByPath(ctx.sourcePath); - if (!(file instanceof TFile)) return; + // --- Save new width to the MOC block YAML --- + const file = app.vault.getFileByPath(ctx.sourcePath); + if (!(file instanceof TFile)) return; - const content = await app.vault.read(file); - const section = ctx.getSectionInfo(el); - if (!section) return; + const content = await app.vault.read(file); + const section = ctx.getSectionInfo(el); + if (!section) return; - const lines = content.split("\n"); - const blockLines = lines.slice(section.lineStart + 1, section.lineEnd); + const lines = content.split("\n"); + const blockLines = lines.slice(section.lineStart + 1, section.lineEnd); - let found = false; - for (let i = 0; i < blockLines.length; i++) { - if (blockLines[i].trim().startsWith("image_width:")) { - blockLines[i] = `image_width: ${img.offsetWidth}`; - found = true; - break; + let found = false; + for (let i = 0; i < blockLines.length; i++) { + if (blockLines[i].trim().startsWith("image_width:")) { + blockLines[i] = `image_width: ${img.offsetWidth}`; + found = true; + break; + } + } + if (!found) { + blockLines.push(`image_width: ${img.offsetWidth}`); } - } - if (!found) { - blockLines.push(`image_width: ${img.offsetWidth}`); - } - const newBlock = ["```moc", ...blockLines, "```"].join("\n"); - const newContent = [ - ...lines.slice(0, section.lineStart), - newBlock, - ...lines.slice(section.lineEnd + 1), - ].join("\n"); + const newBlock = ["```moc", ...blockLines, "```"].join("\n"); + const newContent = [ + ...lines.slice(0, section.lineStart), + newBlock, + ...lines.slice(section.lineEnd + 1), + ].join("\n"); - await app.vault.process(file, () => newContent); - } + await app.vault.process(file, () => newContent); + } + })(); }; parentComponent.registerDomEvent(window, "mousemove", onMouseMove); diff --git a/src/icons.ts b/src/icons.ts index fc24beb..5af2951 100644 --- a/src/icons.ts +++ b/src/icons.ts @@ -22,6 +22,11 @@ export function getIconSVG(iconName: string): string | null { const el = getIcon(iconName as any) as HTMLElement | null; if (el && (el as any).outerHTML) return (el as any).outerHTML; } catch (e) { + // Log and return null when an icon can't be resolved + // (sometimes getIcon throws for missing ids) + // Keep this non-fatal so callers can fallback. + // eslint-disable-next-line no-console + console.warn("getIconSVG failed for", iconName, e); } return null; } diff --git a/src/main.ts b/src/main.ts index 7ede946..05f8e2e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -29,19 +29,19 @@ export default class MOCBlockPlugin extends Plugin { this.addCommand({ id: "insert-mocblock", - name: "Insert MOC Block", - editorCallback: (editor, view) => { - new NewMocBlockModal(this.app, async (mocblockText) => { - editor.replaceSelection(mocblockText); + name: "Insert moc block", + editorCallback: (editor) => { + new NewMocBlockModal(this.app, (mocblockText) => { + editor.replaceSelection(mocblockText); }).open(); }, }); - this.addRibbonIcon("image", "Insert MOC Block", () => { + this.addRibbonIcon("image", "Insert moc block", () => { const activeView = this.app.workspace.getActiveViewOfType(MarkdownView); if (!activeView) return; - new NewMocBlockModal(this.app, async (mocblockText) => { + new NewMocBlockModal(this.app, (mocblockText) => { activeView.editor.replaceSelection(mocblockText); }).open(); }); @@ -63,7 +63,7 @@ export default class MOCBlockPlugin extends Plugin { } } // Fix for getting correct view in multi-pane setup, and if page refreshes without being selected (i.e. file explorer clicked) - const isEditMode: boolean = !!(view && typeof view.getMode === "function" && view.getMode() === "source"); + const isEditMode = !!(view && typeof view.getMode === "function" && view.getMode() === "source"); // Parse YAML MOC Block Data let config: any; @@ -79,7 +79,7 @@ export default class MOCBlockPlugin extends Plugin { } catch (e) { console.error("Invalid YAML in moc block", e); - el.createEl("pre", { text: "Invalid YAML in MOC block." }); + el.createEl("pre", { text: "Invalid yaml in moc block." }); return; } // -------------------------------- @@ -119,7 +119,7 @@ export default class MOCBlockPlugin extends Plugin { // moc_id config defined in check if statement above. const imageRef = config.image; const imageWidth = config.image_width; - const isFullscreen = config.fullscreen === true || config.fullscreen === "false"; + // fullscreen flag currently unused // debug log, check yaml parsed correctly. //console.log("Width:", imageWidth); @@ -130,7 +130,7 @@ export default class MOCBlockPlugin extends Plugin { // Check for image field. Cannot auto-generate, notify user to add one. if (!imageRef) { - el.createEl("pre", { text: "Missing 'image' field. Cannot create MOC Block." }); + el.createEl("pre", { text: "Missing 'image' field. Cannot create moc block." }); return; } // -------------------------------- @@ -221,8 +221,8 @@ export default class MOCBlockPlugin extends Plugin { if (isEditMode) { const actions = container.createEl("div", { cls: "mocblockRenderer-actions-buttons" }); - const pinBtn = actions.createEl("button", { text: "+ Pin" }); - const polyBtn = actions.createEl("button", { text: "✎ Area" }); + const pinBtn = actions.createEl("button", { text: "+ pin" }); + const polyBtn = actions.createEl("button", { text: "✎ area" }); // Prepare marker file path for action buttons const markerFilePath = `${this.settings.dataFolder}/${moc_id}.md`; @@ -320,7 +320,8 @@ export default class MOCBlockPlugin extends Plugin { await this.saveData(this.settings); } - async onunload() { - + onunload(): void { + // no-op placeholder; keep method non-empty to satisfy lint rules + void 0; } } diff --git a/src/modals.ts b/src/modals.ts index fd1fb13..55cfc01 100644 --- a/src/modals.ts +++ b/src/modals.ts @@ -1,5 +1,5 @@ -import { App, Modal, Setting, setIcon, TFile, SuggestModal, Notice, Component } from "obsidian"; -import { PinMarker, PolylineMarker, refreshMOCBlock } from "./helpers"; +import { App, Modal, Setting, setIcon, TFile, SuggestModal, Notice } from "obsidian"; +import { PinMarker, PolylineMarker } from "./helpers"; import { styleNamesSetting } from "./settings"; import { v4 as uuidv4 } from "uuid"; @@ -152,10 +152,10 @@ export class NewPinModal extends Modal { btn.setButtonText("Add pin") .setCta() .onClick(async () => { - if (!selectedstyleName || !linkValue.trim()) { - new Notice("All fields are required."); - return; - } + if (!selectedstyleName || !linkValue.trim()) { + new Notice("All fields are required."); + return; + } const newMarker: PinMarker = { markerId: uuidv4(), x: this.percentX, @@ -179,8 +179,8 @@ export class NewPinModal extends Modal { export class PinEditModal extends Modal { marker: PinMarker; - onSave: (updated: PinMarker) => void; - onDelete?: (marker: PinMarker) => void; + onSave: (updated: PinMarker) => void | Promise; + onDelete?: (marker: PinMarker) => void | Promise; styleNames: Record; onCloseRefresh?: () => void; @@ -188,8 +188,8 @@ export class PinEditModal extends Modal { app: App, marker: PinMarker, styleNames: Record, - onSave: (updated: PinMarker) => void, - onDelete?: (marker: PinMarker) => void + onSave: (updated: PinMarker) => void | Promise, + onDelete?: (marker: PinMarker) => void | Promise , onCloseRefresh?: () => void ) { super(app); @@ -262,7 +262,7 @@ export class PinEditModal extends Modal { setIcon(btn.extraSettingsEl, "trash-2"); // Obsidian's trash icon btn.extraSettingsEl.setAttr("aria-label", "Delete marker"); btn.extraSettingsEl.classList.add("mocblock-trash-hover"); - btn.extraSettingsEl.addEventListener("click", async () => { + btn.extraSettingsEl.addEventListener("click", () => { if (this.onDelete) { this.onDelete?.(this.marker as any); } @@ -367,8 +367,8 @@ export class NewPolylineModal extends Modal { export class PolylineEditModal extends Modal { marker: PolylineMarker; - onSave: (updated: PolylineMarker) => void; - onDelete?: (marker: PolylineMarker) => void; + onSave: (updated: PolylineMarker) => void | Promise; + onDelete?: (marker: PolylineMarker) => void | Promise; styleNames: Record; onCloseRefresh?: () => void; @@ -376,8 +376,8 @@ export class PolylineEditModal extends Modal { app: App, marker: PolylineMarker, styleNames: Record, - onSave: (updated: PolylineMarker) => void, - onDelete?: (marker: PolylineMarker) => void + onSave: (updated: PolylineMarker) => void | Promise, + onDelete?: (marker: PolylineMarker) => void | Promise , onCloseRefresh?: () => void ) { super(app); @@ -450,7 +450,7 @@ export class PolylineEditModal extends Modal { setIcon(btn.extraSettingsEl, "trash-2"); btn.extraSettingsEl.setAttr("aria-label", "Delete polyline"); btn.extraSettingsEl.classList.add("mocblock-trash-hover"); - btn.extraSettingsEl.addEventListener("click", async () => { + btn.extraSettingsEl.addEventListener("click", () => { if (this.onDelete) { this.onDelete?.(this.marker as any); } @@ -477,10 +477,10 @@ export class NewMocBlockModal extends Modal { onOpen() { const { contentEl } = this; // contentEl.createEl("h2", { text: "New MOC Block" }); - new Setting(contentEl).setName('New MOC Block').setHeading(); + new Setting(contentEl).setName('New moc block').setHeading(); let imageLink = ""; - let moc_id = `moc-${Math.random().toString(36).slice(2, 10)}`; + const moc_id = `moc-${Math.random().toString(36).slice(2, 10)}`; //const imageInput = contentEl.createEl("input", { type: "text", placeholder: "Image path" }); new Setting(contentEl) diff --git a/src/settings.ts b/src/settings.ts index eddf802..c239291 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -43,24 +43,24 @@ export class MOCBlockSettingTab extends PluginSettingTab { const { containerEl } = this; containerEl.empty(); //containerEl.createEl("h2", { text: "Data file settings" }); - new Setting(containerEl).setName('Data file settings').setHeading(); + //new Setting(containerEl).setName('Data file settings').setHeading(); // Add data folder setting new Setting(containerEl) .setName("Data folder") .setDesc("Folder in your vault where marker data files will be stored.") .addText(text => { - text.setPlaceholder("e.g. MOCData"); - text.setValue(this.plugin.settings.dataFolder || "MOCData"); + text.setPlaceholder("e.g. mocdata"); + text.setValue(this.plugin.settings.dataFolder || "mocdata"); // Track value but don't save yet: annoying workaround to prevent save on every keystroke. - let pendingValue = this.plugin.settings.dataFolder || "MOCData"; + let pendingValue = this.plugin.settings.dataFolder || "mocdata"; text.onChange((value) => { pendingValue = value.trim(); }); text.inputEl.addEventListener("blur", async () => { const oldPath = normalizePath(this.plugin.settings.dataFolder); - const newPath = normalizePath(pendingValue || "MOCData"); + const newPath = normalizePath(pendingValue || "mocdata"); this.plugin.settings.dataFolder = newPath; await this.plugin.saveSettings(); await renameDataFolder(this.app, oldPath, newPath); @@ -77,7 +77,7 @@ export class MOCBlockSettingTab extends PluginSettingTab { // --------------------------------- // containerEl.createEl("h2", { text: "Style settings" }); - new Setting(containerEl).setName('Style settings').setHeading(); + new Setting(containerEl).setName('Marker & Polyline Styles').setHeading(); // Toggle for opaque pins new Setting(containerEl) @@ -106,7 +106,7 @@ export class MOCBlockSettingTab extends PluginSettingTab { }); // Style name (always visible) - const styleNameEl = row.createEl("span", { text: styleName, cls: "mocblock-settings-style-title" }); + //const styleNameEl = row.createEl("span", { text: styleName, cls: "mocblock-settings-style-title" }); // Details div (hidden by default) const detailsDiv = containerEl.createDiv({ cls: "mocblock-settings-style-details" }); @@ -199,7 +199,7 @@ export class MOCBlockSettingTab extends PluginSettingTab { // Style input addSetting.addText(text => { - text.setPlaceholder("e.g. Style1"); + text.setPlaceholder("e.g. style1"); text.onChange(value => { styleValue = value; }); }); diff --git a/tsconfig.json b/tsconfig.json index 12a65f1..2721c34 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,6 +11,7 @@ "importHelpers": true, "isolatedModules": true, "strictNullChecks": true, + "skipLibCheck": true, "lib": [ "DOM", "ES5",