hostinglint 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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Stdubic
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/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,355 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // HostingLint CLI
4
+ // Usage: hostinglint check <path> [options]
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const commander_1 = require("commander");
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = require("node:path");
9
+ const core_1 = require("@hostinglint/core");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('hostinglint')
13
+ .description('Static analysis toolkit for hosting control panel modules')
14
+ .version('0.1.0');
15
+ program
16
+ .command('check')
17
+ .description('Check hosting module files for issues')
18
+ .argument('<path>', 'Path to file or directory to check')
19
+ .option('-p, --platform <platform>', 'Target platform: whmcs, cpanel, openpanel (auto-detected if not specified)')
20
+ .option('--php-version <version>', 'Target PHP version for compatibility checks (default: 8.3)', '8.3')
21
+ .option('-f, --format <format>', 'Output format: text, json, sarif (default: text)', 'text')
22
+ .option('-c, --config <path>', 'Path to configuration file')
23
+ .option('-w, --watch', 'Watch for file changes and re-run analysis')
24
+ .option('--fix', 'Automatically fix problems where possible')
25
+ .option('--no-security', 'Disable security checks')
26
+ .option('--no-best-practices', 'Disable best practice checks')
27
+ .action((targetPath, options) => {
28
+ const resolvedPath = (0, node_path_1.resolve)(targetPath);
29
+ // Load configuration file
30
+ const config = options.config
31
+ ? (0, core_1.findConfig)((0, node_path_1.resolve)(options.config))
32
+ : (0, core_1.findConfig)(resolvedPath);
33
+ // Merge CLI options with config (CLI takes precedence)
34
+ const mergedOptions = mergeCliWithConfig(options, config);
35
+ /**
36
+ * Run a single analysis pass
37
+ */
38
+ const runAnalysis = () => {
39
+ const files = collectFiles(resolvedPath, config.ignore ?? []);
40
+ if (files.length === 0) {
41
+ console.error(`No supported files found in: ${targetPath}`);
42
+ if (!options.watch)
43
+ process.exit(1);
44
+ return { filesChecked: 0, errors: 0, warnings: 0, infos: 0, results: new Map() };
45
+ }
46
+ const summary = analyzeFiles(files, mergedOptions, config);
47
+ // Auto-fix mode
48
+ if (options.fix) {
49
+ const fixedCount = applyAutoFixes(summary);
50
+ if (fixedCount > 0) {
51
+ console.error(`\n Fixed ${fixedCount} problem${fixedCount !== 1 ? 's' : ''} automatically.\n`);
52
+ // Re-run analysis after fixes to show remaining issues
53
+ const postFixSummary = analyzeFiles(files, mergedOptions, config);
54
+ outputResults(postFixSummary, mergedOptions.format);
55
+ return postFixSummary;
56
+ }
57
+ }
58
+ outputResults(summary, mergedOptions.format);
59
+ return summary;
60
+ };
61
+ // Initial run
62
+ const summary = runAnalysis();
63
+ if (options.watch) {
64
+ console.error('\n Watching for file changes... (press Ctrl+C to stop)\n');
65
+ let debounceTimer = null;
66
+ const stat = (0, node_fs_1.statSync)(resolvedPath);
67
+ const watchPath = stat.isDirectory() ? resolvedPath : (0, node_path_1.resolve)(resolvedPath, '..');
68
+ try {
69
+ (0, node_fs_1.watch)(watchPath, { recursive: true }, (_eventType, filename) => {
70
+ if (!filename)
71
+ return;
72
+ const fullPath = (0, node_path_1.resolve)(watchPath, filename);
73
+ // Only re-run for supported files
74
+ if (!isSupportedFile(fullPath))
75
+ return;
76
+ if ((0, core_1.shouldIgnore)(fullPath, config.ignore ?? []))
77
+ return;
78
+ // Debounce to avoid rapid re-runs
79
+ if (debounceTimer)
80
+ clearTimeout(debounceTimer);
81
+ debounceTimer = setTimeout(() => {
82
+ console.error(`\n File changed: ${filename}\n`);
83
+ runAnalysis();
84
+ console.error('\n Watching for file changes... (press Ctrl+C to stop)\n');
85
+ }, 300);
86
+ });
87
+ }
88
+ catch {
89
+ console.error('Watch mode is not supported on this platform. Running single pass only.');
90
+ if (summary.errors > 0)
91
+ process.exit(1);
92
+ }
93
+ }
94
+ else {
95
+ // Exit with error code if there are errors
96
+ if (summary.errors > 0) {
97
+ process.exit(1);
98
+ }
99
+ }
100
+ });
101
+ program.parse();
102
+ /**
103
+ * Merge CLI options with loaded config (CLI takes precedence)
104
+ */
105
+ function mergeCliWithConfig(options, config) {
106
+ return {
107
+ ...options,
108
+ phpVersion: options.phpVersion || config.phpVersion || '8.3',
109
+ security: options.security !== false ? (config.security ?? true) : false,
110
+ bestPractices: options.bestPractices !== false ? (config.bestPractices ?? true) : false,
111
+ };
112
+ }
113
+ // =============================================================================
114
+ // File Collection
115
+ // =============================================================================
116
+ /**
117
+ * Collect all supported files from a path (file or directory)
118
+ */
119
+ function collectFiles(targetPath, ignorePatterns = []) {
120
+ const stat = (0, node_fs_1.statSync)(targetPath);
121
+ if (stat.isFile()) {
122
+ if ((0, core_1.shouldIgnore)(targetPath, ignorePatterns))
123
+ return [];
124
+ return isSupportedFile(targetPath) ? [targetPath] : [];
125
+ }
126
+ if (stat.isDirectory()) {
127
+ return walkDirectory(targetPath, ignorePatterns);
128
+ }
129
+ return [];
130
+ }
131
+ /**
132
+ * Recursively walk a directory and collect supported files
133
+ */
134
+ function walkDirectory(dir, ignorePatterns = []) {
135
+ const files = [];
136
+ const entries = (0, node_fs_1.readdirSync)(dir);
137
+ for (const entry of entries) {
138
+ // Skip hidden directories and node_modules
139
+ if (entry.startsWith('.') || entry === 'node_modules' || entry === 'vendor') {
140
+ continue;
141
+ }
142
+ const fullPath = (0, node_path_1.resolve)(dir, entry);
143
+ if ((0, core_1.shouldIgnore)(fullPath, ignorePatterns))
144
+ continue;
145
+ const stat = (0, node_fs_1.statSync)(fullPath);
146
+ if (stat.isDirectory()) {
147
+ files.push(...walkDirectory(fullPath, ignorePatterns));
148
+ }
149
+ else if (isSupportedFile(fullPath)) {
150
+ files.push(fullPath);
151
+ }
152
+ }
153
+ return files;
154
+ }
155
+ /**
156
+ * Check if a file has a supported extension
157
+ */
158
+ function isSupportedFile(filePath) {
159
+ return (0, core_1.detectPlatform)(filePath) !== null;
160
+ }
161
+ // =============================================================================
162
+ // Analysis
163
+ // =============================================================================
164
+ /**
165
+ * Analyze all collected files using analyzeAuto from core
166
+ */
167
+ function analyzeFiles(files, options, config) {
168
+ const summary = {
169
+ filesChecked: files.length,
170
+ errors: 0,
171
+ warnings: 0,
172
+ infos: 0,
173
+ results: new Map(),
174
+ };
175
+ for (const file of files) {
176
+ const code = (0, node_fs_1.readFileSync)(file, 'utf-8');
177
+ const results = (0, core_1.analyzeAuto)(code, file, {
178
+ platform: options.platform,
179
+ phpVersion: options.phpVersion,
180
+ security: options.security,
181
+ bestPractices: options.bestPractices,
182
+ rules: config.rules,
183
+ });
184
+ if (results.length === 0)
185
+ continue;
186
+ summary.results.set(file, results);
187
+ for (const result of results) {
188
+ switch (result.severity) {
189
+ case 'error':
190
+ summary.errors++;
191
+ break;
192
+ case 'warning':
193
+ summary.warnings++;
194
+ break;
195
+ case 'info':
196
+ summary.infos++;
197
+ break;
198
+ }
199
+ }
200
+ }
201
+ return summary;
202
+ }
203
+ // =============================================================================
204
+ // Auto-Fix
205
+ // =============================================================================
206
+ /**
207
+ * Apply auto-fixes for all files in the summary
208
+ * Returns total number of fixes applied
209
+ */
210
+ function applyAutoFixes(summary) {
211
+ let totalFixed = 0;
212
+ for (const [file, results] of summary.results) {
213
+ const fixSummary = (0, core_1.getFixableSummary)(results);
214
+ if (fixSummary.fixable === 0)
215
+ continue;
216
+ const code = (0, node_fs_1.readFileSync)(file, 'utf-8');
217
+ const fixResult = (0, core_1.applyFixes)(code, results);
218
+ if (fixResult.fixesApplied > 0) {
219
+ (0, node_fs_1.writeFileSync)(file, fixResult.code, 'utf-8');
220
+ totalFixed += fixResult.fixesApplied;
221
+ console.error(` Fixed ${fixResult.fixesApplied} issue${fixResult.fixesApplied !== 1 ? 's' : ''} in ${(0, node_path_1.relative)(process.cwd(), file)}`);
222
+ }
223
+ }
224
+ return totalFixed;
225
+ }
226
+ // =============================================================================
227
+ // Output Formatting
228
+ // =============================================================================
229
+ /**
230
+ * Output results in the specified format
231
+ */
232
+ function outputResults(summary, format) {
233
+ switch (format) {
234
+ case 'json':
235
+ outputJson(summary);
236
+ break;
237
+ case 'sarif':
238
+ outputSarif(summary);
239
+ break;
240
+ case 'text':
241
+ default:
242
+ outputText(summary);
243
+ break;
244
+ }
245
+ }
246
+ /**
247
+ * Human-readable text output (like ESLint)
248
+ */
249
+ function outputText(summary) {
250
+ const cwd = process.cwd();
251
+ if (summary.results.size === 0) {
252
+ console.error(`\n ✓ ${summary.filesChecked} files checked, no issues found.\n`);
253
+ return;
254
+ }
255
+ for (const [file, results] of summary.results) {
256
+ const relPath = (0, node_path_1.relative)(cwd, file);
257
+ console.error(`\n ${relPath}`);
258
+ for (const result of results) {
259
+ const severityLabel = formatSeverity(result.severity);
260
+ const fixMarker = result.fixAction ? ' 🔧' : '';
261
+ console.error(` L${result.line}:${result.column} ${severityLabel} ${result.message} ${result.ruleId}${fixMarker}`);
262
+ }
263
+ }
264
+ const total = summary.errors + summary.warnings + summary.infos;
265
+ const parts = [];
266
+ if (summary.errors > 0)
267
+ parts.push(`${summary.errors} error${summary.errors !== 1 ? 's' : ''}`);
268
+ if (summary.warnings > 0)
269
+ parts.push(`${summary.warnings} warning${summary.warnings !== 1 ? 's' : ''}`);
270
+ if (summary.infos > 0)
271
+ parts.push(`${summary.infos} info`);
272
+ // Show fixable count
273
+ const allResults = Array.from(summary.results.values()).flat();
274
+ const fixable = allResults.filter((r) => r.fixAction).length;
275
+ const fixableMsg = fixable > 0 ? ` ${fixable} fixable with --fix` : '';
276
+ console.error(`\n ${total} problem${total !== 1 ? 's' : ''} (${parts.join(', ')})${fixableMsg}\n`);
277
+ }
278
+ /**
279
+ * Format severity label for text output
280
+ */
281
+ function formatSeverity(severity) {
282
+ switch (severity) {
283
+ case 'error': return 'error ';
284
+ case 'warning': return 'warning';
285
+ case 'info': return 'info ';
286
+ }
287
+ }
288
+ /**
289
+ * JSON output
290
+ */
291
+ function outputJson(summary) {
292
+ const output = {
293
+ filesChecked: summary.filesChecked,
294
+ errors: summary.errors,
295
+ warnings: summary.warnings,
296
+ infos: summary.infos,
297
+ results: Object.fromEntries(summary.results),
298
+ };
299
+ // JSON goes to stdout for piping
300
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
301
+ }
302
+ /**
303
+ * SARIF output (GitHub Code Scanning compatible)
304
+ */
305
+ function outputSarif(summary) {
306
+ const runs = [{
307
+ tool: {
308
+ driver: {
309
+ name: 'hostinglint',
310
+ version: '0.1.0',
311
+ informationUri: 'https://github.com/Stdubic/hostinglint',
312
+ rules: [],
313
+ },
314
+ },
315
+ results: [],
316
+ }];
317
+ const seenRules = new Set();
318
+ for (const [file, results] of summary.results) {
319
+ for (const result of results) {
320
+ // Add rule definition if not seen
321
+ if (!seenRules.has(result.ruleId)) {
322
+ seenRules.add(result.ruleId);
323
+ runs[0].tool.driver.rules.push({
324
+ id: result.ruleId,
325
+ shortDescription: { text: result.message },
326
+ defaultConfiguration: {
327
+ level: result.severity === 'info' ? 'note' : result.severity,
328
+ },
329
+ });
330
+ }
331
+ runs[0].results.push({
332
+ ruleId: result.ruleId,
333
+ level: result.severity === 'info' ? 'note' : result.severity,
334
+ message: { text: result.message },
335
+ locations: [{
336
+ physicalLocation: {
337
+ artifactLocation: { uri: (0, node_path_1.relative)(process.cwd(), file) },
338
+ region: {
339
+ startLine: result.line,
340
+ startColumn: result.column,
341
+ },
342
+ },
343
+ }],
344
+ });
345
+ }
346
+ }
347
+ const sarif = {
348
+ $schema: 'https://json.schemastore.org/sarif-2.1.0.json',
349
+ version: '2.1.0',
350
+ runs,
351
+ };
352
+ // SARIF goes to stdout for piping
353
+ process.stdout.write(JSON.stringify(sarif, null, 2) + '\n');
354
+ }
355
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ "name": "hostinglint",
3
+ "version": "0.1.0",
4
+ "description": "CLI for HostingLint - validate WHMCS, cPanel, and OpenPanel modules",
5
+ "main": "./dist/cli.js",
6
+ "types": "./dist/cli.d.ts",
7
+ "bin": {
8
+ "hostinglint": "dist/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "LICENSE"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc -p tsconfig.build.json",
16
+ "clean": "rm -rf dist",
17
+ "prepublishOnly": "npm run build"
18
+ },
19
+ "keywords": [
20
+ "whmcs",
21
+ "cpanel",
22
+ "openpanel",
23
+ "hosting",
24
+ "lint",
25
+ "cli",
26
+ "static-analysis",
27
+ "security"
28
+ ],
29
+ "author": "Stdubic",
30
+ "license": "MIT",
31
+ "engines": {
32
+ "node": ">=20.0.0"
33
+ },
34
+ "repository": {
35
+ "type": "git",
36
+ "url": "git+https://github.com/Stdubic/hostinglint.git",
37
+ "directory": "packages/cli"
38
+ },
39
+ "homepage": "https://github.com/Stdubic/hostinglint#readme",
40
+ "bugs": {
41
+ "url": "https://github.com/Stdubic/hostinglint/issues"
42
+ },
43
+ "funding": {
44
+ "type": "individual",
45
+ "url": "https://nlnet.nl/commonsfund/"
46
+ },
47
+ "dependencies": {
48
+ "@hostinglint/core": "0.1.0",
49
+ "commander": "^13"
50
+ }
51
+ }