Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 1x 1x 1x 1x 1x 226x 1028x 333x 695x 695x 695x 695x 302x 302x 142x 142x 30x 30x 30x 160x 160x 120x 120x 302x 695x | /* eslint-disable @typescript-eslint/no-explicit-any */
import type {
R3ComponentMetadata,
R3DirectiveDependencyMetadata,
R3DirectiveMetadata,
SelectorMatcher,
} from '@angular/compiler';
import type {
ImportedFile,
Reference,
} from '@angular/compiler-cli/src/ngtsc/imports';
import { Injectable } from 'static-injector';
import ts from 'typescript';
import * as t from '../../angular-internal/ast.type';
import { createCssSelector } from '../../angular-internal/template';
import { getAttrsForDirectiveMatching } from '../../angular-internal/util';
import type { DirectiveMetaFromLibrary, MetaFromLibrary } from '../type';
import type { MatchedDirective, MatchedMeta } from './type';
@Injectable()
export class ComponentContext {
constructor(private directiveMatcher: SelectorMatcher | undefined) {}
matchDirective(node: t.Element): MatchedMeta[] {
if (!this.directiveMatcher) {
return [];
}
const name: string = node.name;
const selector = createCssSelector(
name,
getAttrsForDirectiveMatching(node)
);
const result: MatchedMeta[] = [];
this.directiveMatcher.match(
selector,
(
selector,
meta: {
directive: R3DirectiveDependencyMetadata & {
ref: Reference<ts.ClassDeclaration>;
importedFile: ImportedFile;
};
componentMeta: R3ComponentMetadata<any>;
directiveMeta: R3DirectiveMetadata;
libraryMeta: MetaFromLibrary;
}
) => {
let item: Partial<MatchedMeta>;
const isComponent: boolean = !!meta.directive.isComponent;
if (isComponent) {
item = {
isComponent,
outputs: meta.directive.outputs,
filePath: (meta.directive.importedFile as ts.SourceFile).fileName,
selector: meta.directive.selector,
className: meta.directive.ref.node.name!.getText(),
listeners:
Object.keys(meta.componentMeta?.host?.listeners || {}) || [],
inputs: meta.directive.inputs,
};
if (meta.libraryMeta?.isComponent) {
item.exportPath = meta.libraryMeta.exportPath;
item.listeners = meta.libraryMeta.listeners;
item.properties = meta.libraryMeta.properties;
}
} else {
item = {
isComponent,
listeners:
Object.keys(meta.directiveMeta?.host?.listeners || {}) || [],
properties:
Object.keys(meta.directiveMeta?.host?.properties || {}) || [],
inputs: meta.directive.inputs,
outputs: meta.directive.outputs,
};
if (meta.libraryMeta && !meta.libraryMeta.isComponent) {
(item as MatchedDirective).listeners = (
meta.libraryMeta as DirectiveMetaFromLibrary
).listeners!;
(item as MatchedDirective).properties = (
meta.libraryMeta as DirectiveMetaFromLibrary
).properties!;
}
}
result.push(item as MatchedMeta);
}
);
return result;
}
}
|