flowlint 0.5.3 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/README.md +45 -355
  2. package/dist/cli.js +8053 -21
  3. package/dist/cli.js.map +1 -1
  4. package/package.json +52 -57
  5. package/dist/cli.d.ts +0 -8
  6. package/dist/commands/init.d.ts +0 -8
  7. package/dist/commands/init.js +0 -34
  8. package/dist/commands/init.js.map +0 -1
  9. package/dist/commands/scan.d.ts +0 -11
  10. package/dist/commands/scan.js +0 -104
  11. package/dist/commands/scan.js.map +0 -1
  12. package/dist/packages/config/flowlint-config.d.ts +0 -73
  13. package/dist/packages/config/flowlint-config.js +0 -120
  14. package/dist/packages/config/flowlint-config.js.map +0 -1
  15. package/dist/packages/config/index.d.ts +0 -4
  16. package/dist/packages/config/index.js +0 -21
  17. package/dist/packages/config/index.js.map +0 -1
  18. package/dist/packages/github/client.d.ts +0 -2
  19. package/dist/packages/github/client.js +0 -94
  20. package/dist/packages/github/client.js.map +0 -1
  21. package/dist/packages/logger/index.d.ts +0 -11
  22. package/dist/packages/logger/index.js +0 -40
  23. package/dist/packages/logger/index.js.map +0 -1
  24. package/dist/packages/observability/collectors.d.ts +0 -40
  25. package/dist/packages/observability/collectors.js +0 -75
  26. package/dist/packages/observability/collectors.js.map +0 -1
  27. package/dist/packages/observability/index.d.ts +0 -10
  28. package/dist/packages/observability/index.js +0 -35
  29. package/dist/packages/observability/index.js.map +0 -1
  30. package/dist/packages/observability/metrics.d.ts +0 -119
  31. package/dist/packages/observability/metrics.js +0 -194
  32. package/dist/packages/observability/metrics.js.map +0 -1
  33. package/dist/packages/observability/middleware.d.ts +0 -32
  34. package/dist/packages/observability/middleware.js +0 -58
  35. package/dist/packages/observability/middleware.js.map +0 -1
  36. package/dist/packages/review/analysis-engine.d.ts +0 -19
  37. package/dist/packages/review/analysis-engine.js +0 -111
  38. package/dist/packages/review/analysis-engine.js.map +0 -1
  39. package/dist/packages/review/index.d.ts +0 -12
  40. package/dist/packages/review/index.js +0 -29
  41. package/dist/packages/review/index.js.map +0 -1
  42. package/dist/packages/review/parser-n8n.d.ts +0 -2
  43. package/dist/packages/review/parser-n8n.js +0 -122
  44. package/dist/packages/review/parser-n8n.js.map +0 -1
  45. package/dist/packages/review/providers/github.d.ts +0 -62
  46. package/dist/packages/review/providers/github.js +0 -275
  47. package/dist/packages/review/providers/github.js.map +0 -1
  48. package/dist/packages/review/providers.d.ts +0 -106
  49. package/dist/packages/review/providers.js +0 -12
  50. package/dist/packages/review/providers.js.map +0 -1
  51. package/dist/packages/review/reporter.d.ts +0 -17
  52. package/dist/packages/review/reporter.js +0 -59
  53. package/dist/packages/review/reporter.js.map +0 -1
  54. package/dist/packages/review/rules/index.d.ts +0 -9
  55. package/dist/packages/review/rules/index.js +0 -415
  56. package/dist/packages/review/rules/index.js.map +0 -1
  57. package/dist/packages/review/rules/rule-utils.d.ts +0 -36
  58. package/dist/packages/review/rules/rule-utils.js +0 -75
  59. package/dist/packages/review/rules/rule-utils.js.map +0 -1
  60. package/dist/packages/review/schemas/index.d.ts +0 -17
  61. package/dist/packages/review/schemas/index.js +0 -167
  62. package/dist/packages/review/schemas/index.js.map +0 -1
  63. package/dist/packages/review/schemas/n8n-workflow.schema.json +0 -177
  64. package/dist/packages/review/sniffer.d.ts +0 -15
  65. package/dist/packages/review/sniffer.js +0 -47
  66. package/dist/packages/review/sniffer.js.map +0 -1
  67. package/dist/packages/review/types.d.ts +0 -40
  68. package/dist/packages/review/types.js +0 -3
  69. package/dist/packages/review/types.js.map +0 -1
  70. package/dist/packages/review/utils/findings.d.ts +0 -23
  71. package/dist/packages/review/utils/findings.js +0 -34
  72. package/dist/packages/review/utils/findings.js.map +0 -1
  73. package/dist/packages/review/utils/merge.d.ts +0 -12
  74. package/dist/packages/review/utils/merge.js +0 -40
  75. package/dist/packages/review/utils/merge.js.map +0 -1
  76. package/dist/packages/review/utils.d.ts +0 -60
  77. package/dist/packages/review/utils.js +0 -214
  78. package/dist/packages/review/utils.js.map +0 -1
  79. package/dist/packages/tracing/github-tracer.d.ts +0 -38
  80. package/dist/packages/tracing/github-tracer.js +0 -79
  81. package/dist/packages/tracing/github-tracer.js.map +0 -1
  82. package/dist/packages/tracing/index.d.ts +0 -81
  83. package/dist/packages/tracing/index.js +0 -240
  84. package/dist/packages/tracing/index.js.map +0 -1
  85. package/dist/packages/tracing/tracer.d.ts +0 -30
  86. package/dist/packages/tracing/tracer.js +0 -141
  87. package/dist/packages/tracing/tracer.js.map +0 -1
  88. package/dist/providers/local-config-provider.d.ts +0 -11
  89. package/dist/providers/local-config-provider.js +0 -39
  90. package/dist/providers/local-config-provider.js.map +0 -1
  91. package/dist/providers/local-file-source.d.ts +0 -13
  92. package/dist/providers/local-file-source.js +0 -47
  93. package/dist/providers/local-file-source.js.map +0 -1
  94. package/dist/reporters/console-reporter.d.ts +0 -8
  95. package/dist/reporters/console-reporter.js +0 -75
  96. package/dist/reporters/console-reporter.js.map +0 -1
  97. package/dist/reporters/github-actions-reporter.d.ts +0 -30
  98. package/dist/reporters/github-actions-reporter.js +0 -104
  99. package/dist/reporters/github-actions-reporter.js.map +0 -1
  100. package/dist/reporters/json-reporter.d.ts +0 -14
  101. package/dist/reporters/json-reporter.js +0 -57
  102. package/dist/reporters/json-reporter.js.map +0 -1
  103. package/dist/reporters/junit-reporter.d.ts +0 -25
  104. package/dist/reporters/junit-reporter.js +0 -142
  105. package/dist/reporters/junit-reporter.js.map +0 -1
  106. package/dist/reporters/sarif-reporter.d.ts +0 -21
  107. package/dist/reporters/sarif-reporter.js +0 -125
  108. package/dist/reporters/sarif-reporter.js.map +0 -1
package/package.json CHANGED
@@ -1,57 +1,52 @@
1
- {
2
- "name": "flowlint",
3
- "version": "0.5.3",
4
- "description": "Static analysis tool for n8n workflows - detect issues early, fix them faster",
5
- "license": "MIT",
6
- "type": "commonjs",
7
- "main": "dist/cli.js",
8
- "bin": {
9
- "flowlint": "dist/cli.js"
10
- },
11
- "files": [
12
- "dist",
13
- "README.md",
14
- "LICENSE"
15
- ],
16
- "scripts": {
17
- "dev": "ts-node --project ../../tsconfig.json src/cli.ts",
18
- "build": "tsc --project ../../tsconfig.json",
19
- "test": "vitest run"
20
- },
21
- "dependencies": {
22
- "ajv": "^8.17.1",
23
- "ajv-formats": "^3.0.1",
24
- "commander": "^12.1.0",
25
- "dotenv": "^16.4.0",
26
- "glob": "^10.3.10",
27
- "micromatch": "^4.0.8",
28
- "pino": "^10.1.0",
29
- "pino-pretty": "^13.1.2",
30
- "xmlbuilder2": "^4.0.3",
31
- "yaml": "^2.4.0"
32
- },
33
- "keywords": [
34
- "n8n",
35
- "workflow",
36
- "linter",
37
- "static-analysis",
38
- "automation",
39
- "cli"
40
- ],
41
- "author": "Replikanti",
42
- "repository": {
43
- "type": "git",
44
- "url": "https://github.com/Replikanti/flowlint-app",
45
- "directory": "apps/cli"
46
- },
47
- "bugs": {
48
- "url": "https://github.com/Replikanti/flowlint-app/issues"
49
- },
50
- "homepage": "https://flowlint.dev",
51
- "engines": {
52
- "node": ">=22"
53
- },
54
- "publishConfig": {
55
- "access": "public"
56
- }
57
- }
1
+ {
2
+ "name": "flowlint",
3
+ "version": "0.6.1",
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": ">=18"
37
+ },
38
+ "dependencies": {
39
+ "commander": "^12.1.0",
40
+ "glob": "^10.3.10",
41
+ "picocolors": "^1.0.0",
42
+ "yaml": "^2.8.2"
43
+ },
44
+ "devDependencies": {
45
+ "@replikanti/flowlint-core": "^0.6.1",
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
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * FlowLint CLI
4
- *
5
- * A command-line tool for static analysis of n8n workflow files.
6
- * Can be used locally, in CI pipelines, or pre-commit hooks.
7
- */
8
- export {};
@@ -1,8 +0,0 @@
1
- /**
2
- * init command - Create a .flowlint.yml configuration file interactively
3
- *
4
- * Usage:
5
- * flowlint init
6
- */
7
- import { Command } from 'commander';
8
- export declare const initCommand: Command;
@@ -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"}
@@ -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;
@@ -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":";;;;;;AAyEA,gCAgBC;AAzFD,gDAAwB;AAKX,QAAA,aAAa,GAAG;IAC3B,KAAK,EAAE;QACL,OAAO,EAAE,CAAC,eAAe,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,eAAe,EAAE,WAAW,CAAC;QACzG,MAAM,EAAE;YACN,YAAY;YACZ,gBAAgB;YAChB,iBAAiB;YACjB,eAAe;YACf,gBAAgB;YAChB,eAAe;YACf,YAAY;YACZ,WAAW;YACX,YAAY;YACZ,UAAU;YACV,aAAa;YACb,aAAa;YACb,WAAW;SACZ;KACF;IACD,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE;IAChD,KAAK,EAAE;QACL,gBAAgB,EAAE;YAChB,OAAO,EAAE,IAAI;YACb,eAAe,EAAE,CAAC;YAClB,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;SACnE;QACD,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,IAAI,EAAE;QAChE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;QAC9E,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,iBAAiB,EAAE,SAAS,CAAC,EAAE;QAC1E,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC5B,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE;QACzE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAC9B,oBAAoB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,qBAAqB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACxC,gBAAgB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QACnC,iBAAiB,EAAE;YACjB,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC;SAClF;QACD,eAAe,EAAE;YACf,OAAO,EAAE,IAAI;YACb,cAAc,EAAE;gBACd,6BAA6B;gBAC7B,0BAA0B;gBAC1B,6BAA6B;gBAC7B,0BAA0B;aAC3B;SACF;QACD,sBAAsB,EAAE;YACtB,OAAO,EAAE,IAAI;YACb,gBAAgB,EAAE;gBAChB,4BAA4B;gBAC5B,yBAAyB;gBACzB,sBAAsB;gBACtB,wBAAwB;gBACxB,uBAAuB;gBACvB,0BAA0B;gBAC1B,4BAA4B;aAC7B;SACF;QACD,sBAAsB,EAAE;YACtB,OAAO,EAAE,IAAI;YACb,2BAA2B,EAAE,IAAI;YACjC,cAAc,EAAE,IAAI;SACrB;KACF;CACF,CAAC;AAEK,KAAK,UAAU,UAAU,CAAC,EAAW,EAAE,QAAgB,EAAE,GAAW;IACzE,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,2CAA2C,EAAE;YAC7E,KAAK;YACL,IAAI;YACJ,IAAI,EAAE,eAAe;YACrB,GAAG,EAAE,GAAG;SACT,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,SAAS,IAAI,IAAI,CAAC;YAAE,OAAO,qBAAa,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAE,IAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9E,MAAM,MAAM,GAAI,cAAI,CAAC,KAAK,CAAC,OAAO,CAA6B,IAAI,EAAE,CAAC;QACtE,OAAO,SAAS,CAAC,qBAAa,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,qBAAa,CAAC;IACvB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAI,IAAO,EAAE,QAAiC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC/B,OAAO,SAAS,CAAC,QAAe,EAAE,QAAQ,CAAM,CAAC;AACnD,CAAC;AAED,SAAS,SAAS,CAAC,MAA+B,EAAE,MAA+B;IACjF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;YAAE,SAAS;QACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAC5D,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACnB,CAAC;YACD,SAAS,CAAC,MAAM,CAAC,GAAG,CAA4B,EAAE,KAAgC,CAAC,CAAC;QACtF,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,4 +0,0 @@
1
- /**
2
- * Config package exports
3
- */
4
- export * from './flowlint-config';
@@ -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,2 +0,0 @@
1
- import { Octokit } from 'octokit';
2
- export declare function getInstallationClient(installationId: number): Promise<Octokit>;
@@ -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>;