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.
Files changed (181) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +149 -0
  3. package/biome.json +62 -0
  4. package/dist/cli/commands/audit.d.ts +17 -0
  5. package/dist/cli/commands/audit.d.ts.map +1 -0
  6. package/dist/cli/commands/audit.js +179 -0
  7. package/dist/cli/commands/audit.js.map +1 -0
  8. package/dist/cli/index.d.ts +3 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +41 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/cli/output/ascii-logo.d.ts +3 -0
  13. package/dist/cli/output/ascii-logo.d.ts.map +1 -0
  14. package/dist/cli/output/ascii-logo.js +23 -0
  15. package/dist/cli/output/ascii-logo.js.map +1 -0
  16. package/dist/cli/output/formatters/console.d.ts +11 -0
  17. package/dist/cli/output/formatters/console.d.ts.map +1 -0
  18. package/dist/cli/output/formatters/console.js +46 -0
  19. package/dist/cli/output/formatters/console.js.map +1 -0
  20. package/dist/cli/output/formatters/html.d.ts +3 -0
  21. package/dist/cli/output/formatters/html.d.ts.map +1 -0
  22. package/dist/cli/output/formatters/html.js +215 -0
  23. package/dist/cli/output/formatters/html.js.map +1 -0
  24. package/dist/cli/output/formatters/json.d.ts +9 -0
  25. package/dist/cli/output/formatters/json.d.ts.map +1 -0
  26. package/dist/cli/output/formatters/json.js +51 -0
  27. package/dist/cli/output/formatters/json.js.map +1 -0
  28. package/dist/cli/output/table-renderer.d.ts +8 -0
  29. package/dist/cli/output/table-renderer.d.ts.map +1 -0
  30. package/dist/cli/output/table-renderer.js +44 -0
  31. package/dist/cli/output/table-renderer.js.map +1 -0
  32. package/dist/cli/schemas.d.ts +59 -0
  33. package/dist/cli/schemas.d.ts.map +1 -0
  34. package/dist/cli/schemas.js +43 -0
  35. package/dist/cli/schemas.js.map +1 -0
  36. package/dist/models/finding.d.ts +23 -0
  37. package/dist/models/finding.d.ts.map +1 -0
  38. package/dist/models/finding.js +37 -0
  39. package/dist/models/finding.js.map +1 -0
  40. package/dist/models/project.d.ts +13 -0
  41. package/dist/models/project.d.ts.map +1 -0
  42. package/dist/models/project.js +2 -0
  43. package/dist/models/project.js.map +1 -0
  44. package/dist/models/report.d.ts +78 -0
  45. package/dist/models/report.d.ts.map +1 -0
  46. package/dist/models/report.js +2 -0
  47. package/dist/models/report.js.map +1 -0
  48. package/dist/rules/index.d.ts +57 -0
  49. package/dist/rules/index.d.ts.map +1 -0
  50. package/dist/rules/index.js +115 -0
  51. package/dist/rules/index.js.map +1 -0
  52. package/dist/rules/rule-01-nuget-packages.d.ts +3 -0
  53. package/dist/rules/rule-01-nuget-packages.d.ts.map +1 -0
  54. package/dist/rules/rule-01-nuget-packages.js +103 -0
  55. package/dist/rules/rule-01-nuget-packages.js.map +1 -0
  56. package/dist/rules/rule-02-obsolete-controller-classes.d.ts +3 -0
  57. package/dist/rules/rule-02-obsolete-controller-classes.d.ts.map +1 -0
  58. package/dist/rules/rule-02-obsolete-controller-classes.js +70 -0
  59. package/dist/rules/rule-02-obsolete-controller-classes.js.map +1 -0
  60. package/dist/rules/rule-03-tiptap-import.d.ts +3 -0
  61. package/dist/rules/rule-03-tiptap-import.d.ts.map +1 -0
  62. package/dist/rules/rule-03-tiptap-import.js +46 -0
  63. package/dist/rules/rule-03-tiptap-import.js.map +1 -0
  64. package/dist/rules/rule-04-removed-packages.d.ts +3 -0
  65. package/dist/rules/rule-04-removed-packages.d.ts.map +1 -0
  66. package/dist/rules/rule-04-removed-packages.js +51 -0
  67. package/dist/rules/rule-04-removed-packages.js.map +1 -0
  68. package/dist/rules/rule-05-program-cs.d.ts +3 -0
  69. package/dist/rules/rule-05-program-cs.d.ts.map +1 -0
  70. package/dist/rules/rule-05-program-cs.js +46 -0
  71. package/dist/rules/rule-05-program-cs.js.map +1 -0
  72. package/dist/rules/rule-06-view-imports.d.ts +3 -0
  73. package/dist/rules/rule-06-view-imports.d.ts.map +1 -0
  74. package/dist/rules/rule-06-view-imports.js +48 -0
  75. package/dist/rules/rule-06-view-imports.js.map +1 -0
  76. package/dist/rules/rule-07-angular-detection.d.ts +3 -0
  77. package/dist/rules/rule-07-angular-detection.d.ts.map +1 -0
  78. package/dist/rules/rule-07-angular-detection.js +140 -0
  79. package/dist/rules/rule-07-angular-detection.js.map +1 -0
  80. package/dist/rules/rule-08-published-snapshot-interfaces.d.ts +3 -0
  81. package/dist/rules/rule-08-published-snapshot-interfaces.d.ts.map +1 -0
  82. package/dist/rules/rule-08-published-snapshot-interfaces.js +104 -0
  83. package/dist/rules/rule-08-published-snapshot-interfaces.js.map +1 -0
  84. package/dist/rules/rule-09-uda-property-editors.d.ts +3 -0
  85. package/dist/rules/rule-09-uda-property-editors.d.ts.map +1 -0
  86. package/dist/rules/rule-09-uda-property-editors.js +78 -0
  87. package/dist/rules/rule-09-uda-property-editors.js.map +1 -0
  88. package/dist/rules/rule-10-license-files.d.ts +3 -0
  89. package/dist/rules/rule-10-license-files.d.ts.map +1 -0
  90. package/dist/rules/rule-10-license-files.js +67 -0
  91. package/dist/rules/rule-10-license-files.js.map +1 -0
  92. package/dist/rules/types.d.ts +77 -0
  93. package/dist/rules/types.d.ts.map +1 -0
  94. package/dist/rules/types.js +2 -0
  95. package/dist/rules/types.js.map +1 -0
  96. package/dist/scanners/code-searcher.d.ts +43 -0
  97. package/dist/scanners/code-searcher.d.ts.map +1 -0
  98. package/dist/scanners/code-searcher.js +76 -0
  99. package/dist/scanners/code-searcher.js.map +1 -0
  100. package/dist/scanners/csproj-parser.d.ts +35 -0
  101. package/dist/scanners/csproj-parser.d.ts.map +1 -0
  102. package/dist/scanners/csproj-parser.js +71 -0
  103. package/dist/scanners/csproj-parser.js.map +1 -0
  104. package/dist/scanners/file-scanner.d.ts +44 -0
  105. package/dist/scanners/file-scanner.d.ts.map +1 -0
  106. package/dist/scanners/file-scanner.js +66 -0
  107. package/dist/scanners/file-scanner.js.map +1 -0
  108. package/dist/scanners/nuget-client.d.ts +19 -0
  109. package/dist/scanners/nuget-client.d.ts.map +1 -0
  110. package/dist/scanners/nuget-client.js +208 -0
  111. package/dist/scanners/nuget-client.js.map +1 -0
  112. package/dist/utils/hours.d.ts +29 -0
  113. package/dist/utils/hours.d.ts.map +1 -0
  114. package/dist/utils/hours.js +36 -0
  115. package/dist/utils/hours.js.map +1 -0
  116. package/dist/utils/logger.d.ts +35 -0
  117. package/dist/utils/logger.d.ts.map +1 -0
  118. package/dist/utils/logger.js +52 -0
  119. package/dist/utils/logger.js.map +1 -0
  120. package/package.json +49 -0
  121. package/specs/001-umbraco-upgrade-audit/checklists/requirements.md +36 -0
  122. package/specs/001-umbraco-upgrade-audit/contracts/cli-interface.md +278 -0
  123. package/specs/001-umbraco-upgrade-audit/data-model.md +354 -0
  124. package/specs/001-umbraco-upgrade-audit/plan.md +120 -0
  125. package/specs/001-umbraco-upgrade-audit/quickstart.md +187 -0
  126. package/specs/001-umbraco-upgrade-audit/research.md +238 -0
  127. package/specs/001-umbraco-upgrade-audit/spec.md +162 -0
  128. package/specs/001-umbraco-upgrade-audit/tasks.md +291 -0
  129. package/src/cli/commands/audit.ts +221 -0
  130. package/src/cli/index.ts +47 -0
  131. package/src/cli/output/ascii-logo.ts +27 -0
  132. package/src/cli/output/formatters/console.ts +57 -0
  133. package/src/cli/output/formatters/html.ts +227 -0
  134. package/src/cli/output/formatters/json.ts +54 -0
  135. package/src/cli/output/table-renderer.ts +58 -0
  136. package/src/cli/schemas.ts +53 -0
  137. package/src/models/finding.ts +47 -0
  138. package/src/models/project.ts +16 -0
  139. package/src/models/report.ts +97 -0
  140. package/src/rules/index.ts +128 -0
  141. package/src/rules/rule-01-nuget-packages.ts +132 -0
  142. package/src/rules/rule-02-obsolete-controller-classes.ts +89 -0
  143. package/src/rules/rule-03-tiptap-import.ts +66 -0
  144. package/src/rules/rule-04-removed-packages.ts +70 -0
  145. package/src/rules/rule-05-program-cs.ts +66 -0
  146. package/src/rules/rule-06-view-imports.ts +69 -0
  147. package/src/rules/rule-07-angular-detection.ts +169 -0
  148. package/src/rules/rule-08-published-snapshot-interfaces.ts +147 -0
  149. package/src/rules/rule-09-uda-property-editors.ts +98 -0
  150. package/src/rules/rule-10-license-files.ts +88 -0
  151. package/src/rules/types.ts +102 -0
  152. package/src/scanners/code-searcher.ts +114 -0
  153. package/src/scanners/csproj-parser.ts +97 -0
  154. package/src/scanners/file-scanner.ts +77 -0
  155. package/src/scanners/nuget-client.ts +266 -0
  156. package/src/utils/hours.ts +38 -0
  157. package/src/utils/logger.ts +59 -0
  158. package/tests/fixtures/sample-umbraco-project/BlogPost.uda +58 -0
  159. package/tests/fixtures/sample-umbraco-project/ContentModels.generated.cs +20 -0
  160. package/tests/fixtures/sample-umbraco-project/ModernPage.uda +36 -0
  161. package/tests/fixtures/sample-umbraco-project/Program.cs +26 -0
  162. package/tests/fixtures/sample-umbraco-project/PublishedContentService.cs +25 -0
  163. package/tests/fixtures/sample-umbraco-project/SampleCode.cs +16 -0
  164. package/tests/fixtures/sample-umbraco-project/TestProject.csproj +13 -0
  165. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs +4 -0
  166. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.AssemblyInfo.cs +22 -0
  167. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.AssemblyInfoInputs.cache +1 -0
  168. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.GeneratedMSBuildEditorConfig.editorconfig +31 -0
  169. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.GlobalUsings.g.cs +19 -0
  170. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.assets.cache +0 -0
  171. package/tests/fixtures/sample-umbraco-project/obj/Debug/net8.0/TestProject.csproj.AssemblyReference.cache +0 -0
  172. package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.dgspec.json +84 -0
  173. package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.g.props +26 -0
  174. package/tests/fixtures/sample-umbraco-project/obj/TestProject.csproj.nuget.g.targets +13 -0
  175. package/tests/fixtures/sample-umbraco-project/obj/project.assets.json +17414 -0
  176. package/tests/fixtures/sample-umbraco-project/obj/project.nuget.cache +404 -0
  177. package/tests/fixtures/sample-umbraco-project/umbraco/Licenses/umbracoDeploy.lic +1 -0
  178. package/tests/fixtures/sample-umbraco-project/umbraco/Licenses/umbracoForms.lic +1 -0
  179. package/tests/unit/rules/rule-09-uda-property-editors.test.ts +131 -0
  180. package/tests/unit/rules/rule-10-license-files.test.ts +82 -0
  181. 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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ export declare function getUmbracoLogo(version: string): string;
2
+ export declare function getH5YRFooter(): string;
3
+ //# sourceMappingURL=ascii-logo.d.ts.map
@@ -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,3 @@
1
+ import type { AuditReport } from '../../../models/report.js';
2
+ export declare function formatHtmlOutput(report: AuditReport): string;
3
+ //# sourceMappingURL=html.d.ts.map
@@ -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"}