flowlint 0.5.3 → 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
package/package.json
CHANGED
|
@@ -1,57 +1,52 @@
|
|
|
1
|
-
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
|
|
35
|
-
"
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"
|
|
46
|
-
|
|
47
|
-
"
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
},
|
|
54
|
-
"publishConfig": {
|
|
55
|
-
"access": "public"
|
|
56
|
-
}
|
|
57
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "flowlint",
|
|
3
|
+
"version": "0.6.0",
|
|
4
|
+
"description": "CLI for static analysis of n8n workflows",
|
|
5
|
+
"bin": {
|
|
6
|
+
"flowlint": "./dist/cli.js"
|
|
7
|
+
},
|
|
8
|
+
"main": "dist/cli.js",
|
|
9
|
+
"files": [
|
|
10
|
+
"dist/",
|
|
11
|
+
"README.md",
|
|
12
|
+
"LICENSE"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsup",
|
|
16
|
+
"dev": "tsx src/cli.ts",
|
|
17
|
+
"test": "vitest run",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"n8n",
|
|
22
|
+
"workflow",
|
|
23
|
+
"linter",
|
|
24
|
+
"cli",
|
|
25
|
+
"static-analysis"
|
|
26
|
+
],
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "https://github.com/Replikanti/flowlint-cli.git"
|
|
31
|
+
},
|
|
32
|
+
"publishConfig": {
|
|
33
|
+
"access": "public"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": "\u003e=18"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"commander": "^12.1.0",
|
|
40
|
+
"picocolors": "^1.0.0",
|
|
41
|
+
"yaml": "^2.8.2",
|
|
42
|
+
"@replikanti/flowlint-core": "file:../flowlint-core",
|
|
43
|
+
"glob": "^10.3.10"
|
|
44
|
+
},
|
|
45
|
+
"devDependencies": {
|
|
46
|
+
"@types/node": "^22.0.0",
|
|
47
|
+
"tsup": "^8.0.0",
|
|
48
|
+
"tsx": "^4.0.0",
|
|
49
|
+
"typescript": "^5.4.0",
|
|
50
|
+
"vitest": "^4.0.8"
|
|
51
|
+
}
|
|
52
|
+
}
|
package/dist/cli.d.ts
DELETED
package/dist/commands/init.d.ts
DELETED
package/dist/commands/init.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* init command - Create a .flowlint.yml configuration file interactively
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* flowlint init
|
|
7
|
-
*/
|
|
8
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.initCommand = void 0;
|
|
13
|
-
const commander_1 = require("commander");
|
|
14
|
-
const fs_1 = __importDefault(require("fs"));
|
|
15
|
-
const path_1 = __importDefault(require("path"));
|
|
16
|
-
const yaml_1 = __importDefault(require("yaml"));
|
|
17
|
-
const flowlint_config_1 = require("../packages/config/flowlint-config");
|
|
18
|
-
exports.initCommand = new commander_1.Command('init')
|
|
19
|
-
.description('Create a .flowlint.yml configuration file')
|
|
20
|
-
.action(async () => {
|
|
21
|
-
const configPath = path_1.default.join(process.cwd(), '.flowlint.yml');
|
|
22
|
-
// Check if config already exists
|
|
23
|
-
if (fs_1.default.existsSync(configPath)) {
|
|
24
|
-
console.log('.flowlint.yml already exists. Skipping initialization.');
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
// For now, just write the default config
|
|
28
|
-
// In the future, this could be interactive
|
|
29
|
-
const yaml = yaml_1.default.stringify(flowlint_config_1.defaultConfig, { lineWidth: 120 });
|
|
30
|
-
fs_1.default.writeFileSync(configPath, yaml, 'utf8');
|
|
31
|
-
console.log(`✓ Created .flowlint.yml with default configuration`);
|
|
32
|
-
console.log(` Edit the file to customize linting rules and patterns`);
|
|
33
|
-
});
|
|
34
|
-
//# sourceMappingURL=init.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../../apps/cli/src/commands/init.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;;AAEH,yCAAoC;AACpC,4CAAoB;AACpB,gDAAwB;AACxB,gDAAwB;AACxB,qEAAgE;AAEnD,QAAA,WAAW,GAAG,IAAI,mBAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,KAAK,IAAI,EAAE;IACjB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,eAAe,CAAC,CAAC;IAE7D,iCAAiC;IACjC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;QACtE,OAAO;IACT,CAAC;IAED,yCAAyC;IACzC,2CAA2C;IAC3C,MAAM,IAAI,GAAG,cAAI,CAAC,SAAS,CAAC,+BAAa,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/D,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC"}
|
package/dist/commands/scan.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* scan command - Analyze n8n workflow files in a directory
|
|
3
|
-
*
|
|
4
|
-
* Usage:
|
|
5
|
-
* flowlint scan [path]
|
|
6
|
-
* flowlint scan . --config .flowlint.yml
|
|
7
|
-
* flowlint scan --format json --out-file report.json
|
|
8
|
-
* flowlint scan --fail-on-error
|
|
9
|
-
*/
|
|
10
|
-
import { Command } from 'commander';
|
|
11
|
-
export declare const scanCommand: Command;
|
package/dist/commands/scan.js
DELETED
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* scan command - Analyze n8n workflow files in a directory
|
|
4
|
-
*
|
|
5
|
-
* Usage:
|
|
6
|
-
* flowlint scan [path]
|
|
7
|
-
* flowlint scan . --config .flowlint.yml
|
|
8
|
-
* flowlint scan --format json --out-file report.json
|
|
9
|
-
* flowlint scan --fail-on-error
|
|
10
|
-
*/
|
|
11
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
-
};
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.scanCommand = void 0;
|
|
16
|
-
const commander_1 = require("commander");
|
|
17
|
-
const path_1 = __importDefault(require("path"));
|
|
18
|
-
const local_file_source_1 = require("../providers/local-file-source");
|
|
19
|
-
const local_config_provider_1 = require("../providers/local-config-provider");
|
|
20
|
-
const console_reporter_1 = require("../reporters/console-reporter");
|
|
21
|
-
const json_reporter_1 = require("../reporters/json-reporter");
|
|
22
|
-
const sarif_reporter_1 = require("../reporters/sarif-reporter");
|
|
23
|
-
const junit_reporter_1 = require("../reporters/junit-reporter");
|
|
24
|
-
const github_actions_reporter_1 = require("../reporters/github-actions-reporter");
|
|
25
|
-
const review_1 = require("../packages/review");
|
|
26
|
-
exports.scanCommand = new commander_1.Command('scan')
|
|
27
|
-
.description('Scan workflow files for issues')
|
|
28
|
-
.argument('[path]', 'Directory to scan', '.')
|
|
29
|
-
.option('--config <path>', 'Path to .flowlint.yml config file')
|
|
30
|
-
.option('--format <format>', 'Output format: stylish|json|sarif|junit|github-actions', 'stylish')
|
|
31
|
-
.option('--out-file <path>', 'Write results to file (format inferred from extension or --format)')
|
|
32
|
-
.option('--fail-on-error', 'Exit with code 1 if errors found')
|
|
33
|
-
.action(async (scanPath, options) => {
|
|
34
|
-
try {
|
|
35
|
-
const absolutePath = path_1.default.resolve(process.cwd(), scanPath);
|
|
36
|
-
const configPath = options.config ? path_1.default.resolve(process.cwd(), options.config) : undefined;
|
|
37
|
-
// Determine format from options or file extension
|
|
38
|
-
let format = options.format;
|
|
39
|
-
if (options.outFile && !options.format) {
|
|
40
|
-
format = inferFormatFromFilename(options.outFile);
|
|
41
|
-
}
|
|
42
|
-
// Validate format
|
|
43
|
-
const validFormats = ['stylish', 'json', 'sarif', 'junit', 'github-actions'];
|
|
44
|
-
if (!validFormats.includes(format)) {
|
|
45
|
-
console.error(`Invalid format: ${format}. Valid formats: ${validFormats.join(', ')}`);
|
|
46
|
-
process.exit(2);
|
|
47
|
-
}
|
|
48
|
-
// Initialize providers
|
|
49
|
-
const fileSource = new local_file_source_1.LocalFileSource(absolutePath);
|
|
50
|
-
const configProvider = new local_config_provider_1.LocalConfigProvider(configPath);
|
|
51
|
-
// Choose reporter based on format
|
|
52
|
-
let reporter;
|
|
53
|
-
switch (format) {
|
|
54
|
-
case 'json':
|
|
55
|
-
reporter = new json_reporter_1.JsonReporter(options.outFile);
|
|
56
|
-
break;
|
|
57
|
-
case 'sarif':
|
|
58
|
-
reporter = new sarif_reporter_1.SarifReporter(options.outFile);
|
|
59
|
-
break;
|
|
60
|
-
case 'junit':
|
|
61
|
-
reporter = new junit_reporter_1.JunitReporter(options.outFile);
|
|
62
|
-
break;
|
|
63
|
-
case 'github-actions':
|
|
64
|
-
reporter = new github_actions_reporter_1.GithubActionsReporter();
|
|
65
|
-
break;
|
|
66
|
-
case 'stylish':
|
|
67
|
-
default:
|
|
68
|
-
reporter = new console_reporter_1.ConsoleReporter();
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
// Run analysis
|
|
72
|
-
const engine = new review_1.DefaultAnalysisEngine(fileSource, configProvider, reporter);
|
|
73
|
-
const summary = await engine.analyze();
|
|
74
|
-
// Exit with appropriate code
|
|
75
|
-
if (options.failOnError && summary.hasBlockingIssues) {
|
|
76
|
-
process.exit(1);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
console.error('Error:', error instanceof Error ? error.message : String(error));
|
|
81
|
-
process.exit(2);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
/**
|
|
85
|
-
* Infer output format from filename extension
|
|
86
|
-
*/
|
|
87
|
-
function inferFormatFromFilename(filename) {
|
|
88
|
-
const ext = path_1.default.extname(filename).toLowerCase();
|
|
89
|
-
switch (ext) {
|
|
90
|
-
case '.json':
|
|
91
|
-
// Check if it's SARIF based on filename
|
|
92
|
-
if (filename.includes('sarif')) {
|
|
93
|
-
return 'sarif';
|
|
94
|
-
}
|
|
95
|
-
return 'json';
|
|
96
|
-
case '.sarif':
|
|
97
|
-
return 'sarif';
|
|
98
|
-
case '.xml':
|
|
99
|
-
return 'junit';
|
|
100
|
-
default:
|
|
101
|
-
return 'json'; // Default to JSON
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=scan.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scan.js","sourceRoot":"","sources":["../../../../../apps/cli/src/commands/scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type { Octokit } from 'octokit';
|
|
2
|
-
export type FlowLintConfig = typeof defaultConfig;
|
|
3
|
-
export declare const defaultConfig: {
|
|
4
|
-
files: {
|
|
5
|
-
include: string[];
|
|
6
|
-
ignore: string[];
|
|
7
|
-
};
|
|
8
|
-
report: {
|
|
9
|
-
annotations: boolean;
|
|
10
|
-
summary_limit: number;
|
|
11
|
-
};
|
|
12
|
-
rules: {
|
|
13
|
-
rate_limit_retry: {
|
|
14
|
-
enabled: boolean;
|
|
15
|
-
max_concurrency: number;
|
|
16
|
-
default_retry: {
|
|
17
|
-
count: number;
|
|
18
|
-
strategy: string;
|
|
19
|
-
base_ms: number;
|
|
20
|
-
};
|
|
21
|
-
};
|
|
22
|
-
error_handling: {
|
|
23
|
-
enabled: boolean;
|
|
24
|
-
forbid_continue_on_fail: boolean;
|
|
25
|
-
};
|
|
26
|
-
idempotency: {
|
|
27
|
-
enabled: boolean;
|
|
28
|
-
key_field_candidates: string[];
|
|
29
|
-
};
|
|
30
|
-
secrets: {
|
|
31
|
-
enabled: boolean;
|
|
32
|
-
denylist_regex: string[];
|
|
33
|
-
};
|
|
34
|
-
dead_ends: {
|
|
35
|
-
enabled: boolean;
|
|
36
|
-
};
|
|
37
|
-
long_running: {
|
|
38
|
-
enabled: boolean;
|
|
39
|
-
max_iterations: number;
|
|
40
|
-
timeout_ms: number;
|
|
41
|
-
};
|
|
42
|
-
unused_data: {
|
|
43
|
-
enabled: boolean;
|
|
44
|
-
};
|
|
45
|
-
unhandled_error_path: {
|
|
46
|
-
enabled: boolean;
|
|
47
|
-
};
|
|
48
|
-
alert_log_enforcement: {
|
|
49
|
-
enabled: boolean;
|
|
50
|
-
};
|
|
51
|
-
deprecated_nodes: {
|
|
52
|
-
enabled: boolean;
|
|
53
|
-
};
|
|
54
|
-
naming_convention: {
|
|
55
|
-
enabled: boolean;
|
|
56
|
-
generic_names: string[];
|
|
57
|
-
};
|
|
58
|
-
config_literals: {
|
|
59
|
-
enabled: boolean;
|
|
60
|
-
denylist_regex: string[];
|
|
61
|
-
};
|
|
62
|
-
webhook_acknowledgment: {
|
|
63
|
-
enabled: boolean;
|
|
64
|
-
heavy_node_types: string[];
|
|
65
|
-
};
|
|
66
|
-
retry_after_compliance: {
|
|
67
|
-
enabled: boolean;
|
|
68
|
-
suggest_exponential_backoff: boolean;
|
|
69
|
-
suggest_jitter: boolean;
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
export declare function loadConfig(gh: Octokit, repoFull: string, sha: string): Promise<FlowLintConfig>;
|
|
@@ -1,120 +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.defaultConfig = void 0;
|
|
7
|
-
exports.loadConfig = loadConfig;
|
|
8
|
-
const yaml_1 = __importDefault(require("yaml"));
|
|
9
|
-
exports.defaultConfig = {
|
|
10
|
-
files: {
|
|
11
|
-
include: ['**/*.n8n.json', '**/workflows/*.json', '**/workflows/**/*.json', '**/*.n8n.yaml', '**/*.json'],
|
|
12
|
-
ignore: [
|
|
13
|
-
'samples/**',
|
|
14
|
-
'**/*.spec.json',
|
|
15
|
-
'node_modules/**',
|
|
16
|
-
'package*.json',
|
|
17
|
-
'tsconfig*.json',
|
|
18
|
-
'.flowlint.yml',
|
|
19
|
-
'.github/**',
|
|
20
|
-
'.husky/**',
|
|
21
|
-
'.vscode/**',
|
|
22
|
-
'infra/**',
|
|
23
|
-
'*.config.js',
|
|
24
|
-
'*.config.ts',
|
|
25
|
-
'**/*.lock',
|
|
26
|
-
],
|
|
27
|
-
},
|
|
28
|
-
report: { annotations: true, summary_limit: 25 },
|
|
29
|
-
rules: {
|
|
30
|
-
rate_limit_retry: {
|
|
31
|
-
enabled: true,
|
|
32
|
-
max_concurrency: 5,
|
|
33
|
-
default_retry: { count: 3, strategy: 'exponential', base_ms: 500 },
|
|
34
|
-
},
|
|
35
|
-
error_handling: { enabled: true, forbid_continue_on_fail: true },
|
|
36
|
-
idempotency: { enabled: true, key_field_candidates: ['eventId', 'messageId'] },
|
|
37
|
-
secrets: { enabled: true, denylist_regex: ['(?i)api[_-]?key', 'Bearer '] },
|
|
38
|
-
dead_ends: { enabled: true },
|
|
39
|
-
long_running: { enabled: true, max_iterations: 1000, timeout_ms: 300000 },
|
|
40
|
-
unused_data: { enabled: true },
|
|
41
|
-
unhandled_error_path: { enabled: true },
|
|
42
|
-
alert_log_enforcement: { enabled: true },
|
|
43
|
-
deprecated_nodes: { enabled: true },
|
|
44
|
-
naming_convention: {
|
|
45
|
-
enabled: true,
|
|
46
|
-
generic_names: ['http request', 'set', 'if', 'merge', 'switch', 'no-op', 'start'],
|
|
47
|
-
},
|
|
48
|
-
config_literals: {
|
|
49
|
-
enabled: true,
|
|
50
|
-
denylist_regex: [
|
|
51
|
-
'(?i)\\b(dev|development)\\b',
|
|
52
|
-
'(?i)\\b(stag|staging)\\b',
|
|
53
|
-
'(?i)\\b(prod|production)\\b',
|
|
54
|
-
'(?i)\\b(test|testing)\\b',
|
|
55
|
-
],
|
|
56
|
-
},
|
|
57
|
-
webhook_acknowledgment: {
|
|
58
|
-
enabled: true,
|
|
59
|
-
heavy_node_types: [
|
|
60
|
-
'n8n-nodes-base.httpRequest',
|
|
61
|
-
'n8n-nodes-base.postgres',
|
|
62
|
-
'n8n-nodes-base.mysql',
|
|
63
|
-
'n8n-nodes-base.mongodb',
|
|
64
|
-
'n8n-nodes-base.openAi',
|
|
65
|
-
'n8n-nodes-base.anthropic',
|
|
66
|
-
'n8n-nodes-base.huggingFace',
|
|
67
|
-
],
|
|
68
|
-
},
|
|
69
|
-
retry_after_compliance: {
|
|
70
|
-
enabled: true,
|
|
71
|
-
suggest_exponential_backoff: true,
|
|
72
|
-
suggest_jitter: true,
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
async function loadConfig(gh, repoFull, sha) {
|
|
77
|
-
const [owner, repo] = repoFull.split('/');
|
|
78
|
-
try {
|
|
79
|
-
const { data } = await gh.request('GET /repos/{owner}/{repo}/contents/{path}', {
|
|
80
|
-
owner,
|
|
81
|
-
repo,
|
|
82
|
-
path: '.flowlint.yml',
|
|
83
|
-
ref: sha,
|
|
84
|
-
});
|
|
85
|
-
if (!('content' in data))
|
|
86
|
-
return exports.defaultConfig;
|
|
87
|
-
const content = Buffer.from(data.content, 'base64').toString('utf8');
|
|
88
|
-
const parsed = yaml_1.default.parse(content) || {};
|
|
89
|
-
return deepMerge(exports.defaultConfig, parsed);
|
|
90
|
-
}
|
|
91
|
-
catch {
|
|
92
|
-
return exports.defaultConfig;
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
function deepMerge(base, override) {
|
|
96
|
-
const baseCopy = JSON.parse(JSON.stringify(base));
|
|
97
|
-
if (!override)
|
|
98
|
-
return baseCopy;
|
|
99
|
-
return mergeInto(baseCopy, override);
|
|
100
|
-
}
|
|
101
|
-
function mergeInto(target, source) {
|
|
102
|
-
for (const [key, value] of Object.entries(source)) {
|
|
103
|
-
if (value === undefined || value === null)
|
|
104
|
-
continue;
|
|
105
|
-
if (Array.isArray(value)) {
|
|
106
|
-
target[key] = value;
|
|
107
|
-
}
|
|
108
|
-
else if (typeof value === 'object') {
|
|
109
|
-
if (typeof target[key] !== 'object' || target[key] === null) {
|
|
110
|
-
target[key] = {};
|
|
111
|
-
}
|
|
112
|
-
mergeInto(target[key], value);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
target[key] = value;
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
return target;
|
|
119
|
-
}
|
|
120
|
-
//# sourceMappingURL=flowlint-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"flowlint-config.js","sourceRoot":"","sources":["../../../packages/config/flowlint-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
/**
|
|
18
|
-
* Config package exports
|
|
19
|
-
*/
|
|
20
|
-
__exportStar(require("./flowlint-config"), exports);
|
|
21
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/config/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA;;GAEG;AACH,oDAAkC"}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getInstallationClient = getInstallationClient;
|
|
4
|
-
const octokit_1 = require("octokit");
|
|
5
|
-
const plugin_paginate_rest_1 = require("@octokit/plugin-paginate-rest");
|
|
6
|
-
const auth_app_1 = require("@octokit/auth-app");
|
|
7
|
-
const logger_1 = require("../logger");
|
|
8
|
-
const observability_1 = require("../observability");
|
|
9
|
-
const appId = Number(process.env.APP_ID || 0);
|
|
10
|
-
const privateKeyBase64 = process.env.APP_PRIVATE_KEY_PEM_BASE64;
|
|
11
|
-
const privateKey = privateKeyBase64 ? Buffer.from(privateKeyBase64, 'base64').toString('utf8') : undefined;
|
|
12
|
-
if (!privateKey) {
|
|
13
|
-
logger_1.logger.warn('APP_PRIVATE_KEY_PEM_BASE64 is not set; GitHub auth will fail at runtime.');
|
|
14
|
-
}
|
|
15
|
-
// Octokit v4+ already includes retry and throttling plugins by default
|
|
16
|
-
const PaginatedOctokit = octokit_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest);
|
|
17
|
-
async function getInstallationClient(installationId) {
|
|
18
|
-
if (!privateKey) {
|
|
19
|
-
throw new Error('APP_PRIVATE_KEY_PEM_BASE64 is required to authenticate with GitHub.');
|
|
20
|
-
}
|
|
21
|
-
if (!appId) {
|
|
22
|
-
throw new Error('APP_ID is required to authenticate with GitHub.');
|
|
23
|
-
}
|
|
24
|
-
const client = new PaginatedOctokit({
|
|
25
|
-
authStrategy: auth_app_1.createAppAuth,
|
|
26
|
-
auth: {
|
|
27
|
-
appId,
|
|
28
|
-
privateKey,
|
|
29
|
-
installationId,
|
|
30
|
-
},
|
|
31
|
-
request: {
|
|
32
|
-
timeout: 30000, // 30 second timeout for all requests
|
|
33
|
-
hook: (request, options) => {
|
|
34
|
-
const startTime = Date.now();
|
|
35
|
-
const method = options.method?.toUpperCase() || 'UNKNOWN';
|
|
36
|
-
const endpoint = options.url || 'unknown';
|
|
37
|
-
return request(options)
|
|
38
|
-
.then((response) => {
|
|
39
|
-
// Track successful API calls
|
|
40
|
-
const status = response.status.toString();
|
|
41
|
-
observability_1.githubApiCallsCounter.labels(method, status, endpoint).inc();
|
|
42
|
-
logger_1.logger.debug({
|
|
43
|
-
method,
|
|
44
|
-
endpoint,
|
|
45
|
-
status,
|
|
46
|
-
duration: Date.now() - startTime,
|
|
47
|
-
}, 'GitHub API call succeeded');
|
|
48
|
-
return response;
|
|
49
|
-
})
|
|
50
|
-
.catch((error) => {
|
|
51
|
-
// Track failed API calls
|
|
52
|
-
const status = error.status?.toString() || 'error';
|
|
53
|
-
observability_1.githubApiCallsCounter.labels(method, status, endpoint).inc();
|
|
54
|
-
logger_1.logger.warn({
|
|
55
|
-
method,
|
|
56
|
-
endpoint,
|
|
57
|
-
status,
|
|
58
|
-
duration: Date.now() - startTime,
|
|
59
|
-
error: error.message,
|
|
60
|
-
}, 'GitHub API call failed');
|
|
61
|
-
throw error;
|
|
62
|
-
});
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
retry: {
|
|
66
|
-
enabled: true,
|
|
67
|
-
// Retry on network errors, 5xx, and rate limit errors
|
|
68
|
-
retries: 3,
|
|
69
|
-
doNotRetry: [400, 401, 403, 404, 422], // Don't retry client errors
|
|
70
|
-
},
|
|
71
|
-
throttle: {
|
|
72
|
-
onRateLimit: (retryAfter, options, octokit) => {
|
|
73
|
-
logger_1.logger.warn({
|
|
74
|
-
method: options.method,
|
|
75
|
-
url: options.url,
|
|
76
|
-
retryAfter,
|
|
77
|
-
}, 'GitHub rate limit hit, retrying');
|
|
78
|
-
// Retry once after rate limit
|
|
79
|
-
return retryAfter < 60;
|
|
80
|
-
},
|
|
81
|
-
onSecondaryRateLimit: (retryAfter, options, octokit) => {
|
|
82
|
-
logger_1.logger.warn({
|
|
83
|
-
method: options.method,
|
|
84
|
-
url: options.url,
|
|
85
|
-
retryAfter,
|
|
86
|
-
}, 'GitHub secondary rate limit hit');
|
|
87
|
-
// Don't retry on secondary rate limits (abuse detection)
|
|
88
|
-
return false;
|
|
89
|
-
},
|
|
90
|
-
},
|
|
91
|
-
});
|
|
92
|
-
return client;
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../packages/github/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import pino from 'pino';
|
|
2
|
-
export declare const logger: pino.Logger<never, boolean>;
|
|
3
|
-
/**
|
|
4
|
-
* Create a child logger with additional context.
|
|
5
|
-
* Use this to add correlation IDs, request IDs, or other contextual metadata.
|
|
6
|
-
*/
|
|
7
|
-
export declare function createChildLogger(context: Record<string, unknown>): pino.Logger<never, boolean>;
|
|
8
|
-
/**
|
|
9
|
-
* Create a logger with correlation ID for tracking requests across API → Queue → Worker.
|
|
10
|
-
*/
|
|
11
|
-
export declare function createCorrelatedLogger(correlationId: string, additionalContext?: Record<string, unknown>): pino.Logger<never, boolean>;
|