eslint-plugin-ng-test-identifier
Version:
add test identifier attribute to angular components
89 lines • 3.86 kB
JavaScript
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
;