flowlint 0.1.3 → 0.3.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 (99) hide show
  1. package/dist/{apps/cli/src/cli.d.ts → cli.d.ts} +0 -0
  2. package/dist/{apps/cli/src/cli.js → cli.js} +0 -0
  3. package/dist/{apps/cli/src/cli.js.map → cli.js.map} +0 -0
  4. package/dist/{apps/cli/src/commands → commands}/init.d.ts +0 -0
  5. package/dist/{apps/cli/src/commands → commands}/init.js +0 -0
  6. package/dist/{apps/cli/src/commands → commands}/init.js.map +0 -0
  7. package/dist/{apps/cli/src/commands → commands}/scan.d.ts +0 -0
  8. package/dist/{apps/cli/src/commands → commands}/scan.js +0 -0
  9. package/dist/{apps/cli/src/commands → commands}/scan.js.map +0 -0
  10. package/dist/{apps/cli/src/providers → providers}/local-config-provider.d.ts +0 -0
  11. package/dist/{apps/cli/src/providers → providers}/local-config-provider.js +0 -0
  12. package/dist/{apps/cli/src/providers → providers}/local-config-provider.js.map +0 -0
  13. package/dist/{apps/cli/src/providers → providers}/local-file-source.d.ts +0 -0
  14. package/dist/{apps/cli/src/providers → providers}/local-file-source.js +0 -0
  15. package/dist/{apps/cli/src/providers → providers}/local-file-source.js.map +0 -0
  16. package/dist/{apps/cli/src/reporters → reporters}/console-reporter.d.ts +0 -0
  17. package/dist/{apps/cli/src/reporters → reporters}/console-reporter.js +3 -0
  18. package/dist/{apps/cli/src/reporters → reporters}/console-reporter.js.map +1 -1
  19. package/dist/{apps/cli/src/reporters → reporters}/json-reporter.d.ts +0 -0
  20. package/dist/{apps/cli/src/reporters → reporters}/json-reporter.js +0 -0
  21. package/dist/{apps/cli/src/reporters → reporters}/json-reporter.js.map +0 -0
  22. package/package.json +26 -32
  23. package/README.md +0 -45
  24. package/dist/packages/config/flowlint-config.d.ts +0 -64
  25. package/dist/packages/config/flowlint-config.js +0 -103
  26. package/dist/packages/config/flowlint-config.js.map +0 -1
  27. package/dist/packages/config/index.d.ts +0 -4
  28. package/dist/packages/config/index.js +0 -21
  29. package/dist/packages/config/index.js.map +0 -1
  30. package/dist/packages/github/client.d.ts +0 -2
  31. package/dist/packages/github/client.js +0 -94
  32. package/dist/packages/github/client.js.map +0 -1
  33. package/dist/packages/logger/index.d.ts +0 -11
  34. package/dist/packages/logger/index.js +0 -40
  35. package/dist/packages/logger/index.js.map +0 -1
  36. package/dist/packages/observability/collectors.d.ts +0 -40
  37. package/dist/packages/observability/collectors.js +0 -75
  38. package/dist/packages/observability/collectors.js.map +0 -1
  39. package/dist/packages/observability/index.d.ts +0 -10
  40. package/dist/packages/observability/index.js +0 -35
  41. package/dist/packages/observability/index.js.map +0 -1
  42. package/dist/packages/observability/metrics.d.ts +0 -119
  43. package/dist/packages/observability/metrics.js +0 -194
  44. package/dist/packages/observability/metrics.js.map +0 -1
  45. package/dist/packages/observability/middleware.d.ts +0 -32
  46. package/dist/packages/observability/middleware.js +0 -58
  47. package/dist/packages/observability/middleware.js.map +0 -1
  48. package/dist/packages/review/analysis-engine.d.ts +0 -19
  49. package/dist/packages/review/analysis-engine.js +0 -106
  50. package/dist/packages/review/analysis-engine.js.map +0 -1
  51. package/dist/packages/review/index.d.ts +0 -12
  52. package/dist/packages/review/index.js +0 -29
  53. package/dist/packages/review/index.js.map +0 -1
  54. package/dist/packages/review/parser-n8n.d.ts +0 -2
  55. package/dist/packages/review/parser-n8n.js +0 -118
  56. package/dist/packages/review/parser-n8n.js.map +0 -1
  57. package/dist/packages/review/providers/github.d.ts +0 -62
  58. package/dist/packages/review/providers/github.js +0 -275
  59. package/dist/packages/review/providers/github.js.map +0 -1
  60. package/dist/packages/review/providers.d.ts +0 -106
  61. package/dist/packages/review/providers.js +0 -12
  62. package/dist/packages/review/providers.js.map +0 -1
  63. package/dist/packages/review/reporter.d.ts +0 -17
  64. package/dist/packages/review/reporter.js +0 -53
  65. package/dist/packages/review/reporter.js.map +0 -1
  66. package/dist/packages/review/rules/index.d.ts +0 -9
  67. package/dist/packages/review/rules/index.js +0 -313
  68. package/dist/packages/review/rules/index.js.map +0 -1
  69. package/dist/packages/review/rules/rule-utils.d.ts +0 -36
  70. package/dist/packages/review/rules/rule-utils.js +0 -75
  71. package/dist/packages/review/rules/rule-utils.js.map +0 -1
  72. package/dist/packages/review/schemas/index.d.ts +0 -17
  73. package/dist/packages/review/schemas/index.js +0 -139
  74. package/dist/packages/review/schemas/index.js.map +0 -1
  75. package/dist/packages/review/schemas/n8n-workflow.schema.json +0 -177
  76. package/dist/packages/review/sniffer.d.ts +0 -15
  77. package/dist/packages/review/sniffer.js +0 -47
  78. package/dist/packages/review/sniffer.js.map +0 -1
  79. package/dist/packages/review/types.d.ts +0 -37
  80. package/dist/packages/review/types.js +0 -3
  81. package/dist/packages/review/types.js.map +0 -1
  82. package/dist/packages/review/utils/findings.d.ts +0 -23
  83. package/dist/packages/review/utils/findings.js +0 -34
  84. package/dist/packages/review/utils/findings.js.map +0 -1
  85. package/dist/packages/review/utils/merge.d.ts +0 -12
  86. package/dist/packages/review/utils/merge.js +0 -40
  87. package/dist/packages/review/utils/merge.js.map +0 -1
  88. package/dist/packages/review/utils.d.ts +0 -58
  89. package/dist/packages/review/utils.js +0 -208
  90. package/dist/packages/review/utils.js.map +0 -1
  91. package/dist/packages/tracing/github-tracer.d.ts +0 -38
  92. package/dist/packages/tracing/github-tracer.js +0 -79
  93. package/dist/packages/tracing/github-tracer.js.map +0 -1
  94. package/dist/packages/tracing/index.d.ts +0 -81
  95. package/dist/packages/tracing/index.js +0 -240
  96. package/dist/packages/tracing/index.js.map +0 -1
  97. package/dist/packages/tracing/tracer.d.ts +0 -30
  98. package/dist/packages/tracing/tracer.js +0 -141
  99. package/dist/packages/tracing/tracer.js.map +0 -1
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -39,6 +39,9 @@ class ConsoleReporter {
39
39
  const severity = finding.severity.toUpperCase();
40
40
  console.log(` ${severityColor}${severity}${colors.reset} ${colors.bold}${finding.rule}${colors.reset} ${finding.message}`);
41
41
  console.log(` at ${colors.gray}${path}${line}${colors.reset}`);
42
+ if (finding.documentationUrl) {
43
+ console.log(` ${colors.blue}→ See examples: ${finding.documentationUrl}${colors.reset}`);
44
+ }
42
45
  if (finding.raw_details) {
43
46
  const details = finding.raw_details.split('\n').slice(0, 3);
44
47
  for (const detail of details) {
@@ -1 +1 @@
1
- {"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../../../apps/cli/src/reporters/console-reporter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../../../apps/cli/src/reporters/console-reporter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,51 +1,45 @@
1
1
  {
2
2
  "name": "flowlint",
3
- "version": "0.1.3",
4
- "description": "FlowLint CLI - Static analysis for n8n workflows",
3
+ "version": "0.3.1",
4
+ "description": "Static analysis tool for n8n workflows - detect issues early, fix them faster",
5
5
  "license": "MIT",
6
6
  "type": "commonjs",
7
+ "main": "dist/cli.js",
7
8
  "bin": {
8
- "flowlint": "dist/apps/cli/src/cli.js"
9
+ "flowlint": "dist/cli.js"
9
10
  },
11
+ "files": [
12
+ "dist",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
10
16
  "scripts": {
11
- "prepublishOnly": "node ../../scripts/prepare-cli-publish.js"
12
- },
13
- "publishConfig": {
14
- "access": "public",
15
- "registry": "https://registry.npmjs.org"
16
- },
17
- "repository": {
18
- "type": "git",
19
- "url": "https://github.com/Replikanti/flowlint.git",
20
- "directory": "packages/cli"
17
+ "dev": "ts-node --project ../../tsconfig.json src/cli.ts",
18
+ "build": "tsc --project ../../tsconfig.json",
19
+ "test": "vitest run"
21
20
  },
22
21
  "keywords": [
23
22
  "n8n",
24
23
  "workflow",
25
24
  "linter",
26
25
  "static-analysis",
26
+ "automation",
27
27
  "cli"
28
28
  ],
29
- "engines": {
30
- "node": ">=22"
29
+ "author": "Replikanti",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "https://github.com/Replikanti/flowlint-app",
33
+ "directory": "apps/cli"
31
34
  },
32
- "dependencies": {
33
- "ajv": "^8.17.1",
34
- "ajv-draft-04": "^1.0.0",
35
- "ajv-formats": "^3.0.1",
36
- "commander": "^12.1.0",
37
- "dotenv": "^16.4.0",
38
- "glob": "^10.3.10",
39
- "micromatch": "^4.0.8",
40
- "pino": "^10.1.0",
41
- "yaml": "^2.4.0"
35
+ "bugs": {
36
+ "url": "https://github.com/Replikanti/flowlint-app/issues"
42
37
  },
43
- "devDependencies": {
44
- "@types/node": "^22.0.0",
45
- "typescript": "^5.4.0"
38
+ "homepage": "https://flowlint.dev",
39
+ "engines": {
40
+ "node": ">=22"
46
41
  },
47
- "files": [
48
- "dist/",
49
- "README.md"
50
- ]
42
+ "publishConfig": {
43
+ "access": "public"
44
+ }
51
45
  }
package/README.md DELETED
@@ -1,45 +0,0 @@
1
- # @flowlint/cli
2
-
3
- Static analysis for n8n workflow files. Detect missing retries, error handling, security issues, and more.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install -g @flowlint/cli
9
- flowlint --help
10
- ```
11
-
12
- ## Quick Start
13
-
14
- ```bash
15
- # Scan workflows in current directory
16
- flowlint scan
17
-
18
- # Scan specific directory with JSON output
19
- flowlint scan ./workflows --format json --out-file report.json
20
-
21
- # Fail if any MUST-severity issues found (for CI/CD)
22
- flowlint scan ./workflows --fail-on-error
23
- ```
24
-
25
- ## Configuration
26
-
27
- Create `.flowlint.yml` in your project:
28
-
29
- ```yaml
30
- files:
31
- include:
32
- - "**/*.n8n.json"
33
- ignore:
34
- - "node_modules/**"
35
-
36
- rules:
37
- rate_limit_retry:
38
- enabled: true
39
- error_handling:
40
- enabled: true
41
- ```
42
-
43
- ## License
44
-
45
- MIT
@@ -1,64 +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
- };
63
- };
64
- export declare function loadConfig(gh: Octokit, repoFull: string, sha: string): Promise<FlowLintConfig>;
@@ -1,103 +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
- },
58
- };
59
- async function loadConfig(gh, repoFull, sha) {
60
- const [owner, repo] = repoFull.split('/');
61
- try {
62
- const { data } = await gh.request('GET /repos/{owner}/{repo}/contents/{path}', {
63
- owner,
64
- repo,
65
- path: '.flowlint.yml',
66
- ref: sha,
67
- });
68
- if (!('content' in data))
69
- return exports.defaultConfig;
70
- const content = Buffer.from(data.content, 'base64').toString('utf8');
71
- const parsed = yaml_1.default.parse(content) || {};
72
- return deepMerge(exports.defaultConfig, parsed);
73
- }
74
- catch {
75
- return exports.defaultConfig;
76
- }
77
- }
78
- function deepMerge(base, override) {
79
- const baseCopy = JSON.parse(JSON.stringify(base));
80
- if (!override)
81
- return baseCopy;
82
- return mergeInto(baseCopy, override);
83
- }
84
- function mergeInto(target, source) {
85
- for (const [key, value] of Object.entries(source)) {
86
- if (value === undefined || value === null)
87
- continue;
88
- if (Array.isArray(value)) {
89
- target[key] = value;
90
- }
91
- else if (typeof value === 'object') {
92
- if (typeof target[key] !== 'object' || target[key] === null) {
93
- target[key] = {};
94
- }
95
- mergeInto(target[key], value);
96
- }
97
- else {
98
- target[key] = value;
99
- }
100
- }
101
- return target;
102
- }
103
- //# 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,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>;
@@ -1,40 +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.logger = void 0;
7
- exports.createChildLogger = createChildLogger;
8
- exports.createCorrelatedLogger = createCorrelatedLogger;
9
- const pino_1 = __importDefault(require("pino"));
10
- // Create base logger with environment-aware configuration
11
- exports.logger = (0, pino_1.default)({
12
- level: process.env.LOG_LEVEL || 'info',
13
- transport: process.env.NODE_ENV === 'development'
14
- ? {
15
- target: 'pino-pretty',
16
- options: {
17
- colorize: true,
18
- translateTime: 'HH:MM:ss',
19
- ignore: 'pid,hostname',
20
- },
21
- }
22
- : undefined,
23
- });
24
- /**
25
- * Create a child logger with additional context.
26
- * Use this to add correlation IDs, request IDs, or other contextual metadata.
27
- */
28
- function createChildLogger(context) {
29
- return exports.logger.child(context);
30
- }
31
- /**
32
- * Create a logger with correlation ID for tracking requests across API → Queue → Worker.
33
- */
34
- function createCorrelatedLogger(correlationId, additionalContext) {
35
- return exports.logger.child({
36
- correlationId,
37
- ...additionalContext,
38
- });
39
- }
40
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../packages/logger/index.ts"],"names":[],"mappings":";;;;;;AAsBA,8CAEC;AAKD,wDAKC;AAlCD,gDAAwB;AAExB,0DAA0D;AAC7C,QAAA,MAAM,GAAG,IAAA,cAAI,EAAC;IACzB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;IACtC,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa;QACpC,CAAC,CAAC;YACE,MAAM,EAAE,aAAa;YACrB,OAAO,EAAE;gBACP,QAAQ,EAAE,IAAI;gBACd,aAAa,EAAE,UAAU;gBACzB,MAAM,EAAE,cAAc;aACvB;SACF;QACH,CAAC,CAAC,SAAS;CAChB,CAAC,CAAC;AAEH;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,OAAgC;IAChE,OAAO,cAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,aAAqB,EAAE,iBAA2C;IACvG,OAAO,cAAM,CAAC,KAAK,CAAC;QAClB,aAAa;QACb,GAAG,iBAAiB;KACrB,CAAC,CAAC;AACL,CAAC"}
@@ -1,40 +0,0 @@
1
- /**
2
- * Metric Collectors for FlowLint
3
- *
4
- * This module implements periodic metric collectors that query external systems
5
- * (e.g., BullMQ queue) and update gauge metrics.
6
- *
7
- * @module packages/observability/collectors
8
- */
9
- import { Queue } from 'bullmq';
10
- /**
11
- * Queue Metrics Collector
12
- *
13
- * Periodically queries BullMQ queue for depth by state and updates Prometheus gauges.
14
- * Runs every 10 seconds to provide near-real-time queue visibility.
15
- *
16
- * @param queue - BullMQ queue instance
17
- * @returns Interval timer (for cleanup)
18
- *
19
- * @example
20
- * import { Queue } from 'bullmq';
21
- * import { startQueueMetricsCollector } from './packages/observability/collectors';
22
- *
23
- * const queue = new Queue('pr-review', { connection: redis });
24
- * const collectorInterval = startQueueMetricsCollector(queue);
25
- *
26
- * // Later, to stop collector:
27
- * clearInterval(collectorInterval);
28
- */
29
- export declare function startQueueMetricsCollector(queue: Queue<any>): NodeJS.Timeout;
30
- /**
31
- * Stop queue metrics collector
32
- *
33
- * Clears the interval timer to stop metric collection.
34
- *
35
- * @param interval - Interval timer from startQueueMetricsCollector
36
- *
37
- * @example
38
- * stopQueueMetricsCollector(collectorInterval);
39
- */
40
- export declare function stopQueueMetricsCollector(interval: NodeJS.Timeout): void;