@rcrsr/rill-cli 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/LICENSE +21 -0
  2. package/dist/check/config.d.ts +20 -0
  3. package/dist/check/config.d.ts.map +1 -0
  4. package/dist/check/config.js +151 -0
  5. package/dist/check/config.js.map +1 -0
  6. package/dist/check/fixer.d.ts +39 -0
  7. package/dist/check/fixer.d.ts.map +1 -0
  8. package/dist/check/fixer.js +119 -0
  9. package/dist/check/fixer.js.map +1 -0
  10. package/dist/check/index.d.ts +10 -0
  11. package/dist/check/index.d.ts.map +1 -0
  12. package/dist/check/index.js +21 -0
  13. package/dist/check/index.js.map +1 -0
  14. package/dist/check/rules/anti-patterns.d.ts +65 -0
  15. package/dist/check/rules/anti-patterns.d.ts.map +1 -0
  16. package/dist/check/rules/anti-patterns.js +481 -0
  17. package/dist/check/rules/anti-patterns.js.map +1 -0
  18. package/dist/check/rules/closures.d.ts +66 -0
  19. package/dist/check/rules/closures.d.ts.map +1 -0
  20. package/dist/check/rules/closures.js +370 -0
  21. package/dist/check/rules/closures.js.map +1 -0
  22. package/dist/check/rules/collections.d.ts +90 -0
  23. package/dist/check/rules/collections.d.ts.map +1 -0
  24. package/dist/check/rules/collections.js +373 -0
  25. package/dist/check/rules/collections.js.map +1 -0
  26. package/dist/check/rules/conditionals.d.ts +41 -0
  27. package/dist/check/rules/conditionals.d.ts.map +1 -0
  28. package/dist/check/rules/conditionals.js +134 -0
  29. package/dist/check/rules/conditionals.js.map +1 -0
  30. package/dist/check/rules/flow.d.ts +46 -0
  31. package/dist/check/rules/flow.d.ts.map +1 -0
  32. package/dist/check/rules/flow.js +206 -0
  33. package/dist/check/rules/flow.js.map +1 -0
  34. package/dist/check/rules/formatting.d.ts +143 -0
  35. package/dist/check/rules/formatting.d.ts.map +1 -0
  36. package/dist/check/rules/formatting.js +656 -0
  37. package/dist/check/rules/formatting.js.map +1 -0
  38. package/dist/check/rules/helpers.d.ts +26 -0
  39. package/dist/check/rules/helpers.d.ts.map +1 -0
  40. package/dist/check/rules/helpers.js +66 -0
  41. package/dist/check/rules/helpers.js.map +1 -0
  42. package/dist/check/rules/index.d.ts +21 -0
  43. package/dist/check/rules/index.d.ts.map +1 -0
  44. package/dist/check/rules/index.js +78 -0
  45. package/dist/check/rules/index.js.map +1 -0
  46. package/dist/check/rules/loops.d.ts +77 -0
  47. package/dist/check/rules/loops.d.ts.map +1 -0
  48. package/dist/check/rules/loops.js +310 -0
  49. package/dist/check/rules/loops.js.map +1 -0
  50. package/dist/check/rules/naming.d.ts +21 -0
  51. package/dist/check/rules/naming.d.ts.map +1 -0
  52. package/dist/check/rules/naming.js +174 -0
  53. package/dist/check/rules/naming.js.map +1 -0
  54. package/dist/check/rules/strings.d.ts +28 -0
  55. package/dist/check/rules/strings.d.ts.map +1 -0
  56. package/dist/check/rules/strings.js +79 -0
  57. package/dist/check/rules/strings.js.map +1 -0
  58. package/dist/check/rules/types.d.ts +41 -0
  59. package/dist/check/rules/types.d.ts.map +1 -0
  60. package/dist/check/rules/types.js +167 -0
  61. package/dist/check/rules/types.js.map +1 -0
  62. package/dist/check/types.d.ts +112 -0
  63. package/dist/check/types.d.ts.map +1 -0
  64. package/dist/check/types.js +6 -0
  65. package/dist/check/types.js.map +1 -0
  66. package/dist/check/validator.d.ts +18 -0
  67. package/dist/check/validator.d.ts.map +1 -0
  68. package/dist/check/validator.js +110 -0
  69. package/dist/check/validator.js.map +1 -0
  70. package/dist/check/visitor.d.ts +33 -0
  71. package/dist/check/visitor.d.ts.map +1 -0
  72. package/dist/check/visitor.js +259 -0
  73. package/dist/check/visitor.js.map +1 -0
  74. package/dist/cli-check.d.ts +43 -0
  75. package/dist/cli-check.d.ts.map +1 -0
  76. package/dist/cli-check.js +366 -0
  77. package/dist/cli-check.js.map +1 -0
  78. package/dist/cli-error-enrichment.d.ts +73 -0
  79. package/dist/cli-error-enrichment.d.ts.map +1 -0
  80. package/dist/cli-error-enrichment.js +205 -0
  81. package/dist/cli-error-enrichment.js.map +1 -0
  82. package/dist/cli-error-formatter.d.ts +45 -0
  83. package/dist/cli-error-formatter.d.ts.map +1 -0
  84. package/dist/cli-error-formatter.js +218 -0
  85. package/dist/cli-error-formatter.js.map +1 -0
  86. package/dist/cli-eval.d.ts +15 -0
  87. package/dist/cli-eval.d.ts.map +1 -0
  88. package/dist/cli-eval.js +116 -0
  89. package/dist/cli-eval.js.map +1 -0
  90. package/dist/cli-exec.d.ts +58 -0
  91. package/dist/cli-exec.d.ts.map +1 -0
  92. package/dist/cli-exec.js +326 -0
  93. package/dist/cli-exec.js.map +1 -0
  94. package/dist/cli-explain.d.ts +24 -0
  95. package/dist/cli-explain.d.ts.map +1 -0
  96. package/dist/cli-explain.js +68 -0
  97. package/dist/cli-explain.js.map +1 -0
  98. package/dist/cli-lsp-diagnostic.d.ts +35 -0
  99. package/dist/cli-lsp-diagnostic.d.ts.map +1 -0
  100. package/dist/cli-lsp-diagnostic.js +98 -0
  101. package/dist/cli-lsp-diagnostic.js.map +1 -0
  102. package/dist/cli-module-loader.d.ts +19 -0
  103. package/dist/cli-module-loader.d.ts.map +1 -0
  104. package/dist/cli-module-loader.js +83 -0
  105. package/dist/cli-module-loader.js.map +1 -0
  106. package/dist/cli-shared.d.ts +62 -0
  107. package/dist/cli-shared.d.ts.map +1 -0
  108. package/dist/cli-shared.js +158 -0
  109. package/dist/cli-shared.js.map +1 -0
  110. package/dist/cli.d.ts +13 -0
  111. package/dist/cli.d.ts.map +1 -0
  112. package/dist/cli.js +62 -0
  113. package/dist/cli.js.map +1 -0
  114. package/dist/test-internal-import.d.ts +2 -0
  115. package/dist/test-internal-import.d.ts.map +1 -0
  116. package/dist/test-internal-import.js +7 -0
  117. package/dist/test-internal-import.js.map +1 -0
  118. package/package.json +24 -0
  119. package/src/check/config.ts +202 -0
  120. package/src/check/fixer.ts +174 -0
  121. package/src/check/index.ts +39 -0
  122. package/src/check/rules/anti-patterns.ts +585 -0
  123. package/src/check/rules/closures.ts +445 -0
  124. package/src/check/rules/collections.ts +437 -0
  125. package/src/check/rules/conditionals.ts +155 -0
  126. package/src/check/rules/flow.ts +262 -0
  127. package/src/check/rules/formatting.ts +811 -0
  128. package/src/check/rules/helpers.ts +89 -0
  129. package/src/check/rules/index.ts +140 -0
  130. package/src/check/rules/loops.ts +372 -0
  131. package/src/check/rules/naming.ts +242 -0
  132. package/src/check/rules/strings.ts +104 -0
  133. package/src/check/rules/types.ts +214 -0
  134. package/src/check/types.ts +163 -0
  135. package/src/check/validator.ts +136 -0
  136. package/src/check/visitor.ts +338 -0
  137. package/src/cli-check.ts +456 -0
  138. package/src/cli-error-enrichment.ts +274 -0
  139. package/src/cli-error-formatter.ts +313 -0
  140. package/src/cli-eval.ts +145 -0
  141. package/src/cli-exec.ts +408 -0
  142. package/src/cli-explain.ts +76 -0
  143. package/src/cli-lsp-diagnostic.ts +132 -0
  144. package/src/cli-module-loader.ts +101 -0
  145. package/src/cli-shared.ts +187 -0
  146. package/tests/check/cli-check.test.ts +189 -0
  147. package/tests/check/config.test.ts +350 -0
  148. package/tests/check/fixer.test.ts +373 -0
  149. package/tests/check/format-diagnostics.test.ts +327 -0
  150. package/tests/check/rules/anti-patterns.test.ts +467 -0
  151. package/tests/check/rules/closures.test.ts +192 -0
  152. package/tests/check/rules/collections.test.ts +380 -0
  153. package/tests/check/rules/conditionals.test.ts +185 -0
  154. package/tests/check/rules/flow.test.ts +250 -0
  155. package/tests/check/rules/formatting.test.ts +755 -0
  156. package/tests/check/rules/loops.test.ts +334 -0
  157. package/tests/check/rules/naming.test.ts +336 -0
  158. package/tests/check/rules/strings.test.ts +129 -0
  159. package/tests/check/rules/types.test.ts +257 -0
  160. package/tests/check/validator.test.ts +444 -0
  161. package/tests/check/visitor.test.ts +171 -0
  162. package/tests/cli/check.test.ts +801 -0
  163. package/tests/cli/error-enrichment.test.ts +510 -0
  164. package/tests/cli/error-formatter.test.ts +631 -0
  165. package/tests/cli/eval.test.ts +85 -0
  166. package/tests/cli/exec.test.ts +537 -0
  167. package/tests/cli-explain.test.ts +249 -0
  168. package/tests/cli-lsp-diagnostic.test.ts +202 -0
  169. package/tests/cli-shared.test.ts +439 -0
  170. package/tsconfig.json +9 -0
  171. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,656 @@
1
+ /**
2
+ * Formatting Rules
3
+ * Enforces style conventions from docs/guide-conventions.md:465-662.
4
+ */
5
+ import { extractContextLine, isBareReference } from './helpers.js';
6
+ // ============================================================
7
+ // SPACING_OPERATOR RULE
8
+ // ============================================================
9
+ /**
10
+ * Enforces space on both sides of operators.
11
+ * Operators like +, -, ->, =>, ==, etc. should have spaces on both sides.
12
+ *
13
+ * Detection:
14
+ * - Extract operator text from source using source spans
15
+ * - Check if space exists before/after operator
16
+ *
17
+ * References:
18
+ * - docs/guide-conventions.md:467-482
19
+ */
20
+ export const SPACING_OPERATOR = {
21
+ code: 'SPACING_OPERATOR',
22
+ category: 'formatting',
23
+ severity: 'info',
24
+ nodeTypes: ['BinaryExpr', 'PipeChain', 'Capture'],
25
+ validate(node, context) {
26
+ const diagnostics = [];
27
+ if (node.type === 'BinaryExpr') {
28
+ const binaryNode = node;
29
+ const operator = binaryNode.op;
30
+ // Check spacing around operator in source
31
+ const violation = checkOperatorSpacing(operator, binaryNode.span, context.source);
32
+ if (violation) {
33
+ diagnostics.push({
34
+ location: binaryNode.span.start,
35
+ severity: 'info',
36
+ code: 'SPACING_OPERATOR',
37
+ message: `Operator '${operator}' should have spaces on both sides`,
38
+ context: extractContextLine(binaryNode.span.start.line, context.source),
39
+ fix: null, // Complex to fix without AST reconstruction
40
+ });
41
+ }
42
+ }
43
+ if (node.type === 'PipeChain') {
44
+ const pipeNode = node;
45
+ // Check -> operators between pipes
46
+ const violation = checkPipeSpacing(pipeNode.span, context.source);
47
+ if (violation) {
48
+ diagnostics.push({
49
+ location: pipeNode.span.start,
50
+ severity: 'info',
51
+ code: 'SPACING_OPERATOR',
52
+ message: "Pipe operator '->' should have spaces on both sides",
53
+ context: extractContextLine(pipeNode.span.start.line, context.source),
54
+ fix: null,
55
+ });
56
+ }
57
+ }
58
+ if (node.type === 'Capture') {
59
+ const captureNode = node;
60
+ // Check => operator
61
+ const violation = checkCaptureSpacing(captureNode.span, context.source);
62
+ if (violation) {
63
+ diagnostics.push({
64
+ location: captureNode.span.start,
65
+ severity: 'info',
66
+ code: 'SPACING_OPERATOR',
67
+ message: "Capture operator '=>' should have spaces on both sides",
68
+ context: extractContextLine(captureNode.span.start.line, context.source),
69
+ fix: null,
70
+ });
71
+ }
72
+ }
73
+ return diagnostics;
74
+ },
75
+ };
76
+ /**
77
+ * Check if operator has proper spacing in source.
78
+ */
79
+ function checkOperatorSpacing(operator, span, source) {
80
+ const text = extractSpanText(span, source);
81
+ // Look for operator without spaces
82
+ const patterns = [
83
+ new RegExp(`\\S${escapeRegex(operator)}`), // No space before
84
+ new RegExp(`${escapeRegex(operator)}\\S`), // No space after
85
+ ];
86
+ return patterns.some((pattern) => pattern.test(text));
87
+ }
88
+ /**
89
+ * Check pipe operator spacing.
90
+ */
91
+ function checkPipeSpacing(span, source) {
92
+ const text = extractSpanText(span, source);
93
+ // Check for -> without spaces
94
+ return /\S->/.test(text) || /->[\S&&[^\s]]/.test(text);
95
+ }
96
+ /**
97
+ * Check capture operator spacing.
98
+ */
99
+ function checkCaptureSpacing(span, source) {
100
+ const text = extractSpanText(span, source);
101
+ // Check for => without spaces
102
+ return /\S=>/.test(text) || /=>\S/.test(text);
103
+ }
104
+ // ============================================================
105
+ // SPACING_BRACES RULE
106
+ // ============================================================
107
+ /**
108
+ * Enforces space after { and before } in blocks.
109
+ * Braces for blocks, closures, etc. should have internal spacing.
110
+ *
111
+ * Detection:
112
+ * - Extract brace content from source
113
+ * - Check if opening { has space after, closing } has space before
114
+ *
115
+ * References:
116
+ * - docs/guide-conventions.md:497-508
117
+ */
118
+ export const SPACING_BRACES = {
119
+ code: 'SPACING_BRACES',
120
+ category: 'formatting',
121
+ severity: 'info',
122
+ nodeTypes: ['Block', 'Closure'],
123
+ validate(node, context) {
124
+ const diagnostics = [];
125
+ const span = node.span;
126
+ const lines = context.source.split('\n');
127
+ const openLine = lines[span.start.line - 1] ?? '';
128
+ const closeLine = lines[span.end.line - 1] ?? '';
129
+ // Check for opening brace without space after
130
+ // Only examine the opening line (from the { onward)
131
+ // Use ^ anchor to only check the block's opening brace, not string interpolation
132
+ const openFrom = openLine.substring(span.start.column - 1);
133
+ if (/^\{[^\s\n]/.test(openFrom)) {
134
+ diagnostics.push({
135
+ location: span.start,
136
+ severity: 'info',
137
+ code: 'SPACING_BRACES',
138
+ message: 'Space required after opening brace {',
139
+ context: extractContextLine(span.start.line, context.source),
140
+ fix: null,
141
+ });
142
+ }
143
+ // Check for closing brace without space before
144
+ // span.end.column is 1-indexed and points AFTER the }, so:
145
+ // - } is at 0-index: span.end.column - 2
146
+ // - Character before } is at 0-index: span.end.column - 3
147
+ const charBeforeClose = closeLine[span.end.column - 3];
148
+ const isCloseOnOwnLine = /^\s*$/.test(closeLine.substring(0, span.end.column - 2));
149
+ if (charBeforeClose && !/\s/.test(charBeforeClose) && !isCloseOnOwnLine) {
150
+ diagnostics.push({
151
+ location: span.end,
152
+ severity: 'info',
153
+ code: 'SPACING_BRACES',
154
+ message: 'Space required before closing brace }',
155
+ context: extractContextLine(span.end.line, context.source),
156
+ fix: null,
157
+ });
158
+ }
159
+ return diagnostics;
160
+ },
161
+ };
162
+ // ============================================================
163
+ // SPACING_BRACKETS RULE
164
+ // ============================================================
165
+ /**
166
+ * Enforces no inner spaces for indexing brackets.
167
+ * Array/dict indexing should use $list[0] not $list[ 0 ].
168
+ *
169
+ * Detection:
170
+ * - PostfixExpr nodes with index access
171
+ * - Check for spaces inside brackets
172
+ *
173
+ * References:
174
+ * - docs/guide-conventions.md:526-535
175
+ */
176
+ export const SPACING_BRACKETS = {
177
+ code: 'SPACING_BRACKETS',
178
+ category: 'formatting',
179
+ severity: 'info',
180
+ nodeTypes: ['PostfixExpr'],
181
+ validate(node, context) {
182
+ const diagnostics = [];
183
+ const postfixNode = node;
184
+ // Only process if primary is a Variable (contains accessChain)
185
+ if (postfixNode.primary.type !== 'Variable') {
186
+ return diagnostics;
187
+ }
188
+ const variableNode = postfixNode.primary;
189
+ // Check each BracketAccess in the accessChain
190
+ for (const access of variableNode.accessChain) {
191
+ // Skip non-bracket accesses
192
+ if (!('accessKind' in access) || access.accessKind !== 'bracket') {
193
+ continue;
194
+ }
195
+ const bracketAccess = access;
196
+ // Skip if span is missing or invalid (EC-3, EC-4)
197
+ if (!isValidSpan(bracketAccess.span)) {
198
+ continue;
199
+ }
200
+ // Extract text from bracket span
201
+ const text = extractSpanText(bracketAccess.span, context.source);
202
+ // Check for space after opening bracket: /\[\s/
203
+ // Check for space before closing bracket: /\s\]/
204
+ const hasSpaceAfterOpen = /\[\s/.test(text);
205
+ const hasSpaceBeforeClose = /\s\]/.test(text);
206
+ if (hasSpaceAfterOpen || hasSpaceBeforeClose) {
207
+ // Extract content between brackets for error message
208
+ const content = text.substring(1, text.length - 1).trim();
209
+ diagnostics.push({
210
+ location: bracketAccess.span.start,
211
+ severity: 'info',
212
+ code: 'SPACING_BRACKETS',
213
+ message: `No spaces inside brackets: remove spaces around ${content}`,
214
+ context: extractContextLine(bracketAccess.span.start.line, context.source),
215
+ fix: null,
216
+ });
217
+ }
218
+ }
219
+ return diagnostics;
220
+ },
221
+ fix(node, context) {
222
+ const postfixNode = node;
223
+ // Only process if primary is a Variable (contains accessChain)
224
+ if (postfixNode.primary.type !== 'Variable') {
225
+ return null;
226
+ }
227
+ const variableNode = postfixNode.primary;
228
+ // Find the first BracketAccess with spacing violation
229
+ for (const access of variableNode.accessChain) {
230
+ // Skip non-bracket accesses
231
+ if (!('accessKind' in access) || access.accessKind !== 'bracket') {
232
+ continue;
233
+ }
234
+ const bracketAccess = access;
235
+ // Skip if span is missing or invalid
236
+ if (!isValidSpan(bracketAccess.span)) {
237
+ continue;
238
+ }
239
+ // Extract text from bracket span
240
+ const text = extractSpanText(bracketAccess.span, context.source);
241
+ // Check for spacing violations
242
+ const hasSpaceAfterOpen = /\[\s/.test(text);
243
+ const hasSpaceBeforeClose = /\s\]/.test(text);
244
+ if (hasSpaceAfterOpen || hasSpaceBeforeClose) {
245
+ // Build replacement text by removing inner spaces
246
+ // Replace [ followed by whitespace with [
247
+ // Replace whitespace followed by ] with ]
248
+ const replacement = text.replace(/\[\s+/g, '[').replace(/\s+\]/g, ']');
249
+ return {
250
+ description: 'Remove spaces inside brackets',
251
+ applicable: true,
252
+ range: bracketAccess.span,
253
+ replacement,
254
+ };
255
+ }
256
+ }
257
+ // No fixable violation found
258
+ return null;
259
+ },
260
+ };
261
+ // ============================================================
262
+ // SPACING_CLOSURE RULE
263
+ // ============================================================
264
+ /**
265
+ * Enforces no space before pipe, space after in closures.
266
+ * Closure parameters: |x| not | x |.
267
+ *
268
+ * Detection:
269
+ * - Extract closure parameter section from source
270
+ * - Check spacing around pipes
271
+ *
272
+ * References:
273
+ * - docs/guide-conventions.md:549-560
274
+ */
275
+ export const SPACING_CLOSURE = {
276
+ code: 'SPACING_CLOSURE',
277
+ category: 'formatting',
278
+ severity: 'info',
279
+ nodeTypes: ['Closure'],
280
+ validate(node, context) {
281
+ const diagnostics = [];
282
+ const closureNode = node;
283
+ const text = extractSpanText(closureNode.span, context.source);
284
+ // Check for space before opening pipe
285
+ if (/\s\|/.test(text.substring(0, text.indexOf('|') + 1))) {
286
+ diagnostics.push({
287
+ location: closureNode.span.start,
288
+ severity: 'info',
289
+ code: 'SPACING_CLOSURE',
290
+ message: 'No space before opening pipe in closure parameters',
291
+ context: extractContextLine(closureNode.span.start.line, context.source),
292
+ fix: null,
293
+ });
294
+ }
295
+ // Check for missing space after params (only if params exist)
296
+ if (closureNode.params.length > 0) {
297
+ // Look for pattern |params|( or |params|{ without space
298
+ const afterPipeIdx = text.lastIndexOf('|', text.indexOf('{') || text.indexOf('('));
299
+ if (afterPipeIdx !== -1) {
300
+ const afterPipe = text.substring(afterPipeIdx + 1, afterPipeIdx + 2);
301
+ if (afterPipe &&
302
+ /[^\s]/.test(afterPipe) &&
303
+ afterPipe !== '{' &&
304
+ afterPipe !== '(') {
305
+ // This is complex - skip for now as it requires better parsing
306
+ }
307
+ }
308
+ }
309
+ return diagnostics;
310
+ },
311
+ };
312
+ // ============================================================
313
+ // INDENT_CONTINUATION RULE
314
+ // ============================================================
315
+ /**
316
+ * Enforces 2-space indent for continued lines.
317
+ * Pipe chains should indent continuation lines by 2 spaces.
318
+ *
319
+ * Detection:
320
+ * - Multi-line pipe chains
321
+ * - Check indentation of continuation lines
322
+ *
323
+ * References:
324
+ * - docs/guide-conventions.md:636-662
325
+ */
326
+ export const INDENT_CONTINUATION = {
327
+ code: 'INDENT_CONTINUATION',
328
+ category: 'formatting',
329
+ severity: 'info',
330
+ nodeTypes: ['PipeChain'],
331
+ validate(node, context) {
332
+ const diagnostics = [];
333
+ const pipeNode = node;
334
+ // EC-5: Single-line chain - Return []
335
+ if (pipeNode.span.start.line === pipeNode.span.end.line) {
336
+ return [];
337
+ }
338
+ // Extract full text and check continuation indentation
339
+ const text = extractSpanText(pipeNode.span, context.source);
340
+ const lines = text.split('\n');
341
+ // KNOWN LIMITATION: This rule validates multi-line pipe chains where the pipe
342
+ // operator (`->`) and its target appear on the same line. The parser requires
343
+ // pipe targets to be on the same line as the `->` operator, so patterns like
344
+ // `value ->\n .method()` are invalid. See tests/language/statement-boundaries.test.ts:211-215
345
+ // for authoritative language behavior.
346
+ if (lines.length > 1) {
347
+ // Check each continuation line (skip first line which establishes baseline)
348
+ for (let i = 1; i < lines.length; i++) {
349
+ const line = lines[i];
350
+ // EC-6: Empty continuation line - Skip line
351
+ if (!line)
352
+ continue;
353
+ const indent = line.match(/^(\s*)/)?.[1] || '';
354
+ // Continuation = line starting with -> (after whitespace)
355
+ // Should have at least 2 spaces for continuation
356
+ if (line.trim().startsWith('->') && indent.length < 2) {
357
+ diagnostics.push({
358
+ location: {
359
+ line: pipeNode.span.start.line + i,
360
+ column: 1,
361
+ offset: 0,
362
+ },
363
+ severity: 'info',
364
+ code: 'INDENT_CONTINUATION',
365
+ message: 'Continuation lines should be indented by 2 spaces',
366
+ context: line.trim(),
367
+ fix: null,
368
+ });
369
+ }
370
+ }
371
+ }
372
+ return diagnostics;
373
+ },
374
+ };
375
+ // ============================================================
376
+ // IMPLICIT_DOLLAR_METHOD RULE
377
+ // ============================================================
378
+ /**
379
+ * Detect explicit $.method() patterns replaceable with .method.
380
+ *
381
+ * Flags method calls where the receiver is a bare $ (pipe variable).
382
+ * The implicit form .method is preferred when $ represents the current
383
+ * piped value (e.g., in blocks, closures, conditionals).
384
+ *
385
+ * Detection:
386
+ * - MethodCallNode with non-null receiverSpan
387
+ * - Receiver is bare $ (zero-width or single-char span)
388
+ * - Method call is first in chain (receiverSpan.end.offset <= 1)
389
+ *
390
+ * Note: Cannot use isBareReference() helper here because MethodCallNode.receiverSpan
391
+ * is a SourceSpan (position range), not an ExpressionNode. The helper requires
392
+ * an AST node to traverse. Instead, we detect bare $ by checking:
393
+ * 1. receiverSpan is zero-width (start == end) or single-char
394
+ * 2. Character at offset is '$'
395
+ * 3. Next character is '.' (not a variable name continuation)
396
+ *
397
+ * Examples:
398
+ * - $.upper() -> .upper
399
+ * - $.len -> .len
400
+ * - $.trim().upper() -> First method flagged, second is chained (not bare $)
401
+ *
402
+ * Not flagged:
403
+ * - .upper (receiverSpan is null)
404
+ * - $var.method() (receiverSpan is not bare $)
405
+ * - $.trim().upper() second method (receiverSpan covers $.trim())
406
+ *
407
+ * References:
408
+ * - docs/guide-conventions.md:587-598
409
+ */
410
+ export const IMPLICIT_DOLLAR_METHOD = {
411
+ code: 'IMPLICIT_DOLLAR_METHOD',
412
+ category: 'formatting',
413
+ severity: 'info',
414
+ nodeTypes: ['MethodCall'],
415
+ validate(node, context) {
416
+ const methodNode = node;
417
+ // EC-7: No receiverSpan means implicit receiver (already correct form)
418
+ if (methodNode.receiverSpan === null) {
419
+ return [];
420
+ }
421
+ // Detect bare $ receiver by analyzing the receiverSpan
422
+ // For bare $, the span is either:
423
+ // 1. Zero-width (start.offset == end.offset) at the $ character
424
+ // 2. Single-char span covering just $
425
+ const receiverSpan = methodNode.receiverSpan;
426
+ const spanLength = receiverSpan.end.offset - receiverSpan.start.offset;
427
+ // EC-8: Receiver is not bare $ if span is longer than 1 character
428
+ // This filters out chains like $.trim().upper() where second method
429
+ // has receiverSpan covering "$.trim()."
430
+ if (spanLength > 1) {
431
+ return [];
432
+ }
433
+ // Check that the character at the span is '$' and not part of a variable name
434
+ const offset = receiverSpan.start.offset;
435
+ const charAtOffset = context.source[offset];
436
+ const nextChar = context.source[offset + 1];
437
+ // Must be '$' followed by '.' (method call)
438
+ // This distinguishes $.method() from $var.method()
439
+ if (charAtOffset !== '$' || nextChar !== '.') {
440
+ return [];
441
+ }
442
+ // Generate diagnostic for bare $ receiver
443
+ const suggestedCode = methodNode.args.length === 0
444
+ ? `.${methodNode.name}`
445
+ : `.${methodNode.name}()`;
446
+ return [
447
+ {
448
+ code: 'IMPLICIT_DOLLAR_METHOD',
449
+ message: `Prefer implicit '${suggestedCode}' over explicit '$.${methodNode.name}()'`,
450
+ severity: 'info',
451
+ location: {
452
+ line: methodNode.span.start.line,
453
+ column: methodNode.span.start.column,
454
+ offset: methodNode.span.start.offset,
455
+ },
456
+ context: extractContextLine(methodNode.span.start.line, context.source),
457
+ fix: null,
458
+ },
459
+ ];
460
+ },
461
+ };
462
+ // ============================================================
463
+ // IMPLICIT_DOLLAR_FUNCTION RULE
464
+ // ============================================================
465
+ /**
466
+ * Prefer foo over foo($) for global function calls.
467
+ * When single argument is bare $, prefer implicit form.
468
+ *
469
+ * Detection:
470
+ * - HostCall with single argument that is bare $
471
+ *
472
+ * References:
473
+ * - docs/guide-conventions.md:599-607
474
+ */
475
+ export const IMPLICIT_DOLLAR_FUNCTION = {
476
+ code: 'IMPLICIT_DOLLAR_FUNCTION',
477
+ category: 'formatting',
478
+ severity: 'info',
479
+ nodeTypes: ['HostCall'],
480
+ validate(node, context) {
481
+ const hostCallNode = node;
482
+ // EC-9: Zero args - Return []
483
+ if (hostCallNode.args.length === 0) {
484
+ return [];
485
+ }
486
+ // EC-10: Multiple args - Return []
487
+ if (hostCallNode.args.length > 1) {
488
+ return [];
489
+ }
490
+ // EC-11: Single arg not bare $ - Return []
491
+ const singleArg = hostCallNode.args[0];
492
+ if (!isBareReference(singleArg)) {
493
+ return [];
494
+ }
495
+ // Generate diagnostic for bare $ argument
496
+ return [
497
+ {
498
+ code: 'IMPLICIT_DOLLAR_FUNCTION',
499
+ message: `Prefer pipe syntax '-> ${hostCallNode.name}' over explicit '${hostCallNode.name}($)'`,
500
+ severity: 'info',
501
+ location: {
502
+ line: hostCallNode.span.start.line,
503
+ column: hostCallNode.span.start.column,
504
+ offset: hostCallNode.span.start.offset,
505
+ },
506
+ context: extractContextLine(hostCallNode.span.start.line, context.source),
507
+ fix: null,
508
+ },
509
+ ];
510
+ },
511
+ };
512
+ // ============================================================
513
+ // IMPLICIT_DOLLAR_CLOSURE RULE
514
+ // ============================================================
515
+ /**
516
+ * Prefer $fn over $fn($) for closure invocation.
517
+ * When single argument is bare $, prefer implicit form.
518
+ *
519
+ * Detection:
520
+ * - ClosureCall with single argument that is bare $
521
+ *
522
+ * References:
523
+ * - docs/guide-conventions.md:608-615
524
+ */
525
+ export const IMPLICIT_DOLLAR_CLOSURE = {
526
+ code: 'IMPLICIT_DOLLAR_CLOSURE',
527
+ category: 'formatting',
528
+ severity: 'info',
529
+ nodeTypes: ['ClosureCall'],
530
+ validate(node, context) {
531
+ const closureCallNode = node;
532
+ // EC-12: Zero args - Return []
533
+ if (closureCallNode.args.length === 0) {
534
+ return [];
535
+ }
536
+ // EC-13: Multiple args - Return []
537
+ if (closureCallNode.args.length > 1) {
538
+ return [];
539
+ }
540
+ // EC-14: Single arg not bare $ - Return []
541
+ const singleArg = closureCallNode.args[0];
542
+ if (!isBareReference(singleArg)) {
543
+ return [];
544
+ }
545
+ // Build closure name with access chain for display
546
+ const closureName = closureCallNode.accessChain.length > 0
547
+ ? `$${closureCallNode.name}.${closureCallNode.accessChain.join('.')}`
548
+ : `$${closureCallNode.name}`;
549
+ // Generate diagnostic for bare $ argument
550
+ return [
551
+ {
552
+ code: 'IMPLICIT_DOLLAR_CLOSURE',
553
+ message: `Prefer pipe syntax '-> ${closureName}' over explicit '${closureName}($)'`,
554
+ severity: 'info',
555
+ location: {
556
+ line: closureCallNode.span.start.line,
557
+ column: closureCallNode.span.start.column,
558
+ offset: closureCallNode.span.start.offset,
559
+ },
560
+ context: extractContextLine(closureCallNode.span.start.line, context.source),
561
+ fix: null,
562
+ },
563
+ ];
564
+ },
565
+ };
566
+ // ============================================================
567
+ // THROWAWAY_CAPTURE RULE
568
+ // ============================================================
569
+ /**
570
+ * Warns on capture-only-to-continue patterns.
571
+ * Capturing a value just to use it immediately in the next line is unnecessary.
572
+ *
573
+ * Detection:
574
+ * - Capture node followed by immediate use of that variable only
575
+ * - Variable not referenced later in the script
576
+ *
577
+ * References:
578
+ * - docs/guide-conventions.md:617-634
579
+ */
580
+ export const THROWAWAY_CAPTURE = {
581
+ code: 'THROWAWAY_CAPTURE',
582
+ category: 'formatting',
583
+ severity: 'info',
584
+ nodeTypes: ['Capture'],
585
+ validate(_node, _context) {
586
+ // [DEBT] Stubbed - Requires full script analysis across statement boundaries
587
+ // Must track: 1) All captures 2) All variable references 3) Single-use detection
588
+ return [];
589
+ },
590
+ };
591
+ // ============================================================
592
+ // HELPER FUNCTIONS
593
+ // ============================================================
594
+ /**
595
+ * Validate that a SourceSpan has valid coordinates.
596
+ * Returns false if span, start, or end are missing,
597
+ * or if line/column values are less than 1.
598
+ *
599
+ * Exported for testing purposes to enable direct unit testing
600
+ * of edge cases (null spans, invalid coordinates).
601
+ */
602
+ export function isValidSpan(span) {
603
+ if (!span) {
604
+ return false;
605
+ }
606
+ if (!span.start || !span.end) {
607
+ return false;
608
+ }
609
+ if (span.start.line < 1 ||
610
+ span.start.column < 1 ||
611
+ span.end.line < 1 ||
612
+ span.end.column < 1) {
613
+ return false;
614
+ }
615
+ return true;
616
+ }
617
+ /**
618
+ * Extract text from source using span coordinates.
619
+ */
620
+ function extractSpanText(span, source) {
621
+ const lines = source.split('\n');
622
+ if (span.start.line === span.end.line) {
623
+ // Single line
624
+ const line = lines[span.start.line - 1];
625
+ if (!line)
626
+ return '';
627
+ return line.substring(span.start.column - 1, span.end.column - 1);
628
+ }
629
+ // Multi-line
630
+ const result = [];
631
+ for (let i = span.start.line - 1; i < span.end.line; i++) {
632
+ const line = lines[i];
633
+ if (!line)
634
+ continue;
635
+ if (i === span.start.line - 1) {
636
+ // First line: from start column to end
637
+ result.push(line.substring(span.start.column - 1));
638
+ }
639
+ else if (i === span.end.line - 1) {
640
+ // Last line: from start to end column
641
+ result.push(line.substring(0, span.end.column - 1));
642
+ }
643
+ else {
644
+ // Middle lines: full line
645
+ result.push(line);
646
+ }
647
+ }
648
+ return result.join('\n');
649
+ }
650
+ /**
651
+ * Escape special regex characters.
652
+ */
653
+ function escapeRegex(str) {
654
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
655
+ }
656
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatting.js","sourceRoot":"","sources":["../../../src/check/rules/formatting.ts"],"names":[],"mappings":"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"}