consistent-data-testid.js 3.63 KB
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.RULE_NAME = void 0;
var utils_1 = require("../utils");
var experimental_utils_1 = require("@typescript-eslint/experimental-utils");
var node_utils_1 = require("../node-utils");
exports.RULE_NAME = 'consistent-data-testid';
var FILENAME_PLACEHOLDER = '{fileName}';
exports.default = experimental_utils_1.ESLintUtils.RuleCreator(utils_1.getDocsUrl)({
    name: exports.RULE_NAME,
    meta: {
        type: 'suggestion',
        docs: {
            description: 'Ensures consistent usage of `data-testid`',
            category: 'Best Practices',
            recommended: false,
        },
        messages: {
            invalidTestId: '`{{attr}}` "{{value}}" should match `{{regex}}`',
        },
        fixable: null,
        schema: [
            {
                type: 'object',
                default: {},
                additionalProperties: false,
                required: ['testIdPattern'],
                properties: {
                    testIdPattern: {
                        type: 'string',
                    },
                    testIdAttribute: {
                        default: 'data-testid',
                        oneOf: [
                            {
                                type: 'string',
                            },
                            {
                                type: 'array',
                                items: {
                                    type: 'string',
                                },
                            },
                        ],
                    },
                },
            },
        ],
    },
    defaultOptions: [
        {
            testIdPattern: '',
            testIdAttribute: 'data-testid',
        },
    ],
    create: function (context, _a) {
        var _b;
        var options = _a[0];
        var getFilename = context.getFilename;
        var testIdPattern = options.testIdPattern, attr = options.testIdAttribute;
        function getFileNameData() {
            var splitPath = getFilename().split('/');
            var fileNameWithExtension = splitPath.pop();
            var parent = splitPath.pop();
            var fileName = fileNameWithExtension.split('.').shift();
            return {
                fileName: fileName === 'index' ? parent : fileName,
            };
        }
        function getTestIdValidator(fileName) {
            return new RegExp(testIdPattern.replace(FILENAME_PLACEHOLDER, fileName));
        }
        function isTestIdAttribute(name) {
            if (typeof attr === 'string') {
                return attr === name;
            }
            else {
                return attr.includes(name);
            }
        }
        return _b = {},
            _b["JSXIdentifier"] = function (node) {
                if (!node_utils_1.isJSXAttribute(node.parent) ||
                    !node_utils_1.isLiteral(node.parent.value) ||
                    !isTestIdAttribute(node.name)) {
                    return;
                }
                var value = node.parent.value.value;
                var fileName = getFileNameData().fileName;
                var regex = getTestIdValidator(fileName);
                if (value && typeof value === 'string' && !regex.test(value)) {
                    context.report({
                        node: node,
                        messageId: 'invalidTestId',
                        data: {
                            attr: node.name,
                            value: value,
                            regex: regex,
                        },
                    });
                }
            },
            _b;
    },
});