diff --git a/package.json b/package.json index 47c647c..98e7c36 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,7 @@ "@types/node": "^20.19.0", "c8": "^11.0.0", "dedent": "^1.5.3", - "eslint": "^10.0.0", + "eslint": "^10.4.0", "eslint-config-eslint": "^14.0.0", "eslint-plugin-eslint-plugin": "^7.3.2", "globals": "^17.0.0", diff --git a/src/index.js b/src/index.js index c9b7310..6994fa3 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ import rules from "./build/rules.js"; const plugin = { meta: { name: "@eslint/json", + namespace: "json", version: "1.2.0", // x-release-please-version }, languages: { diff --git a/src/rules/no-duplicate-keys.js b/src/rules/no-duplicate-keys.js index 611453a..decdb22 100644 --- a/src/rules/no-duplicate-keys.js +++ b/src/rules/no-duplicate-keys.js @@ -28,10 +28,12 @@ import { getKey, getRawKey } from "../util.js"; const rule = { meta: { type: "problem", + languages: ["json/json", "json/jsonc", "json/json5"], docs: { recommended: true, description: "Disallow duplicate keys in JSON objects", + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/no-duplicate-keys.md", }, diff --git a/src/rules/no-empty-keys.js b/src/rules/no-empty-keys.js index 4f6e3d0..7125076 100644 --- a/src/rules/no-empty-keys.js +++ b/src/rules/no-empty-keys.js @@ -27,10 +27,12 @@ import { getKey } from "../util.js"; const rule = { meta: { type: "problem", + languages: ["json/json", "json/jsonc", "json/json5"], docs: { recommended: true, description: "Disallow empty keys in JSON objects", + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/no-empty-keys.md", }, diff --git a/src/rules/no-unnormalized-keys.js b/src/rules/no-unnormalized-keys.js index e7b366c..44b50a0 100644 --- a/src/rules/no-unnormalized-keys.js +++ b/src/rules/no-unnormalized-keys.js @@ -28,12 +28,14 @@ import { getKey, getRawKey } from "../util.js"; const rule = { meta: { type: "problem", + languages: ["json/json", "json/jsonc", "json/json5"], fixable: "code", docs: { recommended: true, description: "Disallow JSON keys that are not normalized", + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/no-unnormalized-keys.md", }, diff --git a/src/rules/no-unsafe-values.js b/src/rules/no-unsafe-values.js index ee9b6f5..ee5d3c2 100644 --- a/src/rules/no-unsafe-values.js +++ b/src/rules/no-unsafe-values.js @@ -39,10 +39,12 @@ const NON_ZERO = /[1-9]/u; const rule = { meta: { type: "problem", + languages: ["json/json", "json/jsonc", "json/json5"], docs: { recommended: true, description: "Disallow JSON values that are unsafe for interchange", + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/no-unsafe-values.md", }, diff --git a/src/rules/sort-keys.js b/src/rules/sort-keys.js index b6add2d..0359183 100644 --- a/src/rules/sort-keys.js +++ b/src/rules/sort-keys.js @@ -79,6 +79,7 @@ const comparators = { const rule = { meta: { type: "suggestion", + languages: ["json/json", "json/jsonc", "json/json5"], fixable: "code", @@ -95,6 +96,7 @@ const rule = { docs: { recommended: false, description: `Require JSON object keys to be sorted`, + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/sort-keys.md", }, diff --git a/src/rules/top-level-interop.js b/src/rules/top-level-interop.js index d203892..b519669 100644 --- a/src/rules/top-level-interop.js +++ b/src/rules/top-level-interop.js @@ -21,11 +21,13 @@ const rule = { meta: { type: "problem", + languages: ["json/json", "json/jsonc", "json/json5"], docs: { recommended: false, description: "Require the JSON top-level value to be an array or object", + dialects: ["JSON", "JSONC", "JSON5"], url: "https://github.com/eslint/json/tree/main/docs/rules/top-level-interop.md", }, diff --git a/tests/plugin/eslint.test.js b/tests/plugin/eslint.test.js index f186c96..feba76c 100644 --- a/tests/plugin/eslint.test.js +++ b/tests/plugin/eslint.test.js @@ -44,6 +44,42 @@ describe("when the plugin is used with ESLint", () => { .map(([name]) => `json/${name}`); assert.deepStrictEqual(actualRuleIds, expectedRuleIds); }); + + it("rules should work when the plugin is registered under a custom namespace", async () => { + for (const language of ["json", "jsonc", "json5"]) { + const eslint = new ESLint({ + overrideConfigFile: true, + overrideConfig: { + files: [`**/*.${language}`], + plugins: { + eslintjson: json, + }, + language: `eslintjson/${language}`, + rules: { + "eslintjson/no-duplicate-keys": "error", + }, + }, + }); + + const results = await eslint.lintText( + '{"foo": 42, "foo": 43}', + { + filePath: `test.${language}`, + }, + ); + + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].messages.length, 1); + assert.strictEqual( + results[0].messages[0].ruleId, + "eslintjson/no-duplicate-keys", + ); + assert.strictEqual( + results[0].messages[0].messageId, + "duplicateKey", + ); + } + }); }); describe("config comments", () => { diff --git a/tests/types/types.test.ts b/tests/types/types.test.ts index c21577a..4bee9d7 100644 --- a/tests/types/types.test.ts +++ b/tests/types/types.test.ts @@ -25,6 +25,7 @@ import type { Plugin, SourceLocation, SourceRange } from "@eslint/core"; json satisfies Plugin; json.meta.name satisfies string; +json.meta.namespace satisfies string; json.meta.version satisfies string; // Check that these languages are defined: