@rcrsr/rill 0.5.0 → 0.6.1

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