Skip to content

Commit

Permalink
feat(utils): export template parser services (#1211)
Browse files Browse the repository at this point in the history
  • Loading branch information
reduckted committed Nov 20, 2022
1 parent 0273649 commit 34a62d2
Show file tree
Hide file tree
Showing 30 changed files with 104 additions and 150 deletions.
2 changes: 1 addition & 1 deletion packages/eslint-plugin-template/package.json
Expand Up @@ -18,13 +18,13 @@
],
"dependencies": {
"@angular-eslint/bundled-angular-compiler": "14.3.1",
"@angular-eslint/utils": "14.3.1",
"@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.1",
"@types/aria-query": "5.0.1"
},
"peerDependencies": {
Expand Down
Expand Up @@ -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 = [];
Expand Down
@@ -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 = [
Expand Down
@@ -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 {
Expand Down
@@ -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 = [
Expand Down
@@ -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 = {
Expand Down
Expand Up @@ -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';
Expand Down
Expand Up @@ -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';

Expand Down
Expand Up @@ -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';

Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/attributes-order.ts
Expand Up @@ -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',
Expand Down
6 changes: 2 additions & 4 deletions 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';
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/button-has-type.ts
Expand Up @@ -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';
Expand Down
@@ -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';
Expand Down
Expand Up @@ -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';
Expand Down
Expand Up @@ -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';
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/eqeqeq.ts
Expand Up @@ -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 }];
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/i18n.ts
Expand Up @@ -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
Expand Down
@@ -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';

Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/no-any.ts
Expand Up @@ -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';
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/no-autofocus.ts
Expand Up @@ -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';

Expand Down
@@ -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 = [];
Expand Down
@@ -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';
Expand Down
Expand Up @@ -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 = [
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/no-inline-styles.ts
Expand Up @@ -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 = [
{
Expand Down
6 changes: 2 additions & 4 deletions packages/eslint-plugin-template/src/rules/no-negated-async.ts
Expand Up @@ -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 =
Expand Down
Expand Up @@ -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';

Expand Down
Expand Up @@ -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';
Expand Down
45 changes: 0 additions & 45 deletions packages/eslint-plugin-template/src/utils/create-eslint-rule.ts
@@ -1,8 +1,3 @@
import type {
ParseSourceSpan,
TmplAstElement,
} from '@angular-eslint/bundled-angular-compiler';
import type { TSESLint, TSESTree } from '@typescript-eslint/utils';
import { ESLintUtils } from '@typescript-eslint/utils';

/**
Expand Down Expand Up @@ -35,43 +30,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<TSESLint.RuleContext<string, readonly unknown[]>>,
node: TmplAstElement,
) => TSESTree.SourceLocation;
}

export function getTemplateParserServices(
context: Readonly<TSESLint.RuleContext<string, readonly unknown[]>>,
): 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<TSESLint.RuleContext<string, readonly unknown[]>>,
): 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.",
);
}
}

0 comments on commit 34a62d2

Please sign in to comment.