diff --git a/packages/eslint-plugin-template/package.json b/packages/eslint-plugin-template/package.json index aac52ac35..8e9103e4d 100644 --- a/packages/eslint-plugin-template/package.json +++ b/packages/eslint-plugin-template/package.json @@ -18,13 +18,13 @@ ], "dependencies": { "@angular-eslint/bundled-angular-compiler": "14.3.0", + "@angular-eslint/utils": "14.3.0", "@typescript-eslint/type-utils": "5.43.0", "@typescript-eslint/utils": "5.43.0", "aria-query": "5.1.3", "axobject-query": "3.1.1" }, "devDependencies": { - "@angular-eslint/utils": "14.3.0", "@types/aria-query": "5.0.1" }, "peerDependencies": { diff --git a/packages/eslint-plugin-template/src/rules/accessibility-alt-text.ts b/packages/eslint-plugin-template/src/rules/accessibility-alt-text.ts index 9d48e7cf4..c4c479537 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-alt-text.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-alt-text.ts @@ -2,10 +2,8 @@ import type { Node, TmplAstElement, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getAttributeValue } from '../utils/get-attribute-value'; type Options = []; diff --git a/packages/eslint-plugin-template/src/rules/accessibility-elements-content.ts b/packages/eslint-plugin-template/src/rules/accessibility-elements-content.ts index 7812ffd99..29fd9262a 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-elements-content.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-elements-content.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { isHiddenFromScreenReader } from '../utils/is-hidden-from-screen-reader'; type Options = [ diff --git a/packages/eslint-plugin-template/src/rules/accessibility-interactive-supports-focus.ts b/packages/eslint-plugin-template/src/rules/accessibility-interactive-supports-focus.ts index 58733c572..60713e045 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-interactive-supports-focus.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-interactive-supports-focus.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { isHiddenFromScreenReader } from '../utils/is-hidden-from-screen-reader'; import { diff --git a/packages/eslint-plugin-template/src/rules/accessibility-label-for.ts b/packages/eslint-plugin-template/src/rules/accessibility-label-for.ts index b4f4faaeb..43c63f51c 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-label-for.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-label-for.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { isChildNodeOf } from '../utils/is-child-node-of'; type Options = [ diff --git a/packages/eslint-plugin-template/src/rules/accessibility-label-has-associated-control.ts b/packages/eslint-plugin-template/src/rules/accessibility-label-has-associated-control.ts index 1ee694ba5..c320698a5 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-label-has-associated-control.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-label-has-associated-control.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { isChildNodeOf } from '../utils/is-child-node-of'; type LabelComponent = { diff --git a/packages/eslint-plugin-template/src/rules/accessibility-role-has-required-aria.ts b/packages/eslint-plugin-template/src/rules/accessibility-role-has-required-aria.ts index d8969b580..e68165593 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-role-has-required-aria.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-role-has-required-aria.ts @@ -2,12 +2,10 @@ import type { TmplAstTextAttribute, TmplAstElement, } from '@angular-eslint/bundled-angular-compiler'; +import { getTemplateParserServices } from '@angular-eslint/utils'; import type { ARIARoleDefinitionKey } from 'aria-query'; import { roles } from 'aria-query'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; import { isSemanticRoleElement } from '../utils/is-semantic-role-element'; diff --git a/packages/eslint-plugin-template/src/rules/accessibility-table-scope.ts b/packages/eslint-plugin-template/src/rules/accessibility-table-scope.ts index 78602c28e..caf6007ab 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-table-scope.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-table-scope.ts @@ -2,10 +2,8 @@ import type { TmplAstBoundAttribute, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; diff --git a/packages/eslint-plugin-template/src/rules/accessibility-valid-aria.ts b/packages/eslint-plugin-template/src/rules/accessibility-valid-aria.ts index 5691bb8f3..c6d96521a 100644 --- a/packages/eslint-plugin-template/src/rules/accessibility-valid-aria.ts +++ b/packages/eslint-plugin-template/src/rules/accessibility-valid-aria.ts @@ -7,12 +7,10 @@ import { TmplAstBoundAttribute, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; +import { getTemplateParserServices } from '@angular-eslint/utils'; import type { ARIAProperty, ARIAPropertyDefinition } from 'aria-query'; import { aria } from 'aria-query'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; diff --git a/packages/eslint-plugin-template/src/rules/attributes-order.ts b/packages/eslint-plugin-template/src/rules/attributes-order.ts index d52b353f5..9920d315f 100644 --- a/packages/eslint-plugin-template/src/rules/attributes-order.ts +++ b/packages/eslint-plugin-template/src/rules/attributes-order.ts @@ -7,11 +7,9 @@ import type { TmplAstNode, } from '@angular-eslint/bundled-angular-compiler'; import { TmplAstTemplate } from '@angular-eslint/bundled-angular-compiler'; +import { getTemplateParserServices } from '@angular-eslint/utils'; import type { TSESTree } from '@typescript-eslint/utils'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; export const enum OrderType { TemplateReferenceVariable = 'TEMPLATE_REFERENCE', diff --git a/packages/eslint-plugin-template/src/rules/banana-in-box.ts b/packages/eslint-plugin-template/src/rules/banana-in-box.ts index 6b71abfa6..25b4829aa 100644 --- a/packages/eslint-plugin-template/src/rules/banana-in-box.ts +++ b/packages/eslint-plugin-template/src/rules/banana-in-box.ts @@ -1,8 +1,6 @@ import type { TmplAstBoundEvent } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = []; export type MessageIds = 'bananaInBox'; diff --git a/packages/eslint-plugin-template/src/rules/button-has-type.ts b/packages/eslint-plugin-template/src/rules/button-has-type.ts index e2cdbe780..93ca91f7b 100644 --- a/packages/eslint-plugin-template/src/rules/button-has-type.ts +++ b/packages/eslint-plugin-template/src/rules/button-has-type.ts @@ -6,10 +6,8 @@ import { ASTWithSource, LiteralPrimitive, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; export const RULE_NAME = 'button-has-type'; export const INVALID_TYPE_DATA_KEY = 'type'; diff --git a/packages/eslint-plugin-template/src/rules/click-events-have-key-events.ts b/packages/eslint-plugin-template/src/rules/click-events-have-key-events.ts index 17bf2f7c3..088a884d3 100644 --- a/packages/eslint-plugin-template/src/rules/click-events-have-key-events.ts +++ b/packages/eslint-plugin-template/src/rules/click-events-have-key-events.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { isHiddenFromScreenReader } from '../utils/is-hidden-from-screen-reader'; import { isInteractiveElement } from '../utils/is-interactive-element'; diff --git a/packages/eslint-plugin-template/src/rules/conditional-complexity.ts b/packages/eslint-plugin-template/src/rules/conditional-complexity.ts index 1af1aa1ce..63e47129b 100644 --- a/packages/eslint-plugin-template/src/rules/conditional-complexity.ts +++ b/packages/eslint-plugin-template/src/rules/conditional-complexity.ts @@ -11,10 +11,8 @@ import { Lexer, Parser, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - ensureTemplateParser, -} from '../utils/create-eslint-rule'; +import { ensureTemplateParser } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = [{ maxComplexity: number }]; export type MessageIds = 'conditionalComplexity'; diff --git a/packages/eslint-plugin-template/src/rules/cyclomatic-complexity.ts b/packages/eslint-plugin-template/src/rules/cyclomatic-complexity.ts index 4bf144794..da46f534a 100644 --- a/packages/eslint-plugin-template/src/rules/cyclomatic-complexity.ts +++ b/packages/eslint-plugin-template/src/rules/cyclomatic-complexity.ts @@ -2,10 +2,8 @@ import type { TmplAstBoundAttribute, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = [{ maxComplexity: number }]; export type MessageIds = 'cyclomaticComplexity'; diff --git a/packages/eslint-plugin-template/src/rules/eqeqeq.ts b/packages/eslint-plugin-template/src/rules/eqeqeq.ts index ba4d266e9..a8ec14f28 100644 --- a/packages/eslint-plugin-template/src/rules/eqeqeq.ts +++ b/packages/eslint-plugin-template/src/rules/eqeqeq.ts @@ -3,11 +3,9 @@ import { ASTWithSource, LiteralPrimitive, } from '@angular-eslint/bundled-angular-compiler'; +import { ensureTemplateParser } from '@angular-eslint/utils'; import type { TSESLint } from '@typescript-eslint/utils'; -import { - createESLintRule, - ensureTemplateParser, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getNearestNodeFrom } from '../utils/get-nearest-node-from'; type Options = [{ readonly allowNullOrUndefined?: boolean }]; diff --git a/packages/eslint-plugin-template/src/rules/i18n.ts b/packages/eslint-plugin-template/src/rules/i18n.ts index 8f4cabe95..42de4df3b 100644 --- a/packages/eslint-plugin-template/src/rules/i18n.ts +++ b/packages/eslint-plugin-template/src/rules/i18n.ts @@ -12,11 +12,9 @@ import { TmplAstElement, } from '@angular-eslint/bundled-angular-compiler'; import type { Message } from '@angular-eslint/bundled-angular-compiler'; +import { getTemplateParserServices } from '@angular-eslint/utils'; import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getNearestNodeFrom } from '../utils/get-nearest-node-from'; // source: https://github.com/yury-dymov/js-regex-pl/blob/ff10757b2a98ad0bf0f62acebad085bab3748fc4/src/index.js#L7 diff --git a/packages/eslint-plugin-template/src/rules/mouse-events-have-key-events.ts b/packages/eslint-plugin-template/src/rules/mouse-events-have-key-events.ts index a0c9791eb..ae19de90d 100644 --- a/packages/eslint-plugin-template/src/rules/mouse-events-have-key-events.ts +++ b/packages/eslint-plugin-template/src/rules/mouse-events-have-key-events.ts @@ -1,9 +1,7 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; +import { getTemplateParserServices } from '@angular-eslint/utils'; import type { TSESLint } from '@typescript-eslint/utils'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; diff --git a/packages/eslint-plugin-template/src/rules/no-any.ts b/packages/eslint-plugin-template/src/rules/no-any.ts index 1206f7a94..f5bbdab55 100644 --- a/packages/eslint-plugin-template/src/rules/no-any.ts +++ b/packages/eslint-plugin-template/src/rules/no-any.ts @@ -4,10 +4,8 @@ import { PropertyRead, ThisReceiver, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - ensureTemplateParser, -} from '../utils/create-eslint-rule'; +import { ensureTemplateParser } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = []; export type MessageIds = 'noAny' | 'suggestRemoveAny'; diff --git a/packages/eslint-plugin-template/src/rules/no-autofocus.ts b/packages/eslint-plugin-template/src/rules/no-autofocus.ts index cb792bdb1..0aef0bbf1 100644 --- a/packages/eslint-plugin-template/src/rules/no-autofocus.ts +++ b/packages/eslint-plugin-template/src/rules/no-autofocus.ts @@ -2,10 +2,8 @@ import type { TmplAstBoundAttribute, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; diff --git a/packages/eslint-plugin-template/src/rules/no-call-expression.ts b/packages/eslint-plugin-template/src/rules/no-call-expression.ts index f9f86b8cf..1910b76fe 100644 --- a/packages/eslint-plugin-template/src/rules/no-call-expression.ts +++ b/packages/eslint-plugin-template/src/rules/no-call-expression.ts @@ -1,9 +1,7 @@ import type { Call } from '@angular-eslint/bundled-angular-compiler'; import { TmplAstBoundEvent } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - ensureTemplateParser, -} from '../utils/create-eslint-rule'; +import { ensureTemplateParser } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getNearestNodeFrom } from '../utils/get-nearest-node-from'; type Options = []; diff --git a/packages/eslint-plugin-template/src/rules/no-distracting-elements.ts b/packages/eslint-plugin-template/src/rules/no-distracting-elements.ts index dbeeacde9..2dd0ee2a5 100644 --- a/packages/eslint-plugin-template/src/rules/no-distracting-elements.ts +++ b/packages/eslint-plugin-template/src/rules/no-distracting-elements.ts @@ -1,8 +1,6 @@ import type { TmplAstElement } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = []; export type MessageIds = 'noDistractingElements'; diff --git a/packages/eslint-plugin-template/src/rules/no-duplicate-attributes.ts b/packages/eslint-plugin-template/src/rules/no-duplicate-attributes.ts index d9bcdc9e7..71b6f5ed0 100644 --- a/packages/eslint-plugin-template/src/rules/no-duplicate-attributes.ts +++ b/packages/eslint-plugin-template/src/rules/no-duplicate-attributes.ts @@ -4,10 +4,8 @@ import type { TmplAstElement, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getOriginalAttributeName } from '../utils/get-original-attribute-name'; type Options = [ diff --git a/packages/eslint-plugin-template/src/rules/no-inline-styles.ts b/packages/eslint-plugin-template/src/rules/no-inline-styles.ts index e8f535792..cbe7958a7 100644 --- a/packages/eslint-plugin-template/src/rules/no-inline-styles.ts +++ b/packages/eslint-plugin-template/src/rules/no-inline-styles.ts @@ -2,10 +2,8 @@ import type { ParseSourceSpan, TmplAstElement, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = [ { diff --git a/packages/eslint-plugin-template/src/rules/no-negated-async.ts b/packages/eslint-plugin-template/src/rules/no-negated-async.ts index c6a33d29d..1769d2a23 100644 --- a/packages/eslint-plugin-template/src/rules/no-negated-async.ts +++ b/packages/eslint-plugin-template/src/rules/no-negated-async.ts @@ -2,10 +2,8 @@ import type { BindingPipe, PrefixNot, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - ensureTemplateParser, -} from '../utils/create-eslint-rule'; +import { ensureTemplateParser } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = []; export type MessageIds = diff --git a/packages/eslint-plugin-template/src/rules/no-positive-tabindex.ts b/packages/eslint-plugin-template/src/rules/no-positive-tabindex.ts index 67eda7329..4288029ca 100644 --- a/packages/eslint-plugin-template/src/rules/no-positive-tabindex.ts +++ b/packages/eslint-plugin-template/src/rules/no-positive-tabindex.ts @@ -3,10 +3,8 @@ import type { TmplAstBoundAttribute, TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; import { getDomElements } from '../utils/get-dom-elements'; import { toPattern } from '../utils/to-pattern'; diff --git a/packages/eslint-plugin-template/src/rules/use-track-by-function.ts b/packages/eslint-plugin-template/src/rules/use-track-by-function.ts index 50f42cac8..b9d38c232 100644 --- a/packages/eslint-plugin-template/src/rules/use-track-by-function.ts +++ b/packages/eslint-plugin-template/src/rules/use-track-by-function.ts @@ -3,10 +3,8 @@ import type { TmplAstTextAttribute, } from '@angular-eslint/bundled-angular-compiler'; import { TmplAstBoundAttribute } from '@angular-eslint/bundled-angular-compiler'; -import { - createESLintRule, - getTemplateParserServices, -} from '../utils/create-eslint-rule'; +import { getTemplateParserServices } from '@angular-eslint/utils'; +import { createESLintRule } from '../utils/create-eslint-rule'; type Options = []; export type MessageIds = 'useTrackByFunction'; diff --git a/packages/eslint-plugin-template/src/utils/create-eslint-rule.ts b/packages/eslint-plugin-template/src/utils/create-eslint-rule.ts index e475a3758..701286be1 100644 --- a/packages/eslint-plugin-template/src/utils/create-eslint-rule.ts +++ b/packages/eslint-plugin-template/src/utils/create-eslint-rule.ts @@ -1,15 +1,12 @@ -import type { - ParseSourceSpan, - TmplAstElement, -} from '@angular-eslint/bundled-angular-compiler'; -import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; import { ESLintUtils } from '@typescript-eslint/utils'; /** * We need to patch the RuleCreator in order to preserve the defaultOptions * to use as part of documentation generation. */ -const patchedRuleCreator: typeof ESLintUtils.RuleCreator = (urlCreator) => { +export const patchedRuleCreator: typeof ESLintUtils.RuleCreator = ( + urlCreator, +) => { return function createRule({ name, meta, defaultOptions, create }) { return { meta: Object.assign(Object.assign({}, meta), { @@ -35,43 +32,3 @@ export const createESLintRule = patchedRuleCreator( (ruleName) => `https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/${ruleName}.md`, ); - -interface ParserServices { - convertNodeSourceSpanToLoc: ( - sourceSpan: ParseSourceSpan, - ) => TSESTree.SourceLocation; - convertElementSourceSpanToLoc: ( - context: Readonly>, - node: TmplAstElement, - ) => TSESTree.SourceLocation; -} - -export function getTemplateParserServices( - context: Readonly>, -): ParserServices { - ensureTemplateParser(context); - return context.parserServices as unknown as ParserServices; -} - -/** - * Utility for rule authors to ensure that their rule is correctly being used with @angular-eslint/template-parser - * If @angular-eslint/template-parser is not the configured parser when the function is invoked it will throw - */ -export function ensureTemplateParser( - context: Readonly>, -): void { - if ( - !(context.parserServices as unknown as ParserServices) - ?.convertNodeSourceSpanToLoc || - !(context.parserServices as unknown as ParserServices) - ?.convertElementSourceSpanToLoc - ) { - /** - * The user needs to have configured "parser" in their eslint config and set it - * to @angular-eslint/template-parser - */ - throw new Error( - "You have used a rule which requires '@angular-eslint/template-parser' to be used as the 'parser' in your ESLint config.", - ); - } -} diff --git a/packages/utils/src/eslint-plugin-template/parser-services.ts b/packages/utils/src/eslint-plugin-template/parser-services.ts new file mode 100644 index 000000000..cb472083f --- /dev/null +++ b/packages/utils/src/eslint-plugin-template/parser-services.ts @@ -0,0 +1,45 @@ +import type { + ParseSourceSpan, + TmplAstElement, +} from '@angular-eslint/bundled-angular-compiler'; +import type { TSESLint, TSESTree } from '@typescript-eslint/utils'; + +export interface ParserServices { + convertNodeSourceSpanToLoc: ( + sourceSpan: ParseSourceSpan, + ) => TSESTree.SourceLocation; + convertElementSourceSpanToLoc: ( + context: Readonly>, + node: TmplAstElement, + ) => TSESTree.SourceLocation; +} + +export function getTemplateParserServices( + context: Readonly>, +): ParserServices { + ensureTemplateParser(context); + return context.parserServices as unknown as ParserServices; +} + +/** + * Utility for rule authors to ensure that their rule is correctly being used with @angular-eslint/template-parser + * If @angular-eslint/template-parser is not the configured parser when the function is invoked it will throw + */ +export function ensureTemplateParser( + context: Readonly>, +): void { + if ( + !(context.parserServices as unknown as ParserServices) + ?.convertNodeSourceSpanToLoc || + !(context.parserServices as unknown as ParserServices) + ?.convertElementSourceSpanToLoc + ) { + /** + * The user needs to have configured "parser" in their eslint config and set it + * to @angular-eslint/template-parser + */ + throw new Error( + "You have used a rule which requires '@angular-eslint/template-parser' to be used as the 'parser' in your ESLint config.", + ); + } +} diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 158a1c5be..d21c0c038 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -18,3 +18,9 @@ export * as ASTUtils from './eslint-plugin/ast-utils'; export * as RuleFixes from './eslint-plugin/rule-fixes'; export * as Selectors from './eslint-plugin/selectors'; export * as SelectorUtils from './eslint-plugin/selector-utils'; + +export type { ParserServices } from './eslint-plugin-template/parser-services'; +export { + ensureTemplateParser, + getTemplateParserServices, +} from './eslint-plugin-template/parser-services';