@sfdxy/mule-lint 1.16.2 → 1.17.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.
Files changed (55) hide show
  1. package/README.md +9 -6
  2. package/dist/bin/mule-lint.js +14 -1
  3. package/dist/bin/mule-lint.js.map +1 -1
  4. package/dist/package.json +3 -2
  5. package/dist/src/mcp/index.d.ts.map +1 -1
  6. package/dist/src/mcp/index.js +6 -0
  7. package/dist/src/mcp/index.js.map +1 -1
  8. package/dist/src/rules/documentation/DisplayNameRule.d.ts +17 -0
  9. package/dist/src/rules/documentation/DisplayNameRule.d.ts.map +1 -0
  10. package/dist/src/rules/documentation/DisplayNameRule.js +46 -0
  11. package/dist/src/rules/documentation/DisplayNameRule.js.map +1 -0
  12. package/dist/src/rules/index.d.ts.map +1 -1
  13. package/dist/src/rules/index.js +21 -12
  14. package/dist/src/rules/index.js.map +1 -1
  15. package/dist/src/rules/logging/ExcessiveLoggersRule.d.ts +16 -0
  16. package/dist/src/rules/logging/ExcessiveLoggersRule.d.ts.map +1 -0
  17. package/dist/src/rules/logging/ExcessiveLoggersRule.js +45 -0
  18. package/dist/src/rules/logging/ExcessiveLoggersRule.js.map +1 -0
  19. package/dist/src/rules/operations/CommentedCodeRule.d.ts +17 -0
  20. package/dist/src/rules/operations/CommentedCodeRule.d.ts.map +1 -0
  21. package/dist/src/rules/operations/CommentedCodeRule.js +58 -0
  22. package/dist/src/rules/operations/CommentedCodeRule.js.map +1 -0
  23. package/dist/src/rules/operations/UnusedFlowRule.d.ts +17 -0
  24. package/dist/src/rules/operations/UnusedFlowRule.d.ts.map +1 -0
  25. package/dist/src/rules/operations/UnusedFlowRule.js +80 -0
  26. package/dist/src/rules/operations/UnusedFlowRule.js.map +1 -0
  27. package/dist/src/rules/performance/ReconnectionStrategyRule.d.ts +16 -0
  28. package/dist/src/rules/performance/ReconnectionStrategyRule.d.ts.map +1 -0
  29. package/dist/src/rules/performance/ReconnectionStrategyRule.js +60 -0
  30. package/dist/src/rules/performance/ReconnectionStrategyRule.js.map +1 -0
  31. package/dist/src/rules/security/EncryptionKeyInLogsRule.d.ts +17 -0
  32. package/dist/src/rules/security/EncryptionKeyInLogsRule.d.ts.map +1 -0
  33. package/dist/src/rules/security/EncryptionKeyInLogsRule.js +46 -0
  34. package/dist/src/rules/security/EncryptionKeyInLogsRule.js.map +1 -0
  35. package/dist/src/rules/standards/ApiKitValidationRule.d.ts +16 -0
  36. package/dist/src/rules/standards/ApiKitValidationRule.d.ts.map +1 -0
  37. package/dist/src/rules/standards/ApiKitValidationRule.js +39 -0
  38. package/dist/src/rules/standards/ApiKitValidationRule.js.map +1 -0
  39. package/dist/src/rules/standards/AutoDiscoveryRule.d.ts +16 -0
  40. package/dist/src/rules/standards/AutoDiscoveryRule.d.ts.map +1 -0
  41. package/dist/src/rules/standards/AutoDiscoveryRule.js +47 -0
  42. package/dist/src/rules/standards/AutoDiscoveryRule.js.map +1 -0
  43. package/dist/src/rules/standards/CronExternalizedRule.d.ts +16 -0
  44. package/dist/src/rules/standards/CronExternalizedRule.d.ts.map +1 -0
  45. package/dist/src/rules/standards/CronExternalizedRule.js +32 -0
  46. package/dist/src/rules/standards/CronExternalizedRule.js.map +1 -0
  47. package/dist/src/rules/standards/HttpPortPlaceholderRule.d.ts +16 -0
  48. package/dist/src/rules/standards/HttpPortPlaceholderRule.d.ts.map +1 -0
  49. package/dist/src/rules/standards/HttpPortPlaceholderRule.js +34 -0
  50. package/dist/src/rules/standards/HttpPortPlaceholderRule.js.map +1 -0
  51. package/package.json +3 -2
  52. package/dist/src/rules/operations/OperationsRules.d.ts +0 -137
  53. package/dist/src/rules/operations/OperationsRules.d.ts.map +0 -1
  54. package/dist/src/rules/operations/OperationsRules.js +0 -442
  55. package/dist/src/rules/operations/OperationsRules.js.map +0 -1
@@ -1,137 +0,0 @@
1
- import { ValidationContext, Issue } from '../../types';
2
- import { BaseRule } from '../base/BaseRule';
3
- /**
4
- * RES-001: Reconnection Strategy
5
- *
6
- * Connectors should have reconnection strategies configured for resilience.
7
- */
8
- export declare class ReconnectionStrategyRule extends BaseRule {
9
- id: string;
10
- name: string;
11
- description: string;
12
- severity: "warning";
13
- category: "performance";
14
- validate(doc: Document, _context: ValidationContext): Issue[];
15
- }
16
- /**
17
- * OPS-001: Auto-Discovery Configuration
18
- *
19
- * APIs should have auto-discovery configured for API Manager integration.
20
- */
21
- export declare class AutoDiscoveryRule extends BaseRule {
22
- id: string;
23
- name: string;
24
- description: string;
25
- severity: "info";
26
- category: "standards";
27
- validate(doc: Document, _context: ValidationContext): Issue[];
28
- }
29
- /**
30
- * OPS-002: HTTP Port Placeholder
31
- *
32
- * HTTP listener ports should use property placeholders, not hardcoded values.
33
- */
34
- export declare class HttpPortPlaceholderRule extends BaseRule {
35
- id: string;
36
- name: string;
37
- description: string;
38
- severity: "warning";
39
- category: "standards";
40
- validate(doc: Document, _context: ValidationContext): Issue[];
41
- }
42
- /**
43
- * SEC-006: Encryption Key in Logs
44
- *
45
- * Encryption keys and sensitive credentials should not appear in log statements.
46
- */
47
- export declare class EncryptionKeyInLogsRule extends BaseRule {
48
- id: string;
49
- name: string;
50
- description: string;
51
- severity: "error";
52
- category: "security";
53
- private sensitivePatterns;
54
- validate(doc: Document, _context: ValidationContext): Issue[];
55
- }
56
- /**
57
- * HYG-001: Excessive Loggers
58
- *
59
- * Flows should not have too many loggers which can impact performance.
60
- */
61
- export declare class ExcessiveLoggersRule extends BaseRule {
62
- id: string;
63
- name: string;
64
- description: string;
65
- severity: "warning";
66
- category: "logging";
67
- validate(doc: Document, context: ValidationContext): Issue[];
68
- }
69
- /**
70
- * HYG-002: Commented Code Detection
71
- *
72
- * Detects potentially commented-out code blocks in Mule configurations.
73
- */
74
- export declare class CommentedCodeRule extends BaseRule {
75
- id: string;
76
- name: string;
77
- description: string;
78
- severity: "info";
79
- category: "standards";
80
- private codePatterns;
81
- validate(doc: Document, _context: ValidationContext): Issue[];
82
- }
83
- /**
84
- * OPS-003: Cron Expression Externalized
85
- *
86
- * Cron expressions in schedulers should use property placeholders.
87
- */
88
- export declare class CronExternalizedRule extends BaseRule {
89
- id: string;
90
- name: string;
91
- description: string;
92
- severity: "warning";
93
- category: "standards";
94
- validate(doc: Document, _context: ValidationContext): Issue[];
95
- }
96
- /**
97
- * API-005: APIKit Validation
98
- *
99
- * APIs should use APIKit for auto-generated implementation interfaces.
100
- */
101
- export declare class ApiKitValidationRule extends BaseRule {
102
- id: string;
103
- name: string;
104
- description: string;
105
- severity: "info";
106
- category: "standards";
107
- validate(doc: Document, _context: ValidationContext): Issue[];
108
- }
109
- /**
110
- * HYG-003: Unused Flow Detection
111
- *
112
- * Detects flows that are never referenced by flow-ref.
113
- */
114
- export declare class UnusedFlowRule extends BaseRule {
115
- id: string;
116
- name: string;
117
- description: string;
118
- severity: "warning";
119
- category: "standards";
120
- validate(doc: Document, _context: ValidationContext): Issue[];
121
- private isExternallyReferenced;
122
- }
123
- /**
124
- * DOC-001: Display Name Enforcement
125
- *
126
- * Key components should have meaningful doc:name attributes, not defaults.
127
- */
128
- export declare class DisplayNameRule extends BaseRule {
129
- id: string;
130
- name: string;
131
- description: string;
132
- severity: "info";
133
- category: "documentation";
134
- private componentDefaults;
135
- validate(doc: Document, _context: ValidationContext): Issue[];
136
- }
137
- //# sourceMappingURL=OperationsRules.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationsRules.d.ts","sourceRoot":"","sources":["../../../../src/rules/operations/OperationsRules.ts"],"names":[],"mappings":"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"}
@@ -1,442 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DisplayNameRule = exports.UnusedFlowRule = exports.ApiKitValidationRule = exports.CronExternalizedRule = exports.CommentedCodeRule = exports.ExcessiveLoggersRule = exports.EncryptionKeyInLogsRule = exports.HttpPortPlaceholderRule = exports.AutoDiscoveryRule = exports.ReconnectionStrategyRule = void 0;
4
- const BaseRule_1 = require("../base/BaseRule");
5
- /**
6
- * RES-001: Reconnection Strategy
7
- *
8
- * Connectors should have reconnection strategies configured for resilience.
9
- */
10
- class ReconnectionStrategyRule extends BaseRule_1.BaseRule {
11
- id = 'RES-001';
12
- name = 'Reconnection Strategy';
13
- description = 'Connectors should have reconnection strategies configured';
14
- severity = 'warning';
15
- category = 'performance';
16
- validate(doc, _context) {
17
- const issues = [];
18
- // Specific connector configurations that benefit from reconnection strategies
19
- // Using more specific patterns to avoid false positives on generic "config" elements
20
- const connectorConfigs = [
21
- { pattern: 'request-config', name: 'HTTP Request' },
22
- { pattern: 'listener-config', name: 'HTTP Listener' },
23
- { pattern: 'jms-config', name: 'JMS' },
24
- { pattern: 'amqp-config', name: 'AMQP' },
25
- { pattern: 'sftp-config', name: 'SFTP' },
26
- { pattern: 'ftp-config', name: 'FTP' },
27
- { pattern: 'vm-config', name: 'VM' },
28
- ];
29
- for (const connector of connectorConfigs) {
30
- const configs = this.select(`//*[local-name()="${connector.pattern}"]`, doc);
31
- for (const config of configs) {
32
- // Check for reconnection or reconnect child elements
33
- const hasReconnection = this.exists('.//*[local-name()="reconnection"]', config) ||
34
- this.exists('.//*[local-name()="reconnect"]', config) ||
35
- this.exists('.//*[local-name()="reconnect-forever"]', config);
36
- if (!hasReconnection) {
37
- const name = this.getNameAttribute(config) ?? connector.name;
38
- issues.push(this.createIssue(config, `${connector.name} config "${name}" has no reconnection strategy`, {
39
- suggestion: 'Add <reconnection> or <reconnect-forever> for resilience',
40
- }));
41
- }
42
- }
43
- }
44
- // Database configs specifically - check for db namespace
45
- const dbConfigs = this.select('//*[local-name()="config" and starts-with(name(), "db:")]', doc);
46
- for (const config of dbConfigs) {
47
- const hasReconnection = this.exists('.//*[local-name()="reconnection"]', config) ||
48
- this.exists('.//*[local-name()="reconnect"]', config);
49
- if (!hasReconnection) {
50
- const name = this.getNameAttribute(config) ?? 'Database';
51
- issues.push(this.createIssue(config, `Database config "${name}" has no reconnection strategy`, {
52
- suggestion: 'Add <reconnection> inside the connection element',
53
- }));
54
- }
55
- }
56
- return issues;
57
- }
58
- }
59
- exports.ReconnectionStrategyRule = ReconnectionStrategyRule;
60
- /**
61
- * OPS-001: Auto-Discovery Configuration
62
- *
63
- * APIs should have auto-discovery configured for API Manager integration.
64
- */
65
- class AutoDiscoveryRule extends BaseRule_1.BaseRule {
66
- id = 'OPS-001';
67
- name = 'Auto-Discovery Configuration';
68
- description = 'APIs should have auto-discovery configured for API Manager';
69
- severity = 'info';
70
- category = 'standards';
71
- validate(doc, _context) {
72
- const issues = [];
73
- // Check if this is an API (has APIKit router or HTTP listener)
74
- const hasApiKitRouter = this.exists('//*[local-name()="router"]', doc);
75
- const hasHttpListener = this.exists('//*[local-name()="listener"]', doc);
76
- if (!hasApiKitRouter && !hasHttpListener) {
77
- return issues; // Not an API, skip
78
- }
79
- // Check for auto-discovery configuration
80
- const hasAutoDiscovery = this.exists('//*[local-name()="api-autodiscovery"]', doc);
81
- if (!hasAutoDiscovery && hasApiKitRouter) {
82
- issues.push(this.createFileIssue('API has no auto-discovery configuration for API Manager', {
83
- suggestion: 'Add <api-gateway:autodiscovery> for API Manager integration',
84
- }));
85
- }
86
- // If auto-discovery exists, check it uses placeholders
87
- if (hasAutoDiscovery) {
88
- const autodiscoveryNodes = this.select('//*[local-name()="api-autodiscovery"]', doc);
89
- for (const node of autodiscoveryNodes) {
90
- const apiId = this.getAttribute(node, 'apiId');
91
- if (apiId && !apiId.includes('${')) {
92
- issues.push(this.createIssue(node, 'Auto-discovery apiId should use a property placeholder', {
93
- suggestion: 'Use apiId="${api.id}" instead of hardcoded value',
94
- }));
95
- }
96
- }
97
- }
98
- return issues;
99
- }
100
- }
101
- exports.AutoDiscoveryRule = AutoDiscoveryRule;
102
- /**
103
- * OPS-002: HTTP Port Placeholder
104
- *
105
- * HTTP listener ports should use property placeholders, not hardcoded values.
106
- */
107
- class HttpPortPlaceholderRule extends BaseRule_1.BaseRule {
108
- id = 'OPS-002';
109
- name = 'HTTP Port Placeholder';
110
- description = 'HTTP listener ports should use property placeholders';
111
- severity = 'warning';
112
- category = 'standards';
113
- validate(doc, _context) {
114
- const issues = [];
115
- // Check HTTP listener configurations
116
- const listenerConfigs = this.select('//*[local-name()="listener-config"]', doc);
117
- for (const config of listenerConfigs) {
118
- const port = this.getAttribute(config, 'port');
119
- if (port && /^\d+$/.test(port)) {
120
- // Port is a hardcoded number
121
- const name = this.getNameAttribute(config) ?? 'HTTP Listener Config';
122
- issues.push(this.createIssue(config, `HTTP config "${name}" has hardcoded port "${port}"`, {
123
- suggestion: 'Use port="${http.port}" or similar placeholder',
124
- }));
125
- }
126
- }
127
- return issues;
128
- }
129
- }
130
- exports.HttpPortPlaceholderRule = HttpPortPlaceholderRule;
131
- /**
132
- * SEC-006: Encryption Key in Logs
133
- *
134
- * Encryption keys and sensitive credentials should not appear in log statements.
135
- */
136
- class EncryptionKeyInLogsRule extends BaseRule_1.BaseRule {
137
- id = 'SEC-006';
138
- name = 'Encryption Key in Logs';
139
- description = 'Encryption keys and sensitive data should not appear in logs';
140
- severity = 'error';
141
- category = 'security';
142
- sensitivePatterns = [
143
- /encrypt.*key/i,
144
- /decryption.*key/i,
145
- /secret.*key/i,
146
- /api[_-]?key/i,
147
- /password/i,
148
- /credentials?/i,
149
- /mule\.key/i,
150
- /secure::.*key/i,
151
- ];
152
- validate(doc, _context) {
153
- const issues = [];
154
- // Find all loggers
155
- const loggers = this.select('//*[local-name()="logger"]', doc);
156
- for (const logger of loggers) {
157
- const message = this.getAttribute(logger, 'message') ?? '';
158
- // Check for sensitive patterns in log messages
159
- for (const pattern of this.sensitivePatterns) {
160
- if (pattern.test(message)) {
161
- issues.push(this.createIssue(logger, `Logger may expose sensitive data: "${message.substring(0, 50)}${message.length > 50 ? '...' : ''}"`, {
162
- suggestion: 'Remove encryption keys and sensitive data from log messages',
163
- }));
164
- break; // Only one issue per logger
165
- }
166
- }
167
- }
168
- return issues;
169
- }
170
- }
171
- exports.EncryptionKeyInLogsRule = EncryptionKeyInLogsRule;
172
- /**
173
- * HYG-001: Excessive Loggers
174
- *
175
- * Flows should not have too many loggers which can impact performance.
176
- */
177
- class ExcessiveLoggersRule extends BaseRule_1.BaseRule {
178
- id = 'HYG-001';
179
- name = 'Excessive Loggers';
180
- description = 'Flows should not have excessive loggers';
181
- severity = 'warning';
182
- category = 'logging';
183
- validate(doc, context) {
184
- const issues = [];
185
- const maxLoggers = this.getOption(context, 'maxLoggers', 5);
186
- // Check flows
187
- const flows = this.select('//*[local-name()="flow"]', doc);
188
- for (const flow of flows) {
189
- const flowName = this.getNameAttribute(flow) ?? 'unknown';
190
- const loggerCount = this.count('.//*[local-name()="logger"]', flow);
191
- if (loggerCount > maxLoggers) {
192
- issues.push(this.createIssue(flow, `Flow "${flowName}" has ${loggerCount} loggers (max recommended: ${maxLoggers})`, {
193
- suggestion: 'Consider reducing loggers or moving detailed logging to DEBUG level',
194
- }));
195
- }
196
- }
197
- // Check sub-flows
198
- const subflows = this.select('//*[local-name()="sub-flow"]', doc);
199
- for (const subflow of subflows) {
200
- const subflowName = this.getNameAttribute(subflow) ?? 'unknown';
201
- const loggerCount = this.count('.//*[local-name()="logger"]', subflow);
202
- if (loggerCount > maxLoggers) {
203
- issues.push(this.createIssue(subflow, `Sub-flow "${subflowName}" has ${loggerCount} loggers (max recommended: ${maxLoggers})`, {
204
- suggestion: 'Consider reducing loggers or moving detailed logging to DEBUG level',
205
- }));
206
- }
207
- }
208
- return issues;
209
- }
210
- }
211
- exports.ExcessiveLoggersRule = ExcessiveLoggersRule;
212
- /**
213
- * HYG-002: Commented Code Detection
214
- *
215
- * Detects potentially commented-out code blocks in Mule configurations.
216
- */
217
- class CommentedCodeRule extends BaseRule_1.BaseRule {
218
- id = 'HYG-002';
219
- name = 'Commented Code Detection';
220
- description = 'Detects potentially commented-out code in configurations';
221
- severity = 'info';
222
- category = 'standards';
223
- // Patterns that suggest commented-out XML code
224
- codePatterns = [
225
- /<flow\s/,
226
- /<sub-flow\s/,
227
- /<http:/,
228
- /<logger\s/,
229
- /<set-variable\s/,
230
- /<set-payload\s/,
231
- /<choice>/,
232
- /<transform\s/,
233
- /<flow-ref\s/,
234
- /<try>/,
235
- /<db:/,
236
- ];
237
- validate(doc, _context) {
238
- const issues = [];
239
- // Use XPath to find comment nodes: comment()
240
- // Note: In xmldom, we need to iterate through the document differently
241
- try {
242
- const commentNodes = this.select('//comment()', doc);
243
- for (const commentNode of commentNodes) {
244
- const commentText = commentNode.textContent ?? '';
245
- // Check if comment contains code-like patterns
246
- for (const pattern of this.codePatterns) {
247
- if (pattern.test(commentText)) {
248
- issues.push(this.createIssue(commentNode, 'Commented-out code detected', {
249
- suggestion: 'Remove commented code or convert to documentation comment',
250
- codeSnippet: commentText.substring(0, 80) + '...',
251
- }));
252
- break;
253
- }
254
- }
255
- }
256
- }
257
- catch {
258
- // XPath comment() may not be supported in all parsers
259
- // Silently return empty issues
260
- }
261
- return issues;
262
- }
263
- }
264
- exports.CommentedCodeRule = CommentedCodeRule;
265
- /**
266
- * OPS-003: Cron Expression Externalized
267
- *
268
- * Cron expressions in schedulers should use property placeholders.
269
- */
270
- class CronExternalizedRule extends BaseRule_1.BaseRule {
271
- id = 'OPS-003';
272
- name = 'Externalized Cron Expression';
273
- description = 'Cron expressions should use property placeholders';
274
- severity = 'warning';
275
- category = 'standards';
276
- validate(doc, _context) {
277
- const issues = [];
278
- // Find scheduler cron expressions
279
- const cronNodes = this.select('//*[local-name()="cron"]', doc);
280
- for (const node of cronNodes) {
281
- const expression = this.getAttribute(node, 'expression');
282
- if (expression && !expression.includes('${')) {
283
- issues.push(this.createIssue(node, `Hardcoded cron expression: "${expression}"`, {
284
- suggestion: 'Use expression="${scheduler.cron}" to allow environment-specific scheduling',
285
- }));
286
- }
287
- }
288
- return issues;
289
- }
290
- }
291
- exports.CronExternalizedRule = CronExternalizedRule;
292
- /**
293
- * API-005: APIKit Validation
294
- *
295
- * APIs should use APIKit for auto-generated implementation interfaces.
296
- */
297
- class ApiKitValidationRule extends BaseRule_1.BaseRule {
298
- id = 'API-005';
299
- name = 'APIKit Validation';
300
- description = 'APIs should use APIKit for implementation interfaces';
301
- severity = 'info';
302
- category = 'standards';
303
- validate(doc, _context) {
304
- const issues = [];
305
- // Check if this appears to be an API project (has HTTP listener)
306
- const hasHttpListener = this.exists('//*[local-name()="listener"]', doc);
307
- if (!hasHttpListener) {
308
- return issues;
309
- }
310
- // Check for APIKit router
311
- const hasApiKitRouter = this.exists('//*[local-name()="router"]', doc);
312
- const hasApiKitConfig = this.exists('//*[local-name()="config" and contains(@name, "api")]', doc);
313
- if (!hasApiKitRouter && !hasApiKitConfig) {
314
- // Only flag if this looks like an interface file
315
- const hasMainFlow = this.exists('//*[local-name()="flow" and (contains(@name, "-main") or contains(@name, "-api"))]', doc);
316
- if (hasMainFlow) {
317
- issues.push(this.createFileIssue('Consider using APIKit to auto-generate the implementation interface', {
318
- suggestion: 'APIKit provides consistent API implementation patterns',
319
- }));
320
- }
321
- }
322
- return issues;
323
- }
324
- }
325
- exports.ApiKitValidationRule = ApiKitValidationRule;
326
- /**
327
- * HYG-003: Unused Flow Detection
328
- *
329
- * Detects flows that are never referenced by flow-ref.
330
- */
331
- class UnusedFlowRule extends BaseRule_1.BaseRule {
332
- id = 'HYG-003';
333
- name = 'Unused Flow Detection';
334
- description = 'Detects flows that are never referenced';
335
- severity = 'warning';
336
- category = 'standards';
337
- validate(doc, _context) {
338
- const issues = [];
339
- // Get all flow names in this document
340
- const flows = this.select('//*[local-name()="flow"]', doc);
341
- const subflows = this.select('//*[local-name()="sub-flow"]', doc);
342
- // Get all flow-ref targets
343
- const flowRefs = this.select('//*[local-name()="flow-ref"]', doc);
344
- const referencedFlows = new Set();
345
- for (const ref of flowRefs) {
346
- const name = this.getNameAttribute(ref);
347
- if (name) {
348
- referencedFlows.add(name);
349
- }
350
- }
351
- // Check sub-flows (they should always be referenced)
352
- for (const subflow of subflows) {
353
- const name = this.getNameAttribute(subflow);
354
- if (name && !referencedFlows.has(name)) {
355
- // Exclude common patterns that are referenced externally
356
- if (!this.isExternallyReferenced(name)) {
357
- issues.push(this.createIssue(subflow, `Sub-flow "${name}" is never referenced within this file`, {
358
- severity: 'info',
359
- suggestion: 'Consider removing unused sub-flows or verify cross-file references',
360
- }));
361
- }
362
- }
363
- }
364
- // Check private flows (not triggered by HTTP/scheduler)
365
- for (const flow of flows) {
366
- const name = this.getNameAttribute(flow);
367
- if (!name) {
368
- continue;
369
- }
370
- // Skip if it has an external trigger
371
- const hasHttpListener = this.exists('.//*[local-name()="listener"]', flow);
372
- const hasScheduler = this.exists('.//*[local-name()="scheduler"]', flow);
373
- const hasVmListener = this.exists('.//*[local-name()="listener" and contains(@config-ref, "vm")]', flow);
374
- if (hasHttpListener || hasScheduler || hasVmListener) {
375
- continue; // Entry point flow
376
- }
377
- // Check if referenced
378
- if (!referencedFlows.has(name) && !this.isExternallyReferenced(name)) {
379
- issues.push(this.createIssue(flow, `Flow "${name}" has no trigger and is never referenced`, {
380
- severity: 'info',
381
- suggestion: 'Verify this flow is referenced from other files or remove if unused',
382
- }));
383
- }
384
- }
385
- return issues;
386
- }
387
- isExternallyReferenced(name) {
388
- // Common patterns that are typically referenced externally
389
- const externalPatterns = [
390
- /-main$/,
391
- /-api$/,
392
- /^api-/,
393
- /-console$/,
394
- /-error-handler$/,
395
- /global/i,
396
- ];
397
- return externalPatterns.some((pattern) => pattern.test(name));
398
- }
399
- }
400
- exports.UnusedFlowRule = UnusedFlowRule;
401
- /**
402
- * DOC-001: Display Name Enforcement
403
- *
404
- * Key components should have meaningful doc:name attributes, not defaults.
405
- */
406
- class DisplayNameRule extends BaseRule_1.BaseRule {
407
- id = 'DOC-001';
408
- name = 'Display Name Enforcement';
409
- description = 'Key components should have meaningful display names';
410
- severity = 'info';
411
- category = 'documentation';
412
- // Components that should have meaningful names, with their default names to flag
413
- componentDefaults = [
414
- { element: 'set-payload', defaults: ['Set Payload', 'set-payload'] },
415
- { element: 'set-variable', defaults: ['Set Variable', 'set-variable'] },
416
- { element: 'transform', defaults: ['Transform Message', 'transform'] },
417
- { element: 'flow-ref', defaults: ['Flow Reference', 'flow-ref'] },
418
- { element: 'logger', defaults: ['Logger', 'logger'] },
419
- { element: 'choice', defaults: ['Choice', 'choice'] },
420
- ];
421
- validate(doc, _context) {
422
- const issues = [];
423
- for (const component of this.componentDefaults) {
424
- const elements = this.select(`//*[local-name()="${component.element}"]`, doc);
425
- for (const element of elements) {
426
- const docName = this.getDocName(element);
427
- if (!docName) {
428
- continue; // Missing doc:name is handled by MULE-604
429
- }
430
- // Check if using default name
431
- if (component.defaults.some((d) => docName.toLowerCase() === d.toLowerCase())) {
432
- issues.push(this.createIssue(element, `${component.element} has generic name "${docName}"`, {
433
- suggestion: `Use a descriptive name explaining the purpose`,
434
- }));
435
- }
436
- }
437
- }
438
- return issues;
439
- }
440
- }
441
- exports.DisplayNameRule = DisplayNameRule;
442
- //# sourceMappingURL=OperationsRules.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationsRules.js","sourceRoot":"","sources":["../../../../src/rules/operations/OperationsRules.ts"],"names":[],"mappings":"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"}