From 31ea9c9c458d15f21fe4d592a5978039a466fe31 Mon Sep 17 00:00:00 2001 From: John Morabito Date: Sat, 13 Jun 2026 20:55:23 -0400 Subject: [PATCH] fix: resolve all ESLint errors across the codebase - Remove unused imports (getIconIds, setIcon, exp, arrayMoveMutable, etc.) - Add missing explicit return types on functions and arrow functions - Add public accessibility modifier to PageHeaderManager.buttons - Fix mixed spaces/tabs in constants.ts and commandComponent.tsx - Wrap case block declaration in MacroBuilder.tsx to fix no-case-declarations - Add eslint-disable comments for false-positive no-unused-vars on function type annotation parameter names and TypeScript enum members - Remove dead forceUpdate reference in MacroBuilder.tsx (was referencing this in a function component) Reduces from 64 errors + 2 warnings to 0 errors + 2 warnings (the remaining warnings are intentional non-null assertions). Co-Authored-By: Claude Sonnet 4.6 --- src/constants.ts | 2 +- src/main.ts | 2 +- src/manager/commands/explorerManager.ts | 3 +- src/manager/commands/menuManager.ts | 7 ++-- src/manager/commands/pageHeaderManager.ts | 10 +++--- .../commands/textToolbarIntegrationManager.ts | 3 +- src/types.ts | 2 ++ src/ui/chooseCustomNameModal.ts | 7 ++-- src/ui/components/AdvancedToolbarSettings.tsx | 2 +- src/ui/components/ColorPicker/ColorPicker.tsx | 3 +- src/ui/components/MacroBuilder.tsx | 32 +++++++++---------- src/ui/components/MacroBuilderModal.ts | 7 ++-- src/ui/components/MacroViewer.tsx | 15 ++++----- src/ui/components/commandComponent.tsx | 11 ++++--- src/util.tsx | 6 ++-- 15 files changed, 60 insertions(+), 52 deletions(-) diff --git a/src/constants.ts b/src/constants.ts index 8e15742..4f66bf8 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -625,4 +625,4 @@ export const ICON_LIST = requireApiVersion("1.7.3") "zoom-in", "zoom-out", "search-large", - ]; + ]; diff --git a/src/main.ts b/src/main.ts index 1485472..deb3cdd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -5,7 +5,7 @@ import { updateStyles, } from "src/util"; import { updateSpacing } from "src/util"; -import { Command, getIconIds, Plugin } from "obsidian"; +import { Command, Plugin } from "obsidian"; import { DEFAULT_SETTINGS } from "./constants"; import t from "./l10n"; import { diff --git a/src/manager/commands/explorerManager.ts b/src/manager/commands/explorerManager.ts index 2155fe3..d0233a6 100644 --- a/src/manager/commands/explorerManager.ts +++ b/src/manager/commands/explorerManager.ts @@ -1,4 +1,3 @@ -import exp from "constants"; import { Menu, setIcon, WorkspaceLeaf } from "obsidian"; import t from "src/l10n"; import CommanderPlugin from "src/main"; @@ -81,7 +80,7 @@ export default class ExplorerManager extends CommandManagerBase { await this.plugin.saveSettings(); } - private buttonExists(leaf: WorkspaceLeaf, action: CommandIconPair) { + private buttonExists(leaf: WorkspaceLeaf, action: CommandIconPair): boolean { return [ ...leaf.view.containerEl.querySelectorAll( "div.nav-buttons-container > .cmdr.clickable-icon" diff --git a/src/manager/commands/menuManager.ts b/src/manager/commands/menuManager.ts index 4ac95e6..77d4736 100644 --- a/src/manager/commands/menuManager.ts +++ b/src/manager/commands/menuManager.ts @@ -32,15 +32,16 @@ abstract class Base extends CommandManagerBase { // eslint-disable-next-line @typescript-eslint/no-empty-function public reorder(): void {} - // eslint-disable-next-line no-unused-vars protected addRemovableCommand( - this: (item: MenuItem) => void, + // eslint-disable-next-line no-unused-vars + this: (_item: MenuItem) => void, command: Command, cmdPair: CommandIconPair, plugin: CommanderPlugin, menu: Menu, commandList: CommandIconPair[] - ): (item: MenuItem) => void { + // eslint-disable-next-line no-unused-vars + ): (_item: MenuItem) => void { return (item: MenuItem) => { item.dom.addClass("cmdr"); item.dom.style.color = diff --git a/src/manager/commands/pageHeaderManager.ts b/src/manager/commands/pageHeaderManager.ts index 0467714..2e0da66 100644 --- a/src/manager/commands/pageHeaderManager.ts +++ b/src/manager/commands/pageHeaderManager.ts @@ -1,4 +1,4 @@ -import { ItemView, Menu, setIcon, WorkspaceLeaf } from "obsidian"; +import { ItemView, Menu, WorkspaceLeaf } from "obsidian"; import t from "src/l10n"; import CommanderPlugin from "src/main"; import { CommandIconPair } from "src/types"; @@ -9,7 +9,7 @@ import { chooseNewCommand, isModeActive } from "src/util"; import CommandManagerBase from "./commandManager"; export default class PageHeaderManager extends CommandManagerBase { - buttons = new WeakMap>(); + public buttons = new WeakMap>(); public constructor(plugin: CommanderPlugin, pairArray: CommandIconPair[]) { super(plugin, pairArray); @@ -112,7 +112,7 @@ export default class PageHeaderManager extends CommandManagerBase { ); } - private addAdderButton(leaf: WorkspaceLeaf) { + private addAdderButton(leaf: WorkspaceLeaf): void { const { view } = leaf; const id = "cmdr-adder"; if (!(view instanceof ItemView)) return; @@ -141,7 +141,7 @@ export default class PageHeaderManager extends CommandManagerBase { ); } - private buttonsFor(leaf: WorkspaceLeaf, create = false) { + private buttonsFor(leaf: WorkspaceLeaf, create = false): Map | undefined { if (!(leaf.view instanceof ItemView)) return; if (create && !this.buttons.has(leaf.view)) this.buttons.set(leaf.view, new Map()); @@ -164,7 +164,7 @@ export default class PageHeaderManager extends CommandManagerBase { if (this.plugin.settings.showAddCommand) this.addAdderButton(leaf); } - private removeButtonsFromLeaf(leaf: WorkspaceLeaf) { + private removeButtonsFromLeaf(leaf: WorkspaceLeaf): void { const buttons = this.buttonsFor(leaf); if (buttons) { for (const button of buttons.values()) button.detach(); diff --git a/src/manager/commands/textToolbarIntegrationManager.ts b/src/manager/commands/textToolbarIntegrationManager.ts index a1c3573..28a060d 100644 --- a/src/manager/commands/textToolbarIntegrationManager.ts +++ b/src/manager/commands/textToolbarIntegrationManager.ts @@ -3,7 +3,8 @@ import { CommandIconPair } from "src/types"; import CommandManagerBase from "./commandManager"; interface TextToolbarAPI { - setCommands(cmds: { id: string; icon: string; name: string }[]): void; + // eslint-disable-next-line no-unused-vars + setCommands(_cmds: { id: string; icon: string; name: string }[]): void; } function getTextToolbarAPI(plugin: CommanderPlugin): TextToolbarAPI | undefined { diff --git a/src/types.ts b/src/types.ts index 4d4f084..121ba53 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,11 +1,13 @@ import { h } from "preact"; +/* eslint-disable no-unused-vars */ export enum Action { COMMAND, DELAY, EDITOR, LOOP, } +/* eslint-enable no-unused-vars */ export type MacroItem = | { action: Action.COMMAND; commandId: string } diff --git a/src/ui/chooseCustomNameModal.ts b/src/ui/chooseCustomNameModal.ts index 3e1390c..9bc1ce4 100644 --- a/src/ui/chooseCustomNameModal.ts +++ b/src/ui/chooseCustomNameModal.ts @@ -3,10 +3,10 @@ import t from "src/l10n"; import CommanderPlugin from "src/main"; export default class ChooseCustomNameModal extends SuggestModal { - // This is used in onOpen, not sure why eslint doesn't recognize it - // eslint-disable-next-line no-unused-vars public constructor( + // eslint-disable-next-line no-unused-vars private defaultName: string, + // eslint-disable-next-line no-unused-vars private plugin: CommanderPlugin ) { super(plugin.app); @@ -62,9 +62,10 @@ export default class ChooseCustomNameModal extends SuggestModal { public renderSuggestion(value: string, el: HTMLElement): void {} // This will be overriden anyway, but typescript complains if it's not declared - // eslint-disable-next-line no-unused-vars, @typescript-eslint/no-empty-function + /* eslint-disable no-unused-vars, @typescript-eslint/no-empty-function */ public onChooseSuggestion( item: string, evt: MouseEvent | KeyboardEvent ): void {} + /* eslint-enable no-unused-vars, @typescript-eslint/no-empty-function */ } diff --git a/src/ui/components/AdvancedToolbarSettings.tsx b/src/ui/components/AdvancedToolbarSettings.tsx index 012991f..c63be24 100644 --- a/src/ui/components/AdvancedToolbarSettings.tsx +++ b/src/ui/components/AdvancedToolbarSettings.tsx @@ -5,7 +5,7 @@ import CommanderPlugin from "src/main"; import { injectIcons, ObsidianIcon, updateStyles } from "src/util"; import ChooseIconModal from "../chooseIconModal"; -function render(containerEl: HTMLElement, plugin: CommanderPlugin) { +function render(containerEl: HTMLElement, plugin: CommanderPlugin): void { containerEl.empty(); new Setting(containerEl) diff --git a/src/ui/components/ColorPicker/ColorPicker.tsx b/src/ui/components/ColorPicker/ColorPicker.tsx index a121f71..ee0b770 100644 --- a/src/ui/components/ColorPicker/ColorPicker.tsx +++ b/src/ui/components/ColorPicker/ColorPicker.tsx @@ -4,7 +4,8 @@ import { useEffect, useRef } from "preact/hooks"; interface ColorPickerProps { initialColor: string; - onChange: (color: string) => void; + // eslint-disable-next-line no-unused-vars + onChange: (_color: string) => void; } export const ColorPicker = ({ diff --git a/src/ui/components/MacroBuilder.tsx b/src/ui/components/MacroBuilder.tsx index 8096960..ac9e208 100644 --- a/src/ui/components/MacroBuilder.tsx +++ b/src/ui/components/MacroBuilder.tsx @@ -10,6 +10,7 @@ import { SliderComponent } from "./settingComponent"; interface MacroBuilderProps { plugin: CommanderPlugin; macro: Macro; + // eslint-disable-next-line no-unused-vars onSave: (macro: Macro) => void; onCancel: () => void; } @@ -26,9 +27,7 @@ export default function ({ JSON.parse(JSON.stringify(macro.macro)) || [] ); - const forceUpdate = this.forceUpdate.bind(this); - - const handleAddCommand = async () => { + const handleAddCommand = async (): Promise => { const command = await new AddCommandModal(plugin).awaitSelection(); if (command) { setMacroCommands([ @@ -38,7 +37,7 @@ export default function ({ } }; - const handleAddDelay = async () => { + const handleAddDelay = async (): Promise => { setMacroCommands([ ...macroCommands, { action: Action.DELAY, delay: 250 }, @@ -54,14 +53,14 @@ export default function ({ type="text" placeholder="Macro Name" value={name} - onChange={(e) => setName(e.currentTarget.value)} + onChange={(e): void => setName(e.currentTarget.value)} width="100%" />
Icon
); + } case Action.DELAY: return (
@@ -168,7 +168,7 @@ export default function ({ step={50} description="Delay in milliseconds" value={item.delay} - changeHandler={(value) => + changeHandler={(value): void => (item.delay = value) } /> @@ -178,7 +178,7 @@ export default function ({ { + onClick={(): void => { if ( idx === macroCommands.length - 1 @@ -197,7 +197,7 @@ export default function ({ { + onClick={(): void => { if (idx === 0) return; const newCommands = [ ...macroCommands, @@ -212,7 +212,7 @@ export default function ({ { + onClick={(): void => { setMacroCommands( macroCommands.filter( (_, i) => i !== idx @@ -237,7 +237,7 @@ export default function ({ type="checkbox" id="checkbox" checked={startup} - onChange={({ target }) => { + onChange={({ target }): void => { //@ts-expect-error setStartup(target?.checked ?? false); }} @@ -256,7 +256,7 @@ export default function ({ @@ -96,7 +93,7 @@ export default function MacroViewer({
diff --git a/src/util.tsx b/src/util.tsx index ac0eb5c..a505a02 100644 --- a/src/util.tsx +++ b/src/util.tsx @@ -160,7 +160,7 @@ export function updateMacroCommands(plugin: CommanderPlugin): void { } } -export function updateStyles(settings: AdvancedToolbarSettings) { +export function updateStyles(settings: AdvancedToolbarSettings): void { const { classList: c, style: s } = document.body; s.setProperty("--at-button-height", (settings.rowHeight ?? 48) + "px"); s.setProperty("--at-button-width", (settings.buttonWidth ?? 48) + "px"); @@ -173,7 +173,7 @@ export function updateStyles(settings: AdvancedToolbarSettings) { c.toggle("AT-no-toolbar", settings.rowCount === 0); } -export function removeStyles() { +export function removeStyles(): void { const { classList: c, style: s } = document.body; s.removeProperty("--at-button-height"); s.removeProperty("--at-button-width"); @@ -190,7 +190,7 @@ export function removeStyles() { export function injectIcons( settings: AdvancedToolbarSettings, plugin: CommanderPlugin -) { +): void { settings.mappedIcons.forEach((mapped) => { const command = plugin.app.commands.commands[mapped.commandID]; if (command) {