Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,33 @@ export default defineConfig([

```

### `package.json` lint rules

The package exposes special configuration `packageJson` to lint `package.json` file.

Due to `ESLint` configuration limitation, it's hard to make it working together with other TypeScript rules.

So it's recommended to extract it into a separate config file, e.g. `eslint.config.package.json.mjs`

```javascript
// eslint.config.package.json.mjs
import { defineConfig, globalIgnores } from "eslint/config";

export default defineConfig([
globalIgnores([
'**/*.*',
'!package.json'
]),
obsidianmd.configs.packageJson
]);
```

And then you can run it via

```bash
npx eslint --config eslint.config.package.json.mjs
```

### Legacy Config (`.eslintrc`)

<details>
Expand Down
170 changes: 86 additions & 84 deletions lib/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,9 @@ import sdl from "@microsoft/eslint-plugin-sdl";
import importPlugin from "eslint-plugin-import";
import depend from 'eslint-plugin-depend';
import globals from "globals";

import { Config, defineConfig, globalIgnores } from "eslint/config";
import type { RuleDefinition, RuleDefinitionTypeOptions, RulesConfig } from "@eslint/core";

interface ConfigWithIterator extends Linter.Config {
[Symbol.iterator]: () => Generator<Linter.Config>;
}

const plugin = {
meta: {
name: "eslint-plugin-obsidianmd",
Expand Down Expand Up @@ -74,8 +70,9 @@ const plugin = {
"ui/sentence-case-locale-module": ui.sentenceCaseLocaleModule,
} as unknown as Record<string, RuleDefinition<RuleDefinitionTypeOptions>>,
configs: {
recommended: <Linter.Config<RulesConfig>>{},
recommendedWithLocalesEn: <Linter.Config<RulesConfig>>{}
recommended: [] as Config[],
recommendedWithLocalesEn: [] as Config[],
packageJson: [] as Config[]
}
} satisfies ESLint.Plugin;

Expand Down Expand Up @@ -104,7 +101,7 @@ const recommendedPluginRulesConfig: RulesConfig = {
"obsidianmd/sample-names": "error",
"obsidianmd/validate-manifest": "error",
"obsidianmd/validate-license": ["error"],
"obsidianmd/ui/sentence-case": ["error", { enforceCamelCaseLower: true }],
"obsidianmd/ui/sentence-case": ["error", { enforceCamelCaseLower: true }],
}

const flatRecommendedGeneralRules: RulesConfig = {
Expand Down Expand Up @@ -189,52 +186,40 @@ const flatRecommendedGeneralRules: RulesConfig = {
"import/no-extraneous-dependencies": "error",
}

const flatRecommendedConfig: Linter.Config[] = [
const flatRecommendedConfig: Config[] = defineConfig([
js.configs.recommended,
{
...tseslint.configs.recommended,
plugins: {
obsidianmd: plugin
}
},
{
plugins: {
import: importPlugin,
"@microsoft/sdl": sdl,
obsidianmd: plugin,
depend
},
files: ['**/*.js', "**/*.jsx"],
extends: tseslint.configs.recommended as Config[],
rules: {
...flatRecommendedGeneralRules,
...recommendedPluginRulesConfig
}
},
{
...tseslint.configs.recommendedTypeChecked,
plugins: {
import: importPlugin,
"@microsoft/sdl": sdl,
obsidianmd: plugin,
depend
},
files: ['**/*.ts', "**/*.tsx"],
extends: tseslint.configs.recommendedTypeChecked as Config[],
rules: {
...flatRecommendedGeneralRules,
...recommendedPluginRulesConfig
},
},
{
files: ['package.json'],
language: 'json/json',
plugins: {
depend,
json
},
rules: {
"no-irregular-whitespace": "off",
"depend/ban-dependencies": [
"error", {
"presets": ["native", "microutilities", "preferred"]
}
]
}
}, {
languageOptions: {
globals: {
...globals.browser,
Expand All @@ -261,68 +246,85 @@ const flatRecommendedConfig: Linter.Config[] = [
}
},
}
];
]);

const hybridRecommendedConfig: ConfigWithIterator = {
// Properties for eslint-doc-generator to read
...recommendedPluginRulesConfig,
const hybridRecommendedConfig: Config[] = defineConfig({
rules: recommendedPluginRulesConfig,
extends: flatRecommendedConfig
});

// Make the object iterable for the ESLint 9 runtime
[Symbol.iterator]: function* () {
yield* flatRecommendedConfig
const recommendedWithLocalesEnBase: Config[] = defineConfig([
...flatRecommendedConfig,
{
plugins: { obsidianmd: plugin },
files: [
"**/en.json",
"**/en*.json",
"**/en/*.json",
"**/en/**/*.json",
],
rules: {
"obsidianmd/ui/sentence-case-json": "warn",
},
},
};
// TS/JS English locale modules
{
plugins: { obsidianmd: plugin },
files: [
"**/en.ts",
"**/en.js",
"**/en.cjs",
"**/en.mjs",
"**/en-*.ts",
"**/en-*.js",
"**/en-*.cjs",
"**/en-*.mjs",
"**/en_*.ts",
"**/en_*.js",
"**/en_*.cjs",
"**/en_*.mjs",
"**/en/*.ts",
"**/en/*.js",
"**/en/*.cjs",
"**/en/*.mjs",
"**/en/**/*.ts",
"**/en/**/*.js",
"**/en/**/*.cjs",
"**/en/**/*.mjs",
],
rules: {
"obsidianmd/ui/sentence-case-locale-module": "warn",
},
}
]);

const recommendedWithLocalesEn: Config[] = defineConfig({
rules: recommendedPluginRulesConfig,
extends: recommendedWithLocalesEnBase
});

const packageJsonConfig: Config[] = defineConfig( {
files: ['package.json'],
language: 'json/json',
extends: [tseslint.configs.disableTypeChecked as Config],
plugins: {
depend,
json
},
rules: {
"no-irregular-whitespace": "off",
"depend/ban-dependencies": [
"error", {
"presets": ["native", "microutilities", "preferred"]
}
]
}
});

plugin.configs = {
recommended: hybridRecommendedConfig,
recommendedWithLocalesEn: <ConfigWithIterator>{
...recommendedPluginRulesConfig,
[Symbol.iterator]: function* () {
yield* flatRecommendedConfig;
// JSON English locales
yield {
plugins: { obsidianmd: plugin },
files: [
"**/en.json",
"**/en*.json",
"**/en/*.json",
"**/en/**/*.json",
],
rules: {
"obsidianmd/ui/sentence-case-json": "warn",
},
};
// TS/JS English locale modules
yield {
plugins: { obsidianmd: plugin },
files: [
"**/en.ts",
"**/en.js",
"**/en.cjs",
"**/en.mjs",
"**/en-*.ts",
"**/en-*.js",
"**/en-*.cjs",
"**/en-*.mjs",
"**/en_*.ts",
"**/en_*.js",
"**/en_*.cjs",
"**/en_*.mjs",
"**/en/*.ts",
"**/en/*.js",
"**/en/*.cjs",
"**/en/*.mjs",
"**/en/**/*.ts",
"**/en/**/*.js",
"**/en/**/*.cjs",
"**/en/**/*.mjs",
],
rules: {
"obsidianmd/ui/sentence-case-locale-module": "warn",
},
};
},
},
recommendedWithLocalesEn,
packageJson: packageJsonConfig
};

export default plugin;