line_push/node_modules/eslint-template-visitor
2022-07-17 13:16:16 +08:00
..
examples/prefer-string-slice add file 2022-07-17 13:16:16 +08:00
lib add file 2022-07-17 13:16:16 +08:00
test add file 2022-07-17 13:16:16 +08:00
.editorconfig add file 2022-07-17 13:16:16 +08:00
.travis.yml add file 2022-07-17 13:16:16 +08:00
index.js add file 2022-07-17 13:16:16 +08:00
package.json add file 2022-07-17 13:16:16 +08:00
README.md add file 2022-07-17 13:16:16 +08:00

ESLint Template Visitor

Build Status Coverage Status

Simplify eslint rules by visiting templates

Install

npm install eslint-template-visitor

# or

yarn add eslint-template-visitor

Showcase

+const eslintTemplateVisitor = require('eslint-template-visitor');
+
+const templates = eslintTemplateVisitor();
+
+const objectVariable = templates.variable();
+const argumentsVariable = templates.spreadVariable();
+
+const substrCallTemplate = templates.template`${objectVariable}.substr(${argumentsVariable})`;

 const create = context => {
 	const sourceCode = context.getSourceCode();

-	return {
-		CallExpression(node) {
-			if (node.callee.type !== 'MemberExpression'
-				|| node.callee.property.type !== 'Identifier'
-				|| node.callee.property.name !== 'substr'
-			) {
-				return;
-			}
-
-			const objectNode = node.callee.object;
+	return templates.visitor({
+		[substrCallTemplate](node) {
+			const objectNode = substrCallTemplate.context.getMatch(objectVariable);
+			const argumentNodes = substrCallTemplate.context.getMatch(argumentsVariable);

 			const problem = {
 				node,
 				message: 'Prefer `String#slice()` over `String#substr()`.',
 			};

-			const canFix = node.arguments.length === 0;
+			const canFix = argumentNodes.length === 0;

 			if (canFix) {
 				problem.fix = fixer => fixer.replaceText(node, sourceCode.getText(objectNode) + '.slice()');
 			}

 			context.report(problem);
 		},
-	};
+	});
 };

See examples for more.

API

eslintTemplateVisitor(options?)

Craete a template visitor.

Example:

const eslintTemplateVisitor = require('eslint-template-visitor');

const templates = eslintTemplateVisitor();

options

Type: object

parserOptions

Options for the template parser. Passed down to espree.

Example:

const templates = eslintTemplateVisitor({
	parserOptions: {
		ecmaVersion: 2018,
	},
});

templates.variable()

Create a variable to be used in a template. Such a variable can match exactly one AST node.

templates.spreadVariable()

Create a spread variable. Spread variable can match an array of AST nodes.

This is useful for matching a number of arguments in a call or a number of statements in a block.

templates.template tag

Creates a template possibly containing variables.

Example:

const objectVariable = templates.variable();
const argumentsVariable = templates.spreadVariable();

const substrCallTemplate = templates.template`${objectVariable}.substr(${argumentsVariable})`;

const create = () => templates.visitor({
	[substrCallTemplate](node) {
		// `node` here is the matching `.substr` call (i.e. `CallExpression`)
	}
});

templates.visitor({ /* visitors */ })

Used to merge template visitors with common ESLint visitors.

Example:

const create = () => templates.visitor({
	[substrCallTemplate](node) {
		// Template visitor
	},

	FunctionDeclaration(node) {
		// Simple node type visitor
	},

	'IfStatement > BlockStatement'(node) {
		// ESLint selector visitor
	},
});

template.context

A template match context. This property is defined only within a visitor call (in other words, only when working on a matching node).

Example:

const create = () => templates.visitor({
	[substrCallTemplate](node) {
		// `substrCallTemplate.context` can be used here
	},

	FunctionDeclaration(node) {
		// `substrCallTemplate.context` is not defined here, and it does not make sense to use it here,
		// since we `substrCallTemplate` did not match an AST node.
	},
});

template.context.getMatch(variable)

Used to get a match for a variable.

Example:

const objectVariable = templates.variable();
const argumentsVariable = templates.spreadVariable();

const substrCallTemplate = templates.template`${objectVariable}.substr(${argumentsVariable})`;

const create = () => templates.visitor({
	[substrCallTemplate](node) {
		const objectNode = substrCallTemplate.context.getMatch(objectVariable);

		// For example, let's check if `objectNode` is an `Identifier`: `objectNode.type === 'Identifier'`

		const argumentNodes = substrCallTemplate.context.getMatch(argumentsVariable);

		// `Array.isArray(argumentNodes) === true`
	},
});