ng-checkup 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +255 -59
- package/dist/baseline.d.ts +72 -0
- package/dist/baseline.js +82 -0
- package/dist/baseline.js.map +1 -0
- package/dist/checks/change-detection.js +5 -0
- package/dist/checks/change-detection.js.map +1 -1
- package/dist/checks/circular-deps.js +3 -0
- package/dist/checks/circular-deps.js.map +1 -1
- package/dist/checks/components.js +5 -0
- package/dist/checks/components.js.map +1 -1
- package/dist/checks/deprecated-apis.js +5 -0
- package/dist/checks/deprecated-apis.js.map +1 -1
- package/dist/checks/state.js +5 -0
- package/dist/checks/state.js.map +1 -1
- package/dist/checks/testing.js +3 -0
- package/dist/checks/testing.js.map +1 -1
- package/dist/checks/type-safety.js +26 -6
- package/dist/checks/type-safety.js.map +1 -1
- package/dist/checks/version.js +5 -0
- package/dist/checks/version.js.map +1 -1
- package/dist/cli.d.ts +69 -12
- package/dist/cli.js +246 -45
- package/dist/cli.js.map +1 -1
- package/dist/config.d.ts +49 -0
- package/dist/config.js +98 -0
- package/dist/config.js.map +1 -0
- package/dist/files.d.ts +5 -1
- package/dist/files.js +10 -4
- package/dist/files.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +92 -0
- package/dist/init.js +239 -0
- package/dist/init.js.map +1 -0
- package/dist/report/html.js +24 -0
- package/dist/report/html.js.map +1 -1
- package/dist/report/markdown.js +14 -0
- package/dist/report/markdown.js.map +1 -1
- package/dist/report/terminal.js +21 -0
- package/dist/report/terminal.js.map +1 -1
- package/dist/types.d.ts +23 -0
- package/dist/workspace.d.ts +6 -0
- package/dist/workspace.js +1 -0
- package/dist/workspace.js.map +1 -1
- package/package.json +10 -3
- package/schematics/collection.json +10 -0
- package/schematics/ng-add/index.cjs +65 -0
- package/schematics/ng-add/schema.json +29 -0
package/dist/types.d.ts
CHANGED
|
@@ -31,6 +31,19 @@ export interface Metric {
|
|
|
31
31
|
/** A short qualifier rendered under the value, such as "of 214 components". */
|
|
32
32
|
hint?: string;
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* A count where lower is better, under a stable id: what a baseline records
|
|
36
|
+
* and later compares. Only things the code controls are measures, which is
|
|
37
|
+
* why the number of majors behind is not one: it grows when Angular ships,
|
|
38
|
+
* not when the code gets worse, and a baseline on it would fail CI twice a
|
|
39
|
+
* year for nothing.
|
|
40
|
+
*/
|
|
41
|
+
export interface Measure {
|
|
42
|
+
/** Unique within its check; the baseline key is `checkId.measureId`. */
|
|
43
|
+
id: string;
|
|
44
|
+
label: string;
|
|
45
|
+
value: number;
|
|
46
|
+
}
|
|
34
47
|
/** One thing a check wants a reader to act on, or at least to know. */
|
|
35
48
|
export interface Finding {
|
|
36
49
|
severity: Severity;
|
|
@@ -55,6 +68,8 @@ export interface CheckResult {
|
|
|
55
68
|
summary: string;
|
|
56
69
|
metrics: Metric[];
|
|
57
70
|
findings: Finding[];
|
|
71
|
+
/** Absent when the check had nothing to measure (graded `info` for lack of input). */
|
|
72
|
+
measures?: Measure[];
|
|
58
73
|
}
|
|
59
74
|
/** The `ng-checkup` result as a whole, which is also the JSON output schema. */
|
|
60
75
|
export interface Report {
|
|
@@ -75,6 +90,12 @@ export interface Report {
|
|
|
75
90
|
};
|
|
76
91
|
checks: CheckResult[];
|
|
77
92
|
durationMs: number;
|
|
93
|
+
/**
|
|
94
|
+
* The comparison with the committed baseline, when the run had one. Set by
|
|
95
|
+
* the CLI (or by the caller, through `compareWithBaseline`), never by
|
|
96
|
+
* `runCheckup`, which reads nothing it was not given.
|
|
97
|
+
*/
|
|
98
|
+
baseline?: import('./baseline.js').BaselineComparison;
|
|
78
99
|
}
|
|
79
100
|
/**
|
|
80
101
|
* How the repository is organised. It decides where project configuration is
|
|
@@ -92,4 +113,6 @@ export interface CheckupOptions {
|
|
|
92
113
|
offline?: boolean;
|
|
93
114
|
/** How many example locations a finding lists. Defaults to 5. */
|
|
94
115
|
maxExamples?: number;
|
|
116
|
+
/** Paths to leave out, as in the config file's `ignore` (see `ignoreMatcher`). */
|
|
117
|
+
ignore?: string[];
|
|
95
118
|
}
|
package/dist/workspace.d.ts
CHANGED
|
@@ -27,6 +27,12 @@ export interface WorkspaceInfo {
|
|
|
27
27
|
/** From `installed` when present, else from `declared`. Absent when Angular is not a dependency. */
|
|
28
28
|
major?: number;
|
|
29
29
|
};
|
|
30
|
+
/**
|
|
31
|
+
* The project's TypeScript major, installed version first, then the
|
|
32
|
+
* `package.json` range. It decides what an absent `strict` means: on from
|
|
33
|
+
* TypeScript 6, off before.
|
|
34
|
+
*/
|
|
35
|
+
typescriptMajor?: number;
|
|
30
36
|
targets: TargetInfo[];
|
|
31
37
|
/** Every polyfill entry of every target, which is where `zone.js` is wired in for CLI 15+ projects. */
|
|
32
38
|
polyfills: string[];
|
package/dist/workspace.js
CHANGED
|
@@ -31,6 +31,7 @@ export function readWorkspace(root, projectJsons) {
|
|
|
31
31
|
dependencies,
|
|
32
32
|
hasNodeModules: installed !== undefined,
|
|
33
33
|
angular: { declared, installed, major: majorOf(installed ?? declared) },
|
|
34
|
+
typescriptMajor: majorOf(readInstalledVersion(root, 'typescript') ?? dependencies['typescript']),
|
|
34
35
|
targets,
|
|
35
36
|
polyfills: targets.flatMap((target) => polyfillsOf(target.options)),
|
|
36
37
|
appTsconfig: findAppTsconfig(root, targets),
|
package/dist/workspace.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ng-checkup",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "A one-minute modernization report for any Angular codebase: version gap, deprecated APIs, zoneless readiness, signals adoption, test runner, type safety and circular dependencies.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"angular",
|
|
@@ -28,14 +28,21 @@
|
|
|
28
28
|
},
|
|
29
29
|
"main": "dist/index.js",
|
|
30
30
|
"types": "dist/index.d.ts",
|
|
31
|
+
"schematics": "./schematics/collection.json",
|
|
32
|
+
"ng-add": {
|
|
33
|
+
"save": "devDependencies"
|
|
34
|
+
},
|
|
31
35
|
"exports": {
|
|
32
36
|
".": {
|
|
33
37
|
"types": "./dist/index.d.ts",
|
|
34
38
|
"default": "./dist/index.js"
|
|
35
|
-
}
|
|
39
|
+
},
|
|
40
|
+
"./package.json": "./package.json",
|
|
41
|
+
"./schematics/*": "./schematics/*"
|
|
36
42
|
},
|
|
37
43
|
"files": [
|
|
38
|
-
"dist"
|
|
44
|
+
"dist",
|
|
45
|
+
"schematics"
|
|
39
46
|
],
|
|
40
47
|
"engines": {
|
|
41
48
|
"node": ">=22"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "../node_modules/@angular-devkit/schematics/collection-schema.json",
|
|
3
|
+
"schematics": {
|
|
4
|
+
"ng-add": {
|
|
5
|
+
"description": "Sets up ng-checkup: a checkup script, a config file and a CI step.",
|
|
6
|
+
"factory": "./ng-add/index.cjs#ngAdd",
|
|
7
|
+
"schema": "./ng-add/schema.json"
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
/**
|
|
3
|
+
* `ng add ng-checkup`.
|
|
4
|
+
*
|
|
5
|
+
* The Angular CLI has already installed the package and saved it to
|
|
6
|
+
* devDependencies (see "ng-add" in package.json) by the time this runs, so the
|
|
7
|
+
* rule only applies the same plan `ng-checkup init` does, through the CLI's
|
|
8
|
+
* virtual tree: nothing is written unless the whole schematic succeeds, and
|
|
9
|
+
* `ng add --dry-run` shows the changes for free.
|
|
10
|
+
*
|
|
11
|
+
* Written as CommonJS on purpose. The Angular CLI loads schematic factories
|
|
12
|
+
* with `require`, while the rest of this package is ESM; the planner is
|
|
13
|
+
* therefore loaded with a dynamic `import()`, which a CommonJS module may do
|
|
14
|
+
* and which Angular's rule runner awaits.
|
|
15
|
+
*
|
|
16
|
+
* It deliberately depends on nothing from @angular-devkit: the Tree and
|
|
17
|
+
* context are passed in by the CLI, so the package needs no schematics
|
|
18
|
+
* dependency of its own.
|
|
19
|
+
*/
|
|
20
|
+
const { join } = require('node:path');
|
|
21
|
+
const { pathToFileURL } = require('node:url');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @param {{ ci?: 'auto' | 'github' | 'gitlab' | 'none', force?: boolean }} options
|
|
25
|
+
*/
|
|
26
|
+
function ngAdd(options) {
|
|
27
|
+
return async (tree, context) => {
|
|
28
|
+
const { planInit, runCheckup, createBaseline, serializeBaseline, BASELINE_FILE } = await import(pathToFileURL(join(__dirname, '..', '..', 'dist', 'index.js')).href);
|
|
29
|
+
const { version } = require(join(__dirname, '..', '..', 'package.json'));
|
|
30
|
+
|
|
31
|
+
// The first baseline measures the workspace on disk (the CLI runs ng add
|
|
32
|
+
// from its root). The tree only holds pending changes, and none of them
|
|
33
|
+
// touch source files, so the disk is what the code looks like.
|
|
34
|
+
const baseline = tree.exists(`/${BASELINE_FILE}`) ? undefined : serializeBaseline(createBaseline(await runCheckup(process.cwd(), { offline: true })));
|
|
35
|
+
|
|
36
|
+
const plan = planInit(
|
|
37
|
+
{
|
|
38
|
+
read: (path) => {
|
|
39
|
+
const buffer = tree.read(`/${path}`);
|
|
40
|
+
return buffer ? buffer.toString('utf8') : undefined;
|
|
41
|
+
},
|
|
42
|
+
exists: (path) => {
|
|
43
|
+
if (tree.exists(`/${path}`)) return true;
|
|
44
|
+
// Tree.exists only knows files; a directory exists when it holds something.
|
|
45
|
+
const directory = tree.getDir(`/${path}`);
|
|
46
|
+
return directory.subfiles.length > 0 || directory.subdirs.length > 0;
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{ ci: options.ci ?? 'auto', force: options.force ?? false, addDependency: false, version, baseline },
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
for (const change of plan.changes) {
|
|
53
|
+
const path = `/${change.path}`;
|
|
54
|
+
if (tree.exists(path)) tree.overwrite(path, change.content);
|
|
55
|
+
else tree.create(path, change.content);
|
|
56
|
+
context.logger.info(`ng-checkup: ${change.path}: ${change.summary}`);
|
|
57
|
+
}
|
|
58
|
+
if (plan.changes.length === 0) context.logger.info('ng-checkup is already configured here.');
|
|
59
|
+
for (const note of plan.notes) context.logger.warn(note);
|
|
60
|
+
context.logger.info(`Run the checkup with: ${plan.nextSteps[plan.nextSteps.length - 1]}`);
|
|
61
|
+
return tree;
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
module.exports = { ngAdd };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "http://json-schema.org/draft-07/schema",
|
|
3
|
+
"$id": "NgCheckupNgAdd",
|
|
4
|
+
"title": "ng-checkup ng-add",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"properties": {
|
|
7
|
+
"ci": {
|
|
8
|
+
"type": "string",
|
|
9
|
+
"enum": ["auto", "github", "gitlab", "none"],
|
|
10
|
+
"default": "auto",
|
|
11
|
+
"description": "Where to add the CI step. auto uses GitHub when .github/ exists, GitLab when .gitlab-ci.yml does.",
|
|
12
|
+
"x-prompt": {
|
|
13
|
+
"message": "Add a CI step that runs the checkup on every pull request?",
|
|
14
|
+
"type": "list",
|
|
15
|
+
"items": [
|
|
16
|
+
{ "value": "auto", "label": "Yes, for the CI this repository already uses" },
|
|
17
|
+
{ "value": "github", "label": "Yes, GitHub Actions" },
|
|
18
|
+
{ "value": "gitlab", "label": "Yes, GitLab CI" },
|
|
19
|
+
{ "value": "none", "label": "No" }
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"force": {
|
|
24
|
+
"type": "boolean",
|
|
25
|
+
"default": false,
|
|
26
|
+
"description": "Replace an existing \"checkup\" script."
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|