@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.
- package/README.md +273 -0
- package/bin/uxp-lint.js +2 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +100 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +4 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/eslint/config.d.ts +2 -0
- package/dist/eslint/config.js +225 -0
- package/dist/eslint/config.js.map +1 -0
- package/dist/eslint/rules/event-name-format.d.ts +5 -0
- package/dist/eslint/rules/event-name-format.js +59 -0
- package/dist/eslint/rules/event-name-format.js.map +1 -0
- package/dist/eslint/rules/no-bad-hook-deps.d.ts +5 -0
- package/dist/eslint/rules/no-bad-hook-deps.js +57 -0
- package/dist/eslint/rules/no-bad-hook-deps.js.map +1 -0
- package/dist/eslint/rules/no-fa-prefix.d.ts +5 -0
- package/dist/eslint/rules/no-fa-prefix.js +59 -0
- package/dist/eslint/rules/no-fa-prefix.js.map +1 -0
- package/dist/eslint/rules/no-hardcoded-jsx-text.d.ts +5 -0
- package/dist/eslint/rules/no-hardcoded-jsx-text.js +55 -0
- package/dist/eslint/rules/no-hardcoded-jsx-text.js.map +1 -0
- package/dist/eslint/rules/no-inline-styles.d.ts +8 -0
- package/dist/eslint/rules/no-inline-styles.js +41 -0
- package/dist/eslint/rules/no-inline-styles.js.map +1 -0
- package/dist/eslint/rules/no-native-html-interactive.d.ts +5 -0
- package/dist/eslint/rules/no-native-html-interactive.js +81 -0
- package/dist/eslint/rules/no-native-html-interactive.js.map +1 -0
- package/dist/eslint/rules/require-memo.d.ts +9 -0
- package/dist/eslint/rules/require-memo.js +70 -0
- package/dist/eslint/rules/require-memo.js.map +1 -0
- package/dist/eslint/rules/service-config-shape.d.ts +5 -0
- package/dist/eslint/rules/service-config-shape.js +80 -0
- package/dist/eslint/rules/service-config-shape.js.map +1 -0
- package/dist/eslint/rules/url-params-form-state.d.ts +5 -0
- package/dist/eslint/rules/url-params-form-state.js +75 -0
- package/dist/eslint/rules/url-params-form-state.js.map +1 -0
- package/dist/reporter.d.ts +22 -0
- package/dist/reporter.js +260 -0
- package/dist/reporter.js.map +1 -0
- package/dist/rule-registry.d.ts +2 -0
- package/dist/rule-registry.js +46 -0
- package/dist/rule-registry.js.map +1 -0
- package/dist/rules-reader.d.ts +4 -0
- package/dist/rules-reader.js +16 -0
- package/dist/rules-reader.js.map +1 -0
- package/dist/runner.d.ts +7 -0
- package/dist/runner.js +62 -0
- package/dist/runner.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.js +80 -0
- package/dist/setup.js.map +1 -0
- package/dist/types.d.ts +55 -0
- package/dist/types.js +39 -0
- package/dist/types.js.map +1 -0
- package/dist/validators/ai.d.ts +2 -0
- package/dist/validators/ai.js +115 -0
- package/dist/validators/ai.js.map +1 -0
- package/dist/validators/bulk-imports.d.ts +3 -0
- package/dist/validators/bulk-imports.js +94 -0
- package/dist/validators/bulk-imports.js.map +1 -0
- package/dist/validators/bundle-json.d.ts +3 -0
- package/dist/validators/bundle-json.js +130 -0
- package/dist/validators/bundle-json.js.map +1 -0
- package/dist/validators/bundle-size.d.ts +3 -0
- package/dist/validators/bundle-size.js +51 -0
- package/dist/validators/bundle-size.js.map +1 -0
- package/dist/validators/config-yml.d.ts +3 -0
- package/dist/validators/config-yml.js +148 -0
- package/dist/validators/config-yml.js.map +1 -0
- package/dist/validators/duplication.d.ts +3 -0
- package/dist/validators/duplication.js +65 -0
- package/dist/validators/duplication.js.map +1 -0
- package/dist/validators/folder-structure.d.ts +3 -0
- package/dist/validators/folder-structure.js +123 -0
- package/dist/validators/folder-structure.js.map +1 -0
- package/dist/validators/formatting.d.ts +3 -0
- package/dist/validators/formatting.js +97 -0
- package/dist/validators/formatting.js.map +1 -0
- package/dist/validators/scss-rules.d.ts +3 -0
- package/dist/validators/scss-rules.js +156 -0
- package/dist/validators/scss-rules.js.map +1 -0
- package/package.json +58 -0
- 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 };
|
package/dist/reporter.js
ADDED
|
@@ -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,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,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"}
|
package/dist/runner.d.ts
ADDED
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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"}
|
package/dist/setup.d.ts
ADDED
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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"}
|