From 7e249a127ceda8ff350903d8aa527124e8315c4b Mon Sep 17 00:00:00 2001 From: lumir Date: Mon, 17 Aug 2026 21:36:33 +0900 Subject: [PATCH] fix: allow additional properties in `CSSLanguageOptions` --- src/languages/css-language.js | 15 +----------- src/languages/css-source-code.js | 3 +-- src/types.ts | 42 +++++++++++++++++++++++++++++--- tests/types/types.test.ts | 18 ++++++++++++++ 4 files changed, 59 insertions(+), 19 deletions(-) diff --git a/src/languages/css-language.js b/src/languages/css-language.js index e0777b5b..446c17c7 100644 --- a/src/languages/css-language.js +++ b/src/languages/css-language.js @@ -25,24 +25,11 @@ import { visitorKeys } from "./css-visitor-keys.js"; /** * @import { CssNodePlain, Comment, Lexer, StyleSheetPlain, SyntaxConfig } from "@eslint/css-tree" * @import { Language, OkParseResult, ParseResult, File, FileError } from "@eslint/core"; + * @import { CSSLanguageOptions } from "../types.js"; */ /** @typedef {OkParseResult & { comments: Comment[], lexer: Lexer }} CSSOkParseResult */ /** @typedef {ParseResult} CSSParseResult */ -/** - * DefaultSyntaxConfig type representing the structure returned by `@eslint/css-tree/definition-syntax-data`. - * This type is defined inline because it's not exported from the main `@eslint/css-tree` package. - * @typedef {Pick} DefaultSyntaxConfig - */ -/** - * @typedef {(defaultSyntax: DefaultSyntaxConfig) => Partial} SyntaxExtensionCallback - */ -/** - * @typedef {Object} CSSLanguageOptions - * @property {boolean} [tolerant] Whether to be tolerant of recoverable parsing errors. - * @property {Partial | SyntaxExtensionCallback} [customSyntax] Custom syntax to use for parsing. - */ - //----------------------------------------------------------------------------- // Helpers //----------------------------------------------------------------------------- diff --git a/src/languages/css-source-code.js b/src/languages/css-source-code.js index ec98a51b..2998c74c 100644 --- a/src/languages/css-source-code.js +++ b/src/languages/css-source-code.js @@ -22,8 +22,7 @@ import { visitorKeys } from "./css-visitor-keys.js"; /** * @import { CssNode, CssNodePlain, CssLocationRange, Comment, Lexer, StyleSheetPlain } from "@eslint/css-tree" * @import { SourceRange, FileProblem, DirectiveType, RulesConfig } from "@eslint/core" - * @import { CSSSyntaxElement } from "../types.js" - * @import { CSSLanguageOptions } from "./css-language.js" + * @import { CSSLanguageOptions, CSSSyntaxElement } from "../types.js" */ //----------------------------------------------------------------------------- diff --git a/src/types.ts b/src/types.ts index 715b3545..6d49c0fb 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,19 +7,55 @@ // Imports //------------------------------------------------------------------------------ -import type { RuleVisitor } from "@eslint/core"; -import type { CssNodePlain, StyleSheetPlain } from "@eslint/css-tree"; +import type { LanguageOptions, RuleVisitor } from "@eslint/core"; +import type { + CssNodePlain, + StyleSheetPlain, + SyntaxConfig, +} from "@eslint/css-tree"; import type { CustomRuleDefinitionType, CustomRuleTypeDefinitions, CustomRuleVisitorWithExit, } from "@eslint/plugin-kit"; -import type { CSSLanguageOptions, CSSSourceCode } from "./index.js"; +import type { CSSSourceCode } from "./index.js"; //------------------------------------------------------------------------------ // Types //------------------------------------------------------------------------------ +/** + * Default syntax configuration representing the structure returned by + * `@eslint/css-tree/definition-syntax-data`. + */ +export type DefaultSyntaxConfig = Pick< + SyntaxConfig, + "atrules" | "types" | "properties" +>; + +/** + * A callback used to extend the default CSS syntax configuration. + */ +export type SyntaxExtensionCallback = ( + defaultSyntax: DefaultSyntaxConfig, +) => Partial; + +/** + * Language options provided for CSS files. + */ +export interface CSSLanguageOptions extends LanguageOptions { + /** + * Whether to be tolerant of recoverable parsing errors. + * @default false + */ + tolerant?: boolean; + + /** + * Custom syntax to use for parsing. + */ + customSyntax?: Partial | SyntaxExtensionCallback; +} + /** * A CSS syntax element, including nodes and comments. */ diff --git a/tests/types/types.test.ts b/tests/types/types.test.ts index 22b60948..a357ec1c 100644 --- a/tests/types/types.test.ts +++ b/tests/types/types.test.ts @@ -1,5 +1,6 @@ import css from "@eslint/css"; import type { + CSSLanguageOptions, CSSRuleDefinition, CSSRuleVisitor, CSSSourceCode, @@ -75,6 +76,23 @@ css.rules[ruleName] satisfies CSSRuleDefinition; // Check that `plugins` in the recommended config is defined: css.configs.recommended.plugins satisfies object; +const validLanguageOptions1: CSSLanguageOptions = {}; +const validLanguageOptions2: CSSLanguageOptions = { + tolerant: true, +}; +const validLanguageOptions3: CSSLanguageOptions = { + tolerant: false, +}; +const validLanguageOptions4: CSSLanguageOptions = { + tolerant: true, + unknownOption: "unknown", +}; + +const invalidLanguageOptions1: CSSLanguageOptions = { + // @ts-expect-error -- Invalid value for `tolerant` + tolerant: "true", +}; + { type RecommendedRuleName = keyof typeof css.configs.recommended.rules; type RuleName = `css/${keyof typeof css.rules}`;