@matrixai/lint 0.4.4 → 0.4.6

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 (57) hide show
  1. package/README.md +34 -4
  2. package/dist/LintDomainPluginBase.d.ts +9 -0
  3. package/dist/LintDomainPluginBase.js +12 -0
  4. package/dist/LintDomainPluginBase.js.map +1 -0
  5. package/dist/bin/matrixai-lint.js +7 -2
  6. package/dist/bin/matrixai-lint.js.map +1 -1
  7. package/dist/configs/eslint.d.ts +0 -5
  8. package/dist/configs/eslint.js +6 -2
  9. package/dist/configs/eslint.js.map +1 -1
  10. package/dist/domainEngine.d.ts +32 -0
  11. package/dist/{domains/engine.js → domainEngine.js} +1 -1
  12. package/dist/{domains/engine.js.map → domainEngine.js.map} +1 -1
  13. package/dist/{domains/index.d.ts → domains.d.ts} +4 -3
  14. package/dist/{domains/index.js → domains.js} +28 -15
  15. package/dist/domains.js.map +1 -0
  16. package/dist/eslint/ESLintDomainPlugin.d.ts +9 -0
  17. package/dist/eslint/ESLintDomainPlugin.js +86 -0
  18. package/dist/eslint/ESLintDomainPlugin.js.map +1 -0
  19. package/dist/eslint/rules/no-aliased-imports.js.map +1 -0
  20. package/dist/eslint/utils.d.ts +15 -0
  21. package/dist/eslint/utils.js +271 -0
  22. package/dist/eslint/utils.js.map +1 -0
  23. package/dist/markdown/MarkdownDomainPlugin.d.ts +11 -0
  24. package/dist/markdown/MarkdownDomainPlugin.js +116 -0
  25. package/dist/markdown/MarkdownDomainPlugin.js.map +1 -0
  26. package/dist/nix/NixDomainPlugin.d.ts +11 -0
  27. package/dist/nix/NixDomainPlugin.js +73 -0
  28. package/dist/nix/NixDomainPlugin.js.map +1 -0
  29. package/dist/shell/ShellDomainPlugin.d.ts +11 -0
  30. package/dist/shell/ShellDomainPlugin.js +65 -0
  31. package/dist/shell/ShellDomainPlugin.js.map +1 -0
  32. package/dist/tsbuildinfo +1 -1
  33. package/dist/types.d.ts +46 -2
  34. package/dist/utils.d.ts +5 -49
  35. package/dist/utils.js +150 -276
  36. package/dist/utils.js.map +1 -1
  37. package/package.json +3 -3
  38. package/dist/domains/engine.d.ts +0 -72
  39. package/dist/domains/eslint.d.ts +0 -3
  40. package/dist/domains/eslint.js +0 -92
  41. package/dist/domains/eslint.js.map +0 -1
  42. package/dist/domains/files.d.ts +0 -5
  43. package/dist/domains/files.js +0 -185
  44. package/dist/domains/files.js.map +0 -1
  45. package/dist/domains/index.js.map +0 -1
  46. package/dist/domains/markdown.d.ts +0 -5
  47. package/dist/domains/markdown.js +0 -117
  48. package/dist/domains/markdown.js.map +0 -1
  49. package/dist/domains/shell.d.ts +0 -5
  50. package/dist/domains/shell.js +0 -67
  51. package/dist/domains/shell.js.map +0 -1
  52. package/dist/plugins/eslint-plugin-matrixai.d.ts +0 -18
  53. package/dist/plugins/eslint-plugin-matrixai.js +0 -13
  54. package/dist/plugins/eslint-plugin-matrixai.js.map +0 -1
  55. package/dist/rules/no-aliased-imports.js.map +0 -1
  56. /package/dist/{rules → eslint/rules}/no-aliased-imports.d.ts +0 -0
  57. /package/dist/{rules → eslint/rules}/no-aliased-imports.js +0 -0
@@ -0,0 +1,271 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ import fs from 'node:fs';
4
+ import url from 'node:url';
5
+ import ts from 'typescript';
6
+ import { ESLint } from 'eslint';
7
+ import { resolveLintConfig } from '../config.js';
8
+ const ESLINT_TARGET_EXTENSIONS = [
9
+ 'js',
10
+ 'mjs',
11
+ 'cjs',
12
+ 'jsx',
13
+ 'ts',
14
+ 'tsx',
15
+ 'mts',
16
+ 'cts',
17
+ 'json',
18
+ ];
19
+ const ESLINT_TARGET_EXTENSION_GLOB = `.{${ESLINT_TARGET_EXTENSIONS.join(',')}}`;
20
+ const DEFAULT_IGNORE_PATTERNS = [
21
+ 'node_modules/**',
22
+ 'bower_components/**',
23
+ 'jspm_packages/**',
24
+ ];
25
+ const GLOB_META_PATTERN = /[*?[\]{}()!+@]/;
26
+ async function runESLint({ fix, configPath, explicitGlobs, resolvedConfig, logger, }) {
27
+ const dirname = path.dirname(url.fileURLToPath(import.meta.url));
28
+ const defaultConfigPath = path.resolve(dirname, '../configs/eslint.js');
29
+ const resolvedConfigPath = configPath || defaultConfigPath;
30
+ const lintConfig = resolvedConfig ?? resolveLintConfig();
31
+ const parserProjectOverride = {
32
+ languageOptions: {
33
+ parserOptions: {
34
+ project: lintConfig.domains.eslint.tsconfigPaths,
35
+ },
36
+ },
37
+ };
38
+ if (explicitGlobs?.length) {
39
+ logger.info('Linting with explicit patterns:');
40
+ explicitGlobs.forEach((pattern) => {
41
+ logger.info(`Linting: ${pattern}`);
42
+ });
43
+ const eslint = new ESLint({
44
+ overrideConfigFile: resolvedConfigPath,
45
+ fix,
46
+ errorOnUnmatchedPattern: false,
47
+ warnIgnored: false,
48
+ ignorePatterns: [],
49
+ cache: true,
50
+ cacheLocation: '.cache/matrixai-lint/eslint/.eslintcache',
51
+ cacheStrategy: 'content',
52
+ overrideConfig: parserProjectOverride,
53
+ });
54
+ return await lintAndReport(eslint, explicitGlobs, fix, logger);
55
+ }
56
+ const { forceInclude, tsconfigPaths } = lintConfig.domains.eslint;
57
+ if (tsconfigPaths.length === 0) {
58
+ logger.error('[matrixai-lint] ⚠ No tsconfig.json files found.');
59
+ return true;
60
+ }
61
+ logger.info(`Found ${tsconfigPaths.length} tsconfig.json files:`);
62
+ tsconfigPaths.forEach((tsconfigPath) => {
63
+ logger.info(`Using tsconfig: ${tsconfigPath}`);
64
+ });
65
+ const { files: patterns, ignore: ignorePats } = buildPatterns(tsconfigPaths, forceInclude, process.cwd(), lintConfig.root);
66
+ if (patterns.length === 0) {
67
+ logger.warn('[matrixai-lint] ⚠ No ESLint targets were derived from configured tsconfig paths.');
68
+ return false;
69
+ }
70
+ logger.info('Linting files:');
71
+ patterns.forEach((pattern) => {
72
+ logger.info(`Linting: ${pattern}`);
73
+ });
74
+ const eslint = new ESLint({
75
+ overrideConfigFile: resolvedConfigPath,
76
+ fix,
77
+ errorOnUnmatchedPattern: false,
78
+ warnIgnored: false,
79
+ ignorePatterns: ignorePats,
80
+ cache: true,
81
+ cacheLocation: '.cache/matrixai-lint/eslint/.eslintcache',
82
+ cacheStrategy: 'content',
83
+ overrideConfig: parserProjectOverride,
84
+ });
85
+ return await lintAndReport(eslint, patterns, fix, logger);
86
+ }
87
+ async function lintAndReport(eslint, patterns, fix, logger) {
88
+ const results = await eslint.lintFiles(patterns);
89
+ if (fix) {
90
+ await ESLint.outputFixes(results);
91
+ }
92
+ const errorCount = results.reduce((sum, result) => sum + result.errorCount, 0);
93
+ const warningCount = results.reduce((sum, result) => sum + result.warningCount, 0);
94
+ logger.info(`ESLint summary: files=${results.length} errors=${errorCount} warnings=${warningCount} fix=${fix ? 'on' : 'off'}`);
95
+ const formatter = await eslint.loadFormatter('stylish');
96
+ const formattedOutput = await formatter.format(results);
97
+ for (const line of formattedOutput.split(/\r?\n/)) {
98
+ const normalizedLine = line.trim();
99
+ if (normalizedLine.length > 0) {
100
+ logger.info(`ESLint detail: ${normalizedLine}`);
101
+ }
102
+ }
103
+ const hasErrors = errorCount > 0;
104
+ return hasErrors;
105
+ }
106
+ function findUserESLintConfig(repoRoot = process.cwd()) {
107
+ const candidates = [
108
+ 'eslint.config.js',
109
+ 'eslint.config.mjs',
110
+ 'eslint.config.cjs',
111
+ 'eslint.config.ts',
112
+ ];
113
+ for (const file of candidates) {
114
+ const abs = path.join(repoRoot, file);
115
+ if (fs.existsSync(abs))
116
+ return abs;
117
+ }
118
+ return undefined;
119
+ }
120
+ function toStringArray(value) {
121
+ if (typeof value === 'string') {
122
+ return [value];
123
+ }
124
+ if (Array.isArray(value)) {
125
+ return value.filter((item) => typeof item === 'string');
126
+ }
127
+ return [];
128
+ }
129
+ function dedupeAndSort(values) {
130
+ return [...new Set(values)].sort();
131
+ }
132
+ function normalizeGlobValue(value) {
133
+ return value.trim().replace(/\\/g, '/').replace(/^\.\//, '');
134
+ }
135
+ function rebasePatternToCwd({ pattern, baseDir, cwd, }) {
136
+ const normalizedPattern = normalizeGlobValue(pattern);
137
+ if (normalizedPattern.length === 0) {
138
+ return '';
139
+ }
140
+ const platformPattern = normalizedPattern.split('/').join(path.sep);
141
+ const absolutePattern = path.isAbsolute(platformPattern)
142
+ ? platformPattern
143
+ : path.resolve(baseDir, platformPattern);
144
+ const relativePattern = path
145
+ .relative(cwd, absolutePattern)
146
+ .split(path.sep)
147
+ .join('/');
148
+ if (relativePattern.length === 0) {
149
+ return '.';
150
+ }
151
+ return normalizeGlobValue(relativePattern);
152
+ }
153
+ function hasExtensionOrGlobExtensionPattern(value) {
154
+ return /(^|\/)[^/]*\.[^/]*$/.test(value);
155
+ }
156
+ function expandExtensionlessPattern(value) {
157
+ const normalized = normalizeGlobValue(value).replace(/\/+$/, '');
158
+ if (normalized.length === 0) {
159
+ return '';
160
+ }
161
+ if (hasExtensionOrGlobExtensionPattern(normalized)) {
162
+ return normalized;
163
+ }
164
+ if (!GLOB_META_PATTERN.test(normalized)) {
165
+ return `${normalized}/**/*${ESLINT_TARGET_EXTENSION_GLOB}`;
166
+ }
167
+ if (normalized === '**') {
168
+ return `**/*${ESLINT_TARGET_EXTENSION_GLOB}`;
169
+ }
170
+ if (normalized.endsWith('/**')) {
171
+ return `${normalized}/*${ESLINT_TARGET_EXTENSION_GLOB}`;
172
+ }
173
+ return `${normalized}${ESLINT_TARGET_EXTENSION_GLOB}`;
174
+ }
175
+ function normalizeIncludePatterns(values) {
176
+ return dedupeAndSort(values
177
+ .map((value) => expandExtensionlessPattern(value))
178
+ .filter((value) => value.length > 0));
179
+ }
180
+ function normalizeExcludePatterns(values) {
181
+ return dedupeAndSort(values
182
+ .map((value) => normalizeGlobValue(value).replace(/\/+$/, ''))
183
+ .filter((value) => value.length > 0));
184
+ }
185
+ function patternPrefix(value) {
186
+ const normalized = normalizeGlobValue(value);
187
+ const segments = normalized
188
+ .split('/')
189
+ .filter((segment) => segment.length > 0);
190
+ const prefixSegments = [];
191
+ for (const segment of segments) {
192
+ if (GLOB_META_PATTERN.test(segment)) {
193
+ break;
194
+ }
195
+ prefixSegments.push(segment);
196
+ }
197
+ return prefixSegments.join('/');
198
+ }
199
+ function patternsOverlapByPrefix(left, right) {
200
+ if (left === right) {
201
+ return true;
202
+ }
203
+ const leftPrefix = patternPrefix(left);
204
+ const rightPrefix = patternPrefix(right);
205
+ if (leftPrefix.length === 0 || rightPrefix.length === 0) {
206
+ return false;
207
+ }
208
+ return (leftPrefix === rightPrefix ||
209
+ leftPrefix.startsWith(`${rightPrefix}/`) ||
210
+ rightPrefix.startsWith(`${leftPrefix}/`));
211
+ }
212
+ function buildPatterns(tsconfigPaths, forceInclude = [], cwd = process.cwd(), forceIncludeBaseDir = cwd) {
213
+ const normalizedForceInclude = normalizeIncludePatterns(forceInclude.map((value) => rebasePatternToCwd({ pattern: value, baseDir: forceIncludeBaseDir, cwd })));
214
+ const forceIncludeRaw = dedupeAndSort(forceInclude
215
+ .map((value) => rebasePatternToCwd({
216
+ pattern: value,
217
+ baseDir: forceIncludeBaseDir,
218
+ cwd,
219
+ }))
220
+ .map((value) => normalizeGlobValue(value).replace(/\/+$/, ''))
221
+ .filter((value) => value.length > 0));
222
+ const includePatternsByTsconfig = [];
223
+ const excludePatternsByTsconfig = [];
224
+ for (const tsconfigPath of tsconfigPaths) {
225
+ if (!fs.existsSync(tsconfigPath)) {
226
+ continue;
227
+ }
228
+ const tsconfigDir = path.dirname(tsconfigPath);
229
+ const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
230
+ if (readResult.error != null || readResult.config == null) {
231
+ continue;
232
+ }
233
+ const config = readResult.config;
234
+ const rawInclude = toStringArray(config.include).map((pattern) => rebasePatternToCwd({ pattern, baseDir: tsconfigDir, cwd }));
235
+ const defaultInclude = rebasePatternToCwd({
236
+ pattern: '**/*',
237
+ baseDir: tsconfigDir,
238
+ cwd,
239
+ });
240
+ const normalizedInclude = normalizeIncludePatterns(rawInclude.length > 0 ? rawInclude : [defaultInclude]);
241
+ const normalizedExclude = normalizeExcludePatterns(toStringArray(config.exclude).map((pattern) => rebasePatternToCwd({ pattern, baseDir: tsconfigDir, cwd })));
242
+ includePatternsByTsconfig.push(normalizedInclude);
243
+ excludePatternsByTsconfig.push(normalizedExclude);
244
+ }
245
+ const include = dedupeAndSort([
246
+ ...includePatternsByTsconfig.flat(),
247
+ ...normalizedForceInclude,
248
+ ]);
249
+ const ignoreCandidates = [];
250
+ excludePatternsByTsconfig.forEach((excludePatterns, index) => {
251
+ if (excludePatterns.length === 0) {
252
+ ignoreCandidates.push(...DEFAULT_IGNORE_PATTERNS);
253
+ return;
254
+ }
255
+ for (const excludePattern of excludePatterns) {
256
+ const overlappedByOtherTsconfigInclude = includePatternsByTsconfig.some((includePatterns, includeIndex) => includeIndex !== index &&
257
+ includePatterns.some((includePattern) => patternsOverlapByPrefix(includePattern, excludePattern)));
258
+ if (!overlappedByOtherTsconfigInclude) {
259
+ ignoreCandidates.push(excludePattern);
260
+ }
261
+ }
262
+ });
263
+ const ignore = dedupeAndSort(ignoreCandidates).filter((ignorePattern) => {
264
+ const overlappedByNormalized = normalizedForceInclude.some((forceIncludePattern) => patternsOverlapByPrefix(ignorePattern, forceIncludePattern));
265
+ const overlappedByRaw = forceIncludeRaw.some((forceIncludePattern) => patternsOverlapByPrefix(ignorePattern, forceIncludePattern));
266
+ return !overlappedByNormalized && !overlappedByRaw;
267
+ });
268
+ return { files: include, ignore };
269
+ }
270
+ export { buildPatterns, findUserESLintConfig, runESLint };
271
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/eslint/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LintDomainDetection, LintDomainEngineContext, LintDomainPluginResult } from '../types.js';
2
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
3
+ declare class MarkdownDomainPlugin extends LintDomainPluginBase {
4
+ private readonly prettierConfigPath;
5
+ readonly domain = "markdown";
6
+ readonly description = "Format and check Markdown/MDX files with Prettier.";
7
+ constructor(prettierConfigPath: string);
8
+ detect({ markdownPatterns, }: LintDomainEngineContext): LintDomainDetection;
9
+ run({ fix, logger }: LintDomainEngineContext, detection: LintDomainDetection): LintDomainPluginResult;
10
+ }
11
+ export default MarkdownDomainPlugin;
@@ -0,0 +1,116 @@
1
+ import os from 'node:os';
2
+ import process from 'node:process';
3
+ import childProcess from 'node:child_process';
4
+ import fs from 'node:fs';
5
+ import { createRequire } from 'node:module';
6
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
7
+ import { resolveFilesFromPatterns } from '../utils.js';
8
+ const platform = os.platform();
9
+ const MARKDOWN_FILE_EXTENSIONS = ['.md', '.mdx'];
10
+ const DEFAULT_MARKDOWN_ROOT_FILES = ['README.md', 'AGENTS.md'];
11
+ const DEFAULT_MARKDOWN_SEARCH_ROOTS = [
12
+ './README.md',
13
+ './AGENTS.md',
14
+ './pages',
15
+ './blog',
16
+ './docs',
17
+ ];
18
+ function collectMarkdownFilesFromScope(patterns) {
19
+ const matchedRelativeFiles = resolveFilesFromPatterns(patterns, MARKDOWN_FILE_EXTENSIONS);
20
+ for (const rootFile of [...DEFAULT_MARKDOWN_ROOT_FILES].reverse()) {
21
+ if (!matchedRelativeFiles.includes(rootFile) && fs.existsSync(rootFile)) {
22
+ matchedRelativeFiles.unshift(rootFile);
23
+ }
24
+ }
25
+ return matchedRelativeFiles;
26
+ }
27
+ function resolveMarkdownPatterns(markdownPatterns) {
28
+ return markdownPatterns != null && markdownPatterns.length > 0
29
+ ? [...markdownPatterns]
30
+ : [...DEFAULT_MARKDOWN_SEARCH_ROOTS];
31
+ }
32
+ class MarkdownDomainPlugin extends LintDomainPluginBase {
33
+ prettierConfigPath;
34
+ domain = 'markdown';
35
+ description = 'Format and check Markdown/MDX files with Prettier.';
36
+ constructor(prettierConfigPath) {
37
+ super();
38
+ this.prettierConfigPath = prettierConfigPath;
39
+ }
40
+ detect({ markdownPatterns, }) {
41
+ const patterns = resolveMarkdownPatterns(markdownPatterns);
42
+ const matchedFiles = collectMarkdownFilesFromScope(patterns);
43
+ return {
44
+ relevant: matchedFiles.length > 0,
45
+ relevanceReason: matchedFiles.length > 0
46
+ ? undefined
47
+ : 'No Markdown/MDX files matched in effective scope.',
48
+ available: true,
49
+ availabilityKind: 'required',
50
+ matchedFiles,
51
+ };
52
+ }
53
+ run({ fix, logger }, detection) {
54
+ const markdownFiles = detection.matchedFiles ?? [];
55
+ if (markdownFiles.length === 0) {
56
+ return { hadFailure: false };
57
+ }
58
+ const prettierArgs = [
59
+ '--config',
60
+ this.prettierConfigPath,
61
+ '--config-precedence',
62
+ 'cli-override',
63
+ '--no-editorconfig',
64
+ fix ? '--write' : '--check',
65
+ ...markdownFiles,
66
+ ];
67
+ logger.info('Running prettier:');
68
+ const require = createRequire(import.meta.url);
69
+ let prettierBin = null;
70
+ try {
71
+ // Resolves to @matrixai/lint/node_modules/prettier/bin/prettier.cjs
72
+ prettierBin = require.resolve('prettier/bin/prettier.cjs');
73
+ }
74
+ catch {
75
+ // Bundled copy not found
76
+ }
77
+ try {
78
+ if (prettierBin) {
79
+ logger.info(`Running prettier command: ${process.execPath} ${prettierBin} ${prettierArgs.join(' ')}`);
80
+ childProcess.execFileSync(process.execPath, [prettierBin, ...prettierArgs], {
81
+ stdio: 'inherit',
82
+ windowsHide: true,
83
+ encoding: 'utf-8',
84
+ cwd: process.cwd(),
85
+ });
86
+ }
87
+ else {
88
+ logger.info(`Running prettier command: prettier ${prettierArgs.join(' ')}`);
89
+ childProcess.execFileSync('prettier', prettierArgs, {
90
+ stdio: 'inherit',
91
+ windowsHide: true,
92
+ encoding: 'utf-8',
93
+ shell: platform === 'win32',
94
+ cwd: process.cwd(),
95
+ });
96
+ }
97
+ }
98
+ catch (err) {
99
+ const errorDetail = this.normalizeLogDetail(err);
100
+ if (!fix) {
101
+ logger.error(errorDetail.length > 0
102
+ ? `Prettier check failed. ${errorDetail}`
103
+ : 'Prettier check failed.');
104
+ }
105
+ else {
106
+ logger.error(errorDetail.length > 0
107
+ ? `Prettier write failed. ${errorDetail}`
108
+ : 'Prettier write failed.');
109
+ }
110
+ return { hadFailure: true };
111
+ }
112
+ return { hadFailure: false };
113
+ }
114
+ }
115
+ export default MarkdownDomainPlugin;
116
+ //# sourceMappingURL=MarkdownDomainPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MarkdownDomainPlugin.js","sourceRoot":"","sources":["../../src/markdown/MarkdownDomainPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LintDomainDetection, LintDomainEngineContext, LintDomainPluginResult } from '../types.js';
2
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
3
+ declare class NixDomainPlugin extends LintDomainPluginBase {
4
+ private readonly defaultSearchPatterns;
5
+ readonly domain = "nix";
6
+ readonly description = "Format and check Nix files with nixfmt when available.";
7
+ constructor(defaultSearchPatterns: readonly string[]);
8
+ detect({ nixPatterns }: LintDomainEngineContext): LintDomainDetection;
9
+ run({ fix, logger }: LintDomainEngineContext, detection: LintDomainDetection): LintDomainPluginResult;
10
+ }
11
+ export default NixDomainPlugin;
@@ -0,0 +1,73 @@
1
+ import os from 'node:os';
2
+ import process from 'node:process';
3
+ import childProcess from 'node:child_process';
4
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
5
+ import { commandExists, resolveFilesFromPatterns } from '../utils.js';
6
+ const platform = os.platform();
7
+ const NIX_FILE_EXTENSIONS = ['.nix'];
8
+ function resolveNixPatterns(nixPatterns, defaultSearchPatterns) {
9
+ return nixPatterns != null && nixPatterns.length > 0
10
+ ? [...nixPatterns]
11
+ : [...defaultSearchPatterns];
12
+ }
13
+ class NixDomainPlugin extends LintDomainPluginBase {
14
+ defaultSearchPatterns;
15
+ domain = 'nix';
16
+ description = 'Format and check Nix files with nixfmt when available.';
17
+ constructor(defaultSearchPatterns) {
18
+ super();
19
+ this.defaultSearchPatterns = defaultSearchPatterns;
20
+ }
21
+ detect({ nixPatterns }) {
22
+ const patterns = resolveNixPatterns(nixPatterns, this.defaultSearchPatterns);
23
+ const matchedFiles = resolveFilesFromPatterns(patterns, NIX_FILE_EXTENSIONS);
24
+ const hasNixfmt = commandExists('nixfmt');
25
+ return {
26
+ relevant: matchedFiles.length > 0,
27
+ relevanceReason: matchedFiles.length > 0
28
+ ? undefined
29
+ : 'No Nix files matched in effective scope.',
30
+ available: hasNixfmt,
31
+ availabilityKind: 'optional',
32
+ unavailableReason: hasNixfmt
33
+ ? undefined
34
+ : 'nixfmt not found in environment.',
35
+ matchedFiles,
36
+ };
37
+ }
38
+ run({ fix, logger }, detection) {
39
+ const matchedFiles = detection.matchedFiles ?? [];
40
+ if (matchedFiles.length === 0) {
41
+ return { hadFailure: false };
42
+ }
43
+ const nixfmtArgs = [...(fix ? [] : ['--check']), ...matchedFiles];
44
+ logger.info(fix ? 'Running nixfmt write:' : 'Running nixfmt check:');
45
+ logger.info(`Running nixfmt command: nixfmt ${nixfmtArgs.join(' ')}`);
46
+ try {
47
+ childProcess.execFileSync('nixfmt', nixfmtArgs, {
48
+ stdio: ['inherit', 'inherit', 'inherit'],
49
+ windowsHide: true,
50
+ encoding: 'utf-8',
51
+ shell: platform === 'win32',
52
+ cwd: process.cwd(),
53
+ });
54
+ return { hadFailure: false };
55
+ }
56
+ catch (err) {
57
+ const errorDetail = this.normalizeLogDetail(err);
58
+ if (!fix) {
59
+ logger.error(errorDetail.length > 0
60
+ ? `nixfmt check failed. ${errorDetail}`
61
+ : 'nixfmt check failed.');
62
+ }
63
+ else {
64
+ logger.error(errorDetail.length > 0
65
+ ? `nixfmt write failed. ${errorDetail}`
66
+ : 'nixfmt write failed.');
67
+ }
68
+ return { hadFailure: true };
69
+ }
70
+ }
71
+ }
72
+ export default NixDomainPlugin;
73
+ //# sourceMappingURL=NixDomainPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NixDomainPlugin.js","sourceRoot":"","sources":["../../src/nix/NixDomainPlugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { LintDomainDetection, LintDomainEngineContext, LintDomainPluginResult } from '../types.js';
2
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
3
+ declare class ShellDomainPlugin extends LintDomainPluginBase {
4
+ private readonly defaultSearchRoots;
5
+ readonly domain = "shell";
6
+ readonly description = "Lint shell scripts with shellcheck when available.";
7
+ constructor(defaultSearchRoots: readonly string[]);
8
+ detect({ shellPatterns, }: LintDomainEngineContext): LintDomainDetection;
9
+ run({ logger }: LintDomainEngineContext, detection: LintDomainDetection): LintDomainPluginResult;
10
+ }
11
+ export default ShellDomainPlugin;
@@ -0,0 +1,65 @@
1
+ import os from 'node:os';
2
+ import process from 'node:process';
3
+ import childProcess from 'node:child_process';
4
+ import LintDomainPluginBase from '../LintDomainPluginBase.js';
5
+ import { commandExists, resolveFilesFromPatterns } from '../utils.js';
6
+ const platform = os.platform();
7
+ const SHELL_FILE_EXTENSIONS = ['.sh'];
8
+ function resolveShellPatterns(shellPatterns, defaultSearchRoots) {
9
+ return shellPatterns != null && shellPatterns.length > 0
10
+ ? [...shellPatterns]
11
+ : [...defaultSearchRoots];
12
+ }
13
+ class ShellDomainPlugin extends LintDomainPluginBase {
14
+ defaultSearchRoots;
15
+ domain = 'shell';
16
+ description = 'Lint shell scripts with shellcheck when available.';
17
+ constructor(defaultSearchRoots) {
18
+ super();
19
+ this.defaultSearchRoots = defaultSearchRoots;
20
+ }
21
+ detect({ shellPatterns, }) {
22
+ const patterns = resolveShellPatterns(shellPatterns, this.defaultSearchRoots);
23
+ const matchedFiles = resolveFilesFromPatterns(patterns, SHELL_FILE_EXTENSIONS);
24
+ const hasShellcheck = commandExists('shellcheck');
25
+ return {
26
+ relevant: matchedFiles.length > 0,
27
+ relevanceReason: matchedFiles.length > 0
28
+ ? undefined
29
+ : 'No shell script files matched in effective scope.',
30
+ available: hasShellcheck,
31
+ availabilityKind: 'optional',
32
+ unavailableReason: hasShellcheck
33
+ ? undefined
34
+ : 'shellcheck not found in environment.',
35
+ matchedFiles,
36
+ };
37
+ }
38
+ run({ logger }, detection) {
39
+ const matchedFiles = detection.matchedFiles ?? [];
40
+ if (matchedFiles.length === 0) {
41
+ return { hadFailure: false };
42
+ }
43
+ logger.info('Running shellcheck:');
44
+ logger.info(`Running shellcheck command: shellcheck ${matchedFiles.join(' ')}`);
45
+ try {
46
+ childProcess.execFileSync('shellcheck', matchedFiles, {
47
+ stdio: ['inherit', 'inherit', 'inherit'],
48
+ windowsHide: true,
49
+ encoding: 'utf-8',
50
+ shell: platform === 'win32',
51
+ cwd: process.cwd(),
52
+ });
53
+ return { hadFailure: false };
54
+ }
55
+ catch (err) {
56
+ const errorDetail = this.normalizeLogDetail(err);
57
+ logger.error(errorDetail.length > 0
58
+ ? `Shellcheck failed. ${errorDetail}`
59
+ : 'Shellcheck failed.');
60
+ return { hadFailure: true };
61
+ }
62
+ }
63
+ }
64
+ export default ShellDomainPlugin;
65
+ //# sourceMappingURL=ShellDomainPlugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ShellDomainPlugin.js","sourceRoot":"","sources":["../../src/shell/ShellDomainPlugin.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAC9C,OAAO,oBAAoB,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC;AAE/B,MAAM,qBAAqB,GAAG,CAAC,KAAK,CAAU,CAAC;AAE/C,SAAS,oBAAoB,CAC3B,aAA4C,EAC5C,kBAAqC;IAErC,OAAO,aAAa,IAAI,IAAI,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC;QACtD,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QACpB,CAAC,CAAC,CAAC,GAAG,kBAAkB,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,iBAAkB,SAAQ,oBAAoB;IAKd;IAJpB,MAAM,GAAG,OAAO,CAAC;IACjB,WAAW,GACzB,oDAAoD,CAAC;IAEvD,YAAoC,kBAAqC;QACvE,KAAK,EAAE,CAAC;QAD0B,uBAAkB,GAAlB,kBAAkB,CAAmB;IAEzE,CAAC;IAEM,MAAM,CAAC,EACZ,aAAa,GACW;QACxB,MAAM,QAAQ,GAAG,oBAAoB,CACnC,aAAa,EACb,IAAI,CAAC,kBAAkB,CACxB,CAAC;QACF,MAAM,YAAY,GAAG,wBAAwB,CAC3C,QAAQ,EACR,qBAAqB,CACtB,CAAC;QACF,MAAM,aAAa,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;QAElD,OAAO;YACL,QAAQ,EAAE,YAAY,CAAC,MAAM,GAAG,CAAC;YACjC,eAAe,EACb,YAAY,CAAC,MAAM,GAAG,CAAC;gBACrB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,mDAAmD;YACzD,SAAS,EAAE,aAAa;YACxB,gBAAgB,EAAE,UAAmB;YACrC,iBAAiB,EAAE,aAAa;gBAC9B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,sCAAsC;YAC1C,YAAY;SACb,CAAC;IACJ,CAAC;IAEM,GAAG,CACR,EAAE,MAAM,EAA2B,EACnC,SAA8B;QAE9B,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY,IAAI,EAAE,CAAC;QAClD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;YAC7B,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;SAC9B;QAED,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CACT,0CAA0C,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CACnE,CAAC;QAEF,IAAI;YACF,YAAY,CAAC,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE;gBACpD,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;gBACxC,WAAW,EAAE,IAAI;gBACjB,QAAQ,EAAE,OAAO;gBACjB,KAAK,EAAE,QAAQ,KAAK,OAAO;gBAC3B,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;aACnB,CAAC,CAAC;YAEH,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;SAC9B;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CACV,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,sBAAsB,WAAW,EAAE;gBACrC,CAAC,CAAC,oBAAoB,CACzB,CAAC;YACF,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;SAC7B;IACH,CAAC;CACF;AAED,eAAe,iBAAiB,CAAC"}