umbaudit 0.1.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/LICENSE.md +21 -0
- package/README.md +149 -0
- package/biome.json +62 -0
- package/dist/cli/commands/audit.d.ts +17 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +179 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +41 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output/ascii-logo.d.ts +3 -0
- package/dist/cli/output/ascii-logo.d.ts.map +1 -0
- package/dist/cli/output/ascii-logo.js +23 -0
- package/dist/cli/output/ascii-logo.js.map +1 -0
- package/dist/cli/output/formatters/console.d.ts +11 -0
- package/dist/cli/output/formatters/console.d.ts.map +1 -0
- package/dist/cli/output/formatters/console.js +46 -0
- package/dist/cli/output/formatters/console.js.map +1 -0
- package/dist/cli/output/formatters/html.d.ts +3 -0
- package/dist/cli/output/formatters/html.d.ts.map +1 -0
- package/dist/cli/output/formatters/html.js +215 -0
- package/dist/cli/output/formatters/html.js.map +1 -0
- package/dist/cli/output/formatters/json.d.ts +9 -0
- package/dist/cli/output/formatters/json.d.ts.map +1 -0
- package/dist/cli/output/formatters/json.js +51 -0
- package/dist/cli/output/formatters/json.js.map +1 -0
- package/dist/cli/output/table-renderer.d.ts +8 -0
- package/dist/cli/output/table-renderer.d.ts.map +1 -0
- package/dist/cli/output/table-renderer.js +44 -0
- package/dist/cli/output/table-renderer.js.map +1 -0
- package/dist/cli/schemas.d.ts +59 -0
- package/dist/cli/schemas.d.ts.map +1 -0
- package/dist/cli/schemas.js +43 -0
- package/dist/cli/schemas.js.map +1 -0
- package/dist/models/finding.d.ts +23 -0
- package/dist/models/finding.d.ts.map +1 -0
- package/dist/models/finding.js +37 -0
- package/dist/models/finding.js.map +1 -0
- package/dist/models/project.d.ts +13 -0
- package/dist/models/project.d.ts.map +1 -0
- package/dist/models/project.js +2 -0
- package/dist/models/project.js.map +1 -0
- package/dist/models/report.d.ts +78 -0
- package/dist/models/report.d.ts.map +1 -0
- package/dist/models/report.js +2 -0
- package/dist/models/report.js.map +1 -0
- package/dist/rules/index.d.ts +57 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +115 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/rule-01-nuget-packages.d.ts +3 -0
- package/dist/rules/rule-01-nuget-packages.d.ts.map +1 -0
- package/dist/rules/rule-01-nuget-packages.js +103 -0
- package/dist/rules/rule-01-nuget-packages.js.map +1 -0
- package/dist/rules/rule-02-obsolete-controller-classes.d.ts +3 -0
- package/dist/rules/rule-02-obsolete-controller-classes.d.ts.map +1 -0
- package/dist/rules/rule-02-obsolete-controller-classes.js +70 -0
- package/dist/rules/rule-02-obsolete-controller-classes.js.map +1 -0
- package/dist/rules/rule-03-tiptap-import.d.ts +3 -0
- package/dist/rules/rule-03-tiptap-import.d.ts.map +1 -0
- package/dist/rules/rule-03-tiptap-import.js +46 -0
- package/dist/rules/rule-03-tiptap-import.js.map +1 -0
- package/dist/rules/rule-04-removed-packages.d.ts +3 -0
- package/dist/rules/rule-04-removed-packages.d.ts.map +1 -0
- package/dist/rules/rule-04-removed-packages.js +51 -0
- package/dist/rules/rule-04-removed-packages.js.map +1 -0
- package/dist/rules/rule-05-program-cs.d.ts +3 -0
- package/dist/rules/rule-05-program-cs.d.ts.map +1 -0
- package/dist/rules/rule-05-program-cs.js +46 -0
- package/dist/rules/rule-05-program-cs.js.map +1 -0
- package/dist/rules/rule-06-view-imports.d.ts +3 -0
- package/dist/rules/rule-06-view-imports.d.ts.map +1 -0
- package/dist/rules/rule-06-view-imports.js +48 -0
- package/dist/rules/rule-06-view-imports.js.map +1 -0
- package/dist/rules/rule-07-angular-detection.d.ts +3 -0
- package/dist/rules/rule-07-angular-detection.d.ts.map +1 -0
- package/dist/rules/rule-07-angular-detection.js +140 -0
- package/dist/rules/rule-07-angular-detection.js.map +1 -0
- package/dist/rules/rule-08-published-snapshot-interfaces.d.ts +3 -0
- package/dist/rules/rule-08-published-snapshot-interfaces.d.ts.map +1 -0
- package/dist/rules/rule-08-published-snapshot-interfaces.js +104 -0
- package/dist/rules/rule-08-published-snapshot-interfaces.js.map +1 -0
- package/dist/rules/rule-09-uda-property-editors.d.ts +3 -0
- package/dist/rules/rule-09-uda-property-editors.d.ts.map +1 -0
- package/dist/rules/rule-09-uda-property-editors.js +78 -0
- package/dist/rules/rule-09-uda-property-editors.js.map +1 -0
- package/dist/rules/rule-10-license-files.d.ts +3 -0
- package/dist/rules/rule-10-license-files.d.ts.map +1 -0
- package/dist/rules/rule-10-license-files.js +67 -0
- package/dist/rules/rule-10-license-files.js.map +1 -0
- package/dist/rules/types.d.ts +77 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +2 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/scanners/code-searcher.d.ts +43 -0
- package/dist/scanners/code-searcher.d.ts.map +1 -0
- package/dist/scanners/code-searcher.js +76 -0
- package/dist/scanners/code-searcher.js.map +1 -0
- package/dist/scanners/csproj-parser.d.ts +35 -0
- package/dist/scanners/csproj-parser.d.ts.map +1 -0
- package/dist/scanners/csproj-parser.js +71 -0
- package/dist/scanners/csproj-parser.js.map +1 -0
- package/dist/scanners/file-scanner.d.ts +44 -0
- package/dist/scanners/file-scanner.d.ts.map +1 -0
- package/dist/scanners/file-scanner.js +66 -0
- package/dist/scanners/file-scanner.js.map +1 -0
- package/dist/scanners/nuget-client.d.ts +19 -0
- package/dist/scanners/nuget-client.d.ts.map +1 -0
- package/dist/scanners/nuget-client.js +208 -0
- package/dist/scanners/nuget-client.js.map +1 -0
- package/dist/utils/hours.d.ts +29 -0
- package/dist/utils/hours.d.ts.map +1 -0
- package/dist/utils/hours.js +36 -0
- package/dist/utils/hours.js.map +1 -0
- package/dist/utils/logger.d.ts +35 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +52 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +49 -0
- package/specs/001-umbraco-upgrade-audit/checklists/requirements.md +36 -0
- package/specs/001-umbraco-upgrade-audit/contracts/cli-interface.md +278 -0
- package/specs/001-umbraco-upgrade-audit/data-model.md +354 -0
- package/specs/001-umbraco-upgrade-audit/plan.md +120 -0
- package/specs/001-umbraco-upgrade-audit/quickstart.md +187 -0
- package/specs/001-umbraco-upgrade-audit/research.md +238 -0
- package/specs/001-umbraco-upgrade-audit/spec.md +162 -0
- package/specs/001-umbraco-upgrade-audit/tasks.md +291 -0
- package/src/cli/commands/audit.ts +221 -0
- package/src/cli/index.ts +47 -0
- package/src/cli/output/ascii-logo.ts +27 -0
- package/src/cli/output/formatters/console.ts +57 -0
- package/src/cli/output/formatters/html.ts +227 -0
- package/src/cli/output/formatters/json.ts +54 -0
- package/src/cli/output/table-renderer.ts +58 -0
- package/src/cli/schemas.ts +53 -0
- package/src/models/finding.ts +47 -0
- package/src/models/project.ts +16 -0
- package/src/models/report.ts +97 -0
- package/src/rules/index.ts +128 -0
- package/src/rules/rule-01-nuget-packages.ts +132 -0
- package/src/rules/rule-02-obsolete-controller-classes.ts +89 -0
- package/src/rules/rule-03-tiptap-import.ts +66 -0
- package/src/rules/rule-04-removed-packages.ts +70 -0
- package/src/rules/rule-05-program-cs.ts +66 -0
- package/src/rules/rule-06-view-imports.ts +69 -0
- package/src/rules/rule-07-angular-detection.ts +169 -0
- package/src/rules/rule-08-published-snapshot-interfaces.ts +147 -0
- package/src/rules/rule-09-uda-property-editors.ts +98 -0
- package/src/rules/rule-10-license-files.ts +88 -0
- package/src/rules/types.ts +102 -0
- package/src/scanners/code-searcher.ts +114 -0
- package/src/scanners/csproj-parser.ts +97 -0
- package/src/scanners/file-scanner.ts +77 -0
- package/src/scanners/nuget-client.ts +266 -0
- package/src/utils/hours.ts +38 -0
- package/src/utils/logger.ts +59 -0
- package/tests/fixtures/sample-umbraco-project/BlogPost.uda +58 -0
- package/tests/fixtures/sample-umbraco-project/ContentModels.generated.cs +20 -0
- package/tests/fixtures/sample-umbraco-project/ModernPage.uda +36 -0
- package/tests/fixtures/sample-umbraco-project/Program.cs +26 -0
- package/tests/fixtures/sample-umbraco-project/PublishedContentService.cs +25 -0
- package/tests/fixtures/sample-umbraco-project/SampleCode.cs +16 -0
- package/tests/fixtures/sample-umbraco-project/TestProject.csproj +13 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.AssemblyInfo.cs +22 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.AssemblyInfoInputs.cache +1 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.GeneratedMSBuildEditorConfig.editorconfig +31 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.GlobalUsings.g.cs +19 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.assets.cache +0 -0
- package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.csproj.AssemblyReference.cache +0 -0
- package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.dgspec.json +84 -0
- package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.g.props +26 -0
- package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.g.targets +13 -0
- package/tests/fixtures/sample-umbraco-project/obj/project.assets.json +17414 -0
- package/tests/fixtures/sample-umbraco-project/obj/project.nuget.cache +404 -0
- package/tests/fixtures/sample-umbraco-project/umbraco/Licenses/umbracoDeploy.lic +1 -0
- package/tests/fixtures/sample-umbraco-project/umbraco/Licenses/umbracoForms.lic +1 -0
- package/tests/unit/rules/rule-09-uda-property-editors.test.ts +131 -0
- package/tests/unit/rules/rule-10-license-files.test.ts +82 -0
- package/tsconfig.json +24 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lee Mills
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Umbraco LTS Upgrade Audit CLI
|
|
2
|
+
|
|
3
|
+
A CLI tool to audit Umbraco 13 LTS projects and estimate upgrade effort to Umbraco 17 LTS.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🔍 Scans Umbraco 13 projects for upgrade-breaking changes
|
|
8
|
+
- 📊 Generates detailed hour estimates based on 10 detection rules
|
|
9
|
+
- 🎨 Beautiful console output
|
|
10
|
+
- ⚡ Fast scanning with NuGet API integration
|
|
11
|
+
- 📝 Configurable rules and output formats
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
npm run build
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Usage
|
|
21
|
+
|
|
22
|
+
### Basic Audit
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
node dist/cli/index.js /path/to/umbraco-project
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### With Options
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Verbose mode (show detailed findings)
|
|
32
|
+
node dist/cli/index.js /path/to/project --verbose
|
|
33
|
+
|
|
34
|
+
# Debug mode (show trace logs)
|
|
35
|
+
node dist/cli/index.js /path/to/project --debug
|
|
36
|
+
|
|
37
|
+
# JSON output
|
|
38
|
+
node dist/cli/index.js /path/to/project --output json
|
|
39
|
+
|
|
40
|
+
# HTML output (coming soon)
|
|
41
|
+
node dist/cli/index.js /path/to/project --output html
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Detection Rules
|
|
45
|
+
|
|
46
|
+
The tool applies 10 rules to detect upgrade-relevant changes:
|
|
47
|
+
|
|
48
|
+
| Rule | Detection | Base Hours |
|
|
49
|
+
|------|-----------|------------|
|
|
50
|
+
| **NuGet Package Updates** | Checks package versions against NuGet API | 0.5h for minor/patch, 1.0h for major version bumps |
|
|
51
|
+
| **Obsolete Controller Classes** | Detects 3 controller classes that no longer exist (`UmbracoApiController`, `UmbracoAuthorizedApiController`, `UmbracoAuthorizedJsonController`) | 1.0h per file |
|
|
52
|
+
| **Tiptap Import Changes** | Finds Tiptap imports (`@umbraco-cms/backoffice/external/tiptap`) needing updates | 0.5h per file |
|
|
53
|
+
| **Removed Packages** | Detects 3 packages removed in v17 (`Umbraco.Cloud.Cms.PublicAccess`, `Umbraco.Cloud.Identity.Cms`, `Umbraco.Cms.Web.BackOffice`) | 0.5h per package |
|
|
54
|
+
| **Program.cs Changes** | Finds `UseInstallerEndpoints()` calls that have been removed | 0.5h fixed |
|
|
55
|
+
| **ViewImports Smidge Removal** | Detects Smidge TagHelper references in `_ViewImports.cshtml` | 0.5h fixed |
|
|
56
|
+
| **Angular Detection** | Counts AngularJS files in `App_Plugins` requiring migration to Lit/Web Components | 40h base (5 days) + 4h per 10 files |
|
|
57
|
+
| **Published Snapshot Interfaces** | Detects `IPublishedSnapshotAccessor` and `IPublishedSnapshot` usage | 0.5h fixed for generated files, 0.5h per regular file |
|
|
58
|
+
| **Outdated Property Editors** | Detects obsolete property editors in `*.uda` files (`Umbraco.MediaPicker`, `Nested Content`, `Stacked Content`) | 1.0h per occurrence |
|
|
59
|
+
| **License File Structure Changes** | Detects legacy license files (`umbracoDeploy.lic`, `umbracoForms.lic`) needing update for new licensing structure | 0.5h total |
|
|
60
|
+
|
|
61
|
+
## Sample Output
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
██╗ ██╗███╗ ███╗██████╗ ██████╗ █████╗ ██████╗ ██████╗
|
|
65
|
+
██║ ██║████╗ ████║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔═══██╗
|
|
66
|
+
██║ ██║██╔████╔██║██████╔╝██████╔╝███████║██║ ██║ ██║
|
|
67
|
+
██║ ██║██║╚██╔╝██║██╔══██╗██╔══██╗██╔══██║██║ ██║ ██║
|
|
68
|
+
╚██████╔╝██║ ╚═╝ ██║██████╔╝██║ ██║██║ ██║╚██████╗╚██████╔╝
|
|
69
|
+
╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝
|
|
70
|
+
LTS Upgrade Audit Tool v0.1.0
|
|
71
|
+
|
|
72
|
+
┌──────────────────────────────────────────────────┬────────────┬────────────┐
|
|
73
|
+
│ Rule │ Matches │ Hours │
|
|
74
|
+
├──────────────────────────────────────────────────┼────────────┼────────────┤
|
|
75
|
+
│ NuGet Package Updates │ 12 │ 6.0 │
|
|
76
|
+
│ └─ Umbraco.* packages │ 5 │ 2.5 │
|
|
77
|
+
│ └─ Other packages │ 7 │ 3.5 │
|
|
78
|
+
├──────────────────────────────────────────────────┼────────────┼────────────┤
|
|
79
|
+
│ Obsolete Controller Classes │ 2 │ 2.0 │
|
|
80
|
+
├──────────────────────────────────────────────────┼────────────┼────────────┤
|
|
81
|
+
│ Tiptap Import Changes │ 2 │ 1.0 │
|
|
82
|
+
├──────────────────────────────────────────────────┼────────────┼────────────┤
|
|
83
|
+
│ Program.cs Changes │ 1 │ 0.5 │
|
|
84
|
+
├──────────────────────────────────────────────────┼────────────┼────────────┤
|
|
85
|
+
│ Angular Files Detected │ 8 │ 40.0 │
|
|
86
|
+
├──────────────────────────────────────────────────┴────────────┴────────────┤
|
|
87
|
+
│ TOTAL ESTIMATE: 51.0 hours (~6.4 days @ 8h/day) │
|
|
88
|
+
└────────────────────────────────────────────────────────────────────────────┘
|
|
89
|
+
|
|
90
|
+
#H5YR! 🙌 Thanks for using the Umbraco Upgrade Audit Tool!
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Development
|
|
94
|
+
|
|
95
|
+
### Build
|
|
96
|
+
|
|
97
|
+
```bash
|
|
98
|
+
npm run build
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Test
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
npm test
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### Lint & Format
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
npm run lint
|
|
111
|
+
npm run format
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Architecture
|
|
115
|
+
|
|
116
|
+
- **TypeScript 5.x** with strict mode
|
|
117
|
+
- **Node.js 22 LTS** runtime
|
|
118
|
+
- **Commander** for CLI framework
|
|
119
|
+
- **Zod** for schema validation
|
|
120
|
+
- **fast-glob** for file scanning
|
|
121
|
+
- **fast-xml-parser** for .csproj parsing
|
|
122
|
+
- **chalk** for terminal colors
|
|
123
|
+
- **cli-table3** for table rendering
|
|
124
|
+
|
|
125
|
+
## Project Structure
|
|
126
|
+
|
|
127
|
+
```
|
|
128
|
+
src/
|
|
129
|
+
├── cli/ # CLI commands and output formatters
|
|
130
|
+
├── rules/ # 10 audit rules
|
|
131
|
+
├── scanners/ # File scanning and parsing utilities
|
|
132
|
+
├── models/ # TypeScript interfaces
|
|
133
|
+
└── utils/ # Shared utilities (logger, hours calc)
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
## Roadmap
|
|
137
|
+
|
|
138
|
+
- [x] **v0.1.0** - Basic console output with 10 rules (MVP)
|
|
139
|
+
- [ ] **v0.2.0** - JSON and HTML output formats
|
|
140
|
+
- [ ] **v0.3.0** - YAML configuration support
|
|
141
|
+
- [ ] **v1.0.0** - Detailed findings with code snippets
|
|
142
|
+
|
|
143
|
+
## License
|
|
144
|
+
|
|
145
|
+
MIT
|
|
146
|
+
|
|
147
|
+
## Contributing
|
|
148
|
+
|
|
149
|
+
Built with ❤️ for the Umbraco community. H5YR! 🙌
|
package/biome.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://biomejs.dev/schemas/2.3.14/schema.json",
|
|
3
|
+
"vcs": { "enabled": true, "clientKind": "git", "useIgnoreFile": true },
|
|
4
|
+
"files": { "includes": ["**", "!!**/dist"] },
|
|
5
|
+
"formatter": {
|
|
6
|
+
"enabled": true,
|
|
7
|
+
"indentStyle": "space",
|
|
8
|
+
"indentWidth": 2,
|
|
9
|
+
"lineWidth": 120,
|
|
10
|
+
"useEditorconfig": true,
|
|
11
|
+
"includes": [
|
|
12
|
+
"**",
|
|
13
|
+
"!**/node_modules/",
|
|
14
|
+
"!**/dist/",
|
|
15
|
+
"!**/coverage/",
|
|
16
|
+
"!**/*.min.js",
|
|
17
|
+
"!**/package-lock.json",
|
|
18
|
+
"!**/yarn.lock",
|
|
19
|
+
"!**/pnpm-lock.yaml"
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
"linter": {
|
|
23
|
+
"enabled": true,
|
|
24
|
+
"rules": {
|
|
25
|
+
"recommended": true
|
|
26
|
+
},
|
|
27
|
+
"includes": ["**", "!node_modules/", "!dist/", "!coverage/", "!*.config.js"]
|
|
28
|
+
},
|
|
29
|
+
"javascript": {
|
|
30
|
+
"formatter": {
|
|
31
|
+
"jsxQuoteStyle": "single",
|
|
32
|
+
"quoteProperties": "asNeeded",
|
|
33
|
+
"quoteStyle": "single"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"overrides": [
|
|
37
|
+
{
|
|
38
|
+
"includes": ["**/*.ts", "!tests/**/*.ts"],
|
|
39
|
+
"javascript": { "globals": [] },
|
|
40
|
+
"linter": {
|
|
41
|
+
"rules": {
|
|
42
|
+
"correctness": { "noUnusedVariables": "error" },
|
|
43
|
+
"suspicious": { "noConsole": "off", "noExplicitAny": "warn" }
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"includes": ["tests/**/*.ts"],
|
|
49
|
+
"javascript": { "globals": [] },
|
|
50
|
+
"linter": {
|
|
51
|
+
"rules": {
|
|
52
|
+
"correctness": { "noUnusedVariables": "error" },
|
|
53
|
+
"suspicious": { "noConsole": "off", "noExplicitAny": "warn" }
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
],
|
|
58
|
+
"assist": {
|
|
59
|
+
"enabled": true,
|
|
60
|
+
"actions": { "source": { "organizeImports": "on" } }
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Audit command options
|
|
3
|
+
*/
|
|
4
|
+
export interface AuditCommandOptions {
|
|
5
|
+
output: 'console' | 'json' | 'html';
|
|
6
|
+
verbose: boolean;
|
|
7
|
+
debug: boolean;
|
|
8
|
+
noColor: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Execute the audit command
|
|
12
|
+
*
|
|
13
|
+
* @param projectPath - Path to project directory, .sln, or .csproj
|
|
14
|
+
* @param options - Command options
|
|
15
|
+
*/
|
|
16
|
+
export declare function executeAuditCommand(projectPath: string, options: AuditCommandOptions): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAwBA;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqG1G"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { stat } from 'node:fs/promises';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { executeAllRules, getAllRules, registerRule } from '../../rules/index.js';
|
|
4
|
+
// Import all rules
|
|
5
|
+
import { rule01NuGetPackages } from '../../rules/rule-01-nuget-packages.js';
|
|
6
|
+
import { rule02ObsoleteControllers } from '../../rules/rule-02-obsolete-controller-classes.js';
|
|
7
|
+
import { rule03TiptapImport } from '../../rules/rule-03-tiptap-import.js';
|
|
8
|
+
import { rule04RemovedPackages } from '../../rules/rule-04-removed-packages.js';
|
|
9
|
+
import { rule05ProgramCs } from '../../rules/rule-05-program-cs.js';
|
|
10
|
+
import { rule06ViewImports } from '../../rules/rule-06-view-imports.js';
|
|
11
|
+
import { rule07AngularDetection } from '../../rules/rule-07-angular-detection.js';
|
|
12
|
+
import { rule08PublishedSnapshotInterfaces } from '../../rules/rule-08-published-snapshot-interfaces.js';
|
|
13
|
+
import { rule09UdaPropertyEditors } from '../../rules/rule-09-uda-property-editors.js';
|
|
14
|
+
import { rule10LicenseFiles } from '../../rules/rule-10-license-files.js';
|
|
15
|
+
import { extractUmbracoVersion, parseProjectFile } from '../../scanners/csproj-parser.js';
|
|
16
|
+
import { findProjectFiles } from '../../scanners/file-scanner.js';
|
|
17
|
+
import { hoursToDays } from '../../utils/hours.js';
|
|
18
|
+
import { debug, error, info, setDebugMode, warn } from '../../utils/logger.js';
|
|
19
|
+
import { formatConsoleOutput } from '../output/formatters/console.js';
|
|
20
|
+
import { formatHtmlOutput } from '../output/formatters/html.js';
|
|
21
|
+
import { formatJsonOutput } from '../output/formatters/json.js';
|
|
22
|
+
/**
|
|
23
|
+
* Execute the audit command
|
|
24
|
+
*
|
|
25
|
+
* @param projectPath - Path to project directory, .sln, or .csproj
|
|
26
|
+
* @param options - Command options
|
|
27
|
+
*/
|
|
28
|
+
export async function executeAuditCommand(projectPath, options) {
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
// Enable debug mode if requested
|
|
31
|
+
if (options.debug) {
|
|
32
|
+
setDebugMode(true);
|
|
33
|
+
debug('Debug mode enabled');
|
|
34
|
+
}
|
|
35
|
+
// Resolve absolute path
|
|
36
|
+
const absolutePath = resolve(projectPath);
|
|
37
|
+
debug(`Resolved path: ${absolutePath}`);
|
|
38
|
+
// Validate path exists
|
|
39
|
+
try {
|
|
40
|
+
await stat(absolutePath);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
error(`Path not found: ${projectPath}`);
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
// Register all rules
|
|
47
|
+
registerRule(rule01NuGetPackages);
|
|
48
|
+
registerRule(rule02ObsoleteControllers);
|
|
49
|
+
registerRule(rule03TiptapImport);
|
|
50
|
+
registerRule(rule04RemovedPackages);
|
|
51
|
+
registerRule(rule05ProgramCs);
|
|
52
|
+
registerRule(rule06ViewImports);
|
|
53
|
+
registerRule(rule07AngularDetection);
|
|
54
|
+
registerRule(rule08PublishedSnapshotInterfaces);
|
|
55
|
+
registerRule(rule09UdaPropertyEditors);
|
|
56
|
+
registerRule(rule10LicenseFiles);
|
|
57
|
+
debug(`Registered ${getAllRules().length} rules`);
|
|
58
|
+
// Find project files
|
|
59
|
+
const projectFiles = await findProjectFiles(absolutePath);
|
|
60
|
+
if (projectFiles.length === 0) {
|
|
61
|
+
error('No .csproj files found. Are you sure this is an Umbraco project?');
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
info(`Found ${projectFiles.length} project file(s)`);
|
|
65
|
+
// Detect Umbraco version from first project file that contains Umbraco.Cms
|
|
66
|
+
let umbracoVersion = null;
|
|
67
|
+
let umbracoProjectFile = null;
|
|
68
|
+
for (const projectFile of projectFiles) {
|
|
69
|
+
const packages = await parseProjectFile(projectFile);
|
|
70
|
+
// Check if this project file contains Umbraco.Cms
|
|
71
|
+
if (packages.some((pkg) => pkg.name === 'Umbraco.Cms')) {
|
|
72
|
+
umbracoVersion = extractUmbracoVersion(packages);
|
|
73
|
+
umbracoProjectFile = projectFile;
|
|
74
|
+
debug(`Found Umbraco.Cms in: ${projectFile}`);
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (umbracoVersion && umbracoProjectFile) {
|
|
79
|
+
info(`Detected Umbraco version: ${umbracoVersion}`);
|
|
80
|
+
// Check if version is 13.x but not 13.13.0
|
|
81
|
+
if (umbracoVersion.startsWith('13.') && umbracoVersion !== '13.13.0') {
|
|
82
|
+
warn('Before upgrading to v17, you must first upgrade to Umbraco 13.13.0 (the final LTS release of v13).');
|
|
83
|
+
warn('Please upgrade to 13.13.0 first, then proceed with the v17 upgrade.');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
error('Could not detect Umbraco version. No project file contains Umbraco.Cms package reference.');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
// Create rule execution context
|
|
91
|
+
const context = {
|
|
92
|
+
projectPath: absolutePath,
|
|
93
|
+
projectFiles,
|
|
94
|
+
allFiles: [], // Will be populated by individual rules
|
|
95
|
+
debug: options.debug,
|
|
96
|
+
};
|
|
97
|
+
// Execute all rules
|
|
98
|
+
info('\nRunning audit rules...\n');
|
|
99
|
+
const findings = await executeAllRules(context);
|
|
100
|
+
const scanDuration = Date.now() - startTime;
|
|
101
|
+
// Build report
|
|
102
|
+
const report = buildReport(absolutePath, umbracoVersion, projectFiles, findings, scanDuration);
|
|
103
|
+
// Output report
|
|
104
|
+
if (options.output === 'console') {
|
|
105
|
+
console.log(formatConsoleOutput(report, options.verbose));
|
|
106
|
+
}
|
|
107
|
+
else if (options.output === 'json') {
|
|
108
|
+
console.log(formatJsonOutput(report));
|
|
109
|
+
}
|
|
110
|
+
else if (options.output === 'html') {
|
|
111
|
+
console.log(formatHtmlOutput(report));
|
|
112
|
+
}
|
|
113
|
+
process.exit(0);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Build audit report from findings
|
|
117
|
+
*/
|
|
118
|
+
function buildReport(rootPath, umbracoVersion, projectFiles, findings, scanDurationMs) {
|
|
119
|
+
const project = {
|
|
120
|
+
rootPath,
|
|
121
|
+
umbracoVersion,
|
|
122
|
+
projectFiles,
|
|
123
|
+
filesScanned: 0, // TODO: track actual file count
|
|
124
|
+
scanDurationMs,
|
|
125
|
+
};
|
|
126
|
+
// Calculate summary
|
|
127
|
+
const totalHours = findings.reduce((sum, f) => sum + f.hours, 0);
|
|
128
|
+
const totalDays = hoursToDays(totalHours);
|
|
129
|
+
// Group by rule
|
|
130
|
+
const ruleResults = [];
|
|
131
|
+
const allRules = getAllRules();
|
|
132
|
+
for (const rule of allRules) {
|
|
133
|
+
const ruleFindings = findings.filter((f) => f.ruleId === rule.id);
|
|
134
|
+
const totalHours = ruleFindings.reduce((sum, f) => sum + f.hours, 0);
|
|
135
|
+
ruleResults.push({
|
|
136
|
+
ruleId: rule.id,
|
|
137
|
+
ruleName: rule.name,
|
|
138
|
+
category: rule.category,
|
|
139
|
+
findingsCount: ruleFindings.length,
|
|
140
|
+
totalHours,
|
|
141
|
+
enabled: rule.enabled,
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// Group by category
|
|
145
|
+
const categories = new Map();
|
|
146
|
+
for (const finding of findings) {
|
|
147
|
+
const rule = allRules.find((r) => r.id === finding.ruleId);
|
|
148
|
+
if (!rule)
|
|
149
|
+
continue;
|
|
150
|
+
const category = rule.category;
|
|
151
|
+
if (!categories.has(category)) {
|
|
152
|
+
categories.set(category, {
|
|
153
|
+
category,
|
|
154
|
+
findings: 0,
|
|
155
|
+
hours: 0,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
const cat = categories.get(category);
|
|
159
|
+
cat.findings += 1;
|
|
160
|
+
cat.hours += finding.hours;
|
|
161
|
+
}
|
|
162
|
+
const summary = {
|
|
163
|
+
totalHours,
|
|
164
|
+
totalDays,
|
|
165
|
+
rulesTriggered: ruleResults.filter((r) => r.findingsCount > 0).length,
|
|
166
|
+
totalFindings: findings.length,
|
|
167
|
+
byCategory: Array.from(categories.values()),
|
|
168
|
+
};
|
|
169
|
+
return {
|
|
170
|
+
project,
|
|
171
|
+
timestamp: new Date(),
|
|
172
|
+
toolVersion: '0.1.0',
|
|
173
|
+
findings,
|
|
174
|
+
summary,
|
|
175
|
+
ruleResults,
|
|
176
|
+
diagnostics: [],
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { executeAuditCommand } from './commands/audit.js';
|
|
4
|
+
/**
|
|
5
|
+
* CLI entry point
|
|
6
|
+
*
|
|
7
|
+
* Implements Commander-based CLI with audit command and options
|
|
8
|
+
*/
|
|
9
|
+
const program = new Command();
|
|
10
|
+
program
|
|
11
|
+
.name('umbaudit')
|
|
12
|
+
.description('CLI tool to audit and estimate upgrade effort for Umbraco 13 LTS to Umbraco 17 LTS')
|
|
13
|
+
.version('0.1.0');
|
|
14
|
+
program
|
|
15
|
+
.command('audit')
|
|
16
|
+
.description('Audit an Umbraco project and generate upgrade estimate')
|
|
17
|
+
.argument('<path>', 'Path to Umbraco project directory, .sln, or .csproj')
|
|
18
|
+
.option('-o, --output <format>', 'Output format: console, json, html', 'console')
|
|
19
|
+
.option('-v, --verbose', 'Show detailed findings with code context', false)
|
|
20
|
+
.option('--debug', 'Enable debug logging', false)
|
|
21
|
+
.option('--no-color', 'Disable colored output', false)
|
|
22
|
+
.action(async (path, options) => {
|
|
23
|
+
await executeAuditCommand(path, options);
|
|
24
|
+
});
|
|
25
|
+
// Make audit the default command
|
|
26
|
+
program
|
|
27
|
+
.argument('[path]', 'Path to Umbraco project directory, .sln, or .csproj')
|
|
28
|
+
.option('-o, --output <format>', 'Output format: console, json, html', 'console')
|
|
29
|
+
.option('-v, --verbose', 'Show detailed findings with code context', false)
|
|
30
|
+
.option('--debug', 'Enable debug logging', false)
|
|
31
|
+
.option('--no-color', 'Disable colored output', false)
|
|
32
|
+
.action(async (path, options) => {
|
|
33
|
+
if (path) {
|
|
34
|
+
await executeAuditCommand(path, options);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
program.help();
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
program.parse();
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D;;;;GAIG;AAEH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,UAAU,CAAC;KAChB,WAAW,CAAC,oFAAoF,CAAC;KACjG,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO;KACJ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,wDAAwD,CAAC;KACrE,QAAQ,CAAC,QAAQ,EAAE,qDAAqD,CAAC;KACzE,MAAM,CAAC,uBAAuB,EAAE,oCAAoC,EAAE,SAAS,CAAC;KAChF,MAAM,CAAC,eAAe,EAAE,0CAA0C,EAAE,KAAK,CAAC;KAC1E,MAAM,CAAC,SAAS,EAAE,sBAAsB,EAAE,KAAK,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,OAA4B,EAAE,EAAE;IAC3D,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC,CAAC,CAAC;AAEL,iCAAiC;AACjC,OAAO;KACJ,QAAQ,CAAC,QAAQ,EAAE,qDAAqD,CAAC;KACzE,MAAM,CAAC,uBAAuB,EAAE,oCAAoC,EAAE,SAAS,CAAC;KAChF,MAAM,CAAC,eAAe,EAAE,0CAA0C,EAAE,KAAK,CAAC;KAC1E,MAAM,CAAC,SAAS,EAAE,sBAAsB,EAAE,KAAK,CAAC;KAChD,MAAM,CAAC,YAAY,EAAE,wBAAwB,EAAE,KAAK,CAAC;KACrD,MAAM,CAAC,KAAK,EAAE,IAAwB,EAAE,OAA4B,EAAE,EAAE;IACvE,IAAI,IAAI,EAAE,CAAC;QACT,MAAM,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;AACH,CAAC,CAAC,CAAC;AAEL,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascii-logo.d.ts","sourceRoot":"","sources":["../../../src/cli/output/ascii-logo.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAYtD;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
/**
|
|
3
|
+
* Umbraco ASCII logo in brand color
|
|
4
|
+
*
|
|
5
|
+
* Brand Color: #3544B1 (Umbraco Blue)
|
|
6
|
+
*/
|
|
7
|
+
const UMBRACO_BLUE = '#3544B1';
|
|
8
|
+
export function getUmbracoLogo(version) {
|
|
9
|
+
const logo = `
|
|
10
|
+
██╗ ██╗███╗ ███╗██████╗ ██████╗ █████╗ ██████╗ ██████╗
|
|
11
|
+
██║ ██║████╗ ████║██╔══██╗██╔══██╗██╔══██╗██╔════╝██╔═══██╗
|
|
12
|
+
██║ ██║██╔████╔██║██████╔╝██████╔╝███████║██║ ██║ ██║
|
|
13
|
+
██║ ██║██║╚██╔╝██║██╔══██╗██╔══██╗██╔══██║██║ ██║ ██║
|
|
14
|
+
╚██████╔╝██║ ╚═╝ ██║██████╔╝██║ ██║██║ ██║╚██████╗╚██████╔╝
|
|
15
|
+
╚═════╝ ╚═╝ ╚═╝╚═════╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═════╝
|
|
16
|
+
LTS Upgrade Audit Tool v${version}
|
|
17
|
+
`;
|
|
18
|
+
return chalk.hex(UMBRACO_BLUE)(logo);
|
|
19
|
+
}
|
|
20
|
+
export function getH5YRFooter() {
|
|
21
|
+
return '\n#H5YR! 🙌 Thanks for using the Umbraco Upgrade Audit Tool!';
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=ascii-logo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ascii-logo.js","sourceRoot":"","sources":["../../../src/cli/output/ascii-logo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;;GAIG;AAEH,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,IAAI,GAAG;;;;;;;8CAO+B,OAAO;CACpD,CAAC;IAEA,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO,8DAA8D,CAAC;AACxE,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AuditReport } from '../../../models/report.js';
|
|
2
|
+
/**
|
|
3
|
+
* Console formatter with logo, table, and totals
|
|
4
|
+
*
|
|
5
|
+
* Output format:
|
|
6
|
+
* 1. Umbraco ASCII logo in brand blue
|
|
7
|
+
* 2. Results table
|
|
8
|
+
* 3. H5YR footer message
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatConsoleOutput(report: AuditReport, verbose: boolean): string;
|
|
11
|
+
//# sourceMappingURL=console.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../../src/cli/output/formatters/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAI7D;;;;;;;GAOG;AAEH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA2CjF"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { getH5YRFooter, getUmbracoLogo } from '../ascii-logo.js';
|
|
2
|
+
import { renderResultsTable } from '../table-renderer.js';
|
|
3
|
+
/**
|
|
4
|
+
* Console formatter with logo, table, and totals
|
|
5
|
+
*
|
|
6
|
+
* Output format:
|
|
7
|
+
* 1. Umbraco ASCII logo in brand blue
|
|
8
|
+
* 2. Results table
|
|
9
|
+
* 3. H5YR footer message
|
|
10
|
+
*/
|
|
11
|
+
export function formatConsoleOutput(report, verbose) {
|
|
12
|
+
const output = [];
|
|
13
|
+
// 1. Logo
|
|
14
|
+
output.push(getUmbracoLogo(report.toolVersion));
|
|
15
|
+
output.push('\n');
|
|
16
|
+
// 2. Table
|
|
17
|
+
output.push(renderResultsTable(report));
|
|
18
|
+
output.push('\n');
|
|
19
|
+
// 3. Verbose findings (if enabled)
|
|
20
|
+
if (verbose && report.findings.length > 0) {
|
|
21
|
+
output.push('Detailed Findings:\n');
|
|
22
|
+
output.push('─'.repeat(80));
|
|
23
|
+
output.push('\n\n');
|
|
24
|
+
for (const finding of report.findings) {
|
|
25
|
+
output.push(`[${finding.ruleId}] ${finding.filePath}:${finding.lineNumber}\n`);
|
|
26
|
+
output.push(` ${finding.lineContent}\n`);
|
|
27
|
+
if (finding.codeSnippet) {
|
|
28
|
+
output.push('\n Code context:\n');
|
|
29
|
+
finding.codeSnippet.before.forEach((line, idx) => {
|
|
30
|
+
output.push(` ${finding.codeSnippet.startLine + idx} | ${line}\n`);
|
|
31
|
+
});
|
|
32
|
+
output.push(` → ${finding.lineNumber} | ${finding.codeSnippet.line}\n`);
|
|
33
|
+
finding.codeSnippet.after.forEach((line, idx) => {
|
|
34
|
+
output.push(` ${finding.lineNumber + idx + 1} | ${line}\n`);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
output.push('\n');
|
|
38
|
+
}
|
|
39
|
+
output.push('─'.repeat(80));
|
|
40
|
+
output.push('\n\n');
|
|
41
|
+
}
|
|
42
|
+
// 4. Footer
|
|
43
|
+
output.push(getH5YRFooter());
|
|
44
|
+
return output.join('');
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=console.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../../src/cli/output/formatters/console.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;;;;GAOG;AAEH,MAAM,UAAU,mBAAmB,CAAC,MAAmB,EAAE,OAAgB;IACvE,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,UAAU;IACV,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElB,WAAW;IACX,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElB,mCAAmC;IACnC,IAAI,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEpB,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC;YAE1C,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;gBACnC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;oBAC/C,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,WAAY,CAAC,SAAS,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC;gBACzE,CAAC,CAAC,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,UAAU,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,CAAC;gBACzE,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;oBAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,UAAU,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC;gBACjE,CAAC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IAED,YAAY;IACZ,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAE7B,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../../src/cli/output/formatters/html.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAW7D,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAuN5D"}
|