flowlint 0.5.1 → 0.6.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.
- package/README.md +45 -355
- package/dist/cli.js +163 -21
- package/dist/cli.js.map +1 -1
- package/package.json +52 -57
- package/dist/cli.d.ts +0 -8
- package/dist/commands/init.d.ts +0 -8
- package/dist/commands/init.js +0 -34
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/scan.d.ts +0 -11
- package/dist/commands/scan.js +0 -104
- package/dist/commands/scan.js.map +0 -1
- package/dist/packages/config/flowlint-config.d.ts +0 -73
- package/dist/packages/config/flowlint-config.js +0 -120
- package/dist/packages/config/flowlint-config.js.map +0 -1
- package/dist/packages/config/index.d.ts +0 -4
- package/dist/packages/config/index.js +0 -21
- package/dist/packages/config/index.js.map +0 -1
- package/dist/packages/github/client.d.ts +0 -2
- package/dist/packages/github/client.js +0 -94
- package/dist/packages/github/client.js.map +0 -1
- package/dist/packages/logger/index.d.ts +0 -11
- package/dist/packages/logger/index.js +0 -40
- package/dist/packages/logger/index.js.map +0 -1
- package/dist/packages/observability/collectors.d.ts +0 -40
- package/dist/packages/observability/collectors.js +0 -75
- package/dist/packages/observability/collectors.js.map +0 -1
- package/dist/packages/observability/index.d.ts +0 -10
- package/dist/packages/observability/index.js +0 -35
- package/dist/packages/observability/index.js.map +0 -1
- package/dist/packages/observability/metrics.d.ts +0 -119
- package/dist/packages/observability/metrics.js +0 -194
- package/dist/packages/observability/metrics.js.map +0 -1
- package/dist/packages/observability/middleware.d.ts +0 -32
- package/dist/packages/observability/middleware.js +0 -58
- package/dist/packages/observability/middleware.js.map +0 -1
- package/dist/packages/review/analysis-engine.d.ts +0 -19
- package/dist/packages/review/analysis-engine.js +0 -111
- package/dist/packages/review/analysis-engine.js.map +0 -1
- package/dist/packages/review/index.d.ts +0 -12
- package/dist/packages/review/index.js +0 -29
- package/dist/packages/review/index.js.map +0 -1
- package/dist/packages/review/parser-n8n.d.ts +0 -2
- package/dist/packages/review/parser-n8n.js +0 -122
- package/dist/packages/review/parser-n8n.js.map +0 -1
- package/dist/packages/review/providers/github.d.ts +0 -62
- package/dist/packages/review/providers/github.js +0 -275
- package/dist/packages/review/providers/github.js.map +0 -1
- package/dist/packages/review/providers.d.ts +0 -106
- package/dist/packages/review/providers.js +0 -12
- package/dist/packages/review/providers.js.map +0 -1
- package/dist/packages/review/reporter.d.ts +0 -17
- package/dist/packages/review/reporter.js +0 -59
- package/dist/packages/review/reporter.js.map +0 -1
- package/dist/packages/review/rules/index.d.ts +0 -9
- package/dist/packages/review/rules/index.js +0 -415
- package/dist/packages/review/rules/index.js.map +0 -1
- package/dist/packages/review/rules/rule-utils.d.ts +0 -36
- package/dist/packages/review/rules/rule-utils.js +0 -75
- package/dist/packages/review/rules/rule-utils.js.map +0 -1
- package/dist/packages/review/schemas/index.d.ts +0 -17
- package/dist/packages/review/schemas/index.js +0 -167
- package/dist/packages/review/schemas/index.js.map +0 -1
- package/dist/packages/review/schemas/n8n-workflow.schema.json +0 -177
- package/dist/packages/review/sniffer.d.ts +0 -15
- package/dist/packages/review/sniffer.js +0 -47
- package/dist/packages/review/sniffer.js.map +0 -1
- package/dist/packages/review/types.d.ts +0 -40
- package/dist/packages/review/types.js +0 -3
- package/dist/packages/review/types.js.map +0 -1
- package/dist/packages/review/utils/findings.d.ts +0 -23
- package/dist/packages/review/utils/findings.js +0 -34
- package/dist/packages/review/utils/findings.js.map +0 -1
- package/dist/packages/review/utils/merge.d.ts +0 -12
- package/dist/packages/review/utils/merge.js +0 -40
- package/dist/packages/review/utils/merge.js.map +0 -1
- package/dist/packages/review/utils.d.ts +0 -60
- package/dist/packages/review/utils.js +0 -214
- package/dist/packages/review/utils.js.map +0 -1
- package/dist/packages/tracing/github-tracer.d.ts +0 -38
- package/dist/packages/tracing/github-tracer.js +0 -79
- package/dist/packages/tracing/github-tracer.js.map +0 -1
- package/dist/packages/tracing/index.d.ts +0 -81
- package/dist/packages/tracing/index.js +0 -240
- package/dist/packages/tracing/index.js.map +0 -1
- package/dist/packages/tracing/tracer.d.ts +0 -30
- package/dist/packages/tracing/tracer.js +0 -141
- package/dist/packages/tracing/tracer.js.map +0 -1
- package/dist/providers/local-config-provider.d.ts +0 -11
- package/dist/providers/local-config-provider.js +0 -39
- package/dist/providers/local-config-provider.js.map +0 -1
- package/dist/providers/local-file-source.d.ts +0 -13
- package/dist/providers/local-file-source.js +0 -47
- package/dist/providers/local-file-source.js.map +0 -1
- package/dist/reporters/console-reporter.d.ts +0 -8
- package/dist/reporters/console-reporter.js +0 -75
- package/dist/reporters/console-reporter.js.map +0 -1
- package/dist/reporters/github-actions-reporter.d.ts +0 -30
- package/dist/reporters/github-actions-reporter.js +0 -104
- package/dist/reporters/github-actions-reporter.js.map +0 -1
- package/dist/reporters/json-reporter.d.ts +0 -14
- package/dist/reporters/json-reporter.js +0 -57
- package/dist/reporters/json-reporter.js.map +0 -1
- package/dist/reporters/junit-reporter.d.ts +0 -25
- package/dist/reporters/junit-reporter.js +0 -142
- package/dist/reporters/junit-reporter.js.map +0 -1
- package/dist/reporters/sarif-reporter.d.ts +0 -21
- package/dist/reporters/sarif-reporter.js +0 -125
- package/dist/reporters/sarif-reporter.js.map +0 -1
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* FlowLint Analysis Engine
|
|
4
|
-
*
|
|
5
|
-
* Orchestrates the linting workflow:
|
|
6
|
-
* 1. Load configuration
|
|
7
|
-
* 2. Fetch files to analyze
|
|
8
|
-
* 3. Parse each file into a graph
|
|
9
|
-
* 4. Run rules against the graph
|
|
10
|
-
* 5. Report results
|
|
11
|
-
*/
|
|
12
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
-
exports.DefaultAnalysisEngine = void 0;
|
|
14
|
-
const parser_n8n_1 = require("./parser-n8n");
|
|
15
|
-
const rules_1 = require("./rules");
|
|
16
|
-
const schemas_1 = require("./schemas");
|
|
17
|
-
const logger_1 = require("../logger");
|
|
18
|
-
const findings_1 = require("./utils/findings");
|
|
19
|
-
const utils_1 = require("./utils");
|
|
20
|
-
class DefaultAnalysisEngine {
|
|
21
|
-
constructor(fileSource, configProvider, reporter) {
|
|
22
|
-
this.fileSource = fileSource;
|
|
23
|
-
this.configProvider = configProvider;
|
|
24
|
-
this.reporter = reporter;
|
|
25
|
-
}
|
|
26
|
-
async analyze() {
|
|
27
|
-
// 1. Load configuration
|
|
28
|
-
const cfg = await this.configProvider.load();
|
|
29
|
-
logger_1.logger.debug({ rules: Object.keys(cfg.rules) }, 'loaded configuration');
|
|
30
|
-
// 2. Fetch files to analyze
|
|
31
|
-
const files = await this.fileSource.getFiles(cfg.files);
|
|
32
|
-
logger_1.logger.info({ count: files.length }, 'fetched files for analysis');
|
|
33
|
-
// 3. Analyze each file
|
|
34
|
-
const results = [];
|
|
35
|
-
let errorCount = 0;
|
|
36
|
-
for (const file of files) {
|
|
37
|
-
try {
|
|
38
|
-
// Parse file to graph
|
|
39
|
-
const graph = (0, parser_n8n_1.parseN8n)(file.content);
|
|
40
|
-
logger_1.logger.debug({ file: file.path, nodes: graph.nodes.length }, 'parsed file');
|
|
41
|
-
// Run all rules
|
|
42
|
-
const findings = (0, rules_1.runAllRules)(graph, {
|
|
43
|
-
path: file.path,
|
|
44
|
-
cfg,
|
|
45
|
-
nodeLines: graph.meta.nodeLines,
|
|
46
|
-
});
|
|
47
|
-
// Inject documentation URLs into findings
|
|
48
|
-
findings.forEach((f) => {
|
|
49
|
-
f.documentationUrl = (0, utils_1.getExampleLink)(f.rule);
|
|
50
|
-
});
|
|
51
|
-
results.push({
|
|
52
|
-
file,
|
|
53
|
-
graph,
|
|
54
|
-
findings,
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
catch (error) {
|
|
58
|
-
errorCount++;
|
|
59
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
60
|
-
const raw_details = this.formatParseError(error);
|
|
61
|
-
logger_1.logger.warn({ file: file.path, error: message }, 'failed to parse file');
|
|
62
|
-
// Add error finding
|
|
63
|
-
const errorFinding = {
|
|
64
|
-
rule: 'PARSE',
|
|
65
|
-
severity: 'must',
|
|
66
|
-
path: file.path,
|
|
67
|
-
message,
|
|
68
|
-
raw_details,
|
|
69
|
-
line: 1,
|
|
70
|
-
};
|
|
71
|
-
results.push({
|
|
72
|
-
file,
|
|
73
|
-
graph: { nodes: [], edges: [], meta: {} },
|
|
74
|
-
findings: [errorFinding],
|
|
75
|
-
errors: [{ error: message, details: raw_details }],
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
// 4. Calculate summary
|
|
80
|
-
const allFindings = results.flatMap((r) => r.findings);
|
|
81
|
-
const summary = (0, findings_1.countFindingsBySeverity)(allFindings);
|
|
82
|
-
// 5. Report results
|
|
83
|
-
logger_1.logger.info({ totalResults: results.length, totalFindings: summary.total }, 'reporting results');
|
|
84
|
-
await this.reporter.report(results);
|
|
85
|
-
// 6. Return summary
|
|
86
|
-
return {
|
|
87
|
-
totalFiles: files.length,
|
|
88
|
-
totalFindings: summary.total,
|
|
89
|
-
findingsBySeverity: { must: summary.must, should: summary.should, nit: summary.nit },
|
|
90
|
-
errors: errorCount,
|
|
91
|
-
hasBlockingIssues: summary.must > 0,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
formatParseError(error) {
|
|
95
|
-
if (error instanceof schemas_1.ValidationError && Array.isArray(error.errors) && error.errors.length > 0) {
|
|
96
|
-
return error.errors
|
|
97
|
-
.map((err) => {
|
|
98
|
-
const suggestion = err.suggestion ? ` (suggestion: ${err.suggestion})` : '';
|
|
99
|
-
return `- ${err.path}: ${err.message}${suggestion}`;
|
|
100
|
-
})
|
|
101
|
-
.join('\n')
|
|
102
|
-
.slice(0, 64000);
|
|
103
|
-
}
|
|
104
|
-
if (error instanceof Error && error.stack) {
|
|
105
|
-
return error.stack.slice(0, 64000);
|
|
106
|
-
}
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
exports.DefaultAnalysisEngine = DefaultAnalysisEngine;
|
|
111
|
-
//# sourceMappingURL=analysis-engine.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"analysis-engine.js","sourceRoot":"","sources":["../../../packages/review/analysis-engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAGH,6CAAwC;AACxC,mCAAsC;AACtC,uCAA4C;AAE5C,sCAAmC;AACnC,+CAA2D;AAC3D,mCAAyC;AAEzC,MAAa,qBAAqB;IAChC,YACU,UAAsB,EACtB,cAA8B,EAC9B,QAAkB;QAFlB,eAAU,GAAV,UAAU,CAAY;QACtB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEJ,KAAK,CAAC,OAAO;QACX,wBAAwB;QACxB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC7C,eAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,sBAAsB,CAAC,CAAC;QAExE,4BAA4B;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACxD,eAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;QAEnE,uBAAuB;QACvB,MAAM,OAAO,GAAqB,EAAE,CAAC;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,sBAAsB;gBACtB,MAAM,KAAK,GAAG,IAAA,qBAAQ,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,eAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC;gBAE5E,gBAAgB;gBAChB,MAAM,QAAQ,GAAG,IAAA,mBAAW,EAAC,KAAK,EAAE;oBAClC,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG;oBACH,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,SAA+C;iBACtE,CAAC,CAAC;gBAEH,0CAA0C;gBAC1C,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACrB,CAAC,CAAC,gBAAgB,GAAG,IAAA,sBAAc,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC9C,CAAC,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,KAAK;oBACL,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,UAAU,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACvE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAEjD,eAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,sBAAsB,CAAC,CAAC;gBAEzE,oBAAoB;gBACpB,MAAM,YAAY,GAAY;oBAC5B,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO;oBACP,WAAW;oBACX,IAAI,EAAE,CAAC;iBACR,CAAC;gBAEF,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI;oBACJ,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;oBACzC,QAAQ,EAAE,CAAC,YAAY,CAAC;oBACxB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;iBACnD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,uBAAuB;QACvB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,IAAA,kCAAuB,EAAC,WAAW,CAAC,CAAC;QAErD,oBAAoB;QACpB,eAAM,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACjG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEpC,oBAAoB;QACpB,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,aAAa,EAAE,OAAO,CAAC,KAAK;YAC5B,kBAAkB,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YACpF,MAAM,EAAE,UAAU;YAClB,iBAAiB,EAAE,OAAO,CAAC,IAAI,GAAG,CAAC;SACpC,CAAC;IACJ,CAAC;IAEO,gBAAgB,CAAC,KAAc;QACrC,IAAI,KAAK,YAAY,yBAAe,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/F,OAAO,KAAK,CAAC,MAAM;iBAChB,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;gBACX,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5E,OAAO,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;YACtD,CAAC,CAAC;iBACD,IAAI,CAAC,IAAI,CAAC;iBACV,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,SAAS,CAAC;IACnB,CAAC;CACF;AAxGD,sDAwGC"}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Main exports from packages/review
|
|
3
|
-
*/
|
|
4
|
-
export * from './types';
|
|
5
|
-
export * from './providers';
|
|
6
|
-
export * from './analysis-engine';
|
|
7
|
-
export * from './parser-n8n';
|
|
8
|
-
export * from './rules';
|
|
9
|
-
export * from './reporter';
|
|
10
|
-
export * from './sniffer';
|
|
11
|
-
export * from './schemas';
|
|
12
|
-
export * from './providers/github';
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Main exports from packages/review
|
|
4
|
-
*/
|
|
5
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
-
if (k2 === undefined) k2 = k;
|
|
7
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
-
}
|
|
11
|
-
Object.defineProperty(o, k2, desc);
|
|
12
|
-
}) : (function(o, m, k, k2) {
|
|
13
|
-
if (k2 === undefined) k2 = k;
|
|
14
|
-
o[k2] = m[k];
|
|
15
|
-
}));
|
|
16
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
-
};
|
|
19
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
__exportStar(require("./types"), exports);
|
|
21
|
-
__exportStar(require("./providers"), exports);
|
|
22
|
-
__exportStar(require("./analysis-engine"), exports);
|
|
23
|
-
__exportStar(require("./parser-n8n"), exports);
|
|
24
|
-
__exportStar(require("./rules"), exports);
|
|
25
|
-
__exportStar(require("./reporter"), exports);
|
|
26
|
-
__exportStar(require("./sniffer"), exports);
|
|
27
|
-
__exportStar(require("./schemas"), exports);
|
|
28
|
-
__exportStar(require("./providers/github"), exports);
|
|
29
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/review/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,8CAA4B;AAC5B,oDAAkC;AAClC,+CAA6B;AAC7B,0CAAwB;AACxB,6CAA2B;AAC3B,4CAA0B;AAC1B,4CAA0B;AAC1B,qDAAmC"}
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.parseN8n = parseN8n;
|
|
7
|
-
const yaml_1 = __importDefault(require("yaml"));
|
|
8
|
-
const schemas_1 = require("./schemas");
|
|
9
|
-
const utils_1 = require("./utils");
|
|
10
|
-
function parseN8n(doc) {
|
|
11
|
-
let parsed;
|
|
12
|
-
try {
|
|
13
|
-
parsed = JSON.parse(doc);
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
parsed = yaml_1.default.parse(doc);
|
|
17
|
-
}
|
|
18
|
-
// Validate workflow structure before parsing
|
|
19
|
-
(0, schemas_1.validateN8nWorkflow)(parsed);
|
|
20
|
-
const nodes = parsed.nodes.map((node, idx) => {
|
|
21
|
-
const nodeId = node.id || node.name || `node-${idx}`;
|
|
22
|
-
const flags = {
|
|
23
|
-
continueOnFail: node.continueOnFail,
|
|
24
|
-
retryOnFail: node.retryOnFail ?? node.settings?.retryOnFail,
|
|
25
|
-
waitBetweenTries: node.waitBetweenTries ?? node.settings?.waitBetweenTries,
|
|
26
|
-
maxTries: node.maxTries ?? node.settings?.maxTries,
|
|
27
|
-
};
|
|
28
|
-
const hasFlags = flags.continueOnFail !== undefined ||
|
|
29
|
-
flags.retryOnFail !== undefined ||
|
|
30
|
-
flags.waitBetweenTries !== undefined;
|
|
31
|
-
return {
|
|
32
|
-
id: nodeId,
|
|
33
|
-
type: node.type,
|
|
34
|
-
name: node.name,
|
|
35
|
-
params: node.parameters,
|
|
36
|
-
cred: node.credentials,
|
|
37
|
-
flags: hasFlags ? flags : undefined,
|
|
38
|
-
};
|
|
39
|
-
});
|
|
40
|
-
const nameToId = new Map();
|
|
41
|
-
for (const node of nodes) {
|
|
42
|
-
if (node.id)
|
|
43
|
-
nameToId.set(node.id, node.id);
|
|
44
|
-
if (node.name)
|
|
45
|
-
nameToId.set(node.name, node.id);
|
|
46
|
-
}
|
|
47
|
-
const lines = doc.split(/\r?\n/);
|
|
48
|
-
const idLine = new Map();
|
|
49
|
-
const nameLine = new Map();
|
|
50
|
-
lines.forEach((line, idx) => {
|
|
51
|
-
const idMatch = line.match(/"id":\s*"([^"]+)"/);
|
|
52
|
-
if (idMatch)
|
|
53
|
-
idLine.set(idMatch[1], idx + 1);
|
|
54
|
-
const nameMatch = line.match(/"name":\s*"([^"]+)"/);
|
|
55
|
-
if (nameMatch)
|
|
56
|
-
nameLine.set(nameMatch[1], idx + 1);
|
|
57
|
-
});
|
|
58
|
-
const nodeLines = new Map();
|
|
59
|
-
for (const node of nodes) {
|
|
60
|
-
const lineNumber = (node.name && nameLine.get(node.name)) || idLine.get(node.id);
|
|
61
|
-
if (lineNumber) {
|
|
62
|
-
nodeLines.set(node.id, lineNumber);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
const nodeById = new Map();
|
|
66
|
-
for (const node of nodes) {
|
|
67
|
-
nodeById.set(node.id, node);
|
|
68
|
-
}
|
|
69
|
-
const resolveEdgeType = (connectionType, outputIndex, sourceType) => {
|
|
70
|
-
if (connectionType === 'error')
|
|
71
|
-
return 'error';
|
|
72
|
-
if (connectionType === 'timeout')
|
|
73
|
-
return 'timeout';
|
|
74
|
-
if (connectionType === 'main') {
|
|
75
|
-
if (typeof outputIndex === 'number' &&
|
|
76
|
-
outputIndex > 0 &&
|
|
77
|
-
sourceType &&
|
|
78
|
-
(0, utils_1.isErrorProneNode)(sourceType)) {
|
|
79
|
-
return 'error';
|
|
80
|
-
}
|
|
81
|
-
return 'success';
|
|
82
|
-
}
|
|
83
|
-
return 'success';
|
|
84
|
-
};
|
|
85
|
-
const edges = [];
|
|
86
|
-
Object.entries(parsed.connections || {}).forEach(([from, exits]) => {
|
|
87
|
-
if (!exits) {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
const exitChannels = exits;
|
|
91
|
-
Object.entries(exitChannels).forEach(([exitType, conn]) => {
|
|
92
|
-
const sourceId = nameToId.get(from) ?? from;
|
|
93
|
-
const sourceNode = nodeById.get(sourceId);
|
|
94
|
-
const enqueueEdges = (value, outputIndex) => {
|
|
95
|
-
(0, utils_1.flattenConnections)(value).forEach((link) => {
|
|
96
|
-
if (!link || typeof link !== 'object')
|
|
97
|
-
return;
|
|
98
|
-
const targetId = nameToId.get(link.node) ?? link.node;
|
|
99
|
-
if (!targetId)
|
|
100
|
-
return;
|
|
101
|
-
const edgeType = resolveEdgeType(exitType, outputIndex, sourceNode?.type);
|
|
102
|
-
edges.push({ from: sourceId, to: targetId, on: edgeType });
|
|
103
|
-
});
|
|
104
|
-
};
|
|
105
|
-
if (Array.isArray(conn)) {
|
|
106
|
-
conn.forEach((entry, index) => enqueueEdges(entry, index));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
enqueueEdges(conn);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
return {
|
|
114
|
-
nodes,
|
|
115
|
-
edges,
|
|
116
|
-
meta: {
|
|
117
|
-
credentials: !!parsed.credentials,
|
|
118
|
-
nodeLines: Object.fromEntries(nodeLines),
|
|
119
|
-
},
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=parser-n8n.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parser-n8n.js","sourceRoot":"","sources":["../../../packages/review/parser-n8n.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,62 +0,0 @@
|
|
|
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
|
-
}
|
|
@@ -1,275 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github.js","sourceRoot":"","sources":["../../../../packages/review/providers/github.ts"],"names":[],"mappings":"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"}
|