@codeperfect/eslint-plugin 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/angular/angular-template-block-usage-utilities.d.ts +4 -0
- package/dist/adapters/angular/angular-template-block-usage-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-block-usage-utilities.js +69 -0
- package/dist/adapters/angular/angular-template-expression-utilities.d.ts +5 -0
- package/dist/adapters/angular/angular-template-expression-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-expression-utilities.js +121 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts +4 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-node-usage-utilities.js +47 -0
- package/dist/adapters/angular/angular-template-usage-context.d.ts +26 -0
- package/dist/adapters/angular/angular-template-usage-context.d.ts.map +1 -0
- package/dist/adapters/angular/angular-template-usage-context.js +12 -0
- package/dist/adapters/angular/index.d.ts +2 -0
- package/dist/adapters/angular/index.d.ts.map +1 -0
- package/dist/adapters/angular/index.js +2 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts +15 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.d.ts.map +1 -0
- package/dist/adapters/angular/no-unused-public-members-template-adapter.js +126 -0
- package/dist/adapters/angular/plugin.d.ts +12 -0
- package/dist/adapters/angular/plugin.d.ts.map +1 -0
- package/dist/adapters/angular/plugin.js +14 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/codeperfect-eslint-plugin-1.0.0.tgz +0 -0
- package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-public-api-utilities.js +7 -2
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-expression-reference-utilities.js +77 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts +2 -2
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-usage-handoff-utilities.js +69 -43
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts +16 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-local-flow-utilities.js +151 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-usage-reference-utilities.js +12 -5
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts +30 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-serialization-utilities.js +107 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts +26 -4
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-usage-type-utilities.js +77 -21
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts +5 -1
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-usage-utilities.js +11 -2
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts +43 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.d.ts.map +1 -0
- package/dist/domain/architecture/no-unused-public-members/member-usage-value-utilities.js +126 -0
- package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts +3 -1
- package/dist/domain/architecture/no-unused-public-members/member-utilities.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/member-utilities.js +4 -3
- package/dist/domain/architecture/no-unused-public-members/rule.d.ts +12 -1
- package/dist/domain/architecture/no-unused-public-members/rule.d.ts.map +1 -1
- package/dist/domain/architecture/no-unused-public-members/rule.js +45 -35
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/package.json +13 -1
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AngularTemplateNode, TemplateLocals, TemplateNodeVisitor, TemplateUsageContext } from "./angular-template-usage-context.js";
|
|
2
|
+
declare const blockUsesMember: (node: AngularTemplateNode, locals: TemplateLocals, usage: TemplateUsageContext, visitNodes: TemplateNodeVisitor) => boolean;
|
|
3
|
+
export { blockUsesMember };
|
|
4
|
+
//# sourceMappingURL=angular-template-block-usage-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-template-block-usage-utilities.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/angular-template-block-usage-utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,kCAAkC,CAAC;AAK1C,QAAA,MAAM,eAAe,GACnB,MAAM,mBAAmB,EACzB,QAAQ,cAAc,EACtB,OAAO,oBAAoB,EAC3B,YAAY,mBAAmB,KAC9B,OAgHF,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import { expressionUsesMember } from "./angular-template-expression-utilities.js";
|
|
3
|
+
import { withAlias, withNames } from "./angular-template-usage-context.js";
|
|
4
|
+
const blockUsesMember = (node, locals, usage, visitNodes) => {
|
|
5
|
+
if (node instanceof angular.TmplAstIfBlock) {
|
|
6
|
+
return node.branches.some((branch) => {
|
|
7
|
+
const alias = branch.expressionAlias?.name;
|
|
8
|
+
const aliasValue = branch.expression ?? undefined;
|
|
9
|
+
const branchLocals = alias === undefined
|
|
10
|
+
? locals
|
|
11
|
+
: aliasValue === undefined
|
|
12
|
+
? withNames(locals, [alias])
|
|
13
|
+
: withAlias(locals, alias, aliasValue);
|
|
14
|
+
return (uses(branch.expression ?? undefined, locals) ||
|
|
15
|
+
visitNodes(branch.children, branchLocals, usage));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
if (node instanceof angular.TmplAstForLoopBlock) {
|
|
19
|
+
const loopLocals = withNames(locals, [
|
|
20
|
+
node.item.name,
|
|
21
|
+
...node.contextVariables.map(({ name }) => name),
|
|
22
|
+
]);
|
|
23
|
+
return (uses(node.expression, locals) ||
|
|
24
|
+
uses(node.trackBy ?? undefined, loopLocals) ||
|
|
25
|
+
visitNodes(node.children, loopLocals, usage) ||
|
|
26
|
+
(node.empty !== null && visitNodes(node.empty.children, locals, usage)));
|
|
27
|
+
}
|
|
28
|
+
if (node instanceof angular.TmplAstSwitchBlock) {
|
|
29
|
+
return (uses(node.expression, locals) ||
|
|
30
|
+
node.groups.some((group) => group.cases.some((branch) => uses(branch.expression ?? undefined, locals)) || visitNodes(group.children, locals, usage)));
|
|
31
|
+
}
|
|
32
|
+
if (node instanceof angular.TmplAstDeferredBlock) {
|
|
33
|
+
const triggers = [
|
|
34
|
+
...Object.values(node.triggers),
|
|
35
|
+
...Object.values(node.prefetchTriggers),
|
|
36
|
+
...Object.values(node.hydrateTriggers),
|
|
37
|
+
];
|
|
38
|
+
return (triggers.some((trigger) => trigger instanceof angular.TmplAstBoundDeferredTrigger &&
|
|
39
|
+
uses(trigger.value, locals)) ||
|
|
40
|
+
visitNodes(node.children, locals, usage) ||
|
|
41
|
+
(node.placeholder !== null &&
|
|
42
|
+
visitNodes(node.placeholder.children, locals, usage)) ||
|
|
43
|
+
(node.loading !== null &&
|
|
44
|
+
visitNodes(node.loading.children, locals, usage)) ||
|
|
45
|
+
(node.error !== null && visitNodes(node.error.children, locals, usage)));
|
|
46
|
+
}
|
|
47
|
+
return ((node instanceof angular.TmplAstBoundaryBlock &&
|
|
48
|
+
(visitNodes(node.children, locals, usage) ||
|
|
49
|
+
node.errorBlocks.some((branch) => uses(branch.expression ?? undefined, locals) ||
|
|
50
|
+
visitNodes(branch.children, withNames(locals, branch.contextVariables.map(({ name }) => name)), usage)))) ||
|
|
51
|
+
(node instanceof angular.TmplAstContentBlock &&
|
|
52
|
+
visitNodes(node.children, withNames(locals, node.variables.map(({ name }) => name)), usage)));
|
|
53
|
+
/**
|
|
54
|
+
* Checks an Angular expression against the selected component member.
|
|
55
|
+
* @param expression Template expression to inspect.
|
|
56
|
+
* @param expressionLocals Template locals in scope for the expression.
|
|
57
|
+
* @returns Whether the expression reads the member.
|
|
58
|
+
* @example
|
|
59
|
+
* ```typescript
|
|
60
|
+
* const used = uses(templateExpression, locals);
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
function uses(expression, expressionLocals) {
|
|
64
|
+
return (expression !== undefined &&
|
|
65
|
+
expressionUsesMember(expression, expressionLocals, usage));
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
export { blockUsesMember };
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10ZW1wbGF0ZS1ibG9jay11c2FnZS11dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvYW5ndWxhci9hbmd1bGFyLXRlbXBsYXRlLWJsb2NrLXVzYWdlLXV0aWxpdGllcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBUzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQy9FLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFFeEUsTUFBTSxlQUFlLEdBQUcsQ0FDdEIsSUFBeUIsRUFDekIsTUFBc0IsRUFDdEIsS0FBMkIsRUFDM0IsVUFBK0IsRUFDdEIsRUFBRTtJQUNYLElBQUksSUFBSSxZQUFZLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUM7WUFDM0MsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsSUFBSSxTQUFTLENBQUM7WUFDbEQsTUFBTSxZQUFZLEdBQ2hCLEtBQUssS0FBSyxTQUFTO2dCQUNqQixDQUFDLENBQUMsTUFBTTtnQkFDUixDQUFDLENBQUMsVUFBVSxLQUFLLFNBQVM7b0JBQ3hCLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztZQUU3QyxPQUFPLENBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksU0FBUyxFQUFFLE1BQU0sQ0FBQztnQkFDNUMsVUFBVSxD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LENBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUM7WUFDdkMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQ25CLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDVCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxTQUFTLEVBQUUsTUFBTSxDQUFDO2dCQUM1QyxVQUFVLENBQ1IsTUFBTSxDQUFDLFFBQVEsRUFDZixTQUFTLENBQ1AsTUFBTSxFQUNOLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDaEQsRUFDRCxLQUFLLENBQ04sQ0FDSixDQUFDLENBQUM7UUFDUCxDQUFDLElBQUksWUFBWSxPQUFPLENBQUMsbUJBQW1CO1lBQzFDLFVBQVUsQ0FDUixJQUFJLENBQUMsUUFBUSxFQUNiLFNBQVMsQ0FDUCxNQUFNLEVBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FDdkMsRUFDRCxLQUFLLENBQ04sQ0FBQyxDQUNMLENBQUM7SUFFRjs7Ozs7Ozs7O09BU0c7SUFDSCxTQUFTLElBQUksQ0FDWCxVQUFtQyxFQUNuQyxnQkFBZ0M7UUFFaEMsT0FBTyxDQUNMLFVBQVUsS0FBSyxTQUFTO1lBQ3hCLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FDMUQsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsZUFBZSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gXCJAYW5ndWxhci9jb21waWxlclwiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFuZ3VsYXJUZW1wbGF0ZU5vZGUsXG4gIFRlbXBsYXRlTG9jYWxzLFxuICBUZW1wbGF0ZU5vZGVWaXNpdG9yLFxuICBUZW1wbGF0ZVVzYWdlQ29udGV4dCxcbn0gZnJvbSBcIi4vYW5ndWxhci10ZW1wbGF0ZS11c2FnZS1jb250ZXh0XCI7XG5cbmltcG9ydCB7IGV4cHJlc3Npb25Vc2VzTWVtYmVyIH0gZnJvbSBcIi4vYW5ndWxhci10ZW1wbGF0ZS1leHByZXNzaW9uLXV0aWxpdGllc1wiO1xuaW1wb3J0IHsgd2l0aEFsaWFzLCB3aXRoTmFtZXMgfSBmcm9tIFwiLi9hbmd1bGFyLXRlbXBsYXRlLXVzYWdlLWNvbnRleHRcIjtcblxuY29uc3QgYmxvY2tVc2VzTWVtYmVyID0gKFxuICBub2RlOiBBbmd1bGFyVGVtcGxhdGVOb2RlLFxuICBsb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQsXG4gIHZpc2l0Tm9kZXM6IFRlbXBsYXRlTm9kZVZpc2l0b3IsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RJZkJsb2NrKSB7XG4gICAgcmV0dXJuIG5vZGUuYnJhbmNoZXMuc29tZSgoYnJhbmNoKSA9PiB7XG4gICAgICBjb25zdCBhbGlhcyA9IGJyYW5jaC5leHByZXNzaW9uQWxpYXM/Lm5hbWU7XG4gICAgICBjb25zdCBhbGlhc1ZhbHVlID0gYnJhbmNoLmV4cHJlc3Npb24gPz8gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgYnJhbmNoTG9jYWxzID1cbiAgICAgICAgYWxpYXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gbG9jYWxzXG4gICAgICAgICAgOiBhbGlhc1ZhbHVlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gd2l0aE5hbWVzKGxvY2FscywgW2FsaWFzXSlcbiAgICAgICAgICAgIDogd2l0aEFsaWFzKGxvY2FscywgYWxpYXMsIGFsaWFzVmFsdWUpO1xuXG4gICAgICByZXR1cm4gKFxuICAgICAgICB1c2VzKGJyYW5jaC5leHByZXNzaW9uID8/IHVuZGVmaW5lZCwgbG9jYWxzKSB8fFxuICAgICAgICB2aXNpdE5vZGVzKGJyYW5jaC5jaGlsZHJlbiwgYnJhbmNoTG9jYWxzLCB1c2FnZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICBpZiAobm9kZSBpbnN0YW5jZW9mIGFuZ3VsYXIuVG1wbEFzdEZvckxvb3BCbG9jaykge1xuICAgIGNvbnN0IGxvb3BMb2NhbHMgPSB3aXRoTmFtZXMobG9jYWxzLCBbXG4gICAgICBub2RlLml0ZW0ubmFtZSxcbiAgICAgIC4uLm5vZGUuY29udGV4dFZhcmlhYmxlcy5tYXAoKHsgbmFtZSB9KSA9PiBuYW1lKSxcbiAgICBdKTtcblxuICAgIHJldHVybiAoXG4gICAgICB1c2VzKG5vZGUuZXhwcmVzc2lvbiwgbG9jYWxzKSB8fFxuICAgICAgdXNlcyhub2RlLnRyYWNrQnkgPz8gdW5kZWZpbmVkLCBsb29wTG9jYWxzKSB8fFxuICAgICAgdmlzaXROb2Rlcyhub2RlLmNoaWxkcmVuLCBsb29wTG9jYWxzLCB1c2FnZSkgfHxcbiAgICAgIChub2RlLmVtcHR5ICE9PSBudWxsICYmIHZpc2l0Tm9kZXMobm9kZS5lbXB0eS5jaGlsZHJlbiwgbG9jYWxzLCB1c2FnZSkpXG4gICAgKTtcbiAgfVxuXG4gIGlmIChub2RlIGluc3RhbmNlb2YgYW5ndWxhci5UbXBsQXN0U3dpdGNoQmxvY2spIHtcbiAgICByZXR1cm4gKFxuICAgICAgdXNlcyhub2RlLmV4cHJlc3Npb24sIGxvY2FscykgfHxcbiAgICAgIG5vZGUuZ3JvdXBzLnNvbWUoXG4gICAgICAgIChncm91cCkgPT5cbiAgICAgICAgICBncm91cC5jYXNlcy5zb21lKChicmFuY2gpID0+XG4gICAgICAgICAgICB1c2VzKGJyYW5jaC5leHByZXNzaW9uID8/IHVuZGVmaW5lZCwgbG9jYWxzKSxcbiAgICAgICAgICApIHx8IHZpc2l0Tm9kZXMoZ3JvdXAuY2hpbGRyZW4sIGxvY2FscywgdXNhZ2UpLFxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBpZiAobm9kZSBpbnN0YW5jZW9mIGFuZ3VsYXIuVG1wbEFzdERlZmVycmVkQmxvY2spIHtcbiAgICBjb25zdCB0cmlnZ2VycyA9IFtcbiAgICAgIC4uLk9iamVjdC52YWx1ZXMobm9kZS50cmlnZ2VycyksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKG5vZGUucHJlZmV0Y2hUcmlnZ2VycyksXG4gICAgICAuLi5PYmplY3QudmFsdWVzKG5vZGUuaHlkcmF0ZVRyaWdnZXJzKSxcbiAgICBdO1xuXG4gICAgcmV0dXJuIChcbiAgICAgIHRyaWdnZXJzLnNvbWUoXG4gICAgICAgICh0cmlnZ2VyKSA9PlxuICAgICAgICAgIHRyaWdnZXIgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RCb3VuZERlZmVycmVkVHJpZ2dlciAmJlxuICAgICAgICAgIHVzZXModHJpZ2dlci52YWx1ZSwgbG9jYWxzKSxcbiAgICAgICkgfHxcbiAgICAgIHZpc2l0Tm9kZXMobm9kZS5jaGlsZHJlbiwgbG9jYWxzLCB1c2FnZSkgfHxcbiAgICAgIChub2RlLnBsYWNlaG9sZGVyICE9PSBudWxsICYmXG4gICAgICAgIHZpc2l0Tm9kZXMobm9kZS5wbGFjZWhvbGRlci5jaGlsZHJlbiwgbG9jYWxzLCB1c2FnZSkpIHx8XG4gICAgICAobm9kZS5sb2FkaW5nICE9PSBudWxsICYmXG4gICAgICAgIHZpc2l0Tm9kZXMobm9kZS5sb2FkaW5nLmNoaWxkcmVuLCBsb2NhbHMsIHVzYWdlKSkgfHxcbiAgICAgIChub2RlLmVycm9yICE9PSBudWxsICYmIHZpc2l0Tm9kZXMobm9kZS5lcnJvci5jaGlsZHJlbiwgbG9jYWxzLCB1c2FnZSkpXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgKG5vZGUgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RCb3VuZGFyeUJsb2NrICYmXG4gICAgICAodmlzaXROb2Rlcyhub2RlLmNoaWxkcmVuLCBsb2NhbHMsIHVzYWdlKSB8fFxuICAgICAgICBub2RlLmVycm9yQmxvY2tzLnNvbWUoXG4gICAgICAgICAgKGJyYW5jaCkgPT5cbiAgICAgICAgICAgIHVzZXMoYnJhbmNoLmV4cHJlc3Npb24gPz8gdW5kZWZpbmVkLCBsb2NhbHMpIHx8XG4gICAgICAgICAgICB2aXNpdE5vZGVzKFxuICAgICAgICAgICAgICBicmFuY2guY2hpbGRyZW4sXG4gICAgICAgICAgICAgIHdpdGhOYW1lcyhcbiAgICAgICAgICAgICAgICBsb2NhbHMsXG4gICAgICAgICAgICAgICAgYnJhbmNoLmNvbnRleHRWYXJpYWJsZXMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHVzYWdlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgKSkpIHx8XG4gICAgKG5vZGUgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RDb250ZW50QmxvY2sgJiZcbiAgICAgIHZpc2l0Tm9kZXMoXG4gICAgICAgIG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIHdpdGhOYW1lcyhcbiAgICAgICAgICBsb2NhbHMsXG4gICAgICAgICAgbm9kZS52YXJpYWJsZXMubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSksXG4gICAgICAgICksXG4gICAgICAgIHVzYWdlLFxuICAgICAgKSlcbiAgKTtcblxuICAvKipcbiAgICogQ2hlY2tzIGFuIEFuZ3VsYXIgZXhwcmVzc2lvbiBhZ2FpbnN0IHRoZSBzZWxlY3RlZCBjb21wb25lbnQgbWVtYmVyLlxuICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBUZW1wbGF0ZSBleHByZXNzaW9uIHRvIGluc3BlY3QuXG4gICAqIEBwYXJhbSBleHByZXNzaW9uTG9jYWxzIFRlbXBsYXRlIGxvY2FscyBpbiBzY29wZSBmb3IgdGhlIGV4cHJlc3Npb24uXG4gICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIGV4cHJlc3Npb24gcmVhZHMgdGhlIG1lbWJlci5cbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB1c2VkID0gdXNlcyh0ZW1wbGF0ZUV4cHJlc3Npb24sIGxvY2Fscyk7XG4gICAqIGBgYFxuICAgKi9cbiAgZnVuY3Rpb24gdXNlcyhcbiAgICBleHByZXNzaW9uOiBhbmd1bGFyLkFTVCB8IHVuZGVmaW5lZCxcbiAgICBleHByZXNzaW9uTG9jYWxzOiBUZW1wbGF0ZUxvY2FscyxcbiAgKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGV4cHJlc3Npb24gIT09IHVuZGVmaW5lZCAmJlxuICAgICAgZXhwcmVzc2lvblVzZXNNZW1iZXIoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbkxvY2FscywgdXNhZ2UpXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IHsgYmxvY2tVc2VzTWVtYmVyIH07XG4iXX0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import type { TemplateLocals, TemplateUsageContext } from "./angular-template-usage-context.js";
|
|
3
|
+
declare const expressionUsesMember: (expression: angular.AST, locals: TemplateLocals, usage: TemplateUsageContext) => boolean;
|
|
4
|
+
export { expressionUsesMember };
|
|
5
|
+
//# sourceMappingURL=angular-template-expression-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-template-expression-utilities.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/angular-template-expression-utilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAG7C,OAAO,KAAK,EACV,cAAc,EAEd,oBAAoB,EACrB,MAAM,kCAAkC,CAAC;AAI1C,QAAA,MAAM,oBAAoB,GACxB,YAAY,OAAO,CAAC,GAAG,EACvB,QAAQ,cAAc,EACtB,OAAO,oBAAoB,KAC1B,OA2BF,CAAC;AAqJF,OAAO,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import { isSameSymbol } from "../../domain/architecture/no-unused-exports/no-unused-exports-symbol-utilities.js";
|
|
4
|
+
const expressionUsesMember = (expression, locals, usage) => {
|
|
5
|
+
class MemberReadVisitor extends angular.RecursiveAstVisitor {
|
|
6
|
+
found = false;
|
|
7
|
+
visitPropertyRead(ast) {
|
|
8
|
+
this.record(ast);
|
|
9
|
+
super.visitPropertyRead(ast, undefined);
|
|
10
|
+
}
|
|
11
|
+
visitSafePropertyRead(ast) {
|
|
12
|
+
this.record(ast);
|
|
13
|
+
super.visitSafePropertyRead(ast, undefined);
|
|
14
|
+
}
|
|
15
|
+
record(ast) {
|
|
16
|
+
if (ast.name === usage.member.memberName &&
|
|
17
|
+
resolveTemplatePath(getMemberPath(ast), locals, usage)) {
|
|
18
|
+
this.found = true;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const visitor = new MemberReadVisitor();
|
|
23
|
+
expression.visit(visitor);
|
|
24
|
+
return visitor.found;
|
|
25
|
+
};
|
|
26
|
+
const getMemberPath = (expression) => {
|
|
27
|
+
if (expression instanceof angular.ASTWithSource) {
|
|
28
|
+
const sourceAst = expression.ast;
|
|
29
|
+
return sourceAst instanceof angular.AST
|
|
30
|
+
? getMemberPath(sourceAst)
|
|
31
|
+
: undefined;
|
|
32
|
+
}
|
|
33
|
+
if (expression instanceof angular.ImplicitReceiver) {
|
|
34
|
+
return { root: "implicit", segments: [] };
|
|
35
|
+
}
|
|
36
|
+
if (expression instanceof angular.ThisReceiver) {
|
|
37
|
+
return { root: "component", segments: [] };
|
|
38
|
+
}
|
|
39
|
+
if (expression instanceof angular.PropertyRead ||
|
|
40
|
+
expression instanceof angular.SafePropertyRead) {
|
|
41
|
+
const parentPath = getMemberPath(expression.receiver);
|
|
42
|
+
return parentPath === undefined
|
|
43
|
+
? undefined
|
|
44
|
+
: {
|
|
45
|
+
...parentPath,
|
|
46
|
+
segments: [...parentPath.segments, { name: expression.name }],
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
if (expression instanceof angular.Call ||
|
|
50
|
+
expression instanceof angular.SafeCall) {
|
|
51
|
+
if (expression.args.length > 0) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
const calleePath = getMemberPath(expression.receiver);
|
|
55
|
+
return calleePath === undefined
|
|
56
|
+
? undefined
|
|
57
|
+
: { ...calleePath, segments: [...calleePath.segments, { call: true }] };
|
|
58
|
+
}
|
|
59
|
+
if (expression instanceof angular.ParenthesizedExpression) {
|
|
60
|
+
return getMemberPath(expression.expression);
|
|
61
|
+
}
|
|
62
|
+
return expression instanceof angular.NonNullAssert
|
|
63
|
+
? getMemberPath(expression.expression)
|
|
64
|
+
: undefined;
|
|
65
|
+
};
|
|
66
|
+
const resolveTemplatePath = (templatePath, locals, usage) => {
|
|
67
|
+
const resolvedPath = expandTemplateLocals(templatePath, locals);
|
|
68
|
+
if (resolvedPath === undefined || resolvedPath.segments.length === 0) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
const { segments } = resolvedPath;
|
|
72
|
+
const [firstSegment] = segments;
|
|
73
|
+
if (firstSegment === undefined || !("name" in firstSegment)) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
let currentType = usage.checker.getDeclaredTypeOfSymbol(usage.componentSymbol);
|
|
77
|
+
for (const [index, segment] of segments.entries()) {
|
|
78
|
+
if ("call" in segment) {
|
|
79
|
+
const [signature] = usage.checker.getSignaturesOfType(currentType, ts.SignatureKind.Call);
|
|
80
|
+
if (signature === undefined) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
currentType = usage.checker.getReturnTypeOfSignature(signature);
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const property = usage.checker.getPropertyOfType(usage.checker.getNonNullableType(currentType), segment.name);
|
|
87
|
+
if (property === undefined) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
if (index === segments.length - 1) {
|
|
91
|
+
return isSameSymbol(property, usage.member.memberSymbol);
|
|
92
|
+
}
|
|
93
|
+
currentType = usage.checker.getTypeOfSymbolAtLocation(property, usage.component);
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
};
|
|
97
|
+
const expandTemplateLocals = (templatePath, locals, visitedLocals = new Set()) => {
|
|
98
|
+
if (templatePath?.root !== "implicit") {
|
|
99
|
+
return templatePath;
|
|
100
|
+
}
|
|
101
|
+
const [firstSegment] = templatePath.segments;
|
|
102
|
+
if (firstSegment === undefined ||
|
|
103
|
+
!("name" in firstSegment) ||
|
|
104
|
+
!locals.has(firstSegment.name)) {
|
|
105
|
+
return templatePath;
|
|
106
|
+
}
|
|
107
|
+
const localName = firstSegment.name;
|
|
108
|
+
const localValue = locals.get(localName);
|
|
109
|
+
if (localValue === undefined || visitedLocals.has(localName)) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
112
|
+
const localPath = getMemberPath(localValue);
|
|
113
|
+
return expandTemplateLocals(localPath === undefined
|
|
114
|
+
? undefined
|
|
115
|
+
: {
|
|
116
|
+
...localPath,
|
|
117
|
+
segments: [...localPath.segments, ...templatePath.segments.slice(1)],
|
|
118
|
+
}, locals, new Set([...visitedLocals, localName]));
|
|
119
|
+
};
|
|
120
|
+
export { expressionUsesMember };
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10ZW1wbGF0ZS1leHByZXNzaW9uLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVycy9hbmd1bGFyL2FuZ3VsYXItdGVtcGxhdGUtZXhwcmVzc2lvbi11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQVFqQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0ZBQWdGLENBQUM7QUFFOUcsTUFBTSxvQkFBb0IsR0FBRyxDQUMzQixVQUF1QixFQUN2QixNQUFzQixFQUN0QixLQUEyQixFQUNsQixFQUFFO0lBQ1gsTUFBTSxpQkFBa0IsU0FBUSxPQUFPLENBQUMsbUJBQW1CO1FBQ3pELEtBQUssR0FBRyxLQUFLLENBQUM7UUFFTCxpQkFBaUIsQ0FBQyxHQUF5QjtZQUNsRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pCLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVRLHFCQUFxQixDQUFDLEdBQTZCO1lBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDakIsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRU8sTUFBTSxDQUFDLEdBQW9EO1lBQ2pFLElBQ0UsR0FBRyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ3BDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQ3RELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7WUFDcEIsQ0FBQztRQUNILENB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Q0FBQyxRQUFRLEVBQUUsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyRSxFQUNMLE1BQU0sRUFDTixJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQ3ZDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFuZ3VsYXIgZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIFRlbXBsYXRlTG9jYWxzLFxuICBUZW1wbGF0ZU1lbWJlclBhdGgsXG4gIFRlbXBsYXRlVXNhZ2VDb250ZXh0LFxufSBmcm9tIFwiLi9hbmd1bGFyLXRlbXBsYXRlLXVzYWdlLWNvbnRleHRcIjtcblxuaW1wb3J0IHsgaXNTYW1lU3ltYm9sIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLWV4cG9ydHMvbm8tdW51c2VkLWV4cG9ydHMtc3ltYm9sLXV0aWxpdGllc1wiO1xuXG5jb25zdCBleHByZXNzaW9uVXNlc01lbWJlciA9IChcbiAgZXhwcmVzc2lvbjogYW5ndWxhci5BU1QsXG4gIGxvY2FsczogVGVtcGxhdGVMb2NhbHMsXG4gIHVzYWdlOiBUZW1wbGF0ZVVzYWdlQ29udGV4dCxcbik6IGJvb2xlYW4gPT4ge1xuICBjbGFzcyBNZW1iZXJSZWFkVmlzaXRvciBleHRlbmRzIGFuZ3VsYXIuUmVjdXJzaXZlQXN0VmlzaXRvciB7XG4gICAgZm91bmQgPSBmYWxzZTtcblxuICAgIG92ZXJyaWRlIHZpc2l0UHJvcGVydHlSZWFkKGFzdDogYW5ndWxhci5Qcm9wZXJ0eVJlYWQpOiB2b2lkIHtcbiAgICAgIHRoaXMucmVjb3JkKGFzdCk7XG4gICAgICBzdXBlci52aXNpdFByb3BlcnR5UmVhZChhc3QsIHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogYW5ndWxhci5TYWZlUHJvcGVydHlSZWFkKTogdm9pZCB7XG4gICAgICB0aGlzLnJlY29yZChhc3QpO1xuICAgICAgc3VwZXIudmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdCwgdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlY29yZChhc3Q6IGFuZ3VsYXIuUHJvcGVydHlSZWFkIHwgYW5ndWxhci5TYWZlUHJvcGVydHlSZWFkKTogdm9pZCB7XG4gICAgICBpZiAoXG4gICAgICAgIGFzdC5uYW1lID09PSB1c2FnZS5tZW1iZXIubWVtYmVyTmFtZSAmJlxuICAgICAgICByZXNvbHZlVGVtcGxhdGVQYXRoKGdldE1lbWJlclBhdGgoYXN0KSwgbG9jYWxzLCB1c2FnZSlcbiAgICAgICkge1xuICAgICAgICB0aGlzLmZvdW5kID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB2aXNpdG9yID0gbmV3IE1lbWJlclJlYWRWaXNpdG9yKCk7XG4gIGV4cHJlc3Npb24udmlzaXQodmlzaXRvcik7XG4gIHJldHVybiB2aXNpdG9yLmZvdW5kO1xufTtcblxuY29uc3QgZ2V0TWVtYmVyUGF0aCA9IChcbiAgZXhwcmVzc2lvbjogYW5ndWxhci5BU1QsXG4pOiBUZW1wbGF0ZU1lbWJlclBhdGggfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGFuZ3VsYXIuQVNUV2l0aFNvdXJjZSkge1xuICAgIGNvbnN0IHNvdXJjZUFzdDogdW5rbm93biA9IGV4cHJlc3Npb24uYXN0O1xuICAgIHJldHVybiBzb3VyY2VBc3QgaW5zdGFuY2VvZiBhbmd1bGFyLkFTVFxuICAgICAgPyBnZXRNZW1iZXJQYXRoKHNvdXJjZUFzdClcbiAgICAgIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBhbmd1bGFyLkltcGxpY2l0UmVjZWl2ZXIpIHtcbiAgICByZXR1cm4geyByb290OiBcImltcGxpY2l0XCIsIHNlZ21lbnRzOiBbXSB9O1xuICB9XG5cbiAgaWYgKGV4cHJlc3Npb24gaW5zdGFuY2VvZiBhbmd1bGFyLlRoaXNSZWNlaXZlcikge1xuICAgIHJldHVybiB7IHJvb3Q6IFwiY29tcG9uZW50XCIsIHNlZ21lbnRzOiBbXSB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBhbmd1bGFyLlByb3BlcnR5UmVhZCB8fFxuICAgIGV4cHJlc3Npb24gaW5zdGFuY2VvZiBhbmd1bGFyLlNhZmVQcm9wZXJ0eVJlYWRcbiAgKSB7XG4gICAgY29uc3QgcGFyZW50UGF0aCA9IGdldE1lbWJlclBhdGgoZXhwcmVzc2lvbi5yZWNlaXZlcik7XG4gICAgcmV0dXJuIHBhcmVudFBhdGggPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDoge1xuICAgICAgICAgIC4uLnBhcmVudFBhdGgsXG4gICAgICAgICAgc2VnbWVudHM6IFsuLi5wYXJlbnRQYXRoLnNlZ21lbnRzLCB7IG5hbWU6IGV4cHJlc3Npb24ubmFtZSB9XSxcbiAgICAgICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBleHByZXNzaW9uIGluc3RhbmNlb2YgYW5ndWxhci5DYWxsIHx8XG4gICAgZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGFuZ3VsYXIuU2FmZUNhbGxcbiAgKSB7XG4gICAgaWYgKGV4cHJlc3Npb24uYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGNhbGxlZVBhdGggPSBnZXRNZW1iZXJQYXRoKGV4cHJlc3Npb24ucmVjZWl2ZXIpO1xuICAgIHJldHVybiBjYWxsZWVQYXRoID09PSB1bmRlZmluZWRcbiAgICAgID8gdW5kZWZpbmVkXG4gICAgICA6IHsgLi4uY2FsbGVlUGF0aCwgc2VnbWVudHM6IFsuLi5jYWxsZWVQYXRoLnNlZ21lbnRzLCB7IGNhbGw6IHRydWUgfV0gfTtcbiAgfVxuXG4gIGlmIChleHByZXNzaW9uIGluc3RhbmNlb2YgYW5ndWxhci5QYXJlbnRoZXNpemVkRXhwcmVzc2lvbikge1xuICAgIHJldHVybiBnZXRNZW1iZXJQYXRoKGV4cHJlc3Npb24uZXhwcmVzc2lvbik7XG4gIH1cblxuICByZXR1cm4gZXhwcmVzc2lvbiBpbnN0YW5jZW9mIGFuZ3VsYXIuTm9uTnVsbEFzc2VydFxuICAgID8gZ2V0TWVtYmVyUGF0aChleHByZXNzaW9uLmV4cHJlc3Npb24pXG4gICAgOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCByZXNvbHZlVGVtcGxhdGVQYXRoID0gKFxuICB0ZW1wbGF0ZVBhdGg6IFRlbXBsYXRlTWVtYmVyUGF0aCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxzOiBUZW1wbGF0ZUxvY2FscyxcbiAgdXNhZ2U6IFRlbXBsYXRlVXNhZ2VDb250ZXh0LFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IGV4cGFuZFRlbXBsYXRlTG9jYWxzKHRlbXBsYXRlUGF0aCwgbG9jYWxzKTtcbiAgaWYgKHJlc29sdmVkUGF0aCA9PT0gdW5kZWZpbmVkIHx8IHJlc29sdmVkUGF0aC5zZWdtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IHNlZ21lbnRzIH0gPSByZXNvbHZlZFBhdGg7XG4gIGNvbnN0IFtmaXJzdFNlZ21lbnRdID0gc2VnbWVudHM7XG5cbiAgaWYgKGZpcnN0U2VnbWVudCA9PT0gdW5kZWZpbmVkIHx8ICEoXCJuYW1lXCIgaW4gZmlyc3RTZWdtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBjdXJyZW50VHlwZSA9IHVzYWdlLmNoZWNrZXIuZ2V0RGVjbGFyZWRUeXBlT2ZTeW1ib2woXG4gICAgdXNhZ2UuY29tcG9uZW50U3ltYm9sLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBzZWdtZW50XSBvZiBzZWdtZW50cy5lbnRyaWVzKCkpIHtcbiAgICBpZiAoXCJjYWxsXCIgaW4gc2VnbWVudCkge1xuICAgICAgY29uc3QgW3NpZ25hdHVyZV0gPSB1c2FnZS5jaGVja2VyLmdldFNpZ25hdHVyZXNPZlR5cGUoXG4gICAgICAgIGN1cnJlbnRUeXBlLFxuICAgICAgICB0cy5TaWduYXR1cmVLaW5kLkNhbGwsXG4gICAgICApO1xuICAgICAgaWYgKHNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY3VycmVudFR5cGUgPSB1c2FnZS5jaGVja2VyLmdldFJldHVyblR5cGVPZlNpZ25hdHVyZShzaWduYXR1cmUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgcHJvcGVydHkgPSB1c2FnZS5jaGVja2VyLmdldFByb3BlcnR5T2ZUeXBlKFxuICAgICAgdXNhZ2UuY2hlY2tlci5nZXROb25OdWxsYWJsZVR5cGUoY3VycmVudFR5cGUpLFxuICAgICAgc2VnbWVudC5uYW1lLFxuICAgICk7XG4gICAgaWYgKHByb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBpc1NhbWVTeW1ib2wocHJvcGVydHksIHVzYWdlLm1lbWJlci5tZW1iZXJTeW1ib2wpO1xuICAgIH1cblxuICAgIGN1cnJlbnRUeXBlID0gdXNhZ2UuY2hlY2tlci5nZXRUeXBlT2ZTeW1ib2xBdExvY2F0aW9uKFxuICAgICAgcHJvcGVydHksXG4gICAgICB1c2FnZS5jb21wb25lbnQsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGV4cGFuZFRlbXBsYXRlTG9jYWxzID0gKFxuICB0ZW1wbGF0ZVBhdGg6IFRlbXBsYXRlTWVtYmVyUGF0aCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxzOiBUZW1wbGF0ZUxvY2FscyxcbiAgdmlzaXRlZExvY2FsczogUmVhZG9ubHlTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKSxcbik6IFRlbXBsYXRlTWVtYmVyUGF0aCB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICh0ZW1wbGF0ZVBhdGg/LnJvb3QgIT09IFwiaW1wbGljaXRcIikge1xuICAgIHJldHVybiB0ZW1wbGF0ZVBhdGg7XG4gIH1cblxuICBjb25zdCBbZmlyc3RTZWdtZW50XSA9IHRlbXBsYXRlUGF0aC5zZWdtZW50cztcbiAgaWYgKFxuICAgIGZpcnN0U2VnbWVudCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgIShcIm5hbWVcIiBpbiBmaXJzdFNlZ21lbnQpIHx8XG4gICAgIWxvY2Fscy5oYXMoZmlyc3RTZWdtZW50Lm5hbWUpXG4gICkge1xuICAgIHJldHVybiB0ZW1wbGF0ZVBhdGg7XG4gIH1cblxuICBjb25zdCBsb2NhbE5hbWUgPSBmaXJzdFNlZ21lbnQubmFtZTtcbiAgY29uc3QgbG9jYWxWYWx1ZSA9IGxvY2Fscy5nZXQobG9jYWxOYW1lKTtcbiAgaWYgKGxvY2FsVmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2aXNpdGVkTG9jYWxzLmhhcyhsb2NhbE5hbWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGxvY2FsUGF0aCA9IGdldE1lbWJlclBhdGgobG9jYWxWYWx1ZSk7XG4gIHJldHVybiBleHBhbmRUZW1wbGF0ZUxvY2FscyhcbiAgICBsb2NhbFBhdGggPT09IHVuZGVmaW5lZFxuICAgICAgPyB1bmRlZmluZWRcbiAgICAgIDoge1xuICAgICAgICAgIC4uLmxvY2FsUGF0aCxcbiAgICAgICAgICBzZWdtZW50czogWy4uLmxvY2FsUGF0aC5zZWdtZW50cywgLi4udGVtcGxhdGVQYXRoLnNlZ21lbnRzLnNsaWNlKDEpXSxcbiAgICAgICAgfSxcbiAgICBsb2NhbHMsXG4gICAgbmV3IFNldChbLi4udmlzaXRlZExvY2FscywgbG9jYWxOYW1lXSksXG4gICk7XG59O1xuXG5leHBvcnQgeyBleHByZXNzaW9uVXNlc01lbWJlciB9O1xuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { AngularTemplateNode, TemplateLocals, TemplateUsageContext } from "./angular-template-usage-context.js";
|
|
2
|
+
declare const templateNodesUseMember: (nodes: AngularTemplateNode[], inheritedLocals: TemplateLocals, usage: TemplateUsageContext) => boolean;
|
|
3
|
+
export { templateNodesUseMember };
|
|
4
|
+
//# sourceMappingURL=angular-template-node-usage-utilities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-template-node-usage-utilities.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/angular-template-node-usage-utilities.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,kCAAkC,CAAC;AAM1C,QAAA,MAAM,sBAAsB,GAC1B,OAAO,mBAAmB,EAAE,EAC5B,iBAAiB,cAAc,EAC/B,OAAO,oBAAoB,KAC1B,OAgBF,CAAC;AAmEF,OAAO,EAAE,sBAAsB,EAAE,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import { blockUsesMember } from "./angular-template-block-usage-utilities.js";
|
|
3
|
+
import { expressionUsesMember } from "./angular-template-expression-utilities.js";
|
|
4
|
+
import { withNames } from "./angular-template-usage-context.js";
|
|
5
|
+
const templateNodesUseMember = (nodes, inheritedLocals, usage) => {
|
|
6
|
+
const locals = new Map(inheritedLocals);
|
|
7
|
+
for (const node of nodes) {
|
|
8
|
+
if (node instanceof angular.TmplAstLetDeclaration) {
|
|
9
|
+
if (expressionUsesMember(node.value, locals, usage)) {
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
locals.set(node.name, node.value);
|
|
13
|
+
}
|
|
14
|
+
else if (nodeUsesMember(node, locals, usage)) {
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return false;
|
|
19
|
+
};
|
|
20
|
+
const nodeUsesMember = (node, locals, usage) => {
|
|
21
|
+
if (node instanceof angular.TmplAstBoundText) {
|
|
22
|
+
return expressionUsesMember(node.value, locals, usage);
|
|
23
|
+
}
|
|
24
|
+
if (node instanceof angular.TmplAstElement) {
|
|
25
|
+
return (inputsUseMember(node.inputs, locals, usage) ||
|
|
26
|
+
eventsUseMember(node.outputs, locals, usage) ||
|
|
27
|
+
templateNodesUseMember(node.children, withNames(locals, node.references.map(({ name }) => name)), usage));
|
|
28
|
+
}
|
|
29
|
+
if (node instanceof angular.TmplAstTemplate) {
|
|
30
|
+
const templateLocals = withNames(locals, [...node.variables, ...node.references].map(({ name }) => name));
|
|
31
|
+
return (inputsUseMember(node.inputs, locals, usage) ||
|
|
32
|
+
eventsUseMember(node.outputs, locals, usage) ||
|
|
33
|
+
node.templateAttrs.some((attribute) => attribute instanceof angular.TmplAstBoundAttribute &&
|
|
34
|
+
expressionUsesMember(attribute.value, locals, usage)) ||
|
|
35
|
+
templateNodesUseMember(node.children, templateLocals, usage));
|
|
36
|
+
}
|
|
37
|
+
return node instanceof angular.TmplAstContent
|
|
38
|
+
? templateNodesUseMember(node.children, locals, usage)
|
|
39
|
+
: blockUsesMember(node, locals, usage, templateNodesUseMember);
|
|
40
|
+
};
|
|
41
|
+
const inputsUseMember = (inputs, locals, usage) => inputs.some((input) => expressionUsesMember(input.value, locals, usage));
|
|
42
|
+
const eventsUseMember = (events, locals, usage) => {
|
|
43
|
+
const eventLocals = withNames(locals, ["$event"]);
|
|
44
|
+
return events.some((event) => expressionUsesMember(event.handler, eventLocals, usage));
|
|
45
|
+
};
|
|
46
|
+
export { templateNodesUseMember };
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10ZW1wbGF0ZS1ub2RlLXVzYWdlLXV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hZGFwdGVycy9hbmd1bGFyL2FuZ3VsYXItdGVtcGxhdGUtbm9kZS11c2FnZS11dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQVE3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDM0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBRTdELE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsS0FBNEIsRUFDNUIsZUFBK0IsRUFDL0IsS0FBMkIsRUFDbEIsRUFBRTtJQUNYLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXhDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLFlBQVksT0FBTyxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDbEQsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNwRCxPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLGNBQWMsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDL0MsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFj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b20gXCJAYW5ndWxhci9jb21waWxlclwiO1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFuZ3VsYXJUZW1wbGF0ZU5vZGUsXG4gIFRlbXBsYXRlTG9jYWxzLFxuICBUZW1wbGF0ZVVzYWdlQ29udGV4dCxcbn0gZnJvbSBcIi4vYW5ndWxhci10ZW1wbGF0ZS11c2FnZS1jb250ZXh0XCI7XG5cbmltcG9ydCB7IGJsb2NrVXNlc01lbWJlciB9IGZyb20gXCIuL2FuZ3VsYXItdGVtcGxhdGUtYmxvY2stdXNhZ2UtdXRpbGl0aWVzXCI7XG5pbXBvcnQgeyBleHByZXNzaW9uVXNlc01lbWJlciB9IGZyb20gXCIuL2FuZ3VsYXItdGVtcGxhdGUtZXhwcmVzc2lvbi11dGlsaXRpZXNcIjtcbmltcG9ydCB7IHdpdGhOYW1lcyB9IGZyb20gXCIuL2FuZ3VsYXItdGVtcGxhdGUtdXNhZ2UtY29udGV4dFwiO1xuXG5jb25zdCB0ZW1wbGF0ZU5vZGVzVXNlTWVtYmVyID0gKFxuICBub2RlczogQW5ndWxhclRlbXBsYXRlTm9kZVtdLFxuICBpbmhlcml0ZWRMb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgbG9jYWxzID0gbmV3IE1hcChpbmhlcml0ZWRMb2NhbHMpO1xuXG4gIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgIGlmIChub2RlIGluc3RhbmNlb2YgYW5ndWxhci5UbXBsQXN0TGV0RGVjbGFyYXRpb24pIHtcbiAgICAgIGlmIChleHByZXNzaW9uVXNlc01lbWJlcihub2RlLnZhbHVlLCBsb2NhbHMsIHVzYWdlKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgbG9jYWxzLnNldChub2RlLm5hbWUsIG5vZGUudmFsdWUpO1xuICAgIH0gZWxzZSBpZiAobm9kZVVzZXNNZW1iZXIobm9kZSwgbG9jYWxzLCB1c2FnZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IG5vZGVVc2VzTWVtYmVyID0gKFxuICBub2RlOiBBbmd1bGFyVGVtcGxhdGVOb2RlLFxuICBsb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RCb3VuZFRleHQpIHtcbiAgICByZXR1cm4gZXhwcmVzc2lvblVzZXNNZW1iZXIobm9kZS52YWx1ZSwgbG9jYWxzLCB1c2FnZSk7XG4gIH1cblxuICBpZiAobm9kZSBpbnN0YW5jZW9mIGFuZ3VsYXIuVG1wbEFzdEVsZW1lbnQpIHtcbiAgICByZXR1cm4gKFxuICAgICAgaW5wdXRzVXNlTWVtYmVyKG5vZGUuaW5wdXRzLCBsb2NhbHMsIHVzYWdlKSB8fFxuICAgICAgZXZlbnRzVXNlTWVtYmVyKG5vZGUub3V0cHV0cywgbG9jYWxzLCB1c2FnZSkgfHxcbiAgICAgIHRlbXBsYXRlTm9kZXNVc2VNZW1iZXIoXG4gICAgICAgIG5vZGUuY2hpbGRyZW4sXG4gICAgICAgIHdpdGhOYW1lcyhcbiAgICAgICAgICBsb2NhbHMsXG4gICAgICAgICAgbm9kZS5yZWZlcmVuY2VzLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICAgICApLFxuICAgICAgICB1c2FnZSxcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgaWYgKG5vZGUgaW5zdGFuY2VvZiBhbmd1bGFyLlRtcGxBc3RUZW1wbGF0ZSkge1xuICAgIGNvbnN0IHRlbXBsYXRlTG9jYWxzID0gd2l0aE5hbWVzKFxuICAgICAgbG9jYWxzLFxuICAgICAgWy4uLm5vZGUudmFyaWFibGVzLCAuLi5ub2RlLnJlZmVyZW5jZXNdLm1hcCgoeyBuYW1lIH0pID0+IG5hbWUpLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgaW5wdXRzVXNlTWVtYmVyKG5vZGUuaW5wdXRzLCBsb2NhbHMsIHVzYWdlKSB8fFxuICAgICAgZXZlbnRzVXNlTWVtYmVyKG5vZGUub3V0cHV0cywgbG9jYWxzLCB1c2FnZSkgfHxcbiAgICAgIG5vZGUudGVtcGxhdGVBdHRycy5zb21lKFxuICAgICAgICAoYXR0cmlidXRlKSA9PlxuICAgICAgICAgIGF0dHJpYnV0ZSBpbnN0YW5jZW9mIGFuZ3VsYXIuVG1wbEFzdEJvdW5kQXR0cmlidXRlICYmXG4gICAgICAgICAgZXhwcmVzc2lvblVzZXNNZW1iZXIoYXR0cmlidXRlLnZhbHVlLCBsb2NhbHMsIHVzYWdlKSxcbiAgICAgICkgfHxcbiAgICAgIHRlbXBsYXRlTm9kZXNVc2VNZW1iZXIobm9kZS5jaGlsZHJlbiwgdGVtcGxhdGVMb2NhbHMsIHVzYWdlKVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIGFuZ3VsYXIuVG1wbEFzdENvbnRlbnRcbiAgICA/IHRlbXBsYXRlTm9kZXNVc2VNZW1iZXIobm9kZS5jaGlsZHJlbiwgbG9jYWxzLCB1c2FnZSlcbiAgICA6IGJsb2NrVXNlc01lbWJlcihub2RlLCBsb2NhbHMsIHVzYWdlLCB0ZW1wbGF0ZU5vZGVzVXNlTWVtYmVyKTtcbn07XG5cbmNvbnN0IGlucHV0c1VzZU1lbWJlciA9IChcbiAgaW5wdXRzOiByZWFkb25seSBhbmd1bGFyLlRtcGxBc3RCb3VuZEF0dHJpYnV0ZVtdLFxuICBsb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQsXG4pOiBib29sZWFuID0+XG4gIGlucHV0cy5zb21lKChpbnB1dCkgPT4gZXhwcmVzc2lvblVzZXNNZW1iZXIoaW5wdXQudmFsdWUsIGxvY2FscywgdXNhZ2UpKTtcblxuY29uc3QgZXZlbnRzVXNlTWVtYmVyID0gKFxuICBldmVudHM6IHJlYWRvbmx5IGFuZ3VsYXIuVG1wbEFzdEJvdW5kRXZlbnRbXSxcbiAgbG9jYWxzOiBUZW1wbGF0ZUxvY2FscyxcbiAgdXNhZ2U6IFRlbXBsYXRlVXNhZ2VDb250ZXh0LFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IGV2ZW50TG9jYWxzID0gd2l0aE5hbWVzKGxvY2FscywgW1wiJGV2ZW50XCJdKTtcbiAgcmV0dXJuIGV2ZW50cy5zb21lKChldmVudCkgPT5cbiAgICBleHByZXNzaW9uVXNlc01lbWJlcihldmVudC5oYW5kbGVyLCBldmVudExvY2FscywgdXNhZ2UpLFxuICApO1xufTtcblxuZXhwb3J0IHsgdGVtcGxhdGVOb2Rlc1VzZU1lbWJlciB9O1xuIl19
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
import type { PublicMember } from "../../domain/architecture/no-unused-public-members/member-declaration-utilities.js";
|
|
4
|
+
type AngularTemplateNode = ReturnType<typeof angular.parseTemplate>["nodes"][number];
|
|
5
|
+
type MemberPathSegment = {
|
|
6
|
+
call: true;
|
|
7
|
+
} | {
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
type TemplateLocals = ReadonlyMap<string, angular.AST | undefined>;
|
|
11
|
+
interface TemplateMemberPath {
|
|
12
|
+
root: "component" | "implicit";
|
|
13
|
+
segments: MemberPathSegment[];
|
|
14
|
+
}
|
|
15
|
+
type TemplateNodeVisitor = (nodes: AngularTemplateNode[], locals: TemplateLocals, usage: TemplateUsageContext) => boolean;
|
|
16
|
+
interface TemplateUsageContext {
|
|
17
|
+
checker: ts.TypeChecker;
|
|
18
|
+
component: ts.ClassDeclaration;
|
|
19
|
+
componentSymbol: ts.Symbol;
|
|
20
|
+
member: PublicMember;
|
|
21
|
+
}
|
|
22
|
+
declare const withNames: (locals: TemplateLocals, names: readonly string[]) => TemplateLocals;
|
|
23
|
+
declare const withAlias: (locals: TemplateLocals, name: string, value: angular.AST) => TemplateLocals;
|
|
24
|
+
export type { AngularTemplateNode, TemplateLocals, TemplateMemberPath, TemplateNodeVisitor, TemplateUsageContext, };
|
|
25
|
+
export { withAlias, withNames };
|
|
26
|
+
//# sourceMappingURL=angular-template-usage-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular-template-usage-context.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/angular-template-usage-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,MAAM,YAAY,CAAC;AAEjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iFAAiF,CAAC;AAEpH,KAAK,mBAAmB,GAAG,UAAU,CACnC,OAAO,OAAO,CAAC,aAAa,CAC7B,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnB,KAAK,iBAAiB,GAAG;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,KAAK,cAAc,GAAG,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAEnE,UAAU,kBAAkB;IAC1B,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC;IAC/B,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,KAAK,mBAAmB,GAAG,CACzB,KAAK,EAAE,mBAAmB,EAAE,EAC5B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,oBAAoB,KACxB,OAAO,CAAC;AAEb,UAAU,oBAAoB;IAC5B,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;IACxB,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC;IAC/B,eAAe,EAAE,EAAE,CAAC,MAAM,CAAC;IAC3B,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,QAAA,MAAM,SAAS,GACb,QAAQ,cAAc,EACtB,OAAO,SAAS,MAAM,EAAE,KACvB,cAMF,CAAC;AAEF,QAAA,MAAM,SAAS,GACb,QAAQ,cAAc,EACtB,MAAM,MAAM,EACZ,OAAO,OAAO,CAAC,GAAG,KACjB,cAAqD,CAAC;AAEzD,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,GACrB,CAAC;AACF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import * as ts from "typescript";
|
|
3
|
+
const withNames = (locals, names) => {
|
|
4
|
+
const extended = new Map(locals);
|
|
5
|
+
for (const name of names) {
|
|
6
|
+
extended.set(name, undefined);
|
|
7
|
+
}
|
|
8
|
+
return extended;
|
|
9
|
+
};
|
|
10
|
+
const withAlias = (locals, name, value) => new Map([...locals, [name, value]]);
|
|
11
|
+
export { withAlias, withNames };
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10ZW1wbGF0ZS11c2FnZS1jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2FuZ3VsYXIvYW5ndWxhci10ZW1wbGF0ZS11c2FnZS1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sbUJBQW1CLENBQUM7QUFDN0MsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUE4QmpDLE1BQU0sU0FBUyxHQUFHLENBQ2hCLE1BQXNCLEVBQ3RCLEtBQXdCLEVBQ1IsRUFBRTtJQUNsQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxDQUNoQixNQUFzQixFQUN0QixJQUFZLEVBQ1osS0FBa0IsRUFDRixFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFTekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFuZ3VsYXIgZnJvbSBcIkBhbmd1bGFyL2NvbXBpbGVyXCI7XG5pbXBvcnQgKiBhcyB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuXG5pbXBvcnQgdHlwZSB7IFB1YmxpY01lbWJlciB9IGZyb20gXCIuLi8uLi9kb21haW4vYXJjaGl0ZWN0dXJlL25vLXVudXNlZC1wdWJsaWMtbWVtYmVycy9tZW1iZXItZGVjbGFyYXRpb24tdXRpbGl0aWVzXCI7XG5cbnR5cGUgQW5ndWxhclRlbXBsYXRlTm9kZSA9IFJldHVyblR5cGU8XG4gIHR5cGVvZiBhbmd1bGFyLnBhcnNlVGVtcGxhdGVcbj5bXCJub2Rlc1wiXVtudW1iZXJdO1xuXG50eXBlIE1lbWJlclBhdGhTZWdtZW50ID0geyBjYWxsOiB0cnVlIH0gfCB7IG5hbWU6IHN0cmluZyB9O1xuXG50eXBlIFRlbXBsYXRlTG9jYWxzID0gUmVhZG9ubHlNYXA8c3RyaW5nLCBhbmd1bGFyLkFTVCB8IHVuZGVmaW5lZD47XG5cbmludGVyZmFjZSBUZW1wbGF0ZU1lbWJlclBhdGgge1xuICByb290OiBcImNvbXBvbmVudFwiIHwgXCJpbXBsaWNpdFwiO1xuICBzZWdtZW50czogTWVtYmVyUGF0aFNlZ21lbnRbXTtcbn1cblxudHlwZSBUZW1wbGF0ZU5vZGVWaXNpdG9yID0gKFxuICBub2RlczogQW5ndWxhclRlbXBsYXRlTm9kZVtdLFxuICBsb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQsXG4pID0+IGJvb2xlYW47XG5cbmludGVyZmFjZSBUZW1wbGF0ZVVzYWdlQ29udGV4dCB7XG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyO1xuICBjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb247XG4gIGNvbXBvbmVudFN5bWJvbDogdHMuU3ltYm9sO1xuICBtZW1iZXI6IFB1YmxpY01lbWJlcjtcbn1cblxuY29uc3Qgd2l0aE5hbWVzID0gKFxuICBsb2NhbHM6IFRlbXBsYXRlTG9jYWxzLFxuICBuYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBUZW1wbGF0ZUxvY2FscyA9PiB7XG4gIGNvbnN0IGV4dGVuZGVkID0gbmV3IE1hcChsb2NhbHMpO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICBleHRlbmRlZC5zZXQobmFtZSwgdW5kZWZpbmVkKTtcbiAgfVxuICByZXR1cm4gZXh0ZW5kZWQ7XG59O1xuXG5jb25zdCB3aXRoQWxpYXMgPSAoXG4gIGxvY2FsczogVGVtcGxhdGVMb2NhbHMsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IGFuZ3VsYXIuQVNULFxuKTogVGVtcGxhdGVMb2NhbHMgPT4gbmV3IE1hcChbLi4ubG9jYWxzLCBbbmFtZSwgdmFsdWVdXSk7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQW5ndWxhclRlbXBsYXRlTm9kZSxcbiAgVGVtcGxhdGVMb2NhbHMsXG4gIFRlbXBsYXRlTWVtYmVyUGF0aCxcbiAgVGVtcGxhdGVOb2RlVmlzaXRvcixcbiAgVGVtcGxhdGVVc2FnZUNvbnRleHQsXG59O1xuZXhwb3J0IHsgd2l0aEFsaWFzLCB3aXRoTmFtZXMgfTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { codeperfectAngularPlugin } from "./plugin.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvYW5ndWxhci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBjb2RlcGVyZmVjdEFuZ3VsYXJQbHVnaW4gfSBmcm9tIFwiLi9wbHVnaW5cIjtcbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MemberUsageAdapter } from "../../domain/architecture/no-unused-public-members/member-usage-utilities.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolves public-member usage in statically declared Angular templates.
|
|
4
|
+
* @param sourceFile TypeScript source file being inspected.
|
|
5
|
+
* @param checker TypeScript checker for the project.
|
|
6
|
+
* @param member Public member whose template usage is being checked.
|
|
7
|
+
* @returns Whether an Angular template references the member.
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const used = angularTemplateUsageAdapter(sourceFile, checker, member);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
declare const angularTemplateUsageAdapter: MemberUsageAdapter;
|
|
14
|
+
export { angularTemplateUsageAdapter };
|
|
15
|
+
//# sourceMappingURL=no-unused-public-members-template-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-unused-public-members-template-adapter.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/no-unused-public-members-template-adapter.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2EAA2E,CAAC;AAsBpH;;;;;;;;;;GAUG;AACH,QAAA,MAAM,2BAA2B,EAAE,kBAqB/B,CAAC;AA8IL,OAAO,EAAE,2BAA2B,EAAE,CAAC"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import * as angular from "@angular/compiler";
|
|
2
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import * as ts from "typescript";
|
|
5
|
+
import { templateNodesUseMember } from "./angular-template-node-usage-utilities.js";
|
|
6
|
+
const componentTemplateCache = new WeakMap();
|
|
7
|
+
const parsedTemplateCache = new WeakMap();
|
|
8
|
+
/**
|
|
9
|
+
* Resolves public-member usage in statically declared Angular templates.
|
|
10
|
+
* @param sourceFile TypeScript source file being inspected.
|
|
11
|
+
* @param checker TypeScript checker for the project.
|
|
12
|
+
* @param member Public member whose template usage is being checked.
|
|
13
|
+
* @returns Whether an Angular template references the member.
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const used = angularTemplateUsageAdapter(sourceFile, checker, member);
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
const angularTemplateUsageAdapter = (sourceFile, checker, member) => sourceFile.statements.some((statement) => {
|
|
20
|
+
if (!ts.isClassDeclaration(statement)) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
const template = getComponentTemplate(statement, sourceFile, checker);
|
|
24
|
+
const componentSymbol = statement.name === undefined
|
|
25
|
+
? undefined
|
|
26
|
+
: checker.getSymbolAtLocation(statement.name);
|
|
27
|
+
return (template !== undefined &&
|
|
28
|
+
componentSymbol !== undefined &&
|
|
29
|
+
templateUsesMember(template, statement, componentSymbol, checker, member));
|
|
30
|
+
});
|
|
31
|
+
const getComponentTemplate = (declaration, sourceFile, checker) => {
|
|
32
|
+
if (componentTemplateCache.has(declaration)) {
|
|
33
|
+
return componentTemplateCache.get(declaration);
|
|
34
|
+
}
|
|
35
|
+
const decorators = ts.canHaveDecorators(declaration)
|
|
36
|
+
? (ts.getDecorators(declaration) ?? [])
|
|
37
|
+
: [];
|
|
38
|
+
for (const decorator of decorators) {
|
|
39
|
+
if (!ts.isCallExpression(decorator.expression) ||
|
|
40
|
+
!ts.isIdentifier(decorator.expression.expression) ||
|
|
41
|
+
!isAngularComponentImport(decorator.expression.expression, checker)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const [metadata] = decorator.expression.arguments;
|
|
45
|
+
if (metadata === undefined || !ts.isObjectLiteralExpression(metadata)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
for (const property of metadata.properties) {
|
|
49
|
+
if (!ts.isPropertyAssignment(property) ||
|
|
50
|
+
(!ts.isIdentifier(property.name) &&
|
|
51
|
+
!ts.isStringLiteralLike(property.name))) {
|
|
52
|
+
continue;
|
|
53
|
+
}
|
|
54
|
+
if (property.name.text === "template" &&
|
|
55
|
+
ts.isStringLiteralLike(property.initializer)) {
|
|
56
|
+
const template = {
|
|
57
|
+
content: property.initializer.text,
|
|
58
|
+
filePath: sourceFile.fileName,
|
|
59
|
+
};
|
|
60
|
+
componentTemplateCache.set(declaration, template);
|
|
61
|
+
return template;
|
|
62
|
+
}
|
|
63
|
+
if (property.name.text === "templateUrl" &&
|
|
64
|
+
ts.isStringLiteralLike(property.initializer)) {
|
|
65
|
+
const filePath = path.resolve(path.dirname(sourceFile.fileName), property.initializer.text);
|
|
66
|
+
const template = readTemplateFile(filePath);
|
|
67
|
+
componentTemplateCache.set(declaration, template);
|
|
68
|
+
return template;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
componentTemplateCache.set(declaration, undefined);
|
|
73
|
+
return undefined;
|
|
74
|
+
};
|
|
75
|
+
const isAngularComponentImport = (identifier, checker) => checker.getSymbolAtLocation(identifier)?.declarations?.some((declaration) => {
|
|
76
|
+
if (!ts.isImportSpecifier(declaration)) {
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
79
|
+
const importClause = declaration.parent.parent;
|
|
80
|
+
if (!ts.isImportClause(importClause)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
const importDeclaration = importClause.parent;
|
|
84
|
+
return (ts.isImportDeclaration(importDeclaration) &&
|
|
85
|
+
ts.isStringLiteral(importDeclaration.moduleSpecifier) &&
|
|
86
|
+
importDeclaration.moduleSpecifier.text === "@angular/core" &&
|
|
87
|
+
(declaration.propertyName?.text ?? declaration.name.text) === "Component");
|
|
88
|
+
}) ?? false;
|
|
89
|
+
const readTemplateFile = (filePath) => {
|
|
90
|
+
if (!existsSync(filePath)) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
try {
|
|
94
|
+
return { content: readFileSync(filePath, "utf8"), filePath };
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const templateUsesMember = (template, component, componentSymbol, checker, member) => {
|
|
101
|
+
const nodes = getParsedTemplateNodes(template, component);
|
|
102
|
+
if (nodes === undefined) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const usage = {
|
|
106
|
+
checker,
|
|
107
|
+
component,
|
|
108
|
+
componentSymbol,
|
|
109
|
+
member,
|
|
110
|
+
};
|
|
111
|
+
return templateNodesUseMember(nodes, new Map(), usage);
|
|
112
|
+
};
|
|
113
|
+
const getParsedTemplateNodes = (template, component) => {
|
|
114
|
+
if (parsedTemplateCache.has(component)) {
|
|
115
|
+
return parsedTemplateCache.get(component);
|
|
116
|
+
}
|
|
117
|
+
const parsed = angular.parseTemplate(template.content, template.filePath, {
|
|
118
|
+
enableBlockSyntax: true,
|
|
119
|
+
enableLetSyntax: true,
|
|
120
|
+
});
|
|
121
|
+
const nodes = parsed.errors === null ? parsed.nodes : undefined;
|
|
122
|
+
parsedTemplateCache.set(component, nodes);
|
|
123
|
+
return nodes;
|
|
124
|
+
};
|
|
125
|
+
export { angularTemplateUsageAdapter };
|
|
126
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzLXRlbXBsYXRlLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvYW5ndWxhci9uby11bnVzZWQtcHVibGljLW1lbWJlcnMtdGVtcGxhdGUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ25ELE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQVNqQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQU9qRixNQUFNLHNCQUFzQixHQUFHLElBQUksT0FBTyxFQUd2QyxDQUFDO0FBQ0osTUFBTSxtQkFBbUIsR0FBRyxJQUFJLE9BQU8sRUFHcEMsQ0FBQztBQUVKOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLDJCQUEyQixHQUF1QixDQUN0RCxVQUFVLEVBQ1YsT0FBTyxFQUNQLE1BQU0sRUFDTixFQUFFLENBQ0YsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtJQUN2QyxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDdEMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsb0JBQW9CLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0RSxNQUFNLGVBQWUsR0FDbkIsU0FBUyxDQUFDLElBQUksS0FBSyxTQUFTO1FBQzFCLENBQUMsQ0FBQyxTQUFTO1FBQ1gsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFD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LE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNoRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDO0FBRUYsT0FBTyxFQUFFLDJCQUEyQixFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gXCJAYW5ndWxhci9jb21waWxlclwiO1xuaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5cbmltcG9ydCB0eXBlIHsgUHVibGljTWVtYmVyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci1kZWNsYXJhdGlvbi11dGlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHsgTWVtYmVyVXNhZ2VBZGFwdGVyIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9hcmNoaXRlY3R1cmUvbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzL21lbWJlci11c2FnZS11dGlsaXRpZXNcIjtcbmltcG9ydCB0eXBlIHtcbiAgQW5ndWxhclRlbXBsYXRlTm9kZSxcbiAgVGVtcGxhdGVVc2FnZUNvbnRleHQsXG59IGZyb20gXCIuL2FuZ3VsYXItdGVtcGxhdGUtdXNhZ2UtY29udGV4dFwiO1xuXG5pbXBvcnQgeyB0ZW1wbGF0ZU5vZGVzVXNlTWVtYmVyIH0gZnJvbSBcIi4vYW5ndWxhci10ZW1wbGF0ZS1ub2RlLXVzYWdlLXV0aWxpdGllc1wiO1xuXG5pbnRlcmZhY2UgQ29tcG9uZW50VGVtcGxhdGUge1xuICBjb250ZW50OiBzdHJpbmc7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG59XG5cbmNvbnN0IGNvbXBvbmVudFRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgQ29tcG9uZW50VGVtcGxhdGUgfCB1bmRlZmluZWRcbj4oKTtcbmNvbnN0IHBhcnNlZFRlbXBsYXRlQ2FjaGUgPSBuZXcgV2Vha01hcDxcbiAgdHMuQ2xhc3NEZWNsYXJhdGlvbixcbiAgQW5ndWxhclRlbXBsYXRlTm9kZVtdIHwgdW5kZWZpbmVkXG4+KCk7XG5cbi8qKlxuICogUmVzb2x2ZXMgcHVibGljLW1lbWJlciB1c2FnZSBpbiBzdGF0aWNhbGx5IGRlY2xhcmVkIEFuZ3VsYXIgdGVtcGxhdGVzLlxuICogQHBhcmFtIHNvdXJjZUZpbGUgVHlwZVNjcmlwdCBzb3VyY2UgZmlsZSBiZWluZyBpbnNwZWN0ZWQuXG4gKiBAcGFyYW0gY2hlY2tlciBUeXBlU2NyaXB0IGNoZWNrZXIgZm9yIHRoZSBwcm9qZWN0LlxuICogQHBhcmFtIG1lbWJlciBQdWJsaWMgbWVtYmVyIHdob3NlIHRlbXBsYXRlIHVzYWdlIGlzIGJlaW5nIGNoZWNrZWQuXG4gKiBAcmV0dXJucyBXaGV0aGVyIGFuIEFuZ3VsYXIgdGVtcGxhdGUgcmVmZXJlbmNlcyB0aGUgbWVtYmVyLlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHVzZWQgPSBhbmd1bGFyVGVtcGxhdGVVc2FnZUFkYXB0ZXIoc291cmNlRmlsZSwgY2hlY2tlciwgbWVtYmVyKTtcbiAqIGBgYFxuICovXG5jb25zdCBhbmd1bGFyVGVtcGxhdGVVc2FnZUFkYXB0ZXI6IE1lbWJlclVzYWdlQWRhcHRlciA9IChcbiAgc291cmNlRmlsZSxcbiAgY2hlY2tlcixcbiAgbWVtYmVyLFxuKSA9PlxuICBzb3VyY2VGaWxlLnN0YXRlbWVudHMuc29tZSgoc3RhdGVtZW50KSA9PiB7XG4gICAgaWYgKCF0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHRlbXBsYXRlID0gZ2V0Q29tcG9uZW50VGVtcGxhdGUoc3RhdGVtZW50LCBzb3VyY2VGaWxlLCBjaGVja2VyKTtcbiAgICBjb25zdCBjb21wb25lbnRTeW1ib2wgPVxuICAgICAgc3RhdGVtZW50Lm5hbWUgPT09IHVuZGVmaW5lZFxuICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICA6IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihzdGF0ZW1lbnQubmFtZSk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgdGVtcGxhdGUgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgY29tcG9uZW50U3ltYm9sICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHRlbXBsYXRlVXNlc01lbWJlcih0ZW1wbGF0ZSwgc3RhdGVtZW50LCBjb21wb25lbnRTeW1ib2wsIGNoZWNrZXIsIG1lbWJlcilcbiAgICApO1xuICB9KTtcblxuY29uc3QgZ2V0Q29tcG9uZW50VGVtcGxhdGUgPSAoXG4gIGRlY2xhcmF0aW9uOiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICBjaGVja2VyOiB0cy5UeXBlQ2hlY2tlcixcbik6IENvbXBvbmVudFRlbXBsYXRlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGNvbXBvbmVudFRlbXBsYXRlQ2FjaGUuaGFzKGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybiBjb21wb25lbnRUZW1wbGF0ZUNhY2hlLmdldChkZWNsYXJhdGlvbik7XG4gIH1cblxuICBjb25zdCBkZWNvcmF0b3JzID0gdHMuY2FuSGF2ZURlY29yYXRvcnMoZGVjbGFyYXRpb24pXG4gICAgPyAodHMuZ2V0RGVjb3JhdG9ycyhkZWNsYXJhdGlvbikgPz8gW10pXG4gICAgOiBbXTtcblxuICBmb3IgKGNvbnN0IGRlY29yYXRvciBvZiBkZWNvcmF0b3JzKSB7XG4gICAgaWYgKFxuICAgICAgIXRzLmlzQ2FsbEV4cHJlc3Npb24oZGVjb3JhdG9yLmV4cHJlc3Npb24pIHx8XG4gICAgICAhdHMuaXNJZGVudGlmaWVyKGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24pIHx8XG4gICAgICAhaXNBbmd1bGFyQ29tcG9uZW50SW1wb3J0KGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24sIGNoZWNrZXIpXG4gICAgKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBbbWV0YWRhdGFdID0gZGVjb3JhdG9yLmV4cHJlc3Npb24uYXJndW1lbnRzO1xuICAgIGlmIChtZXRhZGF0YSA9PT0gdW5kZWZpbmVkIHx8ICF0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKG1ldGFkYXRhKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBvZiBtZXRhZGF0YS5wcm9wZXJ0aWVzKSB7XG4gICAgICBpZiAoXG4gICAgICAgICF0cy5pc1Byb3BlcnR5QXNzaWdubWVudChwcm9wZXJ0eSkgfHxcbiAgICAgICAgKCF0cy5pc0lkZW50aWZpZXIocHJvcGVydHkubmFtZSkgJiZcbiAgICAgICAgICAhdHMuaXNTdHJpbmdMaXRlcmFsTGlrZShwcm9wZXJ0eS5uYW1lKSlcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wZXJ0eS5uYW1lLnRleHQgPT09IFwidGVtcGxhdGVcIiAmJlxuICAgICAgICB0cy5pc1N0cmluZ0xpdGVyYWxMaWtlKHByb3BlcnR5LmluaXRpYWxpemVyKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQsXG4gICAgICAgICAgZmlsZVBhdGg6IHNvdXJjZUZpbGUuZmlsZU5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGNvbXBvbmVudFRlbXBsYXRlQ2FjaGUuc2V0KGRlY2xhcmF0aW9uLCB0ZW1wbGF0ZSk7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBwcm9wZXJ0eS5uYW1lLnRleHQgPT09IFwidGVtcGxhdGVVcmxcIiAmJlxuICAgICAgICB0cy5pc1N0cmluZ0xpdGVyYWxMaWtlKHByb3BlcnR5LmluaXRpYWxpemVyKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgIHBhdGguZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0LFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlYWRUZW1wbGF0ZUZpbGUoZmlsZVBhdGgpO1xuICAgICAgICBjb21wb25lbnRUZW1wbGF0ZUNhY2hlLnNldChkZWNsYXJhdGlvbiwgdGVtcGxhdGUpO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29tcG9uZW50VGVtcGxhdGVDYWNoZS5zZXQoZGVjbGFyYXRpb24sIHVuZGVmaW5lZCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBpc0FuZ3VsYXJDb21wb25lbnRJbXBvcnQgPSAoXG4gIGlkZW50aWZpZXI6IHRzLklkZW50aWZpZXIsXG4gIGNoZWNrZXI6IHRzLlR5cGVDaGVja2VyLFxuKTogYm9vbGVhbiA9PlxuICBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oaWRlbnRpZmllcik/LmRlY2xhcmF0aW9ucz8uc29tZSgoZGVjbGFyYXRpb24pID0+IHtcbiAgICBpZiAoIXRzLmlzSW1wb3J0U3BlY2lmaWVyKGRlY2xhcmF0aW9uKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGltcG9ydENsYXVzZSA9IGRlY2xhcmF0aW9uLnBhcmVudC5wYXJlbnQ7XG4gICAgaWYgKCF0cy5pc0ltcG9ydENsYXVzZShpbXBvcnRDbGF1c2UpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgaW1wb3J0RGVjbGFyYXRpb24gPSBpbXBvcnRDbGF1c2UucGFyZW50O1xuICAgIHJldHVybiAoXG4gICAgICB0cy5pc0ltcG9ydERlY2xhcmF0aW9uKGltcG9ydERlY2xhcmF0aW9uKSAmJlxuICAgICAgdHMuaXNTdHJpbmdMaXRlcmFsKGltcG9ydERlY2xhcmF0aW9uLm1vZHVsZVNwZWNpZmllcikgJiZcbiAgICAgIGltcG9ydERlY2xhcmF0aW9uLm1vZHVsZVNwZWNpZmllci50ZXh0ID09PSBcIkBhbmd1bGFyL2NvcmVcIiAmJlxuICAgICAgKGRlY2xhcmF0aW9uLnByb3BlcnR5TmFtZT8udGV4dCA/PyBkZWNsYXJhdGlvbi5uYW1lLnRleHQpID09PSBcIkNvbXBvbmVudFwiXG4gICAgKTtcbiAgfSkgPz8gZmFsc2U7XG5cbmNvbnN0IHJlYWRUZW1wbGF0ZUZpbGUgPSAoZmlsZVBhdGg6IHN0cmluZyk6IENvbXBvbmVudFRlbXBsYXRlIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFleGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiB7IGNvbnRlbnQ6IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgXCJ1dGY4XCIpLCBmaWxlUGF0aCB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59O1xuXG5jb25zdCB0ZW1wbGF0ZVVzZXNNZW1iZXIgPSAoXG4gIHRlbXBsYXRlOiBDb21wb25lbnRUZW1wbGF0ZSxcbiAgY29tcG9uZW50OiB0cy5DbGFzc0RlY2xhcmF0aW9uLFxuICBjb21wb25lbnRTeW1ib2w6IHRzLlN5bWJvbCxcbiAgY2hlY2tlcjogdHMuVHlwZUNoZWNrZXIsXG4gIG1lbWJlcjogUHVibGljTWVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IG5vZGVzID0gZ2V0UGFyc2VkVGVtcGxhdGVOb2Rlcyh0ZW1wbGF0ZSwgY29tcG9uZW50KTtcbiAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB1c2FnZTogVGVtcGxhdGVVc2FnZUNvbnRleHQgPSB7XG4gICAgY2hlY2tlcixcbiAgICBjb21wb25lbnQsXG4gICAgY29tcG9uZW50U3ltYm9sLFxuICAgIG1lbWJlcixcbiAgfTtcbiAgcmV0dXJuIHRlbXBsYXRlTm9kZXNVc2VNZW1iZXIobm9kZXMsIG5ldyBNYXAoKSwgdXNhZ2UpO1xufTtcblxuY29uc3QgZ2V0UGFyc2VkVGVtcGxhdGVOb2RlcyA9IChcbiAgdGVtcGxhdGU6IENvbXBvbmVudFRlbXBsYXRlLFxuICBjb21wb25lbnQ6IHRzLkNsYXNzRGVjbGFyYXRpb24sXG4pOiBBbmd1bGFyVGVtcGxhdGVOb2RlW10gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAocGFyc2VkVGVtcGxhdGVDYWNoZS5oYXMoY29tcG9uZW50KSkge1xuICAgIHJldHVybiBwYXJzZWRUZW1wbGF0ZUNhY2hlLmdldChjb21wb25lbnQpO1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gYW5ndWxhci5wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLmNvbnRlbnQsIHRlbXBsYXRlLmZpbGVQYXRoLCB7XG4gICAgZW5hYmxlQmxvY2tTeW50YXg6IHRydWUsXG4gICAgZW5hYmxlTGV0U3ludGF4OiB0cnVlLFxuICB9KTtcbiAgY29uc3Qgbm9kZXMgPSBwYXJzZWQuZXJyb3JzID09PSBudWxsID8gcGFyc2VkLm5vZGVzIDogdW5kZWZpbmVkO1xuICBwYXJzZWRUZW1wbGF0ZUNhY2hlLnNldChjb21wb25lbnQsIG5vZGVzKTtcbiAgcmV0dXJuIG5vZGVzO1xufTtcblxuZXhwb3J0IHsgYW5ndWxhclRlbXBsYXRlVXNhZ2VBZGFwdGVyIH07XG4iXX0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Rule } from "eslint";
|
|
2
|
+
/** Plugin namespace used by Angular-specific ESLint configuration. */
|
|
3
|
+
declare const codeperfectAngularPlugin: {
|
|
4
|
+
meta: {
|
|
5
|
+
name: string;
|
|
6
|
+
};
|
|
7
|
+
rules: {
|
|
8
|
+
"no-unused-public-members": Rule.RuleModule;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export { codeperfectAngularPlugin };
|
|
12
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../../src/adapters/angular/plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAU,IAAI,EAAE,MAAM,QAAQ,CAAC;AAc3C,sEAAsE;AACtE,QAAA,MAAM,wBAAwB;;;;;;;CAG2B,CAAC;AAE1D,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { createNoUnusedPublicMembersListener, noUnusedPublicMembersRule, } from "../../domain/architecture/no-unused-public-members/rule.js";
|
|
2
|
+
import { angularTemplateUsageAdapter } from "./no-unused-public-members-template-adapter.js";
|
|
3
|
+
/** Rule variant that includes the opt-in Angular template usage adapter. */
|
|
4
|
+
const angularNoUnusedPublicMembersRule = {
|
|
5
|
+
...noUnusedPublicMembersRule,
|
|
6
|
+
create: createNoUnusedPublicMembersListener([angularTemplateUsageAdapter]),
|
|
7
|
+
};
|
|
8
|
+
/** Plugin namespace used by Angular-specific ESLint configuration. */
|
|
9
|
+
const codeperfectAngularPlugin = {
|
|
10
|
+
meta: { name: "@codeperfect/eslint-plugin/angular" },
|
|
11
|
+
rules: { "no-unused-public-members": angularNoUnusedPublicMembersRule },
|
|
12
|
+
};
|
|
13
|
+
export { codeperfectAngularPlugin };
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FkYXB0ZXJzL2FuZ3VsYXIvcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFDTCxtQ0FBbUMsRUFDbkMseUJBQXlCLEdBQzFCLE1BQU0seURBQXlELENBQUM7QUFDakUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFFMUYsNEVBQTRFO0FBQzVFLE1BQU0sZ0NBQWdDLEdBQW9CO0lBQ3hELEdBQUcseUJBQXlCO0lBQzVCLE1BQU0sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Q0FDM0UsQ0FBQztBQUVGLHNFQUFzRTtBQUN0RSxNQUFNLHdCQUF3QixHQUFHO0lBQy9CLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxvQ0FBb0MsRUFBRTtJQUNwRCxLQUFLLEVBQUUsRUFBRSwwQkFBMEIsRUFBRSxnQ0FBZ0MsRUFBRTtDQUNoQixDQUFDO0FBRTFELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBMaW50ZXIsIFJ1bGUgfSBmcm9tIFwiZXNsaW50XCI7XG5cbmltcG9ydCB7XG4gIGNyZWF0ZU5vVW51c2VkUHVibGljTWVtYmVyc0xpc3RlbmVyLFxuICBub1VudXNlZFB1YmxpY01lbWJlcnNSdWxlLFxufSBmcm9tIFwiLi4vLi4vZG9tYWluL2FyY2hpdGVjdHVyZS9uby11bnVzZWQtcHVibGljLW1lbWJlcnMvcnVsZVwiO1xuaW1wb3J0IHsgYW5ndWxhclRlbXBsYXRlVXNhZ2VBZGFwdGVyIH0gZnJvbSBcIi4vbm8tdW51c2VkLXB1YmxpYy1tZW1iZXJzLXRlbXBsYXRlLWFkYXB0ZXJcIjtcblxuLyoqIFJ1bGUgdmFyaWFudCB0aGF0IGluY2x1ZGVzIHRoZSBvcHQtaW4gQW5ndWxhciB0ZW1wbGF0ZSB1c2FnZSBhZGFwdGVyLiAqL1xuY29uc3QgYW5ndWxhck5vVW51c2VkUHVibGljTWVtYmVyc1J1bGU6IFJ1bGUuUnVsZU1vZHVsZSA9IHtcbiAgLi4ubm9VbnVzZWRQdWJsaWNNZW1iZXJzUnVsZSxcbiAgY3JlYXRlOiBjcmVhdGVOb1VudXNlZFB1YmxpY01lbWJlcnNMaXN0ZW5lcihbYW5ndWxhclRlbXBsYXRlVXNhZ2VBZGFwdGVyXSksXG59O1xuXG4vKiogUGx1Z2luIG5hbWVzcGFjZSB1c2VkIGJ5IEFuZ3VsYXItc3BlY2lmaWMgRVNMaW50IGNvbmZpZ3VyYXRpb24uICovXG5jb25zdCBjb2RlcGVyZmVjdEFuZ3VsYXJQbHVnaW4gPSB7XG4gIG1ldGE6IHsgbmFtZTogXCJAY29kZXBlcmZlY3QvZXNsaW50LXBsdWdpbi9hbmd1bGFyXCIgfSxcbiAgcnVsZXM6IHsgXCJuby11bnVzZWQtcHVibGljLW1lbWJlcnNcIjogYW5ndWxhck5vVW51c2VkUHVibGljTWVtYmVyc1J1bGUgfSxcbn0gc2F0aXNmaWVzIE5vbk51bGxhYmxlPExpbnRlci5Db25maWdbXCJwbHVnaW5zXCJdPltzdHJpbmddO1xuXG5leHBvcnQgeyBjb2RlcGVyZmVjdEFuZ3VsYXJQbHVnaW4gfTtcbiJdfQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/adapters/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { codeperfectAngularPlugin } from "./angular/index.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWRhcHRlcnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sV0FBVyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgY29kZXBlcmZlY3RBbmd1bGFyUGx1Z2luIH0gZnJvbSBcIi4vYW5ndWxhclwiO1xuIl19
|
|
Binary file
|