flowlint 0.1.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/README.md +49 -0
  2. package/dist/apps/cli/src/cli.d.ts +8 -0
  3. package/dist/apps/cli/src/cli.js +27 -0
  4. package/dist/apps/cli/src/cli.js.map +1 -0
  5. package/dist/apps/cli/src/commands/init.d.ts +8 -0
  6. package/dist/apps/cli/src/commands/init.js +34 -0
  7. package/dist/apps/cli/src/commands/init.js.map +1 -0
  8. package/dist/apps/cli/src/commands/scan.d.ts +11 -0
  9. package/dist/apps/cli/src/commands/scan.js +59 -0
  10. package/dist/apps/cli/src/commands/scan.js.map +1 -0
  11. package/dist/apps/cli/src/providers/local-config-provider.d.ts +11 -0
  12. package/dist/apps/cli/src/providers/local-config-provider.js +39 -0
  13. package/dist/apps/cli/src/providers/local-config-provider.js.map +1 -0
  14. package/dist/apps/cli/src/providers/local-file-source.d.ts +13 -0
  15. package/dist/apps/cli/src/providers/local-file-source.js +47 -0
  16. package/dist/apps/cli/src/providers/local-file-source.js.map +1 -0
  17. package/dist/apps/cli/src/reporters/console-reporter.d.ts +8 -0
  18. package/dist/apps/cli/src/reporters/console-reporter.js +72 -0
  19. package/dist/apps/cli/src/reporters/console-reporter.js.map +1 -0
  20. package/dist/apps/cli/src/reporters/json-reporter.d.ts +14 -0
  21. package/dist/apps/cli/src/reporters/json-reporter.js +57 -0
  22. package/dist/apps/cli/src/reporters/json-reporter.js.map +1 -0
  23. package/dist/packages/config/flowlint-config.d.ts +64 -0
  24. package/dist/packages/config/flowlint-config.js +103 -0
  25. package/dist/packages/config/flowlint-config.js.map +1 -0
  26. package/dist/packages/config/index.d.ts +4 -0
  27. package/dist/packages/config/index.js +21 -0
  28. package/dist/packages/config/index.js.map +1 -0
  29. package/dist/packages/github/client.d.ts +2 -0
  30. package/dist/packages/github/client.js +94 -0
  31. package/dist/packages/github/client.js.map +1 -0
  32. package/dist/packages/logger/index.d.ts +11 -0
  33. package/dist/packages/logger/index.js +40 -0
  34. package/dist/packages/logger/index.js.map +1 -0
  35. package/dist/packages/observability/collectors.d.ts +40 -0
  36. package/dist/packages/observability/collectors.js +75 -0
  37. package/dist/packages/observability/collectors.js.map +1 -0
  38. package/dist/packages/observability/index.d.ts +10 -0
  39. package/dist/packages/observability/index.js +35 -0
  40. package/dist/packages/observability/index.js.map +1 -0
  41. package/dist/packages/observability/metrics.d.ts +119 -0
  42. package/dist/packages/observability/metrics.js +194 -0
  43. package/dist/packages/observability/metrics.js.map +1 -0
  44. package/dist/packages/observability/middleware.d.ts +32 -0
  45. package/dist/packages/observability/middleware.js +58 -0
  46. package/dist/packages/observability/middleware.js.map +1 -0
  47. package/dist/packages/review/analysis-engine.d.ts +19 -0
  48. package/dist/packages/review/analysis-engine.js +106 -0
  49. package/dist/packages/review/analysis-engine.js.map +1 -0
  50. package/dist/packages/review/index.d.ts +12 -0
  51. package/dist/packages/review/index.js +29 -0
  52. package/dist/packages/review/index.js.map +1 -0
  53. package/dist/packages/review/parser-n8n.d.ts +2 -0
  54. package/dist/packages/review/parser-n8n.js +118 -0
  55. package/dist/packages/review/parser-n8n.js.map +1 -0
  56. package/dist/packages/review/providers/github.d.ts +62 -0
  57. package/dist/packages/review/providers/github.js +275 -0
  58. package/dist/packages/review/providers/github.js.map +1 -0
  59. package/dist/packages/review/providers.d.ts +106 -0
  60. package/dist/packages/review/providers.js +12 -0
  61. package/dist/packages/review/providers.js.map +1 -0
  62. package/dist/packages/review/reporter.d.ts +17 -0
  63. package/dist/packages/review/reporter.js +53 -0
  64. package/dist/packages/review/reporter.js.map +1 -0
  65. package/dist/packages/review/rules/index.d.ts +9 -0
  66. package/dist/packages/review/rules/index.js +313 -0
  67. package/dist/packages/review/rules/index.js.map +1 -0
  68. package/dist/packages/review/rules/rule-utils.d.ts +36 -0
  69. package/dist/packages/review/rules/rule-utils.js +75 -0
  70. package/dist/packages/review/rules/rule-utils.js.map +1 -0
  71. package/dist/packages/review/schemas/index.d.ts +17 -0
  72. package/dist/packages/review/schemas/index.js +139 -0
  73. package/dist/packages/review/schemas/index.js.map +1 -0
  74. package/dist/packages/review/schemas/n8n-workflow.schema.json +177 -0
  75. package/dist/packages/review/sniffer.d.ts +15 -0
  76. package/dist/packages/review/sniffer.js +47 -0
  77. package/dist/packages/review/sniffer.js.map +1 -0
  78. package/dist/packages/review/types.d.ts +37 -0
  79. package/dist/packages/review/types.js +3 -0
  80. package/dist/packages/review/types.js.map +1 -0
  81. package/dist/packages/review/utils/findings.d.ts +23 -0
  82. package/dist/packages/review/utils/findings.js +34 -0
  83. package/dist/packages/review/utils/findings.js.map +1 -0
  84. package/dist/packages/review/utils/merge.d.ts +12 -0
  85. package/dist/packages/review/utils/merge.js +40 -0
  86. package/dist/packages/review/utils/merge.js.map +1 -0
  87. package/dist/packages/review/utils.d.ts +58 -0
  88. package/dist/packages/review/utils.js +208 -0
  89. package/dist/packages/review/utils.js.map +1 -0
  90. package/dist/packages/tracing/github-tracer.d.ts +38 -0
  91. package/dist/packages/tracing/github-tracer.js +79 -0
  92. package/dist/packages/tracing/github-tracer.js.map +1 -0
  93. package/dist/packages/tracing/index.d.ts +81 -0
  94. package/dist/packages/tracing/index.js +240 -0
  95. package/dist/packages/tracing/index.js.map +1 -0
  96. package/dist/packages/tracing/tracer.d.ts +30 -0
  97. package/dist/packages/tracing/tracer.js +141 -0
  98. package/dist/packages/tracing/tracer.js.map +1 -0
  99. package/package.json +49 -0
@@ -0,0 +1,30 @@
1
+ import { Span } from '@opentelemetry/api';
2
+ import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';
3
+ type AutoInstrumentationOptions = Parameters<typeof getNodeAutoInstrumentations>[0];
4
+ /**
5
+ * Initialize OpenTelemetry tracing for FlowLint
6
+ */
7
+ export declare function initTracing(options: {
8
+ serviceName: string;
9
+ serviceNamespace?: string;
10
+ serviceVersion?: string;
11
+ environment?: string;
12
+ exporter?: 'otlp-http' | 'otlp-grpc' | 'console' | 'none';
13
+ otlpEndpoint?: string;
14
+ otlpHeaders?: Record<string, string>;
15
+ otlpTimeoutMs?: number;
16
+ instrumentationOptions?: AutoInstrumentationOptions;
17
+ }): Promise<void>;
18
+ /**
19
+ * Shutdown OpenTelemetry
20
+ */
21
+ export declare function shutdownTracing(): Promise<void>;
22
+ /**
23
+ * Get tracer instance
24
+ */
25
+ export declare function getTracer(): import("@opentelemetry/api").Tracer;
26
+ /**
27
+ * Set custom span attributes (helper)
28
+ */
29
+ export declare function setSpanAttributes(span: Span | undefined, attributes: Record<string, string | number | boolean>): void;
30
+ export {};
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.initTracing = initTracing;
4
+ exports.shutdownTracing = shutdownTracing;
5
+ exports.getTracer = getTracer;
6
+ exports.setSpanAttributes = setSpanAttributes;
7
+ const api_1 = require("@opentelemetry/api");
8
+ const sdk_node_1 = require("@opentelemetry/sdk-node");
9
+ const resources_1 = require("@opentelemetry/resources");
10
+ const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
11
+ const exporter_trace_otlp_http_1 = require("@opentelemetry/exporter-trace-otlp-http");
12
+ const exporter_trace_otlp_grpc_1 = require("@opentelemetry/exporter-trace-otlp-grpc");
13
+ const instrumentation_http_1 = require("@opentelemetry/instrumentation-http");
14
+ const instrumentation_express_1 = require("@opentelemetry/instrumentation-express");
15
+ const auto_instrumentations_node_1 = require("@opentelemetry/auto-instrumentations-node");
16
+ const logger_1 = require("../logger");
17
+ let sdk;
18
+ let initPromise;
19
+ const DEFAULT_SERVICE_VERSION = process.env.npm_package_version || '0.0.0';
20
+ const DEFAULT_ENVIRONMENT = process.env.NODE_ENV || 'development';
21
+ /**
22
+ * Initialize OpenTelemetry tracing for FlowLint
23
+ */
24
+ function initTracing(options) {
25
+ if (initPromise) {
26
+ return initPromise;
27
+ }
28
+ api_1.diag.setLogger(new api_1.DiagConsoleLogger(), api_1.DiagLogLevel.ERROR);
29
+ const { serviceName, serviceNamespace, serviceVersion = DEFAULT_SERVICE_VERSION, environment = DEFAULT_ENVIRONMENT, exporter = process.env.OTEL_EXPORTER || 'otlp-http', otlpEndpoint = process.env.OTEL_EXPORTER_OTLP_ENDPOINT, otlpHeaders = parseHeaders(process.env.OTEL_EXPORTER_OTLP_HEADERS), otlpTimeoutMs = process.env.OTEL_EXPORTER_OTLP_TIMEOUT ? Number(process.env.OTEL_EXPORTER_OTLP_TIMEOUT) : undefined, instrumentationOptions = {}, } = options;
30
+ const resource = (0, resources_1.resourceFromAttributes)({
31
+ [semantic_conventions_1.ATTR_SERVICE_NAME]: serviceName,
32
+ [semantic_conventions_1.ATTR_SERVICE_VERSION]: serviceVersion,
33
+ 'service.namespace': serviceNamespace || 'flowlint',
34
+ 'deployment.environment': environment,
35
+ });
36
+ const instrumentations = [
37
+ new instrumentation_http_1.HttpInstrumentation({
38
+ ignoreIncomingRequestHook: (req) => {
39
+ const path = req.url || '';
40
+ return ['/metrics', '/livez', '/readyz', '/healthz', '/openapi.json', '/api-docs'].some((ignorePath) => path.startsWith(ignorePath));
41
+ },
42
+ }),
43
+ new instrumentation_express_1.ExpressInstrumentation(),
44
+ ];
45
+ const autoInstrumentations = (0, auto_instrumentations_node_1.getNodeAutoInstrumentations)({
46
+ '@opentelemetry/instrumentation-fs': { enabled: false },
47
+ ...instrumentationOptions,
48
+ });
49
+ const exporters = createExporter({ exporter, otlpEndpoint, otlpHeaders, otlpTimeoutMs });
50
+ sdk = new sdk_node_1.NodeSDK({
51
+ resource,
52
+ traceExporter: exporters.traceExporter,
53
+ instrumentations: [...instrumentations, ...Object.values(autoInstrumentations)],
54
+ });
55
+ initPromise = (async () => {
56
+ await sdk.start();
57
+ logger_1.logger.info({ serviceName }, 'OpenTelemetry tracing initialized');
58
+ })().catch((error) => {
59
+ logger_1.logger.error({ error }, 'failed to initialize OpenTelemetry tracing');
60
+ });
61
+ return initPromise;
62
+ }
63
+ /**
64
+ * Shutdown OpenTelemetry
65
+ */
66
+ async function shutdownTracing() {
67
+ if (!sdk) {
68
+ return;
69
+ }
70
+ try {
71
+ await sdk.shutdown();
72
+ logger_1.logger.info('OpenTelemetry tracing shut down');
73
+ }
74
+ catch (error) {
75
+ logger_1.logger.error({ error }, 'failed to shut down OpenTelemetry');
76
+ }
77
+ finally {
78
+ sdk = undefined;
79
+ initPromise = undefined;
80
+ }
81
+ }
82
+ /**
83
+ * Get tracer instance
84
+ */
85
+ function getTracer() {
86
+ return api_1.trace.getTracer('flowlint');
87
+ }
88
+ /**
89
+ * Set custom span attributes (helper)
90
+ */
91
+ function setSpanAttributes(span, attributes) {
92
+ if (!span) {
93
+ return;
94
+ }
95
+ span.setAttributes(attributes);
96
+ }
97
+ function parseHeaders(headersInput) {
98
+ if (!headersInput) {
99
+ return {};
100
+ }
101
+ try {
102
+ const entries = headersInput.split(',').map((entry) => {
103
+ const [key, value] = entry.split('=').map((item) => item.trim());
104
+ return [key, value];
105
+ });
106
+ return Object.fromEntries(entries);
107
+ }
108
+ catch (error) {
109
+ logger_1.logger.warn({ error }, 'failed to parse OTLP headers');
110
+ return {};
111
+ }
112
+ }
113
+ function createExporter(options) {
114
+ const { exporter, otlpEndpoint, otlpHeaders, otlpTimeoutMs } = options;
115
+ switch (exporter) {
116
+ case 'otlp-http':
117
+ return {
118
+ traceExporter: new exporter_trace_otlp_http_1.OTLPTraceExporter({
119
+ url: otlpEndpoint,
120
+ headers: otlpHeaders,
121
+ timeoutMillis: otlpTimeoutMs,
122
+ }),
123
+ };
124
+ case 'otlp-grpc':
125
+ return {
126
+ traceExporter: new exporter_trace_otlp_grpc_1.OTLPTraceExporter({
127
+ url: otlpEndpoint,
128
+ }),
129
+ };
130
+ case 'console':
131
+ return {
132
+ traceExporter: undefined,
133
+ };
134
+ case 'none':
135
+ default:
136
+ return {
137
+ traceExporter: undefined,
138
+ };
139
+ }
140
+ }
141
+ //# sourceMappingURL=tracer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracer.js","sourceRoot":"","sources":["../../../packages/tracing/tracer.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "flowlint",
3
+ "version": "0.1.1",
4
+ "description": "FlowLint CLI - Static analysis for n8n workflows",
5
+ "license": "MIT",
6
+ "type": "commonjs",
7
+ "bin": {
8
+ "flowlint": "dist/apps/cli/src/cli.js"
9
+ },
10
+ "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"
21
+ },
22
+ "keywords": [
23
+ "n8n",
24
+ "workflow",
25
+ "linter",
26
+ "static-analysis",
27
+ "cli"
28
+ ],
29
+ "engines": {
30
+ "node": ">=22"
31
+ },
32
+ "dependencies": {
33
+ "commander": "^12.1.0",
34
+ "glob": "^10.3.10",
35
+ "yaml": "^2.4.0",
36
+ "ajv": "^8.17.1",
37
+ "ajv-draft-04": "^1.0.0",
38
+ "ajv-formats": "^3.0.1",
39
+ "micromatch": "^4.0.8"
40
+ },
41
+ "devDependencies": {
42
+ "@types/node": "^22.0.0",
43
+ "typescript": "^5.4.0"
44
+ },
45
+ "files": [
46
+ "dist/",
47
+ "README.md"
48
+ ]
49
+ }