@iviva/uxp-lint 0.0.1

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 (85) hide show
  1. package/README.md +273 -0
  2. package/bin/uxp-lint.js +2 -0
  3. package/dist/cli.d.ts +1 -0
  4. package/dist/cli.js +100 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/config.d.ts +4 -0
  7. package/dist/config.js +42 -0
  8. package/dist/config.js.map +1 -0
  9. package/dist/eslint/config.d.ts +2 -0
  10. package/dist/eslint/config.js +225 -0
  11. package/dist/eslint/config.js.map +1 -0
  12. package/dist/eslint/rules/event-name-format.d.ts +5 -0
  13. package/dist/eslint/rules/event-name-format.js +59 -0
  14. package/dist/eslint/rules/event-name-format.js.map +1 -0
  15. package/dist/eslint/rules/no-bad-hook-deps.d.ts +5 -0
  16. package/dist/eslint/rules/no-bad-hook-deps.js +57 -0
  17. package/dist/eslint/rules/no-bad-hook-deps.js.map +1 -0
  18. package/dist/eslint/rules/no-fa-prefix.d.ts +5 -0
  19. package/dist/eslint/rules/no-fa-prefix.js +59 -0
  20. package/dist/eslint/rules/no-fa-prefix.js.map +1 -0
  21. package/dist/eslint/rules/no-hardcoded-jsx-text.d.ts +5 -0
  22. package/dist/eslint/rules/no-hardcoded-jsx-text.js +55 -0
  23. package/dist/eslint/rules/no-hardcoded-jsx-text.js.map +1 -0
  24. package/dist/eslint/rules/no-inline-styles.d.ts +8 -0
  25. package/dist/eslint/rules/no-inline-styles.js +41 -0
  26. package/dist/eslint/rules/no-inline-styles.js.map +1 -0
  27. package/dist/eslint/rules/no-native-html-interactive.d.ts +5 -0
  28. package/dist/eslint/rules/no-native-html-interactive.js +81 -0
  29. package/dist/eslint/rules/no-native-html-interactive.js.map +1 -0
  30. package/dist/eslint/rules/require-memo.d.ts +9 -0
  31. package/dist/eslint/rules/require-memo.js +70 -0
  32. package/dist/eslint/rules/require-memo.js.map +1 -0
  33. package/dist/eslint/rules/service-config-shape.d.ts +5 -0
  34. package/dist/eslint/rules/service-config-shape.js +80 -0
  35. package/dist/eslint/rules/service-config-shape.js.map +1 -0
  36. package/dist/eslint/rules/url-params-form-state.d.ts +5 -0
  37. package/dist/eslint/rules/url-params-form-state.js +75 -0
  38. package/dist/eslint/rules/url-params-form-state.js.map +1 -0
  39. package/dist/reporter.d.ts +22 -0
  40. package/dist/reporter.js +260 -0
  41. package/dist/reporter.js.map +1 -0
  42. package/dist/rule-registry.d.ts +2 -0
  43. package/dist/rule-registry.js +46 -0
  44. package/dist/rule-registry.js.map +1 -0
  45. package/dist/rules-reader.d.ts +4 -0
  46. package/dist/rules-reader.js +16 -0
  47. package/dist/rules-reader.js.map +1 -0
  48. package/dist/runner.d.ts +7 -0
  49. package/dist/runner.js +62 -0
  50. package/dist/runner.js.map +1 -0
  51. package/dist/setup.d.ts +2 -0
  52. package/dist/setup.js +80 -0
  53. package/dist/setup.js.map +1 -0
  54. package/dist/types.d.ts +55 -0
  55. package/dist/types.js +39 -0
  56. package/dist/types.js.map +1 -0
  57. package/dist/validators/ai.d.ts +2 -0
  58. package/dist/validators/ai.js +115 -0
  59. package/dist/validators/ai.js.map +1 -0
  60. package/dist/validators/bulk-imports.d.ts +3 -0
  61. package/dist/validators/bulk-imports.js +94 -0
  62. package/dist/validators/bulk-imports.js.map +1 -0
  63. package/dist/validators/bundle-json.d.ts +3 -0
  64. package/dist/validators/bundle-json.js +130 -0
  65. package/dist/validators/bundle-json.js.map +1 -0
  66. package/dist/validators/bundle-size.d.ts +3 -0
  67. package/dist/validators/bundle-size.js +51 -0
  68. package/dist/validators/bundle-size.js.map +1 -0
  69. package/dist/validators/config-yml.d.ts +3 -0
  70. package/dist/validators/config-yml.js +148 -0
  71. package/dist/validators/config-yml.js.map +1 -0
  72. package/dist/validators/duplication.d.ts +3 -0
  73. package/dist/validators/duplication.js +65 -0
  74. package/dist/validators/duplication.js.map +1 -0
  75. package/dist/validators/folder-structure.d.ts +3 -0
  76. package/dist/validators/folder-structure.js +123 -0
  77. package/dist/validators/folder-structure.js.map +1 -0
  78. package/dist/validators/formatting.d.ts +3 -0
  79. package/dist/validators/formatting.js +97 -0
  80. package/dist/validators/formatting.js.map +1 -0
  81. package/dist/validators/scss-rules.d.ts +3 -0
  82. package/dist/validators/scss-rules.js +156 -0
  83. package/dist/validators/scss-rules.js.map +1 -0
  84. package/package.json +58 -0
  85. package/templates/prettier.config.js +11 -0
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.doc = void 0;
4
+ exports.doc = {
5
+ id: 'url-params-form-state',
6
+ severity: 'error',
7
+ category: 'react',
8
+ description: 'Form open/close state must use URL search params, not useState.',
9
+ rationale: 'URL params survive navigation, back button, and deep linking. useState is lost on navigation.',
10
+ fix: 'Use `const { add, edit } = useSearchParams()` and `navigate(generateURL({ searchParams: { add: "1" } }))`.',
11
+ };
12
+ /**
13
+ * Form open/close state must use URL search params, not useState.
14
+ * Flags useState calls with boolean or string initial values whose variable name
15
+ * suggests form/dialog visibility (isOpen, showForm, visible, open, etc.)
16
+ */
17
+ const FORM_STATE_NAMES = /^(is(Open|Visible|Shown|Show)|show(Form|Dialog|Modal|Panel)|open|visible)$/i;
18
+ const rule = {
19
+ meta: {
20
+ type: 'problem',
21
+ docs: {
22
+ description: 'Form open/close state must use URL search params, not useState',
23
+ },
24
+ schema: [],
25
+ messages: {
26
+ useUrlParams: 'Use URL search params for form visibility state (not useState). ' +
27
+ 'Pattern: const { add, edit } = useSearchParams(); navigate(generateURL({ searchParams: { add: "1" } }))',
28
+ },
29
+ },
30
+ create(context) {
31
+ // Only apply to files inside views/ or forms/
32
+ const filename = context.getFilename();
33
+ const isRelevantFile = filename.includes('/views/') ||
34
+ filename.includes('/forms/') ||
35
+ filename.includes(`\\views\\`) ||
36
+ filename.includes(`\\forms\\`);
37
+ if (!isRelevantFile)
38
+ return {};
39
+ return {
40
+ VariableDeclarator(node) {
41
+ // Look for: const [stateVar, setter] = useState(false|true|'')
42
+ if (node.id.type !== 'ArrayPattern' ||
43
+ node.id.elements.length < 1 ||
44
+ !node.init ||
45
+ node.init.type !== 'CallExpression')
46
+ return;
47
+ const callee = node.init.callee;
48
+ const isUseState = (callee.type === 'Identifier' && callee.name === 'useState') ||
49
+ (callee.type === 'MemberExpression' &&
50
+ callee.property.type === 'Identifier' &&
51
+ callee.property.name === 'useState');
52
+ if (!isUseState)
53
+ return;
54
+ // Check initial value is boolean or empty string (form toggle pattern)
55
+ const args = node.init.arguments;
56
+ if (args.length === 0)
57
+ return;
58
+ const firstArg = args[0];
59
+ const isBoolOrEmpty = firstArg.type === 'Literal' &&
60
+ (firstArg.value === false || firstArg.value === true || firstArg.value === '');
61
+ if (!isBoolOrEmpty)
62
+ return;
63
+ // Check variable name matches form state pattern
64
+ const firstEl = node.id.elements[0];
65
+ if (!firstEl || firstEl.type !== 'Identifier')
66
+ return;
67
+ if (FORM_STATE_NAMES.test(firstEl.name)) {
68
+ context.report({ node, messageId: 'useUrlParams' });
69
+ }
70
+ },
71
+ };
72
+ },
73
+ };
74
+ exports.default = rule;
75
+ //# sourceMappingURL=url-params-form-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-params-form-state.js","sourceRoot":"","sources":["../../../src/eslint/rules/url-params-form-state.ts"],"names":[],"mappings":";;;AAGa,QAAA,GAAG,GAAY;IAC1B,EAAE,EAAE,uBAAuB;IAC3B,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,WAAW,EAAE,iEAAiE;IAC9E,SAAS,EAAE,+FAA+F;IAC1G,GAAG,EAAE,4GAA4G;CAClH,CAAC;AAEF;;;;GAIG;AACH,MAAM,gBAAgB,GAAG,6EAA6E,CAAC;AAEvG,MAAM,IAAI,GAAoB;IAC5B,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE;YACJ,WAAW,EAAE,gEAAgE;SAC9E;QACD,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE;YACR,YAAY,EACV,kEAAkE;gBAClE,yGAAyG;SAC5G;KACF;IACD,MAAM,CAAC,OAAO;QACZ,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QACvC,MAAM,cAAc,GAClB,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;YAC5B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC9B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACjC,IAAI,CAAC,cAAc;YAAE,OAAO,EAAE,CAAC;QAE/B,OAAO;YACL,kBAAkB,CAAC,IAAI;gBACrB,+DAA+D;gBAC/D,IACE,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,cAAc;oBAC/B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAC3B,CAAC,IAAI,CAAC,IAAI;oBACV,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB;oBAEnC,OAAO;gBAET,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;gBAChC,MAAM,UAAU,GACd,CAAC,MAAM,CAAC,IAAI,KAAK,YAAY,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC;oBAC5D,CAAC,MAAM,CAAC,IAAI,KAAK,kBAAkB;wBACjC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;wBACrC,MAAM,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBAEzC,IAAI,CAAC,UAAU;oBAAE,OAAO;gBAExB,uEAAuE;gBACvE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;gBACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACzB,MAAM,aAAa,GACjB,QAAQ,CAAC,IAAI,KAAK,SAAS;oBAC3B,CAAC,QAAQ,CAAC,KAAK,KAAK,KAAK,IAAI,QAAQ,CAAC,KAAK,KAAK,IAAI,IAAI,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;gBAEjF,IAAI,CAAC,aAAa;oBAAE,OAAO;gBAE3B,iDAAiD;gBACjD,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBACpC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY;oBAAE,OAAO;gBAEtD,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,kBAAe,IAAI,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { GroupResult } from './types';
2
+ declare const WARN_ICON: string;
3
+ /**
4
+ * Print messages for a group, grouped by file.
5
+ * No pass/fail header — the summary table covers that.
6
+ * A dim section label is shown only when the group has messages.
7
+ */
8
+ export declare function printGroupResult(result: GroupResult): void;
9
+ /**
10
+ * Compact group line — used when --report is active.
11
+ * Shows pass/fail icon + name + counts on one line; details go to the file.
12
+ */
13
+ export declare function printGroupResultCompact(result: GroupResult): void;
14
+ export declare function printSummary(results: GroupResult[]): {
15
+ errors: number;
16
+ warnings: number;
17
+ };
18
+ export declare function printHeader(version: string): void;
19
+ export declare function printInfo(msg: string): void;
20
+ export declare function printError(msg: string): void;
21
+ export declare function writeReport(results: GroupResult[], cwd: string, filePath: string): string;
22
+ export { WARN_ICON };
@@ -0,0 +1,260 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.WARN_ICON = void 0;
7
+ exports.printGroupResult = printGroupResult;
8
+ exports.printGroupResultCompact = printGroupResultCompact;
9
+ exports.printSummary = printSummary;
10
+ exports.printHeader = printHeader;
11
+ exports.printInfo = printInfo;
12
+ exports.printError = printError;
13
+ exports.writeReport = writeReport;
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const chalk_1 = __importDefault(require("chalk"));
17
+ const WARN_ICON = chalk_1.default.yellow('⚠');
18
+ exports.WARN_ICON = WARN_ICON;
19
+ // ── Helpers ───────────────────────────────────────────────────────────────────
20
+ /** Pad a PLAIN string to width. Never call this on chalk-colored strings. */
21
+ function rpad(str, width) {
22
+ return str + ' '.repeat(Math.max(0, width - str.length));
23
+ }
24
+ /** Right-align a plain string to width, then apply color to just the content. */
25
+ function colorRight(str, width, colorFn) {
26
+ return ' '.repeat(Math.max(0, width - str.length)) + colorFn(str);
27
+ }
28
+ /** Center a plain string to width, then apply color to just the content. */
29
+ function colorCenter(str, width, colorFn) {
30
+ const total = Math.max(0, width - str.length);
31
+ const left = Math.floor(total / 2);
32
+ return ' '.repeat(left) + colorFn(str) + ' '.repeat(total - left);
33
+ }
34
+ /**
35
+ * Print all messages for a group, grouped by file.
36
+ *
37
+ * For each file:
38
+ * filename <red:N error(s)> <yellow:N warning(s)>
39
+ * line:col error message [rule]
40
+ * line:col warn message [rule]
41
+ *
42
+ * Messages with no file are printed directly (bare config errors).
43
+ */
44
+ function printMessagesGroupedByFile(errors, warnings) {
45
+ const allMessages = [
46
+ ...errors.map((msg) => ({ msg, isError: true })),
47
+ ...warnings.map((msg) => ({ msg, isError: false })),
48
+ ];
49
+ // Bare messages (no file) — print directly
50
+ for (const { msg, isError } of allMessages.filter(({ msg }) => !msg.file)) {
51
+ const sev = isError ? chalk_1.default.red('error') : chalk_1.default.yellow('warn ');
52
+ const rule = msg.rule ? chalk_1.default.gray(` [${msg.rule}]`) : '';
53
+ console.log(` ${sev} ${msg.message}${rule}`);
54
+ }
55
+ // Group by file
56
+ const byFile = new Map();
57
+ for (const tagged of allMessages.filter(({ msg }) => !!msg.file)) {
58
+ const key = tagged.msg.file;
59
+ if (!byFile.has(key))
60
+ byFile.set(key, []);
61
+ byFile.get(key).push(tagged);
62
+ }
63
+ for (const [file, tagged] of byFile) {
64
+ const fileErrors = tagged.filter((t) => t.isError).length;
65
+ const fileWarnings = tagged.filter((t) => !t.isError).length;
66
+ // File header: filename N error(s) N warning(s)
67
+ const counts = [];
68
+ if (fileErrors > 0)
69
+ counts.push(chalk_1.default.red(`${fileErrors} error${fileErrors !== 1 ? 's' : ''}`));
70
+ if (fileWarnings > 0)
71
+ counts.push(chalk_1.default.yellow(`${fileWarnings} warning${fileWarnings !== 1 ? 's' : ''}`));
72
+ console.log(`\n ${chalk_1.default.cyan(file)} ${counts.join(' ')}`);
73
+ // Messages under file header
74
+ for (const { msg, isError } of tagged) {
75
+ const sev = isError ? chalk_1.default.red('error') : chalk_1.default.yellow('warn ');
76
+ const loc = msg.line != null
77
+ ? chalk_1.default.gray(`${String(msg.line).padStart(4)}${msg.col != null ? `:${msg.col}` : ''} `)
78
+ : ' ';
79
+ const rule = msg.rule ? chalk_1.default.gray(` [${msg.rule}]`) : '';
80
+ console.log(` ${loc}${sev} ${msg.message}${rule}`);
81
+ }
82
+ }
83
+ }
84
+ // ── Group result ──────────────────────────────────────────────────────────────
85
+ /**
86
+ * Print messages for a group, grouped by file.
87
+ * No pass/fail header — the summary table covers that.
88
+ * A dim section label is shown only when the group has messages.
89
+ */
90
+ function printGroupResult(result) {
91
+ if (result.skipped)
92
+ return;
93
+ if (result.errors.length === 0 && result.warnings.length === 0)
94
+ return;
95
+ console.log(chalk_1.default.gray(`\n ── ${result.group}`));
96
+ printMessagesGroupedByFile(result.errors, result.warnings);
97
+ console.log('');
98
+ }
99
+ /**
100
+ * Compact group line — used when --report is active.
101
+ * Shows pass/fail icon + name + counts on one line; details go to the file.
102
+ */
103
+ function printGroupResultCompact(result) {
104
+ var _a;
105
+ const icon = result.skipped ? chalk_1.default.gray('–') : result.passed ? chalk_1.default.green('✔') : chalk_1.default.red('✗');
106
+ const label = rpad(` ${icon} ${result.group}`, 42);
107
+ if (result.skipped) {
108
+ console.log(`${label} ${chalk_1.default.gray((_a = result.skipReason) !== null && _a !== void 0 ? _a : 'skipped')}`);
109
+ return;
110
+ }
111
+ const e = result.errors.length;
112
+ const w = result.warnings.length;
113
+ if (e === 0 && w === 0) {
114
+ console.log(`${label} ${chalk_1.default.gray('passed')}`);
115
+ }
116
+ else {
117
+ const parts = [];
118
+ if (e > 0)
119
+ parts.push(chalk_1.default.red(`${e} error${e !== 1 ? 's' : ''}`));
120
+ if (w > 0)
121
+ parts.push(chalk_1.default.yellow(`${w} warning${w !== 1 ? 's' : ''}`));
122
+ console.log(`${label} ${parts.join(', ')}`);
123
+ }
124
+ }
125
+ // ── Summary table ─────────────────────────────────────────────────────────────
126
+ // Visible column widths (no ANSI)
127
+ const C_GRP = 30;
128
+ const C_STS = 6;
129
+ const C_ERR = 8;
130
+ const C_WRN = 10;
131
+ function tableDivider(l, m, r) {
132
+ return (' ' + l +
133
+ '─'.repeat(C_GRP + 2) + m +
134
+ '─'.repeat(C_STS + 2) + m +
135
+ '─'.repeat(C_ERR + 2) + m +
136
+ '─'.repeat(C_WRN + 2) + r);
137
+ }
138
+ function tableRow(group, groupColor, statusStr, statusColor, errStr, errColor, warnStr, warnColor) {
139
+ return (' │ ' +
140
+ groupColor(rpad(group, C_GRP)) + ' │ ' +
141
+ colorCenter(statusStr, C_STS, statusColor) + ' │ ' +
142
+ colorRight(errStr, C_ERR, errColor) + ' │ ' +
143
+ colorRight(warnStr, C_WRN, warnColor) + ' │');
144
+ }
145
+ function printSummary(results) {
146
+ const totalErrors = results.reduce((n, r) => n + r.errors.length, 0);
147
+ const totalWarnings = results.reduce((n, r) => n + r.warnings.length, 0);
148
+ console.log('');
149
+ console.log(chalk_1.default.gray(tableDivider('┌', '┬', '┐')));
150
+ // Header row (plain bold, no color needed)
151
+ console.log(' │ ' +
152
+ chalk_1.default.bold(rpad('Group', C_GRP)) + ' │ ' +
153
+ chalk_1.default.bold(rpad('Status', C_STS)) + ' │ ' +
154
+ chalk_1.default.bold(rpad('Errors', C_ERR)) + ' │ ' +
155
+ chalk_1.default.bold(rpad('Warnings', C_WRN)) + ' │');
156
+ console.log(chalk_1.default.gray(tableDivider('├', '┼', '┤')));
157
+ for (const result of results) {
158
+ let statusStr;
159
+ let statusColor;
160
+ if (result.skipped) {
161
+ statusStr = '–';
162
+ statusColor = chalk_1.default.gray;
163
+ }
164
+ else if (result.passed) {
165
+ statusStr = '✔';
166
+ statusColor = chalk_1.default.green;
167
+ }
168
+ else {
169
+ statusStr = '✗';
170
+ statusColor = chalk_1.default.red;
171
+ }
172
+ const e = result.errors.length;
173
+ const w = result.warnings.length;
174
+ console.log(tableRow(result.group, (s) => s, statusStr, statusColor, e > 0 ? String(e) : '–', e > 0 ? chalk_1.default.red : chalk_1.default.gray, w > 0 ? String(w) : '–', w > 0 ? chalk_1.default.yellow : chalk_1.default.gray));
175
+ }
176
+ console.log(chalk_1.default.gray(tableDivider('├', '┼', '┤')));
177
+ console.log(tableRow('Total', chalk_1.default.bold, '', (s) => s, totalErrors > 0 ? String(totalErrors) : '–', totalErrors > 0 ? chalk_1.default.red : chalk_1.default.gray, totalWarnings > 0 ? String(totalWarnings) : '–', totalWarnings > 0 ? chalk_1.default.yellow : chalk_1.default.gray));
178
+ console.log(chalk_1.default.gray(tableDivider('└', '┴', '┘')));
179
+ console.log('');
180
+ return { errors: totalErrors, warnings: totalWarnings };
181
+ }
182
+ // ── Header / info / error ─────────────────────────────────────────────────────
183
+ function printHeader(version) {
184
+ console.log('');
185
+ console.log(chalk_1.default.bold(` uxp-lint v${version}`));
186
+ console.log('');
187
+ }
188
+ function printInfo(msg) {
189
+ console.log(chalk_1.default.gray(` ${msg}`));
190
+ }
191
+ function printError(msg) {
192
+ console.error(chalk_1.default.red(` ✗ ${msg}`));
193
+ }
194
+ // ── File report (no ANSI) ─────────────────────────────────────────────────────
195
+ function plainMessage(msg, isError) {
196
+ const sev = isError ? 'error' : 'warn ';
197
+ const rule = msg.rule ? ` [${msg.rule}]` : '';
198
+ if (!msg.file)
199
+ return [` ${sev} ${msg.message}${rule}`];
200
+ const loc = msg.line != null
201
+ ? `${msg.line}${msg.col != null ? `:${msg.col}` : ''}`
202
+ : '';
203
+ return [
204
+ ` ${msg.file}${loc ? ` ${loc}` : ''}`,
205
+ ` ${sev} ${msg.message}${rule}`,
206
+ ];
207
+ }
208
+ function writeReport(results, cwd, filePath) {
209
+ var _a;
210
+ const absPath = path_1.default.resolve(cwd, filePath);
211
+ const lines = [];
212
+ lines.push('uxp-lint report');
213
+ lines.push(`Generated: ${new Date().toISOString()}`);
214
+ lines.push(`Directory: ${cwd}`);
215
+ lines.push('');
216
+ for (const result of results) {
217
+ const status = result.skipped ? 'SKIP' : result.passed ? 'PASS' : 'FAIL';
218
+ const e = result.errors.length;
219
+ const w = result.warnings.length;
220
+ const counts = e + w === 0
221
+ ? ''
222
+ : ` (${[e > 0 ? `${e} errors` : '', w > 0 ? `${w} warnings` : ''].filter(Boolean).join(', ')})`;
223
+ lines.push(`[${status}] ${result.group}${counts}`);
224
+ if (result.skipped) {
225
+ lines.push(` ${(_a = result.skipReason) !== null && _a !== void 0 ? _a : 'skipped'}`);
226
+ lines.push('');
227
+ continue;
228
+ }
229
+ for (const msg of result.errors)
230
+ lines.push(...plainMessage(msg, true));
231
+ for (const msg of result.warnings)
232
+ lines.push(...plainMessage(msg, false));
233
+ lines.push('');
234
+ }
235
+ // Plain-text summary table (ASCII borders, fixed widths)
236
+ const W = [C_GRP, C_STS, C_ERR, C_WRN];
237
+ const divider = '+' + W.map((w) => '-'.repeat(w + 2)).join('+') + '+';
238
+ const prow = (cols) => '| ' + cols.map((c, i) => rpad(c, W[i])).join(' | ') + ' |';
239
+ lines.push(divider);
240
+ lines.push(prow(['Group', 'Status', 'Errors', 'Warnings']));
241
+ lines.push(divider);
242
+ for (const result of results) {
243
+ const status = result.skipped ? 'skip' : result.passed ? 'pass' : 'FAIL';
244
+ const e = result.errors.length;
245
+ const w = result.warnings.length;
246
+ lines.push(prow([result.group, status, e > 0 ? String(e) : '–', w > 0 ? String(w) : '–']));
247
+ }
248
+ const totalErrors = results.reduce((n, r) => n + r.errors.length, 0);
249
+ const totalWarnings = results.reduce((n, r) => n + r.warnings.length, 0);
250
+ lines.push(divider);
251
+ lines.push(prow([
252
+ 'Total', '',
253
+ totalErrors > 0 ? String(totalErrors) : '–',
254
+ totalWarnings > 0 ? String(totalWarnings) : '–',
255
+ ]));
256
+ lines.push(divider);
257
+ fs_1.default.writeFileSync(absPath, lines.join('\n') + '\n', 'utf8');
258
+ return absPath;
259
+ }
260
+ //# sourceMappingURL=reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reporter.js","sourceRoot":"","sources":["../src/reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { RuleDoc } from './types';
2
+ export declare const ALL_RULES: RuleDoc[];
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ALL_RULES = void 0;
4
+ // ── ESLint rules ─────────────────────────────────────────────────────────────
5
+ const require_memo_1 = require("./eslint/rules/require-memo");
6
+ const no_inline_styles_1 = require("./eslint/rules/no-inline-styles");
7
+ const url_params_form_state_1 = require("./eslint/rules/url-params-form-state");
8
+ const service_config_shape_1 = require("./eslint/rules/service-config-shape");
9
+ const no_fa_prefix_1 = require("./eslint/rules/no-fa-prefix");
10
+ const no_bad_hook_deps_1 = require("./eslint/rules/no-bad-hook-deps");
11
+ const no_hardcoded_jsx_text_1 = require("./eslint/rules/no-hardcoded-jsx-text");
12
+ const no_native_html_interactive_1 = require("./eslint/rules/no-native-html-interactive");
13
+ const event_name_format_1 = require("./eslint/rules/event-name-format");
14
+ // ── Validators ───────────────────────────────────────────────────────────────
15
+ const config_yml_1 = require("./validators/config-yml");
16
+ const bundle_json_1 = require("./validators/bundle-json");
17
+ const bulk_imports_1 = require("./validators/bulk-imports");
18
+ const formatting_1 = require("./validators/formatting");
19
+ const bundle_size_1 = require("./validators/bundle-size");
20
+ const duplication_1 = require("./validators/duplication");
21
+ const folder_structure_1 = require("./validators/folder-structure");
22
+ const scss_rules_1 = require("./validators/scss-rules");
23
+ exports.ALL_RULES = [
24
+ // React / ESLint
25
+ require_memo_1.doc,
26
+ no_inline_styles_1.doc,
27
+ url_params_form_state_1.doc,
28
+ no_bad_hook_deps_1.doc,
29
+ no_hardcoded_jsx_text_1.doc,
30
+ no_native_html_interactive_1.doc,
31
+ // Standards / ESLint
32
+ service_config_shape_1.doc,
33
+ no_fa_prefix_1.doc,
34
+ event_name_format_1.doc,
35
+ bundle_size_1.doc,
36
+ duplication_1.doc,
37
+ formatting_1.doc,
38
+ // Configuration validators
39
+ ...config_yml_1.docs,
40
+ ...bundle_json_1.docs,
41
+ bulk_imports_1.doc,
42
+ // Pattern validators
43
+ folder_structure_1.doc,
44
+ ...scss_rules_1.docs,
45
+ ];
46
+ //# sourceMappingURL=rule-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-registry.js","sourceRoot":"","sources":["../src/rule-registry.ts"],"names":[],"mappings":";;;AAEA,gFAAgF;AAChF,8DAA2E;AAC3E,sEAA+E;AAC/E,gFAAoF;AACpF,8EAAmF;AACnF,8DAA2E;AAC3E,sEAA+E;AAC/E,gFAAoF;AACpF,0FAA2F;AAC3F,wEAAgF;AAEhF,gFAAgF;AAChF,wDAAuE;AACvE,0DAAwE;AACxE,4DAAyE;AACzE,wDAAuE;AACvE,0DAAwE;AACxE,0DAAwE;AACxE,oEAA6E;AAC7E,wDAAuE;AAE1D,QAAA,SAAS,GAAc;IAClC,iBAAiB;IACjB,kBAAW;IACX,sBAAc;IACd,2BAAkB;IAClB,sBAAa;IACb,2BAAkB;IAClB,gCAAuB;IACvB,qBAAqB;IACrB,0BAAkB;IAClB,kBAAU;IACV,uBAAe;IACf,iBAAU;IACV,iBAAW;IACX,gBAAU;IACV,2BAA2B;IAC3B,GAAG,iBAAa;IAChB,GAAG,kBAAc;IACjB,kBAAW;IACX,qBAAqB;IACrB,sBAAe;IACf,GAAG,iBAAa;CACjB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { RuleDoc } from './types';
2
+ export declare function loadAllRules(): import("./types").RuleDoc[];
3
+ export declare function findRule(id: string): import("./types").RuleDoc | undefined;
4
+ export declare function getRulesAsContext(): string;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadAllRules = loadAllRules;
4
+ exports.findRule = findRule;
5
+ exports.getRulesAsContext = getRulesAsContext;
6
+ const rule_registry_1 = require("./rule-registry");
7
+ function loadAllRules() {
8
+ return rule_registry_1.ALL_RULES;
9
+ }
10
+ function findRule(id) {
11
+ return rule_registry_1.ALL_RULES.find((r) => r.id === id);
12
+ }
13
+ function getRulesAsContext() {
14
+ return rule_registry_1.ALL_RULES.map((r) => `- [${r.severity}] ${r.id}: ${r.description}`).join('\n');
15
+ }
16
+ //# sourceMappingURL=rules-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules-reader.js","sourceRoot":"","sources":["../src/rules-reader.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAED,4BAEC;AAED,8CAEC;AAdD,mDAA4C;AAI5C,SAAgB,YAAY;IAC1B,OAAO,yBAAS,CAAC;AACnB,CAAC;AAED,SAAgB,QAAQ,CAAC,EAAU;IACjC,OAAO,yBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,iBAAiB;IAC/B,OAAO,yBAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { LintConfig, GroupResult, RunOptions } from './types';
2
+ export declare function runAllValidators(config: LintConfig, options: RunOptions, cwd: string): Promise<{
3
+ results: GroupResult[];
4
+ errors: number;
5
+ warnings: number;
6
+ reportPath?: string;
7
+ }>;
package/dist/runner.js ADDED
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runAllValidators = runAllValidators;
4
+ const config_yml_1 = require("./validators/config-yml");
5
+ const bundle_json_1 = require("./validators/bundle-json");
6
+ const bulk_imports_1 = require("./validators/bulk-imports");
7
+ const config_1 = require("./eslint/config");
8
+ const formatting_1 = require("./validators/formatting");
9
+ const folder_structure_1 = require("./validators/folder-structure");
10
+ const scss_rules_1 = require("./validators/scss-rules");
11
+ const bundle_size_1 = require("./validators/bundle-size");
12
+ const duplication_1 = require("./validators/duplication");
13
+ const ai_1 = require("./validators/ai");
14
+ const rules_reader_1 = require("./rules-reader");
15
+ const reporter_1 = require("./reporter");
16
+ async function runAllValidators(config, options, cwd) {
17
+ const results = [];
18
+ // In --report mode the table covers everything; suppress per-group terminal output
19
+ const print = options.report ? () => { } : reporter_1.printGroupResult;
20
+ (0, reporter_1.printInfo)('Running checks...');
21
+ console.log('');
22
+ const configYmlResult = await (0, config_yml_1.validateConfigYml)(config, cwd);
23
+ results.push(configYmlResult);
24
+ print(configYmlResult);
25
+ const bundleJsonResult = await (0, bundle_json_1.validateBundleJson)(config, cwd);
26
+ results.push(bundleJsonResult);
27
+ print(bundleJsonResult);
28
+ const bulkResult = await (0, bulk_imports_1.validateBulkImports)(config, cwd);
29
+ results.push(bulkResult);
30
+ print(bulkResult);
31
+ const folderResult = await (0, folder_structure_1.validateFolderStructure)(config, cwd);
32
+ results.push(folderResult);
33
+ print(folderResult);
34
+ const eslintResult = await (0, config_1.runEslint)(config, cwd, options.fix);
35
+ results.push(eslintResult);
36
+ print(eslintResult);
37
+ const formattingResult = await (0, formatting_1.validateFormatting)(config, cwd, options.fix);
38
+ results.push(formattingResult);
39
+ print(formattingResult);
40
+ const scssResult = await (0, scss_rules_1.validateScssRules)(config, cwd);
41
+ results.push(scssResult);
42
+ print(scssResult);
43
+ const sizeResult = await (0, bundle_size_1.validateBundleSize)(config, cwd);
44
+ results.push(sizeResult);
45
+ print(sizeResult);
46
+ const dupResult = await (0, duplication_1.validateDuplication)(config, cwd);
47
+ results.push(dupResult);
48
+ print(dupResult);
49
+ if (options.ai || config.ai.enabled) {
50
+ const rulesContext = (0, rules_reader_1.getRulesAsContext)();
51
+ const aiResult = await (0, ai_1.validateWithAI)(config, cwd, rulesContext);
52
+ results.push(aiResult);
53
+ print(aiResult);
54
+ }
55
+ const { errors, warnings } = (0, reporter_1.printSummary)(results);
56
+ let reportPath;
57
+ if (options.report) {
58
+ reportPath = (0, reporter_1.writeReport)(results, cwd, options.report);
59
+ }
60
+ return { results, errors, warnings, reportPath };
61
+ }
62
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { LintConfig } from './types';
2
+ export declare function runSetup(): Promise<LintConfig>;
package/dist/setup.js ADDED
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runSetup = runSetup;
7
+ const readline_1 = __importDefault(require("readline"));
8
+ const fs_1 = __importDefault(require("fs"));
9
+ const path_1 = __importDefault(require("path"));
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const types_1 = require("./types");
12
+ function ask(rl, question) {
13
+ return new Promise((resolve) => {
14
+ rl.question(chalk_1.default.cyan(` ? `) + question + ' ', (answer) => {
15
+ resolve(answer.trim());
16
+ });
17
+ });
18
+ }
19
+ function askYesNo(rl, question, defaultYes) {
20
+ const hint = defaultYes ? '(Y/n)' : '(y/N)';
21
+ return ask(rl, `${question} ${chalk_1.default.gray(hint)}`).then((ans) => {
22
+ if (ans === '')
23
+ return defaultYes;
24
+ return ans.toLowerCase().startsWith('y');
25
+ });
26
+ }
27
+ async function runSetup() {
28
+ const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout });
29
+ console.log(chalk_1.default.gray(' No .uxplintrc.json found. Let\'s set up lint for this v5 app.'));
30
+ console.log('');
31
+ const config = { ...types_1.DEFAULT_CONFIG };
32
+ // Question 1
33
+ const isV5 = await askYesNo(rl, 'Is this a v5 app?', true);
34
+ config.v5 = isV5;
35
+ if (!isV5) {
36
+ console.log(chalk_1.default.yellow(' uxp-lint is designed for v5 apps. Some checks may not apply.'));
37
+ console.log('');
38
+ }
39
+ // Question 2
40
+ const viewsSrc = await ask(rl, `Path to Resources/views src/ folder ${chalk_1.default.gray('[./Resources/views/src]')}`);
41
+ if (viewsSrc)
42
+ config.viewsSrc = viewsSrc;
43
+ // Question 3
44
+ const configYml = await ask(rl, `Path to Configuration.yml ${chalk_1.default.gray('[./Configuration.yml]')}`);
45
+ if (configYml)
46
+ config.configYml = configYml;
47
+ // Question 4
48
+ const bulkImportsDir = await ask(rl, `Path to BulkImports/ folder (leave blank to skip) ${chalk_1.default.gray('[./BulkImports]')}`);
49
+ if (bulkImportsDir)
50
+ config.bulkImportsDir = bulkImportsDir;
51
+ // Question 5
52
+ const enableAi = await askYesNo(rl, 'Enable AI analysis? (requires Claude API key)', false);
53
+ config.ai.enabled = enableAi;
54
+ if (enableAi) {
55
+ const apiKey = await ask(rl, `Claude API key ${chalk_1.default.gray('[or set UXP_CLAUDE_API_KEY env var]')}`);
56
+ if (apiKey)
57
+ config.ai.apiKey = apiKey;
58
+ }
59
+ // Offer Prettier template if no config exists
60
+ const prettierFiles = [
61
+ 'prettier.config.js', 'prettier.config.cjs', '.prettierrc', '.prettierrc.json',
62
+ '.prettierrc.js', '.prettierrc.yml', '.prettierrc.yaml',
63
+ ];
64
+ const hasPrettier = prettierFiles.some((f) => fs_1.default.existsSync(path_1.default.join(process.cwd(), f)));
65
+ if (!hasPrettier) {
66
+ const copyPrettier = await askYesNo(rl, 'No Prettier config found. Copy the recommended template?', true);
67
+ if (copyPrettier) {
68
+ const templateSrc = path_1.default.join(__dirname, '..', 'templates', 'prettier.config.js');
69
+ const templateDest = path_1.default.join(process.cwd(), 'prettier.config.js');
70
+ if (fs_1.default.existsSync(templateSrc)) {
71
+ fs_1.default.copyFileSync(templateSrc, templateDest);
72
+ console.log(chalk_1.default.green(' ✓ prettier.config.js created — edit it to match your preferences.'));
73
+ }
74
+ }
75
+ }
76
+ rl.close();
77
+ console.log('');
78
+ return config;
79
+ }
80
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}