flowlint 0.3.1 → 0.3.3
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/dist/packages/config/flowlint-config.d.ts +64 -0
- package/dist/packages/config/flowlint-config.js +103 -0
- package/dist/packages/config/flowlint-config.js.map +1 -0
- package/dist/packages/config/index.d.ts +4 -0
- package/dist/packages/config/index.js +21 -0
- package/dist/packages/config/index.js.map +1 -0
- package/dist/packages/github/client.d.ts +2 -0
- package/dist/packages/github/client.js +94 -0
- package/dist/packages/github/client.js.map +1 -0
- package/dist/packages/logger/index.d.ts +11 -0
- package/dist/packages/logger/index.js +40 -0
- package/dist/packages/logger/index.js.map +1 -0
- package/dist/packages/observability/collectors.d.ts +40 -0
- package/dist/packages/observability/collectors.js +75 -0
- package/dist/packages/observability/collectors.js.map +1 -0
- package/dist/packages/observability/index.d.ts +10 -0
- package/dist/packages/observability/index.js +35 -0
- package/dist/packages/observability/index.js.map +1 -0
- package/dist/packages/observability/metrics.d.ts +119 -0
- package/dist/packages/observability/metrics.js +194 -0
- package/dist/packages/observability/metrics.js.map +1 -0
- package/dist/packages/observability/middleware.d.ts +32 -0
- package/dist/packages/observability/middleware.js +58 -0
- package/dist/packages/observability/middleware.js.map +1 -0
- package/dist/packages/review/analysis-engine.d.ts +19 -0
- package/dist/packages/review/analysis-engine.js +111 -0
- package/dist/packages/review/analysis-engine.js.map +1 -0
- package/dist/packages/review/index.d.ts +12 -0
- package/dist/packages/review/index.js +29 -0
- package/dist/packages/review/index.js.map +1 -0
- package/dist/packages/review/parser-n8n.d.ts +2 -0
- package/dist/packages/review/parser-n8n.js +118 -0
- package/dist/packages/review/parser-n8n.js.map +1 -0
- package/dist/packages/review/providers/github.d.ts +62 -0
- package/dist/packages/review/providers/github.js +275 -0
- package/dist/packages/review/providers/github.js.map +1 -0
- package/dist/packages/review/providers.d.ts +106 -0
- package/dist/packages/review/providers.js +12 -0
- package/dist/packages/review/providers.js.map +1 -0
- package/dist/packages/review/reporter.d.ts +17 -0
- package/dist/packages/review/reporter.js +62 -0
- package/dist/packages/review/reporter.js.map +1 -0
- package/dist/packages/review/rules/index.d.ts +9 -0
- package/dist/packages/review/rules/index.js +313 -0
- package/dist/packages/review/rules/index.js.map +1 -0
- package/dist/packages/review/rules/rule-utils.d.ts +36 -0
- package/dist/packages/review/rules/rule-utils.js +75 -0
- package/dist/packages/review/rules/rule-utils.js.map +1 -0
- package/dist/packages/review/schemas/index.d.ts +17 -0
- package/dist/packages/review/schemas/index.js +139 -0
- package/dist/packages/review/schemas/index.js.map +1 -0
- package/dist/packages/review/schemas/n8n-workflow.schema.json +177 -0
- package/dist/packages/review/sniffer.d.ts +15 -0
- package/dist/packages/review/sniffer.js +47 -0
- package/dist/packages/review/sniffer.js.map +1 -0
- package/dist/packages/review/types.d.ts +38 -0
- package/dist/packages/review/types.js +3 -0
- package/dist/packages/review/types.js.map +1 -0
- package/dist/packages/review/utils/findings.d.ts +23 -0
- package/dist/packages/review/utils/findings.js +34 -0
- package/dist/packages/review/utils/findings.js.map +1 -0
- package/dist/packages/review/utils/merge.d.ts +12 -0
- package/dist/packages/review/utils/merge.js +40 -0
- package/dist/packages/review/utils/merge.js.map +1 -0
- package/dist/packages/review/utils.d.ts +60 -0
- package/dist/packages/review/utils.js +214 -0
- package/dist/packages/review/utils.js.map +1 -0
- package/dist/packages/tracing/github-tracer.d.ts +38 -0
- package/dist/packages/tracing/github-tracer.js +79 -0
- package/dist/packages/tracing/github-tracer.js.map +1 -0
- package/dist/packages/tracing/index.d.ts +81 -0
- package/dist/packages/tracing/index.js +240 -0
- package/dist/packages/tracing/index.js.map +1 -0
- package/dist/packages/tracing/tracer.d.ts +30 -0
- package/dist/packages/tracing/tracer.js +141 -0
- package/dist/packages/tracing/tracer.js.map +1 -0
- package/package.json +10 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub-specific provider implementations.
|
|
3
|
+
* These are used by the existing GitHub App workflow.
|
|
4
|
+
*/
|
|
5
|
+
import type { Octokit } from 'octokit';
|
|
6
|
+
import type { FileSource, LintableFile, ConfigProvider, Reporter, AnalysisResult } from '../providers';
|
|
7
|
+
import type { FlowLintConfig } from '../../config/flowlint-config';
|
|
8
|
+
/**
|
|
9
|
+
* GitHub PR FileSource
|
|
10
|
+
* Fetches changed files from a GitHub Pull Request
|
|
11
|
+
*/
|
|
12
|
+
export declare class GitHubPrFileSource implements FileSource {
|
|
13
|
+
private gh;
|
|
14
|
+
private repo;
|
|
15
|
+
private prNumber;
|
|
16
|
+
constructor(gh: Octokit, repo: string, prNumber: number);
|
|
17
|
+
getFiles(patterns: {
|
|
18
|
+
include: string[];
|
|
19
|
+
ignore: string[];
|
|
20
|
+
}): Promise<LintableFile[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Filter PR files based on glob patterns
|
|
23
|
+
*/
|
|
24
|
+
private pickTargets;
|
|
25
|
+
/**
|
|
26
|
+
* Fetch raw file content from GitHub
|
|
27
|
+
*/
|
|
28
|
+
private fetchRawFiles;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* GitHub Remote ConfigProvider
|
|
32
|
+
* Loads .flowlint.yml from a GitHub repository
|
|
33
|
+
*/
|
|
34
|
+
export declare class GitHubConfigProvider implements ConfigProvider {
|
|
35
|
+
private gh;
|
|
36
|
+
private repo;
|
|
37
|
+
private sha;
|
|
38
|
+
constructor(gh: Octokit, repo: string, sha: string);
|
|
39
|
+
load(): Promise<FlowLintConfig>;
|
|
40
|
+
/**
|
|
41
|
+
* Deep merge default config with overrides
|
|
42
|
+
*/
|
|
43
|
+
private deepMerge;
|
|
44
|
+
private mergeInto;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* GitHub Check Run Reporter
|
|
48
|
+
* Sends results to GitHub Checks API
|
|
49
|
+
*/
|
|
50
|
+
export declare class GitHubCheckReporter implements Reporter {
|
|
51
|
+
private gh;
|
|
52
|
+
private repo;
|
|
53
|
+
private checkRunId;
|
|
54
|
+
private cfg;
|
|
55
|
+
private readonly BATCH_SIZE;
|
|
56
|
+
constructor(gh: Octokit, repo: string, checkRunId: number, cfg: FlowLintConfig);
|
|
57
|
+
report(results: AnalysisResult[]): Promise<void>;
|
|
58
|
+
private buildAnnotations;
|
|
59
|
+
private inferConclusion;
|
|
60
|
+
private summarize;
|
|
61
|
+
private mapSeverity;
|
|
62
|
+
}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub-specific provider implementations.
|
|
4
|
+
* These are used by the existing GitHub App workflow.
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
41
|
+
};
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.GitHubCheckReporter = exports.GitHubConfigProvider = exports.GitHubPrFileSource = void 0;
|
|
44
|
+
const logger_1 = require("../../logger");
|
|
45
|
+
const micromatch_1 = __importDefault(require("micromatch"));
|
|
46
|
+
/**
|
|
47
|
+
* GitHub PR FileSource
|
|
48
|
+
* Fetches changed files from a GitHub Pull Request
|
|
49
|
+
*/
|
|
50
|
+
class GitHubPrFileSource {
|
|
51
|
+
constructor(gh, repo, prNumber) {
|
|
52
|
+
this.gh = gh;
|
|
53
|
+
this.repo = repo;
|
|
54
|
+
this.prNumber = prNumber;
|
|
55
|
+
}
|
|
56
|
+
async getFiles(patterns) {
|
|
57
|
+
const [owner, repoName] = this.repo.split('/');
|
|
58
|
+
const paginate = this.gh.paginate;
|
|
59
|
+
if (typeof paginate !== 'function') {
|
|
60
|
+
throw new Error('Octokit client is missing paginate(); ensure @octokit/plugin-paginate-rest is registered.');
|
|
61
|
+
}
|
|
62
|
+
// 1. List all files in the PR
|
|
63
|
+
const allFiles = await paginate.call(this.gh, 'GET /repos/{owner}/{repo}/pulls/{pull_number}/files', {
|
|
64
|
+
owner,
|
|
65
|
+
repo: repoName,
|
|
66
|
+
pull_number: this.prNumber,
|
|
67
|
+
per_page: 100,
|
|
68
|
+
});
|
|
69
|
+
// 2. Filter for target files using globs
|
|
70
|
+
const targets = this.pickTargets(allFiles, patterns);
|
|
71
|
+
// 3. Fetch raw content
|
|
72
|
+
const { contents } = await this.fetchRawFiles(targets);
|
|
73
|
+
return Array.from(contents.entries()).map(([path, content]) => ({
|
|
74
|
+
path,
|
|
75
|
+
content,
|
|
76
|
+
}));
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Filter PR files based on glob patterns
|
|
80
|
+
*/
|
|
81
|
+
pickTargets(files, globs) {
|
|
82
|
+
return files
|
|
83
|
+
.filter((file) => file.status !== 'removed')
|
|
84
|
+
.filter((file) => {
|
|
85
|
+
const normalized = file.filename.replace(/\\/g, '/');
|
|
86
|
+
const included = micromatch_1.default.isMatch(normalized, globs.include, { dot: true });
|
|
87
|
+
const ignored = micromatch_1.default.isMatch(normalized, globs.ignore, { dot: true });
|
|
88
|
+
return included && !ignored;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Fetch raw file content from GitHub
|
|
93
|
+
*/
|
|
94
|
+
async fetchRawFiles(targets) {
|
|
95
|
+
const [owner, repoName] = this.repo.split('/');
|
|
96
|
+
const contents = new Map();
|
|
97
|
+
const errors = [];
|
|
98
|
+
for (const file of targets) {
|
|
99
|
+
if (!file.sha) {
|
|
100
|
+
errors.push({ filename: file.filename, error: 'Missing SHA (file may be removed)' });
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
try {
|
|
104
|
+
const { data: blob } = await this.gh.request('GET /repos/{owner}/{repo}/git/blobs/{file_sha}', {
|
|
105
|
+
owner,
|
|
106
|
+
repo: repoName,
|
|
107
|
+
file_sha: file.sha,
|
|
108
|
+
});
|
|
109
|
+
const raw = Buffer.from(blob.content, 'base64').toString('utf8');
|
|
110
|
+
contents.set(file.filename, raw);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
const errorMsg = error instanceof Error ? error.message : String(error);
|
|
114
|
+
logger_1.logger.warn({ filename: file.filename, error: errorMsg }, 'failed to fetch file');
|
|
115
|
+
errors.push({ filename: file.filename, error: errorMsg });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return { contents, errors };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
exports.GitHubPrFileSource = GitHubPrFileSource;
|
|
122
|
+
/**
|
|
123
|
+
* GitHub Remote ConfigProvider
|
|
124
|
+
* Loads .flowlint.yml from a GitHub repository
|
|
125
|
+
*/
|
|
126
|
+
class GitHubConfigProvider {
|
|
127
|
+
constructor(gh, repo, sha) {
|
|
128
|
+
this.gh = gh;
|
|
129
|
+
this.repo = repo;
|
|
130
|
+
this.sha = sha;
|
|
131
|
+
}
|
|
132
|
+
async load() {
|
|
133
|
+
const { defaultConfig } = await Promise.resolve().then(() => __importStar(require('../../config/flowlint-config')));
|
|
134
|
+
const YAML = (await Promise.resolve().then(() => __importStar(require('yaml')))).default;
|
|
135
|
+
const [owner, repoName] = this.repo.split('/');
|
|
136
|
+
try {
|
|
137
|
+
const { data } = await this.gh.request('GET /repos/{owner}/{repo}/contents/{path}', {
|
|
138
|
+
owner,
|
|
139
|
+
repo: repoName,
|
|
140
|
+
path: '.flowlint.yml',
|
|
141
|
+
ref: this.sha,
|
|
142
|
+
});
|
|
143
|
+
if (!('content' in data))
|
|
144
|
+
return defaultConfig;
|
|
145
|
+
const content = Buffer.from(data.content, 'base64').toString('utf8');
|
|
146
|
+
const parsed = YAML.parse(content) || {};
|
|
147
|
+
return this.deepMerge(defaultConfig, parsed);
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return defaultConfig;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Deep merge default config with overrides
|
|
155
|
+
*/
|
|
156
|
+
deepMerge(base, override) {
|
|
157
|
+
const baseCopy = JSON.parse(JSON.stringify(base));
|
|
158
|
+
if (!override)
|
|
159
|
+
return baseCopy;
|
|
160
|
+
return this.mergeInto(baseCopy, override);
|
|
161
|
+
}
|
|
162
|
+
mergeInto(target, source) {
|
|
163
|
+
for (const [key, value] of Object.entries(source)) {
|
|
164
|
+
if (value === undefined || value === null)
|
|
165
|
+
continue;
|
|
166
|
+
if (Array.isArray(value)) {
|
|
167
|
+
target[key] = value;
|
|
168
|
+
}
|
|
169
|
+
else if (typeof value === 'object') {
|
|
170
|
+
if (typeof target[key] !== 'object' || target[key] === null) {
|
|
171
|
+
target[key] = {};
|
|
172
|
+
}
|
|
173
|
+
this.mergeInto(target[key], value);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
target[key] = value;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return target;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
exports.GitHubConfigProvider = GitHubConfigProvider;
|
|
183
|
+
/**
|
|
184
|
+
* GitHub Check Run Reporter
|
|
185
|
+
* Sends results to GitHub Checks API
|
|
186
|
+
*/
|
|
187
|
+
class GitHubCheckReporter {
|
|
188
|
+
constructor(gh, repo, checkRunId, cfg) {
|
|
189
|
+
this.gh = gh;
|
|
190
|
+
this.repo = repo;
|
|
191
|
+
this.checkRunId = checkRunId;
|
|
192
|
+
this.cfg = cfg;
|
|
193
|
+
this.BATCH_SIZE = 50;
|
|
194
|
+
}
|
|
195
|
+
async report(results) {
|
|
196
|
+
const [owner, repoName] = this.repo.split('/');
|
|
197
|
+
// Collect all findings
|
|
198
|
+
const allFindings = results.flatMap((r) => r.findings);
|
|
199
|
+
// Build output
|
|
200
|
+
const summary = this.summarize(allFindings);
|
|
201
|
+
const conclusion = this.inferConclusion(allFindings);
|
|
202
|
+
// Send annotations if enabled
|
|
203
|
+
if (this.cfg.report.annotations) {
|
|
204
|
+
const annotations = this.buildAnnotations(allFindings);
|
|
205
|
+
const limitedAnnotations = this.cfg.report.summary_limit > 0 && annotations.length > this.cfg.report.summary_limit
|
|
206
|
+
? annotations.slice(0, this.cfg.report.summary_limit)
|
|
207
|
+
: annotations;
|
|
208
|
+
for (let i = 0; i < limitedAnnotations.length; i += this.BATCH_SIZE) {
|
|
209
|
+
const batch = limitedAnnotations.slice(i, i + this.BATCH_SIZE);
|
|
210
|
+
await this.gh.request('PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}', {
|
|
211
|
+
owner,
|
|
212
|
+
repo: repoName,
|
|
213
|
+
check_run_id: this.checkRunId,
|
|
214
|
+
output: {
|
|
215
|
+
title: process.env.CHECK_TITLE || 'FlowLint findings',
|
|
216
|
+
summary,
|
|
217
|
+
annotations: batch,
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Finalize check run
|
|
223
|
+
await this.gh.request('PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}', {
|
|
224
|
+
owner,
|
|
225
|
+
repo: repoName,
|
|
226
|
+
check_run_id: this.checkRunId,
|
|
227
|
+
status: 'completed',
|
|
228
|
+
conclusion,
|
|
229
|
+
completed_at: new Date().toISOString(),
|
|
230
|
+
output: {
|
|
231
|
+
title: process.env.CHECK_TITLE || 'FlowLint findings',
|
|
232
|
+
summary,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
buildAnnotations(findings) {
|
|
237
|
+
const severityOrder = ['must', 'should', 'nit'];
|
|
238
|
+
const ordered = [...findings].sort((a, b) => severityOrder.indexOf(a.severity) - severityOrder.indexOf(b.severity));
|
|
239
|
+
return ordered.map((finding) => {
|
|
240
|
+
const line = finding.line ?? 1;
|
|
241
|
+
return {
|
|
242
|
+
path: finding.path,
|
|
243
|
+
start_line: line,
|
|
244
|
+
end_line: line,
|
|
245
|
+
annotation_level: this.mapSeverity(finding.severity),
|
|
246
|
+
message: `${finding.rule}: ${finding.message}`,
|
|
247
|
+
raw_details: finding.raw_details?.slice(0, 64000),
|
|
248
|
+
};
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
inferConclusion(findings) {
|
|
252
|
+
if (findings.some((f) => f.severity === 'must'))
|
|
253
|
+
return 'failure';
|
|
254
|
+
if (findings.some((f) => f.severity === 'should'))
|
|
255
|
+
return 'neutral';
|
|
256
|
+
return 'success';
|
|
257
|
+
}
|
|
258
|
+
summarize(findings) {
|
|
259
|
+
if (findings.length === 0)
|
|
260
|
+
return 'No issues found.';
|
|
261
|
+
const must = findings.filter((f) => f.severity === 'must').length;
|
|
262
|
+
const should = findings.filter((f) => f.severity === 'should').length;
|
|
263
|
+
const nit = findings.filter((f) => f.severity === 'nit').length;
|
|
264
|
+
return `${must} must-fix, ${should} should-fix, ${nit} nit.`;
|
|
265
|
+
}
|
|
266
|
+
mapSeverity(severity) {
|
|
267
|
+
if (severity === 'must')
|
|
268
|
+
return 'failure';
|
|
269
|
+
if (severity === 'should')
|
|
270
|
+
return 'warning';
|
|
271
|
+
return 'notice';
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.GitHubCheckReporter = GitHubCheckReporter;
|
|
275
|
+
//# sourceMappingURL=github.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../packages/review/providers/github.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider Interfaces for FlowLint
|
|
3
|
+
*
|
|
4
|
+
* These abstractions decouple the core linting engine from specific data sources
|
|
5
|
+
* and output formats, allowing FlowLint to be used in multiple contexts:
|
|
6
|
+
* - GitHub App (existing)
|
|
7
|
+
* - CLI (local file analysis)
|
|
8
|
+
* - Future: Web Dashboard, CI/CD integrations
|
|
9
|
+
*/
|
|
10
|
+
import type { Finding, Graph } from './types';
|
|
11
|
+
import type { FlowLintConfig } from '../config/flowlint-config';
|
|
12
|
+
export type { Finding } from './types';
|
|
13
|
+
/**
|
|
14
|
+
* LintableFile represents a single file that can be analyzed.
|
|
15
|
+
* This replaces the GitHub-specific PRFile type for core linting operations.
|
|
16
|
+
*/
|
|
17
|
+
export interface LintableFile {
|
|
18
|
+
path: string;
|
|
19
|
+
content: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* FileSource provides files for analysis.
|
|
23
|
+
* Implementations can read from:
|
|
24
|
+
* - Local filesystem (for CLI)
|
|
25
|
+
* - GitHub PR (for App)
|
|
26
|
+
* - Any other source
|
|
27
|
+
*/
|
|
28
|
+
export interface FileSource {
|
|
29
|
+
/**
|
|
30
|
+
* Get files matching the provided glob patterns.
|
|
31
|
+
* @param patterns Include/ignore patterns
|
|
32
|
+
* @returns Array of lintable files
|
|
33
|
+
*/
|
|
34
|
+
getFiles(patterns: {
|
|
35
|
+
include: string[];
|
|
36
|
+
ignore: string[];
|
|
37
|
+
}): Promise<LintableFile[]>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* ConfigProvider loads FlowLint configuration.
|
|
41
|
+
* Implementations can load from:
|
|
42
|
+
* - Local .flowlint.yml file (for CLI)
|
|
43
|
+
* - Remote GitHub repository (for App)
|
|
44
|
+
* - Default/hardcoded configuration
|
|
45
|
+
*/
|
|
46
|
+
export interface ConfigProvider {
|
|
47
|
+
/**
|
|
48
|
+
* Load the FlowLint configuration.
|
|
49
|
+
* Should return merged config (defaults + overrides).
|
|
50
|
+
* @returns Loaded configuration
|
|
51
|
+
*/
|
|
52
|
+
load(): Promise<FlowLintConfig>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Reporter generates output from analysis results.
|
|
56
|
+
* Implementations can output to:
|
|
57
|
+
* - GitHub Checks API (for App)
|
|
58
|
+
* - Console/table (for CLI)
|
|
59
|
+
* - JSON file (for integrations/Web Dashboard)
|
|
60
|
+
*/
|
|
61
|
+
export interface Reporter {
|
|
62
|
+
/**
|
|
63
|
+
* Report analysis results.
|
|
64
|
+
* @param results Array of findings from all files
|
|
65
|
+
* @returns Promise that resolves when reporting is complete
|
|
66
|
+
*/
|
|
67
|
+
report(results: AnalysisResult[]): Promise<void>;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* AnalysisResult represents the findings for a single analyzed file.
|
|
71
|
+
* This is the data structure passed to reporters.
|
|
72
|
+
*/
|
|
73
|
+
export interface AnalysisResult {
|
|
74
|
+
file: LintableFile;
|
|
75
|
+
graph: Graph;
|
|
76
|
+
findings: Finding[];
|
|
77
|
+
errors?: Array<{
|
|
78
|
+
error: string;
|
|
79
|
+
details?: string;
|
|
80
|
+
}>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* AnalysisEngine orchestrates the linting process.
|
|
84
|
+
* It coordinates file source, config loading, rule execution, and reporting.
|
|
85
|
+
*/
|
|
86
|
+
export interface AnalysisEngine {
|
|
87
|
+
/**
|
|
88
|
+
* Run a complete analysis on the provided scope.
|
|
89
|
+
* @returns Summary of the analysis (e.g., total findings, errors)
|
|
90
|
+
*/
|
|
91
|
+
analyze(): Promise<AnalysisSummary>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Summary of a completed analysis.
|
|
95
|
+
*/
|
|
96
|
+
export interface AnalysisSummary {
|
|
97
|
+
totalFiles: number;
|
|
98
|
+
totalFindings: number;
|
|
99
|
+
findingsBySeverity: {
|
|
100
|
+
must: number;
|
|
101
|
+
should: number;
|
|
102
|
+
nit: number;
|
|
103
|
+
};
|
|
104
|
+
errors: number;
|
|
105
|
+
hasBlockingIssues: boolean;
|
|
106
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Provider Interfaces for FlowLint
|
|
4
|
+
*
|
|
5
|
+
* These abstractions decouple the core linting engine from specific data sources
|
|
6
|
+
* and output formats, allowing FlowLint to be used in multiple contexts:
|
|
7
|
+
* - GitHub App (existing)
|
|
8
|
+
* - CLI (local file analysis)
|
|
9
|
+
* - Future: Web Dashboard, CI/CD integrations
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
//# sourceMappingURL=providers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../packages/review/providers.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Finding } from './types';
|
|
2
|
+
import type { FlowLintConfig } from '../config/flowlint-config';
|
|
3
|
+
type Conclusion = 'action_required' | 'neutral' | 'success' | 'failure';
|
|
4
|
+
export declare function buildCheckOutput({ findings, cfg, summaryOverride, conclusionOverride, }: {
|
|
5
|
+
findings: Finding[];
|
|
6
|
+
cfg: FlowLintConfig;
|
|
7
|
+
summaryOverride?: string;
|
|
8
|
+
conclusionOverride?: Conclusion;
|
|
9
|
+
}): {
|
|
10
|
+
conclusion: Conclusion;
|
|
11
|
+
output: {
|
|
12
|
+
title: string;
|
|
13
|
+
summary: string;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export declare function buildAnnotations(findings: Finding[]): any[];
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildCheckOutput = buildCheckOutput;
|
|
4
|
+
exports.buildAnnotations = buildAnnotations;
|
|
5
|
+
function buildCheckOutput({ findings, cfg, summaryOverride, conclusionOverride, }) {
|
|
6
|
+
const summary = summaryOverride ?? summarize(findings);
|
|
7
|
+
const conclusion = conclusionOverride ?? inferConclusion(findings);
|
|
8
|
+
return {
|
|
9
|
+
conclusion,
|
|
10
|
+
output: {
|
|
11
|
+
title: process.env.CHECK_TITLE || 'FlowLint findings',
|
|
12
|
+
summary,
|
|
13
|
+
},
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function buildAnnotations(findings) {
|
|
17
|
+
const severityOrder = ['must', 'should', 'nit'];
|
|
18
|
+
const ordered = [...findings].sort((a, b) => severityOrder.indexOf(a.severity) - severityOrder.indexOf(b.severity));
|
|
19
|
+
return ordered.map((finding) => {
|
|
20
|
+
const line = finding.line ?? 1;
|
|
21
|
+
// Build details with documentation link if available
|
|
22
|
+
const details = [];
|
|
23
|
+
if (finding.documentationUrl) {
|
|
24
|
+
details.push(`📚 See examples: ${finding.documentationUrl}`);
|
|
25
|
+
}
|
|
26
|
+
if (finding.raw_details) {
|
|
27
|
+
details.push(finding.raw_details);
|
|
28
|
+
}
|
|
29
|
+
const raw_details = details.join('\n').slice(0, 64000) || undefined;
|
|
30
|
+
return {
|
|
31
|
+
path: finding.path,
|
|
32
|
+
start_line: line,
|
|
33
|
+
end_line: line,
|
|
34
|
+
annotation_level: mapSeverity(finding.severity),
|
|
35
|
+
message: `${finding.rule}: ${finding.message}`,
|
|
36
|
+
raw_details,
|
|
37
|
+
};
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function inferConclusion(findings) {
|
|
41
|
+
if (findings.some((f) => f.severity === 'must'))
|
|
42
|
+
return 'failure';
|
|
43
|
+
if (findings.some((f) => f.severity === 'should'))
|
|
44
|
+
return 'neutral';
|
|
45
|
+
return 'success';
|
|
46
|
+
}
|
|
47
|
+
function summarize(findings) {
|
|
48
|
+
if (findings.length === 0)
|
|
49
|
+
return 'No issues found.';
|
|
50
|
+
const must = findings.filter((f) => f.severity === 'must').length;
|
|
51
|
+
const should = findings.filter((f) => f.severity === 'should').length;
|
|
52
|
+
const nit = findings.filter((f) => f.severity === 'nit').length;
|
|
53
|
+
return `${must} must-fix, ${should} should-fix, ${nit} nit.`;
|
|
54
|
+
}
|
|
55
|
+
function mapSeverity(severity) {
|
|
56
|
+
if (severity === 'must')
|
|
57
|
+
return 'failure';
|
|
58
|
+
if (severity === 'should')
|
|
59
|
+
return 'warning';
|
|
60
|
+
return 'notice';
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.js","sourceRoot":"","sources":["../../../packages/review/reporter.ts"],"names":[],"mappings":";;AAKA,4CAqBC;AAED,4CAyBC;AAhDD,SAAgB,gBAAgB,CAAC,EAC/B,QAAQ,EACR,GAAG,EACH,eAAe,EACf,kBAAkB,GAMnB;IACC,MAAM,OAAO,GAAG,eAAe,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,kBAAkB,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEnE,OAAO;QACL,UAAU;QACV,MAAM,EAAE;YACN,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,mBAAmB;YACrD,OAAO;SACR;KACF,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAAC,QAAmB;IAClD,MAAM,aAAa,GAA0B,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEpH,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC;QAC/B,qDAAqD;QACrD,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,oBAAoB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,SAAS,CAAC;QAEpE,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,gBAAgB,EAAE,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC/C,OAAO,EAAE,GAAG,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,OAAO,EAAE;YAC9C,WAAW;SACZ,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,QAAmB;IAC1C,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC;QAAE,OAAO,SAAS,CAAC;IACpE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,QAAmB;IACpC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAC;IACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO,GAAG,IAAI,cAAc,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAC/D,CAAC;AAED,SAAS,WAAW,CAAC,QAA6B;IAChD,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Graph, Finding } from '../types';
|
|
2
|
+
import type { FlowLintConfig } from '../../config/flowlint-config';
|
|
3
|
+
type RuleContext = {
|
|
4
|
+
path: string;
|
|
5
|
+
cfg: FlowLintConfig;
|
|
6
|
+
nodeLines?: Record<string, number>;
|
|
7
|
+
};
|
|
8
|
+
export declare function runAllRules(graph: Graph, ctx: RuleContext): Finding[];
|
|
9
|
+
export {};
|