diff --git a/package.json b/package.json index be1dea44..6ce01bd3 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "@webref/css": "^8.6.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 a3fe4743..b526ce77 100644 --- a/src/index.js +++ b/src/index.js @@ -19,6 +19,7 @@ import rules from "./build/rules.js"; const plugin = { meta: { name: "@eslint/css", + namespace: "css", version: "1.4.0", // x-release-please-version }, languages: { diff --git a/src/rules/font-family-fallbacks.js b/src/rules/font-family-fallbacks.js index 261b63fa..ed8e3426 100644 --- a/src/rules/font-family-fallbacks.js +++ b/src/rules/font-family-fallbacks.js @@ -114,10 +114,12 @@ function reportFontWithoutFallbacksInFontProperty( export default /** @satisfies {FontFamilyFallbacksRuleDefinition} */ ({ meta: { type: "suggestion", + languages: ["css/css"], docs: { description: "Enforce use of fallback fonts and a generic font last", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/font-family-fallbacks.md", }, diff --git a/src/rules/no-duplicate-imports.js b/src/rules/no-duplicate-imports.js index 635d067d..1b02e2af 100644 --- a/src/rules/no-duplicate-imports.js +++ b/src/rules/no-duplicate-imports.js @@ -83,12 +83,14 @@ function getFixForImport(fixer, text, start, end, hasModifiers) { export default /** @satisfies {NoDuplicateImportsRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], fixable: "code", hasSuggestions: true, docs: { description: "Disallow duplicate @import rules", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-duplicate-imports.md", }, diff --git a/src/rules/no-duplicate-keyframe-selectors.js b/src/rules/no-duplicate-keyframe-selectors.js index ac428eb8..54cab88f 100644 --- a/src/rules/no-duplicate-keyframe-selectors.js +++ b/src/rules/no-duplicate-keyframe-selectors.js @@ -20,9 +20,11 @@ export default /** @satisfies {DuplicateKeyframeSelectorRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow duplicate selectors within keyframe blocks", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-duplicate-keyframe-selectors.md", }, diff --git a/src/rules/no-empty-blocks.js b/src/rules/no-empty-blocks.js index 8a9287fd..e0eeed51 100644 --- a/src/rules/no-empty-blocks.js +++ b/src/rules/no-empty-blocks.js @@ -20,9 +20,11 @@ export default /** @satisfies {NoEmptyBlocksRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow empty blocks", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-empty-blocks.md", }, diff --git a/src/rules/no-important.js b/src/rules/no-important.js index e528c5f9..dc63aa04 100644 --- a/src/rules/no-important.js +++ b/src/rules/no-important.js @@ -29,11 +29,13 @@ const trailingWhitespacePattern = /\s*$/u; export default /** @satisfies {NoImportantRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], hasSuggestions: true, docs: { description: "Disallow !important flags", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-important.md", }, diff --git a/src/rules/no-invalid-at-rule-placement.js b/src/rules/no-invalid-at-rule-placement.js index 7b1b8528..4bf0a0bf 100644 --- a/src/rules/no-invalid-at-rule-placement.js +++ b/src/rules/no-invalid-at-rule-placement.js @@ -20,9 +20,11 @@ export default /** @satisfies {NoInvalidAtRulePlacementRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow invalid placement of at-rules", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-invalid-at-rule-placement.md", }, diff --git a/src/rules/no-invalid-at-rules.js b/src/rules/no-invalid-at-rules.js index a59d3be5..4015d82c 100644 --- a/src/rules/no-invalid-at-rules.js +++ b/src/rules/no-invalid-at-rules.js @@ -77,11 +77,13 @@ function extractMetaDataFromError(error) { export default /** @satisfies {NoInvalidAtRulesRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], fixable: "code", docs: { description: "Disallow invalid at-rules", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-invalid-at-rules.md", }, diff --git a/src/rules/no-invalid-named-grid-areas.js b/src/rules/no-invalid-named-grid-areas.js index 2d0c9789..976f2ca6 100644 --- a/src/rules/no-invalid-named-grid-areas.js +++ b/src/rules/no-invalid-named-grid-areas.js @@ -82,9 +82,11 @@ const validProps = new Set(["grid-template-areas", "grid-template", "grid"]); export default /** @satisfies {NoInvalidNamedGridAreasRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow invalid named grid areas", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-invalid-named-grid-areas.md", }, diff --git a/src/rules/no-invalid-properties.js b/src/rules/no-invalid-properties.js index 801324bb..c8242ea0 100644 --- a/src/rules/no-invalid-properties.js +++ b/src/rules/no-invalid-properties.js @@ -89,9 +89,11 @@ function getVarFallbackList(value) { export default /** @satisfies {NoInvalidPropertiesRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow invalid properties", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-invalid-properties.md", }, diff --git a/src/rules/no-unmatchable-selectors.js b/src/rules/no-unmatchable-selectors.js index 7f58a8ff..85989c9e 100644 --- a/src/rules/no-unmatchable-selectors.js +++ b/src/rules/no-unmatchable-selectors.js @@ -20,9 +20,11 @@ export default /** @satisfies {NoUnmatchableSelectorsRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow unmatchable selectors", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/no-unmatchable-selectors.md", }, diff --git a/src/rules/prefer-logical-properties.js b/src/rules/prefer-logical-properties.js index 98f29347..cc62ac2a 100644 --- a/src/rules/prefer-logical-properties.js +++ b/src/rules/prefer-logical-properties.js @@ -136,11 +136,13 @@ const unitReplacements = new Map([ export default /** @satisfies {PreferLogicalPropertiesRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], hasSuggestions: true, docs: { description: "Enforce the use of logical properties", + dialects: ["CSS"], url: "https://github.com/eslint/css/blob/main/docs/rules/prefer-logical-properties.md", }, diff --git a/src/rules/relative-font-units.js b/src/rules/relative-font-units.js index f11725f9..e8d5451a 100644 --- a/src/rules/relative-font-units.js +++ b/src/rules/relative-font-units.js @@ -53,9 +53,11 @@ const disallowedFontSizeKeywords = new Set([ export default /** @satisfies {RelativeFontUnitsRuleDefinition} */ ({ meta: { type: "suggestion", + languages: ["css/css"], docs: { description: "Enforce the use of relative font units", + dialects: ["CSS"], recommended: false, url: "https://github.com/eslint/css/blob/main/docs/rules/relative-font-units.md", }, diff --git a/src/rules/selector-complexity.js b/src/rules/selector-complexity.js index fd81cc99..f864f3e6 100644 --- a/src/rules/selector-complexity.js +++ b/src/rules/selector-complexity.js @@ -155,9 +155,11 @@ function getDisallowedCombinatorsLocation( export default /** @satisfies {SelectorComplexityRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Disallow and limit CSS selectors", + dialects: ["CSS"], recommended: false, url: "https://github.com/eslint/css/blob/main/docs/rules/selector-complexity.md", }, diff --git a/src/rules/use-baseline.js b/src/rules/use-baseline.js index 0aa37022..bcf49c14 100644 --- a/src/rules/use-baseline.js +++ b/src/rules/use-baseline.js @@ -486,9 +486,11 @@ class BaselineAvailability { export default /** @satisfies {UseBaselineRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Enforce the use of baseline features", + dialects: ["CSS"], recommended: true, url: "https://github.com/eslint/css/blob/main/docs/rules/use-baseline.md", }, diff --git a/src/rules/use-layers.js b/src/rules/use-layers.js index 72317ca7..2e2e5801 100644 --- a/src/rules/use-layers.js +++ b/src/rules/use-layers.js @@ -25,9 +25,11 @@ export default /** @satisfies {UseLayersRuleDefinition} */ ({ meta: { type: "problem", + languages: ["css/css"], docs: { description: "Require use of layers", + dialects: ["CSS"], url: "https://github.com/eslint/css/blob/main/docs/rules/use-layers.md", }, diff --git a/tests/plugin/eslint.test.js b/tests/plugin/eslint.test.js index 30b3b166..8c60fec0 100644 --- a/tests/plugin/eslint.test.js +++ b/tests/plugin/eslint.test.js @@ -43,6 +43,34 @@ describe("Plugin", () => { .map(([name]) => `css/${name}`); assert.deepStrictEqual(actualRuleIds, expectedRuleIds); }); + + it("rules should work when the plugin is registered under a custom namespace", async () => { + const eslint = new ESLint({ + overrideConfigFile: true, + overrideConfig: { + files: ["**/*.css"], + plugins: { + eslintcss: css, + }, + language: "eslintcss/css", + rules: { + "eslintcss/no-empty-blocks": "error", + }, + }, + }); + + const results = await eslint.lintText("a {}", { + filePath: "test.css", + }); + + assert.strictEqual(results.length, 1); + assert.strictEqual(results[0].messages.length, 1); + assert.strictEqual( + results[0].messages[0].ruleId, + "eslintcss/no-empty-blocks", + ); + assert.strictEqual(results[0].messages[0].messageId, "emptyBlock"); + }); }); describe("languageOptions", () => { diff --git a/tests/types/types.test.ts b/tests/types/types.test.ts index 22b60948..4d230a2d 100644 --- a/tests/types/types.test.ts +++ b/tests/types/types.test.ts @@ -64,6 +64,7 @@ css satisfies Plugin; // See: https://github.com/eslint/css/pull/473 css satisfies ESLint.Plugin; css.meta.name satisfies string; +css.meta.namespace satisfies string; css.meta.version satisfies string; // Check that these languages are defined: