mirror of
https://github.com/DSpace/dspace-angular.git
synced 2025-10-07 10:04:11 +00:00

- ThemedComponent wrappers should always import their base component. This ensures that it's always enough to only import the wrapper when we use it. - This implies that all themeable components must be standalone → added rules to enforce this → updated usage rule to improve declaration/import handling
84 lines
2.9 KiB
TypeScript
84 lines
2.9 KiB
TypeScript
/**
|
|
* 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/
|
|
*/
|
|
import { TSESTree } from '@typescript-eslint/utils';
|
|
|
|
import { getObjectPropertyNodeByName } from './typescript';
|
|
|
|
export function getComponentSelectorNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.StringLiteral | undefined {
|
|
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'selector');
|
|
|
|
if (property !== undefined) {
|
|
// todo: support template literals as well
|
|
if (property.type === TSESTree.AST_NODE_TYPES.Literal && typeof property.value === 'string') {
|
|
return property as TSESTree.StringLiteral;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export function getComponentStandaloneNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.BooleanLiteral | undefined {
|
|
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'standalone');
|
|
|
|
if (property !== undefined) {
|
|
if (property.type === TSESTree.AST_NODE_TYPES.Literal && typeof property.value === 'boolean') {
|
|
return property as TSESTree.BooleanLiteral;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
export function getComponentImportNode(componentDecoratorNode: TSESTree.Decorator): TSESTree.ArrayExpression | undefined {
|
|
const property = getComponentInitializerNodeByName(componentDecoratorNode, 'imports');
|
|
|
|
if (property !== undefined) {
|
|
if (property.type === TSESTree.AST_NODE_TYPES.ArrayExpression) {
|
|
return property as TSESTree.ArrayExpression;
|
|
}
|
|
}
|
|
|
|
return undefined;
|
|
}
|
|
|
|
export function getComponentClassName(decoratorNode: TSESTree.Decorator): string | undefined {
|
|
if (decoratorNode.parent.type !== TSESTree.AST_NODE_TYPES.ClassDeclaration) {
|
|
return undefined;
|
|
}
|
|
|
|
if (decoratorNode.parent.id?.type !== TSESTree.AST_NODE_TYPES.Identifier) {
|
|
return undefined;
|
|
}
|
|
|
|
return decoratorNode.parent.id.name;
|
|
}
|
|
|
|
export function getComponentSuperClassName(decoratorNode: TSESTree.Decorator): string | undefined {
|
|
if (decoratorNode.parent.type !== TSESTree.AST_NODE_TYPES.ClassDeclaration) {
|
|
return undefined;
|
|
}
|
|
|
|
if (decoratorNode.parent.superClass?.type !== TSESTree.AST_NODE_TYPES.Identifier) {
|
|
return undefined;
|
|
}
|
|
|
|
return decoratorNode.parent.superClass.name;
|
|
}
|
|
|
|
export function getComponentInitializer(componentDecoratorNode: TSESTree.Decorator): TSESTree.ObjectExpression {
|
|
return (componentDecoratorNode.expression as TSESTree.CallExpression).arguments[0] as TSESTree.ObjectExpression;
|
|
}
|
|
|
|
export function getComponentInitializerNodeByName(componentDecoratorNode: TSESTree.Decorator, name: string): TSESTree.Node | undefined {
|
|
const initializer = getComponentInitializer(componentDecoratorNode);
|
|
return getObjectPropertyNodeByName(initializer, name);
|
|
}
|
|
|
|
export function isPartOfViewChild(node: TSESTree.Identifier): boolean {
|
|
return (node.parent as any)?.callee?.name === 'ViewChild';
|
|
}
|