UNPKG

eslint-plugin-ng-test-identifier

Version:

add test identifier attribute to angular components

89 lines 3.86 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ngTestIdentifier = void 0; const nanoid_1 = require("nanoid"); const utils_1 = require("../utils"); const values = new Map(); exports.ngTestIdentifier = { meta: { type: "suggestion", docs: { description: "Ensures that the test identifer attribute (`data-test` by default) is present and unique", recommended: "error", }, fixable: "code", schema: [ { type: "object", properties: { tagName: { type: "string", }, randomTextOptions: { type: "object", properties: { length: { type: "number", exclusiveMinimum: 0, }, alphabet: { type: "string", }, }, additionalProperties: false, }, }, additionalProperties: false, }, ], messages: { ngTestIdentifier: "The test identifier attribute (`data-test` by default) is required.", ngTestIdentifierUnique: "The identifier attribute (`data-test` by default) should be unique.", }, }, create(context) { const parserServices = (0, utils_1.getTemplateParserServices)(context); const size = context.options[0]?.randomTextOptions?.length || 8; const alphabet = context.options[0]?.randomTextOptions?.alphabet || nanoid_1.urlAlphabet; const tagName = context.options[0]?.tagName || "data-test"; const fileName = context.getPhysicalFilename ? context.getPhysicalFilename() : context.getFilename(); values.forEach((value, key) => { if (value === fileName) { values.delete(key); } }); return { [`:not(Element$1[name="svg"]) Element$1:not([name=/ng-container|ng-template|ng-content/])`](element) { if (element.name.startsWith(":") && element.name !== ":svg:svg") { return; } const attr = element.attributes.find((attr) => attr.name === tagName); if (attr) { if (values.has(attr.value)) { const loc = parserServices.convertNodeSourceSpanToLoc(attr.sourceSpan); context.report({ loc, messageId: "ngTestIdentifierUnique", fix: (fixer) => { return fixer.replaceTextRange([attr.sourceSpan.start.offset, attr.sourceSpan.end.offset], `${tagName}="${(0, nanoid_1.customAlphabet)(alphabet, size)()}"`); }, }); } values.set(attr.value, fileName); return; } const loc = parserServices.convertNodeSourceSpanToLoc(element.sourceSpan); const insertOffset = element.sourceSpan.start.offset + (element.name === ":svg:svg" ? 4 : element.name.length + 1); context.report({ loc, messageId: "ngTestIdentifier", fix: (fixer) => { return fixer.insertTextBeforeRange([insertOffset, insertOffset], ` ${tagName}="${(0, nanoid_1.customAlphabet)(alphabet, size)()}"`); }, }); }, }; }, }; //# sourceMappingURL=ng-test-identifier.js.map