@futdevpro/dynamo-eslint 1.20.18 → 1.20.51

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.
Files changed (78) hide show
  1. package/README.md +58 -0
  2. package/build/configs/ngx.d.ts +23 -0
  3. package/build/configs/ngx.d.ts.map +1 -1
  4. package/build/configs/ngx.js +37 -0
  5. package/build/configs/ngx.js.map +1 -1
  6. package/build/plugin/index.d.ts +4 -0
  7. package/build/plugin/index.d.ts.map +1 -1
  8. package/build/plugin/index.js +11 -0
  9. package/build/plugin/index.js.map +1 -1
  10. package/build/plugin/rules/angular/module-load-failed-branch.d.ts +11 -0
  11. package/build/plugin/rules/angular/module-load-failed-branch.d.ts.map +1 -0
  12. package/build/plugin/rules/angular/module-load-failed-branch.js +58 -0
  13. package/build/plugin/rules/angular/module-load-failed-branch.js.map +1 -0
  14. package/build/plugin/rules/angular/no-unlisted-inner-html.d.ts +15 -0
  15. package/build/plugin/rules/angular/no-unlisted-inner-html.d.ts.map +1 -0
  16. package/build/plugin/rules/angular/no-unlisted-inner-html.js +106 -0
  17. package/build/plugin/rules/angular/no-unlisted-inner-html.js.map +1 -0
  18. package/build/plugin/rules/angular/no-unused-component.d.ts +11 -0
  19. package/build/plugin/rules/angular/no-unused-component.d.ts.map +1 -0
  20. package/build/plugin/rules/angular/no-unused-component.js +78 -0
  21. package/build/plugin/rules/angular/no-unused-component.js.map +1 -0
  22. package/build/plugin/rules/angular/scroll-container-min-h-0.d.ts +11 -0
  23. package/build/plugin/rules/angular/scroll-container-min-h-0.d.ts.map +1 -0
  24. package/build/plugin/rules/angular/scroll-container-min-h-0.js +59 -0
  25. package/build/plugin/rules/angular/scroll-container-min-h-0.js.map +1 -0
  26. package/build/plugin/rules/angular/ui-building-blocks-baseline.interface.d.ts +10 -0
  27. package/build/plugin/rules/angular/ui-building-blocks-baseline.interface.d.ts.map +1 -0
  28. package/build/plugin/rules/angular/ui-building-blocks-baseline.interface.js +3 -0
  29. package/build/plugin/rules/angular/ui-building-blocks-baseline.interface.js.map +1 -0
  30. package/build/plugin/rules/angular/ui-building-blocks-element.interface.d.ts +14 -0
  31. package/build/plugin/rules/angular/ui-building-blocks-element.interface.d.ts.map +1 -0
  32. package/build/plugin/rules/angular/ui-building-blocks-element.interface.js +3 -0
  33. package/build/plugin/rules/angular/ui-building-blocks-element.interface.js.map +1 -0
  34. package/build/plugin/rules/angular/ui-building-blocks-rule-context.util.d.ts +28 -0
  35. package/build/plugin/rules/angular/ui-building-blocks-rule-context.util.d.ts.map +1 -0
  36. package/build/plugin/rules/angular/ui-building-blocks-rule-context.util.js +50 -0
  37. package/build/plugin/rules/angular/ui-building-blocks-rule-context.util.js.map +1 -0
  38. package/build/plugin/rules/angular/ui-building-blocks-scroll-finding.interface.d.ts +12 -0
  39. package/build/plugin/rules/angular/ui-building-blocks-scroll-finding.interface.d.ts.map +1 -0
  40. package/build/plugin/rules/angular/ui-building-blocks-scroll-finding.interface.js +3 -0
  41. package/build/plugin/rules/angular/ui-building-blocks-scroll-finding.interface.js.map +1 -0
  42. package/build/plugin/rules/angular/ui-building-blocks.util.d.ts +102 -0
  43. package/build/plugin/rules/angular/ui-building-blocks.util.d.ts.map +1 -0
  44. package/build/plugin/rules/angular/ui-building-blocks.util.js +337 -0
  45. package/build/plugin/rules/angular/ui-building-blocks.util.js.map +1 -0
  46. package/build/plugin/rules/angular/unused-component-finding.interface.d.ts +14 -0
  47. package/build/plugin/rules/angular/unused-component-finding.interface.d.ts.map +1 -0
  48. package/build/plugin/rules/angular/unused-component-finding.interface.js +3 -0
  49. package/build/plugin/rules/angular/unused-component-finding.interface.js.map +1 -0
  50. package/build/plugin/rules/angular/unused-component.util.d.ts +86 -0
  51. package/build/plugin/rules/angular/unused-component.util.d.ts.map +1 -0
  52. package/build/plugin/rules/angular/unused-component.util.js +243 -0
  53. package/build/plugin/rules/angular/unused-component.util.js.map +1 -0
  54. package/build/plugin/rules/angular/xss-surface-baseline-files.interface.d.ts +8 -0
  55. package/build/plugin/rules/angular/xss-surface-baseline-files.interface.d.ts.map +1 -0
  56. package/build/plugin/rules/angular/xss-surface-baseline-files.interface.js +3 -0
  57. package/build/plugin/rules/angular/xss-surface-baseline-files.interface.js.map +1 -0
  58. package/build/plugin/rules/angular/xss-surface-occurrences.interface.d.ts +6 -0
  59. package/build/plugin/rules/angular/xss-surface-occurrences.interface.d.ts.map +1 -0
  60. package/build/plugin/rules/angular/xss-surface-occurrences.interface.js +3 -0
  61. package/build/plugin/rules/angular/xss-surface-occurrences.interface.js.map +1 -0
  62. package/build/plugin/rules/angular/xss-surface.util.d.ts +44 -0
  63. package/build/plugin/rules/angular/xss-surface.util.d.ts.map +1 -0
  64. package/build/plugin/rules/angular/xss-surface.util.js +121 -0
  65. package/build/plugin/rules/angular/xss-surface.util.js.map +1 -0
  66. package/build/scripts/ui-building-blocks-baseline.d.ts +21 -0
  67. package/build/scripts/ui-building-blocks-baseline.d.ts.map +1 -0
  68. package/build/scripts/ui-building-blocks-baseline.js +108 -0
  69. package/build/scripts/ui-building-blocks-baseline.js.map +1 -0
  70. package/build/scripts/unused-components-baseline.d.ts +17 -0
  71. package/build/scripts/unused-components-baseline.d.ts.map +1 -0
  72. package/build/scripts/unused-components-baseline.js +62 -0
  73. package/build/scripts/unused-components-baseline.js.map +1 -0
  74. package/build/scripts/xss-surface-baseline.d.ts +17 -0
  75. package/build/scripts/xss-surface-baseline.d.ts.map +1 -0
  76. package/build/scripts/xss-surface-baseline.js +73 -0
  77. package/build/scripts/xss-surface-baseline.js.map +1 -0
  78. package/package.json +6 -3
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-building-blocks.util.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/ui-building-blocks.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** A component that is built but used nowhere (BFR-QA-006). */
2
+ export interface UnusedComponent_Finding_Interface {
3
+ /** The source file (forward slashes, as it was given to the scanner). */
4
+ file: string;
5
+ /** The component class. */
6
+ className: string;
7
+ /** Its selectors (empty = selector-less; then only a class reference can use it). */
8
+ selectors: string[];
9
+ /** Offset of the class name in the file. */
10
+ offset: number;
11
+ /** A reference to it exists, but ONLY inside a comment (`// T_Search_Component,`, `<!-- <app-x> -->`). */
12
+ commentedOut: boolean;
13
+ }
14
+ //# sourceMappingURL=unused-component-finding.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-component-finding.interface.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/unused-component-finding.interface.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,MAAM,WAAW,iCAAiC;IAChD,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,4CAA4C;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,0GAA0G;IAC1G,YAAY,EAAE,OAAO,CAAC;CACvB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=unused-component-finding.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-component-finding.interface.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/unused-component-finding.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { UnusedComponent_Finding_Interface } from './unused-component-finding.interface';
2
+ /** A source file of the project. */
3
+ interface UnusedComponent_Source_Interface {
4
+ file: string;
5
+ text: string;
6
+ }
7
+ /** What the project uses: template tags, template text (attribute selectors), class references per identifier. */
8
+ interface UnusedComponent_Index_Interface {
9
+ /** Element names used in (comment-free) templates. */
10
+ tags: Set<string>;
11
+ /** All comment-free template text (for attribute selectors). */
12
+ templates: string;
13
+ /** identifier → the files that reference it in a USAGE position. */
14
+ references: Map<string, Set<string>>;
15
+ /** identifier / tag → the files that mention it inside a COMMENT (`// X,`, `<!-- <app-x> -->`). */
16
+ commented: Map<string, Set<string>>;
17
+ }
18
+ /**
19
+ * BFR-QA-006 — the ONE scanner behind the `no-unused-component` rule AND the `dynamo-unused-components-baseline`
20
+ * generator: an Angular `@Component` that is built but used NOWHERE — its selector is in no (comment-free) template
21
+ * and its class is referenced in no other source in a usage position.
22
+ *
23
+ * Usage positions: routes (`component: X`, `loadComponent: … m.X`), dialogs (`dialog.open(X`), bootstrap,
24
+ * `createComponent(X)`, an assignment… — any reference EXCEPT:
25
+ * - `import … from` / `export … from` statements (a route can disappear while its import stays — measured on the
26
+ * credit client: `Ad_Page_Component` imported by a routing module and routed nowhere);
27
+ * - `imports` / `declarations` / `exports` arrays (registering a component is not using it — the organizer's
28
+ * `T_Search_Component` was one uncommented line away from being "registered but never rendered");
29
+ * - its own file, `*.spec.ts` (a component only its own test uses is exactly the case) and `*.stories.ts`.
30
+ * A reference that exists only inside a comment is flagged separately (`commentedOut`).
31
+ */
32
+ export declare class UnusedComponent_Util {
33
+ /** The default location of the committed per-project baseline (relative to the ESLint working directory). */
34
+ static readonly defaultBaselineFile: string;
35
+ /** The rule id the baseline belongs to. */
36
+ static readonly ruleId: string;
37
+ /** The project files the scan reads (relative globs, run in the ESLint working directory). */
38
+ static readonly globs: string[];
39
+ /** Never part of the scan: generated / vendored folders, tests, stories, declarations. */
40
+ static readonly ignore: string[];
41
+ /** How long a project scan is trusted before its files are re-stamped (editor lint-on-save). */
42
+ private static readonly recheckMs;
43
+ private static readonly projectCache;
44
+ private static readonly baselineCache;
45
+ /** The unused components declared in `sources`, measured against the whole project index. */
46
+ static findUnused(sources: UnusedComponent_Source_Interface[], index: UnusedComponent_Index_Interface): UnusedComponent_Finding_Interface[];
47
+ /** The `@Component`s of a TypeScript source: class name, selectors, class-name offset. */
48
+ static componentsOf(text: string): {
49
+ className: string;
50
+ selectors: string[];
51
+ offset: number;
52
+ }[];
53
+ /** Builds the usage index of a project's sources. */
54
+ static buildIndex(sources: UnusedComponent_Source_Interface[]): UnusedComponent_Index_Interface;
55
+ /**
56
+ * The index of the project in `root` (cached; re-stamped at most every few seconds, rebuilt only when a file
57
+ * changed).
58
+ */
59
+ static projectIndex(root: string): {
60
+ sources: UnusedComponent_Source_Interface[];
61
+ index: UnusedComponent_Index_Interface;
62
+ };
63
+ /** Reads the committed baseline: the accepted component keys (`<file>#<Class>`). Broken file THROWS. */
64
+ static readBaseline(baselinePath: string): string[];
65
+ /** Forgets every cached project scan and baseline (tests; a long-lived process after a bulk change). */
66
+ static clearCache(): void;
67
+ /** The baseline key of a finding. */
68
+ static key(finding: {
69
+ file: string;
70
+ className: string;
71
+ }): string;
72
+ /** Forward slashes. */
73
+ static normalize(value: string): string;
74
+ /** Whether one selector (`app-x`, `button[app-btn]`, `[appX]`) is used in the templates. */
75
+ private static selectorUsed;
76
+ /** The element part of a selector (`app-x` of `app-x[y]:not(z)`), lower-case; empty for attribute-only. */
77
+ private static elementOf;
78
+ /** Element names opened in a template text. */
79
+ private static tagsIn;
80
+ /** Identifiers of a code text. */
81
+ private static identifiersIn;
82
+ /** Removes `import`/`export … from` statements and `imports`/`declarations`/`exports` arrays (not usages). */
83
+ private static stripRegistrations;
84
+ }
85
+ export {};
86
+ //# sourceMappingURL=unused-component.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-component.util.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/unused-component.util.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iCAAiC,EAAE,MAAM,sCAAsC,CAAC;AAGzF,oCAAoC;AACpC,UAAU,gCAAgC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kHAAkH;AAClH,UAAU,+BAA+B;IACvC,sDAAsD;IACtD,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACrC,mGAAmG;IACnG,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CACrC;AAUD;;;;;;;;;;;;;GAaG;AACH,qBAAa,oBAAoB;IAE/B,6GAA6G;IAC7G,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAA6C;IAExF,2CAA2C;IAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA2C;IAEzE,8FAA8F;IAC9F,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,CAA8B;IAE7D,0FAA0F;IAC1F,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAG9B;IAEF,gGAAgG;IAChG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAEjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAkE;IAEtG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAA8D;IAEnG,6FAA6F;IAC7F,MAAM,CAAC,UAAU,CACf,OAAO,EAAE,gCAAgC,EAAE,EAC3C,KAAK,EAAE,+BAA+B,GACrC,iCAAiC,EAAE;IA+BtC,0FAA0F;IAC1F,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE;IAyB/F,qDAAqD;IACrD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,gCAAgC,EAAE,GAAG,+BAA+B;IAgD/F;;;OAGG;IACH,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC;QAAC,KAAK,EAAE,+BAA+B,CAAA;KAAE;IAgC1H,wGAAwG;IACxG,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE;IA0BnD,wGAAwG;IACxG,MAAM,CAAC,UAAU,IAAI,IAAI;IAKzB,qCAAqC;IACrC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAIhE,uBAAuB;IACvB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,4FAA4F;IAC5F,OAAO,CAAC,MAAM,CAAC,YAAY;IAa3B,2GAA2G;IAC3G,OAAO,CAAC,MAAM,CAAC,SAAS;IAMxB,+CAA+C;IAC/C,OAAO,CAAC,MAAM,CAAC,MAAM;IAIrB,kCAAkC;IAClC,OAAO,CAAC,MAAM,CAAC,aAAa;IAI5B,8GAA8G;IAC9G,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA0BlC"}
@@ -0,0 +1,243 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UnusedComponent_Util = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fast_glob_1 = tslib_1.__importDefault(require("fast-glob"));
6
+ const fs_1 = require("fs");
7
+ const path = tslib_1.__importStar(require("path"));
8
+ const ui_building_blocks_util_1 = require("./ui-building-blocks.util");
9
+ const xss_surface_util_1 = require("./xss-surface.util");
10
+ /**
11
+ * BFR-QA-006 — the ONE scanner behind the `no-unused-component` rule AND the `dynamo-unused-components-baseline`
12
+ * generator: an Angular `@Component` that is built but used NOWHERE — its selector is in no (comment-free) template
13
+ * and its class is referenced in no other source in a usage position.
14
+ *
15
+ * Usage positions: routes (`component: X`, `loadComponent: … m.X`), dialogs (`dialog.open(X`), bootstrap,
16
+ * `createComponent(X)`, an assignment… — any reference EXCEPT:
17
+ * - `import … from` / `export … from` statements (a route can disappear while its import stays — measured on the
18
+ * credit client: `Ad_Page_Component` imported by a routing module and routed nowhere);
19
+ * - `imports` / `declarations` / `exports` arrays (registering a component is not using it — the organizer's
20
+ * `T_Search_Component` was one uncommented line away from being "registered but never rendered");
21
+ * - its own file, `*.spec.ts` (a component only its own test uses is exactly the case) and `*.stories.ts`.
22
+ * A reference that exists only inside a comment is flagged separately (`commentedOut`).
23
+ */
24
+ class UnusedComponent_Util {
25
+ /** The default location of the committed per-project baseline (relative to the ESLint working directory). */
26
+ static defaultBaselineFile = '.dynamo/unused-components-baseline.json';
27
+ /** The rule id the baseline belongs to. */
28
+ static ruleId = '@futdevpro/dynamo/no-unused-component';
29
+ /** The project files the scan reads (relative globs, run in the ESLint working directory). */
30
+ static globs = ['**/*.ts', '**/*.html'];
31
+ /** Never part of the scan: generated / vendored folders, tests, stories, declarations. */
32
+ static ignore = [
33
+ '**/node_modules/**', '**/dist/**', '**/build/**', '**/.angular/**', '**/coverage/**',
34
+ '**/*.spec.ts', '**/*.stories.ts', '**/*.d.ts',
35
+ ];
36
+ /** How long a project scan is trusted before its files are re-stamped (editor lint-on-save). */
37
+ static recheckMs = 3000;
38
+ static projectCache = new Map();
39
+ static baselineCache = new Map();
40
+ /** The unused components declared in `sources`, measured against the whole project index. */
41
+ static findUnused(sources, index) {
42
+ const findings = [];
43
+ sources.forEach((source) => {
44
+ if (!source.file.endsWith('.ts')) {
45
+ return;
46
+ }
47
+ UnusedComponent_Util.componentsOf(source.text).forEach((component) => {
48
+ const bySelector = component.selectors.some((s) => UnusedComponent_Util.selectorUsed(s, index));
49
+ const byClass = [...(index.references.get(component.className) ?? [])]
50
+ .some((file) => file !== UnusedComponent_Util.normalize(source.file));
51
+ if (bySelector || byClass) {
52
+ return;
53
+ }
54
+ findings.push({
55
+ file: UnusedComponent_Util.normalize(source.file),
56
+ className: component.className,
57
+ selectors: component.selectors,
58
+ offset: component.offset,
59
+ commentedOut: [component.className, ...component.selectors.map((s) => UnusedComponent_Util.elementOf(s))]
60
+ .some((name) => [...(index.commented.get(name) ?? [])]
61
+ .some((file) => file !== UnusedComponent_Util.normalize(source.file))),
62
+ });
63
+ });
64
+ });
65
+ return findings;
66
+ }
67
+ /** The `@Component`s of a TypeScript source: class name, selectors, class-name offset. */
68
+ static componentsOf(text) {
69
+ const code = xss_surface_util_1.XssSurface_Util.blankComments(text, 'x.ts');
70
+ const result = [];
71
+ const decorator = /@Component\s*\(/g;
72
+ let match = decorator.exec(code);
73
+ while (match !== null) {
74
+ const classMatch = /\bclass\s+([A-Za-z_$][\w$]*)/.exec(code.slice(match.index));
75
+ if (classMatch) {
76
+ const block = code.slice(match.index, match.index + classMatch.index);
77
+ const selector = /\bselector\s*:\s*(['"`])([\s\S]*?)\1/.exec(block);
78
+ result.push({
79
+ className: classMatch[1],
80
+ selectors: selector ? selector[2].split(',').map((s) => s.trim()).filter(Boolean) : [],
81
+ offset: match.index + classMatch.index + classMatch[0].length - classMatch[1].length,
82
+ });
83
+ }
84
+ match = decorator.exec(code);
85
+ }
86
+ return result;
87
+ }
88
+ /** Builds the usage index of a project's sources. */
89
+ static buildIndex(sources) {
90
+ const tags = new Set();
91
+ const references = new Map();
92
+ const commented = new Map();
93
+ /** Records a name mentioned inside a comment of `file`. */
94
+ const mention = (name, file) => {
95
+ commented.set(name, (commented.get(name) ?? new Set()).add(file));
96
+ };
97
+ const templateTexts = [];
98
+ sources.forEach((source) => {
99
+ const file = UnusedComponent_Util.normalize(source.file);
100
+ ui_building_blocks_util_1.UiBuildingBlocks_Util.templates(source.text, file).forEach((template) => {
101
+ const clean = template.text.replace(/<!--[\s\S]*?-->/g, (c) => {
102
+ UnusedComponent_Util.tagsIn(c).forEach((t) => mention(t, file));
103
+ return ' ';
104
+ });
105
+ templateTexts.push(clean);
106
+ UnusedComponent_Util.tagsIn(clean).forEach((t) => { tags.add(t); });
107
+ });
108
+ if (!file.endsWith('.ts')) {
109
+ return;
110
+ }
111
+ const code = xss_surface_util_1.XssSurface_Util.blankComments(source.text, file);
112
+ // the comment text = the characters the blanker turned into spaces
113
+ const commentText = source.text.split('').map((c, i) => (code[i] === c ? ' ' : c)).join('');
114
+ UnusedComponent_Util.identifiersIn(commentText).forEach((id) => mention(id, file));
115
+ UnusedComponent_Util.identifiersIn(UnusedComponent_Util.stripRegistrations(code)).forEach((id) => {
116
+ if (!references.has(id)) {
117
+ references.set(id, new Set());
118
+ }
119
+ references.get(id)?.add(file);
120
+ });
121
+ });
122
+ return {
123
+ tags: tags,
124
+ templates: templateTexts.join('\n'),
125
+ references: references,
126
+ commented: commented,
127
+ };
128
+ }
129
+ /**
130
+ * The index of the project in `root` (cached; re-stamped at most every few seconds, rebuilt only when a file
131
+ * changed).
132
+ */
133
+ static projectIndex(root) {
134
+ const cached = UnusedComponent_Util.projectCache.get(root);
135
+ if (cached && Date.now() - cached.checkedAt < UnusedComponent_Util.recheckMs) {
136
+ return cached;
137
+ }
138
+ const files = fast_glob_1.default.sync(UnusedComponent_Util.globs, { cwd: root, ignore: UnusedComponent_Util.ignore })
139
+ .sort();
140
+ const fingerprint = files.map((f) => {
141
+ const stat = (0, fs_1.statSync)(path.join(root, f));
142
+ return f + ':' + stat.mtimeMs + ':' + stat.size;
143
+ }).join('|');
144
+ if (cached?.fingerprint === fingerprint) {
145
+ cached.checkedAt = Date.now();
146
+ return cached;
147
+ }
148
+ const sources = files.map((f) => ({
149
+ file: UnusedComponent_Util.normalize(f),
150
+ text: (0, fs_1.readFileSync)(path.join(root, f), 'utf8'),
151
+ }));
152
+ const fresh = {
153
+ checkedAt: Date.now(), fingerprint: fingerprint, sources: sources, index: UnusedComponent_Util.buildIndex(sources),
154
+ };
155
+ UnusedComponent_Util.projectCache.set(root, fresh);
156
+ return fresh;
157
+ }
158
+ /** Reads the committed baseline: the accepted component keys (`<file>#<Class>`). Broken file THROWS. */
159
+ static readBaseline(baselinePath) {
160
+ if (!(0, fs_1.existsSync)(baselinePath)) {
161
+ return [];
162
+ }
163
+ const stat = (0, fs_1.statSync)(baselinePath);
164
+ const stamp = stat.mtimeMs + ':' + stat.size;
165
+ const cached = UnusedComponent_Util.baselineCache.get(baselinePath);
166
+ if (cached?.stamp === stamp) {
167
+ return cached.files;
168
+ }
169
+ const parsed = JSON.parse((0, fs_1.readFileSync)(baselinePath, 'utf8'));
170
+ const list = typeof parsed === 'object' && parsed !== null ? Reflect.get(parsed, 'components') : undefined;
171
+ if (!Array.isArray(list)) {
172
+ throw new Error(`Unused-components baseline ${baselinePath} has no "components" array — regenerate it with `
173
+ + '`npx dynamo-unused-components-baseline`.');
174
+ }
175
+ const files = list.filter((k) => typeof k === 'string')
176
+ .map((k) => UnusedComponent_Util.normalize(k));
177
+ UnusedComponent_Util.baselineCache.set(baselinePath, { stamp: stamp, files: files });
178
+ return files;
179
+ }
180
+ /** Forgets every cached project scan and baseline (tests; a long-lived process after a bulk change). */
181
+ static clearCache() {
182
+ UnusedComponent_Util.projectCache.clear();
183
+ UnusedComponent_Util.baselineCache.clear();
184
+ }
185
+ /** The baseline key of a finding. */
186
+ static key(finding) {
187
+ return UnusedComponent_Util.normalize(finding.file) + '#' + finding.className;
188
+ }
189
+ /** Forward slashes. */
190
+ static normalize(value) {
191
+ return value.replace(/\\/g, '/');
192
+ }
193
+ /** Whether one selector (`app-x`, `button[app-btn]`, `[appX]`) is used in the templates. */
194
+ static selectorUsed(selector, index) {
195
+ const element = UnusedComponent_Util.elementOf(selector);
196
+ const attribute = /\[([\w-]+)/.exec(selector);
197
+ if (!attribute) {
198
+ return !!element && index.tags.has(element);
199
+ }
200
+ // `button[appBusy]` needs BOTH on one element; `[appBusy]` any element with the attribute
201
+ const tag = element ? element + '\\b' : '[a-zA-Z][\\w-]*';
202
+ return new RegExp('<' + tag + '[^>]*[\\s\\[(*]' + attribute[1] + '[\\s=>\\])/]', 'i').test(index.templates);
203
+ }
204
+ /** The element part of a selector (`app-x` of `app-x[y]:not(z)`), lower-case; empty for attribute-only. */
205
+ static elementOf(selector) {
206
+ const match = /^([a-zA-Z][\w-]*)/.exec(selector.trim());
207
+ return match ? match[1].toLowerCase() : '';
208
+ }
209
+ /** Element names opened in a template text. */
210
+ static tagsIn(text) {
211
+ return (text.match(/<[a-zA-Z][\w-]*/g) ?? []).map((t) => t.slice(1).toLowerCase());
212
+ }
213
+ /** Identifiers of a code text. */
214
+ static identifiersIn(text) {
215
+ return new Set(text.match(/[A-Za-z_$][\w$]*/g) ?? []);
216
+ }
217
+ /** Removes `import`/`export … from` statements and `imports`/`declarations`/`exports` arrays (not usages). */
218
+ static stripRegistrations(code) {
219
+ let result = code
220
+ // `[^;'"]` keeps it inside ONE import clause (a side-effect `import 'x';` must not swallow the code after it)
221
+ .replace(/\bimport\s+(?:type\s+)?[^;'"]*?\bfrom\s*['"][^'"]+['"]/g, ' ')
222
+ .replace(/\bexport\s+(?:type\s+)?(?:\*|\{[\s\S]*?\})\s*from\s*['"][^'"]+['"]/g, ' ');
223
+ const arrayStart = /\b(?:imports|declarations|exports)\s*:\s*\[/g;
224
+ let match = arrayStart.exec(result);
225
+ while (match !== null) {
226
+ // blank up to the MATCHING bracket (nested arrays included)
227
+ let depth = 0;
228
+ let end = match.index + match[0].length - 1;
229
+ for (; end < result.length; end++) {
230
+ depth += result[end] === '[' ? 1 : result[end] === ']' ? -1 : 0;
231
+ if (!depth) {
232
+ break;
233
+ }
234
+ }
235
+ result = result.slice(0, match.index) + ' '.repeat(end + 1 - match.index) + result.slice(end + 1);
236
+ arrayStart.lastIndex = match.index + 1;
237
+ match = arrayStart.exec(result);
238
+ }
239
+ return result;
240
+ }
241
+ }
242
+ exports.UnusedComponent_Util = UnusedComponent_Util;
243
+ //# sourceMappingURL=unused-component.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unused-component.util.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/unused-component.util.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /** Baseline: relative path → the accepted count per kind — BFR-QA-005. */
2
+ export interface XssSurface_BaselineFiles_Interface {
3
+ [relativePath: string]: {
4
+ innerHtml: number;
5
+ bypass: number;
6
+ };
7
+ }
8
+ //# sourceMappingURL=xss-surface-baseline-files.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-surface-baseline-files.interface.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/xss-surface-baseline-files.interface.ts"],"names":[],"mappings":"AACA,0EAA0E;AAC1E,MAAM,WAAW,kCAAkC;IACjD,CAAC,YAAY,EAAE,MAAM,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/D"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=xss-surface-baseline-files.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-surface-baseline-files.interface.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/xss-surface-baseline-files.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /** The XSS-surface occurrences of one file (offsets) — BFR-QA-005. */
2
+ export interface XssSurface_Occurrences_Interface {
3
+ innerHtml: number[];
4
+ bypass: number[];
5
+ }
6
+ //# sourceMappingURL=xss-surface-occurrences.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-surface-occurrences.interface.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/xss-surface-occurrences.interface.ts"],"names":[],"mappings":"AACA,sEAAsE;AACtE,MAAM,WAAW,gCAAgC;IAC/C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=xss-surface-occurrences.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-surface-occurrences.interface.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/xss-surface-occurrences.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,44 @@
1
+ import { XssSurface_BaselineFiles_Interface } from './xss-surface-baseline-files.interface';
2
+ import { XssSurface_Occurrences_Interface } from './xss-surface-occurrences.interface';
3
+ /**
4
+ * BFR-QA-005 — the ONE scanner behind the `no-unlisted-inner-html` rule AND the `dynamo-xss-surface-baseline`
5
+ * generator, so the baseline counts exactly what the rule counts.
6
+ *
7
+ * XSS surface = a place where a string reaches the DOM as HTML without Angular's sanitizer:
8
+ * - `[innerHTML]` bindings (in `.html` templates and inline `.ts` templates);
9
+ * - `DomSanitizer.bypassSecurityTrust…(…)` calls.
10
+ * Comments are ignored (a mention in a comment is not a surface).
11
+ */
12
+ export declare class XssSurface_Util {
13
+ /** The default location of the committed per-project baseline (relative to the ESLint working directory). */
14
+ static readonly defaultBaselineFile: string;
15
+ /** The rule id the baseline belongs to. */
16
+ static readonly ruleId: string;
17
+ private static readonly innerHtmlRegex;
18
+ private static readonly bypassRegex;
19
+ /** Baseline cache: path → { mtime, counts } (one read per lint run and file change). */
20
+ private static readonly baselineCache;
21
+ /** Offsets of every XSS-surface occurrence in a `.html` / `.ts` source text. */
22
+ static scan(text: string, filename: string): XssSurface_Occurrences_Interface;
23
+ /** Whether a file is in scope (Angular templates and sources; tests excluded — no DOM reaches a user there). */
24
+ static isInScope(filename: string): boolean;
25
+ /** A path in the baseline / allow-list form: forward slashes, relative to `cwd` when inside it. */
26
+ static relativeKey(filename: string, cwd: string): string;
27
+ /** Reads the committed baseline (missing file = empty baseline; a broken file THROWS — never a silent pass). */
28
+ static readBaseline(baselinePath: string): XssSurface_BaselineFiles_Interface;
29
+ /**
30
+ * Checks an escaping pipe: all four escapes (`&amp; &lt; &gt; &quot;`) present, and the `<` escape BEFORE the first
31
+ * replacement that produces HTML (escaping after the mapping would escape nothing the mapping let through).
32
+ * @returns the problems (empty = sound).
33
+ */
34
+ static checkEscapePipe(text: string): string[];
35
+ /** Forward slashes. */
36
+ static normalize(value: string): string;
37
+ /** Replaces comments with spaces (offsets and line breaks preserved; string literals kept). Shared by BFR-QA-006. */
38
+ static blankComments(text: string, filename: string): string;
39
+ /** All match offsets of a global regex. */
40
+ private static offsets;
41
+ /** A non-negative integer count from a baseline entry (anything else = 0). */
42
+ private static count;
43
+ }
44
+ //# sourceMappingURL=xss-surface.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xss-surface.util.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/xss-surface.util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kCAAkC,EAAE,MAAM,wCAAwC,CAAC;AAC5F,OAAO,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAEvF;;;;;;;;GAQG;AACH,qBAAa,eAAe;IAE1B,6GAA6G;IAC7G,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAuC;IAElF,2CAA2C;IAC3C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAA8C;IAE5E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAA4B;IAElE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CACkC;IAErE,wFAAwF;IACxF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CACzB;IAEZ,gFAAgF;IAChF,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,gCAAgC;IAS7E,gHAAgH;IAChH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAQ3C,mGAAmG;IACnG,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAOzD,gHAAgH;IAChH,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,kCAAkC;IA+B7E;;;;OAIG;IACH,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE;IAkB9C,uBAAuB;IACvB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAIvC,qHAAqH;IACrH,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAa5D,2CAA2C;IAC3C,OAAO,CAAC,MAAM,CAAC,OAAO;IAatB,8EAA8E;IAC9E,OAAO,CAAC,MAAM,CAAC,KAAK;CAKrB"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.XssSurface_Util = void 0;
4
+ const fs_1 = require("fs");
5
+ /**
6
+ * BFR-QA-005 — the ONE scanner behind the `no-unlisted-inner-html` rule AND the `dynamo-xss-surface-baseline`
7
+ * generator, so the baseline counts exactly what the rule counts.
8
+ *
9
+ * XSS surface = a place where a string reaches the DOM as HTML without Angular's sanitizer:
10
+ * - `[innerHTML]` bindings (in `.html` templates and inline `.ts` templates);
11
+ * - `DomSanitizer.bypassSecurityTrust…(…)` calls.
12
+ * Comments are ignored (a mention in a comment is not a surface).
13
+ */
14
+ class XssSurface_Util {
15
+ /** The default location of the committed per-project baseline (relative to the ESLint working directory). */
16
+ static defaultBaselineFile = '.dynamo/xss-surface-baseline.json';
17
+ /** The rule id the baseline belongs to. */
18
+ static ruleId = '@futdevpro/dynamo/no-unlisted-inner-html';
19
+ static innerHtmlRegex = /\[innerHTML\]/g;
20
+ static bypassRegex = /\bbypassSecurityTrust(?:Html|Style|Script|Url|ResourceUrl)\s*\(/g;
21
+ /** Baseline cache: path → { mtime, counts } (one read per lint run and file change). */
22
+ static baselineCache = new Map();
23
+ /** Offsets of every XSS-surface occurrence in a `.html` / `.ts` source text. */
24
+ static scan(text, filename) {
25
+ const code = XssSurface_Util.blankComments(text, filename);
26
+ return {
27
+ innerHtml: XssSurface_Util.offsets(code, XssSurface_Util.innerHtmlRegex),
28
+ bypass: filename.endsWith('.html') ? [] : XssSurface_Util.offsets(code, XssSurface_Util.bypassRegex),
29
+ };
30
+ }
31
+ /** Whether a file is in scope (Angular templates and sources; tests excluded — no DOM reaches a user there). */
32
+ static isInScope(filename) {
33
+ const normalized = XssSurface_Util.normalize(filename);
34
+ return (normalized.endsWith('.html') || normalized.endsWith('.ts'))
35
+ && !normalized.endsWith('.spec.ts')
36
+ && !normalized.endsWith('.d.ts');
37
+ }
38
+ /** A path in the baseline / allow-list form: forward slashes, relative to `cwd` when inside it. */
39
+ static relativeKey(filename, cwd) {
40
+ const file = XssSurface_Util.normalize(filename);
41
+ const root = XssSurface_Util.normalize(cwd).replace(/\/$/, '');
42
+ return file.toLowerCase().startsWith(root.toLowerCase() + '/') ? file.slice(root.length + 1) : file;
43
+ }
44
+ /** Reads the committed baseline (missing file = empty baseline; a broken file THROWS — never a silent pass). */
45
+ static readBaseline(baselinePath) {
46
+ if (!(0, fs_1.existsSync)(baselinePath)) {
47
+ return {};
48
+ }
49
+ const mtimeMs = (0, fs_1.statSync)(baselinePath).mtimeMs;
50
+ const cached = XssSurface_Util.baselineCache.get(baselinePath);
51
+ if (cached?.mtimeMs === mtimeMs) {
52
+ return cached.files;
53
+ }
54
+ const parsed = JSON.parse((0, fs_1.readFileSync)(baselinePath, 'utf8'));
55
+ const files = typeof parsed === 'object' && parsed !== null ? Reflect.get(parsed, 'files') : undefined;
56
+ if (!files || typeof files !== 'object') {
57
+ throw new Error(`XSS-surface baseline ${baselinePath} has no "files" object — regenerate it with `
58
+ + '`npx dynamo-xss-surface-baseline`.');
59
+ }
60
+ const result = {};
61
+ Object.entries(files).forEach(([key, value]) => {
62
+ result[XssSurface_Util.normalize(key)] = {
63
+ innerHtml: XssSurface_Util.count(value, 'innerHtml'),
64
+ bypass: XssSurface_Util.count(value, 'bypass'),
65
+ };
66
+ });
67
+ XssSurface_Util.baselineCache.set(baselinePath, { mtimeMs: mtimeMs, files: result });
68
+ return result;
69
+ }
70
+ /**
71
+ * Checks an escaping pipe: all four escapes (`&amp; &lt; &gt; &quot;`) present, and the `<` escape BEFORE the first
72
+ * replacement that produces HTML (escaping after the mapping would escape nothing the mapping let through).
73
+ * @returns the problems (empty = sound).
74
+ */
75
+ static checkEscapePipe(text) {
76
+ const code = XssSurface_Util.blankComments(text, 'pipe.ts');
77
+ const problems = [];
78
+ const missing = ['&amp;', '&lt;', '&gt;', '&quot;'].filter((e) => !code.includes(e));
79
+ if (missing.length) {
80
+ problems.push(`missing escape(s): ${missing.join(' ')}`);
81
+ }
82
+ const escapeIndex = code.indexOf('&lt;');
83
+ const htmlReplace = /\.replace\([^;]*?['"`][^'"`\n]*<[a-zA-Z/]/.exec(code);
84
+ if (escapeIndex >= 0 && htmlReplace && htmlReplace.index < escapeIndex) {
85
+ problems.push('the `<` escape comes AFTER the first HTML-producing replacement');
86
+ }
87
+ return problems;
88
+ }
89
+ /** Forward slashes. */
90
+ static normalize(value) {
91
+ return value.replace(/\\/g, '/');
92
+ }
93
+ /** Replaces comments with spaces (offsets and line breaks preserved; string literals kept). Shared by BFR-QA-006. */
94
+ static blankComments(text, filename) {
95
+ /** A comment becomes spaces — offsets and line breaks stay where they were. */
96
+ const blank = (match) => match.replace(/[^\n]/g, ' ');
97
+ if (filename.endsWith('.html')) {
98
+ return text.replace(/<!--[\s\S]*?-->/g, blank);
99
+ }
100
+ // strings are kept (an inline template's `[innerHTML]` lives in one); block + line comments are blanked
101
+ return text.replace(/("(?:\\.|[^"\\\n])*"|'(?:\\.|[^'\\\n])*'|`(?:\\[\s\S]|[^`\\])*`)|\/\*[\s\S]*?\*\/|\/\/[^\n]*/g, (match, stringLiteral) => (stringLiteral ? match : blank(match)));
102
+ }
103
+ /** All match offsets of a global regex. */
104
+ static offsets(code, regex) {
105
+ const local = new RegExp(regex.source, 'g');
106
+ const result = [];
107
+ let match = local.exec(code);
108
+ while (match !== null) {
109
+ result.push(match.index);
110
+ match = local.exec(code);
111
+ }
112
+ return result;
113
+ }
114
+ /** A non-negative integer count from a baseline entry (anything else = 0). */
115
+ static count(entry, key) {
116
+ const value = entry && typeof entry === 'object' ? Reflect.get(entry, key) : undefined;
117
+ return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : 0;
118
+ }
119
+ }
120
+ exports.XssSurface_Util = XssSurface_Util;
121
+ //# sourceMappingURL=xss-surface.util.js.map