mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-17 23:13:04 +00:00
Custom ESLint rules to enforce new ThemedComponent selector convention
The following cases are covered: - ThemedComponent wrapper selectors must not start with ds-themed- - Base component selectors must start with ds-base- - Themed component selectors must start with ds-themed- - The ThemedComponent wrapper must always be used in HTML - The ThemedComponent wrapper must be used in TypeScript _where appropriate_: - Required - Explicit usages (e.g. modal instantiation, routing modules, ...) - By.css selector queries (in order to align with the HTML rule) - Unchecked - Non-routing modules (to ensure the components can be declared) - ViewChild hooks (since they need to attach to the underlying component) All rules work with --fix to automatically migrate to the new convention This covers most of the codebase, but minor manual adjustment are needed afterwards
This commit is contained in:
42
lint/src/util/misc.ts
Normal file
42
lint/src/util/misc.ts
Normal file
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* The contents of this file are subject to the license and copyright
|
||||
* detailed in the LICENSE and NOTICE files at the root of the source
|
||||
* tree and available online at
|
||||
*
|
||||
* http://www.dspace.org/license/
|
||||
*/
|
||||
|
||||
export function stringLiteral(value: string): string {
|
||||
return `'${value}'`;
|
||||
}
|
||||
|
||||
export function match(rangeA: number[], rangeB: number[]) {
|
||||
return rangeA[0] === rangeB[0] && rangeA[1] === rangeB[1];
|
||||
}
|
||||
|
||||
export function findUsages(context: any, localNode: any): any[] {
|
||||
const ast = context.getSourceCode().ast;
|
||||
|
||||
const usages: any[] = [];
|
||||
|
||||
for (const token of ast.tokens) {
|
||||
if (token.type === 'Identifier' && token.value === localNode.name && !match(token.range, localNode.range)) {
|
||||
usages.push(context.getSourceCode().getNodeByRangeIndex(token.range[0]));
|
||||
}
|
||||
}
|
||||
|
||||
return usages;
|
||||
}
|
||||
|
||||
|
||||
export function isPartOfTypeExpression(node: any): boolean {
|
||||
return node.parent.type.startsWith('TSType');
|
||||
}
|
||||
|
||||
export function isClassDeclaration(node: any): boolean {
|
||||
return node.parent.type === 'ClassDeclaration';
|
||||
}
|
||||
|
||||
export function isPartOfViewChild(node: any): boolean {
|
||||
return node.parent?.callee?.name === 'ViewChild';
|
||||
}
|
Reference in New Issue
Block a user