diff --git a/.gitignore b/.gitignore index 938dafdd..0247a9f7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ packages/website/src/docs/**/*.html packages/website/src/out/**/*.html packages/**/dist *.tsbuildinfo -packages/parser/types .parcel-cache/ .pnp.* .yarn/* @@ -20,3 +19,7 @@ packages/**/.yarn !.yarn/releases !.yarn/sdks !.yarn/versions + +# generated types +packages/parser/types +packages/eslint-plugin/types diff --git a/.prettierignore b/.prettierignore index 208dfc32..f81139b4 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,7 +8,10 @@ packages/website/**/*.html packages/web-linter/out .next dist -packages/parser/types **/dist .yarn/releases yarn.lock + +# generated types +packages/parser/types +packages/eslint-plugin/types diff --git a/packages/eslint-plugin/lib/rules/element-newline.js b/packages/eslint-plugin/lib/rules/element-newline.js index 5be800de..1f178479 100644 --- a/packages/eslint-plugin/lib/rules/element-newline.js +++ b/packages/eslint-plugin/lib/rules/element-newline.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").ProgramNode } ProgramNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").BaseNode } BaseNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { @@ -45,7 +52,7 @@ module.exports = { const skipTags = option.skip; let skipTagCount = 0; /** - * @param {ChildType[]} siblings + * @param {import("../types").ChildType[]} siblings */ function checkSiblings(siblings) { siblings @@ -70,7 +77,7 @@ module.exports = { /** * @param {TagNode} node - * @param {ChildType[]} children + * @param {import("../types").ChildType[]} children */ function checkChild(node, children) { const targetChildren = children.filter((n) => n.type !== "Text"); diff --git a/packages/eslint-plugin/lib/rules/id-naming-convention.js b/packages/eslint-plugin/lib/rules/id-naming-convention.js index ef0b5196..55da079d 100644 --- a/packages/eslint-plugin/lib/rules/id-naming-convention.js +++ b/packages/eslint-plugin/lib/rules/id-naming-convention.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { isCamelCase, @@ -27,7 +34,7 @@ const CONVENTION_CHECKERS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/indent.js b/packages/eslint-plugin/lib/rules/indent.js index 44dc0d65..d7bafd38 100644 --- a/packages/eslint-plugin/lib/rules/indent.js +++ b/packages/eslint-plugin/lib/rules/indent.js @@ -1,8 +1,12 @@ /** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").AnyNode } AnyNode + * @typedef { import("../types").LineNode } LineNode + * @typedef { import("../types").BaseNode } BaseNode + * @typedef { import("../types").TagNode } TagNode * @typedef {Object} IndentType * @property {"tab"} TAB * @property {"space"} SPACE - * * @typedef {Object} MessageId * @property {"wrongIndent"} WRONG_INDENT */ @@ -24,7 +28,7 @@ const INDENT_TYPES = { const IGNORING_NODES = ["pre", "xmp"]; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/lowercase.js b/packages/eslint-plugin/lib/rules/lowercase.js index 40d6d847..a1fd64fc 100644 --- a/packages/eslint-plugin/lib/rules/lowercase.js +++ b/packages/eslint-plugin/lib/rules/lowercase.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-abstract-roles.js b/packages/eslint-plugin/lib/rules/no-abstract-roles.js index b03bcd0c..b1731361 100644 --- a/packages/eslint-plugin/lib/rules/no-abstract-roles.js +++ b/packages/eslint-plugin/lib/rules/no-abstract-roles.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -21,7 +28,7 @@ const ABSTRACT_ROLE_SET = new Set([ ]); /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-accesskey-attrs.js b/packages/eslint-plugin/lib/rules/no-accesskey-attrs.js index d48ef74a..6c270489 100644 --- a/packages/eslint-plugin/lib/rules/no-accesskey-attrs.js +++ b/packages/eslint-plugin/lib/rules/no-accesskey-attrs.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-aria-hidden-body.js b/packages/eslint-plugin/lib/rules/no-aria-hidden-body.js index b042c0b9..7a23625a 100644 --- a/packages/eslint-plugin/lib/rules/no-aria-hidden-body.js +++ b/packages/eslint-plugin/lib/rules/no-aria-hidden-body.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-duplicate-attrs.js b/packages/eslint-plugin/lib/rules/no-duplicate-attrs.js index 0ee8bc19..b81085ab 100644 --- a/packages/eslint-plugin/lib/rules/no-duplicate-attrs.js +++ b/packages/eslint-plugin/lib/rules/no-duplicate-attrs.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +12,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-duplicate-id.js b/packages/eslint-plugin/lib/rules/no-duplicate-id.js index 921ddc93..2c8a54ef 100644 --- a/packages/eslint-plugin/lib/rules/no-duplicate-id.js +++ b/packages/eslint-plugin/lib/rules/no-duplicate-id.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-extra-spacing-attrs.js b/packages/eslint-plugin/lib/rules/no-extra-spacing-attrs.js index 9cc3510f..1b26d344 100644 --- a/packages/eslint-plugin/lib/rules/no-extra-spacing-attrs.js +++ b/packages/eslint-plugin/lib/rules/no-extra-spacing-attrs.js @@ -1,3 +1,18 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").AttributeNode } AttributeNode + * @typedef { import("../types").OpenTagEndNode } OpenTagEndNode + * @typedef { import("../types").OpenScriptTagEndNode } OpenScriptTagEndNode + * @typedef { import("../types").OpenStyleTagEndNode } OpenStyleTagEndNode + * @typedef { import("../types").OpenScriptTagStartNode } OpenScriptTagStartNode + * @typedef { import("../types").OpenTagStartNode } OpenTagStartNode + * @typedef { import("../types").OpenStyleTagStartNode } OpenStyleTagStartNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + * @typedef { import("../types").AnyNode } AnyNode + */ + const { RULE_CATEGORY } = require("../constants"); const { getLocBetween } = require("./utils/node"); @@ -11,7 +26,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-inline-styles.js b/packages/eslint-plugin/lib/rules/no-inline-styles.js index d728ee30..eac3d681 100644 --- a/packages/eslint-plugin/lib/rules/no-inline-styles.js +++ b/packages/eslint-plugin/lib/rules/no-inline-styles.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-multiple-empty-lines.js b/packages/eslint-plugin/lib/rules/no-multiple-empty-lines.js index 6e45f488..b2e2ac0c 100644 --- a/packages/eslint-plugin/lib/rules/no-multiple-empty-lines.js +++ b/packages/eslint-plugin/lib/rules/no-multiple-empty-lines.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").ProgramNode } ProgramNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-multiple-h1.js b/packages/eslint-plugin/lib/rules/no-multiple-h1.js index 05232204..da685764 100644 --- a/packages/eslint-plugin/lib/rules/no-multiple-h1.js +++ b/packages/eslint-plugin/lib/rules/no-multiple-h1.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-non-scalable-viewport.js b/packages/eslint-plugin/lib/rules/no-non-scalable-viewport.js index 0c350ada..d066ee33 100644 --- a/packages/eslint-plugin/lib/rules/no-non-scalable-viewport.js +++ b/packages/eslint-plugin/lib/rules/no-non-scalable-viewport.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-obsolete-tags.js b/packages/eslint-plugin/lib/rules/no-obsolete-tags.js index f420844e..56780ae7 100644 --- a/packages/eslint-plugin/lib/rules/no-obsolete-tags.js +++ b/packages/eslint-plugin/lib/rules/no-obsolete-tags.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY, OBSOLETE_TAGS } = require("../constants"); const OBSOLETE_TAGS_SET = new Set(OBSOLETE_TAGS); @@ -7,7 +11,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-positive-tabindex.js b/packages/eslint-plugin/lib/rules/no-positive-tabindex.js index f7f9f59c..2dd6192d 100644 --- a/packages/eslint-plugin/lib/rules/no-positive-tabindex.js +++ b/packages/eslint-plugin/lib/rules/no-positive-tabindex.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-restricted-attr-values.js b/packages/eslint-plugin/lib/rules/no-restricted-attr-values.js index ce14613a..4b112d77 100644 --- a/packages/eslint-plugin/lib/rules/no-restricted-attr-values.js +++ b/packages/eslint-plugin/lib/rules/no-restricted-attr-values.js @@ -1,4 +1,9 @@ /** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").AttributeNode } AttributeNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode * @typedef {{attrPatterns: string[], attrValuePatterns: string[], message?: string}[]} Options */ @@ -9,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-restricted-attrs.js b/packages/eslint-plugin/lib/rules/no-restricted-attrs.js index 17e085ff..a5f4b298 100644 --- a/packages/eslint-plugin/lib/rules/no-restricted-attrs.js +++ b/packages/eslint-plugin/lib/rules/no-restricted-attrs.js @@ -1,4 +1,9 @@ /** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").AttributeNode } AttributeNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode * @typedef {{tagPatterns: string[], attrPatterns: string[], message?: string}[]} Options */ @@ -10,7 +15,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-script-style-type.js b/packages/eslint-plugin/lib/rules/no-script-style-type.js index d19099b5..2ad89d1e 100644 --- a/packages/eslint-plugin/lib/rules/no-script-style-type.js +++ b/packages/eslint-plugin/lib/rules/no-script-style-type.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").StyleTagNode } StyleTagNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-skip-heading-levels.js b/packages/eslint-plugin/lib/rules/no-skip-heading-levels.js index 6ef3dbe5..02fe4d67 100644 --- a/packages/eslint-plugin/lib/rules/no-skip-heading-levels.js +++ b/packages/eslint-plugin/lib/rules/no-skip-heading-levels.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-target-blank.js b/packages/eslint-plugin/lib/rules/no-target-blank.js index 8e988d74..c39d41a7 100644 --- a/packages/eslint-plugin/lib/rules/no-target-blank.js +++ b/packages/eslint-plugin/lib/rules/no-target-blank.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -6,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/no-trailing-spaces.js b/packages/eslint-plugin/lib/rules/no-trailing-spaces.js index 7d2fba0c..742233cd 100644 --- a/packages/eslint-plugin/lib/rules/no-trailing-spaces.js +++ b/packages/eslint-plugin/lib/rules/no-trailing-spaces.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +9,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/quotes.js b/packages/eslint-plugin/lib/rules/quotes.js index 4fb1ffc6..810aa8c9 100644 --- a/packages/eslint-plugin/lib/rules/quotes.js +++ b/packages/eslint-plugin/lib/rules/quotes.js @@ -1,3 +1,12 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").Range } Range + * @typedef { import("../types").AttributeNode } AttributeNode + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -13,7 +22,7 @@ const QUOTES_STYLES = { const QUOTES_CODES = [`"`, `'`]; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-attrs.js b/packages/eslint-plugin/lib/rules/require-attrs.js index fe947124..5b6e7c2c 100644 --- a/packages/eslint-plugin/lib/rules/require-attrs.js +++ b/packages/eslint-plugin/lib/rules/require-attrs.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").ScriptTagNode } ScriptTagNode + * @typedef { import("../types").StyleTagNode } StyleTagNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); @@ -7,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-button-type.js b/packages/eslint-plugin/lib/rules/require-button-type.js index d7f8e658..fa0ec5f3 100644 --- a/packages/eslint-plugin/lib/rules/require-button-type.js +++ b/packages/eslint-plugin/lib/rules/require-button-type.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -9,7 +13,7 @@ const MESSAGE_IDS = { const VALID_BUTTON_TYPES_SET = new Set(["submit", "button", "reset"]); /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-closing-tags.js b/packages/eslint-plugin/lib/rules/require-closing-tags.js index d1eefa83..3a2191fd 100644 --- a/packages/eslint-plugin/lib/rules/require-closing-tags.js +++ b/packages/eslint-plugin/lib/rules/require-closing-tags.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { RULE_CATEGORY, VOID_ELEMENTS } = require("../constants"); const VOID_ELEMENTS_SET = new Set(VOID_ELEMENTS); @@ -9,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-doctype.js b/packages/eslint-plugin/lib/rules/require-doctype.js index 4ead1305..9e5dd5e6 100644 --- a/packages/eslint-plugin/lib/rules/require-doctype.js +++ b/packages/eslint-plugin/lib/rules/require-doctype.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +9,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-frame-title.js b/packages/eslint-plugin/lib/rules/require-frame-title.js index 00d476c6..7493bac5 100644 --- a/packages/eslint-plugin/lib/rules/require-frame-title.js +++ b/packages/eslint-plugin/lib/rules/require-frame-title.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -7,7 +11,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-img-alt.js b/packages/eslint-plugin/lib/rules/require-img-alt.js index 81eea9e5..f6fd1b17 100644 --- a/packages/eslint-plugin/lib/rules/require-img-alt.js +++ b/packages/eslint-plugin/lib/rules/require-img-alt.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +10,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-lang.js b/packages/eslint-plugin/lib/rules/require-lang.js index 2d410c84..8864b2aa 100644 --- a/packages/eslint-plugin/lib/rules/require-lang.js +++ b/packages/eslint-plugin/lib/rules/require-lang.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { RULE_CATEGORY } = require("../constants"); const { findAttr } = require("./utils/node"); @@ -7,7 +11,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-li-container.js b/packages/eslint-plugin/lib/rules/require-li-container.js index 7649c6bf..c831e1cd 100644 --- a/packages/eslint-plugin/lib/rules/require-li-container.js +++ b/packages/eslint-plugin/lib/rules/require-li-container.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); @@ -8,7 +12,7 @@ const MESSAGE_IDS = { const VALID_CONTAINERS = ["ul", "ol", "menu"]; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-meta-charset.js b/packages/eslint-plugin/lib/rules/require-meta-charset.js index 9ae80d64..d28c84e6 100644 --- a/packages/eslint-plugin/lib/rules/require-meta-charset.js +++ b/packages/eslint-plugin/lib/rules/require-meta-charset.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); const { find } = require("./utils/array"); @@ -9,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @param {ChildType} node + * @param { import("../types").ChildType} node * @returns {node is TagNode} */ function isMetaCharset(node) { @@ -21,7 +26,7 @@ function isMetaCharset(node) { } /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-meta-description.js b/packages/eslint-plugin/lib/rules/require-meta-description.js index 44796dff..b6578486 100644 --- a/packages/eslint-plugin/lib/rules/require-meta-description.js +++ b/packages/eslint-plugin/lib/rules/require-meta-description.js @@ -1,3 +1,7 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); const { filter } = require("./utils/array"); @@ -9,7 +13,7 @@ const MESSAGE_IDS = { }; /** - * @param {ChildType} node + * @param {import("../types").ChildType} node * @returns {node is TagNode} */ function isMetaTagNode(node) { @@ -17,7 +21,7 @@ function isMetaTagNode(node) { } /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-meta-viewport.js b/packages/eslint-plugin/lib/rules/require-meta-viewport.js index ef7f21a7..cf9f37b3 100644 --- a/packages/eslint-plugin/lib/rules/require-meta-viewport.js +++ b/packages/eslint-plugin/lib/rules/require-meta-viewport.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); const { find } = require("./utils/array"); @@ -9,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @param {ChildType} node + * @param {import("../types").ChildType} node * @returns {node is TagNode} */ function isMetaViewport(node) { @@ -25,7 +30,7 @@ function isMetaViewport(node) { } /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/require-open-graph-protocol.js b/packages/eslint-plugin/lib/rules/require-open-graph-protocol.js index eff5b094..47e5cf5f 100644 --- a/packages/eslint-plugin/lib/rules/require-open-graph-protocol.js +++ b/packages/eslint-plugin/lib/rules/require-open-graph-protocol.js @@ -1,3 +1,8 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); const { filter } = require("./utils/array"); @@ -27,7 +32,7 @@ function normalize(properties) { } /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { @@ -65,7 +70,7 @@ module.exports = { ); /** - * @param {ChildType} node + * @param {import("../types").ChildType} node * @returns {node is TagNode} */ function isOgpMeta(node) { diff --git a/packages/eslint-plugin/lib/rules/require-title.js b/packages/eslint-plugin/lib/rules/require-title.js index 78d2df24..3df6326b 100644 --- a/packages/eslint-plugin/lib/rules/require-title.js +++ b/packages/eslint-plugin/lib/rules/require-title.js @@ -1,3 +1,9 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").TagNode } TagNode + * @typedef { import("../types").TextNode } TextNode + */ + const { NODE_TYPES } = require("@html-eslint/parser"); const { RULE_CATEGORY } = require("../constants"); const { find } = require("./utils/array"); @@ -8,7 +14,7 @@ const MESSAGE_IDS = { }; /** - * @param {ChildType} node + * @param {import("../types").ChildType} node * @returns {node is TagNode} */ function isTitle(node) { @@ -16,7 +22,7 @@ function isTitle(node) { } /** - * @param {ChildType} node + * @param {import("../types").ChildType} node * @returns {node is TextNode} */ function isNonEmptyText(node) { @@ -24,7 +30,7 @@ function isNonEmptyText(node) { } /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/sort-attrs.js b/packages/eslint-plugin/lib/rules/sort-attrs.js index 4ecc0119..3f403c61 100644 --- a/packages/eslint-plugin/lib/rules/sort-attrs.js +++ b/packages/eslint-plugin/lib/rules/sort-attrs.js @@ -1,3 +1,10 @@ +/** + * @typedef { import("../types").RuleModule } RuleModule + * @typedef { import("../types").AttributeNode } AttributeNode + * @typedef { import("../types").TextNode } TextNode + * @typedef { import("../types").RuleFixer } RuleFixer + */ + const { RULE_CATEGORY } = require("../constants"); const MESSAGE_IDS = { @@ -5,7 +12,7 @@ const MESSAGE_IDS = { }; /** - * @type {Rule} + * @type {RuleModule} */ module.exports = { meta: { diff --git a/packages/eslint-plugin/lib/rules/utils/node.js b/packages/eslint-plugin/lib/rules/utils/node.js index 4f38d62d..2c65a894 100644 --- a/packages/eslint-plugin/lib/rules/utils/node.js +++ b/packages/eslint-plugin/lib/rules/utils/node.js @@ -1,3 +1,16 @@ +/** + * @typedef { import("../../types").TagNode } TagNode + * @typedef { import("../../types").ScriptTagNode } ScriptTagNode + * @typedef { import("../../types").StyleTagNode } StyleTagNode + * @typedef { import("../../types").AttributeNode } AttributeNode + * @typedef { import("../../types").AnyNode } AnyNode + * @typedef { import("../../types").TextNode } TextNode + * @typedef { import("../../types").CommentContentNode } CommentContentNode + * @typedef { import("../../types").LineNode } LineNode + * @typedef { import("../../types").BaseNode } BaseNode + * @typedef { import("../../types").Location } Location + */ + module.exports = { /** * @param {TagNode | ScriptTagNode | StyleTagNode} node diff --git a/packages/eslint-plugin/lib/types.d.ts b/packages/eslint-plugin/lib/types.d.ts index 988db7b6..fd634026 100644 --- a/packages/eslint-plugin/lib/types.d.ts +++ b/packages/eslint-plugin/lib/types.d.ts @@ -2,269 +2,268 @@ import ESTree from "estree"; import ESLint from "eslint"; import * as ESHtml from "es-html-parser"; -declare global { - type Fix = ESLint.Rule.Fix; - type Token = ESLint.AST.Token; - - type AnyNode = ESHtml.AnyNode | LineNode; - - type Range = ESLint.AST.Range; - - type Location = ESLint.AST.SourceLocation; - - interface BaseNode { - range: [number, number]; - loc: { - start: ESTree.Position; - end: ESTree.Position; - }; - } - - interface ProgramNode extends Omit { - type: "Program"; - body: ESHtml.DocumentNode["children"]; - } - - interface AttributeKeyNode extends ESHtml.AttributeKeyNode { - parent: AttributeNode; - } - - interface TextNode extends ESHtml.TextNode { - parent: TagNode; - } - - interface TagNode extends ESHtml.TagNode { - attributes: AttributeNode[]; - parent: TagNode | ProgramNode; - openStart: OpenTagStartNode; - openEnd: OpenTagEndNode; - close: CloseTagNode; - children: Array< - TextNode | TagNode | ScriptTagNode | StyleTagNode | CommentNode - >; - } - - interface OpenTagStartNode extends ESHtml.OpenTagStartNode { - parent: TagNode; - } - - interface OpenTagEndNode extends ESHtml.OpenTagEndNode { - parent: TagNode; - } - - interface CloseTagNode extends ESHtml.CloseTagNode { - parent: TagNode; - } - - interface AttributeNode extends ESHtml.AttributeNode { - key: AttributeKeyNode; - value?: AttributeValueNode; - parent: TagNode | StyleTagNode | ScriptTagNode; - } - - interface AttributeValueNode extends ESHtml.AttributeValueNode { - parent: AttributeNode; - } - - interface AttributeValueWrapperEndNode - extends ESHtml.AttributeValueWrapperEndNode { - parent: AttributeNode; - } - - interface AttributeValueWrapperStartNode - extends ESHtml.AttributeValueWrapperStartNode { - parent: AttributeNode; - } - - interface ScriptTagNode extends ESHtml.ScriptTagNode { - attributes: AttributeNode[]; - parent: ProgramNode | TagNode; - openStart: OpenScriptTagStartNode; - openEnd: OpenScriptTagEndNode; - } - - interface OpenScriptTagStartNode extends ESHtml.OpenScriptTagStartNode { - parent: ScriptTagNode; - } - - interface CloseScriptTagNode extends ESHtml.CloseScriptTagNode { - parent: ScriptTagNode; - } - - interface OpenScriptTagEndNode extends ESHtml.OpenScriptTagEndNode { - parent: ScriptTagNode; - } - - interface ScriptTagContentNode extends ESHtml.ScriptTagContentNode { - parent: ScriptTagNode; - } - - interface StyleTagNode extends ESHtml.StyleTagNode { - attributes: AttributeNode[]; - parent: TagNode | ProgramNode; - openStart: OpenStyleTagStartNode; - openEnd: OpenStyleTagEndNode; - } - - interface OpenStyleTagStartNode extends ESHtml.OpenStyleTagStartNode { - parent: StyleTagNode; - } - - interface OpenStyleTagEndNode extends ESHtml.OpenStyleTagEndNode { - parent: StyleTagNode; - } - - interface StyleTagContentNode extends ESHtml.StyleTagContentNode { - parent: StyleTagNode; - } - - interface CloseStyleTagNode extends ESHtml.CloseStyleTagNode { - parent: StyleTagNode; - } - - interface CommentNode extends ESHtml.CommentNode { - parent: ProgramNode | TagNode; - } - - interface CommentOpenNode extends ESHtml.CommentOpenNode { - parent: CommentNode; - } - - interface CommentCloseNode extends ESHtml.CommentCloseNode { - parent: CommentNode; - } - - interface CommentContentNode extends ESHtml.CommentContentNode { - parent: CommentNode; - } - - interface DoctypeNode extends ESHtml.DoctypeNode { - parent: ProgramNode; - } - - interface DoctypeOpenNode extends ESHtml.DoctypeOpenNode { - parent: DoctypeNode; - } - - interface DoctypeCloseNode extends ESHtml.DoctypeCloseNode { - parent: DoctypeNode; - } - - interface DoctypeAttributeNode extends ESHtml.DoctypeAttributeNode { - parent: DoctypeNode; - } - - interface DoctypeAttributeValueNode extends ESHtml.DoctypeAttributeValueNode { - parent: DoctypeNode; - } - - interface DoctypeAttributeWrapperStart - extends ESHtml.DoctypeAttributeWrapperStartNode { - parent: DoctypeNode; - } - - interface DoctypeAttributeWrapperEnd - extends ESHtml.DoctypeAttributeWrapperEndNode { - parent: DoctypeNode; - } - - interface LineNode extends BaseNode { - type: "Line"; - value: string; - } - - interface RuleListener { - Program?: (node: ProgramNode) => void; - AttributeKey?: (node: AttributeKeyNode) => void; - Text?: (node: TextNode) => void; - Tag?: (node: TagNode) => void; - OpenTagStart?: (node: OpenTagStartNode) => void; - OpenTagEnd?: (node: OpenTagEndNode) => void; - CloseTag?: (node: CloseTagNode) => void; - Attribute?: (node: AttributeNode) => void; - AttributeValue?: (node: AttributeValueNode) => void; - AttributeValueWrapperEnd?: (node: AttributeValueWrapperEndNode) => void; - AttributeValueWrapperStart?: (node: AttributeValueWrapperStartNode) => void; - ScriptTag?: (node: ScriptTagNode) => void; - OpenScriptTagStart?: (node: OpenScriptTagStartNode) => void; - CloseScriptTag?: (node: CloseScriptTagNode) => void; - OpenScriptTagEnd?: (node: OpenScriptTagEndNode) => void; - ScriptTagContent?: (node: ScriptTagContentNode) => void; - StyleTag?: (node: StyleTagNode) => void; - OpenStyleTagStart?: (node: OpenStyleTagStartNode) => void; - OpenStyleTagEnd?: (node: OpenStyleTagEndNode) => void; - StyleTagContent?: (node: StyleTagContentNode) => void; - CloseStyleTag?: (node: CloseStyleTagNode) => void; - Comment?: (node: CommentNode) => void; - CommentOpen?: (node: CommentOpenNode) => void; - CommentClose?: (node: CommentCloseNode) => void; - CommentContent?: (node: CommentContentNode) => void; - Doctype?: (node: DoctypeNode) => void; - DoctypeOpen: (node: DoctypeOpenNode) => void; - DoctypeClose?: (node: DoctypeCloseNode) => void; - DoctypeAttribute?: (node: DoctypeAttributeNode) => void; - DoctypeAttributeValue?: (node: DoctypeAttributeValueNode) => void; - DoctypeAttributeWrapperStart?: (node: DoctypeAttributeWrapperStart) => void; - DoctypeAttributeWrapperEnd?: (node: DoctypeAttributeWrapperEnd) => void; - } - - interface Rule { - create(context: Context): RuleListener; - meta?: ESLint.Rule.RuleMetaData; - } - - interface RuleFixer { - insertTextAfter(nodeOrToken: BaseNode | Token, text: string): Fix; - - insertTextAfterRange(range: Range, text: string): Fix; - - insertTextBefore(nodeOrToken: BaseNode | Token, text: string): Fix; - - insertTextBeforeRange(range: Range, text: string): Fix; - - remove(nodeOrToken: BaseNode | Token): Fix; - - removeRange(range: Range): Fix; - - replaceText(nodeOrToken: BaseNode | Token, text: string): Fix; - - replaceTextRange(range: Range, text: string): Fix; - } - - interface ReportDescriptorOptionsBase { - data?: { [key: string]: string }; - - fix?: - | null - | ((fixer: RuleFixer) => null | Fix | IterableIterator | Fix[]); - } - - type SuggestionDescriptorMessage = { desc: string } | { messageId: string }; - type SuggestionReportDescriptor = SuggestionDescriptorMessage & - ReportDescriptorOptionsBase; - - interface ReportDescriptorOptions extends ReportDescriptorOptionsBase { - suggest?: SuggestionReportDescriptor[] | null; - } - - type ReportDescriptor = ReportDescriptorMessage & - ReportDescriptorLocation & - ReportDescriptorOptions; - type ReportDescriptorMessage = { message: string } | { messageId: string }; - type ReportDescriptorLocation = { - node?: BaseNode; - loc?: ESLint.AST.SourceLocation; - line?: number; - column?: number; +type Fix = ESLint.Rule.Fix; +type Token = ESLint.AST.Token; + +type AnyNode = ESHtml.AnyNode | LineNode; + +export type Range = ESLint.AST.Range; + +type Location = ESLint.AST.SourceLocation; + +export interface BaseNode { + range: [number, number]; + loc: { + start: ESTree.Position; + end: ESTree.Position; }; +} + +export interface ProgramNode + extends Omit { + type: "Program"; + body: ESHtml.DocumentNode["children"]; +} + +interface AttributeKeyNode extends ESHtml.AttributeKeyNode { + parent: AttributeNode; +} + +interface TextNode extends ESHtml.TextNode { + parent: TagNode; +} + +export interface TagNode extends ESHtml.TagNode { + attributes: AttributeNode[]; + parent: TagNode | ProgramNode; + openStart: OpenTagStartNode; + openEnd: OpenTagEndNode; + close: CloseTagNode; + children: Array< + TextNode | TagNode | ScriptTagNode | StyleTagNode | CommentNode + >; +} + +interface OpenTagStartNode extends ESHtml.OpenTagStartNode { + parent: TagNode; +} + +interface OpenTagEndNode extends ESHtml.OpenTagEndNode { + parent: TagNode; +} + +interface CloseTagNode extends ESHtml.CloseTagNode { + parent: TagNode; +} + +interface AttributeNode extends ESHtml.AttributeNode { + key: AttributeKeyNode; + value?: AttributeValueNode; + parent: TagNode | StyleTagNode | ScriptTagNode; +} + +interface AttributeValueNode extends ESHtml.AttributeValueNode { + parent: AttributeNode; +} + +interface AttributeValueWrapperEndNode + extends ESHtml.AttributeValueWrapperEndNode { + parent: AttributeNode; +} + +interface AttributeValueWrapperStartNode + extends ESHtml.AttributeValueWrapperStartNode { + parent: AttributeNode; +} + +export interface ScriptTagNode extends ESHtml.ScriptTagNode { + attributes: AttributeNode[]; + parent: ProgramNode | TagNode; + openStart: OpenScriptTagStartNode; + openEnd: OpenScriptTagEndNode; +} + +interface OpenScriptTagStartNode extends ESHtml.OpenScriptTagStartNode { + parent: ScriptTagNode; +} + +interface CloseScriptTagNode extends ESHtml.CloseScriptTagNode { + parent: ScriptTagNode; +} + +interface OpenScriptTagEndNode extends ESHtml.OpenScriptTagEndNode { + parent: ScriptTagNode; +} + +interface ScriptTagContentNode extends ESHtml.ScriptTagContentNode { + parent: ScriptTagNode; +} + +export interface StyleTagNode extends ESHtml.StyleTagNode { + attributes: AttributeNode[]; + parent: TagNode | ProgramNode; + openStart: OpenStyleTagStartNode; + openEnd: OpenStyleTagEndNode; +} + +interface OpenStyleTagStartNode extends ESHtml.OpenStyleTagStartNode { + parent: StyleTagNode; +} + +interface OpenStyleTagEndNode extends ESHtml.OpenStyleTagEndNode { + parent: StyleTagNode; +} + +interface StyleTagContentNode extends ESHtml.StyleTagContentNode { + parent: StyleTagNode; +} - interface Context extends Omit { - report(descriptor: ReportDescriptor): void; - } +interface CloseStyleTagNode extends ESHtml.CloseStyleTagNode { + parent: StyleTagNode; +} + +interface CommentNode extends ESHtml.CommentNode { + parent: ProgramNode | TagNode; +} + +interface CommentOpenNode extends ESHtml.CommentOpenNode { + parent: CommentNode; +} + +interface CommentCloseNode extends ESHtml.CommentCloseNode { + parent: CommentNode; +} + +interface CommentContentNode extends ESHtml.CommentContentNode { + parent: CommentNode; +} + +interface DoctypeNode extends ESHtml.DoctypeNode { + parent: ProgramNode; +} + +interface DoctypeOpenNode extends ESHtml.DoctypeOpenNode { + parent: DoctypeNode; +} + +interface DoctypeCloseNode extends ESHtml.DoctypeCloseNode { + parent: DoctypeNode; +} + +interface DoctypeAttributeNode extends ESHtml.DoctypeAttributeNode { + parent: DoctypeNode; +} + +interface DoctypeAttributeValueNode extends ESHtml.DoctypeAttributeValueNode { + parent: DoctypeNode; +} + +interface DoctypeAttributeWrapperStart + extends ESHtml.DoctypeAttributeWrapperStartNode { + parent: DoctypeNode; +} + +interface DoctypeAttributeWrapperEnd + extends ESHtml.DoctypeAttributeWrapperEndNode { + parent: DoctypeNode; +} - type ChildType = T extends ProgramNode - ? T["body"][number] - : T extends TagNode - ? T["children"][number] - : never; +interface LineNode extends BaseNode { + type: "Line"; + value: string; } + +interface RuleListener { + Program?: (node: ProgramNode) => void; + AttributeKey?: (node: AttributeKeyNode) => void; + Text?: (node: TextNode) => void; + Tag?: (node: TagNode) => void; + OpenTagStart?: (node: OpenTagStartNode) => void; + OpenTagEnd?: (node: OpenTagEndNode) => void; + CloseTag?: (node: CloseTagNode) => void; + Attribute?: (node: AttributeNode) => void; + AttributeValue?: (node: AttributeValueNode) => void; + AttributeValueWrapperEnd?: (node: AttributeValueWrapperEndNode) => void; + AttributeValueWrapperStart?: (node: AttributeValueWrapperStartNode) => void; + ScriptTag?: (node: ScriptTagNode) => void; + OpenScriptTagStart?: (node: OpenScriptTagStartNode) => void; + CloseScriptTag?: (node: CloseScriptTagNode) => void; + OpenScriptTagEnd?: (node: OpenScriptTagEndNode) => void; + ScriptTagContent?: (node: ScriptTagContentNode) => void; + StyleTag?: (node: StyleTagNode) => void; + OpenStyleTagStart?: (node: OpenStyleTagStartNode) => void; + OpenStyleTagEnd?: (node: OpenStyleTagEndNode) => void; + StyleTagContent?: (node: StyleTagContentNode) => void; + CloseStyleTag?: (node: CloseStyleTagNode) => void; + Comment?: (node: CommentNode) => void; + CommentOpen?: (node: CommentOpenNode) => void; + CommentClose?: (node: CommentCloseNode) => void; + CommentContent?: (node: CommentContentNode) => void; + Doctype?: (node: DoctypeNode) => void; + DoctypeOpen: (node: DoctypeOpenNode) => void; + DoctypeClose?: (node: DoctypeCloseNode) => void; + DoctypeAttribute?: (node: DoctypeAttributeNode) => void; + DoctypeAttributeValue?: (node: DoctypeAttributeValueNode) => void; + DoctypeAttributeWrapperStart?: (node: DoctypeAttributeWrapperStart) => void; + DoctypeAttributeWrapperEnd?: (node: DoctypeAttributeWrapperEnd) => void; +} + +export interface RuleModule extends ESLint.Rule.RuleModule { + create(context: Context): RuleListener; + meta?: ESLint.Rule.RuleMetaData; +} + +export interface RuleFixer { + insertTextAfter(nodeOrToken: BaseNode | Token, text: string): Fix; + + insertTextAfterRange(range: Range, text: string): Fix; + + insertTextBefore(nodeOrToken: BaseNode | Token, text: string): Fix; + + insertTextBeforeRange(range: Range, text: string): Fix; + + remove(nodeOrToken: BaseNode | Token): Fix; + + removeRange(range: Range): Fix; + + replaceText(nodeOrToken: BaseNode | Token, text: string): Fix; + + replaceTextRange(range: Range, text: string): Fix; +} + +interface ReportDescriptorOptionsBase { + data?: { [key: string]: string }; + + fix?: + | null + | ((fixer: RuleFixer) => null | Fix | IterableIterator | Fix[]); +} + +type SuggestionDescriptorMessage = { desc: string } | { messageId: string }; +type SuggestionReportDescriptor = SuggestionDescriptorMessage & + ReportDescriptorOptionsBase; + +interface ReportDescriptorOptions extends ReportDescriptorOptionsBase { + suggest?: SuggestionReportDescriptor[] | null; +} + +type ReportDescriptor = ReportDescriptorMessage & + ReportDescriptorLocation & + ReportDescriptorOptions; +type ReportDescriptorMessage = { message: string } | { messageId: string }; +type ReportDescriptorLocation = { + node?: BaseNode; + loc?: ESLint.AST.SourceLocation; + line?: number; + column?: number; +}; + +interface Context extends Omit { + report(descriptor: ReportDescriptor): void; +} + +export type ChildType = T extends ProgramNode + ? T["body"][number] + : T extends TagNode + ? T["children"][number] + : never; diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 65853068..6e0e6994 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -6,12 +6,15 @@ "homepage": "https://github.com/yeonjuan/html-eslint#readme", "license": "MIT", "main": "lib/index.js", + "types": "types/index.d.ts", "directories": { "lib": "lib", - "test": "__tests__" + "test": "__tests__", + "types": "types" }, "files": [ - "lib" + "lib", + "types" ], "publishConfig": { "access": "public" @@ -23,7 +26,8 @@ "scripts": { "test": "jest --coverage", "ts": "tsc", - "lint": "eslint . --ext .js" + "lint": "eslint . --ext .js", + "build": "tsc -p ./tsconfig.build.json" }, "bugs": { "url": "https://github.com/yeonjuan/html-eslint/issues" diff --git a/packages/eslint-plugin/tsconfig.build.json b/packages/eslint-plugin/tsconfig.build.json new file mode 100644 index 00000000..9a3bb7c3 --- /dev/null +++ b/packages/eslint-plugin/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "include": ["lib/**/*.js"], + "compilerOptions": { + "allowJs": true, + "composite": true, + "outDir": "./types", + "rootDir": "lib", + "resolveJsonModule": true, + "declaration": true, + "noEmit": false, + "emitDeclarationOnly": true, + "types": ["node", "jest"] + } +}