Add eslint to project to help address Obsidian eslint issues.

This commit is contained in:
Andrew Beal 2025-11-10 10:25:49 +00:00
parent b7404ff154
commit d8c7672211
6 changed files with 2675 additions and 105 deletions

View file

@ -1,3 +0,0 @@
node_modules/
main.js

View file

@ -1,23 +0,0 @@
{
"root": true,
"parser": "@typescript-eslint/parser",
"env": { "node": true },
"plugins": [
"@typescript-eslint"
],
"extends": [
"eslint:recommended",
"plugin:@typescript-eslint/eslint-recommended",
"plugin:@typescript-eslint/recommended"
],
"parserOptions": {
"sourceType": "module"
},
"rules": {
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": ["error", { "args": "none" }],
"@typescript-eslint/ban-ts-comment": "off",
"no-prototype-builtins": "off",
"@typescript-eslint/no-empty-function": "off"
}
}

137
eslint.config.js Normal file
View file

@ -0,0 +1,137 @@
// eslint.config.js
import js from "@eslint/js";
import tseslint from "typescript-eslint";
import obsidianmd from "eslint-plugin-obsidianmd";
import sdl from "@microsoft/eslint-plugin-sdl";
import importPlugin from "eslint-plugin-import";
export default [
// Ignore patterns
{
ignores: ["node_modules/**", "main.js"]
},
// Base ESLint recommended rules
js.configs.recommended,
// TypeScript configuration for .ts files
{
files: ["**/*.ts"],
plugins: {
"@typescript-eslint": tseslint.plugin,
"obsidianmd": obsidianmd,
"@microsoft/sdl": sdl,
"import": importPlugin,
},
languageOptions: {
parser: tseslint.parser,
parserOptions: {
project: true,
sourceType: "module"
}
},
rules: {
// Base rules
"no-unused-vars": "off",
"no-prototype-builtins": "off",
"no-self-compare": "warn",
"no-eval": "error",
"no-implied-eval": "error",
"prefer-const": "off",
"no-implicit-globals": "error",
"no-console": ["error", { allow: ["warn", "error", "debug"] }],
// Restricted globals (with fetch removed for streaming)
"no-restricted-globals": [
"error",
{
name: "app",
message: "Avoid using the global app object. Instead use the reference provided by your plugin instance.",
},
{
name: "localStorage",
message: "Prefer `App#saveLocalStorage` / `App#loadLocalStorage` functions to write / read localStorage data that's unique to a vault."
}
],
// Restricted imports
"no-restricted-imports": [
"error",
{
name: "axios",
message: "Use the built-in `requestUrl` function instead of `axios`.",
},
{
name: "superagent",
message: "Use the built-in `requestUrl` function instead of `superagent`.",
},
{
name: "got",
message: "Use the built-in `requestUrl` function instead of `got`.",
},
{
name: "node-fetch",
message: "Use the built-in `requestUrl` function instead of `node-fetch`.",
},
{
name: "moment",
message: "The 'moment' package is bundled with Obsidian. Please import it from 'obsidian' instead.",
},
],
"no-alert": "error",
"no-undef": "error",
// TypeScript rules
"@typescript-eslint/ban-ts-comment": "off",
"@typescript-eslint/no-deprecated": "error",
"@typescript-eslint/no-unused-vars": ["warn", { args: "none" }],
"@typescript-eslint/require-await": "off",
"@typescript-eslint/no-explicit-any": ["error", { fixToUnknown: true }],
"@typescript-eslint/no-empty-function": "off",
// Security rules
"@microsoft/sdl/no-document-write": "error",
"@microsoft/sdl/no-inner-html": "error",
// Import rules
"import/no-nodejs-modules": "error",
"import/no-extraneous-dependencies": "error",
// Obsidian plugin rules - Commands
"obsidianmd/commands/no-command-in-command-id": "error",
"obsidianmd/commands/no-command-in-command-name": "error",
"obsidianmd/commands/no-default-hotkeys": "error",
"obsidianmd/commands/no-plugin-id-in-command-id": "error",
"obsidianmd/commands/no-plugin-name-in-command-name": "error",
// Obsidian plugin rules - Settings Tab
"obsidianmd/settings-tab/no-manual-html-headings": "error",
"obsidianmd/settings-tab/no-problematic-settings-headings": "error",
// Obsidian plugin rules - Vault
"obsidianmd/vault/iterate": "error",
// Obsidian plugin rules - General
"obsidianmd/detach-leaves": "error",
"obsidianmd/hardcoded-config-path": "error",
"obsidianmd/no-forbidden-elements": "error",
"obsidianmd/no-plugin-as-component": "error",
"obsidianmd/no-sample-code": "error",
"obsidianmd/no-tfile-tfolder-cast": "error",
"obsidianmd/no-view-references-in-plugin": "error",
"obsidianmd/no-static-styles-assignment": "error",
"obsidianmd/object-assign": "error",
"obsidianmd/platform": "error",
"obsidianmd/prefer-file-manager-trash-file": "warn",
"obsidianmd/prefer-abstract-input-suggest": "error",
"obsidianmd/regex-lookbehind": "error",
"obsidianmd/sample-names": "error",
"obsidianmd/validate-manifest": "error",
"obsidianmd/validate-license": "error",
// Obsidian plugin rules - UI
"obsidianmd/ui/sentence-case": ["error", { enforceCamelCaseLower: true }],
}
}
];

2610
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -3,11 +3,14 @@
"version": "1.0.0",
"description": "AI powered agent assistant.",
"main": "main.js",
"type": "module",
"scripts": {
"dev": "node esbuild.config.mjs",
"build": "tsc -noEmit -skipLibCheck && node esbuild.config.mjs production",
"version": "node version-bump.mjs && git add manifest.json versions.json",
"svelte-check": "svelte-check --tsconfig tsconfig.json",
"lint": "eslint .",
"lint:fix": "eslint . --fix",
"test": "vitest run",
"test:watch": "vitest",
"test:ui": "vitest --ui",
@ -27,6 +30,8 @@
"builtin-modules": "5.0.0",
"esbuild": "^0.27.0",
"esbuild-svelte": "^0.9.3",
"eslint": "^9.39.1",
"eslint-plugin-obsidianmd": "^0.1.8",
"happy-dom": "^20.0.10",
"obsidian": "latest",
"svelte": "^5.43.5",

View file

@ -1,5 +1,5 @@
import { defineConfig } from "vitest/config";
import * as path from "path-browserify";
import * as path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));