@matrixai/lint 0.2.12 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/AGENTS.md +23 -0
  2. package/README.md +151 -83
  3. package/dist/bin/lint.js +119 -136
  4. package/dist/bin/lint.js.map +1 -1
  5. package/dist/config.d.ts +15 -0
  6. package/dist/config.js +120 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/configs/{js.js → eslint.js} +5 -4
  9. package/dist/configs/eslint.js.map +1 -0
  10. package/dist/configs/{prettier.config.mjs → prettier.config.js} +1 -1
  11. package/dist/configs/prettier.config.js.map +1 -0
  12. package/dist/domains/engine.d.ts +72 -0
  13. package/dist/domains/engine.js +160 -0
  14. package/dist/domains/engine.js.map +1 -0
  15. package/dist/domains/eslint.d.ts +3 -0
  16. package/dist/domains/eslint.js +72 -0
  17. package/dist/domains/eslint.js.map +1 -0
  18. package/dist/domains/files.d.ts +4 -0
  19. package/dist/domains/files.js +95 -0
  20. package/dist/domains/files.js.map +1 -0
  21. package/dist/domains/index.d.ts +14 -0
  22. package/dist/domains/index.js +83 -0
  23. package/dist/domains/index.js.map +1 -0
  24. package/dist/domains/markdown.d.ts +5 -0
  25. package/dist/domains/markdown.js +103 -0
  26. package/dist/domains/markdown.js.map +1 -0
  27. package/dist/domains/shell.d.ts +5 -0
  28. package/dist/domains/shell.js +58 -0
  29. package/dist/domains/shell.js.map +1 -0
  30. package/dist/index.d.ts +2 -0
  31. package/dist/index.js +2 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/tsbuildinfo +1 -0
  34. package/dist/types.d.ts +31 -8
  35. package/dist/utils.d.ts +13 -18
  36. package/dist/utils.js +207 -94
  37. package/dist/utils.js.map +1 -1
  38. package/package.json +23 -13
  39. package/dist/configs/js.js.map +0 -1
  40. package/dist/configs/prettier.config.mjs.map +0 -1
  41. package/flake.lock +0 -78
  42. package/jest.config.mjs +0 -84
  43. /package/dist/configs/{js.d.ts → eslint.d.ts} +0 -0
  44. /package/dist/configs/{prettier.config.d.mts → prettier.config.d.ts} +0 -0
@@ -0,0 +1,15 @@
1
+ import type { MatrixAILintCfgSource, MatrixAILintCfgResolved, RawMatrixCfg } from './types.js';
2
+ declare const MATRIXAI_LINT_CONFIG_FILENAME = "matrixai-lint-config.json";
3
+ declare function normalizeLintConfig({ rawConfig, source, repoRoot, configFilePath, }: {
4
+ rawConfig: RawMatrixCfg;
5
+ source: MatrixAILintCfgSource;
6
+ repoRoot: string;
7
+ configFilePath: string;
8
+ }): MatrixAILintCfgResolved;
9
+ declare function parseLintConfig({ rawConfig, repoRoot, configFilePath, }: {
10
+ rawConfig: unknown;
11
+ repoRoot: string;
12
+ configFilePath: string;
13
+ }): MatrixAILintCfgResolved;
14
+ declare function resolveLintConfig(repoRoot?: string): MatrixAILintCfgResolved;
15
+ export { MATRIXAI_LINT_CONFIG_FILENAME, normalizeLintConfig, parseLintConfig, resolveLintConfig, };
package/dist/config.js ADDED
@@ -0,0 +1,120 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import process from 'node:process';
4
+ import ts from 'typescript';
5
+ const MATRIXAI_LINT_CONFIG_FILENAME = 'matrixai-lint-config.json';
6
+ function isRecord(value) {
7
+ return typeof value === 'object' && value !== null;
8
+ }
9
+ function toStringArray(value) {
10
+ if (typeof value === 'string') {
11
+ return [value];
12
+ }
13
+ if (Array.isArray(value)) {
14
+ return value.filter((item) => typeof item === 'string');
15
+ }
16
+ return [];
17
+ }
18
+ function stripLeadingDotSlash(value) {
19
+ return value.replace(/^\.\//, '');
20
+ }
21
+ function dedupeAndSort(values) {
22
+ return [...new Set(values)].sort();
23
+ }
24
+ function isReadableTsconfigPath(tsconfigPath) {
25
+ let stats;
26
+ try {
27
+ stats = fs.statSync(tsconfigPath);
28
+ }
29
+ catch {
30
+ return false;
31
+ }
32
+ if (!stats.isFile()) {
33
+ return false;
34
+ }
35
+ const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);
36
+ return readResult.error == null;
37
+ }
38
+ function sanitizeTsconfigPaths(rawValue, root) {
39
+ return dedupeAndSort(toStringArray(rawValue)
40
+ .map((tsconfigPath) => path.resolve(root, tsconfigPath))
41
+ .filter((tsconfigPath) => isReadableTsconfigPath(tsconfigPath)));
42
+ }
43
+ function sanitizeForceInclude(rawValue) {
44
+ return dedupeAndSort(toStringArray(rawValue)
45
+ .map((glob) => stripLeadingDotSlash(glob))
46
+ .filter((glob) => glob.length > 0));
47
+ }
48
+ function normalizeLintConfig({ rawConfig, source, repoRoot, configFilePath, }) {
49
+ const rawRoot = typeof rawConfig.root === 'string' && rawConfig.root.length > 0
50
+ ? rawConfig.root
51
+ : '.';
52
+ const resolvedRoot = path.resolve(repoRoot, rawRoot);
53
+ const rawDomains = isRecord(rawConfig.domains)
54
+ ? rawConfig.domains
55
+ : {};
56
+ const rawEslintDomain = isRecord(rawDomains.eslint)
57
+ ? rawDomains.eslint
58
+ : {};
59
+ let tsconfigPaths = sanitizeTsconfigPaths(rawEslintDomain.tsconfigPaths, resolvedRoot);
60
+ const forceInclude = sanitizeForceInclude(rawEslintDomain.forceInclude);
61
+ if (tsconfigPaths.length === 0) {
62
+ const rootTsconfigPath = path.join(resolvedRoot, 'tsconfig.json');
63
+ if (isReadableTsconfigPath(rootTsconfigPath)) {
64
+ tsconfigPaths.push(rootTsconfigPath);
65
+ }
66
+ }
67
+ tsconfigPaths = dedupeAndSort(tsconfigPaths);
68
+ return {
69
+ version: 2,
70
+ root: resolvedRoot,
71
+ source,
72
+ configFilePath,
73
+ domains: {
74
+ eslint: {
75
+ tsconfigPaths,
76
+ forceInclude,
77
+ },
78
+ },
79
+ };
80
+ }
81
+ function parseLintConfig({ rawConfig, repoRoot, configFilePath, }) {
82
+ if (!isRecord(rawConfig)) {
83
+ throw new Error('[matrixai-lint] ✖ matrixai-lint-config.json must contain a JSON object.');
84
+ }
85
+ if (rawConfig.version !== 2) {
86
+ throw new Error('[matrixai-lint] ✖ matrixai-lint-config.json must declare "version": 2.');
87
+ }
88
+ return normalizeLintConfig({
89
+ rawConfig: rawConfig,
90
+ source: 'config',
91
+ repoRoot,
92
+ configFilePath,
93
+ });
94
+ }
95
+ function resolveLintConfig(repoRoot = process.cwd()) {
96
+ const configFilePath = path.join(repoRoot, MATRIXAI_LINT_CONFIG_FILENAME);
97
+ if (!fs.existsSync(configFilePath)) {
98
+ return normalizeLintConfig({
99
+ rawConfig: { version: 2 },
100
+ source: 'default',
101
+ repoRoot,
102
+ configFilePath,
103
+ });
104
+ }
105
+ let rawConfig = {};
106
+ try {
107
+ const text = fs.readFileSync(configFilePath, 'utf8').trim();
108
+ rawConfig = text.length > 0 ? JSON.parse(text) : {};
109
+ }
110
+ catch (error) {
111
+ throw new Error(`[matrixai-lint] ✖ matrixai-lint-config.json has been provided but it is not valid JSON.\n ${String(error)}`);
112
+ }
113
+ return parseLintConfig({
114
+ rawConfig,
115
+ repoRoot,
116
+ configFilePath,
117
+ });
118
+ }
119
+ export { MATRIXAI_LINT_CONFIG_FILENAME, normalizeLintConfig, parseLintConfig, resolveLintConfig, };
120
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,10 @@ import js from '@eslint/js';
6
6
  import tsParser from '@typescript-eslint/parser';
7
7
  import { FlatCompat } from '@eslint/eslintrc';
8
8
  import { fixupPluginRules } from '@eslint/compat';
9
- import prettierOptions from './prettier.config.mjs';
9
+ import prettierOptions from './prettier.config.js';
10
10
  import matrixaiPlugin from '../plugins/eslint-plugin-matrixai.js';
11
- import { resolveMatrixConfig } from '../utils.js';
11
+ import { resolveLintConfig } from '../config.js';
12
+ const resolvedLintConfig = resolveLintConfig();
12
13
  const filename = fileURLToPath(import.meta.url);
13
14
  const dirname = path.dirname(filename);
14
15
  const compat = new FlatCompat({
@@ -39,7 +40,7 @@ const config = [
39
40
  ecmaVersion: 5,
40
41
  sourceType: 'module',
41
42
  parserOptions: {
42
- project: resolveMatrixConfig().tsconfigPaths,
43
+ project: resolvedLintConfig.domains.eslint.tsconfigPaths,
43
44
  },
44
45
  },
45
46
  rules: {
@@ -246,4 +247,4 @@ const config = [
246
247
  },
247
248
  ];
248
249
  export default config;
249
- //# sourceMappingURL=js.js.map
250
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../src/configs/eslint.ts"],"names":[],"mappings":"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"}
@@ -14,4 +14,4 @@ export default {
14
14
  },
15
15
  ],
16
16
  };
17
- //# sourceMappingURL=prettier.config.mjs.map
17
+ //# sourceMappingURL=prettier.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prettier.config.js","sourceRoot":"","sources":["../../src/configs/prettier.config.js"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,eAAe;IACb,IAAI,EAAE,IAAI;IACV,aAAa,EAAE,KAAK;IACpB,WAAW,EAAE,IAAI;IACjB,UAAU,EAAE,EAAE;IACd,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,KAAK;IACd,SAAS,EAAE,IAAI;IACf,SAAS,EAAE;QACT;YACE,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;YACxB,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE;SACjC;KACF;CACF,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { LintDomain } from '../types.js';
2
+ import type Logger from '@matrixai/logger';
3
+ type LintDomainEngineContext = {
4
+ fix: boolean;
5
+ logger: Logger;
6
+ chosenConfig?: string;
7
+ isConfigValid: boolean;
8
+ eslintPatterns?: string[];
9
+ shellPatterns?: string[];
10
+ markdownPatterns?: string[];
11
+ };
12
+ type LintDomainAvailabilityKind = 'required' | 'optional';
13
+ type LintDomainDetection = {
14
+ relevant: boolean;
15
+ relevanceReason?: string;
16
+ available: boolean;
17
+ availabilityKind: LintDomainAvailabilityKind;
18
+ unavailableReason?: string;
19
+ matchedFiles?: string[];
20
+ };
21
+ type LintDomainPluginResult = {
22
+ hadFailure: boolean;
23
+ };
24
+ type LintDomainSelectionSource = 'default' | 'domain-flag' | 'target-flag' | 'unselected';
25
+ type LintDomainPlannedAction = 'run' | 'skip-unselected' | 'skip-not-relevant' | 'skip-unavailable' | 'fail-unavailable' | 'fail-detection';
26
+ type LintDomainDecision = {
27
+ domain: LintDomain;
28
+ description: string;
29
+ selected: boolean;
30
+ explicitlyRequested: boolean;
31
+ selectionSource: LintDomainSelectionSource;
32
+ detection: LintDomainDetection | null;
33
+ plannedAction: LintDomainPlannedAction;
34
+ detectionError?: string;
35
+ };
36
+ type LintDomainPlugin = {
37
+ domain: LintDomain;
38
+ description: string;
39
+ detect: ((context: LintDomainEngineContext) => Promise<LintDomainDetection>) | ((context: LintDomainEngineContext) => LintDomainDetection);
40
+ run: ((context: LintDomainEngineContext, detection: LintDomainDetection) => Promise<LintDomainPluginResult>) | ((context: LintDomainEngineContext, detection: LintDomainDetection) => LintDomainPluginResult);
41
+ };
42
+ declare function createLintDomainRegistry(plugins: readonly LintDomainPlugin[]): Map<LintDomain, LintDomainPlugin>;
43
+ declare function listLintDomains({ registry, executionOrder, }: {
44
+ registry: ReadonlyMap<LintDomain, LintDomainPlugin>;
45
+ executionOrder: readonly LintDomain[];
46
+ }): Array<{
47
+ domain: LintDomain;
48
+ description: string;
49
+ }>;
50
+ declare function evaluateLintDomains({ registry, selectedDomains, explicitlyRequestedDomains, selectionSources, executionOrder, context, }: {
51
+ registry: ReadonlyMap<LintDomain, LintDomainPlugin>;
52
+ selectedDomains: ReadonlySet<LintDomain>;
53
+ explicitlyRequestedDomains: ReadonlySet<LintDomain>;
54
+ selectionSources?: ReadonlyMap<LintDomain, LintDomainSelectionSource>;
55
+ executionOrder: readonly LintDomain[];
56
+ context: LintDomainEngineContext;
57
+ }): Promise<LintDomainDecision[]>;
58
+ declare function runLintDomainDecisions({ registry, decisions, context, }: {
59
+ registry: ReadonlyMap<LintDomain, LintDomainPlugin>;
60
+ decisions: readonly LintDomainDecision[];
61
+ context: LintDomainEngineContext;
62
+ }): Promise<boolean>;
63
+ declare function runLintDomains({ registry, selectedDomains, explicitlyRequestedDomains, selectionSources, executionOrder, context, }: {
64
+ registry: ReadonlyMap<LintDomain, LintDomainPlugin>;
65
+ selectedDomains: ReadonlySet<LintDomain>;
66
+ explicitlyRequestedDomains: ReadonlySet<LintDomain>;
67
+ selectionSources?: ReadonlyMap<LintDomain, LintDomainSelectionSource>;
68
+ executionOrder: readonly LintDomain[];
69
+ context: LintDomainEngineContext;
70
+ }): Promise<boolean>;
71
+ export type { LintDomainDecision, LintDomainPlannedAction, LintDomainSelectionSource, LintDomainAvailabilityKind, LintDomainDetection, LintDomainEngineContext, LintDomainPlugin, LintDomainPluginResult, };
72
+ export { createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, };
@@ -0,0 +1,160 @@
1
+ function createLintDomainRegistry(plugins) {
2
+ const registry = new Map();
3
+ for (const plugin of plugins) {
4
+ if (registry.has(plugin.domain)) {
5
+ throw new Error(`Duplicate lint domain plugin registration: ${plugin.domain}`);
6
+ }
7
+ registry.set(plugin.domain, plugin);
8
+ }
9
+ return registry;
10
+ }
11
+ function listLintDomains({ registry, executionOrder, }) {
12
+ return executionOrder.map((domain) => {
13
+ const plugin = registry.get(domain);
14
+ if (plugin == null) {
15
+ throw new Error(`No lint domain plugin registered for: ${domain}`);
16
+ }
17
+ return {
18
+ domain,
19
+ description: plugin.description,
20
+ };
21
+ });
22
+ }
23
+ async function evaluateLintDomains({ registry, selectedDomains, explicitlyRequestedDomains, selectionSources, executionOrder, context, }) {
24
+ const decisions = [];
25
+ for (const domain of executionOrder) {
26
+ const plugin = registry.get(domain);
27
+ if (plugin == null) {
28
+ throw new Error(`No lint domain plugin registered for: ${domain}`);
29
+ }
30
+ const selected = selectedDomains.has(domain);
31
+ const explicitlyRequested = explicitlyRequestedDomains.has(domain);
32
+ const selectionSource = selectionSources?.get(domain) ?? (selected ? 'default' : 'unselected');
33
+ if (!selected) {
34
+ decisions.push({
35
+ domain,
36
+ description: plugin.description,
37
+ selected,
38
+ explicitlyRequested,
39
+ selectionSource,
40
+ detection: null,
41
+ plannedAction: 'skip-unselected',
42
+ });
43
+ continue;
44
+ }
45
+ try {
46
+ const detection = await plugin.detect(context);
47
+ let plannedAction;
48
+ if (!detection.relevant) {
49
+ plannedAction = 'skip-not-relevant';
50
+ }
51
+ else if (!detection.available) {
52
+ const shouldFail = detection.availabilityKind === 'required' || explicitlyRequested;
53
+ plannedAction = shouldFail ? 'fail-unavailable' : 'skip-unavailable';
54
+ }
55
+ else {
56
+ plannedAction = 'run';
57
+ }
58
+ decisions.push({
59
+ domain,
60
+ description: plugin.description,
61
+ selected,
62
+ explicitlyRequested,
63
+ selectionSource,
64
+ detection,
65
+ plannedAction,
66
+ });
67
+ }
68
+ catch (err) {
69
+ decisions.push({
70
+ domain,
71
+ description: plugin.description,
72
+ selected,
73
+ explicitlyRequested,
74
+ selectionSource,
75
+ detection: null,
76
+ plannedAction: 'fail-detection',
77
+ detectionError: String(err),
78
+ });
79
+ }
80
+ }
81
+ return decisions;
82
+ }
83
+ async function runLintDomainDecisions({ registry, decisions, context, }) {
84
+ let hadFailure = false;
85
+ const logger = context.logger;
86
+ for (const decision of decisions) {
87
+ const { domain, plannedAction, explicitlyRequested, detection, detectionError, } = decision;
88
+ if (plannedAction === 'skip-unselected') {
89
+ continue;
90
+ }
91
+ if (plannedAction === 'fail-detection') {
92
+ const message = `[matrixai-lint] - Domain "${domain}" failed unexpectedly.\n${detectionError ?? 'Unknown detection error.'}`;
93
+ logger.error(message);
94
+ hadFailure = true;
95
+ continue;
96
+ }
97
+ if (plannedAction === 'skip-not-relevant') {
98
+ if (explicitlyRequested) {
99
+ const relevanceReason = detection?.relevanceReason ?? 'No files matched in effective scope.';
100
+ const message = `[matrixai-lint] - Domain "${domain}" was explicitly requested, but no files matched. ${relevanceReason}`;
101
+ logger.warn(message);
102
+ }
103
+ continue;
104
+ }
105
+ if (plannedAction === 'fail-unavailable') {
106
+ const unavailableReason = detection?.unavailableReason ??
107
+ `Tooling for domain "${domain}" is not available.`;
108
+ const message = `[matrixai-lint] - Domain "${domain}" cannot run. ${unavailableReason}`;
109
+ logger.error(message);
110
+ hadFailure = true;
111
+ continue;
112
+ }
113
+ if (plannedAction === 'skip-unavailable') {
114
+ const unavailableReason = detection?.unavailableReason ??
115
+ `Tooling for domain "${domain}" is not available.`;
116
+ const message = `[matrixai-lint] - Domain "${domain}" skipped. ${unavailableReason}`;
117
+ logger.warn(message);
118
+ continue;
119
+ }
120
+ const plugin = registry.get(domain);
121
+ if (plugin == null) {
122
+ throw new Error(`No lint domain plugin registered for: ${domain}`);
123
+ }
124
+ if (detection == null) {
125
+ const message = `[matrixai-lint] - Domain "${domain}" is missing detection metadata.`;
126
+ logger.error(message);
127
+ hadFailure = true;
128
+ continue;
129
+ }
130
+ try {
131
+ const result = await plugin.run(context, detection);
132
+ if (result.hadFailure) {
133
+ hadFailure = true;
134
+ }
135
+ }
136
+ catch (err) {
137
+ const message = `[matrixai-lint] - Domain "${domain}" failed unexpectedly.\n${String(err)}`;
138
+ logger.error(message);
139
+ hadFailure = true;
140
+ }
141
+ }
142
+ return hadFailure;
143
+ }
144
+ async function runLintDomains({ registry, selectedDomains, explicitlyRequestedDomains, selectionSources, executionOrder, context, }) {
145
+ const decisions = await evaluateLintDomains({
146
+ registry,
147
+ selectedDomains,
148
+ explicitlyRequestedDomains,
149
+ selectionSources,
150
+ executionOrder,
151
+ context,
152
+ });
153
+ return await runLintDomainDecisions({
154
+ registry,
155
+ decisions,
156
+ context,
157
+ });
158
+ }
159
+ export { createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, };
160
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/domains/engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { LintDomainPlugin } from './engine.js';
2
+ declare function createESLintDomainPlugin(): LintDomainPlugin;
3
+ export { createESLintDomainPlugin };
@@ -0,0 +1,72 @@
1
+ import { collectFilesByExtensions, relativizeFiles, resolveSearchRootsFromPatterns, } from './files.js';
2
+ import * as utils from '../utils.js';
3
+ import { resolveLintConfig } from '../config.js';
4
+ const ESLINT_FILE_EXTENSIONS = [
5
+ '.js',
6
+ '.mjs',
7
+ '.cjs',
8
+ '.jsx',
9
+ '.ts',
10
+ '.tsx',
11
+ '.mts',
12
+ '.cts',
13
+ '.json',
14
+ ];
15
+ const DEFAULT_ESLINT_SEARCH_ROOTS = ['./src', './scripts', './tests'];
16
+ function resolveESLintDetectionPatterns(eslintPatterns) {
17
+ if (eslintPatterns != null && eslintPatterns.length > 0) {
18
+ return [...eslintPatterns];
19
+ }
20
+ const resolvedConfig = resolveLintConfig();
21
+ const { tsconfigPaths, forceInclude } = resolvedConfig.domains.eslint;
22
+ if (tsconfigPaths.length === 0) {
23
+ return DEFAULT_ESLINT_SEARCH_ROOTS;
24
+ }
25
+ const { files } = utils.buildPatterns(tsconfigPaths, forceInclude, process.cwd(), resolvedConfig.root);
26
+ if (files.length === 0) {
27
+ return DEFAULT_ESLINT_SEARCH_ROOTS;
28
+ }
29
+ return files;
30
+ }
31
+ function createESLintDomainPlugin() {
32
+ return {
33
+ domain: 'eslint',
34
+ description: 'Lint JavaScript/TypeScript/JSON files with ESLint.',
35
+ detect: ({ eslintPatterns }) => {
36
+ const patterns = resolveESLintDetectionPatterns(eslintPatterns);
37
+ const searchRoots = resolveSearchRootsFromPatterns(patterns);
38
+ const matchedFiles = collectFilesByExtensions(searchRoots, ESLINT_FILE_EXTENSIONS);
39
+ const matchedRelativeFiles = relativizeFiles(matchedFiles);
40
+ return {
41
+ relevant: matchedRelativeFiles.length > 0,
42
+ relevanceReason: matchedRelativeFiles.length > 0
43
+ ? undefined
44
+ : 'No ESLint-supported files matched in effective scope.',
45
+ available: true,
46
+ availabilityKind: 'required',
47
+ matchedFiles: matchedRelativeFiles,
48
+ };
49
+ },
50
+ run: async ({ fix, logger, chosenConfig, isConfigValid, eslintPatterns, }) => {
51
+ if (!isConfigValid) {
52
+ logger.error('Skipping ESLint due to invalid --eslint-config path.');
53
+ return { hadFailure: true };
54
+ }
55
+ try {
56
+ const hadLintingErrors = await utils.runESLint({
57
+ fix,
58
+ logger,
59
+ configPath: chosenConfig,
60
+ explicitGlobs: eslintPatterns,
61
+ });
62
+ return { hadFailure: hadLintingErrors };
63
+ }
64
+ catch (err) {
65
+ logger.error(`ESLint failed: \n${err}`);
66
+ return { hadFailure: true };
67
+ }
68
+ },
69
+ };
70
+ }
71
+ export { createESLintDomainPlugin };
72
+ //# sourceMappingURL=eslint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../src/domains/eslint.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,eAAe,EACf,8BAA8B,GAC/B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,KAAK,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,sBAAsB,GAAG;IAC7B,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;CACC,CAAC;AAEX,MAAM,2BAA2B,GAAG,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;AAEtE,SAAS,8BAA8B,CACrC,cAA6C;IAE7C,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;QACvD,OAAO,CAAC,GAAG,cAAc,CAAC,CAAC;KAC5B;IAED,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAC3C,MAAM,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;IAEtE,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE;QAC9B,OAAO,2BAA2B,CAAC;KACpC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,aAAa,CACnC,aAAa,EACb,YAAY,EACZ,OAAO,CAAC,GAAG,EAAE,EACb,cAAc,CAAC,IAAI,CACpB,CAAC;IACF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;QACtB,OAAO,2BAA2B,CAAC;KACpC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,wBAAwB;IAC/B,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,oDAAoD;QACjE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE;YAC7B,MAAM,QAAQ,GAAG,8BAA8B,CAAC,cAAc,CAAC,CAAC;YAChE,MAAM,WAAW,GAAG,8BAA8B,CAAC,QAAQ,CAAC,CAAC;YAC7D,MAAM,YAAY,GAAG,wBAAwB,CAC3C,WAAW,EACX,sBAAsB,CACvB,CAAC;YACF,MAAM,oBAAoB,GAAG,eAAe,CAAC,YAAY,CAAC,CAAC;YAE3D,OAAO;gBACL,QAAQ,EAAE,oBAAoB,CAAC,MAAM,GAAG,CAAC;gBACzC,eAAe,EACb,oBAAoB,CAAC,MAAM,GAAG,CAAC;oBAC7B,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,uDAAuD;gBAC7D,SAAS,EAAE,IAAI;gBACf,gBAAgB,EAAE,UAAmB;gBACrC,YAAY,EAAE,oBAAoB;aACnC,CAAC;QACJ,CAAC;QACD,GAAG,EAAE,KAAK,EAAE,EACV,GAAG,EACH,MAAM,EACN,YAAY,EACZ,aAAa,EACb,cAAc,GACf,EAAE,EAAE;YACH,IAAI,CAAC,aAAa,EAAE;gBAClB,MAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;gBACrE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAC7B;YAED,IAAI;gBACF,MAAM,gBAAgB,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC;oBAC7C,GAAG;oBACH,MAAM;oBACN,UAAU,EAAE,YAAY;oBACxB,aAAa,EAAE,cAAc;iBAC9B,CAAC,CAAC;gBAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;aACzC;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;gBACxC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAC7B;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED,OAAO,EAAE,wBAAwB,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ declare function resolveSearchRootsFromPatterns(patterns: readonly string[], cwd?: string): string[];
2
+ declare function collectFilesByExtensions(searchRoots: readonly string[], extensions: readonly string[]): string[];
3
+ declare function relativizeFiles(files: readonly string[], cwd?: string): string[];
4
+ export { resolveSearchRootsFromPatterns, collectFilesByExtensions, relativizeFiles, };
@@ -0,0 +1,95 @@
1
+ import path from 'node:path';
2
+ import process from 'node:process';
3
+ import fs from 'node:fs';
4
+ const GLOB_META_PATTERN = /[*?[\]{}()!+@]/;
5
+ const EXCLUDED_DIR_NAMES = new Set(['.git', 'node_modules', 'dist']);
6
+ function isGlobPattern(value) {
7
+ return GLOB_META_PATTERN.test(value);
8
+ }
9
+ function patternToSearchRoot(pattern, cwd = process.cwd()) {
10
+ if (!isGlobPattern(pattern)) {
11
+ return path.resolve(cwd, pattern);
12
+ }
13
+ const normalizedPattern = pattern.split('/').join(path.sep);
14
+ const segments = normalizedPattern
15
+ .split(path.sep)
16
+ .filter((segment) => segment.length > 0);
17
+ const rootSegments = [];
18
+ for (const segment of segments) {
19
+ if (isGlobPattern(segment)) {
20
+ break;
21
+ }
22
+ rootSegments.push(segment);
23
+ }
24
+ if (rootSegments.length === 0) {
25
+ return cwd;
26
+ }
27
+ return path.resolve(cwd, ...rootSegments);
28
+ }
29
+ function resolveSearchRootsFromPatterns(patterns, cwd = process.cwd()) {
30
+ const existingRoots = new Set();
31
+ for (const pattern of patterns) {
32
+ const root = patternToSearchRoot(pattern, cwd);
33
+ if (fs.existsSync(root)) {
34
+ existingRoots.add(root);
35
+ }
36
+ }
37
+ return [...existingRoots].sort();
38
+ }
39
+ function collectFilesByExtensions(searchRoots, extensions) {
40
+ const extensionSet = new Set(extensions.map((ext) => ext.toLowerCase()));
41
+ const matchedFiles = new Set();
42
+ const visitPath = (entryPath) => {
43
+ let entryStats;
44
+ try {
45
+ entryStats = fs.statSync(entryPath);
46
+ }
47
+ catch {
48
+ return;
49
+ }
50
+ if (entryStats.isFile()) {
51
+ const extension = path.extname(entryPath).toLowerCase();
52
+ if (extensionSet.has(extension)) {
53
+ matchedFiles.add(entryPath);
54
+ }
55
+ return;
56
+ }
57
+ if (!entryStats.isDirectory()) {
58
+ return;
59
+ }
60
+ let dirEntries;
61
+ try {
62
+ dirEntries = fs.readdirSync(entryPath, { withFileTypes: true });
63
+ }
64
+ catch {
65
+ return;
66
+ }
67
+ for (const dirEntry of dirEntries) {
68
+ const childPath = path.join(entryPath, dirEntry.name);
69
+ if (dirEntry.isDirectory()) {
70
+ if (EXCLUDED_DIR_NAMES.has(dirEntry.name)) {
71
+ continue;
72
+ }
73
+ visitPath(childPath);
74
+ }
75
+ else if (dirEntry.isFile()) {
76
+ visitPath(childPath);
77
+ }
78
+ }
79
+ };
80
+ for (const searchRoot of searchRoots) {
81
+ visitPath(searchRoot);
82
+ }
83
+ return [...matchedFiles].sort();
84
+ }
85
+ function relativizeFiles(files, cwd = process.cwd()) {
86
+ return files.map((file) => {
87
+ const relativePath = path.relative(cwd, file);
88
+ if (relativePath === '') {
89
+ return '.';
90
+ }
91
+ return relativePath;
92
+ });
93
+ }
94
+ export { resolveSearchRootsFromPatterns, collectFilesByExtensions, relativizeFiles, };
95
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/domains/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { LintDomain, CLIOptions } from '../types.js';
2
+ import { createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, type LintDomainPlugin, type LintDomainPluginResult, type LintDomainDecision, type LintDomainEngineContext, type LintDomainSelectionSource } from './engine.js';
3
+ declare const LINT_DOMAINS: LintDomain[];
4
+ declare const DEFAULT_SHELLCHECK_SEARCH_ROOTS: string[];
5
+ declare function resolveDomainSelection(options: CLIOptions): {
6
+ selectedDomains: Set<LintDomain>;
7
+ explicitlyRequestedDomains: Set<LintDomain>;
8
+ selectionSources: Map<LintDomain, LintDomainSelectionSource>;
9
+ };
10
+ declare function createBuiltInDomainRegistry({ prettierConfigPath, }: {
11
+ prettierConfigPath: string;
12
+ }): Map<LintDomain, LintDomainPlugin>;
13
+ export type { LintDomainDecision, LintDomainEngineContext, LintDomainPlugin, LintDomainPluginResult, LintDomainSelectionSource, };
14
+ export { LINT_DOMAINS, DEFAULT_SHELLCHECK_SEARCH_ROOTS, resolveDomainSelection, createBuiltInDomainRegistry, createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, };