@matrixai/lint 0.2.12 → 0.4.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/AGENTS.md +23 -0
- package/README.md +151 -83
- package/dist/bin/matrixai-lint.js +174 -0
- package/dist/bin/matrixai-lint.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +120 -0
- package/dist/config.js.map +1 -0
- package/dist/configs/{js.js → eslint.js} +5 -4
- package/dist/configs/eslint.js.map +1 -0
- package/dist/configs/{prettier.config.mjs → prettier.config.js} +1 -1
- package/dist/configs/prettier.config.js.map +1 -0
- package/dist/domains/engine.d.ts +72 -0
- package/dist/domains/engine.js +160 -0
- package/dist/domains/engine.js.map +1 -0
- package/dist/domains/eslint.d.ts +3 -0
- package/dist/domains/eslint.js +72 -0
- package/dist/domains/eslint.js.map +1 -0
- package/dist/domains/files.d.ts +4 -0
- package/dist/domains/files.js +95 -0
- package/dist/domains/files.js.map +1 -0
- package/dist/domains/index.d.ts +14 -0
- package/dist/domains/index.js +83 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/domains/markdown.d.ts +5 -0
- package/dist/domains/markdown.js +103 -0
- package/dist/domains/markdown.js.map +1 -0
- package/dist/domains/shell.d.ts +5 -0
- package/dist/domains/shell.js +58 -0
- package/dist/domains/shell.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/tsbuildinfo +1 -0
- package/dist/types.d.ts +31 -8
- package/dist/utils.d.ts +13 -18
- package/dist/utils.js +207 -94
- package/dist/utils.js.map +1 -1
- package/package.json +23 -13
- package/dist/bin/lint.js +0 -182
- package/dist/bin/lint.js.map +0 -1
- package/dist/configs/js.js.map +0 -1
- package/dist/configs/prettier.config.mjs.map +0 -1
- package/flake.lock +0 -78
- package/jest.config.mjs +0 -84
- /package/dist/bin/{lint.d.ts → matrixai-lint.d.ts} +0 -0
- /package/dist/configs/{js.d.ts → eslint.d.ts} +0 -0
- /package/dist/configs/{prettier.config.d.mts → prettier.config.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eslint.js","sourceRoot":"","sources":["../../src/configs/eslint.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,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, };
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, } from './engine.js';
|
|
2
|
+
import { createESLintDomainPlugin } from './eslint.js';
|
|
3
|
+
import { createShellDomainPlugin } from './shell.js';
|
|
4
|
+
import { createMarkdownDomainPlugin } from './markdown.js';
|
|
5
|
+
const LINT_DOMAINS = ['eslint', 'shell', 'markdown'];
|
|
6
|
+
const DEFAULT_SHELLCHECK_SEARCH_ROOTS = ['./src', './scripts', './tests'];
|
|
7
|
+
function resolveDomainSelection(options) {
|
|
8
|
+
const domainFlags = options.domain ?? [];
|
|
9
|
+
const skipDomains = new Set(options.skipDomain ?? []);
|
|
10
|
+
const hasDomainSelectors = domainFlags.length > 0 || skipDomains.size > 0;
|
|
11
|
+
const hasExplicitESLintTargets = (options.eslint?.length ?? 0) > 0;
|
|
12
|
+
const hasExplicitShellTargets = (options.shell?.length ?? 0) > 0;
|
|
13
|
+
const hasExplicitMarkdownTargets = (options.markdown?.length ?? 0) > 0;
|
|
14
|
+
const explicitlyRequestedDomains = new Set(domainFlags);
|
|
15
|
+
const selectionSources = new Map();
|
|
16
|
+
if (hasExplicitESLintTargets) {
|
|
17
|
+
explicitlyRequestedDomains.add('eslint');
|
|
18
|
+
}
|
|
19
|
+
if (hasExplicitShellTargets) {
|
|
20
|
+
explicitlyRequestedDomains.add('shell');
|
|
21
|
+
}
|
|
22
|
+
if (hasExplicitMarkdownTargets) {
|
|
23
|
+
explicitlyRequestedDomains.add('markdown');
|
|
24
|
+
}
|
|
25
|
+
let selectedDomains;
|
|
26
|
+
if (domainFlags.length > 0) {
|
|
27
|
+
selectedDomains = new Set(domainFlags);
|
|
28
|
+
for (const domain of domainFlags) {
|
|
29
|
+
selectionSources.set(domain, 'domain-flag');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
else if (!hasDomainSelectors &&
|
|
33
|
+
(hasExplicitESLintTargets ||
|
|
34
|
+
hasExplicitShellTargets ||
|
|
35
|
+
hasExplicitMarkdownTargets)) {
|
|
36
|
+
selectedDomains = new Set();
|
|
37
|
+
if (hasExplicitESLintTargets) {
|
|
38
|
+
selectedDomains.add('eslint');
|
|
39
|
+
selectionSources.set('eslint', 'target-flag');
|
|
40
|
+
}
|
|
41
|
+
if (hasExplicitShellTargets) {
|
|
42
|
+
selectedDomains.add('shell');
|
|
43
|
+
selectionSources.set('shell', 'target-flag');
|
|
44
|
+
}
|
|
45
|
+
if (hasExplicitMarkdownTargets) {
|
|
46
|
+
selectedDomains.add('markdown');
|
|
47
|
+
selectionSources.set('markdown', 'target-flag');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
selectedDomains = new Set(LINT_DOMAINS);
|
|
52
|
+
for (const domain of LINT_DOMAINS) {
|
|
53
|
+
selectionSources.set(domain, 'default');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const domain of skipDomains) {
|
|
57
|
+
selectedDomains.delete(domain);
|
|
58
|
+
selectionSources.delete(domain);
|
|
59
|
+
}
|
|
60
|
+
for (const domain of [...explicitlyRequestedDomains]) {
|
|
61
|
+
if (!selectedDomains.has(domain)) {
|
|
62
|
+
explicitlyRequestedDomains.delete(domain);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
selectedDomains,
|
|
67
|
+
explicitlyRequestedDomains,
|
|
68
|
+
selectionSources,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
function createBuiltInDomainRegistry({ prettierConfigPath, }) {
|
|
72
|
+
return createLintDomainRegistry([
|
|
73
|
+
createESLintDomainPlugin(),
|
|
74
|
+
createShellDomainPlugin({
|
|
75
|
+
defaultSearchRoots: DEFAULT_SHELLCHECK_SEARCH_ROOTS,
|
|
76
|
+
}),
|
|
77
|
+
createMarkdownDomainPlugin({
|
|
78
|
+
prettierConfigPath,
|
|
79
|
+
}),
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
82
|
+
export { LINT_DOMAINS, DEFAULT_SHELLCHECK_SEARCH_ROOTS, resolveDomainSelection, createBuiltInDomainRegistry, createLintDomainRegistry, listLintDomains, evaluateLintDomains, runLintDomainDecisions, runLintDomains, };
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/domains/index.ts"],"names":[],"mappings":"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"}
|