Skip to content

Latest commit

 

History

History
195 lines (151 loc) · 14.7 KB

File metadata and controls

195 lines (151 loc) · 14.7 KB

eslint-plugin-obsidianmd

Installation

You'll first need to install ESLint:

npm i eslint --save-dev

Next, install eslint-plugin-obsidianmd:

npm install eslint-plugin-obsidianmd --save-dev

Usage

With the release of ESLint v9, the default configuration file is now eslint.config.js.

Flat Config (eslint.config.js) - Recommended for ESLint v9+

To use the recommended configuration, add it to your eslint.config.js file. This will enable all the recommended rules.

// eslint.config.mjs
import tsparser from "@typescript-eslint/parser";
import { defineConfig } from "eslint/config";
import obsidianmd from "eslint-plugin-obsidianmd";

export default defineConfig([
  ...obsidianmd.configs.recommended,
  {
    files: ["**/*.ts"],
    languageOptions: {
      parser: tsparser,
      parserOptions: { project: "./tsconfig.json" },
    },

    // You can add your own configuration to override or add rules
    rules: {
      // example: turn off a rule from the recommended set
      "obsidianmd/sample-names": "off",
      // example: add a rule not in the recommended set and set its severity
      "obsidianmd/prefer-file-manager-trash": "error",
    },
  },
]);

Legacy Config (.eslintrc)

Click here for ESLint v8 and older

To use the recommended configuration, extend it in your .eslintrc file:

{
  "extends": ["plugin:obsidianmd/recommended"]
}

You can also override or add rules:

{
  "extends": ["plugin:obsidianmd/recommended"],
  "rules": {
    "obsidianmd/sample-names": "off",
    "obsidianmd/prefer-file-manager-trash": "error"
  }
}

Configurations

Name
recommended
🇬🇧 recommendedWithLocalesEn

Rules

💼 Configurations enabled in.
⚠️ Configurations set to warn in.
✅ Set in the recommended configuration.
🇬🇧 Set in the recommendedWithLocalesEn configuration.
🔧 Automatically fixable by the --fix CLI option.

Name                                          Description 💼 ⚠️ 🔧
commands/no-command-in-command-id Disallow using the word 'command' in a command ID. ✅ 🇬🇧
commands/no-command-in-command-name Disallow using the word 'command' in a command name. ✅ 🇬🇧
commands/no-default-hotkeys Discourage providing default hotkeys for commands. ✅ 🇬🇧
commands/no-plugin-id-in-command-id Disallow including the plugin ID in a command ID. ✅ 🇬🇧
commands/no-plugin-name-in-command-name Disallow including the plugin name in a command name. ✅ 🇬🇧
detach-leaves Don't detach leaves in onunload. ✅ 🇬🇧 🔧
editor-drop-paste Require checking evt.defaultPrevented and calling evt.preventDefault() in editor-drop/editor-paste handlers. ✅ 🇬🇧
hardcoded-config-path test ✅ 🇬🇧
no-forbidden-elements Disallow attachment of forbidden elements to the DOM in Obsidian plugins. ✅ 🇬🇧
no-global-this Disallow global and globalThis. Use window or activeWindow for popout window compatibility. ✅ 🇬🇧 🔧
no-nodejs-modules Disallow importing Node.js built-in modules unless guarded by Platform.isDesktop ✅ 🇬🇧
no-plugin-as-component Disallow anti-patterns when passing a component to MarkdownRenderer.render to prevent memory leaks. ✅ 🇬🇧
no-sample-code Disallow sample code snippets from the Obsidian plugin template. ✅ 🇬🇧 🔧
no-static-styles-assignment Disallow setting styles directly on DOM elements, favoring CSS classes instead. ✅ 🇬🇧
no-tfile-tfolder-cast Disallow type casting to TFile or TFolder, suggesting instanceof checks instead. ✅ 🇬🇧
no-unsupported-api Disallow usage of Obsidian APIs not available in the plugin's minimum app version ✅ 🇬🇧
no-view-references-in-plugin Disallow storing references to custom views directly in the plugin, which can cause memory leaks. ✅ 🇬🇧
object-assign Discourage using Object.assign with two arguments ✅ 🇬🇧
platform Disallow use of navigator API for OS detection ✅ 🇬🇧
prefer-abstract-input-suggest Disallow Liam's frequently copied TextInputSuggest implementation in favor of the built-in AbstractInputSuggest. ✅ 🇬🇧
prefer-active-doc Prefer activeDocument over document for popout window compatibility. ✅ 🇬🇧
prefer-file-manager-trash-file Prefer FileManager.trashFile() over Vault.trash() or Vault.delete() to respect user settings. ✅ 🇬🇧
prefer-get-language Prefer Obsidian's getLanguage() over localStorage.getItem('language') and i18next-browser-languagedetector for detecting the user's language. ✅ 🇬🇧
prefer-instanceof Prefer .instanceOf(T) over instanceof T for cross-window safe type checks on DOM Nodes and UIEvents. ✅ 🇬🇧 🔧
prefer-window-timers Prefer window.setTimeout() and related timer functions over bare global calls for popout window compatibility. ✅ 🇬🇧 🔧
regex-lookbehind Using lookbehinds in Regex is not supported in some iOS versions ✅ 🇬🇧
rule-custom-message Allows redefining error messages from other ESLint rules that don't provide this functionality natively. ✅ 🇬🇧
sample-names Rename sample plugin class names ✅ 🇬🇧
settings-tab/no-manual-html-headings Disallow using HTML heading elements for settings headings. ✅ 🇬🇧 🔧
settings-tab/no-problematic-settings-headings Discourage anti-patterns in settings headings. ✅ 🇬🇧 🔧
ui/sentence-case Enforce sentence case for UI strings ✅ 🇬🇧 🔧
ui/sentence-case-json Enforce sentence case for English JSON locale strings 🇬🇧 🔧
ui/sentence-case-locale-module Enforce sentence case for English TS/JS locale module strings 🇬🇧 🔧
validate-license Validate the structure of copyright notices in LICENSE files for Obsidian plugins. ✅ 🇬🇧
validate-manifest Validate the structure of manifest.json for Obsidian plugins. ✅ 🇬🇧
vault/iterate Avoid iterating all files to find a file by its path ✅ 🇬🇧 🔧

UI sentence case

Checks UI strings for sentence case. The rule reports warnings but doesn't change text unless you run ESLint with --fix and enable allowAutoFix.

  • Included at warn level in recommended config
  • Extended locale checks available via recommendedWithLocalesEn
  • By default allows CamelCase words like AutoReveal
  • Set enforceCamelCaseLower: true to flag CamelCase as incorrect

Usage (flat config)

// eslint.config.mjs
import tsparser from "@typescript-eslint/parser";
import { defineConfig } from "eslint/config";
import obsidianmd from "eslint-plugin-obsidianmd";

export default defineConfig([
  ...obsidianmd.configs.recommended,
  // Or include English locale files (JSON and TS/JS modules)
  // ...obsidianmd.configs.recommendedWithLocalesEn,

  {
    files: ["**/*.ts"],
    languageOptions: {
      parser: tsparser,
      parserOptions: { project: "./tsconfig.json" },
    },

    // Optional project overrides
    rules: {
      "obsidianmd/ui/sentence-case": [
        "warn",
        {
          brands: ["YourBrand"],
          acronyms: ["OK"],
          enforceCamelCaseLower: true,
        },
      ],
    },
  },
]);

Notes

  • Hyphenated words: Auto-Reveal becomes auto-reveal
  • Locale file patterns in recommendedWithLocalesEn: en*.json, en*.ts, en*.js, en/**/*

Known limitations

Sentence detection may incorrectly split on abbreviations (Dr., Inc., etc.). Use single sentences or adjust rule options when needed.