eslint-plugin-mocha
Version:
Eslint rules for mocha.
63 lines • 2.56 kB
JavaScript
import { getStringIfConstant } from '@eslint-community/eslint-utils';
import { createMochaVisitors } from '../ast/mocha-visitors.js';
import { isCallExpression } from '../ast/node-types.js';
import { isRecord } from '../record.js';
function objectOptions(options) {
const { pattern: stringPattern, message } = isRecord(options) ? options : {};
const pattern = new RegExp(typeof stringPattern === 'string' ? stringPattern : '', 'u');
return { pattern, message: typeof message === 'string' ? message : undefined };
}
const patternSchema = {
type: 'string'
};
const messageSchema = {
type: 'string'
};
export const validSuiteTitleRule = {
meta: {
type: 'suggestion',
docs: {
description: 'Require suite descriptions to match a pre-configured regular expression',
url: 'https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/valid-suite-title.md'
},
schema: [
{
type: 'object',
properties: {
pattern: patternSchema,
message: messageSchema
},
additionalProperties: false
}
]
},
create(context) {
const options = context.options[0];
const { pattern, message } = objectOptions(options);
function hasValidSuiteDescription(mochaCallExpression) {
const args = mochaCallExpression.arguments;
const descriptionArgument = args[0];
if (descriptionArgument !== undefined) {
const description = getStringIfConstant(descriptionArgument, context.sourceCode.getScope(mochaCallExpression));
if (description !== null) {
return pattern.test(description);
}
}
return true;
}
function hasValidOrNoSuiteDescription(mochaCallExpression) {
const args = mochaCallExpression.arguments;
const hasNoSuiteDescription = args.length === 0;
return hasNoSuiteDescription || hasValidSuiteDescription(mochaCallExpression);
}
return createMochaVisitors(context, {
suite(visitorContext) {
const { node, name } = visitorContext;
if (isCallExpression(node) && !hasValidOrNoSuiteDescription(node)) {
context.report({ node, message: message ?? `Invalid "${name}" description found.` });
}
}
});
}
};
//# sourceMappingURL=valid-suite-title.js.map