murashit_codex-panel/eslint.config.mjs

116 lines
3 KiB
JavaScript
Raw Normal View History

2026-06-25 02:54:26 +00:00
import json from "@eslint/json";
2026-05-21 15:44:11 +00:00
import { defineConfig } from "eslint/config";
2026-05-13 00:54:49 +00:00
import obsidianmd from "eslint-plugin-obsidianmd";
2026-06-25 02:54:26 +00:00
import { PlainTextParser } from "eslint-plugin-obsidianmd/dist/lib/plainTextParser.js";
2026-05-21 15:44:11 +00:00
import tseslint from "typescript-eslint";
2026-05-13 00:54:49 +00:00
const sourceTypeScriptFiles = ["src/**/*.{ts,tsx}"];
2026-05-21 15:44:11 +00:00
export default defineConfig([
2026-05-12 15:05:56 +00:00
{
ignores: ["main.js", "node_modules/**", "src/generated/**"],
},
{
2026-05-13 00:54:49 +00:00
basePath: "src",
plugins: {
obsidianmd,
},
},
2026-06-25 02:54:26 +00:00
...obsidianmd.configs.recommended.map(obsidianSourceRecommendedConfig).filter(Boolean),
...tseslint.configs.strictTypeChecked.map((config) => ({
...config,
files: sourceTypeScriptFiles,
})),
2026-05-12 15:05:56 +00:00
{
files: sourceTypeScriptFiles,
2026-05-12 15:05:56 +00:00
languageOptions: {
ecmaVersion: 2022,
sourceType: "module",
parserOptions: {
tsconfigRootDir: import.meta.dirname,
projectService: true,
2026-05-12 15:05:56 +00:00
},
globals: {
2026-05-21 15:44:11 +00:00
AbortSignal: "readonly",
2026-05-12 15:05:56 +00:00
HTMLElement: "readonly",
HTMLTextAreaElement: "readonly",
KeyboardEvent: "readonly",
NodeJS: "readonly",
clearTimeout: "readonly",
2026-05-12 15:05:56 +00:00
console: "readonly",
document: "readonly",
requestAnimationFrame: "readonly",
setTimeout: "readonly",
2026-05-12 15:05:56 +00:00
},
},
2026-06-24 23:39:57 +00:00
rules: {
// Biome import restrictions do not cover `import("...").T`; keep that type syntax out before source-boundary lint runs.
"@typescript-eslint/consistent-type-imports": [
"error",
{
disallowTypeAnnotations: true,
fixStyle: "separate-type-imports",
prefer: "type-imports",
},
],
2026-06-24 23:39:57 +00:00
"@typescript-eslint/require-await": "off",
},
2026-05-22 22:05:52 +00:00
},
2026-05-21 15:44:11 +00:00
{
2026-06-25 02:54:26 +00:00
files: ["manifest.json"],
2026-05-13 00:54:49 +00:00
plugins: {
2026-06-25 02:54:26 +00:00
json,
2026-05-13 00:54:49 +00:00
obsidianmd,
},
2026-06-25 02:54:26 +00:00
language: "json/json",
rules: {
"obsidianmd/validate-manifest": "error",
},
},
{
files: ["LICENSE"],
plugins: {
obsidianmd,
},
languageOptions: {
parser: PlainTextParser,
},
2026-05-13 00:54:49 +00:00
rules: {
2026-06-25 02:54:26 +00:00
"obsidianmd/validate-license": "error",
2026-05-13 00:54:49 +00:00
},
},
2026-05-21 15:44:11 +00:00
]);
2026-06-25 02:54:26 +00:00
function obsidianSourceRecommendedConfig(config) {
const rules = Object.fromEntries(
Object.entries(config.rules ?? {})
.filter(([ruleName]) => {
return (
ruleName.startsWith("obsidianmd/") && ruleName !== "obsidianmd/validate-manifest" && ruleName !== "obsidianmd/validate-license"
);
})
.map(([ruleName, ruleConfig]) => {
if (ruleName !== "obsidianmd/ui/sentence-case") return [ruleName, ruleConfig];
return [
ruleName,
[
"error",
{
enforceCamelCaseLower: true,
acronyms: ["MCP"],
brands: ["Codex", "Codex Panel", "Obsidian"],
},
],
];
}),
);
if (Object.keys(rules).length === 0) return null;
const obsidianConfig = {
basePath: "src",
rules,
};
if (config.files) obsidianConfig.files = config.files;
if (config.ignores) obsidianConfig.ignores = config.ignores;
return obsidianConfig;
}