ng-checkup 0.2.0 → 0.4.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.
Files changed (47) hide show
  1. package/README.md +75 -13
  2. package/dist/angular-versions.d.ts +14 -0
  3. package/dist/angular-versions.js +157 -0
  4. package/dist/angular-versions.js.map +1 -0
  5. package/dist/baseline.d.ts +72 -0
  6. package/dist/baseline.js +82 -0
  7. package/dist/baseline.js.map +1 -0
  8. package/dist/checks/change-detection.js +5 -0
  9. package/dist/checks/change-detection.js.map +1 -1
  10. package/dist/checks/circular-deps.js +3 -0
  11. package/dist/checks/circular-deps.js.map +1 -1
  12. package/dist/checks/components.js +5 -0
  13. package/dist/checks/components.js.map +1 -1
  14. package/dist/checks/deprecated-apis.js +5 -0
  15. package/dist/checks/deprecated-apis.js.map +1 -1
  16. package/dist/checks/state.js +5 -0
  17. package/dist/checks/state.js.map +1 -1
  18. package/dist/checks/testing.js +3 -0
  19. package/dist/checks/testing.js.map +1 -1
  20. package/dist/checks/type-safety.js +8 -0
  21. package/dist/checks/type-safety.js.map +1 -1
  22. package/dist/checks/version.js +5 -0
  23. package/dist/checks/version.js.map +1 -1
  24. package/dist/cli.d.ts +28 -6
  25. package/dist/cli.js +100 -12
  26. package/dist/cli.js.map +1 -1
  27. package/dist/config.d.ts +6 -2
  28. package/dist/config.js +13 -3
  29. package/dist/config.js.map +1 -1
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.js +6 -0
  32. package/dist/index.js.map +1 -1
  33. package/dist/init.d.ts +17 -3
  34. package/dist/init.js +32 -13
  35. package/dist/init.js.map +1 -1
  36. package/dist/plan.d.ts +69 -0
  37. package/dist/plan.js +183 -0
  38. package/dist/plan.js.map +1 -0
  39. package/dist/report/html.js +55 -0
  40. package/dist/report/html.js.map +1 -1
  41. package/dist/report/markdown.js +32 -0
  42. package/dist/report/markdown.js.map +1 -1
  43. package/dist/report/terminal.js +40 -0
  44. package/dist/report/terminal.js.map +1 -1
  45. package/dist/types.d.ts +25 -0
  46. package/package.json +1 -1
  47. package/schematics/ng-add/index.cjs +7 -2
package/README.md CHANGED
@@ -21,6 +21,8 @@ npx ng-checkup
21
21
  - [Quick start](#quick-start)
22
22
  - [Set it up in a project](#set-it-up-in-a-project)
23
23
  - [Configuration](#configuration)
24
+ - [Baseline: adopt it on legacy code](#baseline-adopt-it-on-legacy-code)
25
+ - [Upgrade plan](#upgrade-plan)
24
26
  - [What it checks](#what-it-checks)
25
27
  - [Reports](#reports)
26
28
  - [In CI](#in-ci)
@@ -42,8 +44,9 @@ npx ng-checkup
42
44
  # 2. The full report as a page to share
43
45
  npx ng-checkup --report checkup.html
44
46
 
45
- # 3. Fail CI when an area turns poor
46
- npx ng-checkup --fail-on poor
47
+ # 3. Record today's numbers, then fail CI only when one gets worse
48
+ npx ng-checkup baseline
49
+ npx ng-checkup --fail-on regression
47
50
  ```
48
51
 
49
52
  Install dependencies first (`npm install`) if you can: the deprecated-API check reads the installed Angular packages, and without them it is skipped.
@@ -65,7 +68,8 @@ Both make the same changes and list what they changed:
65
68
  | `package.json` | a `"checkup": "ng-checkup"` script, and `ng-checkup` in `devDependencies` (`init` only; `ng add` installs it itself) |
66
69
  | `ng-checkup.config.json` | writes `checkup.html` on every run, and an empty `ignore` list |
67
70
  | `.gitignore` | the generated reports, if the repository has a `.gitignore` |
68
- | `.github/workflows/ng-checkup.yml` | runs on every pull request, fails on a poor area, uploads the reports (when `.github/` exists) |
71
+ | `ng-checkup.baseline.json` | today's numbers, so CI fails only when one gets worse ([baseline](#baseline-adopt-it-on-legacy-code)) |
72
+ | `.github/workflows/ng-checkup.yml` | runs on every pull request with `--fail-on regression`, uploads the reports (when `.github/` exists) |
69
73
  | `ng-checkup.gitlab-ci.yml` | the same as a GitLab job; add `include: [{ local: ng-checkup.gitlab-ci.yml }]` to your `.gitlab-ci.yml` (when that file exists) |
70
74
 
71
75
  After that it is `npm run checkup` (or `pnpm checkup`, `yarn checkup`; the lockfile decides). Running either command again changes nothing. It never overwrites a file you wrote: an existing workflow or config is kept, and a different `checkup` script is kept unless you pass `--force`.
@@ -92,13 +96,66 @@ npx ng-checkup init --ci gitlab # pick the CI instead of detecting it (github
92
96
  | Key | Meaning | Flag |
93
97
  | --- | --- | --- |
94
98
  | `reports` | report files to write, relative to the config file | `--report` |
95
- | `failOn` | exit with 1 when an area is `poor` (or `fair`) | `--fail-on` |
99
+ | `failOn` | exit with 1 when an area is `poor` (or `fair`), or with `regression` when a measure is worse than the baseline | `--fail-on` |
96
100
  | `maxExamples` | example files listed per finding | `--max-examples` |
97
101
  | `offline` | skip the npm lookup of the latest Angular version | `--offline` |
98
102
  | `ignore` | paths left out of the analysis; a path matches everything below it, `*` stays within a folder, `**` crosses folders | |
103
+ | `baseline` | the baseline file, relative to the config file (default `ng-checkup.baseline.json` in the root) | |
104
+ | `plan` | add the upgrade plan to every run | `--plan` |
99
105
 
100
106
  An unknown key or a wrong type stops the run with an error, so a typo cannot silently switch off a CI threshold. Use `--config path/to/file.json` for a file elsewhere.
101
107
 
108
+ ## Baseline: adopt it on legacy code
109
+
110
+ A ten-year-old Angular app will not pass `--fail-on poor` on day one, and a CI check that is red from the start gets switched off. The baseline fixes that: it records today's numbers, and CI fails only when one of them gets worse.
111
+
112
+ ```bash
113
+ npx ng-checkup baseline # writes ng-checkup.baseline.json; commit it
114
+ npx ng-checkup --fail-on regression # in CI: fails only on a number that went up
115
+ ```
116
+
117
+ ```text
118
+ Baseline 2 worse
119
+ worse Type safety: Explicit any in application code 13 → 15
120
+ worse Type safety: Non-null assertions (x!) 0 → 1
121
+ ```
122
+
123
+ - **It records counts, not grades:** explicit `any`, `x!`, files in import cycles, components without OnPush or a spec, NgModule-declared components, deprecated API uses and [18 more](https://github.com/stefankuburovic/ng-checkup/blob/main/docs/checks.md#measures). Lower is better for every one.
124
+ - **It only goes down.** When numbers drop, the run says so; `npx ng-checkup baseline` locks the new numbers in. If a number went up, `baseline` refuses and lists it, so a regression cannot be waved through by re-running the command. `--force` accepts it, which is the moment someone has to explain why in review.
125
+ - **It is a plain, sorted JSON file**, so lowering a number is a one-line diff in a merge request.
126
+ - **The gap to the latest Angular is not in it.** That grows when Angular ships, not when the code gets worse.
127
+
128
+ `ng add ng-checkup` and `npx ng-checkup init` create the first baseline and set CI to `--fail-on regression` for you.
129
+
130
+ ## Upgrade plan
131
+
132
+ ```bash
133
+ npx ng-checkup --plan --report plan.md
134
+ ```
135
+
136
+ `--plan` adds the way from your Angular version to the latest, one major at a time as `ng update` requires:
137
+
138
+ ```text
139
+ Upgrade plan 12 → 22, 10 steps, one major at a time
140
+ Before you start
141
+ · Move from TSLint to ESLint ng add @angular-eslint/schematics
142
+ → 13 ng update @angular/core@13 @angular/cli@13
143
+ Node.js ^12.20.0 || ^14.15.0 || >=16.10.0 · TypeScript >=4.4.2 <4.7 (now 4.3.5)
144
+ ...
145
+ → 16 ng update @angular/core@16 @angular/cli@16
146
+ Node.js ^16.14.0 || >=18.10.0 · TypeScript >=4.9.3 <5.2 · zone.js ~0.13.0 (now 0.11.8)
147
+ · Convert NgModule components to standalone (18) ng generate @angular/core:standalone
148
+ → 17 ng update @angular/core@17 @angular/cli@17
149
+ · Move templates to built-in control flow (13) ng generate @angular/core:control-flow
150
+ ...
151
+ ```
152
+
153
+ - **The same for everyone:** each step's `ng update` command (with Material and NgRx when you use them) and the Node.js, TypeScript, RxJS and zone.js ranges that major requires, from the versions' published package metadata. A range your project is outside of today is flagged at the step that has to move it.
154
+ - **Specific to your code:** the migrations your findings call for (standalone, built-in control flow, the esbuild builder, signal inputs, Vitest, zoneless), each scheduled at the first step where Angular ships it, with the number of places it touches. Migrations your code does not need are left out.
155
+ - **No time estimate.** Counts are measured; days would be a guess.
156
+
157
+ The plan is in every format, including the HTML report ([example](https://stefankuburovic.github.io/ng-checkup/example.html#plan-title)) and the JSON (`report.plan`).
158
+
102
159
  ## What it checks
103
160
 
104
161
  | Area | It looks at | Poor when |
@@ -137,6 +194,7 @@ Defaults that changed between versions are applied per version: a component with
137
194
  ```text
138
195
  Usage: ng-checkup [path] [options]
139
196
  ng-checkup init [path] [init options]
197
+ ng-checkup baseline [path] [--force]
140
198
 
141
199
  Arguments:
142
200
  path Repository root (default: current directory)
@@ -146,8 +204,11 @@ Options:
146
204
  .html, .md or .json. Repeatable.
147
205
  --json Print the report as JSON to stdout instead of the summary
148
206
  -v, --verbose Print every finding with its files
149
- --fail-on <grade> Exit with code 1 if any area is graded <grade> or worse:
150
- poor or fair (for CI)
207
+ --plan Add an upgrade plan to the latest Angular, one major
208
+ at a time, with the migrations this code needs
209
+ --fail-on <grade> Exit with code 1 if any area is graded <grade> or worse
210
+ (poor or fair), or with regression if a measure is
211
+ worse than the baseline (for CI)
151
212
  --max-examples <n> Example files listed per finding (default 5)
152
213
  --offline Do not look up the latest Angular version online
153
214
  --config <file> Config file (default: ng-checkup.config.json in the root)
@@ -159,9 +220,12 @@ Init options (ng-checkup init):
159
220
  --ci <provider> auto (default), github, gitlab or none
160
221
  --dry-run Show what would change without writing anything
161
222
  --force Replace an existing "checkup" script
223
+
224
+ Baseline options (ng-checkup baseline):
225
+ --force Accept measures that went up since the last baseline
162
226
  ```
163
227
 
164
- Exit codes: `0` done, `1` `--fail-on` tripped, `2` usage error. Areas graded `info` never fail a run.
228
+ Exit codes: `0` done, `1` `--fail-on` tripped, `2` usage error (including `--fail-on regression` without a baseline). Areas graded `info` never fail a run.
165
229
 
166
230
  </details>
167
231
 
@@ -176,7 +240,7 @@ Exit codes: `0` done, `1` `--fail-on` tripped, `2` usage error. Areas graded `in
176
240
  with:
177
241
  node-version: 22
178
242
  - run: npm ci
179
- - run: npx ng-checkup --fail-on poor --report checkup.md --report checkup.html
243
+ - run: npx ng-checkup --fail-on regression --report checkup.md --report checkup.html
180
244
  - uses: actions/upload-artifact@v4
181
245
  if: always()
182
246
  with:
@@ -191,13 +255,13 @@ ng-checkup:
191
255
  image: node:22
192
256
  script:
193
257
  - npm ci
194
- - npx ng-checkup --fail-on poor --report checkup.md --report checkup.html
258
+ - npx ng-checkup --fail-on regression --report checkup.md --report checkup.html
195
259
  artifacts:
196
260
  when: always
197
261
  paths: [checkup.md, checkup.html]
198
262
  ```
199
263
 
200
- Start with `--fail-on poor`. `--fail-on fair` is for codebases that are already in good shape and want to stay there.
264
+ On an existing codebase, start with a [baseline](#baseline-adopt-it-on-legacy-code) and `--fail-on regression`. `--fail-on poor` and `--fail-on fair` are for codebases that are already in good shape and want to stay there.
201
265
 
202
266
  ## Programmatic API
203
267
 
@@ -216,7 +280,7 @@ for (const check of report.checks) {
216
280
  await writeFile('checkup.md', renderMarkdown(report));
217
281
  ```
218
282
 
219
- `runCheckup` never writes anything. `renderHtml`, `renderMarkdown`, `overallScore`, `topPriorities`, `loadConfig` and `planInit` (what `init` would change, without writing it) are exported too, along with the `Report`, `CheckResult`, `Finding` and `Grade` types. `Report` is also the schema of the JSON output.
283
+ `runCheckup` never writes anything. `renderHtml`, `renderMarkdown`, `overallScore`, `topPriorities`, `loadConfig`, `planInit` (what `init` would change, without writing it) and the baseline functions (`createBaseline`, `compareWithBaseline`, `readBaseline`, `serializeBaseline`) are exported too, along with the `Report`, `CheckResult`, `Finding` and `Grade` types. `Report` is also the schema of the JSON output.
220
284
 
221
285
  ## What leaves your machine
222
286
 
@@ -244,8 +308,6 @@ One request: the latest `@angular/core` version from the npm registry, with a th
244
308
 
245
309
  ## Roadmap
246
310
 
247
- - Baseline mode: fail CI only when a number gets worse, so legacy code can adopt it on day one
248
- - Upgrade plan: the steps from your version to the latest, with the migrations each needs
249
311
  - Per-project reports for Nx and multi-project workspaces
250
312
  - Bundle size from the build's esbuild metafile
251
313
  - SARIF output for GitHub code scanning
@@ -0,0 +1,14 @@
1
+ /** What one Angular major requires, from the npm registry. A null field was not published for that major. */
2
+ export interface AngularVersionInfo {
3
+ major: number;
4
+ /** The last released version of the major when the snapshot was taken. */
5
+ version: string;
6
+ /** Node.js range from @angular/core's `engines`. */
7
+ node: string | null;
8
+ /** TypeScript range from @angular/compiler-cli's peer dependency. */
9
+ typescript: string | null;
10
+ rxjs: string | null;
11
+ zoneJs: string | null;
12
+ }
13
+ /** Every Angular major from 4 to the newest, oldest first. */
14
+ export declare const ANGULAR_VERSIONS: AngularVersionInfo[];
@@ -0,0 +1,157 @@
1
+ // Generated by scripts/update-angular-versions.mjs on 2026-10-20. Do not edit by hand.
2
+ /** Every Angular major from 4 to the newest, oldest first. */
3
+ export const ANGULAR_VERSIONS = [
4
+ {
5
+ "major": 4,
6
+ "version": "4.4.7",
7
+ "node": null,
8
+ "typescript": "^2.0.2",
9
+ "rxjs": "^5.0.1",
10
+ "zoneJs": "^0.8.4"
11
+ },
12
+ {
13
+ "major": 5,
14
+ "version": "5.2.11",
15
+ "node": null,
16
+ "typescript": ">=2.4.2 <2.7",
17
+ "rxjs": "^5.5.0",
18
+ "zoneJs": "^0.8.4"
19
+ },
20
+ {
21
+ "major": 6,
22
+ "version": "6.1.10",
23
+ "node": null,
24
+ "typescript": ">=2.7.2 <2.10",
25
+ "rxjs": "^6.0.0",
26
+ "zoneJs": "~0.8.26"
27
+ },
28
+ {
29
+ "major": 7,
30
+ "version": "7.2.15",
31
+ "node": null,
32
+ "typescript": ">=3.1.1 <3.3",
33
+ "rxjs": "^6.0.0",
34
+ "zoneJs": "~0.8.26"
35
+ },
36
+ {
37
+ "major": 8,
38
+ "version": "8.2.14",
39
+ "node": null,
40
+ "typescript": ">=3.4 <3.6",
41
+ "rxjs": "^6.4.0",
42
+ "zoneJs": "~0.9.1"
43
+ },
44
+ {
45
+ "major": 9,
46
+ "version": "9.1.13",
47
+ "node": null,
48
+ "typescript": ">=3.6 <3.9",
49
+ "rxjs": "^6.5.3",
50
+ "zoneJs": "~0.10.3"
51
+ },
52
+ {
53
+ "major": 10,
54
+ "version": "10.2.5",
55
+ "node": null,
56
+ "typescript": ">=3.9 <4.1",
57
+ "rxjs": "^6.5.3",
58
+ "zoneJs": "~0.10.3"
59
+ },
60
+ {
61
+ "major": 11,
62
+ "version": "11.2.14",
63
+ "node": null,
64
+ "typescript": ">=4.0 <4.2",
65
+ "rxjs": "^6.5.3",
66
+ "zoneJs": "^0.10.2 || ^0.11.3"
67
+ },
68
+ {
69
+ "major": 12,
70
+ "version": "12.2.17",
71
+ "node": "^12.14.1 || >=14.0.0",
72
+ "typescript": ">=4.2.3 <4.4",
73
+ "rxjs": "^6.5.3 || ^7.0.0",
74
+ "zoneJs": "~0.11.4"
75
+ },
76
+ {
77
+ "major": 13,
78
+ "version": "13.4.0",
79
+ "node": "^12.20.0 || ^14.15.0 || >=16.10.0",
80
+ "typescript": ">=4.4.2 <4.7",
81
+ "rxjs": "^6.5.3 || ^7.4.0",
82
+ "zoneJs": "~0.11.4"
83
+ },
84
+ {
85
+ "major": 14,
86
+ "version": "14.3.0",
87
+ "node": "^14.15.0 || >=16.10.0",
88
+ "typescript": ">=4.6.2 <4.9",
89
+ "rxjs": "^6.5.3 || ^7.4.0",
90
+ "zoneJs": "~0.11.4 || ~0.12.0"
91
+ },
92
+ {
93
+ "major": 15,
94
+ "version": "15.2.10",
95
+ "node": "^14.20.0 || ^16.13.0 || >=18.10.0",
96
+ "typescript": ">=4.8.2 <5.0",
97
+ "rxjs": "^6.5.3 || ^7.4.0",
98
+ "zoneJs": "~0.11.4 || ~0.12.0 || ~0.13.0"
99
+ },
100
+ {
101
+ "major": 16,
102
+ "version": "16.2.12",
103
+ "node": "^16.14.0 || >=18.10.0",
104
+ "typescript": ">=4.9.3 <5.2",
105
+ "rxjs": "^6.5.3 || ^7.4.0",
106
+ "zoneJs": "~0.13.0"
107
+ },
108
+ {
109
+ "major": 17,
110
+ "version": "17.3.12",
111
+ "node": "^18.13.0 || >=20.9.0",
112
+ "typescript": ">=5.2 <5.5",
113
+ "rxjs": "^6.5.3 || ^7.4.0",
114
+ "zoneJs": "~0.14.0"
115
+ },
116
+ {
117
+ "major": 18,
118
+ "version": "18.2.14",
119
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
120
+ "typescript": ">=5.4 <5.6",
121
+ "rxjs": "^6.5.3 || ^7.4.0",
122
+ "zoneJs": "~0.14.10"
123
+ },
124
+ {
125
+ "major": 19,
126
+ "version": "19.2.25",
127
+ "node": "^18.19.1 || ^20.11.1 || >=22.0.0",
128
+ "typescript": ">=5.5 <5.9",
129
+ "rxjs": "^6.5.3 || ^7.4.0",
130
+ "zoneJs": "~0.15.0"
131
+ },
132
+ {
133
+ "major": 20,
134
+ "version": "20.3.34",
135
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
136
+ "typescript": ">=5.8 <6.0",
137
+ "rxjs": "^6.5.3 || ^7.4.0",
138
+ "zoneJs": "~0.15.0"
139
+ },
140
+ {
141
+ "major": 21,
142
+ "version": "21.2.25",
143
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
144
+ "typescript": ">=5.9 <6.1",
145
+ "rxjs": "^6.5.3 || ^7.4.0",
146
+ "zoneJs": "~0.15.0 || ~0.16.0"
147
+ },
148
+ {
149
+ "major": 22,
150
+ "version": "22.2.3",
151
+ "node": "^22.22.3 || ^24.15.0 || >=26.0.0",
152
+ "typescript": ">=6.0 <6.1",
153
+ "rxjs": "^6.5.3 || ^7.4.0",
154
+ "zoneJs": "~0.15.0 || ~0.16.0"
155
+ }
156
+ ];
157
+ //# sourceMappingURL=angular-versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-versions.js","sourceRoot":"","sources":["../src/angular-versions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import type { Report } from './types.js';
2
+ /** The file `ng-checkup baseline` writes and every run compares against, in the analysed root. */
3
+ export declare const BASELINE_FILE = "ng-checkup.baseline.json";
4
+ /**
5
+ * Recorded measures of one point in time.
6
+ *
7
+ * Kept deliberately flat (`"type-safety.explicit-any": 28`) and with sorted
8
+ * keys, because it is committed and reviewed: a merge request that lowers a
9
+ * number shows as a one-line diff, and one that raises it stands out.
10
+ */
11
+ export interface Baseline {
12
+ version: 1;
13
+ /** `ng-checkup <version>` that wrote it. */
14
+ tool: string;
15
+ /** Date of the last update, `YYYY-MM-DD`. */
16
+ updated: string;
17
+ /** `checkId.measureId` to its value. Lower is better for every one. */
18
+ measures: Record<string, number>;
19
+ }
20
+ /** One measure that moved against the baseline. */
21
+ export interface MeasureDelta {
22
+ /** `checkId.measureId`. */
23
+ key: string;
24
+ check: string;
25
+ label: string;
26
+ before: number;
27
+ after: number;
28
+ }
29
+ /** How a report compares with a baseline. Attached to `Report.baseline`. */
30
+ export interface BaselineComparison {
31
+ /** The baseline file, as given. */
32
+ path: string;
33
+ /** Measures that went up: what `--fail-on regression` fails on. */
34
+ regressions: MeasureDelta[];
35
+ /** Measures that went down: run `ng-checkup baseline` to lock them in. */
36
+ improvements: MeasureDelta[];
37
+ /** Measures the baseline does not know yet, e.g. from a newer ng-checkup. Never a failure. */
38
+ added: string[];
39
+ }
40
+ /** Every measure of a report under its baseline key, with its check's title for display. */
41
+ export declare function measuresOf(report: Report): Map<string, {
42
+ check: string;
43
+ label: string;
44
+ value: number;
45
+ }>;
46
+ /** A baseline of the report's current measures. */
47
+ export declare function createBaseline(report: Report, today?: string): Baseline;
48
+ /** The baseline as committed: two-space JSON with a final newline. */
49
+ export declare function serializeBaseline(baseline: Baseline): string;
50
+ /**
51
+ * Reads a baseline file. Undefined when it does not exist.
52
+ *
53
+ * @throws On malformed content. A broken baseline must stop a CI run rather
54
+ * than compare against nothing and pass.
55
+ */
56
+ export declare function readBaseline(path: string): Baseline | undefined;
57
+ /**
58
+ * Compares a report with a baseline. A measure the report has no value for
59
+ * (its check graded `info` this time) is skipped rather than counted as an
60
+ * improvement: it was not measured, not fixed.
61
+ */
62
+ export declare function compareWithBaseline(report: Report, baseline: Baseline, path: string): BaselineComparison;
63
+ /**
64
+ * The measures that would go up if `next` replaced `previous`. Updating a
65
+ * baseline may only lower numbers; raising one needs `--force`, which is the
66
+ * moment someone has to say why in review. Empty for a first baseline.
67
+ */
68
+ export declare function baselineIncreases(previous: Baseline | undefined, next: Baseline): Array<{
69
+ key: string;
70
+ before: number;
71
+ after: number;
72
+ }>;
@@ -0,0 +1,82 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ /** The file `ng-checkup baseline` writes and every run compares against, in the analysed root. */
3
+ export const BASELINE_FILE = 'ng-checkup.baseline.json';
4
+ /** Every measure of a report under its baseline key, with its check's title for display. */
5
+ export function measuresOf(report) {
6
+ const result = new Map();
7
+ for (const check of report.checks) {
8
+ for (const measure of check.measures ?? [])
9
+ result.set(`${check.id}.${measure.id}`, { check: check.title, label: measure.label, value: measure.value });
10
+ }
11
+ return result;
12
+ }
13
+ /** A baseline of the report's current measures. */
14
+ export function createBaseline(report, today = report.generatedAt.slice(0, 10)) {
15
+ const measures = {};
16
+ for (const [key, measure] of [...measuresOf(report)].sort(([left], [right]) => left.localeCompare(right)))
17
+ measures[key] = measure.value;
18
+ return { version: 1, tool: `${report.tool.name} ${report.tool.version}`, updated: today, measures };
19
+ }
20
+ /** The baseline as committed: two-space JSON with a final newline. */
21
+ export function serializeBaseline(baseline) {
22
+ return `${JSON.stringify(baseline, null, 2)}\n`;
23
+ }
24
+ /**
25
+ * Reads a baseline file. Undefined when it does not exist.
26
+ *
27
+ * @throws On malformed content. A broken baseline must stop a CI run rather
28
+ * than compare against nothing and pass.
29
+ */
30
+ export function readBaseline(path) {
31
+ if (!existsSync(path))
32
+ return undefined;
33
+ let raw;
34
+ try {
35
+ raw = JSON.parse(readFileSync(path, 'utf8'));
36
+ }
37
+ catch (error) {
38
+ throw new Error(`${path} is not valid JSON: ${error instanceof Error ? error.message : String(error)}`);
39
+ }
40
+ const record = (typeof raw === 'object' && raw !== null ? raw : {});
41
+ const measures = record['measures'];
42
+ if (record['version'] !== 1 || typeof measures !== 'object' || measures === null || Array.isArray(measures) || !Object.values(measures).every((value) => typeof value === 'number')) {
43
+ throw new Error(`${path} is not an ng-checkup baseline (expected version 1 and numeric measures). Recreate it with ng-checkup baseline --force.`);
44
+ }
45
+ return { version: 1, tool: String(record['tool'] ?? ''), updated: String(record['updated'] ?? ''), measures: measures };
46
+ }
47
+ /**
48
+ * Compares a report with a baseline. A measure the report has no value for
49
+ * (its check graded `info` this time) is skipped rather than counted as an
50
+ * improvement: it was not measured, not fixed.
51
+ */
52
+ export function compareWithBaseline(report, baseline, path) {
53
+ const regressions = [];
54
+ const improvements = [];
55
+ const added = [];
56
+ for (const [key, current] of measuresOf(report)) {
57
+ const before = baseline.measures[key];
58
+ if (before === undefined) {
59
+ added.push(key);
60
+ continue;
61
+ }
62
+ const delta = { key, check: current.check, label: current.label, before, after: current.value };
63
+ if (current.value > before)
64
+ regressions.push(delta);
65
+ else if (current.value < before)
66
+ improvements.push(delta);
67
+ }
68
+ return { path, regressions, improvements, added };
69
+ }
70
+ /**
71
+ * The measures that would go up if `next` replaced `previous`. Updating a
72
+ * baseline may only lower numbers; raising one needs `--force`, which is the
73
+ * moment someone has to say why in review. Empty for a first baseline.
74
+ */
75
+ export function baselineIncreases(previous, next) {
76
+ if (!previous)
77
+ return [];
78
+ return Object.entries(next.measures)
79
+ .filter(([key, value]) => previous.measures[key] !== undefined && value > previous.measures[key])
80
+ .map(([key, after]) => ({ key, before: previous.measures[key], after }));
81
+ }
82
+ //# sourceMappingURL=baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline.js","sourceRoot":"","sources":["../src/baseline.ts"],"names":[],"mappings":"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"}
@@ -84,6 +84,11 @@ export function changeDetectionCheck(context) {
84
84
  { label: 'Zone test helpers', value: formatCount(zoneHelpers) },
85
85
  ],
86
86
  findings,
87
+ measures: [
88
+ { id: 'eager-components', label: 'Components with eager change detection', value: eager.length },
89
+ { id: 'ngzone-files', label: 'Files injecting NgZone', value: ngZoneFiles.length },
90
+ { id: 'zone-test-helpers', label: 'Zone-based test helper calls', value: zoneHelpers },
91
+ ],
87
92
  };
88
93
  }
89
94
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"change-detection.js","sourceRoot":"","sources":["../../src/checks/change-detection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"change-detection.js","sourceRoot":"","sources":["../../src/checks/change-detection.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,9 @@ export function circularDepsCheck(context) {
38
38
  { label: 'Largest tangle', value: formatCount(largest), hint: 'files' },
39
39
  ],
40
40
  findings,
41
+ measures: [
42
+ { id: 'files-in-cycles', label: 'Files in import cycles', value: filesInTangles },
43
+ ],
41
44
  };
42
45
  }
43
46
  //# sourceMappingURL=circular-deps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"circular-deps.js","sourceRoot":"","sources":["../../src/checks/circular-deps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"circular-deps.js","sourceRoot":"","sources":["../../src/checks/circular-deps.ts"],"names":[],"mappings":"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"}
@@ -85,6 +85,11 @@ export function componentsCheck(context) {
85
85
  summary: `${plural(components.length, 'component')}: ${standaloneShare}% standalone, ${inputs > 0 ? `${signalInputShare}% signal inputs` : 'no inputs'}, ${controlFlow > 0 ? `${controlFlowShare}% built-in control flow` : 'no control flow'}.`,
86
86
  metrics,
87
87
  findings,
88
+ measures: [
89
+ { id: 'module-components', label: 'Components declared in NgModules', value: moduleBased.length },
90
+ { id: 'decorator-inputs-outputs', label: '@Input() / @Output() decorators', value: decoratorInputs + decoratorOutputs },
91
+ { id: 'legacy-control-flow', label: '*ngIf / *ngFor / [ngSwitch] uses', value: totals.legacy },
92
+ ],
88
93
  };
89
94
  }
90
95
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/checks/components.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/checks/components.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ export function deprecatedApisCheck(context) {
29
29
  detail: 'Deprecations are read from the `@deprecated` tags of the installed `@angular/*` and `@ngrx/*` type definitions, so they always match the version the project actually uses.',
30
30
  },
31
31
  ],
32
+ measures: [{ id: 'legacy-template-directives', label: '*ngIf / *ngFor / [ngSwitch] uses', value: legacyUses }],
32
33
  };
33
34
  }
34
35
  const usages = new Map();
@@ -95,6 +96,10 @@ export function deprecatedApisCheck(context) {
95
96
  { label: 'Legacy template directives', value: formatCount(legacyUses), hint: ngIf ? 'deprecated' : 'not deprecated in this version' },
96
97
  ],
97
98
  findings,
99
+ measures: [
100
+ { id: 'deprecated-usages', label: 'Deprecated API uses (symbol × file)', value: sorted.reduce((sum, usage) => sum + usage.refs.length, 0) },
101
+ { id: 'legacy-template-directives', label: '*ngIf / *ngFor / [ngSwitch] uses', value: legacyUses },
102
+ ],
98
103
  };
99
104
  }
100
105
  /**