eslint-plugin-mocha
Version:
Eslint rules for mocha.
72 lines • 2.73 kB
JavaScript
import { createMochaVisitors } from "./ast/mocha-visitors.js";
import { isCallExpression } from "./ast/node-types.js";
import { getTitleDescription } from "./title-description.js";
import { getRuleOption } from "./rule-options.js";
const optionSchema = {
type: 'object',
properties: {
pattern: {
type: 'string'
},
message: {
type: 'string'
}
},
additionalProperties: false
};
function normalizeOptions(options) {
const { pattern: stringPattern, message } = options;
const pattern = new RegExp(stringPattern, 'u');
return { pattern, message };
}
function hasValidOrNoDescription(context, mochaCallExpression, pattern) {
const description = getTitleDescription(context.sourceCode, mochaCallExpression);
if (description.kind === 'missing' || description.kind === 'dynamic') {
return true;
}
return pattern.test(description.value);
}
function createTitlePatternRule(definition, createVisitors) {
const defaultOptions = [{ pattern: definition.defaultPattern }];
const messages = {
[definition.messageId]: 'Invalid "{{name}}" description found.'
};
return {
meta: {
type: 'suggestion',
languages: ['js/js'],
docs: {
description: definition.description,
url: `https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/documentation/rules/${definition.documentationFile}.md`
},
defaultOptions,
messages,
schema: [optionSchema]
},
create(context) {
const options = getRuleOption(context);
const { pattern, message } = normalizeOptions(options);
function checkTitle(visitorContext) {
const { node, name } = visitorContext;
if (!isCallExpression(node) || hasValidOrNoDescription(context, node, pattern)) {
return;
}
context.report(message === undefined
? { node, messageId: definition.messageId, data: { name } }
: { node, message });
}
return createVisitors(context, checkTitle);
}
};
}
export function createSuiteTitlePatternRule(definition) {
return createTitlePatternRule(definition, function (context, checkTitle) {
return createMochaVisitors(context, { suite: checkTitle });
});
}
export function createTestCaseTitlePatternRule(definition) {
return createTitlePatternRule(definition, function (context, checkTitle) {
return createMochaVisitors(context, { testCase: checkTitle });
});
}
//# sourceMappingURL=title-pattern-rule.js.map