core/fragment/eslint/no-duplicate-fragment.eslint.rule.ts
core/fragment/eslint/no-duplicate-fragment.eslint.rule.ts is a file in GovLab Quality. 62 lines of code and 14 definitions.
import type { Rule, SourceCode } from "eslint";
import { fragmentObject, property, stringValue } from "#core/selectors/context.fragment.selector";
import { isDefineFragmentCall, isRuleNode } from "#core/predicates/context.fragment.predicate";
const WHITESPACE = new Set([" ", "\t", "\n", "\r"]);
const normalize = function normalize(text: string): string {
let out = "";
for (const ch of text) {
if (!WHITESPACE.has(ch)) {
out += ch;
}
}
return out;
};
interface FragmentBody {
body: Rule.Node;
normalized: string;
id: string;
}
const fragmentBody = function fragmentBody(node: Rule.Node, sourceCode: SourceCode): FragmentBody | null {
if (!isDefineFragmentCall(node)) {
return null;
}
const object = fragmentObject(node);
const body = object === null ? null : property(object, "body");
if (object === null || body === null || !isRuleNode(body)) {
return null;
}
return {
body,
id: stringValue(property(object, "id")) ?? "(unnamed)",
normalized: normalize(sourceCode.getText(body)),
};
};
export default {
create(context) {
const { sourceCode } = context;
const seen = new Map<string, string>();
const onCall = function onCall(node: Rule.Node): void {
const found = fragmentBody(node, sourceCode);
if (found === null) {
return;
}
const other = seen.get(found.normalized);
if (typeof other === "string") {
context.report({ data: { id: found.id, other }, messageId: "duplicate", node: found.body });
} else {
seen.set(found.normalized, found.id);
}
};
const handlers: [string, (node: Rule.Node) => void][] = [["CallExpression", onCall]];
return Object.fromEntries(handlers);
},
meta: {
docs: { description: "Disallow two context fragments with identical (whitespace-normalized) bodies." },
messages: {
duplicate:
"Fragment '{{id}}' has a body identical to '{{other}}'. Collapse the duplication into one fragment (share a param or gate one fragment on a condition). [no_duplicate_fragment]",
},
schema: [],
type: "problem",
},
} satisfies Rule.RuleModule;