ng-checkup 0.3.0 → 0.5.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 (69) hide show
  1. package/README.md +116 -10
  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/bundle.d.ts +58 -0
  6. package/dist/bundle.js +189 -0
  7. package/dist/bundle.js.map +1 -0
  8. package/dist/cache.d.ts +41 -0
  9. package/dist/cache.js +36 -0
  10. package/dist/cache.js.map +1 -0
  11. package/dist/checks/architecture.d.ts +21 -0
  12. package/dist/checks/architecture.js +108 -0
  13. package/dist/checks/architecture.js.map +1 -0
  14. package/dist/checks/bundle.d.ts +24 -0
  15. package/dist/checks/bundle.js +112 -0
  16. package/dist/checks/bundle.js.map +1 -0
  17. package/dist/checks/context.d.ts +13 -0
  18. package/dist/checks/context.js.map +1 -1
  19. package/dist/checks/dependencies.d.ts +18 -0
  20. package/dist/checks/dependencies.js +89 -0
  21. package/dist/checks/dependencies.js.map +1 -0
  22. package/dist/checks/deprecated-apis.js +23 -3
  23. package/dist/checks/deprecated-apis.js.map +1 -1
  24. package/dist/checks/security.d.ts +17 -0
  25. package/dist/checks/security.js +87 -0
  26. package/dist/checks/security.js.map +1 -0
  27. package/dist/cli.d.ts +12 -0
  28. package/dist/cli.js +108 -14
  29. package/dist/cli.js.map +1 -1
  30. package/dist/compatibility.d.ts +43 -0
  31. package/dist/compatibility.js +131 -0
  32. package/dist/compatibility.js.map +1 -0
  33. package/dist/config.d.ts +4 -0
  34. package/dist/config.js +10 -3
  35. package/dist/config.js.map +1 -1
  36. package/dist/deprecations.js +21 -8
  37. package/dist/deprecations.js.map +1 -1
  38. package/dist/graph.d.ts +20 -0
  39. package/dist/graph.js +30 -0
  40. package/dist/graph.js.map +1 -1
  41. package/dist/index.d.ts +15 -4
  42. package/dist/index.js +141 -13
  43. package/dist/index.js.map +1 -1
  44. package/dist/plan.d.ts +70 -0
  45. package/dist/plan.js +219 -0
  46. package/dist/plan.js.map +1 -0
  47. package/dist/report/html.js +63 -1
  48. package/dist/report/html.js.map +1 -1
  49. package/dist/report/markdown.js +29 -1
  50. package/dist/report/markdown.js.map +1 -1
  51. package/dist/report/sarif.d.ts +20 -0
  52. package/dist/report/sarif.js +83 -0
  53. package/dist/report/sarif.js.map +1 -0
  54. package/dist/report/summary.d.ts +11 -2
  55. package/dist/report/summary.js +12 -0
  56. package/dist/report/summary.js.map +1 -1
  57. package/dist/report/terminal.js +39 -1
  58. package/dist/report/terminal.js.map +1 -1
  59. package/dist/scan.d.ts +43 -0
  60. package/dist/scan.js +60 -0
  61. package/dist/scan.js.map +1 -1
  62. package/dist/types.d.ts +37 -0
  63. package/dist/watch.d.ts +47 -0
  64. package/dist/watch.js +107 -0
  65. package/dist/watch.js.map +1 -0
  66. package/dist/workspace.d.ts +41 -0
  67. package/dist/workspace.js +86 -3
  68. package/dist/workspace.js.map +1 -1
  69. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,26 +1,39 @@
1
1
  import { readFileSync } from 'node:fs';
2
2
  import { dirname, resolve } from 'node:path';
3
+ import { readBundleStats } from './bundle.js';
4
+ import { bundleCheck } from './checks/bundle.js';
5
+ import { architectureCheck } from './checks/architecture.js';
3
6
  import { changeDetectionCheck } from './checks/change-detection.js';
4
7
  import { circularDepsCheck } from './checks/circular-deps.js';
5
8
  import { componentsCheck } from './checks/components.js';
6
9
  import { deprecatedApisCheck } from './checks/deprecated-apis.js';
10
+ import { dependenciesCheck } from './checks/dependencies.js';
11
+ import { readCompatibility } from './compatibility.js';
12
+ import { securityCheck } from './checks/security.js';
7
13
  import { stateCheck } from './checks/state.js';
8
14
  import { testingCheck } from './checks/testing.js';
9
15
  import { typeSafetyCheck } from './checks/type-safety.js';
10
16
  import { versionCheck } from './checks/version.js';
17
+ import { cachedFacts, dependencyStamp } from './cache.js';
11
18
  import { buildDeprecationIndex } from './deprecations.js';
12
19
  import { ignoreMatcher } from './config.js';
13
20
  import { collectFiles } from './files.js';
14
- import { findTangles, readCompilerOptions } from './graph.js';
21
+ import { buildImportGraph, findTanglesIn, readCompilerOptions, staticallyReachable } from './graph.js';
22
+ import { buildPlan } from './plan.js';
15
23
  import { scanSourceFile, scanTemplateFile } from './scan.js';
16
- import { asRecord, majorOf, readJson, readWorkspace } from './workspace.js';
24
+ import { overallScore } from './report/summary.js';
25
+ import { applicationEntries, asRecord, majorOf, owningProject, readJson, readWorkspace, restrictToProject } from './workspace.js';
17
26
  // The renderers and the score are public so a script can turn a report from
18
27
  // `runCheckup` into the same HTML or Markdown the CLI writes, e.g. to post it
19
28
  // as a pull-request comment.
20
29
  export { renderHtml } from './report/html.js';
21
30
  export { renderMarkdown } from './report/markdown.js';
31
+ export { renderSarif } from './report/sarif.js';
32
+ export { createAnalysisCache } from './cache.js';
22
33
  export { overallScore, topPriorities } from './report/summary.js';
23
34
  export { CONFIG_FILE, loadConfig } from './config.js';
35
+ export { buildPlan } from './plan.js';
36
+ export { ANGULAR_VERSIONS } from './angular-versions.js';
24
37
  export { BASELINE_FILE, baselineIncreases, compareWithBaseline, createBaseline, readBaseline, serializeBaseline, } from './baseline.js';
25
38
  export { planInit } from './init.js';
26
39
  /**
@@ -33,16 +46,42 @@ export const BUNDLED_LATEST_ANGULAR_MAJOR = 22;
33
46
  * The checks in report order: the upgrade blockers first (version,
34
47
  * deprecations), then the modernisation areas, then the structural ones.
35
48
  */
36
- export const CHECKS = [versionCheck, deprecatedApisCheck, changeDetectionCheck, componentsCheck, stateCheck, testingCheck, typeSafetyCheck, circularDepsCheck];
49
+ export const CHECKS = [
50
+ versionCheck,
51
+ deprecatedApisCheck,
52
+ dependenciesCheck,
53
+ changeDetectionCheck,
54
+ componentsCheck,
55
+ stateCheck,
56
+ architectureCheck,
57
+ testingCheck,
58
+ typeSafetyCheck,
59
+ securityCheck,
60
+ circularDepsCheck,
61
+ bundleCheck,
62
+ ];
63
+ /**
64
+ * The checks that grade a project's own code, for the per-project breakdown.
65
+ * `version` and `dependencies` read the root `package.json`, which all
66
+ * projects of a workspace share.
67
+ */
68
+ const PROJECT_CHECKS = CHECKS.filter((check) => check !== versionCheck && check !== dependenciesCheck);
69
+ /** Thrown by `runCheckup` for a `project` option that names no project; the message lists the names. */
70
+ export class ProjectNotFoundError extends Error {
71
+ name = 'ProjectNotFoundError';
72
+ }
37
73
  /** This package's own name and version, read from its package.json at runtime so the two never drift. */
38
74
  export const TOOL = readToolInfo();
39
75
  /**
40
76
  * Analyses the Angular codebase at `root` and returns the full report.
41
77
  *
42
- * Reads the disk and, unless `offline` is set, makes one request to the npm
43
- * registry for the latest `@angular/core` version (three-second timeout,
44
- * falling back to `BUNDLED_LATEST_ANGULAR_MAJOR`). Nothing else leaves the
45
- * machine: no source, no file names, no telemetry. Never writes anything.
78
+ * Reads the disk and, unless `offline` is set, asks the npm registry for the
79
+ * latest `@angular/core` version (three-second timeout, falling back to
80
+ * `BUNDLED_LATEST_ANGULAR_MAJOR`) and for the metadata of each installed
81
+ * package that depends on Angular (see `readCompatibility`). Only package
82
+ * names leave the machine: no source, no file names, no telemetry. Never
83
+ * writes anything. With `options.cache`, a repeated run re-parses only the
84
+ * files that changed and repeats no registry request (see `AnalysisCache`).
46
85
  */
47
86
  export async function runCheckup(root, options = {}) {
48
87
  const started = Date.now();
@@ -50,6 +89,8 @@ export async function runCheckup(root, options = {}) {
50
89
  const context = await buildContext(absoluteRoot, options);
51
90
  const checks = CHECKS.map((check) => check(context));
52
91
  const application = context.sources.filter((file) => !file.isSpec);
92
+ const plan = options.plan ? buildPlan(context.workspace, checks, context.latestAngular.major, undefined, context.compatibility) : undefined;
93
+ const projects = options.project ? [] : projectBreakdown(context);
53
94
  return {
54
95
  tool: TOOL,
55
96
  generatedAt: new Date().toISOString(),
@@ -64,26 +105,113 @@ export async function runCheckup(root, options = {}) {
64
105
  },
65
106
  checks,
66
107
  durationMs: Date.now() - started,
108
+ ...(plan ? { plan } : {}),
109
+ ...(projects.length >= 2 ? { projects } : {}),
110
+ };
111
+ }
112
+ /**
113
+ * Runs the code checks once per project on the files it owns (see
114
+ * `owningProject`), worst score first. Parsing is shared with the
115
+ * whole-workspace run, so this costs only the checks, not a second scan.
116
+ *
117
+ * Import cycles are taken from the workspace graph and kept only when every
118
+ * file of the cycle belongs to the project; a cycle across two projects is in
119
+ * the whole-workspace report and in neither row, since neither project can
120
+ * cut it alone. A project with no file importing `@angular/*` gets no row:
121
+ * Nx workspaces routinely hold React apps, Node services and Cypress or
122
+ * Playwright e2e projects, and grading those on OnPush and strictTemplates
123
+ * would fill the table with noise.
124
+ */
125
+ function projectBreakdown(context) {
126
+ const { projects } = context.workspace;
127
+ if (projects.length < 2)
128
+ return [];
129
+ const ownerOf = (path) => owningProject(path, projects);
130
+ const rows = [];
131
+ for (const project of projects) {
132
+ const sources = context.sources.filter((file) => ownerOf(file.path) === project);
133
+ if (!sources.some((file) => file.imports.some((fact) => fact.specifier.startsWith('@angular/'))))
134
+ continue;
135
+ const projectContext = narrowContext(context, project, ownerOf);
136
+ const checks = PROJECT_CHECKS.map((check) => check(projectContext));
137
+ rows.push({
138
+ name: project.name,
139
+ root: project.root,
140
+ type: project.type,
141
+ sourceFiles: sources.length,
142
+ linesOfCode: sources.filter((file) => !file.isSpec).reduce((sum, file) => sum + file.linesOfCode, 0),
143
+ score: overallScore({ checks }),
144
+ grades: Object.fromEntries(checks.map((check) => [check.id, check.grade])),
145
+ highFindings: checks.reduce((sum, check) => sum + check.findings.filter((finding) => finding.severity === 'high').length, 0),
146
+ });
147
+ }
148
+ return rows.sort((left, right) => (left.score ?? 101) - (right.score ?? 101) || left.name.localeCompare(right.name));
149
+ }
150
+ /** The context of one project: its files, its cycles, its tsconfig. Everything read from the registry or `node_modules` is shared. */
151
+ function narrowContext(context, project, ownerOf) {
152
+ const workspace = restrictToProject(context.workspace, project);
153
+ return {
154
+ ...context,
155
+ workspace,
156
+ sources: context.sources.filter((file) => ownerOf(file.path) === project),
157
+ templates: context.templates.filter((template) => ownerOf(template.path) === project),
158
+ tangles: context.tangles.filter((tangle) => tangle.files.every((path) => ownerOf(path) === project)),
159
+ bundles: context.bundles.filter((bundle) => bundle.project === project.name),
160
+ appCompilerOptions: readCompilerOptions(workspace.appTsconfig),
161
+ angularCompilerOptions: workspace.appTsconfig ? readAngularCompilerOptions(workspace.appTsconfig) : {},
67
162
  };
68
163
  }
69
164
  /** Gathers everything the checks read. Exported for tests that want to inspect the facts. */
70
165
  export async function buildContext(root, options) {
71
166
  const files = collectFiles(root, ignoreMatcher(options.ignore));
72
167
  const workspace = readWorkspace(root, files.projectJsons);
73
- const sources = files.typescript.map((path) => scanSourceFile(root, path));
74
- const templates = [...files.html.map((path) => scanTemplateFile(root, path)), ...sources.flatMap((file) => file.inlineTemplates)];
168
+ const { cache } = options;
169
+ const sources = files.typescript.map((path) => cachedFacts(cache, path, () => scanSourceFile(root, path)));
170
+ const templates = [...files.html.map((path) => cachedFacts(cache, path, () => scanTemplateFile(root, path))), ...sources.flatMap((file) => file.inlineTemplates)];
171
+ // Drop entries for files that no longer exist, so a deleted file stops counting.
172
+ if (cache) {
173
+ const present = new Set([...files.typescript, ...files.html]);
174
+ for (const path of cache.files.keys())
175
+ if (!present.has(path))
176
+ cache.files.delete(path);
177
+ }
75
178
  const appCompilerOptions = readCompilerOptions(workspace.appTsconfig);
76
- return {
179
+ const stamp = dependencyStamp(root);
180
+ let dependencies = cache?.dependencies?.stamp === stamp ? cache.dependencies : undefined;
181
+ if (!dependencies) {
182
+ const latestAngular = options.offline ? { major: BUNDLED_LATEST_ANGULAR_MAJOR, source: 'bundled' } : await fetchLatestAngularMajor();
183
+ dependencies = { stamp, latestAngular, deprecations: buildDeprecationIndex(root), compatibility: await readCompatibility(workspace, latestAngular.major, options.offline ?? false) };
184
+ if (cache)
185
+ cache.dependencies = dependencies;
186
+ }
187
+ const { latestAngular } = dependencies;
188
+ const graph = buildImportGraph(sources, readCompilerOptions(workspace.rootTsconfig));
189
+ const eagerFiles = staticallyReachable(graph, applicationEntries(workspace));
190
+ const context = {
77
191
  workspace,
78
192
  sources,
79
193
  templates,
80
- deprecations: buildDeprecationIndex(root),
81
- tangles: findTangles(sources, readCompilerOptions(workspace.rootTsconfig)),
82
- latestAngular: options.offline ? { major: BUNDLED_LATEST_ANGULAR_MAJOR, source: 'bundled' } : await fetchLatestAngularMajor(),
194
+ deprecations: dependencies.deprecations,
195
+ tangles: findTanglesIn(graph),
196
+ ...(eagerFiles.size > 0 ? { eagerFiles } : {}),
197
+ latestAngular,
198
+ compatibility: dependencies.compatibility,
199
+ bundles: readBundleStats(workspace),
83
200
  appCompilerOptions,
84
201
  angularCompilerOptions: workspace.appTsconfig ? readAngularCompilerOptions(workspace.appTsconfig) : {},
85
202
  maxExamples: options.maxExamples ?? 5,
86
203
  };
204
+ if (options.project === undefined)
205
+ return context;
206
+ const project = workspace.projects.find((entry) => entry.name === options.project);
207
+ if (!project) {
208
+ const names = workspace.projects.map((entry) => entry.name).sort();
209
+ throw new ProjectNotFoundError(`No project named ${options.project}. ${names.length > 0 ? `Projects: ${names.join(', ')}` : 'This workspace declares no projects (no angular.json or project.json).'}`);
210
+ }
211
+ // Narrowed after the whole-workspace graph is built, so an import into
212
+ // another project still resolves and a cycle through it is recognised as
213
+ // crossing projects rather than silently broken.
214
+ return narrowContext(context, project, (path) => owningProject(path, workspace.projects));
87
215
  }
88
216
  /**
89
217
  * The latest `@angular/core` major from the npm registry, or the bundled
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/plan.d.ts ADDED
@@ -0,0 +1,70 @@
1
+ import { type AngularVersionInfo } from './angular-versions.js';
2
+ import type { PackageCompatibility } from './compatibility.js';
3
+ import type { CheckResult } from './types.js';
4
+ import { type WorkspaceInfo } from './workspace.js';
5
+ /** One requirement of a step, checked against what the project has now. */
6
+ export interface PlanRequirement {
7
+ name: 'Node.js' | 'TypeScript' | 'RxJS' | 'zone.js';
8
+ /** The range the target major accepts, from the registry snapshot. */
9
+ range: string;
10
+ /** The project's version today, when known (installed first, then the package.json range). Never known for Node.js. */
11
+ current?: string;
12
+ /**
13
+ * False when `current` is outside `range`: this step has to move it.
14
+ * Undefined when it cannot be judged (Node.js, or no version known).
15
+ */
16
+ satisfied?: boolean;
17
+ }
18
+ /** One thing to do in a step, specific to this codebase. */
19
+ export interface PlanItem {
20
+ title: string;
21
+ /** The command that does it, when there is one. */
22
+ command?: string;
23
+ detail?: string;
24
+ /** How many places in the code it touches, when the analysis counted them. */
25
+ count?: number;
26
+ }
27
+ /** Moving from one major to the next. */
28
+ export interface UpgradeStep {
29
+ /** The major this step reaches. */
30
+ to: number;
31
+ /** The last released version of that major. */
32
+ version: string;
33
+ command: string;
34
+ requirements: PlanRequirement[];
35
+ items: PlanItem[];
36
+ }
37
+ /** The way from the installed Angular to the target. Attached to `Report.plan`. */
38
+ export interface UpgradePlan {
39
+ from: number;
40
+ to: number;
41
+ /** Things to settle before the first `ng update`. */
42
+ before: PlanItem[];
43
+ steps: UpgradeStep[];
44
+ }
45
+ /**
46
+ * Plans the upgrade from the installed Angular major to `target`, one major
47
+ * at a time as `ng update` requires.
48
+ *
49
+ * Each step carries what is the same for everyone (the command, and the
50
+ * Node.js / TypeScript / RxJS / zone.js ranges from the registry snapshot in
51
+ * `angular-versions.ts`) and what is specific to this codebase: the
52
+ * migrations its findings call for, scheduled at the first step where
53
+ * Angular ships them, with the count of places each one touches. A migration
54
+ * the code does not need is left out, which is what makes the plan read as
55
+ * this project's and not as the Angular changelog.
56
+ *
57
+ * Deliberately gives no time estimate. Counts are measured; days would be a
58
+ * guess dressed up as data.
59
+ *
60
+ * @returns Undefined when the Angular version is unknown, or already at or
61
+ * past the target.
62
+ */
63
+ export declare function buildPlan(workspace: WorkspaceInfo, checks: CheckResult[], target: number, versions?: AngularVersionInfo[], compatibility?: PackageCompatibility[]): UpgradePlan | undefined;
64
+ /**
65
+ * Whether `version` falls in an npm range of the shapes Angular publishes:
66
+ * alternatives joined by `||`, each a space-separated set of comparators
67
+ * (`>=4.8.2 <5.0`, `^14.20.0`, `~0.15.0`, `>=18.10.0`, `6.0.x`). Enough for
68
+ * the requirement ranges in the snapshot, not a general semver implementation.
69
+ */
70
+ export declare function satisfies(version: [number, number, number], range: string): boolean;
package/dist/plan.js ADDED
@@ -0,0 +1,219 @@
1
+ import { ANGULAR_VERSIONS } from './angular-versions.js';
2
+ import { readInstalledVersion } from './workspace.js';
3
+ /**
4
+ * Plans the upgrade from the installed Angular major to `target`, one major
5
+ * at a time as `ng update` requires.
6
+ *
7
+ * Each step carries what is the same for everyone (the command, and the
8
+ * Node.js / TypeScript / RxJS / zone.js ranges from the registry snapshot in
9
+ * `angular-versions.ts`) and what is specific to this codebase: the
10
+ * migrations its findings call for, scheduled at the first step where
11
+ * Angular ships them, with the count of places each one touches. A migration
12
+ * the code does not need is left out, which is what makes the plan read as
13
+ * this project's and not as the Angular changelog.
14
+ *
15
+ * Deliberately gives no time estimate. Counts are measured; days would be a
16
+ * guess dressed up as data.
17
+ *
18
+ * @returns Undefined when the Angular version is unknown, or already at or
19
+ * past the target.
20
+ */
21
+ export function buildPlan(workspace, checks, target, versions = ANGULAR_VERSIONS, compatibility = []) {
22
+ const from = workspace.angular.major;
23
+ if (from === undefined || from >= target)
24
+ return undefined;
25
+ const measure = (check, id) => checks.find((result) => result.id === check)?.measures?.find((entry) => entry.id === id)?.value ?? 0;
26
+ const metric = (check, label) => {
27
+ const value = checks.find((result) => result.id === check)?.metrics.find((entry) => entry.label === label)?.value;
28
+ return value === undefined ? undefined : String(value);
29
+ };
30
+ const dependencies = workspace.dependencies;
31
+ const has = (name) => name in dependencies;
32
+ const current = {
33
+ typescript: readInstalledVersion(workspace.root, 'typescript') ?? dependencies['typescript'],
34
+ rxjs: readInstalledVersion(workspace.root, 'rxjs') ?? dependencies['rxjs'],
35
+ zoneJs: readInstalledVersion(workspace.root, 'zone.js') ?? dependencies['zone.js'],
36
+ };
37
+ const before = [];
38
+ const overdue = checks.find((result) => result.id === 'deprecated-apis')?.findings.filter((finding) => finding.severity === 'high') ?? [];
39
+ if (overdue.length > 0) {
40
+ before.push({ title: 'Replace APIs deprecated two or more majors ago', detail: 'Any of the next steps may remove them. The deprecated-APIs section lists each one with its replacement.', count: overdue.reduce((sum, finding) => sum + (finding.count ?? 1), 0) });
41
+ }
42
+ if (has('tslint') || has('codelyzer')) {
43
+ before.push({ title: 'Move from TSLint to ESLint', command: 'ng add @angular-eslint/schematics', detail: 'TSLint is deprecated and later versions of the Angular CLI no longer support it.' });
44
+ }
45
+ if (measure('circular-deps', 'files-in-cycles') > 0) {
46
+ before.push({ title: 'Break the import cycles', detail: 'A cycle that works by luck of load order is the first thing a new compiler or bundler breaks, and the failure looks unrelated to the upgrade.', count: measure('circular-deps', 'files-in-cycles') });
47
+ }
48
+ for (const entry of compatibility.filter((candidate) => !candidate.supportsCurrent)) {
49
+ const release = entry.releaseFor?.[from];
50
+ before.push({
51
+ title: `Fix ${entry.name}: version ${entry.installed} does not accept Angular ${from}`,
52
+ command: release ? `npm install ${entry.name}@${release.version}` : undefined,
53
+ detail: release ? `Version ${release.version} does.` : `It declares @angular/core ${entry.angularRange}.`,
54
+ });
55
+ }
56
+ /**
57
+ * The Angular range each third-party package has at the current point of the
58
+ * plan. A step that falls outside it gets an "update to X" item, and the
59
+ * range moves to X's, so a later step is only flagged if X stops short too.
60
+ */
61
+ const packageRanges = new Map(compatibility.filter((entry) => entry.supportsCurrent && entry.blocksAt !== undefined).map((entry) => [entry.name, entry.angularRange]));
62
+ const packageItems = (major) => {
63
+ const items = [];
64
+ for (const entry of compatibility) {
65
+ const range = packageRanges.get(entry.name);
66
+ if (range === undefined || satisfies([major, 0, 0], range) || satisfies([major, 99, 99], range))
67
+ continue;
68
+ const release = entry.releaseFor?.[major];
69
+ if (release) {
70
+ items.push({ title: `Update ${entry.name} to ${release.version}`, command: `npm install ${entry.name}@${release.version}`, detail: `The installed ${entry.installed} does not support Angular ${major}.` });
71
+ packageRanges.set(entry.name, release.angularRange);
72
+ }
73
+ else {
74
+ items.push({
75
+ title: release === null ? `${entry.name} has no release for Angular ${major}` : `${entry.name} does not support Angular ${major}`,
76
+ detail: release === null ? 'Replace it before this step, or stop the upgrade at the last major it supports.' : 'Run the checkup online to find a release that does, or replace it.',
77
+ });
78
+ packageRanges.delete(entry.name);
79
+ }
80
+ }
81
+ return items;
82
+ };
83
+ const steps = [];
84
+ /** Each project-specific migration is scheduled once, at the first step where it exists. */
85
+ const scheduled = new Set();
86
+ const once = (key, step, availableFrom, item) => {
87
+ if (!item || scheduled.has(key) || step < availableFrom)
88
+ return [];
89
+ scheduled.add(key);
90
+ return [item];
91
+ };
92
+ const moduleComponents = measure('components', 'module-components');
93
+ const legacyControlFlow = Math.max(measure('components', 'legacy-control-flow'), measure('deprecated-apis', 'legacy-template-directives'));
94
+ const decoratorBindings = measure('components', 'decorator-inputs-outputs');
95
+ const eagerComponents = measure('change-detection', 'eager-components');
96
+ const zoneHelpers = measure('change-detection', 'zone-test-helpers');
97
+ const webpackBuilders = measure('version', 'webpack-builders');
98
+ const onKarma = (metric('testing', 'Unit-test runner') ?? '').includes('Karma');
99
+ const zoneless = metric('change-detection', 'Mode') === 'Zoneless';
100
+ const ngrx = Object.keys(dependencies).filter((name) => name.startsWith('@ngrx/'));
101
+ /**
102
+ * Requirements the project has had to move already. From that step on the
103
+ * project's original version says nothing (it was upgraded), so later steps
104
+ * show the range alone instead of repeating "now 4.3.5" ten times.
105
+ */
106
+ const moved = new Set();
107
+ const track = (entry) => {
108
+ if (entry.satisfied === false)
109
+ moved.add(entry.name);
110
+ return entry;
111
+ };
112
+ for (let major = from + 1; major <= target; major++) {
113
+ // A major newer than this release's snapshot still gets a step, without requirements.
114
+ const info = versions.find((entry) => entry.major === major) ?? { major, version: `${major}.x`, node: null, typescript: null, rxjs: null, zoneJs: null };
115
+ const unknown = !versions.some((entry) => entry.major === major);
116
+ const packages = [`@angular/core@${major}`, `@angular/cli@${major}`];
117
+ if (has('@angular/material'))
118
+ packages.push(`@angular/material@${major}`);
119
+ else if (has('@angular/cdk'))
120
+ packages.push(`@angular/cdk@${major}`);
121
+ const requirements = [];
122
+ if (info.node)
123
+ requirements.push({ name: 'Node.js', range: info.node });
124
+ if (info.typescript)
125
+ requirements.push(track(requirement('TypeScript', info.typescript, moved.has('TypeScript') ? undefined : current.typescript)));
126
+ if (info.rxjs && has('rxjs'))
127
+ requirements.push(track(requirement('RxJS', info.rxjs, moved.has('RxJS') ? undefined : current.rxjs)));
128
+ if (info.zoneJs && has('zone.js') && !zoneless)
129
+ requirements.push(track(requirement('zone.js', info.zoneJs, moved.has('zone.js') ? undefined : current.zoneJs)));
130
+ const items = [
131
+ ...packageItems(major),
132
+ ...(unknown ? [{ title: 'Check the requirements for this major', detail: 'It was released after this version of ng-checkup. Node.js and TypeScript ranges: angular.dev/reference/versions.' }] : []),
133
+ ...(ngrx.length > 0 && major >= 8 ? [{ title: `Update NgRx to ${major} in the same step`, command: `ng update ${ngrx.map((name) => `${name}@${major}`).join(' ')}`, detail: 'NgRx versions follow Angular majors. If that major is not released yet, wait for it before this step.' }] : []),
134
+ ...(has('@angular/flex-layout') && major === 16
135
+ ? [{ title: 'Replace @angular/flex-layout first', detail: 'Its last release targets Angular 15, so it blocks this step. Use CSS flexbox and grid, or a maintained layout library.' }]
136
+ : []),
137
+ ...(has('@angular/material') && from < 15 && major === 15
138
+ ? [{ title: 'Angular Material moves to the MDC-based components', detail: 'The old ones stay available as MatLegacy* until 17. Budget time for visual review: spacing, typography and density change.' }]
139
+ : []),
140
+ ...(has('@angular/material') && from < 17 && major === 17
141
+ ? [{ title: 'The MatLegacy* components are removed', detail: 'Anything still imported from the legacy entry points has to move to the MDC-based components before this step.' }]
142
+ : []),
143
+ ...once('standalone', major, 16, moduleComponents > 0 ? { title: 'Convert NgModule components to standalone', command: 'ng generate @angular/core:standalone', detail: 'Three passes: convert declarations, remove unneeded NgModules, switch to standalone bootstrap.', count: moduleComponents } : undefined),
144
+ ...once('control-flow', major, 17, legacyControlFlow > 0 ? { title: 'Move templates to built-in control flow', command: 'ng generate @angular/core:control-flow', count: legacyControlFlow } : undefined),
145
+ ...once('application-builder', major, 18, webpackBuilders > 0 ? { title: 'Switch to the esbuild application builder', command: 'ng update @angular/cli --name use-application-builder', count: webpackBuilders } : undefined),
146
+ ...once('signal-inputs', major, 19, decoratorBindings > 0 ? { title: 'Convert @Input() and @Output() to signal inputs and outputs', command: 'ng generate @angular/core:signal-input-migration && ng generate @angular/core:output-migration', count: decoratorBindings } : undefined),
147
+ ...once('vitest', major, 21, onKarma ? { title: 'Move unit tests from Karma to Vitest', detail: 'Vitest is the Angular CLI default from 21 (@angular/build:unit-test). Jasmine-specific calls (spyOn, jasmine.*) need rewriting.' } : undefined),
148
+ ...once('zoneless', major, 21, !zoneless
149
+ ? {
150
+ title: eagerComponents > 0 ? 'Prepare for zoneless: move components to OnPush, then drop zone.js' : 'Drop zone.js: zoneless is the default from 21',
151
+ detail: `Upgraded apps keep zone.js through provideZoneChangeDetection() until it is removed.${zoneHelpers > 0 ? ` ${zoneHelpers} zone-based test helper calls (fakeAsync, tick) need fake timers instead.` : ''}`,
152
+ count: eagerComponents || undefined,
153
+ }
154
+ : undefined),
155
+ ];
156
+ steps.push({ to: major, version: info.version, command: `ng update ${packages.join(' ')}`, requirements, items });
157
+ }
158
+ return { from, to: target, before, steps };
159
+ }
160
+ /** A requirement with the project's current version judged against the range. */
161
+ function requirement(name, range, current) {
162
+ const version = current ? lowestVersionOf(current) : undefined;
163
+ return { name, range, current, satisfied: version ? satisfies(version, range) : undefined };
164
+ }
165
+ /** `[major, minor, patch]` of `1.2.3`, `^1.2`, `~4.3.5`, `>=5`; undefined for anything without a number. */
166
+ function parseVersion(text) {
167
+ const match = /(\d+)(?:\.(\d+|x|\*))?(?:\.(\d+|x|\*))?/.exec(text);
168
+ if (!match)
169
+ return undefined;
170
+ const part = (value) => (value === undefined || value === 'x' || value === '*' ? 0 : Number(value));
171
+ return [Number(match[1]), part(match[2]), part(match[3])];
172
+ }
173
+ /** The lowest version a declared range allows (`^4.3.5` gives 4.3.5), or the version itself. */
174
+ function lowestVersionOf(text) {
175
+ return parseVersion(text.split('||')[0].trim());
176
+ }
177
+ /** Orders two versions. */
178
+ function compare(left, right) {
179
+ return left[0] - right[0] || left[1] - right[1] || left[2] - right[2];
180
+ }
181
+ /**
182
+ * Whether `version` falls in an npm range of the shapes Angular publishes:
183
+ * alternatives joined by `||`, each a space-separated set of comparators
184
+ * (`>=4.8.2 <5.0`, `^14.20.0`, `~0.15.0`, `>=18.10.0`, `6.0.x`). Enough for
185
+ * the requirement ranges in the snapshot, not a general semver implementation.
186
+ */
187
+ export function satisfies(version, range) {
188
+ return range.split('||').some((alternative) => alternative
189
+ .trim()
190
+ .split(/\s+/)
191
+ .filter(Boolean)
192
+ .every((comparator) => {
193
+ const operator = /^(\^|~|>=|<=|>|<|=)?/.exec(comparator)[0];
194
+ const bound = parseVersion(comparator.slice(operator.length));
195
+ if (!bound)
196
+ return true;
197
+ const order = compare(version, bound);
198
+ switch (operator) {
199
+ case '^':
200
+ return order >= 0 && (bound[0] > 0 ? version[0] === bound[0] : version[1] === bound[1]);
201
+ case '~':
202
+ return order >= 0 && version[0] === bound[0] && version[1] === bound[1];
203
+ case '>=':
204
+ return order >= 0;
205
+ case '>':
206
+ return order > 0;
207
+ case '<=':
208
+ return order <= 0;
209
+ case '<':
210
+ return order < 0;
211
+ default: {
212
+ // A bare or x-range version: `6.0.3` is exact, `6.0.x` and `6.0` match every patch, `6` every minor.
213
+ const significant = comparator.replace(/^=/, '').split('.').filter((part) => part !== 'x' && part !== '*').length;
214
+ return version.slice(0, significant).every((value, index) => value === bound[index]);
215
+ }
216
+ }
217
+ }));
218
+ }
219
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../src/plan.ts"],"names":[],"mappings":"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"}